dstack 0.18.44__py3-none-any.whl → 0.19.0__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.

Files changed (267) hide show
  1. dstack/_internal/cli/commands/gateway.py +15 -3
  2. dstack/_internal/cli/commands/logs.py +0 -22
  3. dstack/_internal/cli/commands/stats.py +8 -17
  4. dstack/_internal/cli/main.py +1 -5
  5. dstack/_internal/cli/services/configurators/fleet.py +4 -39
  6. dstack/_internal/cli/services/configurators/run.py +22 -21
  7. dstack/_internal/cli/services/profile.py +34 -83
  8. dstack/_internal/cli/utils/gateway.py +1 -1
  9. dstack/_internal/core/backends/__init__.py +56 -39
  10. dstack/_internal/core/backends/aws/__init__.py +0 -25
  11. dstack/_internal/core/backends/aws/auth.py +1 -10
  12. dstack/_internal/core/backends/aws/backend.py +26 -0
  13. dstack/_internal/core/backends/aws/compute.py +20 -45
  14. dstack/_internal/{server/services/backends/configurators/aws.py → core/backends/aws/configurator.py} +46 -85
  15. dstack/_internal/core/backends/aws/models.py +135 -0
  16. dstack/_internal/core/backends/aws/resources.py +1 -1
  17. dstack/_internal/core/backends/azure/__init__.py +0 -20
  18. dstack/_internal/core/backends/azure/auth.py +2 -11
  19. dstack/_internal/core/backends/azure/backend.py +21 -0
  20. dstack/_internal/core/backends/azure/compute.py +13 -27
  21. dstack/_internal/{server/services/backends/configurators/azure.py → core/backends/azure/configurator.py} +141 -210
  22. dstack/_internal/core/backends/azure/models.py +89 -0
  23. dstack/_internal/core/backends/base/__init__.py +0 -12
  24. dstack/_internal/core/backends/base/backend.py +18 -0
  25. dstack/_internal/core/backends/base/compute.py +153 -33
  26. dstack/_internal/core/backends/base/configurator.py +105 -0
  27. dstack/_internal/core/backends/base/models.py +14 -0
  28. dstack/_internal/core/backends/configurators.py +138 -0
  29. dstack/_internal/core/backends/cudo/__init__.py +0 -15
  30. dstack/_internal/core/backends/cudo/backend.py +16 -0
  31. dstack/_internal/core/backends/cudo/compute.py +8 -26
  32. dstack/_internal/core/backends/cudo/configurator.py +72 -0
  33. dstack/_internal/core/backends/cudo/models.py +37 -0
  34. dstack/_internal/core/backends/datacrunch/__init__.py +0 -15
  35. dstack/_internal/core/backends/datacrunch/backend.py +16 -0
  36. dstack/_internal/core/backends/datacrunch/compute.py +8 -25
  37. dstack/_internal/core/backends/datacrunch/configurator.py +66 -0
  38. dstack/_internal/core/backends/datacrunch/models.py +38 -0
  39. dstack/_internal/core/{models/backends/dstack.py → backends/dstack/models.py} +7 -7
  40. dstack/_internal/core/backends/gcp/__init__.py +0 -16
  41. dstack/_internal/core/backends/gcp/auth.py +2 -11
  42. dstack/_internal/core/backends/gcp/backend.py +17 -0
  43. dstack/_internal/core/backends/gcp/compute.py +13 -43
  44. dstack/_internal/{server/services/backends/configurators/gcp.py → core/backends/gcp/configurator.py} +46 -103
  45. dstack/_internal/core/backends/gcp/models.py +125 -0
  46. dstack/_internal/core/backends/kubernetes/__init__.py +0 -15
  47. dstack/_internal/core/backends/kubernetes/backend.py +16 -0
  48. dstack/_internal/core/backends/kubernetes/compute.py +16 -5
  49. dstack/_internal/core/backends/kubernetes/configurator.py +55 -0
  50. dstack/_internal/core/backends/kubernetes/models.py +72 -0
  51. dstack/_internal/core/backends/lambdalabs/__init__.py +0 -16
  52. dstack/_internal/core/backends/lambdalabs/backend.py +17 -0
  53. dstack/_internal/core/backends/lambdalabs/compute.py +7 -28
  54. dstack/_internal/core/backends/lambdalabs/configurator.py +82 -0
  55. dstack/_internal/core/backends/lambdalabs/models.py +37 -0
  56. dstack/_internal/core/backends/local/__init__.py +0 -13
  57. dstack/_internal/core/backends/local/backend.py +14 -0
  58. dstack/_internal/core/backends/local/compute.py +16 -2
  59. dstack/_internal/core/backends/models.py +128 -0
  60. dstack/_internal/core/backends/oci/__init__.py +0 -15
  61. dstack/_internal/core/backends/oci/auth.py +1 -5
  62. dstack/_internal/core/backends/oci/backend.py +16 -0
  63. dstack/_internal/core/backends/oci/compute.py +9 -23
  64. dstack/_internal/{server/services/backends/configurators/oci.py → core/backends/oci/configurator.py} +40 -85
  65. dstack/_internal/core/{models/backends/oci.py → backends/oci/models.py} +24 -25
  66. dstack/_internal/core/backends/oci/region.py +1 -1
  67. dstack/_internal/core/backends/runpod/__init__.py +0 -15
  68. dstack/_internal/core/backends/runpod/backend.py +16 -0
  69. dstack/_internal/core/backends/runpod/compute.py +7 -3
  70. dstack/_internal/core/backends/runpod/configurator.py +59 -0
  71. dstack/_internal/core/backends/runpod/models.py +54 -0
  72. dstack/_internal/core/backends/template/__init__.py +0 -0
  73. dstack/_internal/core/backends/tensordock/__init__.py +0 -15
  74. dstack/_internal/core/backends/tensordock/backend.py +16 -0
  75. dstack/_internal/core/backends/tensordock/compute.py +8 -27
  76. dstack/_internal/core/backends/tensordock/configurator.py +68 -0
  77. dstack/_internal/core/backends/tensordock/models.py +38 -0
  78. dstack/_internal/core/backends/vastai/__init__.py +0 -15
  79. dstack/_internal/core/backends/vastai/backend.py +16 -0
  80. dstack/_internal/core/backends/vastai/compute.py +2 -2
  81. dstack/_internal/core/backends/vastai/configurator.py +66 -0
  82. dstack/_internal/core/backends/vastai/models.py +37 -0
  83. dstack/_internal/core/backends/vultr/__init__.py +0 -15
  84. dstack/_internal/core/backends/vultr/backend.py +16 -0
  85. dstack/_internal/core/backends/vultr/compute.py +10 -24
  86. dstack/_internal/core/backends/vultr/configurator.py +64 -0
  87. dstack/_internal/core/backends/vultr/models.py +34 -0
  88. dstack/_internal/core/models/backends/__init__.py +0 -184
  89. dstack/_internal/core/models/backends/base.py +0 -19
  90. dstack/_internal/core/models/configurations.py +20 -15
  91. dstack/_internal/core/models/envs.py +4 -3
  92. dstack/_internal/core/models/fleets.py +17 -22
  93. dstack/_internal/core/models/gateways.py +3 -3
  94. dstack/_internal/core/models/instances.py +24 -0
  95. dstack/_internal/core/models/profiles.py +41 -46
  96. dstack/_internal/core/models/projects.py +1 -1
  97. dstack/_internal/core/models/repos/base.py +0 -5
  98. dstack/_internal/core/models/repos/local.py +3 -3
  99. dstack/_internal/core/models/repos/remote.py +26 -12
  100. dstack/_internal/core/models/repos/virtual.py +1 -1
  101. dstack/_internal/core/models/resources.py +45 -76
  102. dstack/_internal/core/models/runs.py +17 -19
  103. dstack/_internal/core/models/volumes.py +1 -3
  104. dstack/_internal/core/services/profiles.py +7 -16
  105. dstack/_internal/core/services/repos.py +0 -4
  106. dstack/_internal/server/app.py +0 -3
  107. dstack/_internal/server/background/tasks/process_gateways.py +4 -8
  108. dstack/_internal/server/background/tasks/process_instances.py +14 -9
  109. dstack/_internal/server/background/tasks/process_metrics.py +1 -1
  110. dstack/_internal/server/background/tasks/process_placement_groups.py +4 -1
  111. dstack/_internal/server/background/tasks/process_prometheus_metrics.py +1 -1
  112. dstack/_internal/server/background/tasks/process_running_jobs.py +14 -5
  113. dstack/_internal/server/background/tasks/process_submitted_jobs.py +16 -37
  114. dstack/_internal/server/background/tasks/process_volumes.py +5 -2
  115. dstack/_internal/server/migrations/versions/7bc2586e8b9e_make_instancemodel_pool_id_optional.py +36 -0
  116. dstack/_internal/server/migrations/versions/bc8ca4a505c6_store_backendtype_as_string.py +171 -0
  117. dstack/_internal/server/models.py +48 -9
  118. dstack/_internal/server/routers/backends.py +14 -23
  119. dstack/_internal/server/routers/instances.py +3 -4
  120. dstack/_internal/server/routers/metrics.py +10 -8
  121. dstack/_internal/server/routers/prometheus.py +1 -1
  122. dstack/_internal/server/routers/repos.py +1 -2
  123. dstack/_internal/server/routers/runs.py +13 -59
  124. dstack/_internal/server/schemas/gateways.py +14 -23
  125. dstack/_internal/server/schemas/projects.py +7 -2
  126. dstack/_internal/server/schemas/repos.py +2 -38
  127. dstack/_internal/server/schemas/runner.py +1 -0
  128. dstack/_internal/server/schemas/runs.py +1 -24
  129. dstack/_internal/server/services/backends/__init__.py +85 -158
  130. dstack/_internal/server/services/config.py +52 -576
  131. dstack/_internal/server/services/fleets.py +8 -103
  132. dstack/_internal/server/services/gateways/__init__.py +12 -4
  133. dstack/_internal/server/services/{pools.py → instances.py} +22 -329
  134. dstack/_internal/server/services/jobs/__init__.py +9 -6
  135. dstack/_internal/server/services/jobs/configurators/base.py +16 -0
  136. dstack/_internal/server/services/jobs/configurators/dev.py +9 -1
  137. dstack/_internal/server/services/jobs/configurators/extensions/cursor.py +42 -0
  138. dstack/_internal/server/services/metrics.py +39 -13
  139. dstack/_internal/server/services/offers.py +1 -1
  140. dstack/_internal/server/services/projects.py +23 -14
  141. dstack/_internal/server/services/prometheus.py +176 -18
  142. dstack/_internal/server/services/runs.py +24 -16
  143. dstack/_internal/server/services/volumes.py +8 -4
  144. dstack/_internal/server/statics/index.html +1 -1
  145. dstack/_internal/server/statics/{main-4eb116b97819badd1e2c.js → main-4a0fe83e84574654e397.js} +18 -14
  146. dstack/_internal/server/statics/{main-4eb116b97819badd1e2c.js.map → main-4a0fe83e84574654e397.js.map} +1 -1
  147. dstack/_internal/server/testing/common.py +58 -32
  148. dstack/_internal/utils/json_schema.py +6 -0
  149. dstack/_internal/utils/ssh.py +2 -1
  150. dstack/api/__init__.py +4 -0
  151. dstack/api/_public/__init__.py +16 -20
  152. dstack/api/_public/backends.py +1 -1
  153. dstack/api/_public/repos.py +36 -36
  154. dstack/api/_public/runs.py +167 -83
  155. dstack/api/server/__init__.py +11 -13
  156. dstack/api/server/_backends.py +12 -16
  157. dstack/api/server/_fleets.py +15 -57
  158. dstack/api/server/_gateways.py +3 -14
  159. dstack/api/server/_repos.py +1 -4
  160. dstack/api/server/_runs.py +21 -100
  161. dstack/api/server/_volumes.py +10 -5
  162. dstack/version.py +1 -1
  163. {dstack-0.18.44.dist-info → dstack-0.19.0.dist-info}/METADATA +1 -1
  164. {dstack-0.18.44.dist-info → dstack-0.19.0.dist-info}/RECORD +218 -204
  165. tests/_internal/cli/services/configurators/test_profile.py +6 -6
  166. tests/_internal/core/backends/aws/test_configurator.py +35 -0
  167. tests/_internal/core/backends/aws/test_resources.py +1 -1
  168. tests/_internal/core/backends/azure/test_configurator.py +61 -0
  169. tests/_internal/core/backends/cudo/__init__.py +0 -0
  170. tests/_internal/core/backends/cudo/test_configurator.py +37 -0
  171. tests/_internal/core/backends/datacrunch/__init__.py +0 -0
  172. tests/_internal/core/backends/datacrunch/test_configurator.py +17 -0
  173. tests/_internal/core/backends/gcp/test_configurator.py +42 -0
  174. tests/_internal/core/backends/kubernetes/test_configurator.py +43 -0
  175. tests/_internal/core/backends/lambdalabs/__init__.py +0 -0
  176. tests/_internal/core/backends/lambdalabs/test_configurator.py +38 -0
  177. tests/_internal/core/backends/oci/test_configurator.py +55 -0
  178. tests/_internal/core/backends/runpod/__init__.py +0 -0
  179. tests/_internal/core/backends/runpod/test_configurator.py +33 -0
  180. tests/_internal/core/backends/tensordock/__init__.py +0 -0
  181. tests/_internal/core/backends/tensordock/test_configurator.py +38 -0
  182. tests/_internal/core/backends/vastai/__init__.py +0 -0
  183. tests/_internal/core/backends/vastai/test_configurator.py +33 -0
  184. tests/_internal/core/backends/vultr/__init__.py +0 -0
  185. tests/_internal/core/backends/vultr/test_configurator.py +33 -0
  186. tests/_internal/server/background/tasks/test_process_gateways.py +4 -0
  187. tests/_internal/server/background/tasks/test_process_instances.py +49 -48
  188. tests/_internal/server/background/tasks/test_process_metrics.py +0 -3
  189. tests/_internal/server/background/tasks/test_process_placement_groups.py +2 -0
  190. tests/_internal/server/background/tasks/test_process_prometheus_metrics.py +0 -3
  191. tests/_internal/server/background/tasks/test_process_running_jobs.py +0 -21
  192. tests/_internal/server/background/tasks/test_process_runs.py +8 -22
  193. tests/_internal/server/background/tasks/test_process_submitted_jobs.py +3 -40
  194. tests/_internal/server/background/tasks/test_process_submitted_volumes.py +2 -0
  195. tests/_internal/server/background/tasks/test_process_terminating_jobs.py +10 -15
  196. tests/_internal/server/routers/test_backends.py +6 -764
  197. tests/_internal/server/routers/test_fleets.py +0 -26
  198. tests/_internal/server/routers/test_gateways.py +27 -3
  199. tests/_internal/server/routers/test_instances.py +0 -10
  200. tests/_internal/server/routers/test_metrics.py +27 -0
  201. tests/_internal/server/routers/test_projects.py +56 -0
  202. tests/_internal/server/routers/test_prometheus.py +116 -27
  203. tests/_internal/server/routers/test_repos.py +0 -15
  204. tests/_internal/server/routers/test_runs.py +4 -219
  205. tests/_internal/server/routers/test_volumes.py +2 -3
  206. tests/_internal/server/services/backends/__init__.py +0 -0
  207. tests/_internal/server/services/jobs/configurators/test_task.py +35 -0
  208. tests/_internal/server/services/test_config.py +7 -4
  209. tests/_internal/server/services/test_fleets.py +1 -4
  210. tests/_internal/server/services/{test_pools.py → test_instances.py} +11 -49
  211. tests/_internal/server/services/test_metrics.py +9 -5
  212. tests/_internal/server/services/test_repos.py +1 -14
  213. tests/_internal/server/services/test_runs.py +0 -4
  214. dstack/_internal/cli/commands/pool.py +0 -581
  215. dstack/_internal/cli/commands/run.py +0 -75
  216. dstack/_internal/core/backends/aws/config.py +0 -18
  217. dstack/_internal/core/backends/azure/config.py +0 -12
  218. dstack/_internal/core/backends/base/config.py +0 -5
  219. dstack/_internal/core/backends/cudo/config.py +0 -9
  220. dstack/_internal/core/backends/datacrunch/config.py +0 -9
  221. dstack/_internal/core/backends/gcp/config.py +0 -22
  222. dstack/_internal/core/backends/kubernetes/config.py +0 -6
  223. dstack/_internal/core/backends/lambdalabs/config.py +0 -9
  224. dstack/_internal/core/backends/nebius/__init__.py +0 -15
  225. dstack/_internal/core/backends/nebius/api_client.py +0 -319
  226. dstack/_internal/core/backends/nebius/compute.py +0 -220
  227. dstack/_internal/core/backends/nebius/config.py +0 -6
  228. dstack/_internal/core/backends/nebius/types.py +0 -37
  229. dstack/_internal/core/backends/oci/config.py +0 -6
  230. dstack/_internal/core/backends/runpod/config.py +0 -17
  231. dstack/_internal/core/backends/tensordock/config.py +0 -9
  232. dstack/_internal/core/backends/vastai/config.py +0 -6
  233. dstack/_internal/core/backends/vultr/config.py +0 -9
  234. dstack/_internal/core/models/backends/aws.py +0 -86
  235. dstack/_internal/core/models/backends/azure.py +0 -68
  236. dstack/_internal/core/models/backends/cudo.py +0 -43
  237. dstack/_internal/core/models/backends/datacrunch.py +0 -44
  238. dstack/_internal/core/models/backends/gcp.py +0 -67
  239. dstack/_internal/core/models/backends/kubernetes.py +0 -40
  240. dstack/_internal/core/models/backends/lambdalabs.py +0 -43
  241. dstack/_internal/core/models/backends/nebius.py +0 -54
  242. dstack/_internal/core/models/backends/runpod.py +0 -42
  243. dstack/_internal/core/models/backends/tensordock.py +0 -44
  244. dstack/_internal/core/models/backends/vastai.py +0 -43
  245. dstack/_internal/core/models/backends/vultr.py +0 -40
  246. dstack/_internal/core/models/pools.py +0 -43
  247. dstack/_internal/server/routers/pools.py +0 -142
  248. dstack/_internal/server/schemas/pools.py +0 -38
  249. dstack/_internal/server/services/backends/configurators/base.py +0 -72
  250. dstack/_internal/server/services/backends/configurators/cudo.py +0 -87
  251. dstack/_internal/server/services/backends/configurators/datacrunch.py +0 -79
  252. dstack/_internal/server/services/backends/configurators/kubernetes.py +0 -63
  253. dstack/_internal/server/services/backends/configurators/lambdalabs.py +0 -98
  254. dstack/_internal/server/services/backends/configurators/nebius.py +0 -85
  255. dstack/_internal/server/services/backends/configurators/runpod.py +0 -67
  256. dstack/_internal/server/services/backends/configurators/tensordock.py +0 -82
  257. dstack/_internal/server/services/backends/configurators/vastai.py +0 -80
  258. dstack/_internal/server/services/backends/configurators/vultr.py +0 -80
  259. dstack/api/_public/pools.py +0 -41
  260. dstack/api/_public/resources.py +0 -105
  261. dstack/api/server/_pools.py +0 -63
  262. tests/_internal/server/routers/test_pools.py +0 -612
  263. /dstack/_internal/{server/services/backends/configurators → core/backends/dstack}/__init__.py +0 -0
  264. {dstack-0.18.44.dist-info → dstack-0.19.0.dist-info}/LICENSE.md +0 -0
  265. {dstack-0.18.44.dist-info → dstack-0.19.0.dist-info}/WHEEL +0 -0
  266. {dstack-0.18.44.dist-info → dstack-0.19.0.dist-info}/entry_points.txt +0 -0
  267. {dstack-0.18.44.dist-info → dstack-0.19.0.dist-info}/top_level.txt +0 -0
@@ -3,15 +3,18 @@ import uuid
3
3
  import pytest
4
4
  from sqlalchemy.ext.asyncio import AsyncSession
5
5
 
6
- import dstack._internal.server.services.pools as services_pools
6
+ import dstack._internal.server.services.instances as instances_services
7
7
  from dstack._internal.core.models.backends.base import BackendType
8
- from dstack._internal.core.models.instances import InstanceStatus, InstanceType, Resources
9
- from dstack._internal.core.models.pools import Instance
8
+ from dstack._internal.core.models.instances import (
9
+ Instance,
10
+ InstanceStatus,
11
+ InstanceType,
12
+ Resources,
13
+ )
10
14
  from dstack._internal.core.models.profiles import Profile
11
15
  from dstack._internal.server.models import InstanceModel
12
16
  from dstack._internal.server.testing.common import (
13
17
  create_instance,
14
- create_pool,
15
18
  create_project,
16
19
  create_user,
17
20
  get_volume,
@@ -27,21 +30,18 @@ class TestFilterPoolInstances:
27
30
  async def test_returns_all_instances(self, test_db, session: AsyncSession):
28
31
  user = await create_user(session=session)
29
32
  project = await create_project(session=session, owner=user)
30
- pool = await create_pool(session=session, project=project)
31
33
  aws_instance = await create_instance(
32
34
  session=session,
33
35
  project=project,
34
- pool=pool,
35
36
  backend=BackendType.AWS,
36
37
  )
37
38
  runpod_instance = await create_instance(
38
39
  session=session,
39
40
  project=project,
40
- pool=pool,
41
41
  backend=BackendType.RUNPOD,
42
42
  )
43
43
  instances = [aws_instance, runpod_instance]
44
- res = services_pools.filter_pool_instances(
44
+ res = instances_services.filter_pool_instances(
45
45
  pool_instances=instances,
46
46
  profile=Profile(name="test"),
47
47
  )
@@ -52,21 +52,18 @@ class TestFilterPoolInstances:
52
52
  async def test_returns_multinode_instances(self, test_db, session: AsyncSession):
53
53
  user = await create_user(session=session)
54
54
  project = await create_project(session=session, owner=user)
55
- pool = await create_pool(session=session, project=project)
56
55
  aws_instance = await create_instance(
57
56
  session=session,
58
57
  project=project,
59
- pool=pool,
60
58
  backend=BackendType.AWS,
61
59
  )
62
60
  runpod_instance = await create_instance(
63
61
  session=session,
64
62
  project=project,
65
- pool=pool,
66
63
  backend=BackendType.RUNPOD,
67
64
  )
68
65
  instances = [aws_instance, runpod_instance]
69
- res = services_pools.filter_pool_instances(
66
+ res = instances_services.filter_pool_instances(
70
67
  pool_instances=instances,
71
68
  profile=Profile(name="test"),
72
69
  multinode=True,
@@ -78,29 +75,25 @@ class TestFilterPoolInstances:
78
75
  async def test_returns_volume_instances(self, test_db, session: AsyncSession):
79
76
  user = await create_user(session=session)
80
77
  project = await create_project(session=session, owner=user)
81
- pool = await create_pool(session=session, project=project)
82
78
  aws_instance = await create_instance(
83
79
  session=session,
84
80
  project=project,
85
- pool=pool,
86
81
  backend=BackendType.AWS,
87
82
  )
88
83
  runpod_instance1 = await create_instance(
89
84
  session=session,
90
85
  project=project,
91
- pool=pool,
92
86
  backend=BackendType.RUNPOD,
93
87
  region="eu",
94
88
  )
95
89
  runpod_instance2 = await create_instance(
96
90
  session=session,
97
91
  project=project,
98
- pool=pool,
99
92
  backend=BackendType.RUNPOD,
100
93
  region="us",
101
94
  )
102
95
  instances = [aws_instance, runpod_instance1, runpod_instance2]
103
- res = services_pools.filter_pool_instances(
96
+ res = instances_services.filter_pool_instances(
104
97
  pool_instances=instances,
105
98
  profile=Profile(name="test"),
106
99
  volumes=[
@@ -116,36 +109,6 @@ class TestFilterPoolInstances:
116
109
  assert res == [runpod_instance2]
117
110
 
118
111
 
119
- class TestGenerateInstanceName:
120
- @pytest.mark.asyncio
121
- @pytest.mark.parametrize("test_db", ["sqlite", "postgres"], indirect=True)
122
- async def test_generates_instance_name(self, test_db, session: AsyncSession):
123
- user = await create_user(session=session)
124
- project = await create_project(session=session, owner=user)
125
- pool = await services_pools.create_pool(session=session, project=project, name="test_pool")
126
- im = InstanceModel(
127
- name="test_instnce",
128
- project=project,
129
- pool=pool,
130
- status=InstanceStatus.PENDING,
131
- unreachable=False,
132
- job_provisioning_data="",
133
- offer="",
134
- backend=BackendType.REMOTE,
135
- region="",
136
- price=0,
137
- )
138
- session.add(im)
139
- await session.commit()
140
-
141
- name = await services_pools.generate_instance_name(
142
- session=session, project=project, pool_name="test_pool"
143
- )
144
- car, _, cdr = name.partition("-")
145
- assert len(car) > 0
146
- assert len(cdr) > 0
147
-
148
-
149
112
  class TestInstanceModelToInstance:
150
113
  @pytest.mark.asyncio
151
114
  @pytest.mark.parametrize("test_db", ["sqlite", "postgres"], indirect=True)
@@ -181,11 +144,10 @@ class TestInstanceModelToInstance:
181
144
  status=InstanceStatus.PENDING,
182
145
  unreachable=False,
183
146
  project=project,
184
- pool=None,
185
147
  job_provisioning_data='{"ssh_proxy":null, "backend":"local","hostname":"hostname_test","region":"eu-west","price":1.0,"username":"user1","ssh_port":12345,"dockerized":false,"instance_id":"test_instance","instance_type": {"name": "instance", "resources": {"cpus": 1, "memory_mib": 512, "gpus": [], "spot": false, "disk": {"size_mib": 102400}, "description":""}}}',
186
148
  offer='{"price":"LOCAL", "price":1.0, "backend":"local", "region":"eu-west-1", "availability":"available","instance": {"name": "instance", "resources": {"cpus": 1, "memory_mib": 512, "gpus": [], "spot": false, "disk": {"size_mib": 102400}, "description":""}}}',
187
149
  total_blocks=1,
188
150
  busy_blocks=0,
189
151
  )
190
- instance = services_pools.instance_model_to_instance(im)
152
+ instance = instances_services.instance_model_to_instance(im)
191
153
  assert instance == expected_instance
@@ -12,6 +12,7 @@ from dstack._internal.server.testing.common import (
12
12
  create_repo,
13
13
  create_run,
14
14
  create_user,
15
+ get_job_provisioning_data,
15
16
  )
16
17
 
17
18
 
@@ -129,9 +130,13 @@ class TestGetMetrics:
129
130
  repo=repo,
130
131
  user=user,
131
132
  )
133
+ jpd = get_job_provisioning_data(
134
+ cpu_count=64, memory_gib=128, gpu_count=2, gpu_memory_gib=32
135
+ )
132
136
  job = await create_job(
133
137
  session=session,
134
138
  run=run,
139
+ job_provisioning_data=jpd,
135
140
  )
136
141
  for dt, _cpu, _mem, _mem_ws, _gpu0_mem, _gpu0_util, _gpu1_mem, _gpu1_util in self.points:
137
142
  await create_job_metrics_point(
@@ -151,11 +156,10 @@ class TestGetMetrics:
151
156
  Metric(name="cpu_usage_percent", timestamps=ts, values=cpu),
152
157
  Metric(name="memory_usage_bytes", timestamps=ts, values=mem),
153
158
  Metric(name="memory_working_set_bytes", timestamps=ts, values=mem_ws),
154
- Metric(
155
- name="gpus_detected_num",
156
- timestamps=[ts[0], ts[-1]] if len(ts) > 1 else ts,
157
- values=[2, 2] if len(ts) > 1 else [2],
158
- ),
159
+ Metric(name="cpus_detected_num", timestamps=ts, values=[64] * len(ts)),
160
+ Metric(name="memory_total_bytes", timestamps=ts, values=[137438953472] * len(ts)),
161
+ Metric(name="gpus_detected_num", timestamps=ts, values=[2] * len(ts)),
162
+ Metric(name="gpu_memory_total_bytes", timestamps=ts, values=[34359738368] * len(ts)),
159
163
  Metric(name="gpu_memory_usage_bytes_gpu0", timestamps=ts, values=gpu0_mem),
160
164
  Metric(name="gpu_memory_usage_bytes_gpu1", timestamps=ts, values=gpu1_mem),
161
165
  Metric(name="gpu_util_percent_gpu0", timestamps=ts, values=gpu0_util),
@@ -7,7 +7,7 @@ from sqlalchemy import select
7
7
  from sqlalchemy.ext.asyncio import AsyncSession
8
8
 
9
9
  from dstack._internal.core.models.repos import RemoteRepoCreds, RemoteRepoInfo, RepoHeadWithCreds
10
- from dstack._internal.core.models.repos.base import RepoProtocol, RepoType
10
+ from dstack._internal.core.models.repos.base import RepoType
11
11
  from dstack._internal.core.models.users import GlobalRole, ProjectRole
12
12
  from dstack._internal.server.models import ProjectModel, RepoCredsModel, UserModel
13
13
  from dstack._internal.server.services.projects import add_project_member
@@ -90,7 +90,6 @@ class TestGetRemoteRepo:
90
90
  ):
91
91
  repo_info = RemoteRepoInfo(repo_type="remote", repo_name="test")
92
92
  legacy_repo_creds = RemoteRepoCreds(
93
- protocol=RepoProtocol.HTTPS,
94
93
  clone_url="https://git.example.com/repo.git",
95
94
  private_key=None,
96
95
  oauth_token="legacy-oauth-token",
@@ -104,7 +103,6 @@ class TestGetRemoteRepo:
104
103
  creds=legacy_repo_creds.dict(),
105
104
  )
106
105
  user_repo_creds = RemoteRepoCreds(
107
- protocol=RepoProtocol.HTTPS,
108
106
  clone_url="https://git.example.com/repo.git",
109
107
  private_key=None,
110
108
  oauth_token="user-oauth-token",
@@ -142,7 +140,6 @@ class TestGetRemoteRepo:
142
140
  # another user's creds should be ignored
143
141
  another_user = await _create_user(session, project, name="another-user")
144
142
  another_user_repo_creds = RemoteRepoCreds(
145
- protocol=RepoProtocol.HTTPS,
146
143
  clone_url="https://git.example.com/repo.git",
147
144
  private_key=None,
148
145
  oauth_token="another-oauth-token",
@@ -185,7 +182,6 @@ class TestGetRemoteRepo:
185
182
  repo_info = RemoteRepoInfo(repo_type="remote", repo_name="test")
186
183
  if with_legacy_creds:
187
184
  legacy_repo_creds = RemoteRepoCreds(
188
- protocol=RepoProtocol.HTTPS,
189
185
  clone_url="https://git.example.com/repo.git",
190
186
  private_key=None,
191
187
  oauth_token="legacy-oauth-token",
@@ -201,7 +197,6 @@ class TestGetRemoteRepo:
201
197
  creds=legacy_repo_creds.dict() if legacy_repo_creds else None,
202
198
  )
203
199
  user_repo_creds = RemoteRepoCreds(
204
- protocol=RepoProtocol.HTTPS,
205
200
  clone_url="https://git.example.com/repo.git",
206
201
  private_key=None,
207
202
  oauth_token="user-oauth-token",
@@ -228,7 +223,6 @@ class TestGetRemoteRepo:
228
223
  ):
229
224
  repo_info = RemoteRepoInfo(repo_type="remote", repo_name="test")
230
225
  legacy_repo_creds = RemoteRepoCreds(
231
- protocol=RepoProtocol.HTTPS,
232
226
  clone_url="https://git.example.com/repo.git",
233
227
  private_key=None,
234
228
  oauth_token="legacy-oauth-token",
@@ -259,7 +253,6 @@ class TestInitRemoteRepo:
259
253
  ):
260
254
  repo_info = RemoteRepoInfo(repo_type="remote", repo_name="test")
261
255
  repo_creds = RemoteRepoCreds(
262
- protocol=RepoProtocol.HTTPS,
263
256
  clone_url="https://git.example.com/repo.git",
264
257
  private_key=None,
265
258
  oauth_token="oauth-token",
@@ -283,7 +276,6 @@ class TestInitRemoteRepo:
283
276
  old_repo_info = RemoteRepoInfo(repo_type="remote", repo_name="old-name")
284
277
  new_repo_info = RemoteRepoInfo(repo_type="remote", repo_name="new-name")
285
278
  our_repo_creds = RemoteRepoCreds(
286
- protocol=RepoProtocol.HTTPS,
287
279
  clone_url="https://git.example.com/repo.git",
288
280
  private_key=None,
289
281
  oauth_token="our-oauth-token",
@@ -323,7 +315,6 @@ class TestInitRemoteRepo:
323
315
  creds=None,
324
316
  )
325
317
  old_repo_creds = RemoteRepoCreds(
326
- protocol=RepoProtocol.HTTPS,
327
318
  clone_url="https://git.example.com/repo.git",
328
319
  private_key=None,
329
320
  oauth_token="oauth-token",
@@ -335,7 +326,6 @@ class TestInitRemoteRepo:
335
326
  creds=old_repo_creds.dict(),
336
327
  )
337
328
  new_repo_creds = RemoteRepoCreds(
338
- protocol=RepoProtocol.HTTPS,
339
329
  clone_url="ssh://git@git.example.com/repo.git",
340
330
  private_key="private-key",
341
331
  oauth_token=None,
@@ -357,7 +347,6 @@ class TestInitRemoteRepo:
357
347
  ):
358
348
  repo_info = RemoteRepoInfo(repo_type="remote", repo_name="test")
359
349
  legacy_repo_creds = RemoteRepoCreds(
360
- protocol=RepoProtocol.HTTPS,
361
350
  clone_url="https://git.example.com/repo.git",
362
351
  private_key=None,
363
352
  oauth_token="legacy-oauth-token",
@@ -371,7 +360,6 @@ class TestInitRemoteRepo:
371
360
  creds=legacy_repo_creds.dict(),
372
361
  )
373
362
  our_repo_creds = RemoteRepoCreds(
374
- protocol=RepoProtocol.HTTPS,
375
363
  clone_url="https://git.example.com/repo.git",
376
364
  private_key=None,
377
365
  oauth_token="our-oauth-token",
@@ -384,7 +372,6 @@ class TestInitRemoteRepo:
384
372
  )
385
373
  another_user = await _create_user(session, project, name="another-user")
386
374
  another_user_repo_creds = RemoteRepoCreds(
387
- protocol=RepoProtocol.HTTPS,
388
375
  clone_url="https://git.example.com/repo.git",
389
376
  private_key=None,
390
377
  oauth_token="another-oauth-token",
@@ -15,7 +15,6 @@ from dstack._internal.server.services.jobs import check_can_attach_job_volumes
15
15
  from dstack._internal.server.services.runs import scale_run_replicas
16
16
  from dstack._internal.server.testing.common import (
17
17
  create_job,
18
- create_pool,
19
18
  create_project,
20
19
  create_repo,
21
20
  create_run,
@@ -39,9 +38,6 @@ async def make_run(
39
38
  session=session,
40
39
  project_id=project.id,
41
40
  )
42
- project.default_pool = await create_pool(
43
- session=session, project=project, pool_name="default-pool"
44
- )
45
41
  run_name = "test-run"
46
42
  profile = Profile(name="test-profile")
47
43
  run_spec = get_run_spec(