skypilot-nightly 1.0.0.dev20250603__py3-none-any.whl → 1.0.0.dev20250605__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.
Files changed (142) hide show
  1. sky/__init__.py +3 -3
  2. sky/adaptors/kubernetes.py +8 -0
  3. sky/admin_policy.py +5 -0
  4. sky/backends/backend_utils.py +1 -0
  5. sky/backends/cloud_vm_ray_backend.py +8 -4
  6. sky/{clouds/service_catalog → catalog}/__init__.py +6 -17
  7. sky/{clouds/service_catalog → catalog}/aws_catalog.py +3 -3
  8. sky/{clouds/service_catalog → catalog}/azure_catalog.py +2 -2
  9. sky/{clouds/service_catalog → catalog}/common.py +2 -2
  10. sky/{clouds/service_catalog → catalog}/cudo_catalog.py +1 -1
  11. sky/{clouds/service_catalog → catalog}/data_fetchers/analyze.py +1 -1
  12. sky/{clouds/service_catalog → catalog}/data_fetchers/fetch_aws.py +1 -1
  13. sky/{clouds/service_catalog → catalog}/data_fetchers/fetch_vsphere.py +1 -1
  14. sky/{clouds/service_catalog → catalog}/do_catalog.py +1 -1
  15. sky/{clouds/service_catalog → catalog}/fluidstack_catalog.py +1 -1
  16. sky/{clouds/service_catalog → catalog}/gcp_catalog.py +2 -2
  17. sky/{clouds/service_catalog → catalog}/ibm_catalog.py +1 -1
  18. sky/{clouds/service_catalog → catalog}/kubernetes_catalog.py +2 -2
  19. sky/{clouds/service_catalog → catalog}/lambda_catalog.py +1 -1
  20. sky/{clouds/service_catalog → catalog}/nebius_catalog.py +1 -1
  21. sky/{clouds/service_catalog → catalog}/oci_catalog.py +1 -1
  22. sky/{clouds/service_catalog → catalog}/paperspace_catalog.py +1 -1
  23. sky/{clouds/service_catalog → catalog}/runpod_catalog.py +1 -1
  24. sky/{clouds/service_catalog → catalog}/scp_catalog.py +1 -1
  25. sky/{clouds/service_catalog → catalog}/ssh_catalog.py +3 -3
  26. sky/{clouds/service_catalog → catalog}/vast_catalog.py +1 -1
  27. sky/{clouds/service_catalog → catalog}/vsphere_catalog.py +1 -1
  28. sky/cli.py +16 -13
  29. sky/client/cli.py +16 -13
  30. sky/client/sdk.py +30 -12
  31. sky/clouds/aws.py +41 -40
  32. sky/clouds/azure.py +31 -34
  33. sky/clouds/cloud.py +8 -8
  34. sky/clouds/cudo.py +26 -26
  35. sky/clouds/do.py +24 -24
  36. sky/clouds/fluidstack.py +27 -29
  37. sky/clouds/gcp.py +42 -42
  38. sky/clouds/ibm.py +26 -26
  39. sky/clouds/kubernetes.py +24 -12
  40. sky/clouds/lambda_cloud.py +28 -30
  41. sky/clouds/nebius.py +26 -28
  42. sky/clouds/oci.py +32 -32
  43. sky/clouds/paperspace.py +24 -26
  44. sky/clouds/runpod.py +26 -28
  45. sky/clouds/scp.py +37 -36
  46. sky/clouds/utils/gcp_utils.py +3 -2
  47. sky/clouds/vast.py +27 -27
  48. sky/clouds/vsphere.py +12 -15
  49. sky/core.py +2 -2
  50. sky/dashboard/out/404.html +1 -1
  51. sky/dashboard/out/_next/static/chunks/614-635a84e87800f99e.js +66 -0
  52. sky/dashboard/out/_next/static/chunks/{856-f1b1f7f47edde2e8.js → 856-3a32da4b84176f6d.js} +1 -1
  53. sky/dashboard/out/_next/static/chunks/937.3759f538f11a0953.js +1 -0
  54. sky/dashboard/out/_next/static/chunks/pages/config-1a1eeb949dab8897.js +6 -0
  55. sky/dashboard/out/_next/static/chunks/pages/users-262aab38b9baaf3a.js +16 -0
  56. sky/dashboard/out/_next/static/chunks/pages/workspaces-384ea5fa0cea8f28.js +1 -0
  57. sky/dashboard/out/_next/static/chunks/{webpack-f27c9a32aa3d9c6d.js → webpack-65d465f948974c0d.js} +1 -1
  58. sky/dashboard/out/_next/static/css/667d941a2888ce6e.css +3 -0
  59. sky/dashboard/out/_next/static/qjhIe-yC6nHcLKBqpzO1M/_buildManifest.js +1 -0
  60. sky/dashboard/out/clusters/[cluster]/[job].html +1 -1
  61. sky/dashboard/out/clusters/[cluster].html +1 -1
  62. sky/dashboard/out/clusters.html +1 -1
  63. sky/dashboard/out/config.html +1 -1
  64. sky/dashboard/out/index.html +1 -1
  65. sky/dashboard/out/infra/[context].html +1 -1
  66. sky/dashboard/out/infra.html +1 -1
  67. sky/dashboard/out/jobs/[job].html +1 -1
  68. sky/dashboard/out/jobs.html +1 -1
  69. sky/dashboard/out/users.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/data/storage_utils.py +5 -2
  74. sky/execution.py +44 -46
  75. sky/global_user_state.py +119 -86
  76. sky/jobs/client/sdk.py +4 -1
  77. sky/jobs/server/core.py +6 -2
  78. sky/models.py +1 -0
  79. sky/optimizer.py +1 -1
  80. sky/provision/cudo/cudo_machine_type.py +1 -1
  81. sky/provision/kubernetes/utils.py +35 -22
  82. sky/provision/vast/utils.py +1 -1
  83. sky/provision/vsphere/common/vim_utils.py +1 -2
  84. sky/provision/vsphere/instance.py +1 -1
  85. sky/provision/vsphere/vsphere_utils.py +7 -11
  86. sky/resources.py +24 -3
  87. sky/serve/server/core.py +1 -1
  88. sky/server/constants.py +3 -1
  89. sky/server/requests/executor.py +4 -1
  90. sky/server/requests/payloads.py +25 -0
  91. sky/server/requests/serializers/decoders.py +1 -1
  92. sky/server/server.py +33 -12
  93. sky/server/stream_utils.py +2 -38
  94. sky/setup_files/MANIFEST.in +1 -0
  95. sky/setup_files/dependencies.py +2 -0
  96. sky/skylet/constants.py +10 -4
  97. sky/skypilot_config.py +92 -39
  98. sky/templates/websocket_proxy.py +11 -1
  99. sky/usage/usage_lib.py +4 -3
  100. sky/users/__init__.py +0 -0
  101. sky/users/model.conf +15 -0
  102. sky/users/permission.py +178 -0
  103. sky/users/rbac.py +86 -0
  104. sky/users/server.py +66 -0
  105. sky/utils/accelerator_registry.py +3 -3
  106. sky/utils/kubernetes/deploy_remote_cluster.py +2 -1
  107. sky/utils/schemas.py +20 -10
  108. sky/workspaces/core.py +2 -2
  109. {skypilot_nightly-1.0.0.dev20250603.dist-info → skypilot_nightly-1.0.0.dev20250605.dist-info}/METADATA +3 -1
  110. {skypilot_nightly-1.0.0.dev20250603.dist-info → skypilot_nightly-1.0.0.dev20250605.dist-info}/RECORD +134 -130
  111. sky/clouds/service_catalog/constants.py +0 -8
  112. sky/dashboard/out/_next/static/chunks/614-3d29f98e0634b179.js +0 -66
  113. sky/dashboard/out/_next/static/chunks/937.f97f83652028e944.js +0 -1
  114. sky/dashboard/out/_next/static/chunks/pages/config-35383adcb0edb5e2.js +0 -6
  115. sky/dashboard/out/_next/static/chunks/pages/users-07b523ccb19317ad.js +0 -6
  116. sky/dashboard/out/_next/static/chunks/pages/workspaces-f54921ec9eb20965.js +0 -1
  117. sky/dashboard/out/_next/static/css/63d3995d8b528eb1.css +0 -3
  118. sky/dashboard/out/_next/static/zTAFq_Iv6_yxQj3fXvJWR/_buildManifest.js +0 -1
  119. /sky/{clouds/service_catalog → catalog}/config.py +0 -0
  120. /sky/{clouds/service_catalog → catalog}/data_fetchers/__init__.py +0 -0
  121. /sky/{clouds/service_catalog → catalog}/data_fetchers/fetch_azure.py +0 -0
  122. /sky/{clouds/service_catalog → catalog}/data_fetchers/fetch_cudo.py +0 -0
  123. /sky/{clouds/service_catalog → catalog}/data_fetchers/fetch_fluidstack.py +0 -0
  124. /sky/{clouds/service_catalog → catalog}/data_fetchers/fetch_gcp.py +0 -0
  125. /sky/{clouds/service_catalog → catalog}/data_fetchers/fetch_ibm.py +0 -0
  126. /sky/{clouds/service_catalog → catalog}/data_fetchers/fetch_lambda_cloud.py +0 -0
  127. /sky/{clouds/service_catalog → catalog}/data_fetchers/fetch_vast.py +0 -0
  128. /sky/dashboard/out/_next/static/chunks/{121-8f55ee3fa6301784.js → 121-865d2bf8a3b84c6a.js} +0 -0
  129. /sky/dashboard/out/_next/static/chunks/{236-fef38aa6e5639300.js → 236-4c0dc6f63ccc6319.js} +0 -0
  130. /sky/dashboard/out/_next/static/chunks/{37-947904ccc5687bac.js → 37-beedd583fea84cc8.js} +0 -0
  131. /sky/dashboard/out/_next/static/chunks/{682-2be9b0f169727f2f.js → 682-6647f0417d5662f0.js} +0 -0
  132. /sky/dashboard/out/_next/static/chunks/{843-a097338acb89b7d7.js → 843-c296541442d4af88.js} +0 -0
  133. /sky/dashboard/out/_next/static/chunks/{969-d7b6fb7f602bfcb3.js → 969-c7abda31c10440ac.js} +0 -0
  134. /sky/dashboard/out/_next/static/chunks/pages/{_app-67925f5e6382e22f.js → _app-cb81dc4d27f4d009.js} +0 -0
  135. /sky/dashboard/out/_next/static/chunks/pages/clusters/[cluster]/{[job]-158b70da336d8607.js → [job]-65d04d5d77cbb6b6.js} +0 -0
  136. /sky/dashboard/out/_next/static/chunks/pages/clusters/{[cluster]-62c9982dc3675725.js → [cluster]-beabbcd7606c1a23.js} +0 -0
  137. /sky/dashboard/out/_next/static/chunks/pages/jobs/{[job]-a62a3c65dc9bc57c.js → [job]-86c47edc500f15f9.js} +0 -0
  138. /sky/dashboard/out/_next/static/{zTAFq_Iv6_yxQj3fXvJWR → qjhIe-yC6nHcLKBqpzO1M}/_ssgManifest.js +0 -0
  139. {skypilot_nightly-1.0.0.dev20250603.dist-info → skypilot_nightly-1.0.0.dev20250605.dist-info}/WHEEL +0 -0
  140. {skypilot_nightly-1.0.0.dev20250603.dist-info → skypilot_nightly-1.0.0.dev20250605.dist-info}/entry_points.txt +0 -0
  141. {skypilot_nightly-1.0.0.dev20250603.dist-info → skypilot_nightly-1.0.0.dev20250605.dist-info}/licenses/LICENSE +0 -0
  142. {skypilot_nightly-1.0.0.dev20250603.dist-info → skypilot_nightly-1.0.0.dev20250605.dist-info}/top_level.txt +0 -0
sky/clouds/nebius.py CHANGED
@@ -4,11 +4,11 @@ import os
4
4
  import typing
5
5
  from typing import Any, Dict, Iterator, List, Optional, Tuple, Union
6
6
 
7
+ from sky import catalog
7
8
  from sky import clouds
8
9
  from sky import exceptions
9
10
  from sky import skypilot_config
10
11
  from sky.adaptors import nebius
11
- from sky.clouds import service_catalog
12
12
  from sky.utils import annotations
13
13
  from sky.utils import registry
14
14
  from sky.utils import resources_utils
@@ -92,7 +92,7 @@ class Nebius(clouds.Cloud):
92
92
  del accelerators, zone # unused
93
93
  if use_spot:
94
94
  return []
95
- regions = service_catalog.get_region_zones_for_instance_type(
95
+ regions = catalog.get_region_zones_for_instance_type(
96
96
  instance_type, use_spot, 'nebius')
97
97
 
98
98
  if region is not None:
@@ -104,8 +104,8 @@ class Nebius(clouds.Cloud):
104
104
  cls,
105
105
  instance_type: str,
106
106
  ) -> Tuple[Optional[float], Optional[float]]:
107
- return service_catalog.get_vcpus_mem_from_instance_type(instance_type,
108
- clouds='nebius')
107
+ return catalog.get_vcpus_mem_from_instance_type(instance_type,
108
+ clouds='nebius')
109
109
 
110
110
  @classmethod
111
111
  def zones_provision_loop(
@@ -132,11 +132,11 @@ class Nebius(clouds.Cloud):
132
132
  use_spot: bool,
133
133
  region: Optional[str] = None,
134
134
  zone: Optional[str] = None) -> float:
135
- return service_catalog.get_hourly_cost(instance_type,
136
- use_spot=use_spot,
137
- region=region,
138
- zone=zone,
139
- clouds='nebius')
135
+ return catalog.get_hourly_cost(instance_type,
136
+ use_spot=use_spot,
137
+ region=region,
138
+ zone=zone,
139
+ clouds='nebius')
140
140
 
141
141
  def accelerators_to_hourly_cost(self,
142
142
  accelerators: Dict[str, int],
@@ -165,18 +165,18 @@ class Nebius(clouds.Cloud):
165
165
  disk_tier: Optional[resources_utils.DiskTier] = None
166
166
  ) -> Optional[str]:
167
167
  """Returns the default instance type for Nebius."""
168
- return service_catalog.get_default_instance_type(cpus=cpus,
169
- memory=memory,
170
- disk_tier=disk_tier,
171
- clouds='nebius')
168
+ return catalog.get_default_instance_type(cpus=cpus,
169
+ memory=memory,
170
+ disk_tier=disk_tier,
171
+ clouds='nebius')
172
172
 
173
173
  @classmethod
174
174
  def get_accelerators_from_instance_type(
175
175
  cls,
176
176
  instance_type: str,
177
177
  ) -> Optional[Dict[str, Union[int, float]]]:
178
- return service_catalog.get_accelerators_from_instance_type(
179
- instance_type, clouds='nebius')
178
+ return catalog.get_accelerators_from_instance_type(instance_type,
179
+ clouds='nebius')
180
180
 
181
181
  @classmethod
182
182
  def get_zone_shell_cmd(cls) -> Optional[str]:
@@ -277,15 +277,15 @@ class Nebius(clouds.Cloud):
277
277
 
278
278
  assert len(accelerators) == 1, resources
279
279
  acc, acc_count = list(accelerators.items())[0]
280
- (instance_list, fuzzy_candidate_list
281
- ) = service_catalog.get_instance_type_for_accelerator(
282
- acc,
283
- acc_count,
284
- use_spot=resources.use_spot,
285
- cpus=resources.cpus,
286
- region=resources.region,
287
- zone=resources.zone,
288
- clouds='nebius')
280
+ (instance_list,
281
+ fuzzy_candidate_list) = catalog.get_instance_type_for_accelerator(
282
+ acc,
283
+ acc_count,
284
+ use_spot=resources.use_spot,
285
+ cpus=resources.cpus,
286
+ region=resources.region,
287
+ zone=resources.zone,
288
+ clouds='nebius')
289
289
  if instance_list is None:
290
290
  return resources_utils.FeasibleResources([], fuzzy_candidate_list,
291
291
  None)
@@ -368,12 +368,10 @@ class Nebius(clouds.Cloud):
368
368
  return None
369
369
 
370
370
  def instance_type_exists(self, instance_type: str) -> bool:
371
- return service_catalog.instance_type_exists(instance_type, 'nebius')
371
+ return catalog.instance_type_exists(instance_type, 'nebius')
372
372
 
373
373
  def validate_region_zone(self, region: Optional[str], zone: Optional[str]):
374
- return service_catalog.validate_region_zone(region,
375
- zone,
376
- clouds='nebius')
374
+ return catalog.validate_region_zone(region, zone, clouds='nebius')
377
375
 
378
376
  @classmethod
379
377
  def get_user_identities(cls) -> Optional[List[List[str]]]:
sky/clouds/oci.py CHANGED
@@ -25,10 +25,10 @@ import os
25
25
  import typing
26
26
  from typing import Any, Dict, Iterator, List, Optional, Tuple, Union
27
27
 
28
+ from sky import catalog
28
29
  from sky import clouds
29
30
  from sky import exceptions
30
31
  from sky.adaptors import oci as oci_adaptor
31
- from sky.clouds import service_catalog
32
32
  from sky.clouds.utils import oci_utils
33
33
  from sky.provision.oci.query_utils import query_helper
34
34
  from sky.utils import common_utils
@@ -97,7 +97,7 @@ class OCI(clouds.Cloud):
97
97
  zone: Optional[str]) -> List[clouds.Region]:
98
98
  del accelerators # unused
99
99
 
100
- regions = service_catalog.get_region_zones_for_instance_type(
100
+ regions = catalog.get_region_zones_for_instance_type(
101
101
  instance_type, use_spot, 'oci')
102
102
 
103
103
  if region is not None:
@@ -114,8 +114,8 @@ class OCI(clouds.Cloud):
114
114
  cls,
115
115
  instance_type: str,
116
116
  ) -> Tuple[Optional[float], Optional[float]]:
117
- return service_catalog.get_vcpus_mem_from_instance_type(instance_type,
118
- clouds='oci')
117
+ return catalog.get_vcpus_mem_from_instance_type(instance_type,
118
+ clouds='oci')
119
119
 
120
120
  @classmethod
121
121
  def zones_provision_loop(
@@ -143,11 +143,11 @@ class OCI(clouds.Cloud):
143
143
  use_spot: bool,
144
144
  region: Optional[str] = None,
145
145
  zone: Optional[str] = None) -> float:
146
- return service_catalog.get_hourly_cost(instance_type,
147
- use_spot=use_spot,
148
- region=region,
149
- zone=zone,
150
- clouds='oci')
146
+ return catalog.get_hourly_cost(instance_type,
147
+ use_spot=use_spot,
148
+ region=region,
149
+ zone=zone,
150
+ clouds='oci')
151
151
 
152
152
  def accelerators_to_hourly_cost(self,
153
153
  accelerators: Dict[str, int],
@@ -189,18 +189,18 @@ class OCI(clouds.Cloud):
189
189
  memory: Optional[str] = None,
190
190
  disk_tier: Optional[resources_utils.DiskTier] = None
191
191
  ) -> Optional[str]:
192
- return service_catalog.get_default_instance_type(cpus=cpus,
193
- memory=memory,
194
- disk_tier=disk_tier,
195
- clouds='oci')
192
+ return catalog.get_default_instance_type(cpus=cpus,
193
+ memory=memory,
194
+ disk_tier=disk_tier,
195
+ clouds='oci')
196
196
 
197
197
  @classmethod
198
198
  def get_accelerators_from_instance_type(
199
199
  cls,
200
200
  instance_type: str,
201
201
  ) -> Optional[Dict[str, Union[int, float]]]:
202
- return service_catalog.get_accelerators_from_instance_type(
203
- instance_type, clouds='oci')
202
+ return catalog.get_accelerators_from_instance_type(instance_type,
203
+ clouds='oci')
204
204
 
205
205
  @classmethod
206
206
  def get_zone_shell_cmd(cls) -> Optional[str]:
@@ -274,7 +274,7 @@ class OCI(clouds.Cloud):
274
274
  if zone is None:
275
275
  # If zone is not specified, try to get the first zone.
276
276
  if zones is None:
277
- regions = service_catalog.get_region_zones_for_instance_type(
277
+ regions = catalog.get_region_zones_for_instance_type(
278
278
  instance_type=original_instance_type,
279
279
  use_spot=resources.use_spot,
280
280
  clouds='oci')
@@ -319,7 +319,7 @@ class OCI(clouds.Cloud):
319
319
  region=region.name)
320
320
 
321
321
  # pylint: disable=import-outside-toplevel
322
- from sky.clouds.service_catalog import oci_catalog
322
+ from sky.catalog import oci_catalog
323
323
  os_type = oci_catalog.get_image_os_from_tag(tag=image_str,
324
324
  region=region.name)
325
325
  logger.debug(f'OS type for the image {image_id} is {os_type}')
@@ -383,16 +383,16 @@ class OCI(clouds.Cloud):
383
383
  assert len(accelerators) == 1, resources
384
384
 
385
385
  acc, acc_count = list(accelerators.items())[0]
386
- (instance_list, fuzzy_candidate_list
387
- ) = service_catalog.get_instance_type_for_accelerator(
388
- acc,
389
- acc_count,
390
- use_spot=resources.use_spot,
391
- cpus=resources.cpus,
392
- memory=resources.memory,
393
- region=resources.region,
394
- zone=resources.zone,
395
- clouds='oci')
386
+ (instance_list,
387
+ fuzzy_candidate_list) = catalog.get_instance_type_for_accelerator(
388
+ acc,
389
+ acc_count,
390
+ use_spot=resources.use_spot,
391
+ cpus=resources.cpus,
392
+ memory=resources.memory,
393
+ region=resources.region,
394
+ zone=resources.zone,
395
+ clouds='oci')
396
396
  if instance_list is None:
397
397
  return resources_utils.FeasibleResources([], fuzzy_candidate_list,
398
398
  None)
@@ -532,10 +532,10 @@ class OCI(clouds.Cloud):
532
532
  return None
533
533
 
534
534
  def instance_type_exists(self, instance_type: str) -> bool:
535
- return service_catalog.instance_type_exists(instance_type, 'oci')
535
+ return catalog.instance_type_exists(instance_type, 'oci')
536
536
 
537
537
  def validate_region_zone(self, region: Optional[str], zone: Optional[str]):
538
- return service_catalog.validate_region_zone(region, zone, clouds='oci')
538
+ return catalog.validate_region_zone(region, zone, clouds='oci')
539
539
 
540
540
  @classmethod
541
541
  def get_image_size(cls, image_id: str, region: Optional[str]) -> float:
@@ -556,9 +556,9 @@ class OCI(clouds.Cloud):
556
556
  region=region_name)
557
557
 
558
558
  if image_id_str.startswith('skypilot:'):
559
- image_id_str = service_catalog.get_image_id_from_tag(image_id_str,
560
- region_name,
561
- clouds='oci')
559
+ image_id_str = catalog.get_image_id_from_tag(image_id_str,
560
+ region_name,
561
+ clouds='oci')
562
562
 
563
563
  # Image_id should be impossible be None, except for the case when
564
564
  # user specify an image tag which does not exist in the image.csv
sky/clouds/paperspace.py CHANGED
@@ -3,9 +3,9 @@
3
3
  import typing
4
4
  from typing import Dict, Iterator, List, Optional, Tuple, Union
5
5
 
6
+ from sky import catalog
6
7
  from sky import clouds
7
8
  from sky.adaptors import common as adaptors_common
8
- from sky.clouds import service_catalog
9
9
  from sky.provision.paperspace import utils
10
10
  from sky.utils import registry
11
11
  from sky.utils import resources_utils
@@ -88,7 +88,7 @@ class Paperspace(clouds.Cloud):
88
88
  if use_spot:
89
89
  return []
90
90
  else:
91
- regions = service_catalog.get_region_zones_for_instance_type(
91
+ regions = catalog.get_region_zones_for_instance_type(
92
92
  instance_type, use_spot, 'paperspace')
93
93
 
94
94
  if region is not None:
@@ -100,8 +100,8 @@ class Paperspace(clouds.Cloud):
100
100
  cls,
101
101
  instance_type: str,
102
102
  ) -> Tuple[Optional[float], Optional[float]]:
103
- return service_catalog.get_vcpus_mem_from_instance_type(
104
- instance_type, clouds='paperspace')
103
+ return catalog.get_vcpus_mem_from_instance_type(instance_type,
104
+ clouds='paperspace')
105
105
 
106
106
  @classmethod
107
107
  def zones_provision_loop(
@@ -130,7 +130,7 @@ class Paperspace(clouds.Cloud):
130
130
  region: Optional[str] = None,
131
131
  zone: Optional[str] = None,
132
132
  ) -> float:
133
- return service_catalog.get_hourly_cost(
133
+ return catalog.get_hourly_cost(
134
134
  instance_type,
135
135
  use_spot=use_spot,
136
136
  region=region,
@@ -163,16 +163,16 @@ class Paperspace(clouds.Cloud):
163
163
  disk_tier: Optional[resources_utils.DiskTier] = None,
164
164
  ) -> Optional[str]:
165
165
  """Returns the default instance type for Paperspace."""
166
- return service_catalog.get_default_instance_type(cpus=cpus,
167
- memory=memory,
168
- disk_tier=disk_tier,
169
- clouds='paperspace')
166
+ return catalog.get_default_instance_type(cpus=cpus,
167
+ memory=memory,
168
+ disk_tier=disk_tier,
169
+ clouds='paperspace')
170
170
 
171
171
  @classmethod
172
172
  def get_accelerators_from_instance_type(
173
173
  cls, instance_type: str) -> Optional[Dict[str, Union[int, float]]]:
174
- return service_catalog.get_accelerators_from_instance_type(
175
- instance_type, clouds='paperspace')
174
+ return catalog.get_accelerators_from_instance_type(instance_type,
175
+ clouds='paperspace')
176
176
 
177
177
  @classmethod
178
178
  def get_zone_shell_cmd(cls) -> Optional[str]:
@@ -240,17 +240,17 @@ class Paperspace(clouds.Cloud):
240
240
 
241
241
  assert len(accelerators) == 1, resources
242
242
  acc, acc_count = list(accelerators.items())[0]
243
- (instance_list, fuzzy_candidate_list) = (
244
- service_catalog.get_instance_type_for_accelerator(
245
- acc,
246
- acc_count,
247
- use_spot=resources.use_spot,
248
- cpus=resources.cpus,
249
- memory=resources.memory,
250
- region=resources.region,
251
- zone=resources.zone,
252
- clouds='paperspace',
253
- ))
243
+ (instance_list,
244
+ fuzzy_candidate_list) = (catalog.get_instance_type_for_accelerator(
245
+ acc,
246
+ acc_count,
247
+ use_spot=resources.use_spot,
248
+ cpus=resources.cpus,
249
+ memory=resources.memory,
250
+ region=resources.region,
251
+ zone=resources.zone,
252
+ clouds='paperspace',
253
+ ))
254
254
  if instance_list is None:
255
255
  return resources_utils.FeasibleResources([], fuzzy_candidate_list,
256
256
  None)
@@ -296,9 +296,7 @@ class Paperspace(clouds.Cloud):
296
296
  return None
297
297
 
298
298
  def instance_type_exists(self, instance_type: str) -> bool:
299
- return service_catalog.instance_type_exists(instance_type, 'paperspace')
299
+ return catalog.instance_type_exists(instance_type, 'paperspace')
300
300
 
301
301
  def validate_region_zone(self, region: Optional[str], zone: Optional[str]):
302
- return service_catalog.validate_region_zone(region,
303
- zone,
304
- clouds='paperspace')
302
+ return catalog.validate_region_zone(region, zone, clouds='paperspace')
sky/clouds/runpod.py CHANGED
@@ -3,8 +3,8 @@
3
3
  import typing
4
4
  from typing import Dict, Iterator, List, Optional, Tuple, Union
5
5
 
6
+ from sky import catalog
6
7
  from sky import clouds
7
- from sky.clouds import service_catalog
8
8
  from sky.utils import registry
9
9
  from sky.utils import resources_utils
10
10
 
@@ -72,7 +72,7 @@ class RunPod(clouds.Cloud):
72
72
  use_spot: bool, region: Optional[str],
73
73
  zone: Optional[str]) -> List[clouds.Region]:
74
74
  del accelerators # unused
75
- regions = service_catalog.get_region_zones_for_instance_type(
75
+ regions = catalog.get_region_zones_for_instance_type(
76
76
  instance_type, use_spot, 'runpod')
77
77
 
78
78
  if region is not None:
@@ -90,8 +90,8 @@ class RunPod(clouds.Cloud):
90
90
  cls,
91
91
  instance_type: str,
92
92
  ) -> Tuple[Optional[float], Optional[float]]:
93
- return service_catalog.get_vcpus_mem_from_instance_type(instance_type,
94
- clouds='runpod')
93
+ return catalog.get_vcpus_mem_from_instance_type(instance_type,
94
+ clouds='runpod')
95
95
 
96
96
  @classmethod
97
97
  def zones_provision_loop(
@@ -118,11 +118,11 @@ class RunPod(clouds.Cloud):
118
118
  use_spot: bool,
119
119
  region: Optional[str] = None,
120
120
  zone: Optional[str] = None) -> float:
121
- return service_catalog.get_hourly_cost(instance_type,
122
- use_spot=use_spot,
123
- region=region,
124
- zone=zone,
125
- clouds='runpod')
121
+ return catalog.get_hourly_cost(instance_type,
122
+ use_spot=use_spot,
123
+ region=region,
124
+ zone=zone,
125
+ clouds='runpod')
126
126
 
127
127
  def accelerators_to_hourly_cost(self,
128
128
  accelerators: Dict[str, int],
@@ -144,16 +144,16 @@ class RunPod(clouds.Cloud):
144
144
  disk_tier: Optional[resources_utils.DiskTier] = None
145
145
  ) -> Optional[str]:
146
146
  """Returns the default instance type for RunPod."""
147
- return service_catalog.get_default_instance_type(cpus=cpus,
148
- memory=memory,
149
- disk_tier=disk_tier,
150
- clouds='runpod')
147
+ return catalog.get_default_instance_type(cpus=cpus,
148
+ memory=memory,
149
+ disk_tier=disk_tier,
150
+ clouds='runpod')
151
151
 
152
152
  @classmethod
153
153
  def get_accelerators_from_instance_type(
154
154
  cls, instance_type: str) -> Optional[Dict[str, Union[int, float]]]:
155
- return service_catalog.get_accelerators_from_instance_type(
156
- instance_type, clouds='runpod')
155
+ return catalog.get_accelerators_from_instance_type(instance_type,
156
+ clouds='runpod')
157
157
 
158
158
  @classmethod
159
159
  def get_zone_shell_cmd(cls) -> Optional[str]:
@@ -245,15 +245,15 @@ class RunPod(clouds.Cloud):
245
245
 
246
246
  assert len(accelerators) == 1, resources
247
247
  acc, acc_count = list(accelerators.items())[0]
248
- (instance_list, fuzzy_candidate_list
249
- ) = service_catalog.get_instance_type_for_accelerator(
250
- acc,
251
- acc_count,
252
- use_spot=resources.use_spot,
253
- cpus=resources.cpus,
254
- region=resources.region,
255
- zone=resources.zone,
256
- clouds='runpod')
248
+ (instance_list,
249
+ fuzzy_candidate_list) = catalog.get_instance_type_for_accelerator(
250
+ acc,
251
+ acc_count,
252
+ use_spot=resources.use_spot,
253
+ cpus=resources.cpus,
254
+ region=resources.region,
255
+ zone=resources.zone,
256
+ clouds='runpod')
257
257
  if instance_list is None:
258
258
  return resources_utils.FeasibleResources([], fuzzy_candidate_list,
259
259
  None)
@@ -302,12 +302,10 @@ class RunPod(clouds.Cloud):
302
302
  return None
303
303
 
304
304
  def instance_type_exists(self, instance_type: str) -> bool:
305
- return service_catalog.instance_type_exists(instance_type, 'runpod')
305
+ return catalog.instance_type_exists(instance_type, 'runpod')
306
306
 
307
307
  def validate_region_zone(self, region: Optional[str], zone: Optional[str]):
308
- return service_catalog.validate_region_zone(region,
309
- zone,
310
- clouds='runpod')
308
+ return catalog.validate_region_zone(region, zone, clouds='runpod')
311
309
 
312
310
  @classmethod
313
311
  def get_image_size(cls, image_id: str, region: Optional[str]) -> float:
sky/clouds/scp.py CHANGED
@@ -7,10 +7,10 @@ to access the SCP catalog and check credentials for the SCP access.
7
7
  import typing
8
8
  from typing import Dict, Iterator, List, Optional, Tuple, Union
9
9
 
10
+ from sky import catalog
10
11
  from sky import clouds
11
12
  from sky import exceptions
12
13
  from sky import sky_logging
13
- from sky.clouds import service_catalog
14
14
  from sky.clouds.utils import scp_utils
15
15
  from sky.utils import registry
16
16
  from sky.utils import resources_utils
@@ -84,7 +84,7 @@ class SCP(clouds.Cloud):
84
84
 
85
85
  @classmethod
86
86
  def regions(cls) -> List['clouds.Region']:
87
- return service_catalog.regions(clouds='scp')
87
+ return catalog.regions(clouds='scp')
88
88
 
89
89
  @classmethod
90
90
  def regions_with_offering(cls, instance_type: Optional[str],
@@ -99,7 +99,7 @@ class SCP(clouds.Cloud):
99
99
  # Fall back to default regions
100
100
  regions = cls.regions()
101
101
  else:
102
- regions = service_catalog.get_region_zones_for_instance_type(
102
+ regions = catalog.get_region_zones_for_instance_type(
103
103
  instance_type, use_spot, 'scp')
104
104
 
105
105
  if region is not None:
@@ -131,11 +131,11 @@ class SCP(clouds.Cloud):
131
131
  use_spot: bool,
132
132
  region: Optional[str] = None,
133
133
  zone: Optional[str] = None) -> float:
134
- return service_catalog.get_hourly_cost(instance_type,
135
- use_spot=use_spot,
136
- region=region,
137
- zone=zone,
138
- clouds='scp')
134
+ return catalog.get_hourly_cost(instance_type,
135
+ use_spot=use_spot,
136
+ region=region,
137
+ zone=zone,
138
+ clouds='scp')
139
139
 
140
140
  def accelerators_to_hourly_cost(self,
141
141
  accelerators: Dict[str, int],
@@ -156,26 +156,26 @@ class SCP(clouds.Cloud):
156
156
  memory: Optional[str] = None,
157
157
  disk_tier: Optional['resources_utils.DiskTier'] = None
158
158
  ) -> Optional[str]:
159
- return service_catalog.get_default_instance_type(cpus=cpus,
160
- memory=memory,
161
- disk_tier=disk_tier,
162
- clouds='scp')
159
+ return catalog.get_default_instance_type(cpus=cpus,
160
+ memory=memory,
161
+ disk_tier=disk_tier,
162
+ clouds='scp')
163
163
 
164
164
  @classmethod
165
165
  def get_accelerators_from_instance_type(
166
166
  cls,
167
167
  instance_type: str,
168
168
  ) -> Optional[Dict[str, Union[int, float]]]:
169
- return service_catalog.get_accelerators_from_instance_type(
170
- instance_type, clouds='scp')
169
+ return catalog.get_accelerators_from_instance_type(instance_type,
170
+ clouds='scp')
171
171
 
172
172
  @classmethod
173
173
  def get_vcpus_mem_from_instance_type(
174
174
  cls,
175
175
  instance_type: str,
176
176
  ) -> Tuple[Optional[float], Optional[float]]:
177
- return service_catalog.get_vcpus_mem_from_instance_type(instance_type,
178
- clouds='scp')
177
+ return catalog.get_vcpus_mem_from_instance_type(instance_type,
178
+ clouds='scp')
179
179
 
180
180
  @classmethod
181
181
  def get_zone_shell_cmd(cls) -> Optional[str]:
@@ -223,9 +223,9 @@ class SCP(clouds.Cloud):
223
223
  assert region_name in image_id, image_id
224
224
  image_id_str = image_id[region_name]
225
225
  if image_id_str.startswith('skypilot:'):
226
- image_id_str = service_catalog.get_image_id_from_tag(image_id_str,
227
- region_name,
228
- clouds='scp')
226
+ image_id_str = catalog.get_image_id_from_tag(image_id_str,
227
+ region_name,
228
+ clouds='scp')
229
229
  if image_id_str is None:
230
230
  # Raise ResourcesUnavailableError to make sure the failover
231
231
  # in CloudVMRayBackend will be correctly triggered.
@@ -238,13 +238,14 @@ class SCP(clouds.Cloud):
238
238
  @classmethod
239
239
  def _get_default_ami(cls, region_name: str, instance_type: str) -> str:
240
240
  acc = cls.get_accelerators_from_instance_type(instance_type)
241
- image_id = service_catalog.get_image_id_from_tag('skypilot:ubuntu-2004',
242
- region_name,
243
- clouds='scp')
241
+ image_id = catalog.get_image_id_from_tag('skypilot:ubuntu-2004',
242
+ region_name,
243
+ clouds='scp')
244
244
  if acc is not None:
245
245
  assert len(acc) == 1, acc
246
- image_id = service_catalog.get_image_id_from_tag(
247
- 'skypilot:gpu-ubuntu-1804', region_name, clouds='scp')
246
+ image_id = catalog.get_image_id_from_tag('skypilot:gpu-ubuntu-1804',
247
+ region_name,
248
+ clouds='scp')
248
249
  if image_id is not None:
249
250
  return image_id
250
251
  # Raise ResourcesUnavailableError to make sure the failover in
@@ -302,16 +303,16 @@ class SCP(clouds.Cloud):
302
303
 
303
304
  assert len(accelerators) == 1, resources
304
305
  acc, acc_count = list(accelerators.items())[0]
305
- (instance_list, fuzzy_candidate_list
306
- ) = service_catalog.get_instance_type_for_accelerator(
307
- acc,
308
- acc_count,
309
- use_spot=resources.use_spot,
310
- cpus=resources.cpus,
311
- memory=resources.memory,
312
- region=resources.region,
313
- zone=resources.zone,
314
- clouds='scp')
306
+ (instance_list,
307
+ fuzzy_candidate_list) = catalog.get_instance_type_for_accelerator(
308
+ acc,
309
+ acc_count,
310
+ use_spot=resources.use_spot,
311
+ cpus=resources.cpus,
312
+ memory=resources.memory,
313
+ region=resources.region,
314
+ zone=resources.zone,
315
+ clouds='scp')
315
316
  if instance_list is None:
316
317
  return resources_utils.FeasibleResources([], fuzzy_candidate_list,
317
318
  None)
@@ -351,10 +352,10 @@ class SCP(clouds.Cloud):
351
352
  return None
352
353
 
353
354
  def instance_type_exists(self, instance_type: str) -> bool:
354
- return service_catalog.instance_type_exists(instance_type, 'scp')
355
+ return catalog.instance_type_exists(instance_type, 'scp')
355
356
 
356
357
  def validate_region_zone(self, region: Optional[str], zone: Optional[str]):
357
- return service_catalog.validate_region_zone(region, zone, clouds='scp')
358
+ return catalog.validate_region_zone(region, zone, clouds='scp')
358
359
 
359
360
  @staticmethod
360
361
  def _is_disk_size_allowed(resources):
@@ -36,7 +36,8 @@ def is_tpu(resources: Optional['resources_lib.Resources']) -> bool:
36
36
  def is_tpu_vm(resources: Optional['resources_lib.Resources']) -> bool:
37
37
  if not is_tpu(resources):
38
38
  return False
39
- assert (resources is not None and len(resources.accelerators) == 1)
39
+ assert (resources is not None and resources.accelerators is not None and
40
+ len(resources.accelerators) == 1)
40
41
  acc, _ = list(resources.accelerators.items())[0]
41
42
  if kubernetes_utils.is_tpu_on_gke(acc):
42
43
  return False
@@ -48,7 +49,7 @@ def is_tpu_vm(resources: Optional['resources_lib.Resources']) -> bool:
48
49
  def is_tpu_vm_pod(resources: Optional['resources_lib.Resources']) -> bool:
49
50
  if not is_tpu_vm(resources):
50
51
  return False
51
- assert resources is not None
52
+ assert resources is not None and resources.accelerators is not None
52
53
  acc, _ = list(resources.accelerators.items())[0]
53
54
  return not acc.endswith('-8')
54
55