skypilot-nightly 1.0.0.dev20250717__py3-none-any.whl → 1.0.0.dev20250720__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of skypilot-nightly might be problematic. Click here for more details.

Files changed (120) hide show
  1. sky/__init__.py +4 -2
  2. sky/backends/backend_utils.py +23 -13
  3. sky/backends/cloud_vm_ray_backend.py +19 -11
  4. sky/catalog/__init__.py +3 -1
  5. sky/catalog/aws_catalog.py +8 -5
  6. sky/catalog/azure_catalog.py +8 -5
  7. sky/catalog/common.py +8 -2
  8. sky/catalog/cudo_catalog.py +5 -2
  9. sky/catalog/do_catalog.py +4 -1
  10. sky/catalog/fluidstack_catalog.py +5 -2
  11. sky/catalog/gcp_catalog.py +8 -5
  12. sky/catalog/hyperbolic_catalog.py +5 -2
  13. sky/catalog/ibm_catalog.py +8 -5
  14. sky/catalog/lambda_catalog.py +8 -5
  15. sky/catalog/nebius_catalog.py +8 -5
  16. sky/catalog/oci_catalog.py +8 -5
  17. sky/catalog/paperspace_catalog.py +4 -1
  18. sky/catalog/runpod_catalog.py +5 -2
  19. sky/catalog/scp_catalog.py +8 -5
  20. sky/catalog/vast_catalog.py +5 -2
  21. sky/catalog/vsphere_catalog.py +4 -1
  22. sky/client/cli/command.py +25 -2
  23. sky/client/sdk.py +10 -5
  24. sky/clouds/aws.py +12 -7
  25. sky/clouds/azure.py +12 -7
  26. sky/clouds/cloud.py +9 -8
  27. sky/clouds/cudo.py +13 -7
  28. sky/clouds/do.py +12 -7
  29. sky/clouds/fluidstack.py +11 -6
  30. sky/clouds/gcp.py +12 -7
  31. sky/clouds/hyperbolic.py +11 -6
  32. sky/clouds/ibm.py +11 -6
  33. sky/clouds/kubernetes.py +7 -3
  34. sky/clouds/lambda_cloud.py +11 -6
  35. sky/clouds/nebius.py +12 -7
  36. sky/clouds/oci.py +12 -7
  37. sky/clouds/paperspace.py +12 -7
  38. sky/clouds/runpod.py +12 -7
  39. sky/clouds/scp.py +11 -6
  40. sky/clouds/vast.py +12 -7
  41. sky/clouds/vsphere.py +11 -6
  42. sky/core.py +6 -1
  43. sky/dashboard/out/404.html +1 -1
  44. sky/dashboard/out/_next/static/chunks/1043-869d9c78bf5dd3df.js +1 -0
  45. sky/dashboard/out/_next/static/chunks/1871-a821dcaaae2a3823.js +6 -0
  46. sky/dashboard/out/_next/static/chunks/{2641.35edc9ccaeaad9e3.js → 2641.5233e938f14e31a7.js} +1 -1
  47. sky/dashboard/out/_next/static/chunks/{4725.4c849b1e05c8e9ad.js → 4725.66125dcd9832aa5d.js} +1 -1
  48. sky/dashboard/out/_next/static/chunks/4869.c7c055a5c2814f33.js +16 -0
  49. sky/dashboard/out/_next/static/chunks/8969-8e0b2055bf5dd499.js +1 -0
  50. sky/dashboard/out/_next/static/chunks/938-63fc419cb82ad9b3.js +1 -0
  51. sky/dashboard/out/_next/static/chunks/9470-8178183f3bae198f.js +1 -0
  52. sky/dashboard/out/_next/static/chunks/{9984.b56614f3c4c5961d.js → 9984.2b5e3fa69171bff9.js} +1 -1
  53. sky/dashboard/out/_next/static/chunks/pages/_app-507712f30cd3cec3.js +20 -0
  54. sky/dashboard/out/_next/static/chunks/pages/clusters/[cluster]/[job]-fa406155b4223d0d.js +11 -0
  55. sky/dashboard/out/_next/static/chunks/pages/jobs/{[job]-14d404b7dd28502a.js → [job]-c5b357bfd9502fbe.js} +1 -1
  56. sky/dashboard/out/_next/static/chunks/webpack-26cdc782eed15a7d.js +1 -0
  57. sky/dashboard/out/_next/static/css/5122cb0a08486fd3.css +3 -0
  58. sky/dashboard/out/_next/static/{Et5IQ5Y3WvH608nXClo4z → pTQKG61ng32Zc7gsAROFJ}/_buildManifest.js +1 -1
  59. sky/dashboard/out/clusters/[cluster]/[job].html +1 -1
  60. sky/dashboard/out/clusters/[cluster].html +1 -1
  61. sky/dashboard/out/clusters.html +1 -1
  62. sky/dashboard/out/config.html +1 -1
  63. sky/dashboard/out/index.html +1 -1
  64. sky/dashboard/out/infra/[context].html +1 -1
  65. sky/dashboard/out/infra.html +1 -1
  66. sky/dashboard/out/jobs/[job].html +1 -1
  67. sky/dashboard/out/jobs.html +1 -1
  68. sky/dashboard/out/users.html +1 -1
  69. sky/dashboard/out/volumes.html +1 -1
  70. sky/dashboard/out/workspace/new.html +1 -1
  71. sky/dashboard/out/workspaces/[name].html +1 -1
  72. sky/dashboard/out/workspaces.html +1 -1
  73. sky/global_user_state.py +13 -143
  74. sky/jobs/client/sdk.py +1 -1
  75. sky/jobs/server/core.py +14 -0
  76. sky/jobs/state.py +9 -88
  77. sky/jobs/utils.py +28 -13
  78. sky/schemas/db/README +4 -0
  79. sky/schemas/db/env.py +90 -0
  80. sky/schemas/db/global_user_state/001_initial_schema.py +124 -0
  81. sky/schemas/db/script.py.mako +28 -0
  82. sky/schemas/db/skypilot_config/001_initial_schema.py +30 -0
  83. sky/schemas/db/spot_jobs/001_initial_schema.py +97 -0
  84. sky/serve/client/sdk.py +7 -3
  85. sky/serve/controller.py +7 -3
  86. sky/serve/serve_state.py +1 -1
  87. sky/serve/serve_utils.py +171 -75
  88. sky/serve/server/core.py +17 -6
  89. sky/server/common.py +4 -0
  90. sky/server/requests/payloads.py +2 -0
  91. sky/server/requests/requests.py +1 -1
  92. sky/server/rest.py +71 -26
  93. sky/setup_files/MANIFEST.in +2 -0
  94. sky/setup_files/alembic.ini +152 -0
  95. sky/setup_files/dependencies.py +1 -0
  96. sky/skylet/configs.py +1 -1
  97. sky/skylet/job_lib.py +1 -1
  98. sky/skypilot_config.py +32 -6
  99. sky/users/permission.py +1 -1
  100. sky/utils/common_utils.py +77 -0
  101. sky/utils/db/__init__.py +0 -0
  102. sky/utils/{db_utils.py → db/db_utils.py} +59 -0
  103. sky/utils/db/migration_utils.py +53 -0
  104. {skypilot_nightly-1.0.0.dev20250717.dist-info → skypilot_nightly-1.0.0.dev20250720.dist-info}/METADATA +2 -1
  105. {skypilot_nightly-1.0.0.dev20250717.dist-info → skypilot_nightly-1.0.0.dev20250720.dist-info}/RECORD +110 -101
  106. sky/dashboard/out/_next/static/chunks/1043-90a88c46f27b3df5.js +0 -1
  107. sky/dashboard/out/_next/static/chunks/1871-76491ac174a95278.js +0 -6
  108. sky/dashboard/out/_next/static/chunks/4869.bdd42f14b51d1d6f.js +0 -16
  109. sky/dashboard/out/_next/static/chunks/8969-743abf4bc86baf48.js +0 -1
  110. sky/dashboard/out/_next/static/chunks/938-6a9ffdaa21eee969.js +0 -1
  111. sky/dashboard/out/_next/static/chunks/9470-b6f6a35283863a6f.js +0 -1
  112. sky/dashboard/out/_next/static/chunks/pages/_app-771a40cde532309b.js +0 -20
  113. sky/dashboard/out/_next/static/chunks/pages/clusters/[cluster]/[job]-9096ea50b8e2cf9e.js +0 -6
  114. sky/dashboard/out/_next/static/chunks/webpack-c3b45b7b0eaef66f.js +0 -1
  115. sky/dashboard/out/_next/static/css/219887b94512388c.css +0 -3
  116. /sky/dashboard/out/_next/static/{Et5IQ5Y3WvH608nXClo4z → pTQKG61ng32Zc7gsAROFJ}/_ssgManifest.js +0 -0
  117. {skypilot_nightly-1.0.0.dev20250717.dist-info → skypilot_nightly-1.0.0.dev20250720.dist-info}/WHEEL +0 -0
  118. {skypilot_nightly-1.0.0.dev20250717.dist-info → skypilot_nightly-1.0.0.dev20250720.dist-info}/entry_points.txt +0 -0
  119. {skypilot_nightly-1.0.0.dev20250717.dist-info → skypilot_nightly-1.0.0.dev20250720.dist-info}/licenses/LICENSE +0 -0
  120. {skypilot_nightly-1.0.0.dev20250717.dist-info → skypilot_nightly-1.0.0.dev20250720.dist-info}/top_level.txt +0 -0
sky/client/sdk.py CHANGED
@@ -29,7 +29,6 @@ import colorama
29
29
  import filelock
30
30
 
31
31
  from sky import admin_policy
32
- from sky import backends
33
32
  from sky import exceptions
34
33
  from sky import sky_logging
35
34
  from sky import skypilot_config
@@ -64,6 +63,7 @@ if typing.TYPE_CHECKING:
64
63
  import requests
65
64
 
66
65
  import sky
66
+ from sky import backends
67
67
  else:
68
68
  psutil = adaptors_common.LazyImport('psutil')
69
69
 
@@ -73,6 +73,11 @@ logging.getLogger('httpx').setLevel(logging.CRITICAL)
73
73
  _LINE_PROCESSED_KEY = 'line_processed'
74
74
 
75
75
 
76
+ def reload_config() -> None:
77
+ """Reloads the client-side config."""
78
+ skypilot_config.safe_reload_config()
79
+
80
+
76
81
  def stream_response(request_id: Optional[str],
77
82
  response: 'requests.Response',
78
83
  output_stream: Optional['io.TextIOBase'] = None,
@@ -372,7 +377,7 @@ def launch(
372
377
  idle_minutes_to_autostop: Optional[int] = None,
373
378
  dryrun: bool = False,
374
379
  down: bool = False, # pylint: disable=redefined-outer-name
375
- backend: Optional[backends.Backend] = None,
380
+ backend: Optional['backends.Backend'] = None,
376
381
  optimize_target: common.OptimizeTarget = common.OptimizeTarget.COST,
377
382
  no_setup: bool = False,
378
383
  clone_disk_from: Optional[str] = None,
@@ -530,7 +535,7 @@ def _launch(
530
535
  idle_minutes_to_autostop: Optional[int] = None,
531
536
  dryrun: bool = False,
532
537
  down: bool = False, # pylint: disable=redefined-outer-name
533
- backend: Optional[backends.Backend] = None,
538
+ backend: Optional['backends.Backend'] = None,
534
539
  optimize_target: common.OptimizeTarget = common.OptimizeTarget.COST,
535
540
  no_setup: bool = False,
536
541
  clone_disk_from: Optional[str] = None,
@@ -639,7 +644,7 @@ def exec( # pylint: disable=redefined-builtin
639
644
  cluster_name: Optional[str] = None,
640
645
  dryrun: bool = False,
641
646
  down: bool = False, # pylint: disable=redefined-outer-name
642
- backend: Optional[backends.Backend] = None,
647
+ backend: Optional['backends.Backend'] = None,
643
648
  ) -> server_common.RequestId:
644
649
  """Executes a task on an existing cluster.
645
650
 
@@ -716,7 +721,7 @@ def exec( # pylint: disable=redefined-builtin
716
721
  @usage_lib.entrypoint
717
722
  @server_common.check_server_healthy_or_start
718
723
  @annotations.client_api
719
- @rest.retry_on_server_unavailable()
724
+ @rest.retry_transient_errors()
720
725
  def tail_logs(cluster_name: str,
721
726
  job_id: Optional[int],
722
727
  follow: bool,
sky/clouds/aws.py CHANGED
@@ -404,15 +404,18 @@ class AWS(clouds.Cloud):
404
404
  return cost
405
405
 
406
406
  @classmethod
407
- def get_default_instance_type(
408
- cls,
409
- cpus: Optional[str] = None,
410
- memory: Optional[str] = None,
411
- disk_tier: Optional[resources_utils.DiskTier] = None
412
- ) -> Optional[str]:
407
+ def get_default_instance_type(cls,
408
+ cpus: Optional[str] = None,
409
+ memory: Optional[str] = None,
410
+ disk_tier: Optional[
411
+ resources_utils.DiskTier] = None,
412
+ region: Optional[str] = None,
413
+ zone: Optional[str] = None) -> Optional[str]:
413
414
  return catalog.get_default_instance_type(cpus=cpus,
414
415
  memory=memory,
415
416
  disk_tier=disk_tier,
417
+ region=region,
418
+ zone=zone,
416
419
  clouds='aws')
417
420
 
418
421
  # TODO: factor the following three methods, as they are the same logic
@@ -554,7 +557,9 @@ class AWS(clouds.Cloud):
554
557
  default_instance_type = AWS.get_default_instance_type(
555
558
  cpus=resources.cpus,
556
559
  memory=resources.memory,
557
- disk_tier=resources.disk_tier)
560
+ disk_tier=resources.disk_tier,
561
+ region=resources.region,
562
+ zone=resources.zone)
558
563
  if default_instance_type is None:
559
564
  return resources_utils.FeasibleResources([], [], None)
560
565
  else:
sky/clouds/azure.py CHANGED
@@ -154,15 +154,18 @@ class Azure(clouds.Cloud):
154
154
  return cost
155
155
 
156
156
  @classmethod
157
- def get_default_instance_type(
158
- cls,
159
- cpus: Optional[str] = None,
160
- memory: Optional[str] = None,
161
- disk_tier: Optional[resources_utils.DiskTier] = None
162
- ) -> Optional[str]:
157
+ def get_default_instance_type(cls,
158
+ cpus: Optional[str] = None,
159
+ memory: Optional[str] = None,
160
+ disk_tier: Optional[
161
+ resources_utils.DiskTier] = None,
162
+ region: Optional[str] = None,
163
+ zone: Optional[str] = None) -> Optional[str]:
163
164
  return catalog.get_default_instance_type(cpus=cpus,
164
165
  memory=memory,
165
166
  disk_tier=disk_tier,
167
+ region=region,
168
+ zone=zone,
166
169
  clouds='azure')
167
170
 
168
171
  @classmethod
@@ -499,7 +502,9 @@ class Azure(clouds.Cloud):
499
502
  default_instance_type = Azure.get_default_instance_type(
500
503
  cpus=resources.cpus,
501
504
  memory=resources.memory,
502
- disk_tier=resources.disk_tier)
505
+ disk_tier=resources.disk_tier,
506
+ region=resources.region,
507
+ zone=resources.zone)
503
508
  if default_instance_type is None:
504
509
  return resources_utils.FeasibleResources([], [], None)
505
510
  else:
sky/clouds/cloud.py CHANGED
@@ -341,14 +341,15 @@ class Cloud:
341
341
  raise NotImplementedError
342
342
 
343
343
  @classmethod
344
- def get_default_instance_type(
345
- cls,
346
- cpus: Optional[str] = None,
347
- memory: Optional[str] = None,
348
- disk_tier: Optional[resources_utils.DiskTier] = None
349
- ) -> Optional[str]:
350
- """Returns the default instance type with the given #vCPUs, memory and
351
- disk tier.
344
+ def get_default_instance_type(cls,
345
+ cpus: Optional[str] = None,
346
+ memory: Optional[str] = None,
347
+ disk_tier: Optional[
348
+ resources_utils.DiskTier] = None,
349
+ region: Optional[str] = None,
350
+ zone: Optional[str] = None) -> Optional[str]:
351
+ """Returns the default instance type with the given #vCPUs, memory,
352
+ disk tier, region, and zone.
352
353
 
353
354
  For example, if cpus='4', this method returns the default instance type
354
355
  with 4 vCPUs. If cpus='4+', this method returns the default instance
sky/clouds/cudo.py CHANGED
@@ -175,14 +175,18 @@ class Cudo(clouds.Cloud):
175
175
  return 0.0
176
176
 
177
177
  @classmethod
178
- def get_default_instance_type(
179
- cls,
180
- cpus: Optional[str] = None,
181
- memory: Optional[str] = None,
182
- disk_tier: Optional[resources_utils.DiskTier] = None
183
- ) -> Optional[str]:
178
+ def get_default_instance_type(cls,
179
+ cpus: Optional[str] = None,
180
+ memory: Optional[str] = None,
181
+ disk_tier: Optional[
182
+ resources_utils.DiskTier] = None,
183
+ region: Optional[str] = None,
184
+ zone: Optional[str] = None) -> Optional[str]:
184
185
  return catalog.get_default_instance_type(cpus=cpus,
185
186
  memory=memory,
187
+ disk_tier=disk_tier,
188
+ region=region,
189
+ zone=zone,
186
190
  clouds='cudo')
187
191
 
188
192
  @classmethod
@@ -251,7 +255,9 @@ class Cudo(clouds.Cloud):
251
255
  default_instance_type = Cudo.get_default_instance_type(
252
256
  cpus=resources.cpus,
253
257
  memory=resources.memory,
254
- disk_tier=resources.disk_tier)
258
+ disk_tier=resources.disk_tier,
259
+ region=resources.region,
260
+ zone=resources.zone)
255
261
  if default_instance_type is None:
256
262
  return resources_utils.FeasibleResources([], [], None)
257
263
  else:
sky/clouds/do.py CHANGED
@@ -156,16 +156,19 @@ class DO(clouds.Cloud):
156
156
  return self._REPR
157
157
 
158
158
  @classmethod
159
- def get_default_instance_type(
160
- cls,
161
- cpus: Optional[str] = None,
162
- memory: Optional[str] = None,
163
- disk_tier: Optional[resources_utils.DiskTier] = None,
164
- ) -> Optional[str]:
159
+ def get_default_instance_type(cls,
160
+ cpus: Optional[str] = None,
161
+ memory: Optional[str] = None,
162
+ disk_tier: Optional[
163
+ resources_utils.DiskTier] = None,
164
+ region: Optional[str] = None,
165
+ zone: Optional[str] = None) -> Optional[str]:
165
166
  """Returns the default instance type for DO."""
166
167
  return catalog.get_default_instance_type(cpus=cpus,
167
168
  memory=memory,
168
169
  disk_tier=disk_tier,
170
+ region=region,
171
+ zone=zone,
169
172
  clouds='DO')
170
173
 
171
174
  @classmethod
@@ -246,7 +249,9 @@ class DO(clouds.Cloud):
246
249
  default_instance_type = DO.get_default_instance_type(
247
250
  cpus=resources.cpus,
248
251
  memory=resources.memory,
249
- disk_tier=resources.disk_tier)
252
+ disk_tier=resources.disk_tier,
253
+ region=resources.region,
254
+ zone=resources.zone)
250
255
  if default_instance_type is None:
251
256
  return resources_utils.FeasibleResources([], [], None)
252
257
  else:
sky/clouds/fluidstack.py CHANGED
@@ -154,14 +154,17 @@ class Fluidstack(clouds.Cloud):
154
154
  return 'Fluidstack'
155
155
 
156
156
  @classmethod
157
- def get_default_instance_type(
158
- cls,
159
- cpus: Optional[str] = None,
160
- memory: Optional[str] = None,
161
- disk_tier: Optional[DiskTier] = None) -> Optional[str]:
157
+ def get_default_instance_type(cls,
158
+ cpus: Optional[str] = None,
159
+ memory: Optional[str] = None,
160
+ disk_tier: Optional[DiskTier] = None,
161
+ region: Optional[str] = None,
162
+ zone: Optional[str] = None) -> Optional[str]:
162
163
  return catalog.get_default_instance_type(cpus=cpus,
163
164
  memory=memory,
164
165
  disk_tier=disk_tier,
166
+ region=region,
167
+ zone=zone,
165
168
  clouds='fluidstack')
166
169
 
167
170
  @classmethod
@@ -243,7 +246,9 @@ class Fluidstack(clouds.Cloud):
243
246
  default_instance_type = Fluidstack.get_default_instance_type(
244
247
  cpus=resources.cpus,
245
248
  memory=resources.memory,
246
- disk_tier=resources.disk_tier)
249
+ disk_tier=resources.disk_tier,
250
+ region=resources.region,
251
+ zone=resources.zone)
247
252
  if default_instance_type is None:
248
253
  return resources_utils.FeasibleResources([], [], None)
249
254
  else:
sky/clouds/gcp.py CHANGED
@@ -436,15 +436,18 @@ class GCP(clouds.Cloud):
436
436
  return cls._get_image_size(image_id)
437
437
 
438
438
  @classmethod
439
- def get_default_instance_type(
440
- cls,
441
- cpus: Optional[str] = None,
442
- memory: Optional[str] = None,
443
- disk_tier: Optional[resources_utils.DiskTier] = None
444
- ) -> Optional[str]:
439
+ def get_default_instance_type(cls,
440
+ cpus: Optional[str] = None,
441
+ memory: Optional[str] = None,
442
+ disk_tier: Optional[
443
+ resources_utils.DiskTier] = None,
444
+ region: Optional[str] = None,
445
+ zone: Optional[str] = None) -> Optional[str]:
445
446
  return catalog.get_default_instance_type(cpus=cpus,
446
447
  memory=memory,
447
448
  disk_tier=disk_tier,
449
+ region=region,
450
+ zone=zone,
448
451
  clouds='gcp')
449
452
 
450
453
  @classmethod
@@ -681,7 +684,9 @@ class GCP(clouds.Cloud):
681
684
  host_vm_type = GCP.get_default_instance_type(
682
685
  cpus=resources.cpus,
683
686
  memory=resources.memory,
684
- disk_tier=resources.disk_tier)
687
+ disk_tier=resources.disk_tier,
688
+ region=resources.region,
689
+ zone=resources.zone)
685
690
  if host_vm_type is None:
686
691
  # TODO: Add hints to all return values in this method to help
687
692
  # users understand why the resources are not launchable.
sky/clouds/hyperbolic.py CHANGED
@@ -109,14 +109,17 @@ class Hyperbolic(clouds.Cloud):
109
109
  clouds='hyperbolic')
110
110
 
111
111
  @classmethod
112
- def get_default_instance_type(
113
- cls,
114
- cpus: Optional[str] = None,
115
- memory: Optional[str] = None,
116
- disk_tier: Optional[DiskTier] = None) -> Optional[str]:
112
+ def get_default_instance_type(cls,
113
+ cpus: Optional[str] = None,
114
+ memory: Optional[str] = None,
115
+ disk_tier: Optional[DiskTier] = None,
116
+ region: Optional[str] = None,
117
+ zone: Optional[str] = None) -> Optional[str]:
117
118
  return catalog.get_default_instance_type(cpus=cpus,
118
119
  memory=memory,
119
120
  disk_tier=disk_tier,
121
+ region=region,
122
+ zone=zone,
120
123
  clouds='hyperbolic')
121
124
 
122
125
  @classmethod
@@ -199,7 +202,9 @@ class Hyperbolic(clouds.Cloud):
199
202
  default_instance_type = self.get_default_instance_type(
200
203
  cpus=resources.cpus,
201
204
  memory=resources.memory,
202
- disk_tier=resources.disk_tier)
205
+ disk_tier=resources.disk_tier,
206
+ region=resources.region,
207
+ zone=resources.zone)
203
208
  if default_instance_type is None:
204
209
  return resources_utils.FeasibleResources([], [], None)
205
210
  else:
sky/clouds/ibm.py CHANGED
@@ -262,14 +262,17 @@ class IBM(clouds.Cloud):
262
262
 
263
263
  @classmethod
264
264
  def get_default_instance_type(
265
- cls,
266
- cpus: Optional[str] = None,
267
- memory: Optional[str] = None,
268
- disk_tier: Optional['resources_utils.DiskTier'] = None
269
- ) -> Optional[str]:
265
+ cls,
266
+ cpus: Optional[str] = None,
267
+ memory: Optional[str] = None,
268
+ disk_tier: Optional['resources_utils.DiskTier'] = None,
269
+ region: Optional[str] = None,
270
+ zone: Optional[str] = None) -> Optional[str]:
270
271
  return catalog.get_default_instance_type(cpus=cpus,
271
272
  memory=memory,
272
273
  disk_tier=disk_tier,
274
+ region=region,
275
+ zone=zone,
273
276
  clouds='ibm')
274
277
 
275
278
  def _get_feasible_launchable_resources(
@@ -305,7 +308,9 @@ class IBM(clouds.Cloud):
305
308
  default_instance_type = IBM.get_default_instance_type(
306
309
  cpus=resources.cpus,
307
310
  memory=resources.memory,
308
- disk_tier=resources.disk_tier)
311
+ disk_tier=resources.disk_tier,
312
+ region=resources.region,
313
+ zone=resources.zone)
309
314
  if default_instance_type is None:
310
315
  return resources_utils.FeasibleResources([], [], None)
311
316
  else:
sky/clouds/kubernetes.py CHANGED
@@ -349,10 +349,12 @@ class Kubernetes(clouds.Cloud):
349
349
  cls,
350
350
  cpus: Optional[str] = None,
351
351
  memory: Optional[str] = None,
352
- disk_tier: Optional['resources_utils.DiskTier'] = None) -> str:
352
+ disk_tier: Optional['resources_utils.DiskTier'] = None,
353
+ region: Optional[str] = None,
354
+ zone: Optional[str] = None) -> str:
353
355
  # TODO(romilb): In the future, we may want to move the instance type
354
356
  # selection + availability checking to a kubernetes_catalog module.
355
- del disk_tier # Unused.
357
+ del disk_tier, region, zone # Unused.
356
358
  # We strip '+' from resource requests since Kubernetes can provision
357
359
  # exactly the requested resources.
358
360
  instance_cpus = float(
@@ -806,7 +808,9 @@ class Kubernetes(clouds.Cloud):
806
808
  default_instance_type = Kubernetes.get_default_instance_type(
807
809
  cpus=resources.cpus,
808
810
  memory=resources.memory,
809
- disk_tier=resources.disk_tier)
811
+ disk_tier=resources.disk_tier,
812
+ region=resources.region,
813
+ zone=resources.zone)
810
814
 
811
815
  if accelerators is None:
812
816
  # For CPU only clusters, need no special handling
@@ -132,14 +132,17 @@ class Lambda(clouds.Cloud):
132
132
 
133
133
  @classmethod
134
134
  def get_default_instance_type(
135
- cls,
136
- cpus: Optional[str] = None,
137
- memory: Optional[str] = None,
138
- disk_tier: Optional['resources_utils.DiskTier'] = None
139
- ) -> Optional[str]:
135
+ cls,
136
+ cpus: Optional[str] = None,
137
+ memory: Optional[str] = None,
138
+ disk_tier: Optional['resources_utils.DiskTier'] = None,
139
+ region: Optional[str] = None,
140
+ zone: Optional[str] = None) -> Optional[str]:
140
141
  return catalog.get_default_instance_type(cpus=cpus,
141
142
  memory=memory,
142
143
  disk_tier=disk_tier,
144
+ region=region,
145
+ zone=zone,
143
146
  clouds='lambda')
144
147
 
145
148
  @classmethod
@@ -227,7 +230,9 @@ class Lambda(clouds.Cloud):
227
230
  default_instance_type = Lambda.get_default_instance_type(
228
231
  cpus=resources.cpus,
229
232
  memory=resources.memory,
230
- disk_tier=resources.disk_tier)
233
+ disk_tier=resources.disk_tier,
234
+ region=resources.region,
235
+ zone=resources.zone)
231
236
  if default_instance_type is None:
232
237
  return resources_utils.FeasibleResources([], [], None)
233
238
  else:
sky/clouds/nebius.py CHANGED
@@ -175,16 +175,19 @@ class Nebius(clouds.Cloud):
175
175
  return isinstance(other, Nebius)
176
176
 
177
177
  @classmethod
178
- def get_default_instance_type(
179
- cls,
180
- cpus: Optional[str] = None,
181
- memory: Optional[str] = None,
182
- disk_tier: Optional[resources_utils.DiskTier] = None
183
- ) -> Optional[str]:
178
+ def get_default_instance_type(cls,
179
+ cpus: Optional[str] = None,
180
+ memory: Optional[str] = None,
181
+ disk_tier: Optional[
182
+ resources_utils.DiskTier] = None,
183
+ region: Optional[str] = None,
184
+ zone: Optional[str] = None) -> Optional[str]:
184
185
  """Returns the default instance type for Nebius."""
185
186
  return catalog.get_default_instance_type(cpus=cpus,
186
187
  memory=memory,
187
188
  disk_tier=disk_tier,
189
+ region=region,
190
+ zone=zone,
188
191
  clouds='nebius')
189
192
 
190
193
  @classmethod
@@ -320,7 +323,9 @@ class Nebius(clouds.Cloud):
320
323
  default_instance_type = Nebius.get_default_instance_type(
321
324
  cpus=resources.cpus,
322
325
  memory=resources.memory,
323
- disk_tier=resources.disk_tier)
326
+ disk_tier=resources.disk_tier,
327
+ region=resources.region,
328
+ zone=resources.zone)
324
329
  if default_instance_type is None:
325
330
  # TODO: Add hints to all return values in this method to help
326
331
  # users understand why the resources are not launchable.
sky/clouds/oci.py CHANGED
@@ -187,15 +187,18 @@ class OCI(clouds.Cloud):
187
187
  return (num_gigabytes - 10 * 1024) * 0.0085
188
188
 
189
189
  @classmethod
190
- def get_default_instance_type(
191
- cls,
192
- cpus: Optional[str] = None,
193
- memory: Optional[str] = None,
194
- disk_tier: Optional[resources_utils.DiskTier] = None
195
- ) -> Optional[str]:
190
+ def get_default_instance_type(cls,
191
+ cpus: Optional[str] = None,
192
+ memory: Optional[str] = None,
193
+ disk_tier: Optional[
194
+ resources_utils.DiskTier] = None,
195
+ region: Optional[str] = None,
196
+ zone: Optional[str] = None) -> Optional[str]:
196
197
  return catalog.get_default_instance_type(cpus=cpus,
197
198
  memory=memory,
198
199
  disk_tier=disk_tier,
200
+ region=region,
201
+ zone=zone,
199
202
  clouds='oci')
200
203
 
201
204
  @classmethod
@@ -378,7 +381,9 @@ class OCI(clouds.Cloud):
378
381
  default_instance_type = OCI.get_default_instance_type(
379
382
  cpus=resources.cpus,
380
383
  memory=resources.memory,
381
- disk_tier=resources.disk_tier)
384
+ disk_tier=resources.disk_tier,
385
+ region=resources.region,
386
+ zone=resources.zone)
382
387
 
383
388
  if default_instance_type is None:
384
389
  return resources_utils.FeasibleResources([], [], None)
sky/clouds/paperspace.py CHANGED
@@ -160,16 +160,19 @@ class Paperspace(clouds.Cloud):
160
160
  return self._REPR
161
161
 
162
162
  @classmethod
163
- def get_default_instance_type(
164
- cls,
165
- cpus: Optional[str] = None,
166
- memory: Optional[str] = None,
167
- disk_tier: Optional[resources_utils.DiskTier] = None,
168
- ) -> Optional[str]:
163
+ def get_default_instance_type(cls,
164
+ cpus: Optional[str] = None,
165
+ memory: Optional[str] = None,
166
+ disk_tier: Optional[
167
+ resources_utils.DiskTier] = None,
168
+ region: Optional[str] = None,
169
+ zone: Optional[str] = None) -> Optional[str]:
169
170
  """Returns the default instance type for Paperspace."""
170
171
  return catalog.get_default_instance_type(cpus=cpus,
171
172
  memory=memory,
172
173
  disk_tier=disk_tier,
174
+ region=region,
175
+ zone=zone,
173
176
  clouds='paperspace')
174
177
 
175
178
  @classmethod
@@ -237,7 +240,9 @@ class Paperspace(clouds.Cloud):
237
240
  default_instance_type = Paperspace.get_default_instance_type(
238
241
  cpus=resources.cpus,
239
242
  memory=resources.memory,
240
- disk_tier=resources.disk_tier)
243
+ disk_tier=resources.disk_tier,
244
+ region=resources.region,
245
+ zone=resources.zone)
241
246
  if default_instance_type is None:
242
247
  return resources_utils.FeasibleResources([], [], None)
243
248
  else:
sky/clouds/runpod.py CHANGED
@@ -141,16 +141,19 @@ class RunPod(clouds.Cloud):
141
141
  return 0.0
142
142
 
143
143
  @classmethod
144
- def get_default_instance_type(
145
- cls,
146
- cpus: Optional[str] = None,
147
- memory: Optional[str] = None,
148
- disk_tier: Optional[resources_utils.DiskTier] = None
149
- ) -> Optional[str]:
144
+ def get_default_instance_type(cls,
145
+ cpus: Optional[str] = None,
146
+ memory: Optional[str] = None,
147
+ disk_tier: Optional[
148
+ resources_utils.DiskTier] = None,
149
+ region: Optional[str] = None,
150
+ zone: Optional[str] = None) -> Optional[str]:
150
151
  """Returns the default instance type for RunPod."""
151
152
  return catalog.get_default_instance_type(cpus=cpus,
152
153
  memory=memory,
153
154
  disk_tier=disk_tier,
155
+ region=region,
156
+ zone=zone,
154
157
  clouds='runpod')
155
158
 
156
159
  @classmethod
@@ -240,7 +243,9 @@ class RunPod(clouds.Cloud):
240
243
  default_instance_type = RunPod.get_default_instance_type(
241
244
  cpus=resources.cpus,
242
245
  memory=resources.memory,
243
- disk_tier=resources.disk_tier)
246
+ disk_tier=resources.disk_tier,
247
+ region=resources.region,
248
+ zone=resources.zone)
244
249
  if default_instance_type is None:
245
250
  # TODO: Add hints to all return values in this method to help
246
251
  # users understand why the resources are not launchable.
sky/clouds/scp.py CHANGED
@@ -156,14 +156,17 @@ class SCP(clouds.Cloud):
156
156
 
157
157
  @classmethod
158
158
  def get_default_instance_type(
159
- cls,
160
- cpus: Optional[str] = None,
161
- memory: Optional[str] = None,
162
- disk_tier: Optional['resources_utils.DiskTier'] = None
163
- ) -> Optional[str]:
159
+ cls,
160
+ cpus: Optional[str] = None,
161
+ memory: Optional[str] = None,
162
+ disk_tier: Optional['resources_utils.DiskTier'] = None,
163
+ region: Optional[str] = None,
164
+ zone: Optional[str] = None) -> Optional[str]:
164
165
  return catalog.get_default_instance_type(cpus=cpus,
165
166
  memory=memory,
166
167
  disk_tier=disk_tier,
168
+ region=region,
169
+ zone=zone,
167
170
  clouds='scp')
168
171
 
169
172
  @classmethod
@@ -301,7 +304,9 @@ class SCP(clouds.Cloud):
301
304
  default_instance_type = SCP.get_default_instance_type(
302
305
  cpus=resources.cpus,
303
306
  memory=resources.memory,
304
- disk_tier=resources.disk_tier)
307
+ disk_tier=resources.disk_tier,
308
+ region=resources.region,
309
+ zone=resources.zone)
305
310
  if default_instance_type is None:
306
311
  return resources_utils.FeasibleResources([], [], None)
307
312
  else: