dstack 0.18.41__tar.gz → 0.18.42__tar.gz

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 (683) hide show
  1. {dstack-0.18.41 → dstack-0.18.42}/PKG-INFO +1 -1
  2. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/cli/utils/volume.py +9 -0
  3. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/backends/aws/compute.py +2 -1
  4. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/backends/gcp/compute.py +2 -1
  5. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/models/runs.py +3 -3
  6. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/models/volumes.py +23 -0
  7. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/background/tasks/process_instances.py +2 -3
  8. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/background/tasks/process_running_jobs.py +4 -0
  9. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/background/tasks/process_submitted_jobs.py +12 -7
  10. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/background/tasks/process_terminating_jobs.py +13 -2
  11. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/background/tasks/process_volumes.py +11 -1
  12. dstack-0.18.42/src/dstack/_internal/server/migrations/versions/a751ef183f27_move_attachment_data_to_volumes_.py +34 -0
  13. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/models.py +17 -19
  14. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/services/fleets.py +5 -1
  15. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/services/jobs/__init__.py +4 -4
  16. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/services/offers.py +7 -7
  17. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/services/pools.py +3 -3
  18. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/services/runner/client.py +8 -5
  19. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/services/volumes.py +68 -9
  20. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/testing/common.py +13 -9
  21. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/version.py +1 -1
  22. {dstack-0.18.41 → dstack-0.18.42}/src/dstack.egg-info/PKG-INFO +1 -1
  23. {dstack-0.18.41 → dstack-0.18.42}/src/dstack.egg-info/SOURCES.txt +2 -0
  24. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/server/background/tasks/test_process_running_jobs.py +1 -0
  25. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/server/background/tasks/test_process_submitted_jobs.py +5 -3
  26. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/server/background/tasks/test_process_terminating_jobs.py +11 -6
  27. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/server/routers/test_volumes.py +9 -2
  28. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/server/services/runner/test_client.py +22 -3
  29. dstack-0.18.42/src/tests/_internal/server/services/test_offers.py +167 -0
  30. dstack-0.18.42/src/tests/_internal/server/services/test_pools.py +191 -0
  31. dstack-0.18.41/src/tests/_internal/server/services/test_pools.py +0 -87
  32. {dstack-0.18.41 → dstack-0.18.42}/LICENSE.md +0 -0
  33. {dstack-0.18.41 → dstack-0.18.42}/README.md +0 -0
  34. {dstack-0.18.41 → dstack-0.18.42}/setup.cfg +0 -0
  35. {dstack-0.18.41 → dstack-0.18.42}/setup.py +0 -0
  36. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/__init__.py +0 -0
  37. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/__init__.py +0 -0
  38. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/cli/__init__.py +0 -0
  39. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/cli/commands/__init__.py +0 -0
  40. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/cli/commands/apply.py +0 -0
  41. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/cli/commands/attach.py +0 -0
  42. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/cli/commands/config.py +0 -0
  43. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/cli/commands/delete.py +0 -0
  44. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/cli/commands/fleet.py +0 -0
  45. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/cli/commands/gateway.py +0 -0
  46. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/cli/commands/init.py +0 -0
  47. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/cli/commands/logs.py +0 -0
  48. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/cli/commands/pool.py +0 -0
  49. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/cli/commands/ps.py +0 -0
  50. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/cli/commands/run.py +0 -0
  51. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/cli/commands/server.py +0 -0
  52. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/cli/commands/stats.py +0 -0
  53. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/cli/commands/stop.py +0 -0
  54. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/cli/commands/volume.py +0 -0
  55. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/cli/main.py +0 -0
  56. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/cli/services/__init__.py +0 -0
  57. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/cli/services/args.py +0 -0
  58. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/cli/services/configurators/__init__.py +0 -0
  59. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/cli/services/configurators/base.py +0 -0
  60. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/cli/services/configurators/fleet.py +0 -0
  61. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/cli/services/configurators/gateway.py +0 -0
  62. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/cli/services/configurators/run.py +0 -0
  63. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/cli/services/configurators/volume.py +0 -0
  64. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/cli/services/profile.py +0 -0
  65. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/cli/services/repos.py +0 -0
  66. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/cli/utils/__init__.py +0 -0
  67. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/cli/utils/common.py +0 -0
  68. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/cli/utils/fleet.py +0 -0
  69. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/cli/utils/gateway.py +0 -0
  70. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/cli/utils/rich.py +0 -0
  71. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/cli/utils/run.py +0 -0
  72. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/cli/utils/updates.py +0 -0
  73. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/compat.py +0 -0
  74. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/__init__.py +0 -0
  75. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/backends/__init__.py +0 -0
  76. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/backends/aws/__init__.py +0 -0
  77. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/backends/aws/auth.py +0 -0
  78. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/backends/aws/config.py +0 -0
  79. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/backends/aws/resources.py +0 -0
  80. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/backends/azure/__init__.py +0 -0
  81. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/backends/azure/auth.py +0 -0
  82. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/backends/azure/compute.py +0 -0
  83. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/backends/azure/config.py +0 -0
  84. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/backends/azure/resources.py +0 -0
  85. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/backends/azure/utils.py +0 -0
  86. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/backends/base/__init__.py +0 -0
  87. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/backends/base/compute.py +0 -0
  88. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/backends/base/config.py +0 -0
  89. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/backends/base/offers.py +0 -0
  90. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/backends/cudo/__init__.py +0 -0
  91. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/backends/cudo/api_client.py +0 -0
  92. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/backends/cudo/compute.py +0 -0
  93. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/backends/cudo/config.py +0 -0
  94. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/backends/datacrunch/__init__.py +0 -0
  95. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/backends/datacrunch/api_client.py +0 -0
  96. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/backends/datacrunch/compute.py +0 -0
  97. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/backends/datacrunch/config.py +0 -0
  98. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/backends/gcp/__init__.py +0 -0
  99. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/backends/gcp/auth.py +0 -0
  100. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/backends/gcp/config.py +0 -0
  101. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/backends/gcp/resources.py +0 -0
  102. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/backends/kubernetes/__init__.py +0 -0
  103. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/backends/kubernetes/compute.py +0 -0
  104. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/backends/kubernetes/config.py +0 -0
  105. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/backends/kubernetes/utils.py +0 -0
  106. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/backends/lambdalabs/__init__.py +0 -0
  107. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/backends/lambdalabs/api_client.py +0 -0
  108. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/backends/lambdalabs/compute.py +0 -0
  109. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/backends/lambdalabs/config.py +0 -0
  110. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/backends/local/__init__.py +0 -0
  111. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/backends/local/compute.py +0 -0
  112. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/backends/nebius/__init__.py +0 -0
  113. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/backends/nebius/api_client.py +0 -0
  114. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/backends/nebius/compute.py +0 -0
  115. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/backends/nebius/config.py +0 -0
  116. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/backends/nebius/types.py +0 -0
  117. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/backends/oci/__init__.py +0 -0
  118. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/backends/oci/auth.py +0 -0
  119. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/backends/oci/compute.py +0 -0
  120. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/backends/oci/config.py +0 -0
  121. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/backends/oci/exceptions.py +0 -0
  122. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/backends/oci/region.py +0 -0
  123. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/backends/oci/resources.py +0 -0
  124. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/backends/remote/__init__.py +0 -0
  125. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/backends/remote/provisioning.py +0 -0
  126. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/backends/runpod/__init__.py +0 -0
  127. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/backends/runpod/api_client.py +0 -0
  128. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/backends/runpod/compute.py +0 -0
  129. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/backends/runpod/config.py +0 -0
  130. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/backends/tensordock/__init__.py +0 -0
  131. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/backends/tensordock/api_client.py +0 -0
  132. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/backends/tensordock/compute.py +0 -0
  133. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/backends/tensordock/config.py +0 -0
  134. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/backends/vastai/__init__.py +0 -0
  135. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/backends/vastai/api_client.py +0 -0
  136. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/backends/vastai/compute.py +0 -0
  137. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/backends/vastai/config.py +0 -0
  138. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/backends/vultr/__init__.py +0 -0
  139. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/backends/vultr/api_client.py +0 -0
  140. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/backends/vultr/compute.py +0 -0
  141. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/backends/vultr/config.py +0 -0
  142. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/consts.py +0 -0
  143. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/errors.py +0 -0
  144. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/models/__init__.py +0 -0
  145. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/models/backends/__init__.py +0 -0
  146. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/models/backends/aws.py +0 -0
  147. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/models/backends/azure.py +0 -0
  148. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/models/backends/base.py +0 -0
  149. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/models/backends/cudo.py +0 -0
  150. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/models/backends/datacrunch.py +0 -0
  151. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/models/backends/dstack.py +0 -0
  152. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/models/backends/gcp.py +0 -0
  153. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/models/backends/kubernetes.py +0 -0
  154. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/models/backends/lambdalabs.py +0 -0
  155. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/models/backends/nebius.py +0 -0
  156. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/models/backends/oci.py +0 -0
  157. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/models/backends/runpod.py +0 -0
  158. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/models/backends/tensordock.py +0 -0
  159. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/models/backends/vastai.py +0 -0
  160. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/models/backends/vultr.py +0 -0
  161. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/models/common.py +0 -0
  162. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/models/config.py +0 -0
  163. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/models/configurations.py +0 -0
  164. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/models/envs.py +0 -0
  165. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/models/fleets.py +0 -0
  166. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/models/gateways.py +0 -0
  167. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/models/instances.py +0 -0
  168. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/models/logs.py +0 -0
  169. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/models/metrics.py +0 -0
  170. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/models/placement.py +0 -0
  171. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/models/pools.py +0 -0
  172. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/models/profiles.py +0 -0
  173. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/models/projects.py +0 -0
  174. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/models/repos/__init__.py +0 -0
  175. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/models/repos/base.py +0 -0
  176. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/models/repos/local.py +0 -0
  177. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/models/repos/remote.py +0 -0
  178. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/models/repos/virtual.py +0 -0
  179. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/models/resources.py +0 -0
  180. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/models/secrets.py +0 -0
  181. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/models/server.py +0 -0
  182. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/models/services.py +0 -0
  183. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/models/unix.py +0 -0
  184. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/models/users.py +0 -0
  185. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/services/__init__.py +0 -0
  186. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/services/api_client.py +0 -0
  187. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/services/configs/__init__.py +0 -0
  188. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/services/diff.py +0 -0
  189. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/services/logs.py +0 -0
  190. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/services/profiles.py +0 -0
  191. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/services/repos.py +0 -0
  192. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/services/ssh/__init__.py +0 -0
  193. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/services/ssh/attach.py +0 -0
  194. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/services/ssh/client.py +0 -0
  195. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/services/ssh/ports.py +0 -0
  196. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/core/services/ssh/tunnel.py +0 -0
  197. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/proxy/__init__.py +0 -0
  198. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/proxy/gateway/__init__.py +0 -0
  199. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/proxy/gateway/app.py +0 -0
  200. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/proxy/gateway/auth.py +0 -0
  201. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/proxy/gateway/const.py +0 -0
  202. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/proxy/gateway/deps.py +0 -0
  203. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/proxy/gateway/main.py +0 -0
  204. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/proxy/gateway/models.py +0 -0
  205. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/proxy/gateway/repo/__init__.py +0 -0
  206. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/proxy/gateway/repo/repo.py +0 -0
  207. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/proxy/gateway/repo/state_v1.py +0 -0
  208. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/proxy/gateway/resources/nginx/00-log-format.conf +0 -0
  209. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/proxy/gateway/resources/nginx/entrypoint.jinja2 +0 -0
  210. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/proxy/gateway/resources/nginx/service.jinja2 +0 -0
  211. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/proxy/gateway/routers/__init__.py +0 -0
  212. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/proxy/gateway/routers/auth.py +0 -0
  213. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/proxy/gateway/routers/config.py +0 -0
  214. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/proxy/gateway/routers/registry.py +0 -0
  215. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/proxy/gateway/routers/stats.py +0 -0
  216. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/proxy/gateway/schemas/__init__.py +0 -0
  217. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/proxy/gateway/schemas/common.py +0 -0
  218. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/proxy/gateway/schemas/config.py +0 -0
  219. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/proxy/gateway/schemas/registry.py +0 -0
  220. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/proxy/gateway/schemas/stats.py +0 -0
  221. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/proxy/gateway/services/__init__.py +0 -0
  222. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/proxy/gateway/services/nginx.py +0 -0
  223. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/proxy/gateway/services/registry.py +0 -0
  224. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/proxy/gateway/services/server_client.py +0 -0
  225. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/proxy/gateway/services/stats.py +0 -0
  226. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/proxy/gateway/testing/__init__.py +0 -0
  227. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/proxy/gateway/testing/common.py +0 -0
  228. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/proxy/lib/__init__.py +0 -0
  229. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/proxy/lib/auth.py +0 -0
  230. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/proxy/lib/deps.py +0 -0
  231. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/proxy/lib/errors.py +0 -0
  232. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/proxy/lib/models.py +0 -0
  233. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/proxy/lib/repo.py +0 -0
  234. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/proxy/lib/routers/__init__.py +0 -0
  235. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/proxy/lib/routers/model_proxy.py +0 -0
  236. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/proxy/lib/schemas/__init__.py +0 -0
  237. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/proxy/lib/schemas/model_proxy.py +0 -0
  238. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/proxy/lib/services/__init__.py +0 -0
  239. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/proxy/lib/services/model_proxy/__init__.py +0 -0
  240. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/proxy/lib/services/model_proxy/clients/__init__.py +0 -0
  241. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/proxy/lib/services/model_proxy/clients/base.py +0 -0
  242. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/proxy/lib/services/model_proxy/clients/openai.py +0 -0
  243. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/proxy/lib/services/model_proxy/clients/tgi.py +0 -0
  244. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/proxy/lib/services/model_proxy/model_proxy.py +0 -0
  245. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/proxy/lib/services/service_connection.py +0 -0
  246. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/proxy/lib/testing/__init__.py +0 -0
  247. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/proxy/lib/testing/auth.py +0 -0
  248. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/proxy/lib/testing/common.py +0 -0
  249. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/__init__.py +0 -0
  250. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/app.py +0 -0
  251. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/background/__init__.py +0 -0
  252. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/background/tasks/__init__.py +0 -0
  253. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/background/tasks/process_fleets.py +0 -0
  254. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/background/tasks/process_gateways.py +0 -0
  255. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/background/tasks/process_metrics.py +0 -0
  256. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/background/tasks/process_placement_groups.py +0 -0
  257. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/background/tasks/process_runs.py +0 -0
  258. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/db.py +0 -0
  259. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/deps.py +0 -0
  260. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/main.py +0 -0
  261. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/migrations/__init__.py +0 -0
  262. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/migrations/env.py +0 -0
  263. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/migrations/versions/065588ec72b8_add_vultr_to_backendtype_enum.py +0 -0
  264. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/migrations/versions/0e33559e16ed_update_instancestatus.py +0 -0
  265. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/migrations/versions/112753bc17dd_remove_nullable_fields.py +0 -0
  266. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/migrations/versions/1338b788b612_reverse_job_instance_relationship.py +0 -0
  267. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/migrations/versions/14f2cb002fc2_add_jobmodel_removed_flag.py +0 -0
  268. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/migrations/versions/1a48dfe44a40_rework_termination_handling.py +0 -0
  269. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/migrations/versions/1e3fb39ef74b_add_remote_connection_details.py +0 -0
  270. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/migrations/versions/1e76fb0dde87_add_jobmodel_inactivity_secs.py +0 -0
  271. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/migrations/versions/23e01c56279a_make_blob_nullable.py +0 -0
  272. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/migrations/versions/252d3743b641_.py +0 -0
  273. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/migrations/versions/27d3e55759fa_add_pools.py +0 -0
  274. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/migrations/versions/29826f417010_remove_instancemodel_retry_policy.py +0 -0
  275. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/migrations/versions/29c08c6a8cb3_.py +0 -0
  276. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/migrations/versions/3cf77fb8bcf1_store_repo_clone_url.py +0 -0
  277. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/migrations/versions/3dbdce90d0e0_fix_code_uq_constraint.py +0 -0
  278. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/migrations/versions/48ad3ecbaea2_do_not_delete_projects_and_runs.py +0 -0
  279. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/migrations/versions/4ae1a5b0e7f1_add_run_list_index.py +0 -0
  280. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/migrations/versions/4b4319398164_introduce_runs_processing.py +0 -0
  281. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/migrations/versions/51d45659d574_add_instancemodel_blocks_fields.py +0 -0
  282. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/migrations/versions/54a77e19c64c_add_manager_project_role.py +0 -0
  283. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/migrations/versions/555138b1f77f_change_instancemodel_for_asynchronous_.py +0 -0
  284. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/migrations/versions/58aa5162dcc3_add_gatewaymodel_configuration.py +0 -0
  285. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/migrations/versions/5ad8debc8fe6_fixes_for_psql.py +0 -0
  286. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/migrations/versions/5ec538b70e71_replace_instansestatus.py +0 -0
  287. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/migrations/versions/63c3f19cb184_add_jobterminationreason_inactivity_.py +0 -0
  288. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/migrations/versions/686fb8341ea5_add_user_emails.py +0 -0
  289. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/migrations/versions/710e5b3fac8f_add_encryption.py +0 -0
  290. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/migrations/versions/7b24b1c8eba7_add_instancemodel_last_processed_at.py +0 -0
  291. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/migrations/versions/803c7e9ed85d_add_jobmodel_job_runtime_data.py +0 -0
  292. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/migrations/versions/82b32a135ea2_.py +0 -0
  293. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/migrations/versions/866ec1d67184_replace_retrypolicy_limit_with_.py +0 -0
  294. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/migrations/versions/91a12fff6c76_add_repocredsmodel.py +0 -0
  295. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/migrations/versions/91ac5e543037_extend_repos_creds_column.py +0 -0
  296. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/migrations/versions/98cd9c8b5927_add_volumemodel.py +0 -0
  297. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/migrations/versions/99b4c8c954ea_add_termination_reason_message.py +0 -0
  298. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/migrations/versions/9eea6af28e10_added_fail_reason_for_instancemodel.py +0 -0
  299. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/migrations/versions/__init__.py +0 -0
  300. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/migrations/versions/a060e2440936_.py +0 -0
  301. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/migrations/versions/a7b46c073fa1_add_placementgroupmodel.py +0 -0
  302. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/migrations/versions/afbc600ff2b2_add_created_at_to_usermodel_and_.py +0 -0
  303. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/migrations/versions/b4d6ad60db08_add_instancemodel_unreachable.py +0 -0
  304. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/migrations/versions/b88d55c2a07d_replace_instancestatus_ready.py +0 -0
  305. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/migrations/versions/bfba43f6def2_.py +0 -0
  306. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/migrations/versions/c00090eaef21_support_fleets.py +0 -0
  307. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/migrations/versions/c154eece89da_add_fields_for_async_gateway_creation.py +0 -0
  308. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/migrations/versions/c20626d03cfb_add_jobmetricspoint.py +0 -0
  309. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/migrations/versions/c48df7985d57_add_instance_termination_retries.py +0 -0
  310. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/migrations/versions/c83d45f9a971_replace_string_with_text.py +0 -0
  311. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/migrations/versions/d0bb68e48b9f_add_project_owners_and_quotas.py +0 -0
  312. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/migrations/versions/d3e8af4786fa_gateway_compute_flag_deleted.py +0 -0
  313. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/migrations/versions/d6b11105f659_add_usermodel_active.py +0 -0
  314. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/migrations/versions/da574e93fee0_add_jobmodel_volumes_detached_at.py +0 -0
  315. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/migrations/versions/dfffd6a1165c_add_fields_for_gateways_behind_alb.py +0 -0
  316. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/migrations/versions/e3b7db07727f_add_gatewaycomputemodel_app_updated_at.py +0 -0
  317. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/migrations/versions/e6391ca6a264_separate_gateways_from_compute.py +0 -0
  318. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/migrations/versions/ea60480f82bb_add_membermodel_member_num.py +0 -0
  319. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/migrations/versions/ed0ca30e13bb_migrate_instancestatus_provisioning.py +0 -0
  320. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/migrations/versions/fe72c4de8376_add_gateways.py +0 -0
  321. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/migrations/versions/ffa99edd1988_add_jobterminationreason_max_duration_.py +0 -0
  322. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/routers/__init__.py +0 -0
  323. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/routers/backends.py +0 -0
  324. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/routers/fleets.py +0 -0
  325. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/routers/gateways.py +0 -0
  326. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/routers/instances.py +0 -0
  327. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/routers/logs.py +0 -0
  328. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/routers/metrics.py +0 -0
  329. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/routers/pools.py +0 -0
  330. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/routers/projects.py +0 -0
  331. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/routers/repos.py +0 -0
  332. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/routers/runs.py +0 -0
  333. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/routers/secrets.py +0 -0
  334. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/routers/server.py +0 -0
  335. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/routers/users.py +0 -0
  336. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/routers/volumes.py +0 -0
  337. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/schemas/__init__.py +0 -0
  338. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/schemas/backends.py +0 -0
  339. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/schemas/common.py +0 -0
  340. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/schemas/fleets.py +0 -0
  341. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/schemas/gateways.py +0 -0
  342. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/schemas/instances.py +0 -0
  343. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/schemas/logs.py +0 -0
  344. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/schemas/pools.py +0 -0
  345. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/schemas/projects.py +0 -0
  346. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/schemas/repos.py +0 -0
  347. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/schemas/runner.py +0 -0
  348. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/schemas/runs.py +0 -0
  349. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/schemas/secrets.py +0 -0
  350. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/schemas/users.py +0 -0
  351. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/schemas/volumes.py +0 -0
  352. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/security/__init__.py +0 -0
  353. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/security/permissions.py +0 -0
  354. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/services/__init__.py +0 -0
  355. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/services/backends/__init__.py +0 -0
  356. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/services/backends/configurators/__init__.py +0 -0
  357. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/services/backends/configurators/aws.py +0 -0
  358. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/services/backends/configurators/azure.py +0 -0
  359. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/services/backends/configurators/base.py +0 -0
  360. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/services/backends/configurators/cudo.py +0 -0
  361. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/services/backends/configurators/datacrunch.py +0 -0
  362. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/services/backends/configurators/gcp.py +0 -0
  363. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/services/backends/configurators/kubernetes.py +0 -0
  364. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/services/backends/configurators/lambdalabs.py +0 -0
  365. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/services/backends/configurators/nebius.py +0 -0
  366. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/services/backends/configurators/oci.py +0 -0
  367. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/services/backends/configurators/runpod.py +0 -0
  368. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/services/backends/configurators/tensordock.py +0 -0
  369. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/services/backends/configurators/vastai.py +0 -0
  370. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/services/backends/configurators/vultr.py +0 -0
  371. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/services/backends/handlers.py +0 -0
  372. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/services/config.py +0 -0
  373. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/services/docker.py +0 -0
  374. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/services/encryption/__init__.py +0 -0
  375. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/services/encryption/keys/__init__.py +0 -0
  376. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/services/encryption/keys/aes.py +0 -0
  377. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/services/encryption/keys/base.py +0 -0
  378. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/services/encryption/keys/identity.py +0 -0
  379. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/services/gateways/__init__.py +0 -0
  380. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/services/gateways/client.py +0 -0
  381. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/services/gateways/connection.py +0 -0
  382. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/services/gateways/pool.py +0 -0
  383. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/services/jobs/configurators/__init__.py +0 -0
  384. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/services/jobs/configurators/base.py +0 -0
  385. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/services/jobs/configurators/dev.py +0 -0
  386. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/services/jobs/configurators/extensions/__init__.py +0 -0
  387. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/services/jobs/configurators/extensions/base.py +0 -0
  388. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/services/jobs/configurators/extensions/vscode.py +0 -0
  389. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/services/jobs/configurators/service.py +0 -0
  390. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/services/jobs/configurators/task.py +0 -0
  391. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/services/locking.py +0 -0
  392. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/services/logging.py +0 -0
  393. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/services/logs.py +0 -0
  394. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/services/metrics.py +0 -0
  395. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/services/permissions.py +0 -0
  396. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/services/placement.py +0 -0
  397. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/services/projects.py +0 -0
  398. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/services/proxy/__init__.py +0 -0
  399. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/services/proxy/auth.py +0 -0
  400. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/services/proxy/deps.py +0 -0
  401. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/services/proxy/repo.py +0 -0
  402. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/services/proxy/routers/__init__.py +0 -0
  403. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/services/proxy/routers/service_proxy.py +0 -0
  404. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/services/proxy/services/__init__.py +0 -0
  405. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/services/proxy/services/service_proxy.py +0 -0
  406. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/services/repos.py +0 -0
  407. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/services/runner/__init__.py +0 -0
  408. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/services/runner/ssh.py +0 -0
  409. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/services/runs.py +0 -0
  410. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/services/services/__init__.py +0 -0
  411. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/services/services/autoscalers.py +0 -0
  412. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/services/services/options.py +0 -0
  413. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/services/storage.py +0 -0
  414. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/services/users.py +0 -0
  415. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/settings.py +0 -0
  416. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/00a6e1fb461ed2929fb9.png +0 -0
  417. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/0cae4d9f0a36034984a7.png +0 -0
  418. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/391de232cc0e30cae513.png +0 -0
  419. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/4e0eead8c1a73689ef9d.svg +0 -0
  420. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/544afa2f63428c2235b0.png +0 -0
  421. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/54a4f50f74c6b9381530.svg +0 -0
  422. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/68dd1360a7d2611e0132.svg +0 -0
  423. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/69544b4c81973b54a66f.png +0 -0
  424. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/77a8b02b17af19e39266.png +0 -0
  425. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/83a93a8871c219104367.svg +0 -0
  426. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/8f28bb8e9999e5e6a48b.svg +0 -0
  427. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/9124086961ab8c366bc4.svg +0 -0
  428. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/9a9ebaeb54b025dbac0a.svg +0 -0
  429. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/a3428392dc534f3b15c4.svg +0 -0
  430. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/ae22625574d69361f72c.png +0 -0
  431. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/assets/android-chrome-144x144.png +0 -0
  432. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/assets/android-chrome-192x192.png +0 -0
  433. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/assets/android-chrome-256x256.png +0 -0
  434. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/assets/android-chrome-36x36.png +0 -0
  435. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/assets/android-chrome-384x384.png +0 -0
  436. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/assets/android-chrome-48x48.png +0 -0
  437. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/assets/android-chrome-512x512.png +0 -0
  438. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/assets/android-chrome-72x72.png +0 -0
  439. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/assets/android-chrome-96x96.png +0 -0
  440. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/assets/apple-touch-icon-1024x1024.png +0 -0
  441. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/assets/apple-touch-icon-114x114.png +0 -0
  442. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/assets/apple-touch-icon-120x120.png +0 -0
  443. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/assets/apple-touch-icon-144x144.png +0 -0
  444. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/assets/apple-touch-icon-152x152.png +0 -0
  445. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/assets/apple-touch-icon-167x167.png +0 -0
  446. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/assets/apple-touch-icon-180x180.png +0 -0
  447. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/assets/apple-touch-icon-57x57.png +0 -0
  448. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/assets/apple-touch-icon-60x60.png +0 -0
  449. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/assets/apple-touch-icon-72x72.png +0 -0
  450. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/assets/apple-touch-icon-76x76.png +0 -0
  451. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/assets/apple-touch-icon-precomposed.png +0 -0
  452. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/assets/apple-touch-icon.png +0 -0
  453. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/assets/apple-touch-startup-image-1125x2436.png +0 -0
  454. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/assets/apple-touch-startup-image-1136x640.png +0 -0
  455. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/assets/apple-touch-startup-image-1170x2532.png +0 -0
  456. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/assets/apple-touch-startup-image-1179x2556.png +0 -0
  457. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/assets/apple-touch-startup-image-1242x2208.png +0 -0
  458. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/assets/apple-touch-startup-image-1242x2688.png +0 -0
  459. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/assets/apple-touch-startup-image-1284x2778.png +0 -0
  460. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/assets/apple-touch-startup-image-1290x2796.png +0 -0
  461. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/assets/apple-touch-startup-image-1334x750.png +0 -0
  462. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/assets/apple-touch-startup-image-1488x2266.png +0 -0
  463. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/assets/apple-touch-startup-image-1536x2048.png +0 -0
  464. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/assets/apple-touch-startup-image-1620x2160.png +0 -0
  465. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/assets/apple-touch-startup-image-1640x2160.png +0 -0
  466. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/assets/apple-touch-startup-image-1668x2224.png +0 -0
  467. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/assets/apple-touch-startup-image-1668x2388.png +0 -0
  468. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/assets/apple-touch-startup-image-1792x828.png +0 -0
  469. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/assets/apple-touch-startup-image-2048x1536.png +0 -0
  470. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/assets/apple-touch-startup-image-2048x2732.png +0 -0
  471. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/assets/apple-touch-startup-image-2160x1620.png +0 -0
  472. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/assets/apple-touch-startup-image-2160x1640.png +0 -0
  473. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/assets/apple-touch-startup-image-2208x1242.png +0 -0
  474. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/assets/apple-touch-startup-image-2224x1668.png +0 -0
  475. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/assets/apple-touch-startup-image-2266x1488.png +0 -0
  476. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/assets/apple-touch-startup-image-2388x1668.png +0 -0
  477. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/assets/apple-touch-startup-image-2436x1125.png +0 -0
  478. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/assets/apple-touch-startup-image-2532x1170.png +0 -0
  479. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/assets/apple-touch-startup-image-2556x1179.png +0 -0
  480. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/assets/apple-touch-startup-image-2688x1242.png +0 -0
  481. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/assets/apple-touch-startup-image-2732x2048.png +0 -0
  482. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/assets/apple-touch-startup-image-2778x1284.png +0 -0
  483. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/assets/apple-touch-startup-image-2796x1290.png +0 -0
  484. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/assets/apple-touch-startup-image-640x1136.png +0 -0
  485. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/assets/apple-touch-startup-image-750x1334.png +0 -0
  486. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/assets/apple-touch-startup-image-828x1792.png +0 -0
  487. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/assets/browserconfig.xml +0 -0
  488. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/assets/favicon-16x16.png +0 -0
  489. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/assets/favicon-32x32.png +0 -0
  490. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/assets/favicon-48x48.png +0 -0
  491. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/assets/favicon.ico +0 -0
  492. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/assets/manifest.webmanifest +0 -0
  493. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/assets/mstile-144x144.png +0 -0
  494. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/assets/mstile-150x150.png +0 -0
  495. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/assets/mstile-310x150.png +0 -0
  496. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/assets/mstile-310x310.png +0 -0
  497. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/assets/mstile-70x70.png +0 -0
  498. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/assets/yandex-browser-50x50.png +0 -0
  499. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/assets/yandex-browser-manifest.json +0 -0
  500. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/b7ae68f44193474fc578.png +0 -0
  501. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/d2f008c75b2b5b191f3f.png +0 -0
  502. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/d44c33e1b92e05c379fd.png +0 -0
  503. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/dd43ff0552815179d7ab.png +0 -0
  504. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/dd4e7166c0b9aac197d7.png +0 -0
  505. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/e30b27916930d43d2271.png +0 -0
  506. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/e467d7d60aae81ab198b.svg +0 -0
  507. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/eb9b344b73818fe2b71a.png +0 -0
  508. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/f517dd626eb964120de0.png +0 -0
  509. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/f958aecddee5d8e3222c.png +0 -0
  510. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/index.html +0 -0
  511. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/main-2ac66bfcbd2e39830b88.js +0 -0
  512. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/main-2ac66bfcbd2e39830b88.js.map +0 -0
  513. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/main-ad5150a441de98cd8987.css +0 -0
  514. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/manifest.json +0 -0
  515. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/robots.txt +0 -0
  516. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/static/media/github.1f7102513534c83a9d8d735d2b8c12a2.svg +0 -0
  517. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/static/media/logo.f602feeb138844eda97c8cb641461448.svg +0 -0
  518. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/static/media/okta.12f178e6873a1100965f2a4dbd18fcec.svg +0 -0
  519. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/statics/static/media/theme.3994c817bb7dda191c1c9640dee0bf42.svg +0 -0
  520. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/testing/__init__.py +0 -0
  521. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/testing/conf.py +0 -0
  522. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/utils/__init__.py +0 -0
  523. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/utils/common.py +0 -0
  524. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/utils/logging.py +0 -0
  525. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/server/utils/routers.py +0 -0
  526. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/settings.py +0 -0
  527. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/utils/__init__.py +0 -0
  528. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/utils/common.py +0 -0
  529. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/utils/crypto.py +0 -0
  530. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/utils/dxf.py +0 -0
  531. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/utils/env.py +0 -0
  532. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/utils/gpu.py +0 -0
  533. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/utils/hash.py +0 -0
  534. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/utils/ignore.py +0 -0
  535. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/utils/interpolator.py +0 -0
  536. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/utils/logging.py +0 -0
  537. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/utils/network.py +0 -0
  538. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/utils/path.py +0 -0
  539. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/utils/random_names.py +0 -0
  540. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/_internal/utils/ssh.py +0 -0
  541. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/api/__init__.py +0 -0
  542. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/api/_public/__init__.py +0 -0
  543. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/api/_public/backends.py +0 -0
  544. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/api/_public/pools.py +0 -0
  545. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/api/_public/repos.py +0 -0
  546. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/api/_public/resources.py +0 -0
  547. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/api/_public/runs.py +0 -0
  548. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/api/huggingface/__init__.py +0 -0
  549. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/api/server/__init__.py +0 -0
  550. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/api/server/_backends.py +0 -0
  551. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/api/server/_fleets.py +0 -0
  552. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/api/server/_gateways.py +0 -0
  553. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/api/server/_group.py +0 -0
  554. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/api/server/_logs.py +0 -0
  555. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/api/server/_metrics.py +0 -0
  556. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/api/server/_pools.py +0 -0
  557. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/api/server/_projects.py +0 -0
  558. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/api/server/_repos.py +0 -0
  559. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/api/server/_runs.py +0 -0
  560. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/api/server/_secrets.py +0 -0
  561. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/api/server/_users.py +0 -0
  562. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/api/server/_volumes.py +0 -0
  563. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/api/server/utils.py +0 -0
  564. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/api/utils.py +0 -0
  565. {dstack-0.18.41 → dstack-0.18.42}/src/dstack/core/__init__.py +0 -0
  566. {dstack-0.18.41 → dstack-0.18.42}/src/dstack.egg-info/dependency_links.txt +0 -0
  567. {dstack-0.18.41 → dstack-0.18.42}/src/dstack.egg-info/entry_points.txt +0 -0
  568. {dstack-0.18.41 → dstack-0.18.42}/src/dstack.egg-info/requires.txt +0 -0
  569. {dstack-0.18.41 → dstack-0.18.42}/src/dstack.egg-info/top_level.txt +0 -0
  570. {dstack-0.18.41 → dstack-0.18.42}/src/tests/__init__.py +0 -0
  571. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/__init__.py +0 -0
  572. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/cli/__init__.py +0 -0
  573. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/cli/commands/__init__.py +0 -0
  574. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/cli/commands/test_config.py +0 -0
  575. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/cli/commands/test_dstack.py +0 -0
  576. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/cli/common.py +0 -0
  577. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/cli/services/__init__.py +0 -0
  578. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/cli/services/configurators/__init__.py +0 -0
  579. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/cli/services/configurators/test_fleet.py +0 -0
  580. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/cli/services/configurators/test_profile.py +0 -0
  581. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/cli/services/configurators/test_run.py +0 -0
  582. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/core/__init__.py +0 -0
  583. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/core/backends/__init__.py +0 -0
  584. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/core/backends/aws/__init__.py +0 -0
  585. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/core/backends/aws/test_resources.py +0 -0
  586. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/core/backends/azure/__init__.py +0 -0
  587. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/core/backends/azure/test_compute.py +0 -0
  588. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/core/backends/azure/test_resources.py +0 -0
  589. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/core/backends/gcp/__init__.py +0 -0
  590. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/core/backends/gcp/test_resources.py +0 -0
  591. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/core/backends/kubernetes/__init__.py +0 -0
  592. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/core/backends/kubernetes/test_compute.py +0 -0
  593. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/core/backends/oci/__init__.py +0 -0
  594. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/core/backends/oci/test_resources.py +0 -0
  595. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/core/models/__init__.py +0 -0
  596. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/core/models/repos/__init__.py +0 -0
  597. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/core/models/repos/test_remote.py +0 -0
  598. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/core/models/test_configurations.py +0 -0
  599. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/core/models/test_instances.py +0 -0
  600. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/core/models/test_resources.py +0 -0
  601. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/core/models/test_runs.py +0 -0
  602. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/core/models/test_unix.py +0 -0
  603. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/core/models/test_volumes.py +0 -0
  604. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/core/services/__init__.py +0 -0
  605. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/core/services/ssh/__init__.py +0 -0
  606. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/core/services/ssh/test_client.py +0 -0
  607. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/core/services/ssh/test_tunnel.py +0 -0
  608. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/core/services/test_logs.py +0 -0
  609. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/proxy/__init__.py +0 -0
  610. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/proxy/gateway/__init__.py +0 -0
  611. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/proxy/gateway/conftest.py +0 -0
  612. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/proxy/gateway/repo/__init__.py +0 -0
  613. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/proxy/gateway/repo/test_repo.py +0 -0
  614. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/proxy/gateway/repo/test_state_v1.py +0 -0
  615. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/proxy/gateway/routers/__init__.py +0 -0
  616. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/proxy/gateway/routers/test_registry.py +0 -0
  617. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/proxy/gateway/routers/test_stats.py +0 -0
  618. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/proxy/gateway/services/__init__.py +0 -0
  619. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/proxy/gateway/services/test_stats.py +0 -0
  620. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/proxy/gateway/test_app.py +0 -0
  621. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/proxy/lib/__init__.py +0 -0
  622. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/proxy/lib/routers/__init__.py +0 -0
  623. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/proxy/lib/routers/test_model_proxy.py +0 -0
  624. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/server/__init__.py +0 -0
  625. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/server/background/__init__.py +0 -0
  626. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/server/background/tasks/__init__.py +0 -0
  627. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/server/background/tasks/test_process_fleets.py +0 -0
  628. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/server/background/tasks/test_process_gateways.py +0 -0
  629. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/server/background/tasks/test_process_instances.py +0 -0
  630. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/server/background/tasks/test_process_metrics.py +0 -0
  631. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/server/background/tasks/test_process_placement_groups.py +0 -0
  632. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/server/background/tasks/test_process_runs.py +0 -0
  633. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/server/background/tasks/test_process_submitted_volumes.py +0 -0
  634. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/server/conftest.py +0 -0
  635. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/server/routers/__init__.py +0 -0
  636. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/server/routers/test_backends.py +0 -0
  637. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/server/routers/test_fleets.py +0 -0
  638. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/server/routers/test_gateways.py +0 -0
  639. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/server/routers/test_instances.py +0 -0
  640. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/server/routers/test_logs.py +0 -0
  641. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/server/routers/test_metrics.py +0 -0
  642. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/server/routers/test_pools.py +0 -0
  643. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/server/routers/test_projects.py +0 -0
  644. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/server/routers/test_repos.py +0 -0
  645. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/server/routers/test_runs.py +0 -0
  646. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/server/routers/test_server.py +0 -0
  647. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/server/routers/test_users.py +0 -0
  648. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/server/services/__init__.py +0 -0
  649. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/server/services/encryption/__init__.py +0 -0
  650. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/server/services/encryption/keys/__init__.py +0 -0
  651. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/server/services/encryption/keys/test_aes.py +0 -0
  652. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/server/services/encryption/test_encryption.py +0 -0
  653. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/server/services/jobs/__init__.py +0 -0
  654. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/server/services/jobs/configurators/__init__.py +0 -0
  655. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/server/services/jobs/configurators/test_base.py +0 -0
  656. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/server/services/proxy/__init__.py +0 -0
  657. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/server/services/proxy/routers/__init__.py +0 -0
  658. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/server/services/proxy/routers/test_service_proxy.py +0 -0
  659. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/server/services/runner/__init__.py +0 -0
  660. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/server/services/services/__init__.py +0 -0
  661. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/server/services/services/test_autoscalers.py +0 -0
  662. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/server/services/test_config.py +0 -0
  663. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/server/services/test_docker.py +0 -0
  664. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/server/services/test_fleets.py +0 -0
  665. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/server/services/test_logs.py +0 -0
  666. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/server/services/test_repos.py +0 -0
  667. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/server/services/test_runs.py +0 -0
  668. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/server/test_app.py +0 -0
  669. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/server/test_migrations.py +0 -0
  670. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/server/utils/__init__.py +0 -0
  671. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/server/utils/test_common.py +0 -0
  672. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/server/utils/test_routers.py +0 -0
  673. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/utils/__init__.py +0 -0
  674. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/utils/test_common.py +0 -0
  675. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/utils/test_env.py +0 -0
  676. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/utils/test_gpu.py +0 -0
  677. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/utils/test_interpolator.py +0 -0
  678. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/utils/test_network.py +0 -0
  679. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/utils/test_path.py +0 -0
  680. {dstack-0.18.41 → dstack-0.18.42}/src/tests/_internal/utils/test_ssh.py +0 -0
  681. {dstack-0.18.41 → dstack-0.18.42}/src/tests/api/__init__.py +0 -0
  682. {dstack-0.18.41 → dstack-0.18.42}/src/tests/api/test_utils.py +0 -0
  683. {dstack-0.18.41 → dstack-0.18.42}/src/tests/conftest.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dstack
3
- Version: 0.18.41
3
+ Version: 0.18.42
4
4
  Summary: dstack is an open-source orchestration engine for running AI workloads on any cloud or on-premises.
5
5
  Home-page: https://dstack.ai
6
6
  Author: Andrey Cheptsov
@@ -22,6 +22,8 @@ def get_volumes_table(
22
22
  if verbose:
23
23
  table.add_column("REGION")
24
24
  table.add_column("STATUS")
25
+ if verbose:
26
+ table.add_column("ATTACHED")
25
27
  table.add_column("CREATED")
26
28
  if verbose:
27
29
  table.add_column("ERROR")
@@ -37,11 +39,18 @@ def get_volumes_table(
37
39
  and volume.provisioning_data.availability_zone is not None
38
40
  ):
39
41
  region += f" ({volume.provisioning_data.availability_zone})"
42
+ attached = "-"
43
+ if volume.attachments is not None:
44
+ attached = ", ".join(
45
+ {va.instance.fleet_name for va in volume.attachments if va.instance.fleet_name}
46
+ )
47
+ attached = attached or "-"
40
48
  row = {
41
49
  "NAME": volume.name,
42
50
  "BACKEND": backend,
43
51
  "REGION": region,
44
52
  "STATUS": volume.status,
53
+ "ATTACHED": attached,
45
54
  "CREATED": format_date(volume.created_at),
46
55
  "ERROR": volume.status_message,
47
56
  }
@@ -635,11 +635,12 @@ class AWSCompute(Compute):
635
635
  ec2_client = self.session.client("ec2", region_name=volume.configuration.region)
636
636
 
637
637
  logger.debug("Detaching EBS volume %s from instance %s", volume.volume_id, instance_id)
638
+ attachment_data = get_or_error(volume.get_attachment_data_for_instance(instance_id))
638
639
  try:
639
640
  ec2_client.detach_volume(
640
641
  VolumeId=volume.volume_id,
641
642
  InstanceId=instance_id,
642
- Device=get_or_error(volume.attachment_data).device_name,
643
+ Device=attachment_data.device_name,
643
644
  Force=force,
644
645
  )
645
646
  except botocore.exceptions.ClientError as e:
@@ -666,6 +666,7 @@ class GCPCompute(Compute):
666
666
  instance_id,
667
667
  )
668
668
  zone = get_or_error(volume.provisioning_data).availability_zone
669
+ attachment_data = get_or_error(volume.get_attachment_data_for_instance(instance_id))
669
670
  # This method has no information if the instance is a TPU or a VM,
670
671
  # so we first try to see if there is a TPU with such name
671
672
  try:
@@ -694,7 +695,7 @@ class GCPCompute(Compute):
694
695
  project=self.config.project_id,
695
696
  zone=get_or_error(volume.provisioning_data).availability_zone,
696
697
  instance=instance_id,
697
- device_name=get_or_error(volume.attachment_data).device_name,
698
+ device_name=attachment_data.device_name,
698
699
  )
699
700
  gcp_resources.wait_for_extended_operation(operation, "persistent disk detachment")
700
701
  logger.debug(
@@ -150,9 +150,9 @@ class JobTerminationReason(str, Enum):
150
150
  class Requirements(CoreModel):
151
151
  # TODO: Make requirements' fields required
152
152
  resources: ResourcesSpec
153
- max_price: Optional[float]
154
- spot: Optional[bool]
155
- reservation: Optional[str]
153
+ max_price: Optional[float] = None
154
+ spot: Optional[bool] = None
155
+ reservation: Optional[str] = None
156
156
 
157
157
  def pretty_format(self, resources_only: bool = False):
158
158
  res = self.resources.pretty_format()
@@ -71,6 +71,18 @@ class VolumeAttachmentData(CoreModel):
71
71
  device_name: Optional[str] = None
72
72
 
73
73
 
74
+ class VolumeInstance(CoreModel):
75
+ name: str
76
+ fleet_name: Optional[str] = None
77
+ instance_num: int
78
+ instance_id: Optional[str] = None
79
+
80
+
81
+ class VolumeAttachment(CoreModel):
82
+ instance: VolumeInstance
83
+ attachment_data: Optional[VolumeAttachmentData] = None
84
+
85
+
74
86
  class Volume(CoreModel):
75
87
  id: uuid.UUID
76
88
  name: str
@@ -86,8 +98,19 @@ class Volume(CoreModel):
86
98
  deleted: bool
87
99
  volume_id: Optional[str] = None # id of the volume in the cloud
88
100
  provisioning_data: Optional[VolumeProvisioningData] = None
101
+ attachments: Optional[List[VolumeAttachment]] = None
102
+ # attachment_data is deprecated in favor of attachments.
103
+ # It's only set for volumes that were attached before attachments.
89
104
  attachment_data: Optional[VolumeAttachmentData] = None
90
105
 
106
+ def get_attachment_data_for_instance(self, instance_id: str) -> Optional[VolumeAttachmentData]:
107
+ if self.attachments is not None:
108
+ for attachment in self.attachments:
109
+ if attachment.instance.instance_id == instance_id:
110
+ return attachment.attachment_data
111
+ # volume was attached before attachments were introduced
112
+ return self.attachment_data
113
+
91
114
 
92
115
  class VolumePlan(CoreModel):
93
116
  project_name: str
@@ -507,9 +507,9 @@ async def _create_instance(session: AsyncSession, instance: InstanceModel) -> No
507
507
  project=instance.project,
508
508
  profile=profile,
509
509
  requirements=requirements,
510
- exclude_not_available=True,
511
510
  fleet_model=instance.fleet,
512
511
  blocks="auto" if instance.total_blocks is None else instance.total_blocks,
512
+ exclude_not_available=True,
513
513
  )
514
514
 
515
515
  if not offers and should_retry:
@@ -915,9 +915,8 @@ def _get_instance_offer_for_instance(
915
915
  instance_offer.availability_zones = [
916
916
  z
917
917
  for z in instance_offer.availability_zones
918
- if instance_offer.availability_zones == master_job_provisioning_data.availability_zone
918
+ if z == master_job_provisioning_data.availability_zone
919
919
  ]
920
-
921
920
  return instance_offer
922
921
 
923
922
 
@@ -205,6 +205,7 @@ async def _process_running_job(session: AsyncSession, job_model: JobModel):
205
205
  None,
206
206
  run,
207
207
  job_model,
208
+ job_provisioning_data,
208
209
  volumes,
209
210
  secrets,
210
211
  job.job_spec.registry_auth,
@@ -376,6 +377,7 @@ def _process_provisioning_with_shim(
376
377
  ports: Dict[int, int],
377
378
  run: Run,
378
379
  job_model: JobModel,
380
+ job_provisioning_data: JobProvisioningData,
379
381
  volumes: List[Volume],
380
382
  secrets: Dict[str, str],
381
383
  registry_auth: Optional[RegistryAuth],
@@ -459,6 +461,7 @@ def _process_provisioning_with_shim(
459
461
  host_ssh_user=ssh_user,
460
462
  host_ssh_keys=[ssh_key] if ssh_key else [],
461
463
  container_ssh_keys=public_keys,
464
+ instance_id=job_provisioning_data.instance_id,
462
465
  )
463
466
  else:
464
467
  submitted = shim_client.submit(
@@ -475,6 +478,7 @@ def _process_provisioning_with_shim(
475
478
  mounts=volume_mounts,
476
479
  volumes=volumes,
477
480
  instance_mounts=instance_mounts,
481
+ instance_id=job_provisioning_data.instance_id,
478
482
  )
479
483
  if not submitted:
480
484
  # This can happen when we lost connection to the runner (e.g., network issues), marked
@@ -43,6 +43,7 @@ from dstack._internal.server.models import (
43
43
  PoolModel,
44
44
  ProjectModel,
45
45
  RunModel,
46
+ VolumeAttachmentModel,
46
47
  VolumeModel,
47
48
  )
48
49
  from dstack._internal.server.services.backends import get_project_backend_by_type_or_error
@@ -236,7 +237,7 @@ async def _process_submitted_job(session: AsyncSession, job_model: JobModel):
236
237
  res = await session.execute(
237
238
  select(InstanceModel)
238
239
  .where(InstanceModel.id == job_model.instance.id)
239
- .options(selectinload(InstanceModel.volumes))
240
+ .options(selectinload(InstanceModel.volume_attachments))
240
241
  .execution_options(populate_existing=True)
241
242
  )
242
243
  instance = res.unique().scalar_one()
@@ -390,11 +391,11 @@ async def _assign_job_to_pool_instance(
390
391
 
391
392
  instances_with_offers.sort(key=lambda instance_with_offer: instance_with_offer[0].price or 0)
392
393
  instance, offer = instances_with_offers[0]
393
- # Reload InstanceModel with volumes
394
+ # Reload InstanceModel with volume attachments
394
395
  res = await session.execute(
395
396
  select(InstanceModel)
396
397
  .where(InstanceModel.id == instance.id)
397
- .options(joinedload(InstanceModel.volumes))
398
+ .options(joinedload(InstanceModel.volume_attachments))
398
399
  )
399
400
  instance = res.unique().scalar_one()
400
401
  instance.status = InstanceStatus.BUSY
@@ -580,7 +581,7 @@ def _create_instance_model_for_job(
580
581
  backend=offer.backend,
581
582
  price=offer.price,
582
583
  region=offer.region,
583
- volumes=[],
584
+ volume_attachments=[],
584
585
  total_blocks=1,
585
586
  busy_blocks=1,
586
587
  )
@@ -696,14 +697,18 @@ async def _attach_volume(
696
697
  instance: InstanceModel,
697
698
  instance_id: str,
698
699
  ):
700
+ volume = volume_model_to_volume(volume_model)
701
+ # Refresh only to check if the volume wasn't deleted before the lock
699
702
  await session.refresh(volume_model)
700
703
  if volume_model.deleted:
701
704
  raise ServerClientError("Cannot attach a deleted volume")
702
- volume = volume_model_to_volume(volume_model)
703
705
  attachment_data = await common_utils.run_async(
704
706
  backend.compute().attach_volume,
705
707
  volume=volume,
706
708
  instance_id=instance_id,
707
709
  )
708
- volume_model.volume_attachment_data = attachment_data.json()
709
- instance.volumes.append(volume_model)
710
+ volume_attachment_model = VolumeAttachmentModel(
711
+ volume=volume_model,
712
+ attachment_data=attachment_data.json(),
713
+ )
714
+ instance.volume_attachments.append(volume_attachment_model)
@@ -6,7 +6,13 @@ from sqlalchemy.orm import joinedload, lazyload
6
6
 
7
7
  from dstack._internal.core.models.runs import JobStatus
8
8
  from dstack._internal.server.db import get_session_ctx
9
- from dstack._internal.server.models import InstanceModel, JobModel, ProjectModel, VolumeModel
9
+ from dstack._internal.server.models import (
10
+ InstanceModel,
11
+ JobModel,
12
+ ProjectModel,
13
+ VolumeAttachmentModel,
14
+ VolumeModel,
15
+ )
10
16
  from dstack._internal.server.services.jobs import (
11
17
  process_terminating_job,
12
18
  process_volumes_detaching,
@@ -80,7 +86,12 @@ async def _process_job(session: AsyncSession, job_model: JobModel):
80
86
  .where(InstanceModel.id == job_model.used_instance_id)
81
87
  .options(
82
88
  joinedload(InstanceModel.project).joinedload(ProjectModel.backends),
83
- joinedload(InstanceModel.volumes).joinedload(VolumeModel.user),
89
+ joinedload(InstanceModel.volume_attachments)
90
+ .joinedload(VolumeAttachmentModel.volume)
91
+ .joinedload(VolumeModel.user),
92
+ joinedload(InstanceModel.volume_attachments)
93
+ .joinedload(VolumeAttachmentModel.volume)
94
+ .joinedload(VolumeModel.attachments),
84
95
  )
85
96
  )
86
97
  instance_model = res.unique().scalar()
@@ -5,7 +5,12 @@ from sqlalchemy.orm import joinedload
5
5
  from dstack._internal.core.errors import BackendError, BackendNotAvailable
6
6
  from dstack._internal.core.models.volumes import VolumeStatus
7
7
  from dstack._internal.server.db import get_session_ctx
8
- from dstack._internal.server.models import ProjectModel, VolumeModel
8
+ from dstack._internal.server.models import (
9
+ InstanceModel,
10
+ ProjectModel,
11
+ VolumeAttachmentModel,
12
+ VolumeModel,
13
+ )
9
14
  from dstack._internal.server.services import backends as backends_services
10
15
  from dstack._internal.server.services import volumes as volumes_services
11
16
  from dstack._internal.server.services.locking import get_locker
@@ -49,6 +54,11 @@ async def _process_submitted_volume(session: AsyncSession, volume_model: VolumeM
49
54
  .where(VolumeModel.id == volume_model.id)
50
55
  .options(joinedload(VolumeModel.project).joinedload(ProjectModel.backends))
51
56
  .options(joinedload(VolumeModel.user))
57
+ .options(
58
+ joinedload(VolumeModel.attachments)
59
+ .joinedload(VolumeAttachmentModel.instance)
60
+ .joinedload(InstanceModel.fleet)
61
+ )
52
62
  .execution_options(populate_existing=True)
53
63
  )
54
64
  volume_model = res.unique().scalar_one()
@@ -0,0 +1,34 @@
1
+ """Move attachment_data to volumes_attachments
2
+
3
+ Revision ID: a751ef183f27
4
+ Revises: 1e76fb0dde87
5
+ Create Date: 2025-02-12 13:19:57.569591
6
+
7
+ """
8
+
9
+ import sqlalchemy as sa
10
+ from alembic import op
11
+
12
+ # revision identifiers, used by Alembic.
13
+ revision = "a751ef183f27"
14
+ down_revision = "1e76fb0dde87"
15
+ branch_labels = None
16
+ depends_on = None
17
+
18
+
19
+ def upgrade() -> None:
20
+ # ### commands auto generated by Alembic - please adjust! ###
21
+ with op.batch_alter_table("volumes_attachments", schema=None) as batch_op:
22
+ batch_op.alter_column("instace_id", new_column_name="instance_id")
23
+ batch_op.add_column(sa.Column("attachment_data", sa.Text(), nullable=True))
24
+
25
+ # ### end Alembic commands ###
26
+
27
+
28
+ def downgrade() -> None:
29
+ # ### commands auto generated by Alembic - please adjust! ###
30
+ with op.batch_alter_table("volumes_attachments", schema=None) as batch_op:
31
+ batch_op.drop_column("attachment_data")
32
+ batch_op.alter_column("instance_id", new_column_name="instace_id")
33
+
34
+ # ### end Alembic commands ###
@@ -5,7 +5,6 @@ from typing import Callable, List, Optional, Union
5
5
  from sqlalchemy import (
6
6
  BigInteger,
7
7
  Boolean,
8
- Column,
9
8
  DateTime,
10
9
  Enum,
11
10
  Float,
@@ -15,7 +14,6 @@ from sqlalchemy import (
15
14
  LargeBinary,
16
15
  MetaData,
17
16
  String,
18
- Table,
19
17
  Text,
20
18
  TypeDecorator,
21
19
  UniqueConstraint,
@@ -554,10 +552,12 @@ class InstanceModel(BaseModel):
554
552
  jobs: Mapped[list["JobModel"]] = relationship(back_populates="instance", lazy="joined")
555
553
  last_job_processed_at: Mapped[Optional[datetime]] = mapped_column(NaiveDateTime)
556
554
 
557
- # volumes attached to the instance
558
- volumes: Mapped[List["VolumeModel"]] = relationship(
559
- secondary="volumes_attachments",
560
- back_populates="instances",
555
+ volume_attachments: Mapped[List["VolumeAttachmentModel"]] = relationship(
556
+ back_populates="instance",
557
+ # Add delete-orphan option so that removing entries from volume_attachments
558
+ # automatically marks them for deletion.
559
+ # SQLalchemy requires delete when using delete-orphan.
560
+ cascade="save-update, merge, delete-orphan, delete",
561
561
  )
562
562
 
563
563
 
@@ -587,23 +587,21 @@ class VolumeModel(BaseModel):
587
587
 
588
588
  configuration: Mapped[str] = mapped_column(Text)
589
589
  volume_provisioning_data: Mapped[Optional[str]] = mapped_column(Text)
590
- # FIXME: volume_attachment_data should be in "volumes_attachments"
591
- # to support multi-attach volumes
590
+
591
+ attachments: Mapped[List["VolumeAttachmentModel"]] = relationship(back_populates="volume")
592
+
593
+ # Deprecated in favor of VolumeAttachmentModel.attachment_data
592
594
  volume_attachment_data: Mapped[Optional[str]] = mapped_column(Text)
593
595
 
594
- # instances the volume is attached to
595
- instances: Mapped[List["InstanceModel"]] = relationship(
596
- secondary="volumes_attachments",
597
- back_populates="volumes",
598
- )
599
596
 
597
+ class VolumeAttachmentModel(BaseModel):
598
+ __tablename__ = "volumes_attachments"
600
599
 
601
- volumes_attachments_table = Table(
602
- "volumes_attachments",
603
- BackendModel.metadata,
604
- Column("volume_id", ForeignKey("volumes.id"), primary_key=True),
605
- Column("instace_id", ForeignKey("instances.id"), primary_key=True),
606
- )
600
+ volume_id: Mapped[uuid.UUID] = mapped_column(ForeignKey("volumes.id"), primary_key=True)
601
+ volume: Mapped[VolumeModel] = relationship(back_populates="attachments")
602
+ instance_id: Mapped[uuid.UUID] = mapped_column(ForeignKey("instances.id"), primary_key=True)
603
+ instance: Mapped[InstanceModel] = relationship(back_populates="volume_attachments")
604
+ attachment_data: Mapped[Optional[str]] = mapped_column(Text)
607
605
 
608
606
 
609
607
  class PlacementGroupModel(BaseModel):
@@ -257,6 +257,7 @@ async def get_plan(
257
257
  project=project,
258
258
  profile=spec.merged_profile,
259
259
  requirements=_get_fleet_requirements(spec),
260
+ fleet_spec=spec,
260
261
  blocks=spec.configuration.blocks,
261
262
  )
262
263
  offers = [offer for _, offer in offers_with_backends]
@@ -277,12 +278,15 @@ async def get_create_instance_offers(
277
278
  project: ProjectModel,
278
279
  profile: Profile,
279
280
  requirements: Requirements,
280
- exclude_not_available=False,
281
+ fleet_spec: Optional[FleetSpec] = None,
281
282
  fleet_model: Optional[FleetModel] = None,
282
283
  blocks: Union[int, Literal["auto"]] = 1,
284
+ exclude_not_available: bool = False,
283
285
  ) -> List[Tuple[Backend, InstanceOfferWithAvailability]]:
284
286
  multinode = False
285
287
  master_job_provisioning_data = None
288
+ if fleet_spec is not None:
289
+ multinode = fleet_spec.configuration.placement == InstanceGroupPlacement.CLUSTER
286
290
  if fleet_model is not None:
287
291
  fleet = fleet_model_to_fleet(fleet_model)
288
292
  multinode = fleet.spec.configuration.placement == InstanceGroupPlacement.CLUSTER
@@ -242,7 +242,7 @@ async def process_terminating_job(
242
242
  session=session, project=instance_model.project, names=jrd.volume_names
243
243
  )
244
244
  else:
245
- volume_models = instance_model.volumes
245
+ volume_models = [va.volume for va in instance_model.volume_attachments]
246
246
  if len(volume_models) > 0:
247
247
  logger.info("Detaching volumes: %s", [v.name for v in volume_models])
248
248
  all_volumes_detached = await _detach_volumes_from_job_instance(
@@ -306,7 +306,7 @@ async def process_volumes_detaching(
306
306
  session=session, project=instance_model.project, names=jrd.volume_names
307
307
  )
308
308
  else:
309
- volume_models = instance_model.volumes
309
+ volume_models = [va.volume for va in instance_model.volume_attachments]
310
310
  logger.info("Detaching volumes: %s", [v.name for v in volume_models])
311
311
  all_volumes_detached = await _detach_volumes_from_job_instance(
312
312
  project=instance_model.project,
@@ -439,8 +439,8 @@ async def _detach_volumes_from_job_instance(
439
439
  if job_model.volumes_detached_at is None:
440
440
  job_model.volumes_detached_at = common.get_current_datetime()
441
441
  detached_volumes_ids = {v.id for v in detached_volumes}
442
- instance_model.volumes = [
443
- v for v in instance_model.volumes if v.id not in detached_volumes_ids
442
+ instance_model.volume_attachments = [
443
+ va for va in instance_model.volume_attachments if va.volume_id not in detached_volumes_ids
444
444
  ]
445
445
  return all_detached
446
446
 
@@ -50,35 +50,35 @@ async def get_offers_by_requirements(
50
50
  if volumes:
51
51
  mount_point_volumes = volumes[0]
52
52
  volumes_backend_types = [v.configuration.backend for v in mount_point_volumes]
53
- if not backend_types:
53
+ if backend_types is None:
54
54
  backend_types = volumes_backend_types
55
55
  backend_types = [b for b in backend_types if b in volumes_backend_types]
56
56
  volumes_regions = [v.configuration.region for v in mount_point_volumes]
57
- if not regions:
57
+ if regions is None:
58
58
  regions = volumes_regions
59
59
  regions = [r for r in regions if r in volumes_regions]
60
60
 
61
61
  if multinode:
62
- if not backend_types:
62
+ if backend_types is None:
63
63
  backend_types = BACKENDS_WITH_MULTINODE_SUPPORT
64
64
  backend_types = [b for b in backend_types if b in BACKENDS_WITH_MULTINODE_SUPPORT]
65
65
 
66
66
  if privileged or instance_mounts:
67
- if not backend_types:
67
+ if backend_types is None:
68
68
  backend_types = BACKENDS_WITH_CREATE_INSTANCE_SUPPORT
69
69
  backend_types = [b for b in backend_types if b in BACKENDS_WITH_CREATE_INSTANCE_SUPPORT]
70
70
 
71
71
  if profile.reservation is not None:
72
- if not backend_types:
72
+ if backend_types is None:
73
73
  backend_types = BACKENDS_WITH_RESERVATION_SUPPORT
74
74
  backend_types = [b for b in backend_types if b in BACKENDS_WITH_RESERVATION_SUPPORT]
75
75
 
76
76
  # For multi-node, restrict backend and region.
77
77
  # The default behavior is to provision all nodes in the same backend and region.
78
78
  if master_job_provisioning_data is not None:
79
- if not backend_types:
79
+ if backend_types is None:
80
80
  backend_types = [master_job_provisioning_data.get_base_backend()]
81
- if not regions:
81
+ if regions is None:
82
82
  regions = [master_job_provisioning_data.region]
83
83
  backend_types = [
84
84
  b for b in backend_types if b == master_job_provisioning_data.get_base_backend()
@@ -462,19 +462,19 @@ def filter_pool_instances(
462
462
  zones = [z for z in zones if z in volume_zones]
463
463
 
464
464
  if multinode:
465
- if not backend_types:
465
+ if backend_types is None:
466
466
  backend_types = BACKENDS_WITH_MULTINODE_SUPPORT
467
467
  backend_types = [b for b in backend_types if b in BACKENDS_WITH_MULTINODE_SUPPORT]
468
468
 
469
469
  # For multi-node, restrict backend and region.
470
470
  # The default behavior is to provision all nodes in the same backend and region.
471
471
  if master_job_provisioning_data is not None:
472
- if not backend_types:
472
+ if backend_types is None:
473
473
  backend_types = [master_job_provisioning_data.get_base_backend()]
474
474
  backend_types = [
475
475
  b for b in backend_types if b == master_job_provisioning_data.get_base_backend()
476
476
  ]
477
- if not regions:
477
+ if regions is None:
478
478
  regions = [master_job_provisioning_data.region]
479
479
  regions = [r for r in regions if r == master_job_provisioning_data.region]
480
480
 
@@ -239,6 +239,7 @@ class ShimClient:
239
239
  host_ssh_user: str,
240
240
  host_ssh_keys: list[str],
241
241
  container_ssh_keys: list[str],
242
+ instance_id: str,
242
243
  ) -> None:
243
244
  if not self.is_api_v2_supported():
244
245
  raise ShimAPIVersionError()
@@ -255,7 +256,7 @@ class ShimClient:
255
256
  memory=_memory_to_bytes(memory), # None = 0 = "all available"
256
257
  shm_size=_memory_to_bytes(shm_size), # None = 0 = "use default value"
257
258
  network_mode=network_mode,
258
- volumes=[_volume_to_shim_volume_info(v) for v in volumes],
259
+ volumes=[_volume_to_shim_volume_info(v, instance_id) for v in volumes],
259
260
  volume_mounts=volume_mounts,
260
261
  instance_mounts=instance_mounts,
261
262
  host_ssh_user=host_ssh_user,
@@ -303,6 +304,7 @@ class ShimClient:
303
304
  mounts: List[VolumeMountPoint],
304
305
  volumes: List[Volume],
305
306
  instance_mounts: List[InstanceMountPoint],
307
+ instance_id: str,
306
308
  ) -> bool:
307
309
  """
308
310
  Returns `True` if submitted and `False` if the shim already has a job (`409 Conflict`).
@@ -320,7 +322,7 @@ class ShimClient:
320
322
  ssh_user=ssh_user,
321
323
  ssh_key=ssh_key,
322
324
  mounts=mounts,
323
- volumes=[_volume_to_shim_volume_info(v) for v in volumes],
325
+ volumes=[_volume_to_shim_volume_info(v, instance_id) for v in volumes],
324
326
  instance_mounts=instance_mounts,
325
327
  )
326
328
  resp = self._request("POST", "/api/submit", body)
@@ -398,10 +400,11 @@ def health_response_to_health_status(data: HealthcheckResponse) -> HealthStatus:
398
400
  )
399
401
 
400
402
 
401
- def _volume_to_shim_volume_info(volume: Volume) -> ShimVolumeInfo:
403
+ def _volume_to_shim_volume_info(volume: Volume, instance_id: str) -> ShimVolumeInfo:
402
404
  device_name = None
403
- if volume.attachment_data is not None:
404
- device_name = volume.attachment_data.device_name
405
+ attachment_data = volume.get_attachment_data_for_instance(instance_id)
406
+ if attachment_data is not None:
407
+ device_name = attachment_data.device_name
405
408
  return ShimVolumeInfo(
406
409
  backend=volume.configuration.backend.value,
407
410
  name=volume.name,