orchestrator-core 4.0.0rc1__py3-none-any.whl → 4.0.0rc2__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.
orchestrator/__init__.py CHANGED
@@ -13,7 +13,7 @@
13
13
 
14
14
  """This is the orchestrator workflow engine."""
15
15
 
16
- __version__ = "4.0.0rc1"
16
+ __version__ = "4.0.0rc2"
17
17
 
18
18
  from orchestrator.app import OrchestratorCore
19
19
  from orchestrator.settings import app_settings
@@ -63,24 +63,28 @@ new_workflows = [
63
63
  {
64
64
  "name": "create_{{ product.variable }}",
65
65
  "target": Target.CREATE,
66
+ "is_task": False,
66
67
  "description": "Create {{ product.name }}",
67
68
  "product_type": "{{ product.type }}",
68
69
  },
69
70
  {
70
71
  "name": "modify_{{ product.variable }}",
71
72
  "target": Target.MODIFY,
73
+ "is_task": False,
72
74
  "description": "Modify {{ product.name }}",
73
75
  "product_type": "{{ product.type }}",
74
76
  },
75
77
  {
76
78
  "name": "terminate_{{ product.variable }}",
77
79
  "target": Target.TERMINATE,
80
+ "is_task": False,
78
81
  "description": "Terminate {{ product.name }}",
79
82
  "product_type": "{{ product.type }}",
80
83
  },
81
84
  {
82
85
  "name": "validate_{{ product.variable }}",
83
- "target": Target.SYSTEM,
86
+ "target": Target.VALIDATE,
87
+ "is_task": True,
84
88
  "description": "Validate {{ product.name }}",
85
89
  "product_type": "{{ product.type }}",
86
90
  },
@@ -150,22 +150,22 @@ def create_tasks_migration_wizard() -> tuple[list[dict], list[dict]]:
150
150
  - list of task items to add in the migration
151
151
  - list of task items to delete in the migration
152
152
  """
153
- database_tasks = {
154
- task.name: task for task in list(db.session.scalars(select(WorkflowTable))) if task.target == Target.SYSTEM
155
- }
153
+ database_tasks = {task.name: task for task in list(db.session.scalars(select(WorkflowTable))) if task.is_task}
156
154
  registered_wf_instances = {
157
155
  task: cast(Workflow, get_workflow(task)) for task in orchestrator.workflows.ALL_WORKFLOWS.keys()
158
156
  }
159
157
 
158
+ is_task = [Target.SYSTEM, Target.VALIDATE]
159
+
160
160
  registered_tasks = dict(
161
161
  filter(
162
- lambda task: task[1].target == Target.SYSTEM and task[0] in database_tasks.keys(),
162
+ lambda task: task[1].target in is_task and task[0] in database_tasks.keys(),
163
163
  registered_wf_instances.items(),
164
164
  )
165
165
  )
166
166
  available_tasks = dict(
167
167
  filter(
168
- lambda task: task[1].target == Target.SYSTEM and task[0] not in database_tasks.keys(),
168
+ lambda task: task[1].target in is_task and task[0] not in database_tasks.keys(),
169
169
  registered_wf_instances.items(),
170
170
  )
171
171
  )
@@ -11,7 +11,6 @@ import orchestrator.workflows
11
11
  from orchestrator.cli.helpers.input_helpers import _enumerate_menu_keys, _prompt_user_menu, get_user_input
12
12
  from orchestrator.cli.helpers.print_helpers import COLOR, noqa_print, print_fmt, str_fmt
13
13
  from orchestrator.db import ProductTable, WorkflowTable, db
14
- from orchestrator.targets import Target
15
14
  from orchestrator.workflows import LazyWorkflowInstance, get_workflow
16
15
 
17
16
  # Workflows are registered via migrations with product type. For every product with the given product_type, there will be an entry in products_workflows.
@@ -183,7 +182,7 @@ def create_workflows_migration_wizard() -> tuple[list[dict], list[dict]]:
183
182
  """
184
183
  database_workflows = list(db.session.scalars(select(WorkflowTable)))
185
184
  registered_workflows = orchestrator.workflows.ALL_WORKFLOWS
186
- system_workflow_names = {wf.name for wf in database_workflows if wf.target == Target.SYSTEM}
185
+ system_workflow_names = {wf.name for wf in database_workflows if wf.is_task}
187
186
  registered_non_system_workflows = {k: v for k, v in registered_workflows.items() if k not in system_workflow_names}
188
187
 
189
188
  unregistered_workflows = [wf for wf in database_workflows if wf.name not in registered_workflows.keys()]
orchestrator/db/models.py CHANGED
@@ -412,6 +412,8 @@ class WorkflowTable(BaseModel):
412
412
  )
413
413
  processes = relationship("ProcessTable", cascade="all, delete-orphan", back_populates="workflow")
414
414
 
415
+ is_task = mapped_column(Boolean, nullable=False, server_default=text("false"))
416
+
415
417
  @staticmethod
416
418
  def select() -> Select:
417
419
  return (
@@ -135,18 +135,21 @@ def create_workflow(conn: sa.engine.Connection, workflow: dict) -> None:
135
135
  >>> workflow = {
136
136
  "name": "workflow_name",
137
137
  "target": "SYSTEM",
138
+ "is_task": False,
138
139
  "description": "workflow description",
139
140
  "product_type": "product_type",
140
141
  }
141
142
  >>> create_workflow(conn, workflow)
142
143
  """
144
+ if not workflow.get("is_task", False):
145
+ workflow["is_task"] = False
143
146
 
144
147
  conn.execute(
145
148
  sa.text(
146
149
  """
147
150
  WITH new_workflow AS (
148
- INSERT INTO workflows(name, target, description)
149
- VALUES (:name, :target, :description)
151
+ INSERT INTO workflows(name, target, is_task, description)
152
+ VALUES (:name, :target, :is_task, :description)
150
153
  ON CONFLICT DO NOTHING
151
154
  RETURNING workflow_id)
152
155
  INSERT
@@ -184,8 +187,8 @@ def create_task(conn: sa.engine.Connection, task: dict) -> None:
184
187
  conn.execute(
185
188
  sa.text(
186
189
  """
187
- INSERT INTO workflows(name, target, description)
188
- VALUES (:name, 'SYSTEM', :description)
190
+ INSERT INTO workflows(name, target, is_task, description)
191
+ VALUES (:name, 'SYSTEM', TRUE, :description)
189
192
  ON CONFLICT DO NOTHING
190
193
  RETURNING workflow_id
191
194
  """
@@ -206,6 +209,7 @@ def create_workflows(conn: sa.engine.Connection, new: dict) -> None:
206
209
  "workflow_name": {
207
210
  "workflow_id": "f2702074-3203-454c-b298-6dfa7675423d",
208
211
  "target": "CREATE",
212
+ "is_task": False,
209
213
  "description": "Workflow description",
210
214
  "tag": "ProductBlockName1",
211
215
  "search_phrase": "Search Phrase%",
@@ -214,12 +218,16 @@ def create_workflows(conn: sa.engine.Connection, new: dict) -> None:
214
218
  """
215
219
  for name, workflow in new.items():
216
220
  workflow["name"] = name
221
+
222
+ if not workflow.get("is_task", False):
223
+ workflow["is_task"] = False
224
+
217
225
  conn.execute(
218
226
  sa.text(
219
227
  """
220
228
  WITH new_workflow AS (
221
- INSERT INTO workflows(workflow_id, name, target, description)
222
- VALUES (:workflow_id, :name, :target, :description)
229
+ INSERT INTO workflows(workflow_id, name, target, is_task, description)
230
+ VALUES (:workflow_id, :name, :target, :is_task, :description)
223
231
  RETURNING workflow_id)
224
232
  INSERT
225
233
  INTO products_workflows (product_id, workflow_id)
@@ -14,7 +14,7 @@ logger = get_logger(__name__)
14
14
 
15
15
  # revision identifiers, used by Alembic.
16
16
  revision = "68d14db1b8da"
17
- down_revision = "bac6be6f2b4f"
17
+ down_revision = "fc5c993a4b4a"
18
18
  branch_labels = None
19
19
  depends_on = None
20
20
 
@@ -0,0 +1,28 @@
1
+ """Add is_task to workflow.
2
+
3
+ Revision ID: 161918133bec
4
+ Revises: 68d14db1b8da
5
+ Create Date: 2025-05-08 11:25:51.966410
6
+
7
+ """
8
+
9
+ import sqlalchemy as sa
10
+ from alembic import op
11
+
12
+ # revision identifiers, used by Alembic.
13
+ revision = "161918133bec"
14
+ down_revision = "68d14db1b8da"
15
+ branch_labels = None
16
+ depends_on = None
17
+
18
+
19
+ def upgrade() -> None:
20
+ # ### commands auto generated by Alembic - please adjust! ###
21
+ op.add_column("workflows", sa.Column("is_task", sa.Boolean(), server_default=sa.text("false"), nullable=False))
22
+ # ### end Alembic commands ###
23
+
24
+
25
+ def downgrade() -> None:
26
+ # ### commands auto generated by Alembic - please adjust! ###
27
+ op.drop_column("workflows", "is_task")
28
+ # ### end Alembic commands ###
@@ -22,7 +22,7 @@ from orchestrator.services.subscriptions import (
22
22
  get_subscriptions_on_product_table_in_sync,
23
23
  )
24
24
  from orchestrator.services.workflows import (
25
- get_system_product_workflows_for_subscription,
25
+ get_validation_product_workflows_for_subscription,
26
26
  start_validation_workflow_for_workflows,
27
27
  )
28
28
  from orchestrator.settings import app_settings
@@ -42,9 +42,9 @@ def validate_subscriptions() -> None:
42
42
  subscriptions = get_subscriptions_on_product_table_in_sync()
43
43
 
44
44
  for subscription in subscriptions:
45
- system_product_workflows = get_system_product_workflows_for_subscription(subscription)
45
+ validation_product_workflows = get_validation_product_workflows_for_subscription(subscription)
46
46
 
47
- if not system_product_workflows:
47
+ if not validation_product_workflows:
48
48
  logger.warning(
49
49
  "SubscriptionTable has no validation workflow",
50
50
  subscription=subscription,
@@ -52,4 +52,4 @@ def validate_subscriptions() -> None:
52
52
  )
53
53
  break
54
54
 
55
- start_validation_workflow_for_workflows(subscription=subscription, workflows=system_product_workflows)
55
+ start_validation_workflow_for_workflows(subscription=subscription, workflows=validation_product_workflows)
@@ -24,6 +24,7 @@ from orchestrator.targets import Target
24
24
  class WorkflowBaseSchema(OrchestratorBaseModel):
25
25
  name: str
26
26
  target: Target
27
+ is_task: bool = False
27
28
  description: str | None = None
28
29
  created_at: datetime | None = None
29
30
 
@@ -24,7 +24,7 @@ from orchestrator.api.error_handling import raise_status
24
24
  from orchestrator.db import ProcessTable, db
25
25
  from orchestrator.services.input_state import store_input_state
26
26
  from orchestrator.services.processes import create_process, delete_process
27
- from orchestrator.targets import Target
27
+ from orchestrator.services.workflows import get_workflow_by_name
28
28
  from orchestrator.workflows import get_workflow
29
29
  from pydantic_forms.types import State
30
30
 
@@ -51,7 +51,11 @@ def _celery_start_process(
51
51
  if not workflow:
52
52
  raise_status(HTTPStatus.NOT_FOUND, "Workflow does not exist")
53
53
 
54
- task_name = NEW_TASK if workflow.target == Target.SYSTEM else NEW_WORKFLOW
54
+ wf_table = get_workflow_by_name(workflow.name)
55
+ if not wf_table:
56
+ raise_status(HTTPStatus.NOT_FOUND, "Workflow in Database does not exist")
57
+
58
+ task_name = NEW_TASK if wf_table.is_task else NEW_WORKFLOW
55
59
  trigger_task = get_celery_task(task_name)
56
60
  pstat = create_process(workflow_key, user_inputs, user)
57
61
  try:
@@ -80,7 +84,11 @@ def _celery_resume_process(
80
84
  last_process_status = process.last_status
81
85
  workflow = pstat.workflow
82
86
 
83
- task_name = RESUME_TASK if workflow.target == Target.SYSTEM else RESUME_WORKFLOW
87
+ wf_table = get_workflow_by_name(workflow.name)
88
+ if not workflow or not wf_table:
89
+ raise_status(HTTPStatus.NOT_FOUND, "Workflow does not exist")
90
+
91
+ task_name = RESUME_TASK if wf_table.is_task else RESUME_WORKFLOW
84
92
  trigger_task = get_celery_task(task_name)
85
93
 
86
94
  user_inputs = user_inputs or [{}]
@@ -34,7 +34,6 @@ from orchestrator.services.input_state import store_input_state
34
34
  from orchestrator.services.settings import get_engine_settings_for_update
35
35
  from orchestrator.services.workflows import get_workflow_by_name
36
36
  from orchestrator.settings import ExecutorType, app_settings
37
- from orchestrator.targets import Target
38
37
  from orchestrator.types import BroadcastFunc
39
38
  from orchestrator.utils.datetime import nowtz
40
39
  from orchestrator.utils.errors import error_state_to_dict
@@ -108,7 +107,7 @@ def _db_create_process(stat: ProcessStat) -> None:
108
107
  workflow_id=wf_table.workflow_id,
109
108
  last_status=ProcessStatus.CREATED,
110
109
  created_by=stat.current_user,
111
- is_task=stat.workflow.target == Target.SYSTEM,
110
+ is_task=wf_table.is_task,
112
111
  )
113
112
  db.session.add(p)
114
113
  db.session.commit()
@@ -505,6 +505,7 @@ TARGET_DEFAULT_USABLE_MAP: dict[Target, list[str]] = {
505
505
  Target.MODIFY: ["active"],
506
506
  Target.TERMINATE: ["active", "provisioning"],
507
507
  Target.SYSTEM: ["active"],
508
+ Target.VALIDATE: ["active"],
508
509
  }
509
510
 
510
511
  WF_USABLE_MAP: dict[str, list[str]] = {}
@@ -530,6 +531,7 @@ def subscription_workflows(subscription: SubscriptionTable) -> dict[str, Any]:
530
531
  ... "modify": [],
531
532
  ... "terminate": [],
532
533
  ... "system": [],
534
+ ... "validate": [],
533
535
  ... }
534
536
 
535
537
  """
@@ -549,9 +551,10 @@ def subscription_workflows(subscription: SubscriptionTable) -> dict[str, Any]:
549
551
  "modify": [],
550
552
  "terminate": [],
551
553
  "system": [],
554
+ "validate": [],
552
555
  }
553
556
  for workflow in subscription.product.workflows:
554
- if workflow.name in WF_USABLE_WHILE_OUT_OF_SYNC or workflow.target == Target.SYSTEM:
557
+ if workflow.name in WF_USABLE_WHILE_OUT_OF_SYNC or workflow.is_task:
555
558
  # validations and modify note are also possible with: not in sync or locked relations
556
559
  workflow_json = {"name": workflow.name, "description": workflow.description}
557
560
  else:
@@ -39,6 +39,7 @@ def _to_workflow_schema(workflow: WorkflowTable, include_steps: bool = False) ->
39
39
  workflow_id=workflow.workflow_id,
40
40
  name=workflow.name,
41
41
  target=workflow.target,
42
+ is_task=workflow.is_task,
42
43
  description=workflow.description,
43
44
  created_at=workflow.created_at,
44
45
  **extra_kwargs,
@@ -63,10 +64,10 @@ def get_workflow_by_name(workflow_name: str) -> WorkflowTable | None:
63
64
  return db.session.scalar(select(WorkflowTable).where(WorkflowTable.name == workflow_name))
64
65
 
65
66
 
66
- def get_system_product_workflows_for_subscription(
67
+ def get_validation_product_workflows_for_subscription(
67
68
  subscription: SubscriptionTable,
68
69
  ) -> list:
69
- return [workflow.name for workflow in subscription.product.workflows if workflow.target == Target.SYSTEM]
70
+ return [workflow.name for workflow in subscription.product.workflows if workflow.target == Target.VALIDATE]
70
71
 
71
72
 
72
73
  def start_validation_workflow_for_workflows(
@@ -78,9 +79,12 @@ def start_validation_workflow_for_workflows(
78
79
  result = []
79
80
 
80
81
  for workflow_name in workflows:
81
- default = TARGET_DEFAULT_USABLE_MAP[Target.SYSTEM]
82
- usable_when = WF_USABLE_MAP.get(workflow_name, default)
82
+ target_system = TARGET_DEFAULT_USABLE_MAP[Target.SYSTEM]
83
+ system_usable_when = WF_USABLE_MAP.get(workflow_name, target_system)
84
+ target_validate = TARGET_DEFAULT_USABLE_MAP[Target.VALIDATE]
85
+ validate_usable_when = WF_USABLE_MAP.get(workflow_name, target_validate)
83
86
 
87
+ usable_when = system_usable_when + validate_usable_when
84
88
  if subscription.status in usable_when and (
85
89
  product_type_filter is None or subscription.product.product_type == product_type_filter
86
90
  ):
orchestrator/targets.py CHANGED
@@ -22,3 +22,4 @@ class Target(strEnum):
22
22
  MODIFY = "MODIFY"
23
23
  TERMINATE = "TERMINATE"
24
24
  SYSTEM = "SYSTEM"
25
+ VALIDATE = "VALIDATE"
@@ -22,7 +22,7 @@ from orchestrator.services.subscriptions import (
22
22
  get_subscriptions_on_product_table_in_sync,
23
23
  )
24
24
  from orchestrator.services.workflows import (
25
- get_system_product_workflows_for_subscription,
25
+ get_validation_product_workflows_for_subscription,
26
26
  start_validation_workflow_for_workflows,
27
27
  )
28
28
  from orchestrator.targets import Target
@@ -62,7 +62,7 @@ def validate_product_type(product_type: str) -> State:
62
62
  subscriptions = get_subscriptions_on_product_table_in_sync()
63
63
 
64
64
  for subscription in subscriptions:
65
- system_product_workflows = get_system_product_workflows_for_subscription(
65
+ system_product_workflows = get_validation_product_workflows_for_subscription(
66
66
  subscription=subscription,
67
67
  )
68
68
 
@@ -105,13 +105,10 @@ def check_that_products_have_create_modify_and_terminate_workflows() -> State:
105
105
  product_data = get_products(filters=[ProductTable.status == "active"])
106
106
 
107
107
  workflows_not_complete: list = []
108
+ targets = ["CREATE", "TERMINATE", "MODIFY", "VALIDATE"]
108
109
  for product in product_data:
109
- workflows = {
110
- c.target
111
- for c in product.workflows
112
- if c.target in ["CREATE", "TERMINATE", "MODIFY", "SYSTEM"] and c.name != "modify_note"
113
- }
114
- if len(workflows) < 4:
110
+ workflows = {c.target for c in product.workflows if c.target in targets and c.name != "modify_note"}
111
+ if len(workflows) < len(targets):
115
112
  workflows_not_complete.append(product.name)
116
113
 
117
114
  # Do not raise an error but only report it in the `State` to allow exceptions.
@@ -344,7 +344,7 @@ def validate_workflow(description: str) -> Callable[[Callable[[], StepList]], Wo
344
344
  def _validate_workflow(f: Callable[[], StepList]) -> Workflow:
345
345
  steplist = init >> store_process_subscription(Target.SYSTEM) >> unsync_unchecked >> f() >> resync >> done
346
346
 
347
- return make_workflow(f, description, validate_initial_input_form_generator, Target.SYSTEM, steplist)
347
+ return make_workflow(f, description, validate_initial_input_form_generator, Target.VALIDATE, steplist)
348
348
 
349
349
  return _validate_workflow
350
350
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: orchestrator-core
3
- Version: 4.0.0rc1
3
+ Version: 4.0.0rc2
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,11 +1,11 @@
1
- orchestrator/__init__.py,sha256=VeHQewmn2Fz_VeMN_e71lAH_9sS-t7zhdO8h30dYbKo,1066
1
+ orchestrator/__init__.py,sha256=_4qDYGxoCurHceKtJMPSdPiXXCzkD0XpCJiQy6gBP5g,1066
2
2
  orchestrator/app.py,sha256=VN54_Zsx5x_3ym8aFadATg67a4J5lv8H-pxnPlR3RkM,11668
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=iXFxGxab54aav7oHEKLAVkTgrQMJGHy6IYLojEnD7gI,2422
7
7
  orchestrator/settings.py,sha256=21BT1SviPllSL4-M1Qc-8zdgF_Sh7p79WC8sR_AmTmE,3826
8
- orchestrator/targets.py,sha256=ykjTGK7CozFaltNaxQcK90P4Cc1Qvf-W8dFztxtZhRQ,776
8
+ orchestrator/targets.py,sha256=WizBgnp8hWX9YLFUIju7ewSubiwQqinCvyiYNcXHbHI,802
9
9
  orchestrator/types.py,sha256=qzs7xx5AYRmKbpYRyJJP3wuDb0W0bcAzefCN0RWLAco,15459
10
10
  orchestrator/version.py,sha256=b58e08lxs47wUNXv0jXFO_ykpksmytuzEXD4La4W-NQ,1366
11
11
  orchestrator/workflow.py,sha256=T_3Z1PrlF70C16ehAthKRF1hd3jpwV-MREDVxSLfxOw,44063
@@ -33,8 +33,8 @@ orchestrator/cli/database.py,sha256=qig-WqUtiDITz4KePxzcqZtC0FPTWRs_3l19qQpqIGA,
33
33
  orchestrator/cli/generate.py,sha256=SBaYfRijXPF9r3VxarPKTiDzDcB6GBMMQvecQIb_ZLQ,7377
34
34
  orchestrator/cli/main.py,sha256=GC_kxa9OZ-Y0ig_klfWc6ysOQuPVTUmTmDRj3m8cJHA,983
35
35
  orchestrator/cli/migrate_domain_models.py,sha256=OhjNuIheytgShpMYCZ18leNUzk17ExhtkCqx7Ww03R8,20371
36
- orchestrator/cli/migrate_tasks.py,sha256=Fmcwuv8rI1Z_qEiL_kmOWCUq7rNIgnlntUc37phadN8,7249
37
- orchestrator/cli/migrate_workflows.py,sha256=-_nsKUcVa14-Ug3aSppU9yk-oWlK411SX33WqzD1p4M,8979
36
+ orchestrator/cli/migrate_tasks.py,sha256=bju8XColjSZD0v3rS4kl-24dLr8En_H4-6enBmqd494,7255
37
+ orchestrator/cli/migrate_workflows.py,sha256=nxUpx0vgEIc_8aJrjAyrw3E9Dt8JmaamTts8oiQ4vHY,8923
38
38
  orchestrator/cli/migration_helpers.py,sha256=C5tpkP5WEBr7G9S-1k1hgSI8ili6xd9Z5ygc9notaK0,4110
39
39
  orchestrator/cli/scheduler.py,sha256=iCKBWYUwQIYTDqKQ9rMVvs2sNiAzE-J2SkV170TPP2g,1896
40
40
  orchestrator/cli/domain_gen_helpers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -83,7 +83,7 @@ orchestrator/cli/generator/templates/lazy_workflow_instance.j2,sha256=BYB6LwE19O
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
85
  orchestrator/cli/generator/templates/modify_product.j2,sha256=M1WDMmPwfXpUcuZUa-H5GnlKAr1t_xCQliLa66FI-YU,5057
86
- orchestrator/cli/generator/templates/new_product_migration.j2,sha256=d67I9haNkKdzWzNT0f1S6-UhG86fOWEohF0Al7NmXmA,3023
86
+ orchestrator/cli/generator/templates/new_product_migration.j2,sha256=XTeOmv8nVNfGXx6pfSGVwRk282Xx3lnw-7bkpHkd-Tk,3128
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
@@ -106,7 +106,7 @@ orchestrator/db/database.py,sha256=MU_w_e95ho2dVb2JDnt_KFYholx___XDkiQXbc8wCkI,1
106
106
  orchestrator/db/helpers.py,sha256=L8kEdnSSNGnUpZhdeGx2arCodakWN8vSpKdfjoLuHdY,831
107
107
  orchestrator/db/listeners.py,sha256=UBPYcH0FE3a7aZQu_D0O_JMXpXIRYXC0gjSAvlv5GZo,1142
108
108
  orchestrator/db/loaders.py,sha256=ez6JzQ3IKVkC_oLAkVlIIiI8Do7hXbdcPKCvUSLxRog,7962
109
- orchestrator/db/models.py,sha256=0WJOgKGa6h_0leIWtNxim0Kni5pWTbprJrzyiGRchio,27218
109
+ orchestrator/db/models.py,sha256=92lkqI4u3Si2tEMSTnMb5Uv08CSjqkgotgyEYqLvFeI,27302
110
110
  orchestrator/db/filters/__init__.py,sha256=RUj6P0XxEBhYj0SN5wH5-Vf_Wt_ilZR_n9DSar5m9oM,371
111
111
  orchestrator/db/filters/filters.py,sha256=55RtpQwM2rhrk4A6CCSeSXoo-BT9GnQoNTryA8CtLEg,5020
112
112
  orchestrator/db/filters/process.py,sha256=xvGhyfo_MZ1xhLvFC6yULjcT4mJk0fKc1glJIYgsWLE,4018
@@ -205,7 +205,7 @@ orchestrator/graphql/utils/to_graphql_result_page.py,sha256=8ObkJP8reVf-TQOQVPKv
205
205
  orchestrator/migrations/README,sha256=heMzebYwlGhnE8_4CWJ4LS74WoEZjBy-S-mIJRxAEKI,39
206
206
  orchestrator/migrations/alembic.ini,sha256=kMoADqhGeubU8xanILNaqm4oixLy9m4ngYtdGpZcc7I,873
207
207
  orchestrator/migrations/env.py,sha256=M_cPoAL2axuuup5fvMy8I_WTPHEw0RbPEHkhZ3QEGoE,3740
208
- orchestrator/migrations/helpers.py,sha256=7r286N3MFHJhSc-59okj_UO2VoU8L_4QBWfvABMzZAw,43779
208
+ orchestrator/migrations/helpers.py,sha256=xwi1Z-0MMZJ1Bk-HXkb6f_RU7BmO3ajK5a4qqO94elc,44068
209
209
  orchestrator/migrations/script.py.mako,sha256=607Zrgp-Z-m9WGLt4wewN1QDOmHeifxcePUdADkSZyM,510
210
210
  orchestrator/migrations/templates/alembic.ini.j2,sha256=jA-QykVparwWSNt5XDP0Zk7epLOhK7D87Af-i2shJV4,905
211
211
  orchestrator/migrations/templates/env.py.j2,sha256=RfLAQItZ56Jlzwi6LJfBo92m1-th_bdfkFKD1mwTZIE,2821
@@ -231,16 +231,17 @@ orchestrator/migrations/versions/schema/2024-09-27_460ec6748e37_add_uuid_search_
231
231
  orchestrator/migrations/versions/schema/2025-01-08_4c5859620539_add_version_column_to_subscription.py,sha256=xAhe74U0ZiVRo9Z8Uq7491RBbATMMUnYpTBjbG-BYL0,1690
232
232
  orchestrator/migrations/versions/schema/2025-01-19_4fjdn13f83ga_add_validate_product_type_task.py,sha256=O0GfCISIDnyohGf3Ot_2HKedGRbMqLVox6t7Wd3PMvo,894
233
233
  orchestrator/migrations/versions/schema/2025-02-12_bac6be6f2b4f_added_input_state_table.py,sha256=RZpLkWP1yekeZ68feO5v4LZYluKvnnIKRNDCE4tI9HM,1753
234
- orchestrator/migrations/versions/schema/2025-02-20_68d14db1b8da_make_workflow_description_mandatory.py,sha256=qabQWLjPWU-1-uLTFwcEyxyMQK89UPqUdl3Q-HSGKTI,847
234
+ orchestrator/migrations/versions/schema/2025-02-20_68d14db1b8da_make_workflow_description_mandatory.py,sha256=uh5J2bR_UERqlNrDjDBSfiAdEfI9YQzgR9-t9ordFOo,847
235
235
  orchestrator/migrations/versions/schema/2025-03-06_42b3d076a85b_subscription_instance_as_json_function.py,sha256=jtwDFOh-NlE31aH5dFmbynb23TZN6Mkzevxx-KLP7KE,776
236
236
  orchestrator/migrations/versions/schema/2025-03-06_42b3d076a85b_subscription_instance_as_json_function.sql,sha256=hPldk0DAesUbHv3Qd_N7U-cAk-t1wIgxt4FOA120gQ8,1776
237
237
  orchestrator/migrations/versions/schema/2025-04-09_fc5c993a4b4a_add_cascade_constraint_on_processes_.py,sha256=6kHRNSZxUze2jy7b8uRvkt5mzsax10Z-Z3lsACtPLRM,1067
238
+ orchestrator/migrations/versions/schema/2025-05-08_161918133bec_add_is_task_to_workflow.py,sha256=VLFDHFYRWn5ktUba0KuSPWyvjYJdfN1WypWmOPqIW18,721
238
239
  orchestrator/schedules/__init__.py,sha256=JnnaglfK1qYUBKI6Dd9taV-tCZIPlAdAkHtnkJDMXxY,1066
239
240
  orchestrator/schedules/resume_workflows.py,sha256=kSotzTAXjX7p9fpSYiGOpuxuTQfv54eRFAe0YSG0DHc,832
240
241
  orchestrator/schedules/scheduling.py,sha256=ehtwgpbvMOk1jhn-hHgVzg_9wLJkI6l3mRY3DcO9ZVY,1526
241
242
  orchestrator/schedules/task_vacuum.py,sha256=eovnuKimU8SFRw1IF62MsAVFSdgeeV1u57kapUbz8As,821
242
243
  orchestrator/schedules/validate_products.py,sha256=YMr7ASSqdXM6pd6oZu0kr8mfmH8If16MzprrsHdN_ZU,1234
243
- orchestrator/schedules/validate_subscriptions.py,sha256=YYcU2iGf8Ga_s577kgpKdhQV4p7wCEHGYvUf8FCvBvQ,2022
244
+ orchestrator/schedules/validate_subscriptions.py,sha256=9SYvsn4BJ5yo_1nu555hWjl5XffTx7QMaRhH5oOjM9E,2042
244
245
  orchestrator/schemas/__init__.py,sha256=YDyZ0YBvzB4ML9oDBCBPGnBvf680zFFgUzg7X0tYBRY,2326
245
246
  orchestrator/schemas/base.py,sha256=Vc444LetsINLRhG2SxW9Bq01hOzChPOhQWCImQTr-As,930
246
247
  orchestrator/schemas/engine_settings.py,sha256=LF8al7tJssiilb5A4emPtUYo0tVDSaT1Lvo_DN_ttrY,1296
@@ -252,21 +253,21 @@ orchestrator/schemas/product_block.py,sha256=kCqvm6qadHpegMr9aWI_fYX-T7mS-5S-ldP
252
253
  orchestrator/schemas/resource_type.py,sha256=VDju4XywcDDLxdpbWU62RTvR9QF8x_GRrpTlN_NE8uI,1064
253
254
  orchestrator/schemas/subscription.py,sha256=-jXyHZIed9Xlia18ksSDyenblNN6Q2yM2FlGELyJ458,3423
254
255
  orchestrator/schemas/subscription_descriptions.py,sha256=Ft_jw1U0bf9Z0U8O4OWfLlcl0mXCVT_qYVagBP3GbIQ,1262
255
- orchestrator/schemas/workflow.py,sha256=w-CaRPp9AAddhnd8o_0jPaey1Vnnh-s-A5s5kWlR2pI,1977
256
+ orchestrator/schemas/workflow.py,sha256=gBpLXttgU3cSkVyEqr5ji4yBskl-n7QNmEerUr9UXt0,2003
256
257
  orchestrator/services/__init__.py,sha256=GyHNfEFCGKQwRiN6rQmvSRH2iYX7npjMZn97n8XzmLU,571
257
- orchestrator/services/celery.py,sha256=W37UNc4hbUS2SKjVmawsnF5wukmEfIdipsTESv_EOTw,4768
258
+ orchestrator/services/celery.py,sha256=ezw7IxkIZbmaRJt-9_Iwvn86TJV3Y3DTHI7Qjh0-r9s,5075
258
259
  orchestrator/services/fixed_inputs.py,sha256=kyz7s2HLzyDulvcq-ZqefTw1om86COvyvTjz0_5CmgI,876
259
260
  orchestrator/services/input_state.py,sha256=HF7wl9fWdaAW8pdCCqbuYoKyNj8dY0g8Ff8vXis8z5A,2211
260
261
  orchestrator/services/process_broadcast_thread.py,sha256=D44YbjF8mRqGuznkRUV4SoRn1J0lfy_x1H508GnSVlU,4649
261
- orchestrator/services/processes.py,sha256=cIesTJNl-kC2oLvzWOJE2uzmwcqZMWHLlgU-9qcVvac,30555
262
+ orchestrator/services/processes.py,sha256=rTH6zLNsun3qDCPguz2LYS87MQR_LJREIPrgkGS6kwk,30494
262
263
  orchestrator/services/products.py,sha256=BP4KyE8zO-8z7Trrs5T6zKBOw53S9BfBJnHWI3p6u5Y,1943
263
264
  orchestrator/services/resource_types.py,sha256=_QBy_JOW_X3aSTqH0CuLrq4zBJL0p7Q-UDJUcuK2_qc,884
264
265
  orchestrator/services/settings.py,sha256=u-834F4KWloXS8zi7R9mp-D3cjl-rbVjKJRU35IqhXo,2723
265
266
  orchestrator/services/subscription_relations.py,sha256=9C126TUfFvyBe7y4x007kH_dvxJ9pZ1zSnaWeH6HC5k,12261
266
- orchestrator/services/subscriptions.py,sha256=mXU88SzugwQGnLG0-aaa9YZXTr5rt4LAEOChCb7BF20,27116
267
+ orchestrator/services/subscriptions.py,sha256=nr2HI89nC0lYjzTh2j-lEQ5cPQK43LNZv3gvP6jbepw,27189
267
268
  orchestrator/services/tasks.py,sha256=NjPkuauQoh9UJDcjA7OcKFgPk0i6NoKdDO7HlpGbBJ8,6575
268
269
  orchestrator/services/translations.py,sha256=GyP8soUFGej8AS8uulBsk10CCK6Kwfjv9AHMFm3ElQY,1713
269
- orchestrator/services/workflows.py,sha256=oH7klit4kv2NGo-BACWA0ZtajVMSJAxG5m-kM6TXIMI,3742
270
+ orchestrator/services/workflows.py,sha256=iEkt2OBuTwkDru4V6ZSKatnw0b96ZdPV-VQqeZ9EOgU,4015
270
271
  orchestrator/utils/__init__.py,sha256=GyHNfEFCGKQwRiN6rQmvSRH2iYX7npjMZn97n8XzmLU,571
271
272
  orchestrator/utils/crypt.py,sha256=18eNamYWMllPkxyRtWIde3FDr3rSF74R5SAL6WsCj9Y,5584
272
273
  orchestrator/utils/datetime.py,sha256=a1WQ_yvu7MA0TiaRpC5avwbOSFdrj4eMrV4a7I2sD5Q,1477
@@ -294,14 +295,14 @@ orchestrator/workflows/__init__.py,sha256=NzIGGI-8SNAwCk2YqH6sHhEWbgAY457ntDwjO1
294
295
  orchestrator/workflows/modify_note.py,sha256=l6QtijRPv8gnHxzwTz_4nWIPcZ0FcKQh_yFbtjYEDMg,2163
295
296
  orchestrator/workflows/removed_workflow.py,sha256=V0Da5TEdfLdZZKD38ig-MTp3_IuE7VGqzHHzvPYQmLI,909
296
297
  orchestrator/workflows/steps.py,sha256=ulpheoHaCOE1qh71Bja4KW4pItQh1Z6q4QU4tn5GtNk,6067
297
- orchestrator/workflows/utils.py,sha256=ePXTb_0eO25qvKzC6ZO3FdVQU0sWhglJo7hX6nsO4_w,13776
298
+ orchestrator/workflows/utils.py,sha256=yBwfITlseimyLEzbwI0ehOAlr-xI1N3WGVudFz4boXk,13778
298
299
  orchestrator/workflows/tasks/__init__.py,sha256=GyHNfEFCGKQwRiN6rQmvSRH2iYX7npjMZn97n8XzmLU,571
299
300
  orchestrator/workflows/tasks/cleanup_tasks_log.py,sha256=BfWYbPXhnLAHUJ0mlODDnjZnQQAvKCZJDVTwbwOWI04,1624
300
301
  orchestrator/workflows/tasks/resume_workflows.py,sha256=MzJqlSXUvKStkT7NGzxZyRlfAer_ezYm-kjUqaZi0yc,2359
301
- orchestrator/workflows/tasks/validate_product_type.py,sha256=UVX_6Kh8ueQs8ujLawnKVDdNc8UhWp_u69aNA8okR_w,3184
302
- orchestrator/workflows/tasks/validate_products.py,sha256=i6jQME9N8sZZWo4pkNOS1Zgwh3eB2w66DnJi9k93yNk,8521
302
+ orchestrator/workflows/tasks/validate_product_type.py,sha256=paG-NAY1bdde3Adt8zItkcBKf5Pxw6f5ngGW6an6dYU,3192
303
+ orchestrator/workflows/tasks/validate_products.py,sha256=GZJBoFF-WMphS7ghMs2-gqvV2iL1F0POhk0uSNt93n0,8510
303
304
  orchestrator/workflows/translations/en-GB.json,sha256=ST53HxkphFLTMjFHonykDBOZ7-P_KxksktZU3GbxLt0,846
304
- orchestrator_core-4.0.0rc1.dist-info/licenses/LICENSE,sha256=b-aA5OZQuuBATmLKo_mln8CQrDPPhg3ghLzjPjLn4Tg,11409
305
- orchestrator_core-4.0.0rc1.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82
306
- orchestrator_core-4.0.0rc1.dist-info/METADATA,sha256=PnOlFXhp5Z5svvnngGuSFa3pfteaT69k7PoqWbfwHjA,5032
307
- orchestrator_core-4.0.0rc1.dist-info/RECORD,,
305
+ orchestrator_core-4.0.0rc2.dist-info/licenses/LICENSE,sha256=b-aA5OZQuuBATmLKo_mln8CQrDPPhg3ghLzjPjLn4Tg,11409
306
+ orchestrator_core-4.0.0rc2.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82
307
+ orchestrator_core-4.0.0rc2.dist-info/METADATA,sha256=eEc0N4MXX03Q--Jx61bXgZqQ3zwjzjdwLUhVl_5eGFM,5032
308
+ orchestrator_core-4.0.0rc2.dist-info/RECORD,,