dstack 0.19.20__py3-none-any.whl → 0.19.22__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.
Potentially problematic release.
This version of dstack might be problematic. Click here for more details.
- dstack/_internal/cli/commands/apply.py +8 -3
- dstack/_internal/cli/services/configurators/__init__.py +8 -0
- dstack/_internal/cli/services/configurators/fleet.py +1 -1
- dstack/_internal/cli/services/configurators/gateway.py +1 -1
- dstack/_internal/cli/services/configurators/run.py +11 -1
- dstack/_internal/cli/services/configurators/volume.py +1 -1
- dstack/_internal/cli/utils/common.py +48 -5
- dstack/_internal/cli/utils/fleet.py +5 -5
- dstack/_internal/cli/utils/run.py +32 -0
- dstack/_internal/core/backends/__init__.py +0 -65
- dstack/_internal/core/backends/configurators.py +9 -0
- dstack/_internal/core/backends/features.py +64 -0
- dstack/_internal/core/backends/hotaisle/__init__.py +1 -0
- dstack/_internal/core/backends/hotaisle/api_client.py +109 -0
- dstack/_internal/core/backends/hotaisle/backend.py +16 -0
- dstack/_internal/core/backends/hotaisle/compute.py +225 -0
- dstack/_internal/core/backends/hotaisle/configurator.py +60 -0
- dstack/_internal/core/backends/hotaisle/models.py +45 -0
- dstack/_internal/core/backends/lambdalabs/compute.py +2 -1
- dstack/_internal/core/backends/models.py +8 -0
- dstack/_internal/core/compatibility/fleets.py +2 -0
- dstack/_internal/core/compatibility/runs.py +12 -0
- dstack/_internal/core/models/backends/base.py +2 -0
- dstack/_internal/core/models/configurations.py +139 -1
- dstack/_internal/core/models/health.py +28 -0
- dstack/_internal/core/models/instances.py +2 -0
- dstack/_internal/core/models/logs.py +2 -1
- dstack/_internal/core/models/profiles.py +37 -0
- dstack/_internal/core/models/runs.py +21 -1
- dstack/_internal/core/services/ssh/tunnel.py +7 -0
- dstack/_internal/server/app.py +26 -10
- dstack/_internal/server/background/__init__.py +9 -6
- dstack/_internal/server/background/tasks/process_fleets.py +52 -38
- dstack/_internal/server/background/tasks/process_gateways.py +2 -2
- dstack/_internal/server/background/tasks/process_idle_volumes.py +5 -4
- dstack/_internal/server/background/tasks/process_instances.py +168 -103
- dstack/_internal/server/background/tasks/process_metrics.py +9 -2
- dstack/_internal/server/background/tasks/process_placement_groups.py +2 -0
- dstack/_internal/server/background/tasks/process_probes.py +164 -0
- dstack/_internal/server/background/tasks/process_prometheus_metrics.py +14 -2
- dstack/_internal/server/background/tasks/process_running_jobs.py +142 -124
- dstack/_internal/server/background/tasks/process_runs.py +84 -34
- dstack/_internal/server/background/tasks/process_submitted_jobs.py +12 -10
- dstack/_internal/server/background/tasks/process_terminating_jobs.py +12 -4
- dstack/_internal/server/background/tasks/process_volumes.py +4 -1
- dstack/_internal/server/migrations/versions/25479f540245_add_probes.py +43 -0
- dstack/_internal/server/migrations/versions/50dd7ea98639_index_status_columns.py +55 -0
- dstack/_internal/server/migrations/versions/728b1488b1b4_add_instance_health.py +50 -0
- dstack/_internal/server/migrations/versions/ec02a26a256c_add_runmodel_next_triggered_at.py +38 -0
- dstack/_internal/server/models.py +57 -16
- dstack/_internal/server/routers/instances.py +33 -5
- dstack/_internal/server/schemas/health/dcgm.py +56 -0
- dstack/_internal/server/schemas/instances.py +32 -0
- dstack/_internal/server/schemas/runner.py +5 -0
- dstack/_internal/server/services/fleets.py +19 -10
- dstack/_internal/server/services/gateways/__init__.py +17 -17
- dstack/_internal/server/services/instances.py +113 -15
- dstack/_internal/server/services/jobs/__init__.py +18 -13
- dstack/_internal/server/services/jobs/configurators/base.py +26 -0
- dstack/_internal/server/services/logging.py +4 -2
- dstack/_internal/server/services/logs/aws.py +13 -1
- dstack/_internal/server/services/logs/gcp.py +16 -1
- dstack/_internal/server/services/offers.py +3 -3
- dstack/_internal/server/services/probes.py +6 -0
- dstack/_internal/server/services/projects.py +51 -19
- dstack/_internal/server/services/prometheus/client_metrics.py +3 -0
- dstack/_internal/server/services/prometheus/custom_metrics.py +2 -3
- dstack/_internal/server/services/runner/client.py +52 -20
- dstack/_internal/server/services/runner/ssh.py +4 -4
- dstack/_internal/server/services/runs.py +115 -39
- dstack/_internal/server/services/services/__init__.py +4 -1
- dstack/_internal/server/services/ssh.py +66 -0
- dstack/_internal/server/services/users.py +2 -3
- dstack/_internal/server/services/volumes.py +11 -11
- dstack/_internal/server/settings.py +16 -0
- dstack/_internal/server/statics/index.html +1 -1
- dstack/_internal/server/statics/{main-8f9ee218d3eb45989682.css → main-03e818b110e1d5705378.css} +1 -1
- dstack/_internal/server/statics/{main-39a767528976f8078166.js → main-cc067b7fd1a8f33f97da.js} +26 -15
- dstack/_internal/server/statics/{main-39a767528976f8078166.js.map → main-cc067b7fd1a8f33f97da.js.map} +1 -1
- dstack/_internal/server/testing/common.py +51 -0
- dstack/_internal/{core/backends/remote → server/utils}/provisioning.py +22 -17
- dstack/_internal/server/utils/sentry_utils.py +12 -0
- dstack/_internal/settings.py +3 -0
- dstack/_internal/utils/common.py +15 -0
- dstack/_internal/utils/cron.py +5 -0
- dstack/api/server/__init__.py +1 -1
- dstack/version.py +1 -1
- {dstack-0.19.20.dist-info → dstack-0.19.22.dist-info}/METADATA +13 -22
- {dstack-0.19.20.dist-info → dstack-0.19.22.dist-info}/RECORD +93 -75
- /dstack/_internal/{core/backends/remote → server/schemas/health}/__init__.py +0 -0
- {dstack-0.19.20.dist-info → dstack-0.19.22.dist-info}/WHEEL +0 -0
- {dstack-0.19.20.dist-info → dstack-0.19.22.dist-info}/entry_points.txt +0 -0
- {dstack-0.19.20.dist-info → dstack-0.19.22.dist-info}/licenses/LICENSE.md +0 -0
|
@@ -35,6 +35,7 @@ from dstack._internal.core.models.fleets import (
|
|
|
35
35
|
SSHParams,
|
|
36
36
|
)
|
|
37
37
|
from dstack._internal.core.models.gateways import GatewayComputeConfiguration, GatewayStatus
|
|
38
|
+
from dstack._internal.core.models.health import HealthStatus
|
|
38
39
|
from dstack._internal.core.models.instances import (
|
|
39
40
|
Disk,
|
|
40
41
|
Gpu,
|
|
@@ -68,6 +69,7 @@ from dstack._internal.core.models.runs import (
|
|
|
68
69
|
Requirements,
|
|
69
70
|
RunSpec,
|
|
70
71
|
RunStatus,
|
|
72
|
+
RunTerminationReason,
|
|
71
73
|
)
|
|
72
74
|
from dstack._internal.core.models.users import GlobalRole
|
|
73
75
|
from dstack._internal.core.models.volumes import (
|
|
@@ -84,11 +86,13 @@ from dstack._internal.server.models import (
|
|
|
84
86
|
FleetModel,
|
|
85
87
|
GatewayComputeModel,
|
|
86
88
|
GatewayModel,
|
|
89
|
+
InstanceHealthCheckModel,
|
|
87
90
|
InstanceModel,
|
|
88
91
|
JobMetricsPoint,
|
|
89
92
|
JobModel,
|
|
90
93
|
JobPrometheusMetrics,
|
|
91
94
|
PlacementGroupModel,
|
|
95
|
+
ProbeModel,
|
|
92
96
|
ProjectModel,
|
|
93
97
|
RepoCredsModel,
|
|
94
98
|
RepoModel,
|
|
@@ -282,12 +286,15 @@ async def create_run(
|
|
|
282
286
|
user: UserModel,
|
|
283
287
|
run_name: str = "test-run",
|
|
284
288
|
status: RunStatus = RunStatus.SUBMITTED,
|
|
289
|
+
termination_reason: Optional[RunTerminationReason] = None,
|
|
285
290
|
submitted_at: datetime = datetime(2023, 1, 2, 3, 4, tzinfo=timezone.utc),
|
|
286
291
|
run_spec: Optional[RunSpec] = None,
|
|
287
292
|
run_id: Optional[UUID] = None,
|
|
288
293
|
deleted: bool = False,
|
|
289
294
|
priority: int = 0,
|
|
290
295
|
deployment_num: int = 0,
|
|
296
|
+
resubmission_attempt: int = 0,
|
|
297
|
+
next_triggered_at: Optional[datetime] = None,
|
|
291
298
|
) -> RunModel:
|
|
292
299
|
if run_spec is None:
|
|
293
300
|
run_spec = get_run_spec(
|
|
@@ -305,12 +312,15 @@ async def create_run(
|
|
|
305
312
|
submitted_at=submitted_at,
|
|
306
313
|
run_name=run_name,
|
|
307
314
|
status=status,
|
|
315
|
+
termination_reason=termination_reason,
|
|
308
316
|
run_spec=run_spec.json(),
|
|
309
317
|
last_processed_at=submitted_at,
|
|
310
318
|
jobs=[],
|
|
311
319
|
priority=priority,
|
|
312
320
|
deployment_num=deployment_num,
|
|
313
321
|
desired_replica_count=1,
|
|
322
|
+
resubmission_attempt=resubmission_attempt,
|
|
323
|
+
next_triggered_at=next_triggered_at,
|
|
314
324
|
)
|
|
315
325
|
session.add(run)
|
|
316
326
|
await session.commit()
|
|
@@ -361,6 +371,7 @@ async def create_job(
|
|
|
361
371
|
instance_assigned=instance_assigned,
|
|
362
372
|
used_instance_id=instance.id if instance is not None else None,
|
|
363
373
|
disconnected_at=disconnected_at,
|
|
374
|
+
probes=[],
|
|
364
375
|
)
|
|
365
376
|
session.add(job)
|
|
366
377
|
await session.commit()
|
|
@@ -432,6 +443,26 @@ def get_job_runtime_data(
|
|
|
432
443
|
)
|
|
433
444
|
|
|
434
445
|
|
|
446
|
+
async def create_probe(
|
|
447
|
+
session: AsyncSession,
|
|
448
|
+
job: JobModel,
|
|
449
|
+
probe_num: int = 0,
|
|
450
|
+
due: datetime = datetime(2025, 1, 2, 3, 4, tzinfo=timezone.utc),
|
|
451
|
+
success_streak: int = 0,
|
|
452
|
+
) -> ProbeModel:
|
|
453
|
+
probe = ProbeModel(
|
|
454
|
+
name=f"{job.job_name}-{probe_num}",
|
|
455
|
+
job=job,
|
|
456
|
+
probe_num=probe_num,
|
|
457
|
+
due=due,
|
|
458
|
+
success_streak=success_streak,
|
|
459
|
+
active=True,
|
|
460
|
+
)
|
|
461
|
+
session.add(probe)
|
|
462
|
+
await session.commit()
|
|
463
|
+
return probe
|
|
464
|
+
|
|
465
|
+
|
|
435
466
|
async def create_gateway(
|
|
436
467
|
session: AsyncSession,
|
|
437
468
|
project_id: UUID,
|
|
@@ -585,6 +616,7 @@ async def create_instance(
|
|
|
585
616
|
fleet: Optional[FleetModel] = None,
|
|
586
617
|
status: InstanceStatus = InstanceStatus.IDLE,
|
|
587
618
|
unreachable: bool = False,
|
|
619
|
+
health_status: HealthStatus = HealthStatus.HEALTHY,
|
|
588
620
|
created_at: datetime = datetime(2023, 1, 2, 3, 4, tzinfo=timezone.utc),
|
|
589
621
|
finished_at: Optional[datetime] = None,
|
|
590
622
|
spot: bool = False,
|
|
@@ -647,6 +679,7 @@ async def create_instance(
|
|
|
647
679
|
status=status,
|
|
648
680
|
last_processed_at=last_processed_at,
|
|
649
681
|
unreachable=unreachable,
|
|
682
|
+
health=health_status,
|
|
650
683
|
created_at=created_at,
|
|
651
684
|
started_at=created_at,
|
|
652
685
|
finished_at=finished_at,
|
|
@@ -767,6 +800,24 @@ def get_ssh_key() -> SSHKey:
|
|
|
767
800
|
)
|
|
768
801
|
|
|
769
802
|
|
|
803
|
+
async def create_instance_health_check(
|
|
804
|
+
session: AsyncSession,
|
|
805
|
+
instance: InstanceModel,
|
|
806
|
+
collected_at: datetime = datetime(2023, 1, 2, 3, 4, tzinfo=timezone.utc),
|
|
807
|
+
status: HealthStatus = HealthStatus.HEALTHY,
|
|
808
|
+
response: str = "{}",
|
|
809
|
+
) -> InstanceHealthCheckModel:
|
|
810
|
+
health_check = InstanceHealthCheckModel(
|
|
811
|
+
instance_id=instance.id,
|
|
812
|
+
collected_at=collected_at,
|
|
813
|
+
status=status,
|
|
814
|
+
response=response,
|
|
815
|
+
)
|
|
816
|
+
session.add(health_check)
|
|
817
|
+
await session.commit()
|
|
818
|
+
return health_check
|
|
819
|
+
|
|
820
|
+
|
|
770
821
|
async def create_volume(
|
|
771
822
|
session: AsyncSession,
|
|
772
823
|
project: ProjectModel,
|
|
@@ -224,23 +224,28 @@ def get_shim_healthcheck(client: paramiko.SSHClient) -> str:
|
|
|
224
224
|
retries = 20
|
|
225
225
|
iter_delay = 3
|
|
226
226
|
for _ in range(retries):
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
227
|
+
healthcheck = _get_shim_healthcheck(client)
|
|
228
|
+
if healthcheck is not None:
|
|
229
|
+
return healthcheck
|
|
230
|
+
logger.debug("healthcheck is empty. retry")
|
|
231
|
+
time.sleep(iter_delay)
|
|
232
|
+
raise ProvisioningError("Cannot get HealthcheckResponse")
|
|
233
|
+
|
|
234
|
+
|
|
235
|
+
def _get_shim_healthcheck(client: paramiko.SSHClient) -> Optional[str]:
|
|
236
|
+
try:
|
|
237
|
+
_, stdout, stderr = client.exec_command(
|
|
238
|
+
f"curl -s http://localhost:{DSTACK_SHIM_HTTP_PORT}/api/healthcheck", timeout=15
|
|
239
|
+
)
|
|
240
|
+
out = stdout.read().strip().decode()
|
|
241
|
+
err = stderr.read().strip().decode()
|
|
242
|
+
except (paramiko.SSHException, OSError) as e:
|
|
243
|
+
raise ProvisioningError(f"get_shim_healthcheck failed: {e}") from e
|
|
244
|
+
if err:
|
|
245
|
+
raise ProvisioningError(f"get_shim_healthcheck didn't work. stdout: {out}, stderr: {err}")
|
|
246
|
+
if not out:
|
|
247
|
+
return None
|
|
248
|
+
return out
|
|
244
249
|
|
|
245
250
|
|
|
246
251
|
def host_info_to_instance_type(host_info: Dict[str, Any], cpu_arch: GoArchType) -> InstanceType:
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import functools
|
|
2
|
+
|
|
3
|
+
import sentry_sdk
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def instrument_background_task(f):
|
|
7
|
+
@functools.wraps(f)
|
|
8
|
+
async def wrapper(*args, **kwargs):
|
|
9
|
+
with sentry_sdk.start_transaction(name=f"background.{f.__name__}"):
|
|
10
|
+
return await f(*args, **kwargs)
|
|
11
|
+
|
|
12
|
+
return wrapper
|
dstack/_internal/settings.py
CHANGED
|
@@ -19,6 +19,9 @@ DSTACK_BASE_IMAGE_UBUNTU_VERSION = os.getenv(
|
|
|
19
19
|
)
|
|
20
20
|
DSTACK_DIND_IMAGE = os.getenv("DSTACK_DIND_IMAGE", "dstackai/dind")
|
|
21
21
|
|
|
22
|
+
CLI_LOG_LEVEL = os.getenv("DSTACK_CLI_LOG_LEVEL", "INFO").upper()
|
|
23
|
+
CLI_FILE_LOG_LEVEL = os.getenv("DSTACK_CLI_FILE_LOG_LEVEL", "DEBUG").upper()
|
|
24
|
+
|
|
22
25
|
# Development settings
|
|
23
26
|
|
|
24
27
|
LOCAL_BACKEND_ENABLED = os.getenv("DSTACK_LOCAL_BACKEND_ENABLED") is not None
|
dstack/_internal/utils/common.py
CHANGED
|
@@ -222,6 +222,21 @@ def remove_prefix(text: str, prefix: str) -> str:
|
|
|
222
222
|
return text
|
|
223
223
|
|
|
224
224
|
|
|
225
|
+
def has_duplicates(iterable: Iterable[Any]) -> bool:
|
|
226
|
+
"""
|
|
227
|
+
Checks if there are any duplicate items in the given iterable.
|
|
228
|
+
|
|
229
|
+
O(n^2) implementation, but works with iterables with unhashable items.
|
|
230
|
+
For iterables with hashable items, prefer len(set(iterable)) != len(iterable).
|
|
231
|
+
"""
|
|
232
|
+
seen = []
|
|
233
|
+
for item in iterable:
|
|
234
|
+
if item in seen:
|
|
235
|
+
return True
|
|
236
|
+
seen.append(item)
|
|
237
|
+
return False
|
|
238
|
+
|
|
239
|
+
|
|
225
240
|
T = TypeVar("T")
|
|
226
241
|
|
|
227
242
|
|
dstack/api/server/__init__.py
CHANGED
|
@@ -173,7 +173,7 @@ class APIClient:
|
|
|
173
173
|
raise ClientError(
|
|
174
174
|
f"Unexpected error: status code {resp.status_code}"
|
|
175
175
|
f" when requesting {resp.request.url}."
|
|
176
|
-
" Check server logs
|
|
176
|
+
" Check the server logs for backend issues, and the CLI logs at (~/.dstack/logs/cli/latest.log) local CLI output"
|
|
177
177
|
)
|
|
178
178
|
return resp
|
|
179
179
|
|
dstack/version.py
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: dstack
|
|
3
|
-
Version: 0.19.
|
|
3
|
+
Version: 0.19.22
|
|
4
4
|
Summary: dstack is an open-source orchestration engine for running AI workloads on any cloud or on-premises.
|
|
5
5
|
Project-URL: Homepage, https://dstack.ai
|
|
6
6
|
Project-URL: Source, https://github.com/dstackai/dstack
|
|
@@ -15,13 +15,14 @@ Classifier: License :: OSI Approved :: Mozilla Public License 2.0 (MPL 2.0)
|
|
|
15
15
|
Classifier: Programming Language :: Python :: 3
|
|
16
16
|
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
17
17
|
Requires-Python: >=3.9
|
|
18
|
+
Requires-Dist: apscheduler<4
|
|
18
19
|
Requires-Dist: argcomplete>=3.5.0
|
|
19
20
|
Requires-Dist: cachetools
|
|
20
21
|
Requires-Dist: cryptography
|
|
21
22
|
Requires-Dist: cursor
|
|
22
23
|
Requires-Dist: filelock
|
|
23
24
|
Requires-Dist: gitpython
|
|
24
|
-
Requires-Dist: gpuhunt==0.1.
|
|
25
|
+
Requires-Dist: gpuhunt==0.1.7
|
|
25
26
|
Requires-Dist: ignore-python>=0.2.0
|
|
26
27
|
Requires-Dist: jsonschema
|
|
27
28
|
Requires-Dist: orjson
|
|
@@ -46,7 +47,6 @@ Requires-Dist: aiorwlock; extra == 'all'
|
|
|
46
47
|
Requires-Dist: aiosqlite; extra == 'all'
|
|
47
48
|
Requires-Dist: alembic-postgresql-enum; extra == 'all'
|
|
48
49
|
Requires-Dist: alembic>=1.10.2; extra == 'all'
|
|
49
|
-
Requires-Dist: apscheduler<4; extra == 'all'
|
|
50
50
|
Requires-Dist: asyncpg; extra == 'all'
|
|
51
51
|
Requires-Dist: azure-identity>=1.12.0; extra == 'all'
|
|
52
52
|
Requires-Dist: azure-mgmt-authorization>=3.0.0; extra == 'all'
|
|
@@ -79,7 +79,7 @@ Requires-Dist: prometheus-client; extra == 'all'
|
|
|
79
79
|
Requires-Dist: pyopenssl>=23.2.0; extra == 'all'
|
|
80
80
|
Requires-Dist: python-dxf==12.1.0; extra == 'all'
|
|
81
81
|
Requires-Dist: python-json-logger>=3.1.0; extra == 'all'
|
|
82
|
-
Requires-Dist: sentry-sdk[fastapi]; extra == 'all'
|
|
82
|
+
Requires-Dist: sentry-sdk[fastapi]>=2.27.0; extra == 'all'
|
|
83
83
|
Requires-Dist: sqlalchemy-utils>=0.40.0; extra == 'all'
|
|
84
84
|
Requires-Dist: sqlalchemy[asyncio]>=2.0.0; extra == 'all'
|
|
85
85
|
Requires-Dist: starlette>=0.26.0; extra == 'all'
|
|
@@ -92,7 +92,6 @@ Requires-Dist: aiorwlock; extra == 'aws'
|
|
|
92
92
|
Requires-Dist: aiosqlite; extra == 'aws'
|
|
93
93
|
Requires-Dist: alembic-postgresql-enum; extra == 'aws'
|
|
94
94
|
Requires-Dist: alembic>=1.10.2; extra == 'aws'
|
|
95
|
-
Requires-Dist: apscheduler<4; extra == 'aws'
|
|
96
95
|
Requires-Dist: asyncpg; extra == 'aws'
|
|
97
96
|
Requires-Dist: backports-entry-points-selectable; extra == 'aws'
|
|
98
97
|
Requires-Dist: boto3>=1.38.13; extra == 'aws'
|
|
@@ -105,7 +104,7 @@ Requires-Dist: jinja2; extra == 'aws'
|
|
|
105
104
|
Requires-Dist: prometheus-client; extra == 'aws'
|
|
106
105
|
Requires-Dist: python-dxf==12.1.0; extra == 'aws'
|
|
107
106
|
Requires-Dist: python-json-logger>=3.1.0; extra == 'aws'
|
|
108
|
-
Requires-Dist: sentry-sdk[fastapi]; extra == 'aws'
|
|
107
|
+
Requires-Dist: sentry-sdk[fastapi]>=2.27.0; extra == 'aws'
|
|
109
108
|
Requires-Dist: sqlalchemy-utils>=0.40.0; extra == 'aws'
|
|
110
109
|
Requires-Dist: sqlalchemy[asyncio]>=2.0.0; extra == 'aws'
|
|
111
110
|
Requires-Dist: starlette>=0.26.0; extra == 'aws'
|
|
@@ -117,7 +116,6 @@ Requires-Dist: aiorwlock; extra == 'azure'
|
|
|
117
116
|
Requires-Dist: aiosqlite; extra == 'azure'
|
|
118
117
|
Requires-Dist: alembic-postgresql-enum; extra == 'azure'
|
|
119
118
|
Requires-Dist: alembic>=1.10.2; extra == 'azure'
|
|
120
|
-
Requires-Dist: apscheduler<4; extra == 'azure'
|
|
121
119
|
Requires-Dist: asyncpg; extra == 'azure'
|
|
122
120
|
Requires-Dist: azure-identity>=1.12.0; extra == 'azure'
|
|
123
121
|
Requires-Dist: azure-mgmt-authorization>=3.0.0; extra == 'azure'
|
|
@@ -135,7 +133,7 @@ Requires-Dist: jinja2; extra == 'azure'
|
|
|
135
133
|
Requires-Dist: prometheus-client; extra == 'azure'
|
|
136
134
|
Requires-Dist: python-dxf==12.1.0; extra == 'azure'
|
|
137
135
|
Requires-Dist: python-json-logger>=3.1.0; extra == 'azure'
|
|
138
|
-
Requires-Dist: sentry-sdk[fastapi]; extra == 'azure'
|
|
136
|
+
Requires-Dist: sentry-sdk[fastapi]>=2.27.0; extra == 'azure'
|
|
139
137
|
Requires-Dist: sqlalchemy-utils>=0.40.0; extra == 'azure'
|
|
140
138
|
Requires-Dist: sqlalchemy[asyncio]>=2.0.0; extra == 'azure'
|
|
141
139
|
Requires-Dist: starlette>=0.26.0; extra == 'azure'
|
|
@@ -147,7 +145,6 @@ Requires-Dist: aiorwlock; extra == 'datacrunch'
|
|
|
147
145
|
Requires-Dist: aiosqlite; extra == 'datacrunch'
|
|
148
146
|
Requires-Dist: alembic-postgresql-enum; extra == 'datacrunch'
|
|
149
147
|
Requires-Dist: alembic>=1.10.2; extra == 'datacrunch'
|
|
150
|
-
Requires-Dist: apscheduler<4; extra == 'datacrunch'
|
|
151
148
|
Requires-Dist: asyncpg; extra == 'datacrunch'
|
|
152
149
|
Requires-Dist: backports-entry-points-selectable; extra == 'datacrunch'
|
|
153
150
|
Requires-Dist: datacrunch; extra == 'datacrunch'
|
|
@@ -159,7 +156,7 @@ Requires-Dist: jinja2; extra == 'datacrunch'
|
|
|
159
156
|
Requires-Dist: prometheus-client; extra == 'datacrunch'
|
|
160
157
|
Requires-Dist: python-dxf==12.1.0; extra == 'datacrunch'
|
|
161
158
|
Requires-Dist: python-json-logger>=3.1.0; extra == 'datacrunch'
|
|
162
|
-
Requires-Dist: sentry-sdk[fastapi]; extra == 'datacrunch'
|
|
159
|
+
Requires-Dist: sentry-sdk[fastapi]>=2.27.0; extra == 'datacrunch'
|
|
163
160
|
Requires-Dist: sqlalchemy-utils>=0.40.0; extra == 'datacrunch'
|
|
164
161
|
Requires-Dist: sqlalchemy[asyncio]>=2.0.0; extra == 'datacrunch'
|
|
165
162
|
Requires-Dist: starlette>=0.26.0; extra == 'datacrunch'
|
|
@@ -179,7 +176,6 @@ Requires-Dist: aiorwlock; extra == 'gcp'
|
|
|
179
176
|
Requires-Dist: aiosqlite; extra == 'gcp'
|
|
180
177
|
Requires-Dist: alembic-postgresql-enum; extra == 'gcp'
|
|
181
178
|
Requires-Dist: alembic>=1.10.2; extra == 'gcp'
|
|
182
|
-
Requires-Dist: apscheduler<4; extra == 'gcp'
|
|
183
179
|
Requires-Dist: asyncpg; extra == 'gcp'
|
|
184
180
|
Requires-Dist: backports-entry-points-selectable; extra == 'gcp'
|
|
185
181
|
Requires-Dist: docker>=6.0.0; extra == 'gcp'
|
|
@@ -197,7 +193,7 @@ Requires-Dist: jinja2; extra == 'gcp'
|
|
|
197
193
|
Requires-Dist: prometheus-client; extra == 'gcp'
|
|
198
194
|
Requires-Dist: python-dxf==12.1.0; extra == 'gcp'
|
|
199
195
|
Requires-Dist: python-json-logger>=3.1.0; extra == 'gcp'
|
|
200
|
-
Requires-Dist: sentry-sdk[fastapi]; extra == 'gcp'
|
|
196
|
+
Requires-Dist: sentry-sdk[fastapi]>=2.27.0; extra == 'gcp'
|
|
201
197
|
Requires-Dist: sqlalchemy-utils>=0.40.0; extra == 'gcp'
|
|
202
198
|
Requires-Dist: sqlalchemy[asyncio]>=2.0.0; extra == 'gcp'
|
|
203
199
|
Requires-Dist: starlette>=0.26.0; extra == 'gcp'
|
|
@@ -209,7 +205,6 @@ Requires-Dist: aiorwlock; extra == 'kubernetes'
|
|
|
209
205
|
Requires-Dist: aiosqlite; extra == 'kubernetes'
|
|
210
206
|
Requires-Dist: alembic-postgresql-enum; extra == 'kubernetes'
|
|
211
207
|
Requires-Dist: alembic>=1.10.2; extra == 'kubernetes'
|
|
212
|
-
Requires-Dist: apscheduler<4; extra == 'kubernetes'
|
|
213
208
|
Requires-Dist: asyncpg; extra == 'kubernetes'
|
|
214
209
|
Requires-Dist: backports-entry-points-selectable; extra == 'kubernetes'
|
|
215
210
|
Requires-Dist: docker>=6.0.0; extra == 'kubernetes'
|
|
@@ -221,7 +216,7 @@ Requires-Dist: kubernetes; extra == 'kubernetes'
|
|
|
221
216
|
Requires-Dist: prometheus-client; extra == 'kubernetes'
|
|
222
217
|
Requires-Dist: python-dxf==12.1.0; extra == 'kubernetes'
|
|
223
218
|
Requires-Dist: python-json-logger>=3.1.0; extra == 'kubernetes'
|
|
224
|
-
Requires-Dist: sentry-sdk[fastapi]; extra == 'kubernetes'
|
|
219
|
+
Requires-Dist: sentry-sdk[fastapi]>=2.27.0; extra == 'kubernetes'
|
|
225
220
|
Requires-Dist: sqlalchemy-utils>=0.40.0; extra == 'kubernetes'
|
|
226
221
|
Requires-Dist: sqlalchemy[asyncio]>=2.0.0; extra == 'kubernetes'
|
|
227
222
|
Requires-Dist: starlette>=0.26.0; extra == 'kubernetes'
|
|
@@ -233,7 +228,6 @@ Requires-Dist: aiorwlock; extra == 'lambda'
|
|
|
233
228
|
Requires-Dist: aiosqlite; extra == 'lambda'
|
|
234
229
|
Requires-Dist: alembic-postgresql-enum; extra == 'lambda'
|
|
235
230
|
Requires-Dist: alembic>=1.10.2; extra == 'lambda'
|
|
236
|
-
Requires-Dist: apscheduler<4; extra == 'lambda'
|
|
237
231
|
Requires-Dist: asyncpg; extra == 'lambda'
|
|
238
232
|
Requires-Dist: backports-entry-points-selectable; extra == 'lambda'
|
|
239
233
|
Requires-Dist: boto3>=1.38.13; extra == 'lambda'
|
|
@@ -246,7 +240,7 @@ Requires-Dist: jinja2; extra == 'lambda'
|
|
|
246
240
|
Requires-Dist: prometheus-client; extra == 'lambda'
|
|
247
241
|
Requires-Dist: python-dxf==12.1.0; extra == 'lambda'
|
|
248
242
|
Requires-Dist: python-json-logger>=3.1.0; extra == 'lambda'
|
|
249
|
-
Requires-Dist: sentry-sdk[fastapi]; extra == 'lambda'
|
|
243
|
+
Requires-Dist: sentry-sdk[fastapi]>=2.27.0; extra == 'lambda'
|
|
250
244
|
Requires-Dist: sqlalchemy-utils>=0.40.0; extra == 'lambda'
|
|
251
245
|
Requires-Dist: sqlalchemy[asyncio]>=2.0.0; extra == 'lambda'
|
|
252
246
|
Requires-Dist: starlette>=0.26.0; extra == 'lambda'
|
|
@@ -258,7 +252,6 @@ Requires-Dist: aiorwlock; extra == 'nebius'
|
|
|
258
252
|
Requires-Dist: aiosqlite; extra == 'nebius'
|
|
259
253
|
Requires-Dist: alembic-postgresql-enum; extra == 'nebius'
|
|
260
254
|
Requires-Dist: alembic>=1.10.2; extra == 'nebius'
|
|
261
|
-
Requires-Dist: apscheduler<4; extra == 'nebius'
|
|
262
255
|
Requires-Dist: asyncpg; extra == 'nebius'
|
|
263
256
|
Requires-Dist: backports-entry-points-selectable; extra == 'nebius'
|
|
264
257
|
Requires-Dist: docker>=6.0.0; extra == 'nebius'
|
|
@@ -270,7 +263,7 @@ Requires-Dist: nebius<0.3,>=0.2.19; (python_version >= '3.10') and extra == 'neb
|
|
|
270
263
|
Requires-Dist: prometheus-client; extra == 'nebius'
|
|
271
264
|
Requires-Dist: python-dxf==12.1.0; extra == 'nebius'
|
|
272
265
|
Requires-Dist: python-json-logger>=3.1.0; extra == 'nebius'
|
|
273
|
-
Requires-Dist: sentry-sdk[fastapi]; extra == 'nebius'
|
|
266
|
+
Requires-Dist: sentry-sdk[fastapi]>=2.27.0; extra == 'nebius'
|
|
274
267
|
Requires-Dist: sqlalchemy-utils>=0.40.0; extra == 'nebius'
|
|
275
268
|
Requires-Dist: sqlalchemy[asyncio]>=2.0.0; extra == 'nebius'
|
|
276
269
|
Requires-Dist: starlette>=0.26.0; extra == 'nebius'
|
|
@@ -282,7 +275,6 @@ Requires-Dist: aiorwlock; extra == 'oci'
|
|
|
282
275
|
Requires-Dist: aiosqlite; extra == 'oci'
|
|
283
276
|
Requires-Dist: alembic-postgresql-enum; extra == 'oci'
|
|
284
277
|
Requires-Dist: alembic>=1.10.2; extra == 'oci'
|
|
285
|
-
Requires-Dist: apscheduler<4; extra == 'oci'
|
|
286
278
|
Requires-Dist: asyncpg; extra == 'oci'
|
|
287
279
|
Requires-Dist: backports-entry-points-selectable; extra == 'oci'
|
|
288
280
|
Requires-Dist: cryptography>=44.0.3; extra == 'oci'
|
|
@@ -296,7 +288,7 @@ Requires-Dist: prometheus-client; extra == 'oci'
|
|
|
296
288
|
Requires-Dist: pyopenssl>=23.2.0; extra == 'oci'
|
|
297
289
|
Requires-Dist: python-dxf==12.1.0; extra == 'oci'
|
|
298
290
|
Requires-Dist: python-json-logger>=3.1.0; extra == 'oci'
|
|
299
|
-
Requires-Dist: sentry-sdk[fastapi]; extra == 'oci'
|
|
291
|
+
Requires-Dist: sentry-sdk[fastapi]>=2.27.0; extra == 'oci'
|
|
300
292
|
Requires-Dist: sqlalchemy-utils>=0.40.0; extra == 'oci'
|
|
301
293
|
Requires-Dist: sqlalchemy[asyncio]>=2.0.0; extra == 'oci'
|
|
302
294
|
Requires-Dist: starlette>=0.26.0; extra == 'oci'
|
|
@@ -308,7 +300,6 @@ Requires-Dist: aiorwlock; extra == 'server'
|
|
|
308
300
|
Requires-Dist: aiosqlite; extra == 'server'
|
|
309
301
|
Requires-Dist: alembic-postgresql-enum; extra == 'server'
|
|
310
302
|
Requires-Dist: alembic>=1.10.2; extra == 'server'
|
|
311
|
-
Requires-Dist: apscheduler<4; extra == 'server'
|
|
312
303
|
Requires-Dist: asyncpg; extra == 'server'
|
|
313
304
|
Requires-Dist: backports-entry-points-selectable; extra == 'server'
|
|
314
305
|
Requires-Dist: docker>=6.0.0; extra == 'server'
|
|
@@ -319,7 +310,7 @@ Requires-Dist: jinja2; extra == 'server'
|
|
|
319
310
|
Requires-Dist: prometheus-client; extra == 'server'
|
|
320
311
|
Requires-Dist: python-dxf==12.1.0; extra == 'server'
|
|
321
312
|
Requires-Dist: python-json-logger>=3.1.0; extra == 'server'
|
|
322
|
-
Requires-Dist: sentry-sdk[fastapi]; extra == 'server'
|
|
313
|
+
Requires-Dist: sentry-sdk[fastapi]>=2.27.0; extra == 'server'
|
|
323
314
|
Requires-Dist: sqlalchemy-utils>=0.40.0; extra == 'server'
|
|
324
315
|
Requires-Dist: sqlalchemy[asyncio]>=2.0.0; extra == 'server'
|
|
325
316
|
Requires-Dist: starlette>=0.26.0; extra == 'server'
|