orchestrator-core 2.10.0rc2__py3-none-any.whl → 3.0.0rc1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. orchestrator/__init__.py +1 -1
  2. orchestrator/api/api_v1/endpoints/processes.py +1 -1
  3. orchestrator/cli/generator/templates/create_product.j2 +2 -1
  4. orchestrator/cli/generator/templates/modify_product.j2 +2 -1
  5. orchestrator/cli/generator/templates/shared_workflows.j2 +2 -1
  6. orchestrator/cli/generator/templates/terminate_product.j2 +1 -1
  7. orchestrator/cli/generator/templates/test_create_workflow.j2 +0 -1
  8. orchestrator/cli/generator/templates/test_modify_workflow.j2 +1 -2
  9. orchestrator/cli/generator/templates/test_terminate_workflow.j2 +1 -1
  10. orchestrator/cli/generator/templates/validate_product.j2 +3 -1
  11. orchestrator/cli/helpers/print_helpers.py +1 -1
  12. orchestrator/config/assignee.py +1 -1
  13. orchestrator/devtools/populator.py +1 -1
  14. orchestrator/devtools/scripts/migrate_20.py +11 -106
  15. orchestrator/devtools/scripts/migrate_30.py +61 -0
  16. orchestrator/devtools/scripts/shared.py +108 -0
  17. orchestrator/domain/base.py +1 -2
  18. orchestrator/domain/lifecycle.py +2 -1
  19. orchestrator/migrations/helpers.py +1 -1
  20. orchestrator/schemas/engine_settings.py +1 -1
  21. orchestrator/schemas/subscription.py +2 -1
  22. orchestrator/services/celery.py +1 -1
  23. orchestrator/services/processes.py +2 -1
  24. orchestrator/services/products.py +1 -1
  25. orchestrator/services/subscriptions.py +2 -1
  26. orchestrator/services/tasks.py +2 -1
  27. orchestrator/settings.py +1 -1
  28. orchestrator/targets.py +1 -1
  29. orchestrator/types.py +8 -43
  30. orchestrator/utils/errors.py +2 -1
  31. orchestrator/utils/state.py +2 -1
  32. orchestrator/workflow.py +3 -1
  33. orchestrator/workflows/modify_note.py +1 -2
  34. orchestrator/workflows/steps.py +2 -1
  35. orchestrator/workflows/tasks/cleanup_tasks_log.py +1 -1
  36. orchestrator/workflows/tasks/resume_workflows.py +1 -1
  37. orchestrator/workflows/tasks/validate_product_type.py +1 -1
  38. orchestrator/workflows/tasks/validate_products.py +1 -1
  39. orchestrator/workflows/utils.py +2 -2
  40. {orchestrator_core-2.10.0rc2.dist-info → orchestrator_core-3.0.0rc1.dist-info}/METADATA +1 -1
  41. {orchestrator_core-2.10.0rc2.dist-info → orchestrator_core-3.0.0rc1.dist-info}/RECORD +43 -41
  42. {orchestrator_core-2.10.0rc2.dist-info → orchestrator_core-3.0.0rc1.dist-info}/LICENSE +0 -0
  43. {orchestrator_core-2.10.0rc2.dist-info → orchestrator_core-3.0.0rc1.dist-info}/WHEEL +0 -0
orchestrator/__init__.py CHANGED
@@ -13,7 +13,7 @@
13
13
 
14
14
  """This is the orchestrator workflow engine."""
15
15
 
16
- __version__ = "2.10.0rc2"
16
+ __version__ = "3.0.0rc1"
17
17
 
18
18
  from orchestrator.app import OrchestratorCore
19
19
  from orchestrator.settings import app_settings
@@ -61,7 +61,6 @@ from orchestrator.services.processes import (
61
61
  )
62
62
  from orchestrator.services.settings import get_engine_settings
63
63
  from orchestrator.settings import app_settings
64
- from orchestrator.types import JSON, State
65
64
  from orchestrator.utils.enrich_process import enrich_process
66
65
  from orchestrator.websocket import (
67
66
  WS_CHANNELS,
@@ -70,6 +69,7 @@ from orchestrator.websocket import (
70
69
  websocket_manager,
71
70
  )
72
71
  from orchestrator.workflow import ProcessStatus
72
+ from pydantic_forms.types import JSON, State
73
73
 
74
74
  router = APIRouter()
75
75
 
@@ -7,11 +7,12 @@ from typing import Annotated
7
7
 
8
8
  import structlog
9
9
  from pydantic import AfterValidator, ConfigDict, model_validator
10
+ from pydantic_forms.types import FormGenerator, State, UUIDstr
10
11
 
11
12
  from orchestrator.forms import FormPage
12
13
  from orchestrator.forms.validators import Divider, Label, CustomerId, MigrationSummary
13
14
  from orchestrator.targets import Target
14
- from orchestrator.types import FormGenerator, State, SubscriptionLifecycle, UUIDstr
15
+ from orchestrator.types import SubscriptionLifecycle
15
16
  from orchestrator.workflow import StepList, begin, step
16
17
  from orchestrator.workflows.steps import store_process_subscription
17
18
  from orchestrator.workflows.utils import create_workflow
@@ -6,11 +6,12 @@ from typing import Annotated
6
6
 
7
7
  import structlog
8
8
  from pydantic import AfterValidator, ConfigDict, model_validator
9
+ from pydantic_forms.types import FormGenerator, State, UUIDstr
9
10
  from pydantic_forms.validators import ReadOnlyField
10
11
 
11
12
  from orchestrator.forms import FormPage
12
13
  from orchestrator.forms.validators import CustomerId, Divider
13
- from orchestrator.types import FormGenerator, State, SubscriptionLifecycle, UUIDstr
14
+ from orchestrator.types import SubscriptionLifecycle
14
15
  from orchestrator.workflow import StepList, begin, step
15
16
  from orchestrator.workflows.steps import set_status
16
17
  from orchestrator.workflows.utils import modify_workflow
@@ -1,4 +1,5 @@
1
- from typing import Generator, List, TypeAlias, cast
1
+ from collections.abc import Generator
2
+ from typing import List, TypeAlias, cast
2
3
 
3
4
  from pydantic import ConfigDict
4
5
 
@@ -2,10 +2,10 @@
2
2
 
3
3
  import structlog
4
4
  from pydantic import AfterValidator, ConfigDict, model_validator
5
+ from pydantic_forms.types import InputForm, State, UUIDstr
5
6
 
6
7
  from orchestrator.forms import FormPage
7
8
  from orchestrator.forms.validators import DisplaySubscription
8
- from orchestrator.types import InputForm, State, UUIDstr
9
9
  from orchestrator.workflow import StepList, begin, step
10
10
  from orchestrator.workflows.utils import terminate_workflow
11
11
 
@@ -4,7 +4,6 @@ from orchestrator.db import ProductTable
4
4
  from orchestrator.forms import FormValidationError
5
5
 
6
6
  from test.unit_tests.workflows import assert_complete, extract_state, run_workflow
7
-
8
7
  from {{ product_types_module }}.{{ product.variable }} import {{ product.type }}
9
8
 
10
9
 
@@ -1,9 +1,8 @@
1
1
  import pytest
2
2
  from orchestrator.forms import FormValidationError
3
-
4
3
  from orchestrator.types import SubscriptionLifecycle
5
- from test.unit_tests.workflows import assert_complete, extract_state, run_workflow
6
4
 
5
+ from test.unit_tests.workflows import assert_complete, extract_state, run_workflow
7
6
  from {{ product_types_module }}.{{ product.variable }} import {{ product.type }}
8
7
 
9
8
 
@@ -4,8 +4,8 @@ import pytest
4
4
  from orchestrator.forms import FormValidationError
5
5
  {% endif %}
6
6
  from orchestrator.types import SubscriptionLifecycle
7
- from test.unit_tests.workflows import assert_complete, extract_state, run_workflow
8
7
 
8
+ from test.unit_tests.workflows import assert_complete, extract_state, run_workflow
9
9
  from {{ product_types_module }}.{{ product.variable }} import {{ product.type }}
10
10
 
11
11
 
@@ -3,9 +3,11 @@
3
3
  import structlog
4
4
  {% if product.nso_service_id_path %}
5
5
  from deepdiff import DeepDiff
6
+ {% endif %}
7
+ from pydantic_forms.types import State
8
+ {% if product.nso_service_id_path %}
6
9
  from surf.products.services.nso.nso import build_payload
7
10
  {% endif %}
8
- from orchestrator.types import State
9
11
  from orchestrator.workflow import StepList, begin, step
10
12
  from orchestrator.workflows.utils import validate_workflow
11
13
 
@@ -1,7 +1,7 @@
1
1
  from collections.abc import Callable, Iterable
2
2
  from typing import Any
3
3
 
4
- from orchestrator.types import strEnum
4
+ from pydantic_forms.types import strEnum
5
5
 
6
6
 
7
7
  def _esc_str(i: int) -> str:
@@ -13,7 +13,7 @@
13
13
 
14
14
  import strawberry
15
15
 
16
- from orchestrator.types import strEnum
16
+ from pydantic_forms.types import strEnum
17
17
 
18
18
 
19
19
  @strawberry.enum
@@ -26,8 +26,8 @@ import structlog
26
26
  from more_itertools import first, first_true
27
27
 
28
28
  from nwastdlib.url import URL
29
- from orchestrator.types import State
30
29
  from pydantic_forms.types import InputForm as LegacyInputForm
30
+ from pydantic_forms.types import State
31
31
 
32
32
 
33
33
  class JSONSubSchema(TypedDict, total=False):
@@ -6,61 +6,17 @@ Refer to the 2.0 migration guide documentation for background.
6
6
  import re
7
7
  import sys
8
8
  from pathlib import Path
9
- from subprocess import run
10
9
  from typing import Iterable
11
10
 
12
-
13
- def remove_imports(text: str, module: str, symbol: str) -> tuple[str, bool]:
14
- """Find imports and remove them.
15
-
16
- Assumes code is formatted through Black to keep the regex somewhat readable.
17
- """
18
- text_orig = text
19
-
20
- # single import from module (may have a #comment) -> remove line
21
- rgx = r"(from %s import \b%s\b(\s*#[^\n]*)*\n)" % (re.escape(module), symbol)
22
- text = re.sub(rgx, "", text)
23
-
24
- # middle or last of multiple imports from module -> strip symbol
25
- rgx = r"(from %s import .+)(, \b%s\b)" % (re.escape(module), symbol)
26
- text = re.sub(rgx, r"\1", text)
27
-
28
- # first of multiple imports from same module -> strip symbol
29
- rgx = r"(from %s import )\b%s\b, " % (re.escape(module), symbol)
30
- text = re.sub(rgx, r"\1", text)
31
-
32
- # multiline import -> remove line with symbol
33
- rgx_verbose = r"""(?P<before>^from\s%s\simport\s*\([^\n]*\n(?:^[^\n]+,\n)*)
34
- (^\s*\b%s\b,[^\n]*\n)
35
- (?P<after>(?:^[^\n]+,\n)*\)[^\n]*$)"""
36
- text = re.sub(rgx_verbose % (re.escape(module), symbol), r"\g<before>\g<after>", text, flags=re.M | re.X)
37
- return text, text_orig != text
38
-
39
-
40
- def insert_import(text: str, import_stmt: str) -> str:
41
- # Find the first import line and add our line above that
42
- # Rely on ruff & black for formatting
43
- return re.sub(r"(^(?:from .+|import .+)$)", f"{import_stmt}\n" + r"\1", text, count=1, flags=re.M)
44
-
45
-
46
- def find_and_remove_aliases(text: str, symbol: str) -> tuple[str, list[str]]:
47
- """In the given text find aliases of the given symbol and remove them.
48
-
49
- Return updated text and aliases removed.
50
- """
51
- rgx = r"(\b%s as (\w+))" % (symbol,)
52
- aliases = [aliasgroup for fullgroup, aliasgroup in re.findall(rgx, text)]
53
- newtext = re.sub(rgx, symbol, text)
54
- return newtext, aliases
55
-
56
-
57
- def replace_words(text: str, words: list[str], replace: str) -> str:
58
- rgx = r"\b(%s)\b" % ("|".join(words),)
59
- return re.sub(rgx, replace, text)
60
-
61
-
62
- def has_word(text: str, word: str) -> bool:
63
- return bool(re.search(r"\b%s\b" % (word,), text))
11
+ from orchestrator.devtools.scripts.shared import (
12
+ find_and_remove_aliases,
13
+ has_word,
14
+ insert_import,
15
+ migrate,
16
+ move_import,
17
+ remove_imports,
18
+ replace_words,
19
+ )
64
20
 
65
21
 
66
22
  def rewrite_subscription_instance_lists(f: Path) -> list[str]:
@@ -124,17 +80,6 @@ def rewrite_subscription_instance_lists(f: Path) -> list[str]:
124
80
  return names
125
81
 
126
82
 
127
- def move_import(f: Path, symbol: str, old_module: str, new_module: str) -> bool:
128
- text = f.read_text()
129
- text, changed = remove_imports(text, old_module, symbol)
130
- if not changed:
131
- return False
132
- text = insert_import(text, f"from {new_module} import {symbol}")
133
- with f.open(mode="w"):
134
- f.write_text(text)
135
- return True
136
-
137
-
138
83
  re_serializable_property = re.compile(r"^(\s+)(@serializable_property)([^\n]*)\n", flags=re.MULTILINE)
139
84
 
140
85
 
@@ -167,7 +112,7 @@ def replace_serializable_props(f: Path) -> bool:
167
112
  return True
168
113
 
169
114
 
170
- def migrate_file(f: Path) -> int:
115
+ def migrate_file(f: Path) -> bool:
171
116
  imports = {
172
117
  "SI": move_import(f, "SI", "orchestrator.domain.base", "orchestrator.types"),
173
118
  "VlanRanges": move_import(f, "VlanRanges", "orchestrator.utils.vlans", "nwastdlib.vlans"),
@@ -189,46 +134,6 @@ def migrate_file(f: Path) -> int:
189
134
  return bool(lines)
190
135
 
191
136
 
192
- def run_tool(*args: str) -> bool:
193
- cmd = " ".join(args)
194
- try:
195
- r = run(args, capture_output=True) # noqa: S603
196
- if r.returncode == 0:
197
- return True
198
- print(f"{cmd} failed:", r.stdout, r.stderr)
199
- except FileNotFoundError:
200
- print(f"{cmd }failed: could not find executable in the current venv")
201
- return False
202
-
203
-
204
- def migrate(target_dir: Path) -> bool:
205
- abs_path = str(target_dir.resolve())
206
-
207
- def run_tools() -> bool:
208
- return run_tool("ruff", "--fix", abs_path) and run_tool("black", "--quiet", abs_path)
209
-
210
- print(f"\n### Verifing files in {abs_path}... ", end="")
211
- if not run_tools():
212
- print("Failed to verify files, aborting migration. Please resolve the errors.")
213
- return False
214
- print("Ok")
215
-
216
- files_migrated = files_checked = 0
217
- print(f"\n### Migrating files in {abs_path}")
218
- try:
219
- for f in target_dir.glob("**/*.py"):
220
- if migrate_file(f):
221
- files_migrated += 1
222
- files_checked += 1
223
- except KeyboardInterrupt:
224
- print("Interrupted...")
225
-
226
- print(f"\n### Migrated {files_migrated}/{files_checked} files in {abs_path}")
227
-
228
- print(f"\n### Formatting files in {abs_path}")
229
- return run_tools()
230
-
231
-
232
137
  if __name__ == "__main__":
233
138
  try:
234
139
  _target_dir = Path(sys.argv[1])
@@ -237,4 +142,4 @@ if __name__ == "__main__":
237
142
  print("Need a directory as parameter")
238
143
  sys.exit(1)
239
144
 
240
- sys.exit(0 if migrate(_target_dir) else 1)
145
+ sys.exit(0 if migrate(_target_dir, migrate_file) else 1)
@@ -0,0 +1,61 @@
1
+ """Helper script to rewrite import statements in your orchestrator.
2
+
3
+ Since types have been externalised in `pydantic_forms`, they were re-imported in `orchestrator.types` for backwards
4
+ compatibility. These import statements have been removed, and therefore need to be updated in orchestrator
5
+ implementations.
6
+ """
7
+
8
+ import sys
9
+ from pathlib import Path
10
+
11
+ from orchestrator.devtools.scripts.shared import migrate, move_import
12
+
13
+
14
+ def migrate_file(f: Path) -> bool:
15
+ imports = {
16
+ "JSON": move_import(f, "JSON", "orchestrator.types", "pydantic_forms.types"),
17
+ "AcceptData": move_import(f, "AcceptData", "orchestrator.types", "pydantic_forms.types"),
18
+ "AcceptItemType": move_import(f, "AcceptItemType", "orchestrator.types", "pydantic_forms.types"),
19
+ "FormGenerator": move_import(f, "FormGenerator", "orchestrator.types", "pydantic_forms.types"),
20
+ "FormGeneratorAsync": move_import(f, "FormGeneratorAsync", "orchestrator.types", "pydantic_forms.types"),
21
+ "InputForm": move_import(f, "InputForm", "orchestrator.types", "pydantic_forms.types"),
22
+ "InputFormGenerator": move_import(f, "InputFormGenerator", "orchestrator.types", "pydantic_forms.types"),
23
+ "InputStepFunc": move_import(f, "InputStepFunc", "orchestrator.types", "pydantic_forms.types"),
24
+ "SimpleInputFormGenerator": move_import(
25
+ f, "SimpleInputFormGenerator", "orchestrator.types", "pydantic_forms.types"
26
+ ),
27
+ "State": move_import(f, "State", "orchestrator.types", "pydantic_forms.types"),
28
+ "StateInputFormGenerator": move_import(
29
+ f, "StateInputFormGenerator", "orchestrator.types", "pydantic_forms.types"
30
+ ),
31
+ "StateInputFormGeneratorAsync": move_import(
32
+ f, "StateInputFormGeneratorAsync", "orchestrator.types", "pydantic_forms.types"
33
+ ),
34
+ "StateInputStepFunc": move_import(f, "StateInputStepFunc", "orchestrator.types", "pydantic_forms.types"),
35
+ "StateSimpleInputFormGenerator": move_import(
36
+ f, "StateSimpleInputFormGenerator", "orchestrator.types", "pydantic_forms.types"
37
+ ),
38
+ "SubscriptionMapping": move_import(f, "SubscriptionMapping", "orchestrator.types", "pydantic_forms.types"),
39
+ "SummaryData": move_import(f, "SummaryData", "orchestrator.types", "pydantic_forms.types"),
40
+ "UUIDstr": move_import(f, "UUIDstr", "orchestrator.types", "pydantic_forms.types"),
41
+ "strEnum": move_import(f, "strEnum", "orchestrator.types", "pydantic_forms.types"),
42
+ }
43
+ lines = []
44
+ lines.extend([f"Moved {k} import" for k, v in imports.items() if v])
45
+
46
+ if lines:
47
+ formatted_lines = "\n".join(f" - {line}" for line in lines)
48
+ print(f"Updated {f.name:50s}\n{formatted_lines}")
49
+
50
+ return bool(lines)
51
+
52
+
53
+ if __name__ == "__main__":
54
+ try:
55
+ _target_dir = Path(sys.argv[1])
56
+ assert _target_dir.is_dir()
57
+ except Exception:
58
+ print("Need a directory as parameter")
59
+ sys.exit(1)
60
+
61
+ sys.exit(0 if migrate(_target_dir, migrate_file) else 1)
@@ -0,0 +1,108 @@
1
+ import re
2
+ from pathlib import Path
3
+ from subprocess import run
4
+ from typing import Callable
5
+
6
+
7
+ def remove_imports(text: str, module: str, symbol: str) -> tuple[str, bool]:
8
+ """Find imports and remove them.
9
+
10
+ Assumes code is formatted through Black to keep the regex somewhat readable.
11
+ """
12
+ text_orig = text
13
+
14
+ # single import from module (may have a #comment) -> remove line
15
+ rgx = r"(from %s import \b%s\b(\s*#[^\n]*)*\n)" % (re.escape(module), symbol)
16
+ text = re.sub(rgx, "", text)
17
+
18
+ # middle or last of multiple imports from module -> strip symbol
19
+ rgx = r"(from %s import .+)(, \b%s\b)" % (re.escape(module), symbol)
20
+ text = re.sub(rgx, r"\1", text)
21
+
22
+ # first of multiple imports from same module -> strip symbol
23
+ rgx = r"(from %s import )\b%s\b, " % (re.escape(module), symbol)
24
+ text = re.sub(rgx, r"\1", text)
25
+
26
+ # multiline import -> remove line with symbol
27
+ rgx_verbose = r"""(?P<before>^from\s%s\simport\s*\([^\n]*\n(?:^[^\n]+,\n)*)
28
+ (^\s*\b%s\b,[^\n]*\n)
29
+ (?P<after>(?:^[^\n]+,\n)*\)[^\n]*$)"""
30
+ text = re.sub(rgx_verbose % (re.escape(module), symbol), r"\g<before>\g<after>", text, flags=re.M | re.X)
31
+ return text, text_orig != text
32
+
33
+
34
+ def insert_import(text: str, import_stmt: str) -> str:
35
+ # Find the first import line and add our line above that
36
+ # Rely on ruff & black for formatting
37
+ return re.sub(r"(^(?:from .+|import .+)$)", f"{import_stmt}\n" + r"\1", text, count=1, flags=re.M)
38
+
39
+
40
+ def move_import(f: Path, symbol: str, old_module: str, new_module: str) -> bool:
41
+ text = f.read_text()
42
+ text, changed = remove_imports(text, old_module, symbol)
43
+ if not changed:
44
+ return False
45
+ text = insert_import(text, f"from {new_module} import {symbol}")
46
+ with f.open(mode="w"):
47
+ f.write_text(text)
48
+ return True
49
+
50
+
51
+ def find_and_remove_aliases(text: str, symbol: str) -> tuple[str, list[str]]:
52
+ """In the given text find aliases of the given symbol and remove them.
53
+
54
+ Return updated text and aliases removed.
55
+ """
56
+ rgx = r"(\b%s as (\w+))" % (symbol,)
57
+ aliases = [aliasgroup for fullgroup, aliasgroup in re.findall(rgx, text)]
58
+ newtext = re.sub(rgx, symbol, text)
59
+ return newtext, aliases
60
+
61
+
62
+ def replace_words(text: str, words: list[str], replace: str) -> str:
63
+ rgx = r"\b(%s)\b" % ("|".join(words),)
64
+ return re.sub(rgx, replace, text)
65
+
66
+
67
+ def has_word(text: str, word: str) -> bool:
68
+ return bool(re.search(r"\b%s\b" % (word,), text))
69
+
70
+
71
+ def run_tool(*args: str) -> bool:
72
+ cmd = " ".join(args)
73
+ try:
74
+ r = run(args, capture_output=True) # noqa: S603
75
+ if r.returncode == 0:
76
+ return True
77
+ print(f"{cmd} failed:", r.stdout, r.stderr)
78
+ except FileNotFoundError:
79
+ print(f"{cmd} failed: could not find executable in the current venv")
80
+ return False
81
+
82
+
83
+ def migrate(target_dir: Path, migrate_file: Callable[[Path], bool]) -> bool:
84
+ abs_path = str(target_dir.resolve())
85
+
86
+ def run_tools() -> bool:
87
+ return run_tool("ruff", "check", "--fix", abs_path) and run_tool("black", "--quiet", abs_path)
88
+
89
+ print(f"\n### Verifying files in {abs_path}... ", end="")
90
+ if not run_tools():
91
+ print("Failed to verify files, aborting migration. Please resolve errors.")
92
+ return False
93
+ print("Ok")
94
+
95
+ files_migrated = files_checked = 0
96
+ print(f"\n### Migrating files in {abs_path}")
97
+ try:
98
+ for f in target_dir.glob("**/*.py"):
99
+ if migrate_file(f):
100
+ files_migrated += 1
101
+ files_checked += 1
102
+ except KeyboardInterrupt:
103
+ print("Interrupted...")
104
+
105
+ print(f"\n### Migrated {files_migrated}/{files_checked} files in {abs_path}")
106
+
107
+ print(f"\n### Formatting files in {abs_path}")
108
+ return run_tools()
@@ -55,9 +55,7 @@ from orchestrator.domain.lifecycle import (
55
55
  from orchestrator.services.products import get_product_by_id
56
56
  from orchestrator.types import (
57
57
  SAFE_USED_BY_TRANSITIONS_FOR_STATUS,
58
- State,
59
58
  SubscriptionLifecycle,
60
- UUIDstr,
61
59
  filter_nonetype,
62
60
  get_origin_and_args,
63
61
  get_possible_product_block_types,
@@ -69,6 +67,7 @@ from orchestrator.types import (
69
67
  )
70
68
  from orchestrator.utils.datetime import nowtz
71
69
  from orchestrator.utils.docs import make_product_block_docstring, make_subscription_model_docstring
70
+ from pydantic_forms.types import State, UUIDstr
72
71
 
73
72
  logger = structlog.get_logger(__name__)
74
73
 
@@ -16,7 +16,8 @@ from typing import TYPE_CHECKING, TypeVar
16
16
  import strawberry
17
17
  import structlog
18
18
 
19
- from orchestrator.types import SubscriptionLifecycle, strEnum
19
+ from orchestrator.types import SubscriptionLifecycle
20
+ from pydantic_forms.types import strEnum
20
21
 
21
22
  if TYPE_CHECKING:
22
23
  from orchestrator.domain.base import DomainModel
@@ -19,7 +19,7 @@ import sqlalchemy as sa
19
19
  import structlog
20
20
 
21
21
  from orchestrator.settings import app_settings
22
- from orchestrator.types import UUIDstr
22
+ from pydantic_forms.types import UUIDstr
23
23
 
24
24
  logger = structlog.get_logger(__name__)
25
25
 
@@ -16,7 +16,7 @@ import strawberry
16
16
  from pydantic import ConfigDict
17
17
 
18
18
  from orchestrator.schemas.base import OrchestratorBaseModel
19
- from orchestrator.types import strEnum
19
+ from pydantic_forms.types import strEnum
20
20
 
21
21
 
22
22
  @strawberry.enum
@@ -22,7 +22,8 @@ from orchestrator.schemas.product import ProductBaseSchema
22
22
  from orchestrator.schemas.product_block import ProductBlockSchema
23
23
  from orchestrator.schemas.resource_type import ResourceTypeSchema
24
24
  from orchestrator.schemas.subscription_descriptions import SubscriptionDescriptionSchema
25
- from orchestrator.types import SubscriptionLifecycle, strEnum
25
+ from orchestrator.types import SubscriptionLifecycle
26
+ from pydantic_forms.types import strEnum
26
27
 
27
28
 
28
29
  class PortMode(strEnum):
@@ -24,8 +24,8 @@ from orchestrator.api.error_handling import raise_status
24
24
  from orchestrator.db import ProcessTable, db
25
25
  from orchestrator.services.processes import create_process, delete_process
26
26
  from orchestrator.targets import Target
27
- from orchestrator.types import State
28
27
  from orchestrator.workflows import get_workflow
28
+ from pydantic_forms.types import State
29
29
 
30
30
  SYSTEM_USER = "SYSTEM"
31
31
 
@@ -39,7 +39,7 @@ from orchestrator.services.settings import get_engine_settings_for_update
39
39
  from orchestrator.services.workflows import get_workflow_by_name
40
40
  from orchestrator.settings import ExecutorType, app_settings
41
41
  from orchestrator.targets import Target
42
- from orchestrator.types import BroadcastFunc, State
42
+ from orchestrator.types import BroadcastFunc
43
43
  from orchestrator.utils.datetime import nowtz
44
44
  from orchestrator.utils.errors import error_state_to_dict
45
45
  from orchestrator.websocket import broadcast_invalidate_status_counts
@@ -60,6 +60,7 @@ from orchestrator.workflows import get_workflow
60
60
  from orchestrator.workflows.removed_workflow import removed_workflow
61
61
  from pydantic_forms.core import post_form
62
62
  from pydantic_forms.exceptions import FormValidationError
63
+ from pydantic_forms.types import State
63
64
 
64
65
  logger = structlog.get_logger(__name__)
65
66
 
@@ -18,7 +18,7 @@ from sqlalchemy import select
18
18
  from sqlalchemy.orm import joinedload
19
19
 
20
20
  from orchestrator.db import ProductTable, db
21
- from orchestrator.types import UUIDstr
21
+ from pydantic_forms.types import UUIDstr
22
22
 
23
23
 
24
24
  def get_products(*, filters: list | None = None) -> list[ProductTable]:
@@ -43,9 +43,10 @@ from orchestrator.db.models import (
43
43
  )
44
44
  from orchestrator.domain.base import SubscriptionModel
45
45
  from orchestrator.targets import Target
46
- from orchestrator.types import SubscriptionLifecycle, UUIDstr
46
+ from orchestrator.types import SubscriptionLifecycle
47
47
  from orchestrator.utils.datetime import nowtz
48
48
  from orchestrator.utils.helpers import is_ipaddress_type
49
+ from pydantic_forms.types import UUIDstr
49
50
 
50
51
  logger = structlog.get_logger(__name__)
51
52
 
@@ -30,10 +30,11 @@ from orchestrator.services.processes import (
30
30
  safe_logstep,
31
31
  thread_resume_process,
32
32
  )
33
- from orchestrator.types import BroadcastFunc, State
33
+ from orchestrator.types import BroadcastFunc
34
34
  from orchestrator.utils.json import json_dumps, json_loads
35
35
  from orchestrator.workflow import ProcessStat, ProcessStatus, Success, runwf
36
36
  from orchestrator.workflows import get_workflow
37
+ from pydantic_forms.types import State
37
38
 
38
39
  logger = get_task_logger(__name__)
39
40
 
orchestrator/settings.py CHANGED
@@ -20,7 +20,7 @@ from pydantic import PostgresDsn, RedisDsn
20
20
  from pydantic_settings import BaseSettings
21
21
 
22
22
  from oauth2_lib.settings import oauth2lib_settings
23
- from orchestrator.types import strEnum
23
+ from pydantic_forms.types import strEnum
24
24
 
25
25
 
26
26
  class ExecutorType(strEnum):
orchestrator/targets.py CHANGED
@@ -13,7 +13,7 @@
13
13
 
14
14
  import strawberry
15
15
 
16
- from orchestrator.types import strEnum
16
+ from pydantic_forms.types import strEnum
17
17
 
18
18
 
19
19
  @strawberry.enum
orchestrator/types.py CHANGED
@@ -34,59 +34,24 @@ from annotated_types import Len, MaxLen, MinLen
34
34
  from more_itertools import first, last
35
35
  from pydantic.fields import FieldInfo
36
36
 
37
- # TODO #428: eventually enforce code migration for downstream users to import
38
- # these types from pydantic_forms themselves
39
- from pydantic_forms.types import (
40
- JSON,
41
- AcceptData,
42
- AcceptItemType,
43
- FormGenerator,
44
- FormGeneratorAsync,
45
- InputForm,
46
- InputFormGenerator,
47
- InputStepFunc,
48
- SimpleInputFormGenerator,
49
- State,
50
- StateInputFormGenerator,
51
- StateInputFormGeneratorAsync,
52
- StateInputStepFunc,
53
- StateSimpleInputFormGenerator,
54
- SubscriptionMapping,
55
- SummaryData,
56
- UUIDstr,
57
- strEnum,
58
- )
37
+ from pydantic_forms.types import InputForm, State, strEnum
59
38
 
60
39
  __all__ = [
61
- "JSON",
40
+ "SAFE_USED_BY_TRANSITIONS_FOR_STATUS",
62
41
  "BroadcastFunc",
63
- "AcceptData",
64
- "AcceptItemType",
65
42
  "ErrorDict",
66
43
  "ErrorState",
67
- "FormGenerator",
68
- "FormGeneratorAsync",
69
- "InputForm",
70
- "InputFormGenerator",
71
- "InputStepFunc",
72
- "SimpleInputFormGenerator",
73
- "State",
74
- "StateInputFormGenerator",
75
- "StateInputFormGeneratorAsync",
76
- "StateInputStepFunc",
77
- "StateSimpleInputFormGenerator",
78
44
  "StateStepFunc",
79
45
  "StepFunc",
80
46
  "SubscriptionLifecycle",
81
- "SubscriptionMapping",
82
- "SummaryData",
83
- "UUIDstr",
47
+ "filter_nonetype",
48
+ "get_origin_and_args",
49
+ "get_possible_product_block_types",
84
50
  "is_list_type",
85
51
  "is_of_type",
86
52
  "is_optional_type",
87
53
  "is_union_type",
88
- "get_possible_product_block_types",
89
- "strEnum",
54
+ "list_factory",
90
55
  ]
91
56
 
92
57
  if TYPE_CHECKING:
@@ -97,8 +62,8 @@ def is_union(tp: type[Any] | None) -> bool:
97
62
  return tp is Union or tp is types.UnionType # type: ignore[comparison-overlap]
98
63
 
99
64
 
100
- # ErrorState is either a string containing an error message, a catched Exception or a tuple containing a message and
101
- # a HTTP status code
65
+ # ErrorState is either a string containing an error message, a caught Exception, or a tuple containing a message and
66
+ # an HTTP status code
102
67
  ErrorState = Union[str, Exception, tuple[str, Union[int, HTTPStatus]]]
103
68
  # An ErrorDict should have the following keys:
104
69
  # error: str # A message describing the error
@@ -18,7 +18,8 @@ from typing import Any, cast
18
18
  import structlog
19
19
 
20
20
  from nwastdlib.ex import show_ex
21
- from orchestrator.types import JSON, ErrorDict
21
+ from orchestrator.types import ErrorDict
22
+ from pydantic_forms.types import JSON
22
23
 
23
24
  logger = structlog.get_logger(__name__)
24
25
 
@@ -19,7 +19,7 @@ from typing import Any, cast, get_args
19
19
  from uuid import UUID
20
20
 
21
21
  from orchestrator.domain.base import SubscriptionModel
22
- from orchestrator.types import State, StepFunc, is_list_type, is_optional_type
22
+ from orchestrator.types import StepFunc, is_list_type, is_optional_type
23
23
  from orchestrator.utils.functional import logger
24
24
  from pydantic_forms.types import (
25
25
  FormGenerator,
@@ -27,6 +27,7 @@ from pydantic_forms.types import (
27
27
  InputFormGenerator,
28
28
  InputStepFunc,
29
29
  SimpleInputFormGenerator,
30
+ State,
30
31
  StateInputStepFunc,
31
32
  )
32
33
 
orchestrator/workflow.py CHANGED
@@ -43,7 +43,7 @@ from orchestrator.config.assignee import Assignee
43
43
  from orchestrator.db import db, transactional
44
44
  from orchestrator.services.settings import get_engine_settings
45
45
  from orchestrator.targets import Target
46
- from orchestrator.types import ErrorDict, State, StepFunc, strEnum
46
+ from orchestrator.types import ErrorDict, StepFunc
47
47
  from orchestrator.utils.docs import make_workflow_doc
48
48
  from orchestrator.utils.errors import error_state_to_dict
49
49
  from orchestrator.utils.state import form_inject_args, inject_args
@@ -52,9 +52,11 @@ from pydantic_forms.types import (
52
52
  FormGenerator,
53
53
  InputFormGenerator,
54
54
  InputStepFunc,
55
+ State,
55
56
  StateInputFormGenerator,
56
57
  StateInputStepFunc,
57
58
  StateSimpleInputFormGenerator,
59
+ strEnum,
58
60
  )
59
61
 
60
62
  logger = structlog.get_logger(__name__)
@@ -15,12 +15,11 @@ from orchestrator.forms import SubmitFormPage
15
15
  from orchestrator.services import subscriptions
16
16
  from orchestrator.settings import app_settings
17
17
  from orchestrator.targets import Target
18
- from orchestrator.types import UUIDstr
19
18
  from orchestrator.utils.json import to_serializable
20
19
  from orchestrator.workflow import StepList, conditional, done, init, step, workflow
21
20
  from orchestrator.workflows.steps import cache_domain_models, store_process_subscription
22
21
  from orchestrator.workflows.utils import wrap_modify_initial_input_form
23
- from pydantic_forms.types import FormGenerator, State
22
+ from pydantic_forms.types import FormGenerator, State, UUIDstr
24
23
  from pydantic_forms.validators import LongText
25
24
 
26
25
 
@@ -23,11 +23,12 @@ from orchestrator.domain.base import ProductBlockModel, SubscriptionModel
23
23
  from orchestrator.services.settings import reset_search_index
24
24
  from orchestrator.services.subscriptions import build_extended_domain_model, get_subscription
25
25
  from orchestrator.targets import Target
26
- from orchestrator.types import State, SubscriptionLifecycle, UUIDstr
26
+ from orchestrator.types import SubscriptionLifecycle
27
27
  from orchestrator.utils.json import to_serializable
28
28
  from orchestrator.utils.redis import delete_from_redis, to_redis
29
29
  from orchestrator.websocket import sync_invalidate_subscription_cache
30
30
  from orchestrator.workflow import Step, step
31
+ from pydantic_forms.types import State, UUIDstr
31
32
 
32
33
  logger = structlog.get_logger(__name__)
33
34
 
@@ -19,9 +19,9 @@ from sqlalchemy import select
19
19
  from orchestrator.db import ProcessTable, db
20
20
  from orchestrator.settings import app_settings
21
21
  from orchestrator.targets import Target
22
- from orchestrator.types import State
23
22
  from orchestrator.utils.datetime import nowtz
24
23
  from orchestrator.workflow import ProcessStatus, StepList, done, init, step, workflow
24
+ from pydantic_forms.types import State
25
25
 
26
26
 
27
27
  @step("Clean up completed tasks older than TASK_LOG_RETENTION_DAYS")
@@ -18,8 +18,8 @@ from sqlalchemy import select
18
18
  from orchestrator.db import ProcessTable, db
19
19
  from orchestrator.services import processes
20
20
  from orchestrator.targets import Target
21
- from orchestrator.types import State, UUIDstr
22
21
  from orchestrator.workflow import ProcessStatus, StepList, done, init, step, workflow
22
+ from pydantic_forms.types import State, UUIDstr
23
23
 
24
24
  logger = structlog.get_logger(__name__)
25
25
 
@@ -26,8 +26,8 @@ from orchestrator.services.workflows import (
26
26
  start_validation_workflow_for_workflows,
27
27
  )
28
28
  from orchestrator.targets import Target
29
- from orchestrator.types import FormGenerator, State
30
29
  from orchestrator.workflow import StepList, done, init, step, workflow
30
+ from pydantic_forms.types import FormGenerator, State
31
31
 
32
32
  logger = structlog.get_logger(__name__)
33
33
 
@@ -27,10 +27,10 @@ from orchestrator.services.products import get_products
27
27
  from orchestrator.services.translations import generate_translations
28
28
  from orchestrator.services.workflows import get_workflow_by_name, get_workflows
29
29
  from orchestrator.targets import Target
30
- from orchestrator.types import State
31
30
  from orchestrator.utils.errors import ProcessFailureError
32
31
  from orchestrator.utils.fixed_inputs import fixed_input_configuration as fi_configuration
33
32
  from orchestrator.workflow import StepList, done, init, step, workflow
33
+ from pydantic_forms.types import State
34
34
 
35
35
  # Since these errors are probably programming failures we should not throw AssertionErrors
36
36
 
@@ -25,7 +25,7 @@ from orchestrator.forms.validators import ProductId
25
25
  from orchestrator.services import subscriptions
26
26
  from orchestrator.settings import app_settings
27
27
  from orchestrator.targets import Target
28
- from orchestrator.types import State, SubscriptionLifecycle
28
+ from orchestrator.types import SubscriptionLifecycle
29
29
  from orchestrator.utils.errors import StaleDataError
30
30
  from orchestrator.utils.redis import caching_models_enabled
31
31
  from orchestrator.utils.state import form_inject_args
@@ -41,7 +41,7 @@ from orchestrator.workflows.steps import (
41
41
  unsync_unchecked,
42
42
  )
43
43
  from pydantic_forms.core import FormPage
44
- from pydantic_forms.types import FormGenerator, InputForm, InputStepFunc, StateInputStepFunc
44
+ from pydantic_forms.types import FormGenerator, InputForm, InputStepFunc, State, StateInputStepFunc
45
45
 
46
46
 
47
47
  def _generate_new_subscription_form(_workflow_target: str, workflow_name: str) -> InputForm:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: orchestrator-core
3
- Version: 2.10.0rc2
3
+ Version: 3.0.0rc1
4
4
  Summary: This is the orchestrator workflow engine.
5
5
  Requires-Python: >=3.11,<3.14
6
6
  Classifier: Intended Audience :: Information Technology
@@ -1,14 +1,14 @@
1
- orchestrator/__init__.py,sha256=p507KZH6dyfb9vX3cZ80I0_bDmngfQ255K-SjZGbjiw,1059
1
+ orchestrator/__init__.py,sha256=PnH1xL8hwv-BN9lOpIIDdCKTzsJ5VLGvZxYxQU39j_U,1058
2
2
  orchestrator/app.py,sha256=8GMzoHjdR0bkgRBCejiG8nIUjeo43f12I3WNNZ89pKE,11659
3
3
  orchestrator/exception_handlers.py,sha256=UsW3dw8q0QQlNLcV359bIotah8DYjMsj2Ts1LfX4ClY,1268
4
4
  orchestrator/log_config.py,sha256=1tPRX5q65e57a6a_zEii_PFK8SzWT0mnA5w2sKg4hh8,1853
5
5
  orchestrator/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
6
  orchestrator/security.py,sha256=_W_wFkjmlwVwwHRsql69iMoqRvDCiaA63i5rvRHSrZ0,2414
7
- orchestrator/settings.py,sha256=SFF-jjkVkq_UILzuZbvhBUN3408PeG0y9AFZiCipBVs,3617
8
- orchestrator/targets.py,sha256=QphHzEUTRhue3pKTPYklxDdvCQF1ANxt0r_HjbaxVCc,766
9
- orchestrator/types.py,sha256=cXUWV9EtoO4Dx3h3YJHaGVxmw-5XLt6Mow-dALdhTWk,16230
7
+ orchestrator/settings.py,sha256=9T0faNp2TQTLlI22RCj22EZzj8IFoqWvsapvOnUgbRA,3619
8
+ orchestrator/targets.py,sha256=q_IMCdVUUYWcyKHqyls38fJPveJDBNfSzMKj_U2hLsk,768
9
+ orchestrator/types.py,sha256=4vDeL5teRnugXoet3O2dMv8WwTsEyimrIfzagx9jQRo,15451
10
10
  orchestrator/version.py,sha256=b58e08lxs47wUNXv0jXFO_ykpksmytuzEXD4La4W-NQ,1366
11
- orchestrator/workflow.py,sha256=Qga7ttanKpiILq2az5BmXXZYIUAYMavAv231JLj4I10,43043
11
+ orchestrator/workflow.py,sha256=sdHAuxOsMNzHf3xum-9Lm9FE0OfCm2VcauroOTYn1fw,43051
12
12
  orchestrator/api/__init__.py,sha256=GyHNfEFCGKQwRiN6rQmvSRH2iYX7npjMZn97n8XzmLU,571
13
13
  orchestrator/api/error_handling.py,sha256=YrPCxSa-DSa9KwqIMlXI-KGBGnbGIW5ukOPiikUH9E4,1502
14
14
  orchestrator/api/helpers.py,sha256=s0QRHYw8AvEmlkmRhuEzz9xixaZKUF3YuPzUVHkcoXk,6933
@@ -17,7 +17,7 @@ orchestrator/api/api_v1/__init__.py,sha256=GyHNfEFCGKQwRiN6rQmvSRH2iYX7npjMZn97n
17
17
  orchestrator/api/api_v1/api.py,sha256=Q_Yh9w_SBoyx06jV_kf6leGFrAMXoGjF8UikIAie_us,2858
18
18
  orchestrator/api/api_v1/endpoints/__init__.py,sha256=GyHNfEFCGKQwRiN6rQmvSRH2iYX7npjMZn97n8XzmLU,571
19
19
  orchestrator/api/api_v1/endpoints/health.py,sha256=iaxs1XX1_250_gKNsspuULCV2GEMBjbtjsmfQTOvMAI,1284
20
- orchestrator/api/api_v1/endpoints/processes.py,sha256=21BG32TslSgG2ePs68jUYAy8rDuohTXgzWETOpuNzyI,12761
20
+ orchestrator/api/api_v1/endpoints/processes.py,sha256=VPNqzogjgK9Y-70b9r-tqPSJD-6PyMj9kOrmhPC__lc,12763
21
21
  orchestrator/api/api_v1/endpoints/product_blocks.py,sha256=kZ6ywIOsS_S2qGq7RvZ4KzjvaS1LmwbGWR37AKRvWOw,2146
22
22
  orchestrator/api/api_v1/endpoints/products.py,sha256=BfFtwu9dZXEQbtKxYj9icc73GKGvAGMR5ytyf41nQlQ,3081
23
23
  orchestrator/api/api_v1/endpoints/resource_types.py,sha256=gGyuaDyOD0TAVoeFGaGmjDGnQ8eQQArOxKrrk4MaDzA,2145
@@ -77,30 +77,30 @@ orchestrator/cli/generator/templates/additional_modify_steps.j2,sha256=jwle7hIvd
77
77
  orchestrator/cli/generator/templates/additional_terminate_steps.j2,sha256=jwle7hIvd-EYbnecVFmG0n-6Jpr4DearM0era8AvGYM,25
78
78
  orchestrator/cli/generator/templates/constrained_int_definitions.j2,sha256=59FKIWOeXrO0nblLmbhaFXKb4UQesQ8zFUZ1jDCp9Vk,282
79
79
  orchestrator/cli/generator/templates/create_data_head.j2,sha256=ArP9TUsbobXF4CIpckcaIYos-dgGmPeL-n7SQATvSiE,361
80
- orchestrator/cli/generator/templates/create_product.j2,sha256=di6vqZXPjPp_KtJsIoseoCw5Oj8ayhcmuZpX_C7_LsA,4806
80
+ orchestrator/cli/generator/templates/create_product.j2,sha256=ZPzY1clJ7in_UlBJf0TS94-KYuwN71kGjJn_6eM1Bo4,4838
81
81
  orchestrator/cli/generator/templates/enums.j2,sha256=pmx7_DeoE4X9u83_In18C97XqZP_YwETiw54_E33p1A,298
82
82
  orchestrator/cli/generator/templates/lazy_workflow_instance.j2,sha256=BYB6LwE19OarY7_7Ovej5rqppZWtjiDkG7TDK5dYU7Y,523
83
83
  orchestrator/cli/generator/templates/list_definitions.j2,sha256=XS-F5XXy4HOdsZ-xahprwxfhU0UaiF4VeopkIxfoado,277
84
84
  orchestrator/cli/generator/templates/macros.j2,sha256=fEODRym4gLfL40w9OelXFMDtAjtzmN5nccWDk86oTNI,904
85
- orchestrator/cli/generator/templates/modify_product.j2,sha256=9CeuNKzZkKyB4ntKudLs915BsGfxhUa1dfK3SABAhww,4719
85
+ orchestrator/cli/generator/templates/modify_product.j2,sha256=we2TqyHD5L8dprnOitmwBT8MU7PzVG8iMrzdxXquDfM,4751
86
86
  orchestrator/cli/generator/templates/new_product_migration.j2,sha256=d67I9haNkKdzWzNT0f1S6-UhG86fOWEohF0Al7NmXmA,3023
87
87
  orchestrator/cli/generator/templates/product.j2,sha256=gcN1poWRuGWbsLrQv0Z8SXO6MGuXBHBr33UvQtqsF8E,1241
88
88
  orchestrator/cli/generator/templates/product_block.j2,sha256=X5ynyBG39UiYekPHms7IkSHmxq2j-2OrhAYsFaRqktU,2454
89
89
  orchestrator/cli/generator/templates/shared_forms.j2,sha256=tXbauuMMExwHLYLJVkmAJ74SSFriXlwpOyd04jwWE0k,545
90
- orchestrator/cli/generator/templates/shared_workflows.j2,sha256=esrqnsGH1HcVTUN7yHtR-Bfj01ODbK_bQ9fRf6y2iGk,1274
90
+ orchestrator/cli/generator/templates/shared_workflows.j2,sha256=Y2bu1wP4fmoBXwzBecXqz2O-_9ckTGrGTKRfXux-2H0,1301
91
91
  orchestrator/cli/generator/templates/subscription_model_registry.j2,sha256=7IJF9jX6tJMAuCOYQnfTjsgK0eaF0bFzUuLJImsdl4s,291
92
- orchestrator/cli/generator/templates/terminate_product.j2,sha256=XJO49KkKnexAGkXAvow2O65F5Atd5LNVPQIs1Qk8slM,1883
93
- orchestrator/cli/generator/templates/test_create_workflow.j2,sha256=SO9ja_23wgnMYcI4VFE-eHLR4ZeqEROhGmENxgwWc1M,1802
94
- orchestrator/cli/generator/templates/test_modify_workflow.j2,sha256=sh2JBEhWcEPwxnyD1AieyEAGrfwygP5mA1qjuozv3M4,1677
92
+ orchestrator/cli/generator/templates/terminate_product.j2,sha256=sPqZlMA-Cj-P6RumCMAKwGtvLljlaZfQ1z-Vx3z6eU8,1885
93
+ orchestrator/cli/generator/templates/test_create_workflow.j2,sha256=CnVRdfua1EqXvZx-UY0tq1b3Vmgtq3muQ3nuzHevnT0,1801
94
+ orchestrator/cli/generator/templates/test_modify_workflow.j2,sha256=N91sRRIWQhVB2jcyBAXungoWNb9b1wbSNfsTGq1NwXo,1676
95
95
  orchestrator/cli/generator/templates/test_product_type.j2,sha256=1fRF3HbhQk3BIo58KVsbnchwdQFKM8As7atm9ULjf8s,1860
96
- orchestrator/cli/generator/templates/test_terminate_workflow.j2,sha256=ltjcGw-RWUI9h_3tLD_TWqG8sQkhVry7poNZFFrxCaU,1518
96
+ orchestrator/cli/generator/templates/test_terminate_workflow.j2,sha256=Dwgjf_81drED3z3hNdS3F4Gtsg9VJGStj3VSvD2YuwA,1518
97
97
  orchestrator/cli/generator/templates/test_validate_workflow.j2,sha256=T27fNTOqgbKosI_ZqE1Gdhd8gJCACEVjy2oNrSK6908,985
98
- orchestrator/cli/generator/templates/validate_product.j2,sha256=dPQ1a-WGaYUYI-ZjH3B6zrOj4Ufs804O25Pj5PNiNjc,2315
98
+ orchestrator/cli/generator/templates/validate_product.j2,sha256=_gPNYS8dGOSpRm2E_nf6oxQS0AmXN7MkKm2Klz9HLek,2366
99
99
  orchestrator/cli/helpers/__init__.py,sha256=GyHNfEFCGKQwRiN6rQmvSRH2iYX7npjMZn97n8XzmLU,571
100
100
  orchestrator/cli/helpers/input_helpers.py,sha256=pv5GTMuIWLzBE_bKNhn1XD_gxoqB0s1ZN4cnKkIIu5I,1139
101
- orchestrator/cli/helpers/print_helpers.py,sha256=vxgBD48xnPRjSKrLfrez6s0BRETnCX8X31d9bSFu_DU,857
101
+ orchestrator/cli/helpers/print_helpers.py,sha256=b3ePg6HfBLKPYBBVr5XOA__JnFEMI5HBjbjov3CP8Po,859
102
102
  orchestrator/config/__init__.py,sha256=GyHNfEFCGKQwRiN6rQmvSRH2iYX7npjMZn97n8XzmLU,571
103
- orchestrator/config/assignee.py,sha256=WgXmj_tmsxz5PrOkAYVwgJnxt_QuatwmCfknjEtGoAo,770
103
+ orchestrator/config/assignee.py,sha256=jxMIY6iCLjlbfxwhp-UhImunpE32C9sAR7FSpMD-LvU,772
104
104
  orchestrator/db/__init__.py,sha256=6yC3HSSIgHgfLvGpYE-j8ENr8A2urJxjxUEiZ0C7JJY,3454
105
105
  orchestrator/db/database.py,sha256=MU_w_e95ho2dVb2JDnt_KFYholx___XDkiQXbc8wCkI,10269
106
106
  orchestrator/db/helpers.py,sha256=L8kEdnSSNGnUpZhdeGx2arCodakWN8vSpKdfjoLuHdY,831
@@ -128,19 +128,21 @@ orchestrator/db/sorting/sorting.py,sha256=WpwImCDRKiOp4Tr54vovWpHkoJIov8SNQNPods
128
128
  orchestrator/db/sorting/subscription.py,sha256=uepBMyfRFLZz5yoYK4VK3mdRBvO1Gc-6jSQXQ41fR-8,1441
129
129
  orchestrator/db/sorting/workflow.py,sha256=6-JceMyB99M994Re58E0MX5uhlpnTW5OJCxmXopEfRU,576
130
130
  orchestrator/devtools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
131
- orchestrator/devtools/populator.py,sha256=gCw-U4gDAdCQ1P-YOG_NgDducql8he1Vdjw_P8L6okA,19678
131
+ orchestrator/devtools/populator.py,sha256=MeO7qv7YskY5i5p1Ko9yluplY520GFq0HjFlz-WXMio,19680
132
132
  orchestrator/devtools/scripts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
133
- orchestrator/devtools/scripts/migrate_20.py,sha256=WiDyOjeYh7sPufrbrc33BBmJRYWwxPqJOqhHApjuBoI,8359
133
+ orchestrator/devtools/scripts/migrate_20.py,sha256=8-qLiWfjYctu2kNl5MHtZvfeCdUs0YzRjepy4VYOUkc,4891
134
+ orchestrator/devtools/scripts/migrate_30.py,sha256=pRnJQFvmliwTLgbbDSUGyS9sCWqQcTms-g_3yfUO5vQ,3030
135
+ orchestrator/devtools/scripts/shared.py,sha256=ZnGb2nA62gjG0DSEpXcnVq1xIjdkadUXJIZsF5O3tEc,3775
134
136
  orchestrator/distlock/__init__.py,sha256=0uCW-4efWGbU4RXSb7t3U1yA2T8z77OGgb9SDNebdmA,2491
135
137
  orchestrator/distlock/distlock_manager.py,sha256=VVfBpOnk574JncfHwS6sPavKwPxCgAneDqZNT8fVWNw,2508
136
138
  orchestrator/distlock/managers/__init__.py,sha256=ImIkNsrXcyE7-NgRWqEhUXUuUzda9KwcDkhebipfSdI,571
137
139
  orchestrator/distlock/managers/memory_distlock_manager.py,sha256=HWQafcVKBF-Cka_wukZZ1GM69AWPVOpJPje3quIebQ8,3114
138
140
  orchestrator/distlock/managers/redis_distlock_manager.py,sha256=Lk0Krw7dQD58uleAz3Eancc4La-xSCFHxB8ymg3qWf0,3271
139
141
  orchestrator/domain/__init__.py,sha256=Rnt9XXHasAgieQiLT0JhUFRrysa9EIubvzcd5kk3Gvc,894
140
- orchestrator/domain/base.py,sha256=2yehcuXSkq3H2wl8y19qeY98BQX_aL2i5QxxAU896JI,61929
142
+ orchestrator/domain/base.py,sha256=cMBJps91vtJJPXQUk0Ejps-K6DaEdkK6GTGdvtPpDnA,61953
141
143
  orchestrator/domain/customer_description.py,sha256=v7o6TTN4oc6bWHZU-jCT-fUYvkeYahbpXOwlKXofuI8,3360
142
144
  orchestrator/domain/helpers.py,sha256=2j2j_7J8qvniHxxpdoEQsoVpC-llkn0tbww2eCA0K1A,989
143
- orchestrator/domain/lifecycle.py,sha256=ROYJ5t6JFy5PwE9nmApS54NIEw0dwk-2iZC-OzW18-U,2882
145
+ orchestrator/domain/lifecycle.py,sha256=VeQwik9nNX-6bQl12G9VP4JPq6ephDV73XDXu1pfh5g,2914
144
146
  orchestrator/forms/__init__.py,sha256=bw_1238HKy_T0gvfA5oEjJFwkALzvWU4O_VJ0xE8UyU,1168
145
147
  orchestrator/forms/validators/__init__.py,sha256=2T7w429dQhChsAbnQDeyp2BrM_iKj6-nkNrz27RZatY,1906
146
148
  orchestrator/forms/validators/customer_contact_list.py,sha256=61A7FpXBjWhurIAGzJcLVlZSWajm41QWgFZP-rUT_5o,1508
@@ -197,7 +199,7 @@ orchestrator/graphql/utils/to_graphql_result_page.py,sha256=8ObkJP8reVf-TQOQVPKv
197
199
  orchestrator/migrations/README,sha256=heMzebYwlGhnE8_4CWJ4LS74WoEZjBy-S-mIJRxAEKI,39
198
200
  orchestrator/migrations/alembic.ini,sha256=kMoADqhGeubU8xanILNaqm4oixLy9m4ngYtdGpZcc7I,873
199
201
  orchestrator/migrations/env.py,sha256=AwlgBPYbV2hr5rHNwlOPJ5rs-vRyfmzcWyxae0btpZ4,3382
200
- orchestrator/migrations/helpers.py,sha256=5BVDKOFETKyW4kE0-DiTU068VFrRo52n3MKrvt5LfjU,43769
202
+ orchestrator/migrations/helpers.py,sha256=iGDHvFR2cHIHyG0kTnXP0XrJCAKAeG57S79GEHbtd64,43771
201
203
  orchestrator/migrations/script.py.mako,sha256=607Zrgp-Z-m9WGLt4wewN1QDOmHeifxcePUdADkSZyM,510
202
204
  orchestrator/migrations/templates/alembic.ini.j2,sha256=jA-QykVparwWSNt5XDP0Zk7epLOhK7D87Af-i2shJV4,905
203
205
  orchestrator/migrations/templates/env.py.j2,sha256=RfLAQItZ56Jlzwi6LJfBo92m1-th_bdfkFKD1mwTZIE,2821
@@ -230,27 +232,27 @@ orchestrator/schedules/validate_products.py,sha256=YMr7ASSqdXM6pd6oZu0kr8mfmH8If
230
232
  orchestrator/schedules/validate_subscriptions.py,sha256=YYcU2iGf8Ga_s577kgpKdhQV4p7wCEHGYvUf8FCvBvQ,2022
231
233
  orchestrator/schemas/__init__.py,sha256=YDyZ0YBvzB4ML9oDBCBPGnBvf680zFFgUzg7X0tYBRY,2326
232
234
  orchestrator/schemas/base.py,sha256=Vc444LetsINLRhG2SxW9Bq01hOzChPOhQWCImQTr-As,930
233
- orchestrator/schemas/engine_settings.py,sha256=BOyFNOn7AqHVdUxXyqmPk5aVdFY5A0cCOZ4bAwxQsgo,1286
235
+ orchestrator/schemas/engine_settings.py,sha256=8cgJHPigu2TjYG-t3uRrBLFjcVJGKVPpAnIKFs29mL4,1288
234
236
  orchestrator/schemas/fixed_input.py,sha256=Rth3hT5K7zYuQr1bUY_NJRzb03xEZuT1p6EvYXVNE54,1214
235
237
  orchestrator/schemas/problem_detail.py,sha256=DxiUhWv6EVXLZgdKFv0EYVnCgtkDj7xteDCR0q2f5yw,802
236
238
  orchestrator/schemas/process.py,sha256=NgS1eBRtO2GUCRNsvbvYyjNkR2aBdH-kwcsR_y8DfNU,2354
237
239
  orchestrator/schemas/product.py,sha256=MhMCh058ZuS2RJq-wSmxIPUNlhQexxXIx3DSz2OmOh4,1570
238
240
  orchestrator/schemas/product_block.py,sha256=kCqvm6qadHpegMr9aWI_fYX-T7mS-5S-ldPxnGQZg7M,1519
239
241
  orchestrator/schemas/resource_type.py,sha256=VDju4XywcDDLxdpbWU62RTvR9QF8x_GRrpTlN_NE8uI,1064
240
- orchestrator/schemas/subscription.py,sha256=zNy7bb-ww-MEN4QW9xIwxzcNSyFPEgjt5tt1T4Ah0hQ,3383
242
+ orchestrator/schemas/subscription.py,sha256=1SKrhw25-HtTp39lM05R9gynr9GprMxQol4GjnXPEwM,3415
241
243
  orchestrator/schemas/subscription_descriptions.py,sha256=Ft_jw1U0bf9Z0U8O4OWfLlcl0mXCVT_qYVagBP3GbIQ,1262
242
244
  orchestrator/schemas/workflow.py,sha256=w-CaRPp9AAddhnd8o_0jPaey1Vnnh-s-A5s5kWlR2pI,1977
243
245
  orchestrator/services/__init__.py,sha256=GyHNfEFCGKQwRiN6rQmvSRH2iYX7npjMZn97n8XzmLU,571
244
- orchestrator/services/celery.py,sha256=uvXSKuq_XHcF4BgEpt2QgGUfUnpopApF74FsgAQdnFY,4634
246
+ orchestrator/services/celery.py,sha256=aiWw7ps5a1f6dPTLzJG67JmwqpKSBhsD7ZiBKhbWDPk,4636
245
247
  orchestrator/services/fixed_inputs.py,sha256=kyz7s2HLzyDulvcq-ZqefTw1om86COvyvTjz0_5CmgI,876
246
248
  orchestrator/services/process_broadcast_thread.py,sha256=D44YbjF8mRqGuznkRUV4SoRn1J0lfy_x1H508GnSVlU,4649
247
- orchestrator/services/processes.py,sha256=zZ4CX-AaV1XG2LUvYhReTEw05NZe9cXdiqvRdM7YtjI,27459
248
- orchestrator/services/products.py,sha256=5lKxnfDw80YkF3jOvV1v8c8FtR6allVk3MwpRSDTfPY,1933
249
+ orchestrator/services/processes.py,sha256=466d7WgRwh6qNxNjDZRMvL0QFiQYEU_WG3D2sI4REPQ,27491
250
+ orchestrator/services/products.py,sha256=w6b6sSA3MstmbM_YN8xWEvkb_YnuCQFph48wYU3_Lx4,1935
249
251
  orchestrator/services/resource_types.py,sha256=_QBy_JOW_X3aSTqH0CuLrq4zBJL0p7Q-UDJUcuK2_qc,884
250
252
  orchestrator/services/settings.py,sha256=u-834F4KWloXS8zi7R9mp-D3cjl-rbVjKJRU35IqhXo,2723
251
253
  orchestrator/services/subscription_relations.py,sha256=9C126TUfFvyBe7y4x007kH_dvxJ9pZ1zSnaWeH6HC5k,12261
252
- orchestrator/services/subscriptions.py,sha256=AEuh0p2pmVLDXWE-ylJMD32NQUuqw1_jbaPAYvx_wvA,26177
253
- orchestrator/services/tasks.py,sha256=f3045Hn9uWIXcRvIPN6qdznH_0u-rsIGM9hHalc_BvE,6286
254
+ orchestrator/services/subscriptions.py,sha256=yEeZbgXqrfAgo-l0Tz_NtNJHG5-CkXa8-l76gZ_aw6A,26209
255
+ orchestrator/services/tasks.py,sha256=n-J8At0R4ZuGs7MqGFGVxLs06EbPIlsM2DCyAbsZVKw,6318
254
256
  orchestrator/services/translations.py,sha256=GyP8soUFGej8AS8uulBsk10CCK6Kwfjv9AHMFm3ElQY,1713
255
257
  orchestrator/services/workflows.py,sha256=DStBiQQdPV3zEg1EgPDlk85T6kkBc9AKbiEpxrQG6dI,3170
256
258
  orchestrator/utils/__init__.py,sha256=GyHNfEFCGKQwRiN6rQmvSRH2iYX7npjMZn97n8XzmLU,571
@@ -259,7 +261,7 @@ orchestrator/utils/datetime.py,sha256=a1WQ_yvu7MA0TiaRpC5avwbOSFdrj4eMrV4a7I2sD5
259
261
  orchestrator/utils/deprecation_logger.py,sha256=oqju7ecJcB_r7cMnldaOAA79QUZYS_h69IkDrFV9nAg,875
260
262
  orchestrator/utils/docs.py,sha256=GbyD61oKn1yVYaphUKHCBvrWEWJDTQfRc_VEbVb-zgU,6172
261
263
  orchestrator/utils/enrich_process.py,sha256=o_QSy5Q4wn1SMHhzVOw6bp7uhDXr7GhAIWRDDMWUVO4,4699
262
- orchestrator/utils/errors.py,sha256=LCYn2OEBCxQBWCYIbJeO8vv6IjK1Dp4195TulD5nJzU,4613
264
+ orchestrator/utils/errors.py,sha256=4dJ3BvAEunG5w-VUtc8346zzOTUv_102qeH2YFdJhPs,4645
263
265
  orchestrator/utils/fixed_inputs.py,sha256=pnL6I_19VMp_Bny8SYjSzVFNvTFDyeCxFFOWGhTnDiQ,2665
264
266
  orchestrator/utils/functional.py,sha256=w_iqB8zppLMnUaioyRjsZAAYC4y5kLw3zih5NKkEFoM,8063
265
267
  orchestrator/utils/get_subscription_dict.py,sha256=fkgDM54hn5YGUP9_2MOcJApJK1Z6c_Rl6sJERsrOy6M,686
@@ -268,7 +270,7 @@ orchestrator/utils/helpers.py,sha256=NjUF3IvWdnLulliP8-JQvGGGpHrh0vs0Vm092ynw-ss
268
270
  orchestrator/utils/json.py,sha256=7386sdqkrKYyy4sbn5NscwctH_v1hLyw5172P__rU3g,8341
269
271
  orchestrator/utils/redis.py,sha256=fvALD_Yt4lZuIfgCLGJwwQSElgKOLHrxH_RdhSXkeZw,7222
270
272
  orchestrator/utils/search_query.py,sha256=ji5LHtrzohGz6b1IG41cnPdpWXzLEzz4SGWgHly_yfU,16205
271
- orchestrator/utils/state.py,sha256=aNR7XftX9dX-2TKHFu2I2rIRIqFENB7AnlpH6Zs80QA,13181
273
+ orchestrator/utils/state.py,sha256=DLHBnpEjhHQNeBGYV6H6geqZclToeMuWwqU26TVy220,13185
272
274
  orchestrator/utils/strings.py,sha256=N0gWjmQaMjE9_99VtRvRaU8IBLTKMgBKSXcTZ9TpWAg,1077
273
275
  orchestrator/utils/validate_data_version.py,sha256=3Eioy2wE2EWKSgkyMKcEKrkCAfUIAq-eb73iRcpgppw,184
274
276
  orchestrator/websocket/__init__.py,sha256=V79jskk1z3uPIYgu0Gt6JLzuqr7NGfNeAZ-hbBqoUv4,5745
@@ -276,17 +278,17 @@ orchestrator/websocket/websocket_manager.py,sha256=Vw5GW67rP_RYoPUhfPp9Fi8_M9E9S
276
278
  orchestrator/websocket/managers/broadcast_websocket_manager.py,sha256=fwoSgTjkHJ2GmsLTU9dqQpAA9i8b1McPu7gLNzxtfG4,5401
277
279
  orchestrator/websocket/managers/memory_websocket_manager.py,sha256=lF5EEx1iFMCGEkTbItTDr88NENMSaSeG1QrJ7teoPkY,3324
278
280
  orchestrator/workflows/__init__.py,sha256=NzIGGI-8SNAwCk2YqH6sHhEWbgAY457ntDwjO15N8v4,4131
279
- orchestrator/workflows/modify_note.py,sha256=OkouKVZDinjWSN3J3_0gbvOMScvcKlWvPCkban45HxE,2438
281
+ orchestrator/workflows/modify_note.py,sha256=FcyxUajzGeBX0O1XjXDgqNLpBHqU6Uk3iA1Vzq6gMHc,2408
280
282
  orchestrator/workflows/removed_workflow.py,sha256=V0Da5TEdfLdZZKD38ig-MTp3_IuE7VGqzHHzvPYQmLI,909
281
- orchestrator/workflows/steps.py,sha256=8dnB4HlqBWZ4JlP1eQVnHdinzoM0ZlgFL0KYn_3k8x4,9762
282
- orchestrator/workflows/utils.py,sha256=inWbR-44B0jj8YZMFBxndpcsfk5IC0MnlCnGB2dy5BU,13525
283
+ orchestrator/workflows/steps.py,sha256=8va4iHbU35bUB-RVatI8dMs8LzB0Y29s9ZdmDFTv7VE,9794
284
+ orchestrator/workflows/utils.py,sha256=9KfhnDL88csT4fvFfUVDv8o9mHBtNUQuG3LBDms8ApQ,13525
283
285
  orchestrator/workflows/tasks/__init__.py,sha256=GyHNfEFCGKQwRiN6rQmvSRH2iYX7npjMZn97n8XzmLU,571
284
- orchestrator/workflows/tasks/cleanup_tasks_log.py,sha256=JNx2lCIxdhTPD33EgwQUsQjoLeyKH2RKZR_e5eh80Ls,1614
285
- orchestrator/workflows/tasks/resume_workflows.py,sha256=wZGNHHQYL7wociSTmoNdDdh5CJkVOkvu3kCUg9uY_88,2349
286
- orchestrator/workflows/tasks/validate_product_type.py,sha256=kVuN94hGWcmBNphgpAlGTSiyO2dEhFwgIq87SYjArns,3174
287
- orchestrator/workflows/tasks/validate_products.py,sha256=j_aOyxcH8DymlGupSS6XRwQdWx2Ab-c8f8iUvAXBTes,8511
286
+ orchestrator/workflows/tasks/cleanup_tasks_log.py,sha256=A3R_EQHJ75EYvzRK8ZdDcFNC9KjsSOQXLugmaNVOcWA,1616
287
+ orchestrator/workflows/tasks/resume_workflows.py,sha256=R0I3jxGToiqDr5mF3YjDd6dNQjQrSYb7-X7GCn7E9uc,2351
288
+ orchestrator/workflows/tasks/validate_product_type.py,sha256=5FwhRQyMNgtys5DM846EIIY0uXKvnSYy3Orf7lOg0DA,3176
289
+ orchestrator/workflows/tasks/validate_products.py,sha256=5uXX7MXMDDP13cXRvfLDNvvCp4nG7zLQBm_IYdf8BSs,8513
288
290
  orchestrator/workflows/translations/en-GB.json,sha256=ST53HxkphFLTMjFHonykDBOZ7-P_KxksktZU3GbxLt0,846
289
- orchestrator_core-2.10.0rc2.dist-info/LICENSE,sha256=b-aA5OZQuuBATmLKo_mln8CQrDPPhg3ghLzjPjLn4Tg,11409
290
- orchestrator_core-2.10.0rc2.dist-info/WHEEL,sha256=CpUCUxeHQbRN5UGRQHYRJorO5Af-Qy_fHMctcQ8DSGI,82
291
- orchestrator_core-2.10.0rc2.dist-info/METADATA,sha256=O8kU95N5X4y2BZNhjkkhn-Jkl4Gc3KWzh2owKvgJxek,4926
292
- orchestrator_core-2.10.0rc2.dist-info/RECORD,,
291
+ orchestrator_core-3.0.0rc1.dist-info/LICENSE,sha256=b-aA5OZQuuBATmLKo_mln8CQrDPPhg3ghLzjPjLn4Tg,11409
292
+ orchestrator_core-3.0.0rc1.dist-info/WHEEL,sha256=CpUCUxeHQbRN5UGRQHYRJorO5Af-Qy_fHMctcQ8DSGI,82
293
+ orchestrator_core-3.0.0rc1.dist-info/METADATA,sha256=mtEpdm66aYgUKffNCNR3Qn5sWf4ztiYjJoK9julFcTs,4925
294
+ orchestrator_core-3.0.0rc1.dist-info/RECORD,,