orchestrator-core 4.1.0rc1__py3-none-any.whl → 4.2.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.
- orchestrator/__init__.py +1 -1
- orchestrator/api/api_v1/endpoints/processes.py +64 -11
- orchestrator/api/api_v1/endpoints/subscriptions.py +25 -2
- orchestrator/cli/generator/templates/create_product.j2 +1 -2
- orchestrator/db/models.py +6 -3
- orchestrator/graphql/schemas/process.py +21 -2
- orchestrator/graphql/schemas/product.py +8 -9
- orchestrator/graphql/schemas/workflow.py +9 -0
- orchestrator/graphql/types.py +7 -1
- orchestrator/migrations/versions/schema/2025-07-01_93fc5834c7e5_changed_timestamping_fields_in_process_steps.py +65 -0
- orchestrator/migrations/versions/schema/2025-07-04_4b58e336d1bf_deprecating_workflow_target_in_.py +30 -0
- orchestrator/schemas/process.py +5 -1
- orchestrator/services/celery.py +7 -2
- orchestrator/services/processes.py +12 -12
- orchestrator/utils/auth.py +9 -0
- orchestrator/utils/enrich_process.py +4 -2
- orchestrator/workflow.py +52 -9
- orchestrator/workflows/modify_note.py +1 -1
- orchestrator/workflows/steps.py +14 -8
- orchestrator/workflows/utils.py +13 -7
- orchestrator_core-4.2.0rc1.dist-info/METADATA +167 -0
- {orchestrator_core-4.1.0rc1.dist-info → orchestrator_core-4.2.0rc1.dist-info}/RECORD +24 -21
- orchestrator_core-4.1.0rc1.dist-info/METADATA +0 -118
- {orchestrator_core-4.1.0rc1.dist-info → orchestrator_core-4.2.0rc1.dist-info}/WHEEL +0 -0
- {orchestrator_core-4.1.0rc1.dist-info → orchestrator_core-4.2.0rc1.dist-info}/licenses/LICENSE +0 -0
orchestrator/workflow.py
CHANGED
|
@@ -45,6 +45,8 @@ from orchestrator.db import db, transactional
|
|
|
45
45
|
from orchestrator.services.settings import get_engine_settings
|
|
46
46
|
from orchestrator.targets import Target
|
|
47
47
|
from orchestrator.types import ErrorDict, StepFunc
|
|
48
|
+
from orchestrator.utils.auth import Authorizer
|
|
49
|
+
from orchestrator.utils.datetime import nowtz
|
|
48
50
|
from orchestrator.utils.docs import make_workflow_doc
|
|
49
51
|
from orchestrator.utils.errors import error_state_to_dict
|
|
50
52
|
from orchestrator.utils.state import form_inject_args, inject_args
|
|
@@ -80,6 +82,8 @@ class Step(Protocol):
|
|
|
80
82
|
name: str
|
|
81
83
|
form: InputFormGenerator | None
|
|
82
84
|
assignee: Assignee | None
|
|
85
|
+
resume_auth_callback: Authorizer | None = None
|
|
86
|
+
retry_auth_callback: Authorizer | None = None
|
|
83
87
|
|
|
84
88
|
def __call__(self, state: State) -> Process: ...
|
|
85
89
|
|
|
@@ -90,7 +94,8 @@ class Workflow(Protocol):
|
|
|
90
94
|
__qualname__: str
|
|
91
95
|
name: str
|
|
92
96
|
description: str
|
|
93
|
-
authorize_callback:
|
|
97
|
+
authorize_callback: Authorizer
|
|
98
|
+
retry_auth_callback: Authorizer
|
|
94
99
|
initial_input_form: InputFormGenerator | None = None
|
|
95
100
|
target: Target
|
|
96
101
|
steps: StepList
|
|
@@ -99,13 +104,20 @@ class Workflow(Protocol):
|
|
|
99
104
|
|
|
100
105
|
|
|
101
106
|
def make_step_function(
|
|
102
|
-
f: Callable,
|
|
107
|
+
f: Callable,
|
|
108
|
+
name: str,
|
|
109
|
+
form: InputFormGenerator | None = None,
|
|
110
|
+
assignee: Assignee | None = Assignee.SYSTEM,
|
|
111
|
+
resume_auth_callback: Authorizer | None = None,
|
|
112
|
+
retry_auth_callback: Authorizer | None = None,
|
|
103
113
|
) -> Step:
|
|
104
114
|
step_func = cast(Step, f)
|
|
105
115
|
|
|
106
116
|
step_func.name = name
|
|
107
117
|
step_func.form = form
|
|
108
118
|
step_func.assignee = assignee
|
|
119
|
+
step_func.resume_auth_callback = resume_auth_callback
|
|
120
|
+
step_func.retry_auth_callback = retry_auth_callback
|
|
109
121
|
return step_func
|
|
110
122
|
|
|
111
123
|
|
|
@@ -167,6 +179,7 @@ class StepList(list[Step]):
|
|
|
167
179
|
|
|
168
180
|
|
|
169
181
|
def _handle_simple_input_form_generator(f: StateInputStepFunc) -> StateInputFormGenerator:
|
|
182
|
+
"""Processes f into a form generator and injects a pre-hook for user authorization."""
|
|
170
183
|
if inspect.isgeneratorfunction(f):
|
|
171
184
|
return cast(StateInputFormGenerator, f)
|
|
172
185
|
if inspect.isgenerator(f):
|
|
@@ -191,7 +204,8 @@ def make_workflow(
|
|
|
191
204
|
initial_input_form: InputStepFunc | None,
|
|
192
205
|
target: Target,
|
|
193
206
|
steps: StepList,
|
|
194
|
-
authorize_callback:
|
|
207
|
+
authorize_callback: Authorizer | None = None,
|
|
208
|
+
retry_auth_callback: Authorizer | None = None,
|
|
195
209
|
) -> Workflow:
|
|
196
210
|
@functools.wraps(f)
|
|
197
211
|
def wrapping_function() -> NoReturn:
|
|
@@ -202,6 +216,10 @@ def make_workflow(
|
|
|
202
216
|
wrapping_function.name = f.__name__ # default, will be changed by LazyWorkflowInstance
|
|
203
217
|
wrapping_function.description = description
|
|
204
218
|
wrapping_function.authorize_callback = allow if authorize_callback is None else authorize_callback
|
|
219
|
+
# If no retry auth policy is given, defer to policy for process creation.
|
|
220
|
+
wrapping_function.retry_auth_callback = (
|
|
221
|
+
wrapping_function.authorize_callback if retry_auth_callback is None else retry_auth_callback
|
|
222
|
+
)
|
|
205
223
|
|
|
206
224
|
if initial_input_form is None:
|
|
207
225
|
# We always need a form to prevent starting a workflow when no input is needed.
|
|
@@ -270,9 +288,16 @@ def retrystep(name: str) -> Callable[[StepFunc], Step]:
|
|
|
270
288
|
return decorator
|
|
271
289
|
|
|
272
290
|
|
|
273
|
-
def inputstep(
|
|
291
|
+
def inputstep(
|
|
292
|
+
name: str,
|
|
293
|
+
assignee: Assignee,
|
|
294
|
+
resume_auth_callback: Authorizer | None = None,
|
|
295
|
+
retry_auth_callback: Authorizer | None = None,
|
|
296
|
+
) -> Callable[[InputStepFunc], Step]:
|
|
274
297
|
"""Add user input step to workflow.
|
|
275
298
|
|
|
299
|
+
Any authorization callbacks will be attached to the resulting Step.
|
|
300
|
+
|
|
276
301
|
IMPORTANT: In contrast to other workflow steps, the `@inputstep` wrapped function will not run in the
|
|
277
302
|
workflow engine! This means that it must be free of side effects!
|
|
278
303
|
|
|
@@ -299,7 +324,14 @@ def inputstep(name: str, assignee: Assignee) -> Callable[[InputStepFunc], Step]:
|
|
|
299
324
|
def suspend(state: State) -> Process:
|
|
300
325
|
return Suspend(state)
|
|
301
326
|
|
|
302
|
-
return make_step_function(
|
|
327
|
+
return make_step_function(
|
|
328
|
+
suspend,
|
|
329
|
+
name,
|
|
330
|
+
wrapper,
|
|
331
|
+
assignee,
|
|
332
|
+
resume_auth_callback=resume_auth_callback,
|
|
333
|
+
retry_auth_callback=retry_auth_callback,
|
|
334
|
+
)
|
|
303
335
|
|
|
304
336
|
return decorator
|
|
305
337
|
|
|
@@ -350,11 +382,13 @@ def step_group(name: str, steps: StepList, extract_form: bool = True) -> Step:
|
|
|
350
382
|
p = p.map(lambda s: s | {"__replace_last_state": True})
|
|
351
383
|
return step_log_fn(step_, p)
|
|
352
384
|
|
|
385
|
+
step_group_start_time = nowtz().timestamp()
|
|
353
386
|
process: Process = Success(initial_state)
|
|
354
387
|
process = _exec_steps(step_list, process, dblogstep)
|
|
355
|
-
|
|
356
388
|
# Add instruction to replace state of last sub step before returning process _exec_steps higher in the call tree
|
|
357
|
-
return process.map(
|
|
389
|
+
return process.map(
|
|
390
|
+
lambda s: s | {"__replace_last_state": True, "__last_step_started_at": step_group_start_time}
|
|
391
|
+
)
|
|
358
392
|
|
|
359
393
|
# Make sure we return a form is a sub step has a form
|
|
360
394
|
form = next((sub_step.form for sub_step in steps if sub_step.form), None) if extract_form else None
|
|
@@ -479,7 +513,8 @@ def workflow(
|
|
|
479
513
|
description: str,
|
|
480
514
|
initial_input_form: InputStepFunc | None = None,
|
|
481
515
|
target: Target = Target.SYSTEM,
|
|
482
|
-
authorize_callback:
|
|
516
|
+
authorize_callback: Authorizer | None = None,
|
|
517
|
+
retry_auth_callback: Authorizer | None = None,
|
|
483
518
|
) -> Callable[[Callable[[], StepList]], Workflow]:
|
|
484
519
|
"""Transform an initial_input_form and a step list into a workflow.
|
|
485
520
|
|
|
@@ -500,7 +535,13 @@ def workflow(
|
|
|
500
535
|
|
|
501
536
|
def _workflow(f: Callable[[], StepList]) -> Workflow:
|
|
502
537
|
return make_workflow(
|
|
503
|
-
f,
|
|
538
|
+
f,
|
|
539
|
+
description,
|
|
540
|
+
initial_input_form_in_form_inject_args,
|
|
541
|
+
target,
|
|
542
|
+
f(),
|
|
543
|
+
authorize_callback=authorize_callback,
|
|
544
|
+
retry_auth_callback=retry_auth_callback,
|
|
504
545
|
)
|
|
505
546
|
|
|
506
547
|
return _workflow
|
|
@@ -1416,6 +1457,8 @@ def _exec_steps(steps: StepList, starting_process: Process, dblogstep: StepLogFu
|
|
|
1416
1457
|
"Not executing Step as the workflow engine is Paused. Process will remain in state 'running'"
|
|
1417
1458
|
)
|
|
1418
1459
|
return process
|
|
1460
|
+
|
|
1461
|
+
process = process.map(lambda s: s | {"__last_step_started_at": nowtz().timestamp()})
|
|
1419
1462
|
step_result_process = process.execute_step(step)
|
|
1420
1463
|
except Exception as e:
|
|
1421
1464
|
consolelogger.error("An exception occurred while executing the workflow step.")
|
|
@@ -53,4 +53,4 @@ def store_subscription_note(subscription_id: UUIDstr, note: str) -> State:
|
|
|
53
53
|
|
|
54
54
|
@workflow("Modify Note", initial_input_form=wrap_modify_initial_input_form(initial_input_form), target=Target.MODIFY)
|
|
55
55
|
def modify_note() -> StepList:
|
|
56
|
-
return init >> store_process_subscription(
|
|
56
|
+
return init >> store_process_subscription() >> store_subscription_note >> done
|
orchestrator/workflows/steps.py
CHANGED
|
@@ -23,6 +23,7 @@ from orchestrator.services.subscriptions import get_subscription
|
|
|
23
23
|
from orchestrator.targets import Target
|
|
24
24
|
from orchestrator.types import SubscriptionLifecycle
|
|
25
25
|
from orchestrator.utils.json import to_serializable
|
|
26
|
+
from orchestrator.websocket import sync_invalidate_subscription_cache
|
|
26
27
|
from orchestrator.workflow import Step, step
|
|
27
28
|
from pydantic_forms.types import State, UUIDstr
|
|
28
29
|
|
|
@@ -33,6 +34,7 @@ logger = structlog.get_logger(__name__)
|
|
|
33
34
|
def resync(subscription: SubscriptionModel) -> State:
|
|
34
35
|
"""Transition a subscription to in sync."""
|
|
35
36
|
subscription.insync = True
|
|
37
|
+
sync_invalidate_subscription_cache(subscription.subscription_id)
|
|
36
38
|
return {"subscription": subscription}
|
|
37
39
|
|
|
38
40
|
|
|
@@ -93,6 +95,7 @@ def unsync(subscription_id: UUIDstr, __old_subscriptions__: dict | None = None)
|
|
|
93
95
|
if not subscription.insync:
|
|
94
96
|
raise ValueError("Subscription is already out of sync, cannot continue!")
|
|
95
97
|
subscription.insync = False
|
|
98
|
+
sync_invalidate_subscription_cache(subscription.subscription_id)
|
|
96
99
|
|
|
97
100
|
return {"subscription": subscription, "__old_subscriptions__": subscription_backup}
|
|
98
101
|
|
|
@@ -105,20 +108,23 @@ def unsync_unchecked(subscription_id: UUIDstr) -> State:
|
|
|
105
108
|
return {"subscription": subscription}
|
|
106
109
|
|
|
107
110
|
|
|
108
|
-
def store_process_subscription_relationship(
|
|
109
|
-
process_id
|
|
110
|
-
) -> ProcessSubscriptionTable:
|
|
111
|
-
process_subscription = ProcessSubscriptionTable(
|
|
112
|
-
process_id=process_id, subscription_id=subscription_id, workflow_target=workflow_target
|
|
113
|
-
)
|
|
111
|
+
def store_process_subscription_relationship(process_id: UUIDstr, subscription_id: UUIDstr) -> ProcessSubscriptionTable:
|
|
112
|
+
process_subscription = ProcessSubscriptionTable(process_id=process_id, subscription_id=subscription_id)
|
|
114
113
|
db.session.add(process_subscription)
|
|
115
114
|
return process_subscription
|
|
116
115
|
|
|
117
116
|
|
|
118
|
-
def store_process_subscription(workflow_target: Target) -> Step:
|
|
117
|
+
def store_process_subscription(workflow_target: Target | None = None) -> Step:
|
|
118
|
+
if workflow_target:
|
|
119
|
+
deprecation_warning = (
|
|
120
|
+
"Providing a workflow target to function store_process_subscription() is deprecated. "
|
|
121
|
+
"This information is already stored in the workflow table."
|
|
122
|
+
)
|
|
123
|
+
logger.warning(deprecation_warning)
|
|
124
|
+
|
|
119
125
|
@step("Create Process Subscription relation")
|
|
120
126
|
def _store_process_subscription(process_id: UUIDstr, subscription_id: UUIDstr) -> None:
|
|
121
|
-
store_process_subscription_relationship(process_id, subscription_id
|
|
127
|
+
store_process_subscription_relationship(process_id, subscription_id)
|
|
122
128
|
|
|
123
129
|
return _store_process_subscription
|
|
124
130
|
|
orchestrator/workflows/utils.py
CHANGED
|
@@ -20,12 +20,12 @@ from more_itertools import first_true
|
|
|
20
20
|
from pydantic import field_validator, model_validator
|
|
21
21
|
from sqlalchemy import select
|
|
22
22
|
|
|
23
|
-
from oauth2_lib.fastapi import OIDCUserModel
|
|
24
23
|
from orchestrator.db import ProductTable, SubscriptionTable, db
|
|
25
24
|
from orchestrator.forms.validators import ProductId
|
|
26
25
|
from orchestrator.services import subscriptions
|
|
27
26
|
from orchestrator.targets import Target
|
|
28
27
|
from orchestrator.types import SubscriptionLifecycle
|
|
28
|
+
from orchestrator.utils.auth import Authorizer
|
|
29
29
|
from orchestrator.utils.errors import StaleDataError
|
|
30
30
|
from orchestrator.utils.state import form_inject_args
|
|
31
31
|
from orchestrator.utils.validate_data_version import validate_data_version
|
|
@@ -201,7 +201,8 @@ def create_workflow(
|
|
|
201
201
|
initial_input_form: InputStepFunc | None = None,
|
|
202
202
|
status: SubscriptionLifecycle = SubscriptionLifecycle.ACTIVE,
|
|
203
203
|
additional_steps: StepList | None = None,
|
|
204
|
-
authorize_callback:
|
|
204
|
+
authorize_callback: Authorizer | None = None,
|
|
205
|
+
retry_auth_callback: Authorizer | None = None,
|
|
205
206
|
) -> Callable[[Callable[[], StepList]], Workflow]:
|
|
206
207
|
"""Transform an initial_input_form and a step list into a workflow with a target=Target.CREATE.
|
|
207
208
|
|
|
@@ -234,6 +235,7 @@ def create_workflow(
|
|
|
234
235
|
Target.CREATE,
|
|
235
236
|
steplist,
|
|
236
237
|
authorize_callback=authorize_callback,
|
|
238
|
+
retry_auth_callback=retry_auth_callback,
|
|
237
239
|
)
|
|
238
240
|
|
|
239
241
|
return _create_workflow
|
|
@@ -243,7 +245,8 @@ def modify_workflow(
|
|
|
243
245
|
description: str,
|
|
244
246
|
initial_input_form: InputStepFunc | None = None,
|
|
245
247
|
additional_steps: StepList | None = None,
|
|
246
|
-
authorize_callback:
|
|
248
|
+
authorize_callback: Authorizer | None = None,
|
|
249
|
+
retry_auth_callback: Authorizer | None = None,
|
|
247
250
|
) -> Callable[[Callable[[], StepList]], Workflow]:
|
|
248
251
|
"""Transform an initial_input_form and a step list into a workflow.
|
|
249
252
|
|
|
@@ -262,7 +265,7 @@ def modify_workflow(
|
|
|
262
265
|
def _modify_workflow(f: Callable[[], StepList]) -> Workflow:
|
|
263
266
|
steplist = (
|
|
264
267
|
init
|
|
265
|
-
>> store_process_subscription(
|
|
268
|
+
>> store_process_subscription()
|
|
266
269
|
>> unsync
|
|
267
270
|
>> f()
|
|
268
271
|
>> (additional_steps or StepList())
|
|
@@ -278,6 +281,7 @@ def modify_workflow(
|
|
|
278
281
|
Target.MODIFY,
|
|
279
282
|
steplist,
|
|
280
283
|
authorize_callback=authorize_callback,
|
|
284
|
+
retry_auth_callback=retry_auth_callback,
|
|
281
285
|
)
|
|
282
286
|
|
|
283
287
|
return _modify_workflow
|
|
@@ -287,7 +291,8 @@ def terminate_workflow(
|
|
|
287
291
|
description: str,
|
|
288
292
|
initial_input_form: InputStepFunc | None = None,
|
|
289
293
|
additional_steps: StepList | None = None,
|
|
290
|
-
authorize_callback:
|
|
294
|
+
authorize_callback: Authorizer | None = None,
|
|
295
|
+
retry_auth_callback: Authorizer | None = None,
|
|
291
296
|
) -> Callable[[Callable[[], StepList]], Workflow]:
|
|
292
297
|
"""Transform an initial_input_form and a step list into a workflow.
|
|
293
298
|
|
|
@@ -306,7 +311,7 @@ def terminate_workflow(
|
|
|
306
311
|
def _terminate_workflow(f: Callable[[], StepList]) -> Workflow:
|
|
307
312
|
steplist = (
|
|
308
313
|
init
|
|
309
|
-
>> store_process_subscription(
|
|
314
|
+
>> store_process_subscription()
|
|
310
315
|
>> unsync
|
|
311
316
|
>> f()
|
|
312
317
|
>> (additional_steps or StepList())
|
|
@@ -323,6 +328,7 @@ def terminate_workflow(
|
|
|
323
328
|
Target.TERMINATE,
|
|
324
329
|
steplist,
|
|
325
330
|
authorize_callback=authorize_callback,
|
|
331
|
+
retry_auth_callback=retry_auth_callback,
|
|
326
332
|
)
|
|
327
333
|
|
|
328
334
|
return _terminate_workflow
|
|
@@ -342,7 +348,7 @@ def validate_workflow(description: str) -> Callable[[Callable[[], StepList]], Wo
|
|
|
342
348
|
"""
|
|
343
349
|
|
|
344
350
|
def _validate_workflow(f: Callable[[], StepList]) -> Workflow:
|
|
345
|
-
steplist = init >> store_process_subscription(
|
|
351
|
+
steplist = init >> store_process_subscription() >> unsync_unchecked >> f() >> resync >> done
|
|
346
352
|
|
|
347
353
|
return make_workflow(f, description, validate_initial_input_form_generator, Target.VALIDATE, steplist)
|
|
348
354
|
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: orchestrator-core
|
|
3
|
+
Version: 4.2.0rc1
|
|
4
|
+
Summary: This is the orchestrator workflow engine.
|
|
5
|
+
Author-email: SURF <automation-beheer@surf.nl>
|
|
6
|
+
Requires-Python: >=3.11,<3.14
|
|
7
|
+
Description-Content-Type: text/markdown
|
|
8
|
+
License-Expression: Apache-2.0
|
|
9
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
10
|
+
Classifier: Environment :: Web Environment
|
|
11
|
+
Classifier: Framework :: AsyncIO
|
|
12
|
+
Classifier: Framework :: FastAPI
|
|
13
|
+
Classifier: Intended Audience :: Developers
|
|
14
|
+
Classifier: Intended Audience :: Information Technology
|
|
15
|
+
Classifier: Intended Audience :: System Administrators
|
|
16
|
+
Classifier: Intended Audience :: Telecommunications Industry
|
|
17
|
+
Classifier: Operating System :: OS Independent
|
|
18
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
19
|
+
Classifier: Programming Language :: Python :: 3
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
22
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
23
|
+
Classifier: Programming Language :: Python
|
|
24
|
+
Classifier: Topic :: Internet :: WWW/HTTP :: HTTP Servers
|
|
25
|
+
Classifier: Topic :: Internet :: WWW/HTTP
|
|
26
|
+
Classifier: Topic :: Internet
|
|
27
|
+
Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
|
|
28
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
29
|
+
Classifier: Topic :: Software Development :: Libraries
|
|
30
|
+
Classifier: Topic :: Software Development
|
|
31
|
+
Classifier: Typing :: Typed
|
|
32
|
+
License-File: LICENSE
|
|
33
|
+
Requires-Dist: alembic==1.16.1
|
|
34
|
+
Requires-Dist: anyio>=3.7.0
|
|
35
|
+
Requires-Dist: click==8.*
|
|
36
|
+
Requires-Dist: deepmerge==2.0
|
|
37
|
+
Requires-Dist: deprecated>=1.2.18
|
|
38
|
+
Requires-Dist: fastapi~=0.115.2
|
|
39
|
+
Requires-Dist: fastapi-etag==0.4.0
|
|
40
|
+
Requires-Dist: itsdangerous>=2.2.0
|
|
41
|
+
Requires-Dist: jinja2==3.1.6
|
|
42
|
+
Requires-Dist: more-itertools~=10.7.0
|
|
43
|
+
Requires-Dist: nwa-stdlib~=1.9.0
|
|
44
|
+
Requires-Dist: oauth2-lib~=2.4.0
|
|
45
|
+
Requires-Dist: orjson==3.10.18
|
|
46
|
+
Requires-Dist: prometheus-client==0.22.1
|
|
47
|
+
Requires-Dist: psycopg2-binary==2.9.10
|
|
48
|
+
Requires-Dist: pydantic-forms>=1.4.0,<=2.1.0
|
|
49
|
+
Requires-Dist: pydantic-settings~=2.9.1
|
|
50
|
+
Requires-Dist: pydantic[email]~=2.8.2
|
|
51
|
+
Requires-Dist: python-dateutil==2.8.2
|
|
52
|
+
Requires-Dist: python-rapidjson>=1.18,<1.21
|
|
53
|
+
Requires-Dist: pytz==2025.2
|
|
54
|
+
Requires-Dist: redis==5.1.1
|
|
55
|
+
Requires-Dist: schedule==1.1.0
|
|
56
|
+
Requires-Dist: semver==3.0.4
|
|
57
|
+
Requires-Dist: sentry-sdk[fastapi]~=2.29.1
|
|
58
|
+
Requires-Dist: sqlalchemy==2.0.41
|
|
59
|
+
Requires-Dist: sqlalchemy-utils==0.41.2
|
|
60
|
+
Requires-Dist: strawberry-graphql>=0.246.2
|
|
61
|
+
Requires-Dist: structlog>=25.4.0
|
|
62
|
+
Requires-Dist: tabulate==0.9.0
|
|
63
|
+
Requires-Dist: typer==0.15.4
|
|
64
|
+
Requires-Dist: uvicorn[standard]~=0.34.0
|
|
65
|
+
Requires-Dist: celery~=5.5.1 ; extra == "celery"
|
|
66
|
+
Project-URL: Documentation, https://workfloworchestrator.org/orchestrator-core
|
|
67
|
+
Project-URL: Homepage, https://workfloworchestrator.org/orchestrator-core
|
|
68
|
+
Project-URL: Source, https://github.com/workfloworchestrator/orchestrator-core
|
|
69
|
+
Provides-Extra: celery
|
|
70
|
+
|
|
71
|
+
# Orchestrator-Core
|
|
72
|
+
|
|
73
|
+
[](https://pepy.tech/project/orchestrator-core)
|
|
74
|
+
[](https://codecov.io/gh/workfloworchestrator/orchestrator-core)
|
|
75
|
+
[](https://pypi.org/project/orchestrator-core)
|
|
76
|
+
[](https://pypi.org/project/orchestrator-core)
|
|
77
|
+

|
|
78
|
+
|
|
79
|
+
<p style="text-align: center"><em>Production ready Orchestration Framework to manage product lifecycle and workflows. Easy to use, built on top of FastAPI and Pydantic</em></p>
|
|
80
|
+
|
|
81
|
+
## Documentation
|
|
82
|
+
|
|
83
|
+
The documentation can be found at [workfloworchestrator.org](https://workfloworchestrator.org/orchestrator-core/).
|
|
84
|
+
|
|
85
|
+
## Installation (quick start)
|
|
86
|
+
|
|
87
|
+
Simplified steps to install and use the orchestrator-core.
|
|
88
|
+
For more details, read the [Getting started](https://workfloworchestrator.org/orchestrator-core/getting-started/base/) documentation.
|
|
89
|
+
|
|
90
|
+
### Step 1 - Install the package
|
|
91
|
+
|
|
92
|
+
Create a virtualenv and install the orchestrator-core.
|
|
93
|
+
|
|
94
|
+
```shell
|
|
95
|
+
python -m venv .venv
|
|
96
|
+
source .venv/bin/activate
|
|
97
|
+
pip install orchestrator-core
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
### Step 2 - Setup the database
|
|
101
|
+
|
|
102
|
+
Create a postgres database:
|
|
103
|
+
|
|
104
|
+
```shell
|
|
105
|
+
createuser -sP nwa
|
|
106
|
+
createdb orchestrator-core -O nwa # set password to 'nwa'
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
Configure the database URI in your local environment:
|
|
110
|
+
|
|
111
|
+
```
|
|
112
|
+
export DATABASE_URI=postgresql://nwa:nwa@localhost:5432/orchestrator-core
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### Step 3 - Create main.py
|
|
116
|
+
|
|
117
|
+
Create a `main.py` file.
|
|
118
|
+
|
|
119
|
+
```python
|
|
120
|
+
from orchestrator import OrchestratorCore
|
|
121
|
+
from orchestrator.cli.main import app as core_cli
|
|
122
|
+
from orchestrator.settings import AppSettings
|
|
123
|
+
|
|
124
|
+
app = OrchestratorCore(base_settings=AppSettings())
|
|
125
|
+
|
|
126
|
+
if __name__ == "__main__":
|
|
127
|
+
core_cli()
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
### Step 4 - Run the database migrations
|
|
131
|
+
|
|
132
|
+
Initialize the migration environment and database tables.
|
|
133
|
+
|
|
134
|
+
```shell
|
|
135
|
+
python main.py db init
|
|
136
|
+
python main.py db upgrade heads
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
### Step 5 - Run the app
|
|
140
|
+
|
|
141
|
+
```shell
|
|
142
|
+
export OAUTH2_ACTIVE=False
|
|
143
|
+
uvicorn --reload --host 127.0.0.1 --port 8080 main:app
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
Visit the [ReDoc](http://127.0.0.1:8080/api/redoc) or [OpenAPI](http://127.0.0.1:8080/api/docs) page to view and interact with the API.
|
|
147
|
+
|
|
148
|
+
## Contributing
|
|
149
|
+
|
|
150
|
+
We use [uv](https://docs.astral.sh/uv/getting-started/installation/) to manage dependencies.
|
|
151
|
+
|
|
152
|
+
To get started, follow these steps:
|
|
153
|
+
|
|
154
|
+
```shell
|
|
155
|
+
# in your postgres database
|
|
156
|
+
createdb orchestrator-core-test -O nwa # set password to 'nwa'
|
|
157
|
+
|
|
158
|
+
# on your local machine
|
|
159
|
+
git clone https://github.com/workfloworchestrator/orchestrator-core
|
|
160
|
+
cd orchestrator-core
|
|
161
|
+
export DATABASE_URI=postgresql://nwa:nwa@localhost:5432/orchestrator-core-test
|
|
162
|
+
uv sync --all-extras --all-groups
|
|
163
|
+
uv run pytest
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
For more details please read the [development docs](https://workfloworchestrator.org/orchestrator-core/contributing/development/).
|
|
167
|
+
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
orchestrator/__init__.py,sha256=
|
|
1
|
+
orchestrator/__init__.py,sha256=KuNtfAwhqS1RMy4hovcLLlT1kTH_aNMFLNu1SnkB0Qo,1066
|
|
2
2
|
orchestrator/app.py,sha256=7UrXKjBKNSEaSSXAd5ww_RdMFhFqE4yvfj8faS2MzAA,12089
|
|
3
3
|
orchestrator/exception_handlers.py,sha256=UsW3dw8q0QQlNLcV359bIotah8DYjMsj2Ts1LfX4ClY,1268
|
|
4
4
|
orchestrator/log_config.py,sha256=1tPRX5q65e57a6a_zEii_PFK8SzWT0mnA5w2sKg4hh8,1853
|
|
@@ -8,7 +8,7 @@ orchestrator/settings.py,sha256=TFIv09JIKY-lXqd04lH_XEcijEEyheaz3zTcgeG8DEI,4339
|
|
|
8
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
|
-
orchestrator/workflow.py,sha256=
|
|
11
|
+
orchestrator/workflow.py,sha256=PVHe6vnnkswzqw2UoY-j6NMSEhL6rLHXRnO7yLOyDC8,45551
|
|
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,13 +17,13 @@ orchestrator/api/api_v1/__init__.py,sha256=GyHNfEFCGKQwRiN6rQmvSRH2iYX7npjMZn97n
|
|
|
17
17
|
orchestrator/api/api_v1/api.py,sha256=m4iDktsSpzxUDaudkdgXeZ83a6B4wfc3pczQsa-Pb-8,2866
|
|
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=
|
|
20
|
+
orchestrator/api/api_v1/endpoints/processes.py,sha256=3ggFkLLTqX7zwJmEmr77RbN2n-iIuNNCIpsPMeMIYFA,16149
|
|
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
|
|
24
24
|
orchestrator/api/api_v1/endpoints/settings.py,sha256=5s-k169podZjgGHUbVDmSQwpY_3Cs_Bbf2PPtZIkBcw,6184
|
|
25
25
|
orchestrator/api/api_v1/endpoints/subscription_customer_descriptions.py,sha256=1_6LtgQleoq3M6z_W-Qz__Bj3OFUweoPrUqHMwSH6AM,3288
|
|
26
|
-
orchestrator/api/api_v1/endpoints/subscriptions.py,sha256=
|
|
26
|
+
orchestrator/api/api_v1/endpoints/subscriptions.py,sha256=zn_LeVfmp2uw7CszK4BvQ5n37hZccy3K2htkoDgF1sI,9809
|
|
27
27
|
orchestrator/api/api_v1/endpoints/translations.py,sha256=dIWh_fCnZZUxJoGiNeJ49DK_xpf75IpR_0EIMSvzIvY,963
|
|
28
28
|
orchestrator/api/api_v1/endpoints/user.py,sha256=RyI32EXVu6I-IxWjz0XB5zQWzzLL60zKXLgLqLH02xU,1827
|
|
29
29
|
orchestrator/api/api_v1/endpoints/workflows.py,sha256=_0vhGiQeu3-z16Zi0WmuDWBs8gmed6BzRNwYH_sF6AY,1977
|
|
@@ -77,7 +77,7 @@ 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=
|
|
80
|
+
orchestrator/cli/generator/templates/create_product.j2,sha256=P5XUD-s8ouAfoT14xv7f5VrgpWytvClrWVnBV6Bm1YI,4785
|
|
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
|
|
@@ -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=
|
|
109
|
+
orchestrator/db/models.py,sha256=9XOppPkXlbILM3M87wgaItsE8BKLNdnyyfeiSfYuYQ8,27502
|
|
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
|
|
@@ -159,7 +159,7 @@ orchestrator/graphql/__init__.py,sha256=avq8Yg3Jr_9pJqh7ClyIAOX7YSg1eM_AWmt5C3FR
|
|
|
159
159
|
orchestrator/graphql/autoregistration.py,sha256=pF2jbMKG26MvYoMSa6ZpqpHjVks7_NvSRFymHTgmfjs,6342
|
|
160
160
|
orchestrator/graphql/pagination.py,sha256=iqVDn3GPZpiQhEydfwkBJLURY-X8wwUphS8Lkeg0BOc,2413
|
|
161
161
|
orchestrator/graphql/schema.py,sha256=gwZ3nAgKL0zlpc-aK58hSUAGPVD11Tb3aRSSK9hC39I,9204
|
|
162
|
-
orchestrator/graphql/types.py,sha256=
|
|
162
|
+
orchestrator/graphql/types.py,sha256=CpWrDqVTQwxYkJQqidPzHEAURGirJ-6i-dlBcBwBaTI,5196
|
|
163
163
|
orchestrator/graphql/extensions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
164
164
|
orchestrator/graphql/extensions/model_cache.py,sha256=1uhMRjBs9eK7zJ1Y6P6BopX06822w2Yh9jliwYvG6yQ,1085
|
|
165
165
|
orchestrator/graphql/extensions/stats.py,sha256=pGhEBQg45XvqZhRobcrCSGwt5AGmR3gflsm1dYiIg5g,2018
|
|
@@ -184,15 +184,15 @@ orchestrator/graphql/schemas/customer_description.py,sha256=fize71IMpkvk_rTzcqCY
|
|
|
184
184
|
orchestrator/graphql/schemas/errors.py,sha256=VRl-Zd1FHMnscyozhfxzqeEUZ0ERAWum_Y8YwjGxwmA,203
|
|
185
185
|
orchestrator/graphql/schemas/fixed_input.py,sha256=1yqYHADQRgHz8OIP7ObYsPFS-gmzfkCvEO0a-KKf7zI,513
|
|
186
186
|
orchestrator/graphql/schemas/helpers.py,sha256=Kpj4kIbmoKKN35bdgUSwQvGUIbeg7VJAVMEq65YS_ik,346
|
|
187
|
-
orchestrator/graphql/schemas/process.py,sha256=
|
|
188
|
-
orchestrator/graphql/schemas/product.py,sha256=
|
|
187
|
+
orchestrator/graphql/schemas/process.py,sha256=nvD6Rvr0hnrMINdXF_rQuLF8szKJ7E-SywCFMuZsnlg,4940
|
|
188
|
+
orchestrator/graphql/schemas/product.py,sha256=vUCqcjrKBJj-VKSrMYPKzjmmxLMXL7alKTJ8UdUkhTg,4342
|
|
189
189
|
orchestrator/graphql/schemas/product_block.py,sha256=Qk9cbA6vm7ZPrhdgPHatKRuy6TytBmxSr97McEOxAu8,2860
|
|
190
190
|
orchestrator/graphql/schemas/resource_type.py,sha256=s5d_FwQXL2-Sc-IDUxTJun5qFQ4zOP4-XcHF9ql-t1g,898
|
|
191
191
|
orchestrator/graphql/schemas/settings.py,sha256=drhm5VcLmUbiYAk6WUSJcyJqjNM96E6GvpxVdPAobnA,999
|
|
192
192
|
orchestrator/graphql/schemas/strawberry_pydantic_patch.py,sha256=CjNUhTKdYmLiaem-WY_mzw4HASIeaZitxGF8pPocqVw,1602
|
|
193
193
|
orchestrator/graphql/schemas/subscription.py,sha256=RnnxPgha_7D4Ii87cp3eyBV93_RZIryzWyVHZwyn3eA,9603
|
|
194
194
|
orchestrator/graphql/schemas/version.py,sha256=HSzVg_y4Sjd5_H5rRUtu3FJKOG_8ifhvBNt_qjOtC-E,92
|
|
195
|
-
orchestrator/graphql/schemas/workflow.py,sha256=
|
|
195
|
+
orchestrator/graphql/schemas/workflow.py,sha256=WLbegRNxOfvXg4kPYrO5KPBwtHmUofAr2pvZT2JsW1c,1761
|
|
196
196
|
orchestrator/graphql/utils/__init__.py,sha256=1JvenzEVW1CBa1sGVI9I8IWnnoXIkb1hneDqph9EEZY,524
|
|
197
197
|
orchestrator/graphql/utils/create_resolver_error_handler.py,sha256=PpQMVwGrE9t0nZ12TwoxPxksXxEwQM7lSNPeh7qW3vk,1233
|
|
198
198
|
orchestrator/graphql/utils/get_query_loaders.py,sha256=abS_HJ7K9een78gMiGq3IhwGwxQXHvZygExe0h_t9ns,815
|
|
@@ -241,6 +241,8 @@ orchestrator/migrations/versions/schema/2025-03-06_42b3d076a85b_subscription_ins
|
|
|
241
241
|
orchestrator/migrations/versions/schema/2025-03-06_42b3d076a85b_subscription_instance_as_json_function.sql,sha256=hPldk0DAesUbHv3Qd_N7U-cAk-t1wIgxt4FOA120gQ8,1776
|
|
242
242
|
orchestrator/migrations/versions/schema/2025-04-09_fc5c993a4b4a_add_cascade_constraint_on_processes_.py,sha256=6kHRNSZxUze2jy7b8uRvkt5mzsax10Z-Z3lsACtPLRM,1067
|
|
243
243
|
orchestrator/migrations/versions/schema/2025-05-08_161918133bec_add_is_task_to_workflow.py,sha256=VLFDHFYRWn5ktUba0KuSPWyvjYJdfN1WypWmOPqIW18,721
|
|
244
|
+
orchestrator/migrations/versions/schema/2025-07-01_93fc5834c7e5_changed_timestamping_fields_in_process_steps.py,sha256=Oezd8b2qaI1Kyq-sZFVFmdzd4d9NjXrf6HtJGk11fy0,1914
|
|
245
|
+
orchestrator/migrations/versions/schema/2025-07-04_4b58e336d1bf_deprecating_workflow_target_in_.py,sha256=xnD6w-97R4ClS7rbmXQEXc36K3fdcXKhCy7ZZNy_FX4,742
|
|
244
246
|
orchestrator/schedules/__init__.py,sha256=JnnaglfK1qYUBKI6Dd9taV-tCZIPlAdAkHtnkJDMXxY,1066
|
|
245
247
|
orchestrator/schedules/resume_workflows.py,sha256=kSotzTAXjX7p9fpSYiGOpuxuTQfv54eRFAe0YSG0DHc,832
|
|
246
248
|
orchestrator/schedules/scheduling.py,sha256=ehtwgpbvMOk1jhn-hHgVzg_9wLJkI6l3mRY3DcO9ZVY,1526
|
|
@@ -252,7 +254,7 @@ orchestrator/schemas/base.py,sha256=Vc444LetsINLRhG2SxW9Bq01hOzChPOhQWCImQTr-As,
|
|
|
252
254
|
orchestrator/schemas/engine_settings.py,sha256=LF8al7tJssiilb5A4emPtUYo0tVDSaT1Lvo_DN_ttrY,1296
|
|
253
255
|
orchestrator/schemas/fixed_input.py,sha256=Rth3hT5K7zYuQr1bUY_NJRzb03xEZuT1p6EvYXVNE54,1214
|
|
254
256
|
orchestrator/schemas/problem_detail.py,sha256=DxiUhWv6EVXLZgdKFv0EYVnCgtkDj7xteDCR0q2f5yw,802
|
|
255
|
-
orchestrator/schemas/process.py,sha256=
|
|
257
|
+
orchestrator/schemas/process.py,sha256=UACBNt-4g4v9Y528u-gZ-Wk7YxwJHhnI4cEu5CtQm2w,2541
|
|
256
258
|
orchestrator/schemas/product.py,sha256=MhMCh058ZuS2RJq-wSmxIPUNlhQexxXIx3DSz2OmOh4,1570
|
|
257
259
|
orchestrator/schemas/product_block.py,sha256=kCqvm6qadHpegMr9aWI_fYX-T7mS-5S-ldPxnGQZg7M,1519
|
|
258
260
|
orchestrator/schemas/resource_type.py,sha256=VDju4XywcDDLxdpbWU62RTvR9QF8x_GRrpTlN_NE8uI,1064
|
|
@@ -260,11 +262,11 @@ orchestrator/schemas/subscription.py,sha256=-jXyHZIed9Xlia18ksSDyenblNN6Q2yM2FlG
|
|
|
260
262
|
orchestrator/schemas/subscription_descriptions.py,sha256=Ft_jw1U0bf9Z0U8O4OWfLlcl0mXCVT_qYVagBP3GbIQ,1262
|
|
261
263
|
orchestrator/schemas/workflow.py,sha256=VqQ9XfV4fVd6MjY0LRRQzWBJHmlPsAamWfTwDx1cZkg,2102
|
|
262
264
|
orchestrator/services/__init__.py,sha256=GyHNfEFCGKQwRiN6rQmvSRH2iYX7npjMZn97n8XzmLU,571
|
|
263
|
-
orchestrator/services/celery.py,sha256=
|
|
265
|
+
orchestrator/services/celery.py,sha256=PsIgRBJsmA3vKwAUaqPq9ynLwDsXHY2ggDWc-nQAwgM,5232
|
|
264
266
|
orchestrator/services/fixed_inputs.py,sha256=kyz7s2HLzyDulvcq-ZqefTw1om86COvyvTjz0_5CmgI,876
|
|
265
267
|
orchestrator/services/input_state.py,sha256=HF7wl9fWdaAW8pdCCqbuYoKyNj8dY0g8Ff8vXis8z5A,2211
|
|
266
268
|
orchestrator/services/process_broadcast_thread.py,sha256=D44YbjF8mRqGuznkRUV4SoRn1J0lfy_x1H508GnSVlU,4649
|
|
267
|
-
orchestrator/services/processes.py,sha256=
|
|
269
|
+
orchestrator/services/processes.py,sha256=W-MCuGxRXLNIx3zn_jQQWXXFIBUrjJgXyBMsx2E0FbQ,30490
|
|
268
270
|
orchestrator/services/products.py,sha256=BP4KyE8zO-8z7Trrs5T6zKBOw53S9BfBJnHWI3p6u5Y,1943
|
|
269
271
|
orchestrator/services/resource_types.py,sha256=_QBy_JOW_X3aSTqH0CuLrq4zBJL0p7Q-UDJUcuK2_qc,884
|
|
270
272
|
orchestrator/services/settings.py,sha256=HEWfFulgoEDwgfxGEO__QTr5fDiwNBEj1UhAeTAdbLQ,3159
|
|
@@ -275,11 +277,12 @@ orchestrator/services/tasks.py,sha256=NjPkuauQoh9UJDcjA7OcKFgPk0i6NoKdDO7HlpGbBJ
|
|
|
275
277
|
orchestrator/services/translations.py,sha256=GyP8soUFGej8AS8uulBsk10CCK6Kwfjv9AHMFm3ElQY,1713
|
|
276
278
|
orchestrator/services/workflows.py,sha256=iEkt2OBuTwkDru4V6ZSKatnw0b96ZdPV-VQqeZ9EOgU,4015
|
|
277
279
|
orchestrator/utils/__init__.py,sha256=GyHNfEFCGKQwRiN6rQmvSRH2iYX7npjMZn97n8XzmLU,571
|
|
280
|
+
orchestrator/utils/auth.py,sha256=IWn0amdquLobt1mRNwhgKT0ErCBjLGDtLdsDuaY8rlE,309
|
|
278
281
|
orchestrator/utils/crypt.py,sha256=18eNamYWMllPkxyRtWIde3FDr3rSF74R5SAL6WsCj9Y,5584
|
|
279
282
|
orchestrator/utils/datetime.py,sha256=a1WQ_yvu7MA0TiaRpC5avwbOSFdrj4eMrV4a7I2sD5Q,1477
|
|
280
283
|
orchestrator/utils/deprecation_logger.py,sha256=oqju7ecJcB_r7cMnldaOAA79QUZYS_h69IkDrFV9nAg,875
|
|
281
284
|
orchestrator/utils/docs.py,sha256=GbyD61oKn1yVYaphUKHCBvrWEWJDTQfRc_VEbVb-zgU,6172
|
|
282
|
-
orchestrator/utils/enrich_process.py,sha256=
|
|
285
|
+
orchestrator/utils/enrich_process.py,sha256=sIb9jVM6MzttK1uJsRbUNMN8Aevo3erSAX0Agjbo5EA,4732
|
|
283
286
|
orchestrator/utils/errors.py,sha256=6FxvXrITmRjP5bYnJJ3CxjAwA5meNjRAVYouz4TWKkU,4653
|
|
284
287
|
orchestrator/utils/expose_settings.py,sha256=0NOjLBifQy4k2zUYJ31QjGQCaXEQ1zB4UtCle7XglAM,1640
|
|
285
288
|
orchestrator/utils/fixed_inputs.py,sha256=pnL6I_19VMp_Bny8SYjSzVFNvTFDyeCxFFOWGhTnDiQ,2665
|
|
@@ -299,17 +302,17 @@ orchestrator/websocket/websocket_manager.py,sha256=hwlG9FDXcNU42jDNNsPMQLIyrvEpG
|
|
|
299
302
|
orchestrator/websocket/managers/broadcast_websocket_manager.py,sha256=fwoSgTjkHJ2GmsLTU9dqQpAA9i8b1McPu7gLNzxtfG4,5401
|
|
300
303
|
orchestrator/websocket/managers/memory_websocket_manager.py,sha256=lF5EEx1iFMCGEkTbItTDr88NENMSaSeG1QrJ7teoPkY,3324
|
|
301
304
|
orchestrator/workflows/__init__.py,sha256=NzIGGI-8SNAwCk2YqH6sHhEWbgAY457ntDwjO15N8v4,4131
|
|
302
|
-
orchestrator/workflows/modify_note.py,sha256=
|
|
305
|
+
orchestrator/workflows/modify_note.py,sha256=eXt5KQvrkOXf-3YEXCn2XbBLP9N-n1pUYRW2t8Odupo,2150
|
|
303
306
|
orchestrator/workflows/removed_workflow.py,sha256=V0Da5TEdfLdZZKD38ig-MTp3_IuE7VGqzHHzvPYQmLI,909
|
|
304
|
-
orchestrator/workflows/steps.py,sha256=
|
|
305
|
-
orchestrator/workflows/utils.py,sha256=
|
|
307
|
+
orchestrator/workflows/steps.py,sha256=CZxfzkG5ANJYwuYTkQ4da2RpQqIjXCtey_Uy1ezRAZ4,6479
|
|
308
|
+
orchestrator/workflows/utils.py,sha256=bhX9vm3oc9k6RSaESl34v4Nrh40G4Ys91INoTjZ0XVM,13966
|
|
306
309
|
orchestrator/workflows/tasks/__init__.py,sha256=GyHNfEFCGKQwRiN6rQmvSRH2iYX7npjMZn97n8XzmLU,571
|
|
307
310
|
orchestrator/workflows/tasks/cleanup_tasks_log.py,sha256=BfWYbPXhnLAHUJ0mlODDnjZnQQAvKCZJDVTwbwOWI04,1624
|
|
308
311
|
orchestrator/workflows/tasks/resume_workflows.py,sha256=MzJqlSXUvKStkT7NGzxZyRlfAer_ezYm-kjUqaZi0yc,2359
|
|
309
312
|
orchestrator/workflows/tasks/validate_product_type.py,sha256=paG-NAY1bdde3Adt8zItkcBKf5Pxw6f5ngGW6an6dYU,3192
|
|
310
313
|
orchestrator/workflows/tasks/validate_products.py,sha256=GZJBoFF-WMphS7ghMs2-gqvV2iL1F0POhk0uSNt93n0,8510
|
|
311
314
|
orchestrator/workflows/translations/en-GB.json,sha256=ST53HxkphFLTMjFHonykDBOZ7-P_KxksktZU3GbxLt0,846
|
|
312
|
-
orchestrator_core-4.
|
|
313
|
-
orchestrator_core-4.
|
|
314
|
-
orchestrator_core-4.
|
|
315
|
-
orchestrator_core-4.
|
|
315
|
+
orchestrator_core-4.2.0rc1.dist-info/licenses/LICENSE,sha256=b-aA5OZQuuBATmLKo_mln8CQrDPPhg3ghLzjPjLn4Tg,11409
|
|
316
|
+
orchestrator_core-4.2.0rc1.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82
|
|
317
|
+
orchestrator_core-4.2.0rc1.dist-info/METADATA,sha256=Kkb7hvUNxHfux_npyFWEVr7FVci_N84-9PRvo-ogOqk,5963
|
|
318
|
+
orchestrator_core-4.2.0rc1.dist-info/RECORD,,
|