orchestrator-core 4.0.0rc3__py3-none-any.whl → 4.0.0rc4__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/settings.py +3 -13
- orchestrator/app.py +7 -0
- orchestrator/metrics/__init__.py +3 -0
- orchestrator/metrics/engine.py +49 -0
- orchestrator/metrics/init.py +14 -0
- orchestrator/metrics/processes.py +147 -0
- orchestrator/metrics/subscriptions.py +93 -0
- orchestrator/services/settings.py +10 -1
- orchestrator/settings.py +1 -0
- {orchestrator_core-4.0.0rc3.dist-info → orchestrator_core-4.0.0rc4.dist-info}/METADATA +2 -1
- {orchestrator_core-4.0.0rc3.dist-info → orchestrator_core-4.0.0rc4.dist-info}/RECORD +14 -9
- {orchestrator_core-4.0.0rc3.dist-info → orchestrator_core-4.0.0rc4.dist-info}/WHEEL +0 -0
- {orchestrator_core-4.0.0rc3.dist-info → orchestrator_core-4.0.0rc4.dist-info}/licenses/LICENSE +0 -0
orchestrator/__init__.py
CHANGED
|
@@ -22,9 +22,10 @@ from sqlalchemy.exc import SQLAlchemyError
|
|
|
22
22
|
from oauth2_lib.fastapi import OIDCUserModel
|
|
23
23
|
from orchestrator.api.error_handling import raise_status
|
|
24
24
|
from orchestrator.db import EngineSettingsTable
|
|
25
|
-
from orchestrator.schemas import EngineSettingsBaseSchema, EngineSettingsSchema,
|
|
25
|
+
from orchestrator.schemas import EngineSettingsBaseSchema, EngineSettingsSchema, WorkerStatus
|
|
26
26
|
from orchestrator.security import authenticate
|
|
27
27
|
from orchestrator.services import processes, settings
|
|
28
|
+
from orchestrator.services.settings import generate_engine_global_status
|
|
28
29
|
from orchestrator.settings import ExecutorType, app_settings
|
|
29
30
|
from orchestrator.utils.json import json_dumps
|
|
30
31
|
from orchestrator.utils.redis import delete_keys_matching_pattern
|
|
@@ -165,17 +166,6 @@ def generate_engine_status_response(
|
|
|
165
166
|
Engine StatusEnum
|
|
166
167
|
|
|
167
168
|
"""
|
|
168
|
-
|
|
169
|
-
if engine_settings.global_lock and engine_settings.running_processes > 0:
|
|
170
|
-
result = EngineSettingsSchema.model_validate(engine_settings)
|
|
171
|
-
result.global_status = GlobalStatusEnum.PAUSING
|
|
172
|
-
return result
|
|
173
|
-
|
|
174
|
-
if engine_settings.global_lock and engine_settings.running_processes == 0:
|
|
175
|
-
result = EngineSettingsSchema.model_validate(engine_settings)
|
|
176
|
-
result.global_status = GlobalStatusEnum.PAUSED
|
|
177
|
-
return result
|
|
178
|
-
|
|
179
169
|
result = EngineSettingsSchema.model_validate(engine_settings)
|
|
180
|
-
result.global_status =
|
|
170
|
+
result.global_status = generate_engine_global_status(engine_settings)
|
|
181
171
|
return result
|
orchestrator/app.py
CHANGED
|
@@ -25,6 +25,7 @@ import structlog
|
|
|
25
25
|
import typer
|
|
26
26
|
from fastapi.applications import FastAPI
|
|
27
27
|
from fastapi_etag.dependency import add_exception_handler
|
|
28
|
+
from prometheus_client import make_asgi_app
|
|
28
29
|
from sentry_sdk.integrations import Integration
|
|
29
30
|
from sentry_sdk.integrations.asyncio import AsyncioIntegration
|
|
30
31
|
from sentry_sdk.integrations.fastapi import FastApiIntegration
|
|
@@ -54,6 +55,7 @@ from orchestrator.graphql.schema import ContextGetterFactory
|
|
|
54
55
|
from orchestrator.graphql.schemas.subscription import SubscriptionInterface
|
|
55
56
|
from orchestrator.graphql.types import ScalarOverrideType, StrawberryModelType
|
|
56
57
|
from orchestrator.log_config import LOGGER_OVERRIDES
|
|
58
|
+
from orchestrator.metrics import ORCHESTRATOR_METRICS_REGISTRY, initialize_default_metrics
|
|
57
59
|
from orchestrator.services.process_broadcast_thread import ProcessDataBroadcastThread
|
|
58
60
|
from orchestrator.settings import AppSettings, ExecutorType, app_settings
|
|
59
61
|
from orchestrator.version import GIT_COMMIT_HASH
|
|
@@ -143,6 +145,11 @@ class OrchestratorCore(FastAPI):
|
|
|
143
145
|
self.add_exception_handler(ProblemDetailException, problem_detail_handler) # type: ignore[arg-type]
|
|
144
146
|
add_exception_handler(self)
|
|
145
147
|
|
|
148
|
+
if base_settings.ENABLE_PROMETHEUS_METRICS_ENDPOINT:
|
|
149
|
+
initialize_default_metrics()
|
|
150
|
+
metrics_app = make_asgi_app(registry=ORCHESTRATOR_METRICS_REGISTRY)
|
|
151
|
+
self.mount("/api/metrics", metrics_app)
|
|
152
|
+
|
|
146
153
|
@self.router.get("/", response_model=str, response_class=JSONResponse, include_in_schema=False)
|
|
147
154
|
def _index() -> str:
|
|
148
155
|
return "Orchestrator Core"
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
from typing import Iterable
|
|
2
|
+
|
|
3
|
+
from prometheus_client import Metric
|
|
4
|
+
from prometheus_client.metrics_core import GaugeMetricFamily, StateSetMetricFamily
|
|
5
|
+
from prometheus_client.registry import Collector
|
|
6
|
+
|
|
7
|
+
from orchestrator.schemas.engine_settings import GlobalStatusEnum
|
|
8
|
+
from orchestrator.services import settings
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def _get_engine_status() -> tuple[GlobalStatusEnum, int]:
|
|
12
|
+
"""Query for getting the current status of the workflow engine.
|
|
13
|
+
|
|
14
|
+
This includes the engine status, and the amount of currently running processes.
|
|
15
|
+
"""
|
|
16
|
+
engine_settings = settings.get_engine_settings()
|
|
17
|
+
engine_status = settings.generate_engine_global_status(engine_settings)
|
|
18
|
+
|
|
19
|
+
return engine_status, int(engine_settings.running_processes)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class WorkflowEngineCollector(Collector):
|
|
23
|
+
"""Initialize a Prometheus enum and a gauge.
|
|
24
|
+
|
|
25
|
+
The enum of the current workflow engine status takes three values:
|
|
26
|
+
- RUNNING
|
|
27
|
+
- PAUSING
|
|
28
|
+
- PAUSED
|
|
29
|
+
|
|
30
|
+
This metric also exports the amount of currently running processes.
|
|
31
|
+
"""
|
|
32
|
+
|
|
33
|
+
def collect(self) -> Iterable[Metric]:
|
|
34
|
+
current_engine_status, running_process_count = _get_engine_status()
|
|
35
|
+
|
|
36
|
+
engine_status = StateSetMetricFamily(
|
|
37
|
+
"wfo_engine_status",
|
|
38
|
+
documentation="Current workflow engine status.",
|
|
39
|
+
value={status: status == current_engine_status for status in GlobalStatusEnum.values()},
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
engine_process_count = GaugeMetricFamily(
|
|
43
|
+
"wfo_active_process_count",
|
|
44
|
+
unit="count",
|
|
45
|
+
value=running_process_count,
|
|
46
|
+
documentation="Number of currently running processes in the workflow engine.",
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
return [engine_status, engine_process_count]
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
from prometheus_client import CollectorRegistry
|
|
2
|
+
|
|
3
|
+
from orchestrator.metrics.engine import WorkflowEngineCollector
|
|
4
|
+
from orchestrator.metrics.processes import ProcessCollector
|
|
5
|
+
from orchestrator.metrics.subscriptions import SubscriptionCollector
|
|
6
|
+
|
|
7
|
+
ORCHESTRATOR_METRICS_REGISTRY = CollectorRegistry(auto_describe=True)
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def initialize_default_metrics() -> None:
|
|
11
|
+
"""Register default Prometheus collectors."""
|
|
12
|
+
ORCHESTRATOR_METRICS_REGISTRY.register(SubscriptionCollector())
|
|
13
|
+
ORCHESTRATOR_METRICS_REGISTRY.register(ProcessCollector())
|
|
14
|
+
ORCHESTRATOR_METRICS_REGISTRY.register(WorkflowEngineCollector())
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
from typing import Iterable
|
|
2
|
+
|
|
3
|
+
from prometheus_client.metrics_core import GaugeMetricFamily, Metric
|
|
4
|
+
from prometheus_client.registry import Collector
|
|
5
|
+
from pydantic import BaseModel
|
|
6
|
+
from sqlalchemy import desc, func
|
|
7
|
+
|
|
8
|
+
from orchestrator.db import ProcessTable, ProductTable, SubscriptionTable, WorkflowTable, db
|
|
9
|
+
from orchestrator.db.models import ProcessSubscriptionTable
|
|
10
|
+
from orchestrator.targets import Target
|
|
11
|
+
from orchestrator.workflow import ProcessStatus
|
|
12
|
+
from pydantic_forms.types import UUIDstr
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class ProcessTableQueryResult(BaseModel):
|
|
16
|
+
workflow_name: str
|
|
17
|
+
customer_id: UUIDstr
|
|
18
|
+
workflow_target: Target
|
|
19
|
+
last_status: ProcessStatus
|
|
20
|
+
created_by: str
|
|
21
|
+
is_task: bool
|
|
22
|
+
product_name: str
|
|
23
|
+
total_runtime: float
|
|
24
|
+
process_count: int
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def _get_processes() -> list[ProcessTableQueryResult]:
|
|
28
|
+
"""Query for getting all processes.
|
|
29
|
+
|
|
30
|
+
Equivalent to the following SQL statement:
|
|
31
|
+
```sql
|
|
32
|
+
SELECT
|
|
33
|
+
workflows."name" AS workflow_name
|
|
34
|
+
, subscriptions.customer_id
|
|
35
|
+
, workflows.target AS workflow_target
|
|
36
|
+
, processes.last_status
|
|
37
|
+
, processes.created_by
|
|
38
|
+
, processes.is_task
|
|
39
|
+
, products."name" AS product_name
|
|
40
|
+
, Coalesce(Sum(Extract(EPOCH FROM processes.last_modified_at - processes.started_at)), 0) AS total_runtime
|
|
41
|
+
, Count(workflows."name") AS process_count
|
|
42
|
+
FROM
|
|
43
|
+
processes
|
|
44
|
+
JOIN workflows
|
|
45
|
+
ON processes.workflow_id = workflows.workflow_id
|
|
46
|
+
JOIN processes_subscriptions
|
|
47
|
+
ON processes.pid = processes_subscriptions.pid
|
|
48
|
+
JOIN subscriptions
|
|
49
|
+
ON processes_subscriptions.subscription_id = subscriptions.subscription_id
|
|
50
|
+
JOIN products
|
|
51
|
+
ON subscriptions.product_id = products.product_id
|
|
52
|
+
GROUP BY
|
|
53
|
+
workflows."name"
|
|
54
|
+
, subscriptions.customer_id
|
|
55
|
+
, workflows.target
|
|
56
|
+
, processes.last_status
|
|
57
|
+
, processes.created_by
|
|
58
|
+
, processes.is_task
|
|
59
|
+
, products."name"
|
|
60
|
+
;
|
|
61
|
+
```
|
|
62
|
+
"""
|
|
63
|
+
process_count = func.count(WorkflowTable.name).label("process_count")
|
|
64
|
+
total_process_time = func.coalesce(
|
|
65
|
+
func.sum(func.extract("epoch", (ProcessTable.last_modified_at - ProcessTable.started_at))), 0
|
|
66
|
+
).label("total_runtime")
|
|
67
|
+
return (
|
|
68
|
+
db.session.query(
|
|
69
|
+
ProcessTable.last_status,
|
|
70
|
+
ProcessTable.created_by,
|
|
71
|
+
ProcessTable.is_task,
|
|
72
|
+
ProductTable.name.label("product_name"),
|
|
73
|
+
WorkflowTable.name.label("workflow_name"),
|
|
74
|
+
SubscriptionTable.customer_id,
|
|
75
|
+
WorkflowTable.target.label("workflow_target"),
|
|
76
|
+
process_count,
|
|
77
|
+
total_process_time,
|
|
78
|
+
)
|
|
79
|
+
.join(WorkflowTable, WorkflowTable.workflow_id == ProcessTable.workflow_id)
|
|
80
|
+
.join(ProcessSubscriptionTable, ProcessSubscriptionTable.process_id == ProcessTable.process_id)
|
|
81
|
+
.join(SubscriptionTable, SubscriptionTable.subscription_id == ProcessSubscriptionTable.subscription_id)
|
|
82
|
+
.join(ProductTable, ProductTable.product_id == SubscriptionTable.product_id)
|
|
83
|
+
.group_by(
|
|
84
|
+
ProcessTable.last_status,
|
|
85
|
+
ProcessTable.created_by,
|
|
86
|
+
ProcessTable.is_task,
|
|
87
|
+
ProductTable.name,
|
|
88
|
+
WorkflowTable.name,
|
|
89
|
+
SubscriptionTable.customer_id,
|
|
90
|
+
WorkflowTable.target,
|
|
91
|
+
)
|
|
92
|
+
.order_by(desc(process_count))
|
|
93
|
+
).all()
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
class ProcessCollector(Collector):
|
|
97
|
+
"""Collector that contains two Prometheus gauges with process counts and total runtime.
|
|
98
|
+
|
|
99
|
+
These gauges contain the amount of processes, and the total runtime in seconds, per every combination of the labels
|
|
100
|
+
that are defined:
|
|
101
|
+
- Process last status
|
|
102
|
+
- Process created by
|
|
103
|
+
- Process is task
|
|
104
|
+
- Product name
|
|
105
|
+
- Workflow name
|
|
106
|
+
- Customer ID
|
|
107
|
+
- Workflow target
|
|
108
|
+
"""
|
|
109
|
+
|
|
110
|
+
def collect(self) -> Iterable[Metric]:
|
|
111
|
+
label_names = [
|
|
112
|
+
"last_status",
|
|
113
|
+
"created_by",
|
|
114
|
+
"is_task",
|
|
115
|
+
"product_name",
|
|
116
|
+
"workflow_name",
|
|
117
|
+
"customer_id",
|
|
118
|
+
"workflow_target",
|
|
119
|
+
]
|
|
120
|
+
process_counts = GaugeMetricFamily(
|
|
121
|
+
"wfo_process_count",
|
|
122
|
+
labels=label_names,
|
|
123
|
+
unit="count",
|
|
124
|
+
documentation="Number of processes per status, creator, task, product, workflow, customer, and target.",
|
|
125
|
+
)
|
|
126
|
+
process_seconds_total = GaugeMetricFamily(
|
|
127
|
+
"wfo_process_seconds_total",
|
|
128
|
+
labels=label_names,
|
|
129
|
+
unit="count",
|
|
130
|
+
documentation="Total time spent on processes in seconds.",
|
|
131
|
+
)
|
|
132
|
+
|
|
133
|
+
for row in _get_processes():
|
|
134
|
+
label_values = [
|
|
135
|
+
row.last_status,
|
|
136
|
+
str(row.created_by),
|
|
137
|
+
str(row.is_task),
|
|
138
|
+
row.product_name,
|
|
139
|
+
row.workflow_name,
|
|
140
|
+
row.customer_id,
|
|
141
|
+
row.workflow_target,
|
|
142
|
+
]
|
|
143
|
+
|
|
144
|
+
process_counts.add_metric(label_values, row.process_count)
|
|
145
|
+
process_seconds_total.add_metric(label_values, row.total_runtime)
|
|
146
|
+
|
|
147
|
+
return [process_counts, process_seconds_total]
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
from typing import Iterable
|
|
2
|
+
|
|
3
|
+
from prometheus_client import Metric
|
|
4
|
+
from prometheus_client.metrics_core import GaugeMetricFamily
|
|
5
|
+
from prometheus_client.registry import Collector
|
|
6
|
+
from pydantic import BaseModel
|
|
7
|
+
from sqlalchemy import desc, func
|
|
8
|
+
|
|
9
|
+
from orchestrator.db import ProductTable, SubscriptionTable, db
|
|
10
|
+
from orchestrator.types import SubscriptionLifecycle
|
|
11
|
+
from pydantic_forms.types import UUIDstr
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class SubscriptionTableQueryResult(BaseModel):
|
|
15
|
+
lifecycle_state: SubscriptionLifecycle
|
|
16
|
+
customer_id: UUIDstr
|
|
17
|
+
insync: bool
|
|
18
|
+
product_name: str
|
|
19
|
+
subscription_count: int
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def _get_subscriptions() -> list[SubscriptionTableQueryResult]:
|
|
23
|
+
"""Query for getting all subscriptions.
|
|
24
|
+
|
|
25
|
+
Equivalent to the following SQL statement:
|
|
26
|
+
```sql
|
|
27
|
+
SELECT
|
|
28
|
+
subscriptions.status AS lifecycle_state
|
|
29
|
+
, subscriptions.customer_id
|
|
30
|
+
, subscriptions.insync
|
|
31
|
+
, products."name" AS product_name
|
|
32
|
+
, Count(subscriptions.subscription_id) AS subscription_count
|
|
33
|
+
FROM
|
|
34
|
+
subscriptions
|
|
35
|
+
JOIN products
|
|
36
|
+
ON subscriptions.product_id = products.product_id
|
|
37
|
+
GROUP BY subscriptions.status
|
|
38
|
+
, subscriptions.customer_id
|
|
39
|
+
, insync
|
|
40
|
+
, products."name"
|
|
41
|
+
;
|
|
42
|
+
```
|
|
43
|
+
"""
|
|
44
|
+
subscription_count = func.count(SubscriptionTable.subscription_id).label("subscription_count")
|
|
45
|
+
return (
|
|
46
|
+
db.session.query(
|
|
47
|
+
SubscriptionTable.status.label("lifecycle_state"),
|
|
48
|
+
SubscriptionTable.customer_id,
|
|
49
|
+
SubscriptionTable.insync,
|
|
50
|
+
ProductTable.name.label("product_name"),
|
|
51
|
+
subscription_count,
|
|
52
|
+
)
|
|
53
|
+
.outerjoin(ProductTable, ProductTable.product_id == SubscriptionTable.product_id)
|
|
54
|
+
.group_by(
|
|
55
|
+
SubscriptionTable.status,
|
|
56
|
+
SubscriptionTable.customer_id,
|
|
57
|
+
SubscriptionTable.insync,
|
|
58
|
+
ProductTable.name,
|
|
59
|
+
)
|
|
60
|
+
.order_by(desc(subscription_count))
|
|
61
|
+
).all()
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
class SubscriptionCollector(Collector):
|
|
65
|
+
"""Collector for Subscriptions stored in the subscription database.
|
|
66
|
+
|
|
67
|
+
This collector contains one gauge that contains the amount of subscriptions, per every combination of the labels
|
|
68
|
+
that are defined:
|
|
69
|
+
- Product name
|
|
70
|
+
- Subscription lifecycle
|
|
71
|
+
- Customer ID
|
|
72
|
+
- `insync` state
|
|
73
|
+
"""
|
|
74
|
+
|
|
75
|
+
def collect(self) -> Iterable[Metric]:
|
|
76
|
+
subscriptions = GaugeMetricFamily(
|
|
77
|
+
name="wfo_subscriptions_count",
|
|
78
|
+
labels=[
|
|
79
|
+
"product_name",
|
|
80
|
+
"lifecycle_state",
|
|
81
|
+
"customer_id",
|
|
82
|
+
"insync",
|
|
83
|
+
],
|
|
84
|
+
unit="count",
|
|
85
|
+
documentation="Number of subscriptions per product, lifecycle state, customer, and in sync state.",
|
|
86
|
+
)
|
|
87
|
+
|
|
88
|
+
for row in _get_subscriptions():
|
|
89
|
+
subscriptions.add_metric(
|
|
90
|
+
[row.product_name, row.lifecycle_state, row.customer_id, str(row.insync)], row.subscription_count
|
|
91
|
+
)
|
|
92
|
+
|
|
93
|
+
return [subscriptions]
|
|
@@ -19,7 +19,7 @@ from sqlalchemy import select, text
|
|
|
19
19
|
from sqlalchemy.exc import SQLAlchemyError
|
|
20
20
|
|
|
21
21
|
from orchestrator.db import EngineSettingsTable, db
|
|
22
|
-
from orchestrator.schemas.engine_settings import EngineSettingsSchema
|
|
22
|
+
from orchestrator.schemas.engine_settings import EngineSettingsSchema, GlobalStatusEnum
|
|
23
23
|
from orchestrator.settings import app_settings
|
|
24
24
|
|
|
25
25
|
logger = structlog.get_logger(__name__)
|
|
@@ -35,6 +35,15 @@ def get_engine_settings_for_update() -> EngineSettingsTable:
|
|
|
35
35
|
return db.session.execute(select(EngineSettingsTable).with_for_update()).scalar_one()
|
|
36
36
|
|
|
37
37
|
|
|
38
|
+
def generate_engine_global_status(engine_settings: EngineSettingsTable) -> GlobalStatusEnum:
|
|
39
|
+
"""Returns the global status of the engine."""
|
|
40
|
+
if engine_settings.global_lock and engine_settings.running_processes > 0:
|
|
41
|
+
return GlobalStatusEnum.PAUSING
|
|
42
|
+
if engine_settings.global_lock and engine_settings.running_processes == 0:
|
|
43
|
+
return GlobalStatusEnum.PAUSED
|
|
44
|
+
return GlobalStatusEnum.RUNNING
|
|
45
|
+
|
|
46
|
+
|
|
38
47
|
def post_update_to_slack(engine_status: EngineSettingsSchema, user: str) -> None:
|
|
39
48
|
"""Post engine settings update to slack.
|
|
40
49
|
|
orchestrator/settings.py
CHANGED
|
@@ -84,6 +84,7 @@ class AppSettings(BaseSettings):
|
|
|
84
84
|
ENABLE_GRAPHQL_DEPRECATION_CHECKER: bool = True
|
|
85
85
|
ENABLE_GRAPHQL_PROFILING_EXTENSION: bool = False
|
|
86
86
|
ENABLE_GRAPHQL_STATS_EXTENSION: bool = False
|
|
87
|
+
ENABLE_PROMETHEUS_METRICS_ENDPOINT: bool = False
|
|
87
88
|
VALIDATE_OUT_OF_SYNC_SUBSCRIPTIONS: bool = False
|
|
88
89
|
FILTER_BY_MODE: Literal["partial", "exact"] = "exact"
|
|
89
90
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: orchestrator-core
|
|
3
|
-
Version: 4.0.
|
|
3
|
+
Version: 4.0.0rc4
|
|
4
4
|
Summary: This is the orchestrator workflow engine.
|
|
5
5
|
Requires-Python: >=3.11,<3.14
|
|
6
6
|
Classifier: Intended Audience :: Information Technology
|
|
@@ -39,6 +39,7 @@ Requires-Dist: more-itertools~=10.7.0
|
|
|
39
39
|
Requires-Dist: itsdangerous
|
|
40
40
|
Requires-Dist: Jinja2==3.1.6
|
|
41
41
|
Requires-Dist: orjson==3.10.18
|
|
42
|
+
Requires-Dist: prometheus-client==0.21.1
|
|
42
43
|
Requires-Dist: psycopg2-binary==2.9.10
|
|
43
44
|
Requires-Dist: pydantic[email]~=2.8.2
|
|
44
45
|
Requires-Dist: pydantic-settings~=2.9.1
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
orchestrator/__init__.py,sha256=
|
|
2
|
-
orchestrator/app.py,sha256=
|
|
1
|
+
orchestrator/__init__.py,sha256=4DxV-lt8lBVBK_FUrtqliQAVswqjM5XsXcx8oy7Yj0c,1066
|
|
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
|
|
5
5
|
orchestrator/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
6
6
|
orchestrator/security.py,sha256=iXFxGxab54aav7oHEKLAVkTgrQMJGHy6IYLojEnD7gI,2422
|
|
7
|
-
orchestrator/settings.py,sha256=
|
|
7
|
+
orchestrator/settings.py,sha256=ep4RXOIZfYb5ws4qT_E_iiANMQR91pvOhQQCv1t8osw,3879
|
|
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
|
|
@@ -21,7 +21,7 @@ orchestrator/api/api_v1/endpoints/processes.py,sha256=i5GRoszvdmpZqOxSqON83DNuc0
|
|
|
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
|
-
orchestrator/api/api_v1/endpoints/settings.py,sha256=
|
|
24
|
+
orchestrator/api/api_v1/endpoints/settings.py,sha256=orcwFqGiQ3Ala3mLm_27ChXPkUFoGUeGNaDZnEIk2Ak,5848
|
|
25
25
|
orchestrator/api/api_v1/endpoints/subscription_customer_descriptions.py,sha256=1_6LtgQleoq3M6z_W-Qz__Bj3OFUweoPrUqHMwSH6AM,3288
|
|
26
26
|
orchestrator/api/api_v1/endpoints/subscriptions.py,sha256=EwkWBztI9xSMPkol49SM5csECthyu7HC38AhuW7pWUE,8724
|
|
27
27
|
orchestrator/api/api_v1/endpoints/translations.py,sha256=dIWh_fCnZZUxJoGiNeJ49DK_xpf75IpR_0EIMSvzIvY,963
|
|
@@ -202,6 +202,11 @@ orchestrator/graphql/utils/get_subscription_product_blocks.py,sha256=NReel2uZuir
|
|
|
202
202
|
orchestrator/graphql/utils/is_query_detailed.py,sha256=ESQiM8OyhGF5vEE__cLV61oEIfnFvznoNCxi02rMTsE,2156
|
|
203
203
|
orchestrator/graphql/utils/override_class.py,sha256=blwPXVHxLyXQga3KjiDzWozmMhHEWNrhLL_GDmoj6y0,1373
|
|
204
204
|
orchestrator/graphql/utils/to_graphql_result_page.py,sha256=8ObkJP8reVf-TQOQVPKv1mNdfmSEMS1sG7s_-T7-pUU,902
|
|
205
|
+
orchestrator/metrics/__init__.py,sha256=onGOGku3DPlD6yylljxNYd9ztdsFzK31i3L1zdhOSAQ,171
|
|
206
|
+
orchestrator/metrics/engine.py,sha256=dfpMrKWXNL_5J8zYjH2voOYLx5cZOpGgkz8VsiYF8sg,1708
|
|
207
|
+
orchestrator/metrics/init.py,sha256=xBITvDjbNf-iabbBg0tAW8TPj6-wzr_MerOOqgDsoS4,608
|
|
208
|
+
orchestrator/metrics/processes.py,sha256=SyogN5NSuhYoRv2CSUE1So9e8Gkrwa71J6oGLOdODQU,5333
|
|
209
|
+
orchestrator/metrics/subscriptions.py,sha256=vC1O8VmTq5oJxNrn5CU99Rf8cxzdyhc7tXbZBSAU-O8,3036
|
|
205
210
|
orchestrator/migrations/README,sha256=heMzebYwlGhnE8_4CWJ4LS74WoEZjBy-S-mIJRxAEKI,39
|
|
206
211
|
orchestrator/migrations/alembic.ini,sha256=kMoADqhGeubU8xanILNaqm4oixLy9m4ngYtdGpZcc7I,873
|
|
207
212
|
orchestrator/migrations/env.py,sha256=M_cPoAL2axuuup5fvMy8I_WTPHEw0RbPEHkhZ3QEGoE,3740
|
|
@@ -262,7 +267,7 @@ orchestrator/services/process_broadcast_thread.py,sha256=D44YbjF8mRqGuznkRUV4SoR
|
|
|
262
267
|
orchestrator/services/processes.py,sha256=rTH6zLNsun3qDCPguz2LYS87MQR_LJREIPrgkGS6kwk,30494
|
|
263
268
|
orchestrator/services/products.py,sha256=BP4KyE8zO-8z7Trrs5T6zKBOw53S9BfBJnHWI3p6u5Y,1943
|
|
264
269
|
orchestrator/services/resource_types.py,sha256=_QBy_JOW_X3aSTqH0CuLrq4zBJL0p7Q-UDJUcuK2_qc,884
|
|
265
|
-
orchestrator/services/settings.py,sha256=
|
|
270
|
+
orchestrator/services/settings.py,sha256=HEWfFulgoEDwgfxGEO__QTr5fDiwNBEj1UhAeTAdbLQ,3159
|
|
266
271
|
orchestrator/services/subscription_relations.py,sha256=9C126TUfFvyBe7y4x007kH_dvxJ9pZ1zSnaWeH6HC5k,12261
|
|
267
272
|
orchestrator/services/subscriptions.py,sha256=nr2HI89nC0lYjzTh2j-lEQ5cPQK43LNZv3gvP6jbepw,27189
|
|
268
273
|
orchestrator/services/tasks.py,sha256=NjPkuauQoh9UJDcjA7OcKFgPk0i6NoKdDO7HlpGbBJ8,6575
|
|
@@ -302,7 +307,7 @@ orchestrator/workflows/tasks/resume_workflows.py,sha256=MzJqlSXUvKStkT7NGzxZyRlf
|
|
|
302
307
|
orchestrator/workflows/tasks/validate_product_type.py,sha256=paG-NAY1bdde3Adt8zItkcBKf5Pxw6f5ngGW6an6dYU,3192
|
|
303
308
|
orchestrator/workflows/tasks/validate_products.py,sha256=GZJBoFF-WMphS7ghMs2-gqvV2iL1F0POhk0uSNt93n0,8510
|
|
304
309
|
orchestrator/workflows/translations/en-GB.json,sha256=ST53HxkphFLTMjFHonykDBOZ7-P_KxksktZU3GbxLt0,846
|
|
305
|
-
orchestrator_core-4.0.
|
|
306
|
-
orchestrator_core-4.0.
|
|
307
|
-
orchestrator_core-4.0.
|
|
308
|
-
orchestrator_core-4.0.
|
|
310
|
+
orchestrator_core-4.0.0rc4.dist-info/licenses/LICENSE,sha256=b-aA5OZQuuBATmLKo_mln8CQrDPPhg3ghLzjPjLn4Tg,11409
|
|
311
|
+
orchestrator_core-4.0.0rc4.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82
|
|
312
|
+
orchestrator_core-4.0.0rc4.dist-info/METADATA,sha256=I90LCMRMfzx83Wy3CsS1TkfSoxn6PMryPcjFj6WNaok,5073
|
|
313
|
+
orchestrator_core-4.0.0rc4.dist-info/RECORD,,
|
|
File without changes
|
{orchestrator_core-4.0.0rc3.dist-info → orchestrator_core-4.0.0rc4.dist-info}/licenses/LICENSE
RENAMED
|
File without changes
|