skypilot-nightly 1.0.0.dev20250502__py3-none-any.whl → 1.0.0.dev20251203__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.
- sky/__init__.py +22 -6
- sky/adaptors/aws.py +81 -16
- sky/adaptors/common.py +25 -2
- sky/adaptors/coreweave.py +278 -0
- sky/adaptors/do.py +8 -2
- sky/adaptors/gcp.py +11 -0
- sky/adaptors/hyperbolic.py +8 -0
- sky/adaptors/ibm.py +5 -2
- sky/adaptors/kubernetes.py +149 -18
- sky/adaptors/nebius.py +173 -30
- sky/adaptors/primeintellect.py +1 -0
- sky/adaptors/runpod.py +68 -0
- sky/adaptors/seeweb.py +183 -0
- sky/adaptors/shadeform.py +89 -0
- sky/admin_policy.py +187 -4
- sky/authentication.py +179 -225
- sky/backends/__init__.py +4 -2
- sky/backends/backend.py +22 -9
- sky/backends/backend_utils.py +1323 -397
- sky/backends/cloud_vm_ray_backend.py +1749 -1029
- sky/backends/docker_utils.py +1 -1
- sky/backends/local_docker_backend.py +11 -6
- sky/backends/task_codegen.py +633 -0
- sky/backends/wheel_utils.py +55 -9
- sky/{clouds/service_catalog → catalog}/__init__.py +21 -19
- sky/{clouds/service_catalog → catalog}/aws_catalog.py +27 -8
- sky/{clouds/service_catalog → catalog}/azure_catalog.py +10 -7
- sky/{clouds/service_catalog → catalog}/common.py +90 -49
- sky/{clouds/service_catalog → catalog}/cudo_catalog.py +8 -5
- sky/{clouds/service_catalog → catalog}/data_fetchers/analyze.py +1 -1
- sky/{clouds/service_catalog → catalog}/data_fetchers/fetch_aws.py +116 -80
- sky/{clouds/service_catalog → catalog}/data_fetchers/fetch_cudo.py +38 -38
- sky/{clouds/service_catalog → catalog}/data_fetchers/fetch_gcp.py +70 -16
- sky/catalog/data_fetchers/fetch_hyperbolic.py +136 -0
- sky/{clouds/service_catalog → catalog}/data_fetchers/fetch_lambda_cloud.py +1 -0
- sky/catalog/data_fetchers/fetch_nebius.py +338 -0
- sky/catalog/data_fetchers/fetch_runpod.py +698 -0
- sky/catalog/data_fetchers/fetch_seeweb.py +329 -0
- sky/catalog/data_fetchers/fetch_shadeform.py +142 -0
- sky/{clouds/service_catalog → catalog}/data_fetchers/fetch_vast.py +1 -1
- sky/{clouds/service_catalog → catalog}/data_fetchers/fetch_vsphere.py +1 -1
- sky/{clouds/service_catalog → catalog}/do_catalog.py +5 -2
- sky/{clouds/service_catalog → catalog}/fluidstack_catalog.py +6 -3
- sky/{clouds/service_catalog → catalog}/gcp_catalog.py +41 -15
- sky/catalog/hyperbolic_catalog.py +136 -0
- sky/{clouds/service_catalog → catalog}/ibm_catalog.py +9 -6
- sky/{clouds/service_catalog → catalog}/kubernetes_catalog.py +36 -24
- sky/{clouds/service_catalog → catalog}/lambda_catalog.py +9 -6
- sky/{clouds/service_catalog → catalog}/nebius_catalog.py +9 -7
- sky/{clouds/service_catalog → catalog}/oci_catalog.py +9 -6
- sky/{clouds/service_catalog → catalog}/paperspace_catalog.py +5 -2
- sky/catalog/primeintellect_catalog.py +95 -0
- sky/{clouds/service_catalog → catalog}/runpod_catalog.py +11 -4
- sky/{clouds/service_catalog → catalog}/scp_catalog.py +9 -6
- sky/catalog/seeweb_catalog.py +184 -0
- sky/catalog/shadeform_catalog.py +165 -0
- sky/catalog/ssh_catalog.py +167 -0
- sky/{clouds/service_catalog → catalog}/vast_catalog.py +6 -3
- sky/{clouds/service_catalog → catalog}/vsphere_catalog.py +5 -2
- sky/check.py +533 -185
- sky/cli.py +5 -5975
- sky/client/{cli.py → cli/command.py} +2591 -1956
- sky/client/cli/deprecation_utils.py +99 -0
- sky/client/cli/flags.py +359 -0
- sky/client/cli/table_utils.py +322 -0
- sky/client/cli/utils.py +79 -0
- sky/client/common.py +78 -32
- sky/client/oauth.py +82 -0
- sky/client/sdk.py +1219 -319
- sky/client/sdk_async.py +827 -0
- sky/client/service_account_auth.py +47 -0
- sky/cloud_stores.py +82 -3
- sky/clouds/__init__.py +13 -0
- sky/clouds/aws.py +564 -164
- sky/clouds/azure.py +105 -83
- sky/clouds/cloud.py +140 -40
- sky/clouds/cudo.py +68 -50
- sky/clouds/do.py +66 -48
- sky/clouds/fluidstack.py +63 -44
- sky/clouds/gcp.py +339 -110
- sky/clouds/hyperbolic.py +293 -0
- sky/clouds/ibm.py +70 -49
- sky/clouds/kubernetes.py +570 -162
- sky/clouds/lambda_cloud.py +74 -54
- sky/clouds/nebius.py +210 -81
- sky/clouds/oci.py +88 -66
- sky/clouds/paperspace.py +61 -44
- sky/clouds/primeintellect.py +317 -0
- sky/clouds/runpod.py +164 -74
- sky/clouds/scp.py +89 -86
- sky/clouds/seeweb.py +477 -0
- sky/clouds/shadeform.py +400 -0
- sky/clouds/ssh.py +263 -0
- sky/clouds/utils/aws_utils.py +10 -4
- sky/clouds/utils/gcp_utils.py +87 -11
- sky/clouds/utils/oci_utils.py +38 -14
- sky/clouds/utils/scp_utils.py +231 -167
- sky/clouds/vast.py +99 -77
- sky/clouds/vsphere.py +51 -40
- sky/core.py +375 -173
- sky/dag.py +15 -0
- sky/dashboard/out/404.html +1 -1
- sky/dashboard/out/_next/static/96_E2yl3QAiIJGOYCkSpB/_buildManifest.js +1 -0
- sky/dashboard/out/_next/static/chunks/1141-e6aa9ab418717c59.js +11 -0
- sky/dashboard/out/_next/static/chunks/1272-1ef0bf0237faccdb.js +1 -0
- sky/dashboard/out/_next/static/chunks/1871-7e202677c42f43fe.js +6 -0
- sky/dashboard/out/_next/static/chunks/2260-7703229c33c5ebd5.js +1 -0
- sky/dashboard/out/_next/static/chunks/2350.fab69e61bac57b23.js +1 -0
- sky/dashboard/out/_next/static/chunks/2369.fc20f0c2c8ed9fe7.js +15 -0
- sky/dashboard/out/_next/static/chunks/2755.edd818326d489a1d.js +26 -0
- sky/dashboard/out/_next/static/chunks/3294.20a8540fe697d5ee.js +1 -0
- sky/dashboard/out/_next/static/chunks/3785.7e245f318f9d1121.js +1 -0
- sky/dashboard/out/_next/static/chunks/3800-7b45f9fbb6308557.js +1 -0
- sky/dashboard/out/_next/static/chunks/3850-ff4a9a69d978632b.js +1 -0
- sky/dashboard/out/_next/static/chunks/3937.210053269f121201.js +1 -0
- sky/dashboard/out/_next/static/chunks/4725.172ede95d1b21022.js +1 -0
- sky/dashboard/out/_next/static/chunks/4937.a2baa2df5572a276.js +15 -0
- sky/dashboard/out/_next/static/chunks/5739-d67458fcb1386c92.js +8 -0
- sky/dashboard/out/_next/static/chunks/6130-2be46d70a38f1e82.js +1 -0
- sky/dashboard/out/_next/static/chunks/616-3d59f75e2ccf9321.js +39 -0
- sky/dashboard/out/_next/static/chunks/6212-7bd06f60ba693125.js +13 -0
- sky/dashboard/out/_next/static/chunks/6856-8f27d1c10c98def8.js +1 -0
- sky/dashboard/out/_next/static/chunks/6989-01359c57e018caa4.js +1 -0
- sky/dashboard/out/_next/static/chunks/6990-9146207c4567fdfd.js +1 -0
- sky/dashboard/out/_next/static/chunks/7359-c8d04e06886000b3.js +30 -0
- sky/dashboard/out/_next/static/chunks/7411-b15471acd2cba716.js +41 -0
- sky/dashboard/out/_next/static/chunks/7615-019513abc55b3b47.js +1 -0
- sky/dashboard/out/_next/static/chunks/8640.5b9475a2d18c5416.js +16 -0
- sky/dashboard/out/_next/static/chunks/8969-452f9d5cbdd2dc73.js +1 -0
- sky/dashboard/out/_next/static/chunks/9025.fa408f3242e9028d.js +6 -0
- sky/dashboard/out/_next/static/chunks/9353-cff34f7e773b2e2b.js +1 -0
- sky/dashboard/out/_next/static/chunks/9360.a536cf6b1fa42355.js +31 -0
- sky/dashboard/out/_next/static/chunks/9847.3aaca6bb33455140.js +30 -0
- sky/dashboard/out/_next/static/chunks/fd9d1056-86323a29a8f7e46a.js +1 -0
- sky/dashboard/out/_next/static/chunks/framework-cf60a09ccd051a10.js +33 -0
- sky/dashboard/out/_next/static/chunks/main-app-587214043926b3cc.js +1 -0
- sky/dashboard/out/_next/static/chunks/main-f15ccb73239a3bf1.js +1 -0
- sky/dashboard/out/_next/static/chunks/pages/_app-bde01e4a2beec258.js +34 -0
- sky/dashboard/out/_next/static/chunks/pages/_error-c66a4e8afc46f17b.js +1 -0
- sky/dashboard/out/_next/static/chunks/pages/clusters/[cluster]/[job]-792db96d918c98c9.js +16 -0
- sky/dashboard/out/_next/static/chunks/pages/clusters/[cluster]-abfcac9c137aa543.js +1 -0
- sky/dashboard/out/_next/static/chunks/pages/clusters-ee39056f9851a3ff.js +1 -0
- sky/dashboard/out/_next/static/chunks/pages/config-dfb9bf07b13045f4.js +1 -0
- sky/dashboard/out/_next/static/chunks/pages/index-444f1804401f04ea.js +1 -0
- sky/dashboard/out/_next/static/chunks/pages/infra/[context]-c0b5935149902e6f.js +1 -0
- sky/dashboard/out/_next/static/chunks/pages/infra-aed0ea19df7cf961.js +1 -0
- sky/dashboard/out/_next/static/chunks/pages/jobs/[job]-d66997e2bfc837cf.js +16 -0
- sky/dashboard/out/_next/static/chunks/pages/jobs/pools/[pool]-9faf940b253e3e06.js +21 -0
- sky/dashboard/out/_next/static/chunks/pages/jobs-2072b48b617989c9.js +1 -0
- sky/dashboard/out/_next/static/chunks/pages/users-f42674164aa73423.js +1 -0
- sky/dashboard/out/_next/static/chunks/pages/volumes-b84b948ff357c43e.js +1 -0
- sky/dashboard/out/_next/static/chunks/pages/workspace/new-3f88a1c7e86a3f86.js +1 -0
- sky/dashboard/out/_next/static/chunks/pages/workspaces/[name]-84a40f8c7c627fe4.js +1 -0
- sky/dashboard/out/_next/static/chunks/pages/workspaces-531b2f8c4bf89f82.js +1 -0
- sky/dashboard/out/_next/static/chunks/webpack-64e05f17bf2cf8ce.js +1 -0
- sky/dashboard/out/_next/static/css/0748ce22df867032.css +3 -0
- sky/dashboard/out/clusters/[cluster]/[job].html +1 -1
- sky/dashboard/out/clusters/[cluster].html +1 -1
- sky/dashboard/out/clusters.html +1 -1
- sky/dashboard/out/config.html +1 -0
- sky/dashboard/out/index.html +1 -1
- sky/dashboard/out/infra/[context].html +1 -0
- sky/dashboard/out/infra.html +1 -0
- sky/dashboard/out/jobs/[job].html +1 -1
- sky/dashboard/out/jobs/pools/[pool].html +1 -0
- sky/dashboard/out/jobs.html +1 -1
- sky/dashboard/out/users.html +1 -0
- sky/dashboard/out/volumes.html +1 -0
- sky/dashboard/out/workspace/new.html +1 -0
- sky/dashboard/out/workspaces/[name].html +1 -0
- sky/dashboard/out/workspaces.html +1 -0
- sky/data/data_utils.py +137 -1
- sky/data/mounting_utils.py +269 -84
- sky/data/storage.py +1460 -1807
- sky/data/storage_utils.py +43 -57
- sky/exceptions.py +126 -2
- sky/execution.py +216 -63
- sky/global_user_state.py +2390 -586
- sky/jobs/__init__.py +7 -0
- sky/jobs/client/sdk.py +300 -58
- sky/jobs/client/sdk_async.py +161 -0
- sky/jobs/constants.py +15 -8
- sky/jobs/controller.py +848 -275
- sky/jobs/file_content_utils.py +128 -0
- sky/jobs/log_gc.py +193 -0
- sky/jobs/recovery_strategy.py +402 -152
- sky/jobs/scheduler.py +314 -189
- sky/jobs/server/core.py +836 -255
- sky/jobs/server/server.py +156 -115
- sky/jobs/server/utils.py +136 -0
- sky/jobs/state.py +2109 -706
- sky/jobs/utils.py +1306 -215
- sky/logs/__init__.py +21 -0
- sky/logs/agent.py +108 -0
- sky/logs/aws.py +243 -0
- sky/logs/gcp.py +91 -0
- sky/metrics/__init__.py +0 -0
- sky/metrics/utils.py +453 -0
- sky/models.py +78 -1
- sky/optimizer.py +164 -70
- sky/provision/__init__.py +90 -4
- sky/provision/aws/config.py +147 -26
- sky/provision/aws/instance.py +136 -50
- sky/provision/azure/instance.py +11 -6
- sky/provision/common.py +13 -1
- sky/provision/cudo/cudo_machine_type.py +1 -1
- sky/provision/cudo/cudo_utils.py +14 -8
- sky/provision/cudo/cudo_wrapper.py +72 -71
- sky/provision/cudo/instance.py +10 -6
- sky/provision/do/instance.py +10 -6
- sky/provision/do/utils.py +4 -3
- sky/provision/docker_utils.py +140 -33
- sky/provision/fluidstack/instance.py +13 -8
- sky/provision/gcp/__init__.py +1 -0
- sky/provision/gcp/config.py +301 -19
- sky/provision/gcp/constants.py +218 -0
- sky/provision/gcp/instance.py +36 -8
- sky/provision/gcp/instance_utils.py +18 -4
- sky/provision/gcp/volume_utils.py +247 -0
- sky/provision/hyperbolic/__init__.py +12 -0
- sky/provision/hyperbolic/config.py +10 -0
- sky/provision/hyperbolic/instance.py +437 -0
- sky/provision/hyperbolic/utils.py +373 -0
- sky/provision/instance_setup.py +101 -20
- sky/provision/kubernetes/__init__.py +5 -0
- sky/provision/kubernetes/config.py +9 -52
- sky/provision/kubernetes/constants.py +17 -0
- sky/provision/kubernetes/instance.py +919 -280
- sky/provision/kubernetes/manifests/fusermount-server-daemonset.yaml +1 -2
- sky/provision/kubernetes/network.py +27 -17
- sky/provision/kubernetes/network_utils.py +44 -43
- sky/provision/kubernetes/utils.py +1221 -534
- sky/provision/kubernetes/volume.py +343 -0
- sky/provision/lambda_cloud/instance.py +22 -16
- sky/provision/nebius/constants.py +50 -0
- sky/provision/nebius/instance.py +19 -6
- sky/provision/nebius/utils.py +237 -137
- sky/provision/oci/instance.py +10 -5
- sky/provision/paperspace/instance.py +10 -7
- sky/provision/paperspace/utils.py +1 -1
- sky/provision/primeintellect/__init__.py +10 -0
- sky/provision/primeintellect/config.py +11 -0
- sky/provision/primeintellect/instance.py +454 -0
- sky/provision/primeintellect/utils.py +398 -0
- sky/provision/provisioner.py +117 -36
- sky/provision/runpod/__init__.py +5 -0
- sky/provision/runpod/instance.py +27 -6
- sky/provision/runpod/utils.py +51 -18
- sky/provision/runpod/volume.py +214 -0
- sky/provision/scp/__init__.py +15 -0
- sky/provision/scp/config.py +93 -0
- sky/provision/scp/instance.py +707 -0
- sky/provision/seeweb/__init__.py +11 -0
- sky/provision/seeweb/config.py +13 -0
- sky/provision/seeweb/instance.py +812 -0
- sky/provision/shadeform/__init__.py +11 -0
- sky/provision/shadeform/config.py +12 -0
- sky/provision/shadeform/instance.py +351 -0
- sky/provision/shadeform/shadeform_utils.py +83 -0
- sky/provision/ssh/__init__.py +18 -0
- sky/provision/vast/instance.py +13 -8
- sky/provision/vast/utils.py +10 -7
- sky/provision/volume.py +164 -0
- sky/provision/vsphere/common/ssl_helper.py +1 -1
- sky/provision/vsphere/common/vapiconnect.py +2 -1
- sky/provision/vsphere/common/vim_utils.py +4 -4
- sky/provision/vsphere/instance.py +15 -10
- sky/provision/vsphere/vsphere_utils.py +17 -20
- sky/py.typed +0 -0
- sky/resources.py +845 -119
- sky/schemas/__init__.py +0 -0
- sky/schemas/api/__init__.py +0 -0
- sky/schemas/api/responses.py +227 -0
- sky/schemas/db/README +4 -0
- sky/schemas/db/env.py +90 -0
- sky/schemas/db/global_user_state/001_initial_schema.py +124 -0
- sky/schemas/db/global_user_state/002_add_workspace_to_cluster_history.py +35 -0
- sky/schemas/db/global_user_state/003_fix_initial_revision.py +61 -0
- sky/schemas/db/global_user_state/004_is_managed.py +34 -0
- sky/schemas/db/global_user_state/005_cluster_event.py +32 -0
- sky/schemas/db/global_user_state/006_provision_log.py +41 -0
- sky/schemas/db/global_user_state/007_cluster_event_request_id.py +34 -0
- sky/schemas/db/global_user_state/008_skylet_ssh_tunnel_metadata.py +34 -0
- sky/schemas/db/global_user_state/009_last_activity_and_launched_at.py +89 -0
- sky/schemas/db/global_user_state/010_save_ssh_key.py +66 -0
- sky/schemas/db/global_user_state/011_is_ephemeral.py +34 -0
- sky/schemas/db/kv_cache/001_initial_schema.py +29 -0
- sky/schemas/db/script.py.mako +28 -0
- sky/schemas/db/serve_state/001_initial_schema.py +67 -0
- sky/schemas/db/serve_state/002_yaml_content.py +34 -0
- sky/schemas/db/skypilot_config/001_initial_schema.py +30 -0
- sky/schemas/db/spot_jobs/001_initial_schema.py +97 -0
- sky/schemas/db/spot_jobs/002_cluster_pool.py +42 -0
- sky/schemas/db/spot_jobs/003_pool_hash.py +34 -0
- sky/schemas/db/spot_jobs/004_job_file_contents.py +42 -0
- sky/schemas/db/spot_jobs/005_logs_gc.py +38 -0
- sky/schemas/db/spot_jobs/006_controller_pid_started_at.py +34 -0
- sky/schemas/db/spot_jobs/007_config_file_content.py +34 -0
- sky/schemas/generated/__init__.py +0 -0
- sky/schemas/generated/autostopv1_pb2.py +36 -0
- sky/schemas/generated/autostopv1_pb2.pyi +43 -0
- sky/schemas/generated/autostopv1_pb2_grpc.py +146 -0
- sky/schemas/generated/jobsv1_pb2.py +86 -0
- sky/schemas/generated/jobsv1_pb2.pyi +254 -0
- sky/schemas/generated/jobsv1_pb2_grpc.py +542 -0
- sky/schemas/generated/managed_jobsv1_pb2.py +76 -0
- sky/schemas/generated/managed_jobsv1_pb2.pyi +278 -0
- sky/schemas/generated/managed_jobsv1_pb2_grpc.py +278 -0
- sky/schemas/generated/servev1_pb2.py +58 -0
- sky/schemas/generated/servev1_pb2.pyi +115 -0
- sky/schemas/generated/servev1_pb2_grpc.py +322 -0
- sky/serve/autoscalers.py +357 -5
- sky/serve/client/impl.py +310 -0
- sky/serve/client/sdk.py +47 -139
- sky/serve/client/sdk_async.py +130 -0
- sky/serve/constants.py +12 -9
- sky/serve/controller.py +68 -17
- sky/serve/load_balancer.py +106 -60
- sky/serve/load_balancing_policies.py +116 -2
- sky/serve/replica_managers.py +434 -249
- sky/serve/serve_rpc_utils.py +179 -0
- sky/serve/serve_state.py +569 -257
- sky/serve/serve_utils.py +775 -265
- sky/serve/server/core.py +66 -711
- sky/serve/server/impl.py +1093 -0
- sky/serve/server/server.py +21 -18
- sky/serve/service.py +192 -89
- sky/serve/service_spec.py +144 -20
- sky/serve/spot_placer.py +3 -0
- sky/server/auth/__init__.py +0 -0
- sky/server/auth/authn.py +50 -0
- sky/server/auth/loopback.py +38 -0
- sky/server/auth/oauth2_proxy.py +202 -0
- sky/server/common.py +478 -182
- sky/server/config.py +85 -23
- sky/server/constants.py +44 -6
- sky/server/daemons.py +295 -0
- sky/server/html/token_page.html +185 -0
- sky/server/metrics.py +160 -0
- sky/server/middleware_utils.py +166 -0
- sky/server/requests/executor.py +558 -138
- sky/server/requests/payloads.py +364 -24
- sky/server/requests/preconditions.py +21 -17
- sky/server/requests/process.py +112 -29
- sky/server/requests/request_names.py +121 -0
- sky/server/requests/requests.py +822 -226
- sky/server/requests/serializers/decoders.py +82 -31
- sky/server/requests/serializers/encoders.py +140 -22
- sky/server/requests/threads.py +117 -0
- sky/server/rest.py +455 -0
- sky/server/server.py +1309 -285
- sky/server/state.py +20 -0
- sky/server/stream_utils.py +327 -61
- sky/server/uvicorn.py +217 -3
- sky/server/versions.py +270 -0
- sky/setup_files/MANIFEST.in +11 -1
- sky/setup_files/alembic.ini +160 -0
- sky/setup_files/dependencies.py +139 -31
- sky/setup_files/setup.py +44 -42
- sky/sky_logging.py +114 -7
- sky/skylet/attempt_skylet.py +106 -24
- sky/skylet/autostop_lib.py +129 -8
- sky/skylet/configs.py +29 -20
- sky/skylet/constants.py +216 -25
- sky/skylet/events.py +101 -21
- sky/skylet/job_lib.py +345 -164
- sky/skylet/log_lib.py +297 -18
- sky/skylet/log_lib.pyi +44 -1
- sky/skylet/providers/ibm/node_provider.py +12 -8
- sky/skylet/providers/ibm/vpc_provider.py +13 -12
- sky/skylet/ray_patches/__init__.py +17 -3
- sky/skylet/ray_patches/autoscaler.py.diff +18 -0
- sky/skylet/ray_patches/cli.py.diff +19 -0
- sky/skylet/ray_patches/command_runner.py.diff +17 -0
- sky/skylet/ray_patches/log_monitor.py.diff +20 -0
- sky/skylet/ray_patches/resource_demand_scheduler.py.diff +32 -0
- sky/skylet/ray_patches/updater.py.diff +18 -0
- sky/skylet/ray_patches/worker.py.diff +41 -0
- sky/skylet/runtime_utils.py +21 -0
- sky/skylet/services.py +568 -0
- sky/skylet/skylet.py +72 -4
- sky/skylet/subprocess_daemon.py +104 -29
- sky/skypilot_config.py +506 -99
- sky/ssh_node_pools/__init__.py +1 -0
- sky/ssh_node_pools/core.py +135 -0
- sky/ssh_node_pools/server.py +233 -0
- sky/task.py +685 -163
- sky/templates/aws-ray.yml.j2 +11 -3
- sky/templates/azure-ray.yml.j2 +2 -1
- sky/templates/cudo-ray.yml.j2 +1 -0
- sky/templates/do-ray.yml.j2 +2 -1
- sky/templates/fluidstack-ray.yml.j2 +1 -0
- sky/templates/gcp-ray.yml.j2 +62 -1
- sky/templates/hyperbolic-ray.yml.j2 +68 -0
- sky/templates/ibm-ray.yml.j2 +2 -1
- sky/templates/jobs-controller.yaml.j2 +27 -24
- sky/templates/kubernetes-loadbalancer.yml.j2 +2 -0
- sky/templates/kubernetes-ray.yml.j2 +611 -50
- sky/templates/lambda-ray.yml.j2 +2 -1
- sky/templates/nebius-ray.yml.j2 +34 -12
- sky/templates/oci-ray.yml.j2 +1 -0
- sky/templates/paperspace-ray.yml.j2 +2 -1
- sky/templates/primeintellect-ray.yml.j2 +72 -0
- sky/templates/runpod-ray.yml.j2 +10 -1
- sky/templates/scp-ray.yml.j2 +4 -50
- sky/templates/seeweb-ray.yml.j2 +171 -0
- sky/templates/shadeform-ray.yml.j2 +73 -0
- sky/templates/sky-serve-controller.yaml.j2 +22 -2
- sky/templates/vast-ray.yml.j2 +1 -0
- sky/templates/vsphere-ray.yml.j2 +1 -0
- sky/templates/websocket_proxy.py +212 -37
- sky/usage/usage_lib.py +31 -15
- sky/users/__init__.py +0 -0
- sky/users/model.conf +15 -0
- sky/users/permission.py +397 -0
- sky/users/rbac.py +121 -0
- sky/users/server.py +720 -0
- sky/users/token_service.py +218 -0
- sky/utils/accelerator_registry.py +35 -5
- sky/utils/admin_policy_utils.py +84 -38
- sky/utils/annotations.py +38 -5
- sky/utils/asyncio_utils.py +78 -0
- sky/utils/atomic.py +1 -1
- sky/utils/auth_utils.py +153 -0
- sky/utils/benchmark_utils.py +60 -0
- sky/utils/cli_utils/status_utils.py +159 -86
- sky/utils/cluster_utils.py +31 -9
- sky/utils/command_runner.py +354 -68
- sky/utils/command_runner.pyi +93 -3
- sky/utils/common.py +35 -8
- sky/utils/common_utils.py +314 -91
- sky/utils/config_utils.py +74 -5
- sky/utils/context.py +403 -0
- sky/utils/context_utils.py +242 -0
- sky/utils/controller_utils.py +383 -89
- sky/utils/dag_utils.py +31 -12
- sky/utils/db/__init__.py +0 -0
- sky/utils/db/db_utils.py +485 -0
- sky/utils/db/kv_cache.py +149 -0
- sky/utils/db/migration_utils.py +137 -0
- sky/utils/directory_utils.py +12 -0
- sky/utils/env_options.py +13 -0
- sky/utils/git.py +567 -0
- sky/utils/git_clone.sh +460 -0
- sky/utils/infra_utils.py +195 -0
- sky/utils/kubernetes/cleanup-tunnel.sh +62 -0
- sky/utils/kubernetes/config_map_utils.py +133 -0
- sky/utils/kubernetes/create_cluster.sh +15 -29
- sky/utils/kubernetes/delete_cluster.sh +10 -7
- sky/utils/kubernetes/deploy_ssh_node_pools.py +1177 -0
- sky/utils/kubernetes/exec_kubeconfig_converter.py +22 -31
- sky/utils/kubernetes/generate_kind_config.py +6 -66
- sky/utils/kubernetes/generate_kubeconfig.sh +4 -1
- sky/utils/kubernetes/gpu_labeler.py +18 -8
- sky/utils/kubernetes/k8s_gpu_labeler_job.yaml +2 -1
- sky/utils/kubernetes/k8s_gpu_labeler_setup.yaml +16 -16
- sky/utils/kubernetes/kubernetes_deploy_utils.py +284 -114
- sky/utils/kubernetes/rsync_helper.sh +11 -3
- sky/utils/kubernetes/ssh-tunnel.sh +379 -0
- sky/utils/kubernetes/ssh_utils.py +221 -0
- sky/utils/kubernetes_enums.py +8 -15
- sky/utils/lock_events.py +94 -0
- sky/utils/locks.py +416 -0
- sky/utils/log_utils.py +82 -107
- sky/utils/perf_utils.py +22 -0
- sky/utils/resource_checker.py +298 -0
- sky/utils/resources_utils.py +249 -32
- sky/utils/rich_utils.py +217 -39
- sky/utils/schemas.py +955 -160
- sky/utils/serialize_utils.py +16 -0
- sky/utils/status_lib.py +10 -0
- sky/utils/subprocess_utils.py +29 -15
- sky/utils/tempstore.py +70 -0
- sky/utils/thread_utils.py +91 -0
- sky/utils/timeline.py +26 -53
- sky/utils/ux_utils.py +84 -15
- sky/utils/validator.py +11 -1
- sky/utils/volume.py +165 -0
- sky/utils/yaml_utils.py +111 -0
- sky/volumes/__init__.py +13 -0
- sky/volumes/client/__init__.py +0 -0
- sky/volumes/client/sdk.py +150 -0
- sky/volumes/server/__init__.py +0 -0
- sky/volumes/server/core.py +270 -0
- sky/volumes/server/server.py +124 -0
- sky/volumes/volume.py +215 -0
- sky/workspaces/__init__.py +0 -0
- sky/workspaces/core.py +655 -0
- sky/workspaces/server.py +101 -0
- sky/workspaces/utils.py +56 -0
- sky_templates/README.md +3 -0
- sky_templates/__init__.py +3 -0
- sky_templates/ray/__init__.py +0 -0
- sky_templates/ray/start_cluster +183 -0
- sky_templates/ray/stop_cluster +75 -0
- skypilot_nightly-1.0.0.dev20251203.dist-info/METADATA +676 -0
- skypilot_nightly-1.0.0.dev20251203.dist-info/RECORD +611 -0
- {skypilot_nightly-1.0.0.dev20250502.dist-info → skypilot_nightly-1.0.0.dev20251203.dist-info}/WHEEL +1 -1
- skypilot_nightly-1.0.0.dev20251203.dist-info/top_level.txt +2 -0
- sky/benchmark/benchmark_state.py +0 -256
- sky/benchmark/benchmark_utils.py +0 -641
- sky/clouds/service_catalog/constants.py +0 -7
- sky/dashboard/out/_next/static/GWvVBSCS7FmUiVmjaL1a7/_buildManifest.js +0 -1
- sky/dashboard/out/_next/static/chunks/236-2db3ee3fba33dd9e.js +0 -6
- sky/dashboard/out/_next/static/chunks/312-c3c8845990db8ffc.js +0 -15
- sky/dashboard/out/_next/static/chunks/37-0a572fe0dbb89c4d.js +0 -6
- sky/dashboard/out/_next/static/chunks/678-206dddca808e6d16.js +0 -59
- sky/dashboard/out/_next/static/chunks/845-9e60713e0c441abc.js +0 -1
- sky/dashboard/out/_next/static/chunks/979-7bf73a4c7cea0f5c.js +0 -1
- sky/dashboard/out/_next/static/chunks/fd9d1056-2821b0f0cabcd8bd.js +0 -1
- sky/dashboard/out/_next/static/chunks/framework-87d061ee6ed71b28.js +0 -33
- sky/dashboard/out/_next/static/chunks/main-app-241eb28595532291.js +0 -1
- sky/dashboard/out/_next/static/chunks/main-e0e2335212e72357.js +0 -1
- sky/dashboard/out/_next/static/chunks/pages/_app-e6b013bc3f77ad60.js +0 -1
- sky/dashboard/out/_next/static/chunks/pages/_error-1be831200e60c5c0.js +0 -1
- sky/dashboard/out/_next/static/chunks/pages/clusters/[cluster]/[job]-6ac338bc2239cb45.js +0 -1
- sky/dashboard/out/_next/static/chunks/pages/clusters/[cluster]-f383db7389368ea7.js +0 -1
- sky/dashboard/out/_next/static/chunks/pages/clusters-a93b93e10b8b074e.js +0 -1
- sky/dashboard/out/_next/static/chunks/pages/index-f9f039532ca8cbc4.js +0 -1
- sky/dashboard/out/_next/static/chunks/pages/jobs/[job]-1c519e1afc523dc9.js +0 -1
- sky/dashboard/out/_next/static/chunks/pages/jobs-a75029b67aab6a2e.js +0 -1
- sky/dashboard/out/_next/static/chunks/webpack-830f59b8404e96b8.js +0 -1
- sky/dashboard/out/_next/static/css/c6933bbb2ce7f4dd.css +0 -3
- sky/jobs/dashboard/dashboard.py +0 -223
- sky/jobs/dashboard/static/favicon.ico +0 -0
- sky/jobs/dashboard/templates/index.html +0 -831
- sky/jobs/server/dashboard_utils.py +0 -69
- sky/skylet/providers/scp/__init__.py +0 -2
- sky/skylet/providers/scp/config.py +0 -149
- sky/skylet/providers/scp/node_provider.py +0 -578
- sky/templates/kubernetes-ssh-jump.yml.j2 +0 -94
- sky/utils/db_utils.py +0 -100
- sky/utils/kubernetes/deploy_remote_cluster.sh +0 -308
- sky/utils/kubernetes/ssh_jump_lifecycle_manager.py +0 -191
- skypilot_nightly-1.0.0.dev20250502.dist-info/METADATA +0 -361
- skypilot_nightly-1.0.0.dev20250502.dist-info/RECORD +0 -396
- skypilot_nightly-1.0.0.dev20250502.dist-info/top_level.txt +0 -1
- /sky/{clouds/service_catalog → catalog}/config.py +0 -0
- /sky/{benchmark → catalog/data_fetchers}/__init__.py +0 -0
- /sky/{clouds/service_catalog → catalog}/data_fetchers/fetch_azure.py +0 -0
- /sky/{clouds/service_catalog → catalog}/data_fetchers/fetch_fluidstack.py +0 -0
- /sky/{clouds/service_catalog → catalog}/data_fetchers/fetch_ibm.py +0 -0
- /sky/{clouds/service_catalog/data_fetchers → client/cli}/__init__.py +0 -0
- /sky/dashboard/out/_next/static/{GWvVBSCS7FmUiVmjaL1a7 → 96_E2yl3QAiIJGOYCkSpB}/_ssgManifest.js +0 -0
- {skypilot_nightly-1.0.0.dev20250502.dist-info → skypilot_nightly-1.0.0.dev20251203.dist-info}/entry_points.txt +0 -0
- {skypilot_nightly-1.0.0.dev20250502.dist-info → skypilot_nightly-1.0.0.dev20251203.dist-info}/licenses/LICENSE +0 -0
sky/clouds/oci.py
CHANGED
|
@@ -23,12 +23,13 @@ History:
|
|
|
23
23
|
import logging
|
|
24
24
|
import os
|
|
25
25
|
import typing
|
|
26
|
-
from typing import Dict, Iterator, List, Optional, Tuple, Union
|
|
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
|
|
31
|
+
from sky.adaptors import common
|
|
30
32
|
from sky.adaptors import oci as oci_adaptor
|
|
31
|
-
from sky.clouds import service_catalog
|
|
32
33
|
from sky.clouds.utils import oci_utils
|
|
33
34
|
from sky.provision.oci.query_utils import query_helper
|
|
34
35
|
from sky.utils import common_utils
|
|
@@ -40,6 +41,7 @@ from sky.utils import ux_utils
|
|
|
40
41
|
if typing.TYPE_CHECKING:
|
|
41
42
|
# Renaming to avoid shadowing variables.
|
|
42
43
|
from sky import resources as resources_lib
|
|
44
|
+
from sky.utils import volume as volume_lib
|
|
43
45
|
|
|
44
46
|
logger = logging.getLogger(__name__)
|
|
45
47
|
|
|
@@ -67,7 +69,9 @@ class OCI(clouds.Cloud):
|
|
|
67
69
|
|
|
68
70
|
@classmethod
|
|
69
71
|
def _unsupported_features_for_resources(
|
|
70
|
-
cls,
|
|
72
|
+
cls,
|
|
73
|
+
resources: 'resources_lib.Resources',
|
|
74
|
+
region: Optional[str] = None,
|
|
71
75
|
) -> Dict[clouds.CloudImplementationFeatures, str]:
|
|
72
76
|
unsupported_features = {
|
|
73
77
|
clouds.CloudImplementationFeatures.CLONE_DISK_FROM_CLUSTER:
|
|
@@ -79,6 +83,9 @@ class OCI(clouds.Cloud):
|
|
|
79
83
|
clouds.CloudImplementationFeatures.HIGH_AVAILABILITY_CONTROLLERS:
|
|
80
84
|
('High availability controllers are not supported on '
|
|
81
85
|
f'{cls._REPR}.'),
|
|
86
|
+
clouds.CloudImplementationFeatures.CUSTOM_MULTI_NETWORK:
|
|
87
|
+
('Customized multiple network interfaces are not supported on '
|
|
88
|
+
f'{cls._REPR}.'),
|
|
82
89
|
}
|
|
83
90
|
if resources.use_spot:
|
|
84
91
|
unsupported_features[clouds.CloudImplementationFeatures.STOP] = (
|
|
@@ -91,13 +98,18 @@ class OCI(clouds.Cloud):
|
|
|
91
98
|
return cls._MAX_CLUSTER_NAME_LEN_LIMIT
|
|
92
99
|
|
|
93
100
|
@classmethod
|
|
94
|
-
def regions_with_offering(
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
101
|
+
def regions_with_offering(
|
|
102
|
+
cls,
|
|
103
|
+
instance_type: str,
|
|
104
|
+
accelerators: Optional[Dict[str, int]],
|
|
105
|
+
use_spot: bool,
|
|
106
|
+
region: Optional[str],
|
|
107
|
+
zone: Optional[str],
|
|
108
|
+
resources: Optional['resources_lib.Resources'] = None,
|
|
109
|
+
) -> List[clouds.Region]:
|
|
98
110
|
del accelerators # unused
|
|
99
111
|
|
|
100
|
-
regions =
|
|
112
|
+
regions = catalog.get_region_zones_for_instance_type(
|
|
101
113
|
instance_type, use_spot, 'oci')
|
|
102
114
|
|
|
103
115
|
if region is not None:
|
|
@@ -114,8 +126,8 @@ class OCI(clouds.Cloud):
|
|
|
114
126
|
cls,
|
|
115
127
|
instance_type: str,
|
|
116
128
|
) -> Tuple[Optional[float], Optional[float]]:
|
|
117
|
-
return
|
|
118
|
-
|
|
129
|
+
return catalog.get_vcpus_mem_from_instance_type(instance_type,
|
|
130
|
+
clouds='oci')
|
|
119
131
|
|
|
120
132
|
@classmethod
|
|
121
133
|
def zones_provision_loop(
|
|
@@ -143,11 +155,11 @@ class OCI(clouds.Cloud):
|
|
|
143
155
|
use_spot: bool,
|
|
144
156
|
region: Optional[str] = None,
|
|
145
157
|
zone: Optional[str] = None) -> float:
|
|
146
|
-
return
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
158
|
+
return catalog.get_hourly_cost(instance_type,
|
|
159
|
+
use_spot=use_spot,
|
|
160
|
+
region=region,
|
|
161
|
+
zone=zone,
|
|
162
|
+
clouds='oci')
|
|
151
163
|
|
|
152
164
|
def accelerators_to_hourly_cost(self,
|
|
153
165
|
accelerators: Dict[str, int],
|
|
@@ -183,40 +195,46 @@ class OCI(clouds.Cloud):
|
|
|
183
195
|
return (num_gigabytes - 10 * 1024) * 0.0085
|
|
184
196
|
|
|
185
197
|
@classmethod
|
|
186
|
-
def get_default_instance_type(
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
198
|
+
def get_default_instance_type(cls,
|
|
199
|
+
cpus: Optional[str] = None,
|
|
200
|
+
memory: Optional[str] = None,
|
|
201
|
+
disk_tier: Optional[
|
|
202
|
+
resources_utils.DiskTier] = None,
|
|
203
|
+
region: Optional[str] = None,
|
|
204
|
+
zone: Optional[str] = None) -> Optional[str]:
|
|
205
|
+
return catalog.get_default_instance_type(cpus=cpus,
|
|
206
|
+
memory=memory,
|
|
207
|
+
disk_tier=disk_tier,
|
|
208
|
+
region=region,
|
|
209
|
+
zone=zone,
|
|
210
|
+
clouds='oci')
|
|
196
211
|
|
|
197
212
|
@classmethod
|
|
198
213
|
def get_accelerators_from_instance_type(
|
|
199
214
|
cls,
|
|
200
215
|
instance_type: str,
|
|
201
216
|
) -> Optional[Dict[str, Union[int, float]]]:
|
|
202
|
-
return
|
|
203
|
-
|
|
217
|
+
return catalog.get_accelerators_from_instance_type(instance_type,
|
|
218
|
+
clouds='oci')
|
|
204
219
|
|
|
205
220
|
@classmethod
|
|
206
221
|
def get_zone_shell_cmd(cls) -> Optional[str]:
|
|
207
222
|
return None
|
|
208
223
|
|
|
209
224
|
def make_deploy_resources_variables(
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
225
|
+
self,
|
|
226
|
+
resources: 'resources_lib.Resources',
|
|
227
|
+
cluster_name: resources_utils.ClusterName,
|
|
228
|
+
region: Optional['clouds.Region'],
|
|
229
|
+
zones: Optional[List['clouds.Zone']],
|
|
230
|
+
num_nodes: int,
|
|
231
|
+
dryrun: bool = False,
|
|
232
|
+
volume_mounts: Optional[List['volume_lib.VolumeMount']] = None,
|
|
233
|
+
) -> Dict[str, Any]:
|
|
217
234
|
del cluster_name, dryrun # Unused.
|
|
218
235
|
assert region is not None, resources
|
|
219
236
|
|
|
237
|
+
resources = resources.assert_launchable()
|
|
220
238
|
acc_dict = self.get_accelerators_from_instance_type(
|
|
221
239
|
resources.instance_type)
|
|
222
240
|
custom_resources = resources_utils.make_ray_custom_resources_str(
|
|
@@ -245,7 +263,8 @@ class OCI(clouds.Cloud):
|
|
|
245
263
|
image_id, os_type = image_id.replace(' ', '').split(':')
|
|
246
264
|
|
|
247
265
|
cpus = resources.cpus
|
|
248
|
-
|
|
266
|
+
original_instance_type = resources.instance_type
|
|
267
|
+
instance_type_arr = original_instance_type.split(
|
|
249
268
|
oci_utils.oci_config.INSTANCE_TYPE_RES_SPERATOR)
|
|
250
269
|
instance_type = instance_type_arr[0]
|
|
251
270
|
|
|
@@ -259,12 +278,12 @@ class OCI(clouds.Cloud):
|
|
|
259
278
|
else:
|
|
260
279
|
if cpus is None:
|
|
261
280
|
cpus, mems = OCI.get_vcpus_mem_from_instance_type(
|
|
262
|
-
|
|
281
|
+
original_instance_type)
|
|
263
282
|
resources = resources.copy(
|
|
264
283
|
cpus=cpus,
|
|
265
284
|
memory=mems,
|
|
266
285
|
)
|
|
267
|
-
if cpus is None and
|
|
286
|
+
if cpus is None and original_instance_type.startswith(
|
|
268
287
|
oci_utils.oci_config.VM_PREFIX):
|
|
269
288
|
cpus = f'{oci_utils.oci_config.DEFAULT_NUM_VCPUS}'
|
|
270
289
|
|
|
@@ -272,8 +291,8 @@ class OCI(clouds.Cloud):
|
|
|
272
291
|
if zone is None:
|
|
273
292
|
# If zone is not specified, try to get the first zone.
|
|
274
293
|
if zones is None:
|
|
275
|
-
regions =
|
|
276
|
-
instance_type=
|
|
294
|
+
regions = catalog.get_region_zones_for_instance_type(
|
|
295
|
+
instance_type=original_instance_type,
|
|
277
296
|
use_spot=resources.use_spot,
|
|
278
297
|
clouds='oci')
|
|
279
298
|
zones = [r for r in iter(regions) if r.name == region.name
|
|
@@ -313,11 +332,11 @@ class OCI(clouds.Cloud):
|
|
|
313
332
|
# OS type is not determined yet. So try to get it from vms.csv
|
|
314
333
|
image_str = self._get_image_str(
|
|
315
334
|
image_id=resources.image_id,
|
|
316
|
-
instance_type=
|
|
335
|
+
instance_type=original_instance_type,
|
|
317
336
|
region=region.name)
|
|
318
337
|
|
|
319
338
|
# pylint: disable=import-outside-toplevel
|
|
320
|
-
from sky.
|
|
339
|
+
from sky.catalog import oci_catalog
|
|
321
340
|
os_type = oci_catalog.get_image_os_from_tag(tag=image_str,
|
|
322
341
|
region=region.name)
|
|
323
342
|
logger.debug(f'OS type for the image {image_id} is {os_type}')
|
|
@@ -370,7 +389,9 @@ class OCI(clouds.Cloud):
|
|
|
370
389
|
default_instance_type = OCI.get_default_instance_type(
|
|
371
390
|
cpus=resources.cpus,
|
|
372
391
|
memory=resources.memory,
|
|
373
|
-
disk_tier=resources.disk_tier
|
|
392
|
+
disk_tier=resources.disk_tier,
|
|
393
|
+
region=resources.region,
|
|
394
|
+
zone=resources.zone)
|
|
374
395
|
|
|
375
396
|
if default_instance_type is None:
|
|
376
397
|
return resources_utils.FeasibleResources([], [], None)
|
|
@@ -381,16 +402,16 @@ class OCI(clouds.Cloud):
|
|
|
381
402
|
assert len(accelerators) == 1, resources
|
|
382
403
|
|
|
383
404
|
acc, acc_count = list(accelerators.items())[0]
|
|
384
|
-
(instance_list,
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
405
|
+
(instance_list,
|
|
406
|
+
fuzzy_candidate_list) = catalog.get_instance_type_for_accelerator(
|
|
407
|
+
acc,
|
|
408
|
+
acc_count,
|
|
409
|
+
use_spot=resources.use_spot,
|
|
410
|
+
cpus=resources.cpus,
|
|
411
|
+
memory=resources.memory,
|
|
412
|
+
region=resources.region,
|
|
413
|
+
zone=resources.zone,
|
|
414
|
+
clouds='oci')
|
|
394
415
|
if instance_list is None:
|
|
395
416
|
return resources_utils.FeasibleResources([], fuzzy_candidate_list,
|
|
396
417
|
None)
|
|
@@ -399,13 +420,15 @@ class OCI(clouds.Cloud):
|
|
|
399
420
|
fuzzy_candidate_list, None)
|
|
400
421
|
|
|
401
422
|
@classmethod
|
|
402
|
-
def _check_compute_credentials(
|
|
423
|
+
def _check_compute_credentials(
|
|
424
|
+
cls) -> Tuple[bool, Optional[Union[str, Dict[str, str]]]]:
|
|
403
425
|
"""Checks if the user has access credentials to
|
|
404
426
|
OCI's compute service."""
|
|
405
427
|
return cls._check_credentials()
|
|
406
428
|
|
|
407
429
|
@classmethod
|
|
408
|
-
def _check_storage_credentials(
|
|
430
|
+
def _check_storage_credentials(
|
|
431
|
+
cls) -> Tuple[bool, Optional[Union[str, Dict[str, str]]]]:
|
|
409
432
|
"""Checks if the user has access credentials to
|
|
410
433
|
OCI's storage service."""
|
|
411
434
|
# TODO(seungjin): Implement separate check for
|
|
@@ -439,13 +462,12 @@ class OCI(clouds.Cloud):
|
|
|
439
462
|
f'{cls._INDENT_PREFIX} region=us-sanjose-1\n'
|
|
440
463
|
f'{cls._INDENT_PREFIX} key_file=~/.oci/oci_api_key.pem')
|
|
441
464
|
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
f'{cls._INDENT_PREFIX}{short_credential_help_str}')
|
|
465
|
+
dependency_error_msg = (
|
|
466
|
+
'`oci` is not installed. Install it with: '
|
|
467
|
+
'pip install oci\n'
|
|
468
|
+
f'{cls._INDENT_PREFIX}{short_credential_help_str}')
|
|
469
|
+
if not common.can_import_modules(['oci']):
|
|
470
|
+
return False, dependency_error_msg
|
|
449
471
|
|
|
450
472
|
conf_file = oci_adaptor.get_config_file()
|
|
451
473
|
|
|
@@ -528,10 +550,10 @@ class OCI(clouds.Cloud):
|
|
|
528
550
|
return None
|
|
529
551
|
|
|
530
552
|
def instance_type_exists(self, instance_type: str) -> bool:
|
|
531
|
-
return
|
|
553
|
+
return catalog.instance_type_exists(instance_type, 'oci')
|
|
532
554
|
|
|
533
555
|
def validate_region_zone(self, region: Optional[str], zone: Optional[str]):
|
|
534
|
-
return
|
|
556
|
+
return catalog.validate_region_zone(region, zone, clouds='oci')
|
|
535
557
|
|
|
536
558
|
@classmethod
|
|
537
559
|
def get_image_size(cls, image_id: str, region: Optional[str]) -> float:
|
|
@@ -552,9 +574,9 @@ class OCI(clouds.Cloud):
|
|
|
552
574
|
region=region_name)
|
|
553
575
|
|
|
554
576
|
if image_id_str.startswith('skypilot:'):
|
|
555
|
-
image_id_str =
|
|
556
|
-
|
|
557
|
-
|
|
577
|
+
image_id_str = catalog.get_image_id_from_tag(image_id_str,
|
|
578
|
+
region_name,
|
|
579
|
+
clouds='oci')
|
|
558
580
|
|
|
559
581
|
# Image_id should be impossible be None, except for the case when
|
|
560
582
|
# 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
|
|
@@ -14,6 +14,7 @@ if typing.TYPE_CHECKING:
|
|
|
14
14
|
import requests
|
|
15
15
|
|
|
16
16
|
from sky import resources as resources_lib
|
|
17
|
+
from sky.utils import volume as volume_lib
|
|
17
18
|
else:
|
|
18
19
|
requests = adaptors_common.LazyImport('requests')
|
|
19
20
|
|
|
@@ -41,8 +42,14 @@ class Paperspace(clouds.Cloud):
|
|
|
41
42
|
clouds.CloudImplementationFeatures.CUSTOM_DISK_TIER:
|
|
42
43
|
'Custom disk tiers'
|
|
43
44
|
f' is not supported in {_REPR}.',
|
|
45
|
+
clouds.CloudImplementationFeatures.CUSTOM_NETWORK_TIER:
|
|
46
|
+
('Custom network tier is currently not supported in '
|
|
47
|
+
f'{_REPR}.'),
|
|
44
48
|
clouds.CloudImplementationFeatures.HIGH_AVAILABILITY_CONTROLLERS:
|
|
45
49
|
(f'High availability controllers are not supported in {_REPR}.'),
|
|
50
|
+
clouds.CloudImplementationFeatures.CUSTOM_MULTI_NETWORK:
|
|
51
|
+
('Customized multiple network interfaces are not supported in '
|
|
52
|
+
f'{_REPR}.'),
|
|
46
53
|
}
|
|
47
54
|
_MAX_CLUSTER_NAME_LEN_LIMIT = 120
|
|
48
55
|
_regions: List[clouds.Region] = []
|
|
@@ -53,7 +60,9 @@ class Paperspace(clouds.Cloud):
|
|
|
53
60
|
|
|
54
61
|
@classmethod
|
|
55
62
|
def _unsupported_features_for_resources(
|
|
56
|
-
cls,
|
|
63
|
+
cls,
|
|
64
|
+
resources: 'resources_lib.Resources',
|
|
65
|
+
region: Optional[str] = None,
|
|
57
66
|
) -> Dict[clouds.CloudImplementationFeatures, str]:
|
|
58
67
|
"""The features not supported based on the resources provided.
|
|
59
68
|
|
|
@@ -79,13 +88,14 @@ class Paperspace(clouds.Cloud):
|
|
|
79
88
|
use_spot: bool,
|
|
80
89
|
region: Optional[str],
|
|
81
90
|
zone: Optional[str],
|
|
91
|
+
resources: Optional['resources_lib.Resources'] = None,
|
|
82
92
|
) -> List[clouds.Region]:
|
|
83
93
|
assert zone is None, 'Paperspace does not support zones.'
|
|
84
94
|
del accelerators, zone # unused
|
|
85
95
|
if use_spot:
|
|
86
96
|
return []
|
|
87
97
|
else:
|
|
88
|
-
regions =
|
|
98
|
+
regions = catalog.get_region_zones_for_instance_type(
|
|
89
99
|
instance_type, use_spot, 'paperspace')
|
|
90
100
|
|
|
91
101
|
if region is not None:
|
|
@@ -97,8 +107,8 @@ class Paperspace(clouds.Cloud):
|
|
|
97
107
|
cls,
|
|
98
108
|
instance_type: str,
|
|
99
109
|
) -> Tuple[Optional[float], Optional[float]]:
|
|
100
|
-
return
|
|
101
|
-
|
|
110
|
+
return catalog.get_vcpus_mem_from_instance_type(instance_type,
|
|
111
|
+
clouds='paperspace')
|
|
102
112
|
|
|
103
113
|
@classmethod
|
|
104
114
|
def zones_provision_loop(
|
|
@@ -127,7 +137,7 @@ class Paperspace(clouds.Cloud):
|
|
|
127
137
|
region: Optional[str] = None,
|
|
128
138
|
zone: Optional[str] = None,
|
|
129
139
|
) -> float:
|
|
130
|
-
return
|
|
140
|
+
return catalog.get_hourly_cost(
|
|
131
141
|
instance_type,
|
|
132
142
|
use_spot=use_spot,
|
|
133
143
|
region=region,
|
|
@@ -153,40 +163,46 @@ class Paperspace(clouds.Cloud):
|
|
|
153
163
|
return self._REPR
|
|
154
164
|
|
|
155
165
|
@classmethod
|
|
156
|
-
def get_default_instance_type(
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
166
|
+
def get_default_instance_type(cls,
|
|
167
|
+
cpus: Optional[str] = None,
|
|
168
|
+
memory: Optional[str] = None,
|
|
169
|
+
disk_tier: Optional[
|
|
170
|
+
resources_utils.DiskTier] = None,
|
|
171
|
+
region: Optional[str] = None,
|
|
172
|
+
zone: Optional[str] = None) -> Optional[str]:
|
|
162
173
|
"""Returns the default instance type for Paperspace."""
|
|
163
|
-
return
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
174
|
+
return catalog.get_default_instance_type(cpus=cpus,
|
|
175
|
+
memory=memory,
|
|
176
|
+
disk_tier=disk_tier,
|
|
177
|
+
region=region,
|
|
178
|
+
zone=zone,
|
|
179
|
+
clouds='paperspace')
|
|
167
180
|
|
|
168
181
|
@classmethod
|
|
169
182
|
def get_accelerators_from_instance_type(
|
|
170
183
|
cls, instance_type: str) -> Optional[Dict[str, Union[int, float]]]:
|
|
171
|
-
return
|
|
172
|
-
|
|
184
|
+
return catalog.get_accelerators_from_instance_type(instance_type,
|
|
185
|
+
clouds='paperspace')
|
|
173
186
|
|
|
174
187
|
@classmethod
|
|
175
188
|
def get_zone_shell_cmd(cls) -> Optional[str]:
|
|
176
189
|
return None
|
|
177
190
|
|
|
178
191
|
def make_deploy_resources_variables(
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
192
|
+
self,
|
|
193
|
+
resources: 'resources_lib.Resources',
|
|
194
|
+
cluster_name: resources_utils.ClusterName,
|
|
195
|
+
region: 'clouds.Region',
|
|
196
|
+
zones: Optional[List['clouds.Zone']],
|
|
197
|
+
num_nodes: int,
|
|
198
|
+
dryrun: bool = False,
|
|
199
|
+
volume_mounts: Optional[List['volume_lib.VolumeMount']] = None,
|
|
200
|
+
) -> Dict[str, Optional[str]]:
|
|
186
201
|
del zones, dryrun, cluster_name
|
|
187
202
|
|
|
188
|
-
|
|
189
|
-
acc_dict = self.get_accelerators_from_instance_type(
|
|
203
|
+
resources = resources.assert_launchable()
|
|
204
|
+
acc_dict = self.get_accelerators_from_instance_type(
|
|
205
|
+
resources.instance_type)
|
|
190
206
|
custom_resources = resources_utils.make_ray_custom_resources_str(
|
|
191
207
|
acc_dict)
|
|
192
208
|
|
|
@@ -227,7 +243,9 @@ class Paperspace(clouds.Cloud):
|
|
|
227
243
|
default_instance_type = Paperspace.get_default_instance_type(
|
|
228
244
|
cpus=resources.cpus,
|
|
229
245
|
memory=resources.memory,
|
|
230
|
-
disk_tier=resources.disk_tier
|
|
246
|
+
disk_tier=resources.disk_tier,
|
|
247
|
+
region=resources.region,
|
|
248
|
+
zone=resources.zone)
|
|
231
249
|
if default_instance_type is None:
|
|
232
250
|
return resources_utils.FeasibleResources([], [], None)
|
|
233
251
|
else:
|
|
@@ -236,17 +254,17 @@ class Paperspace(clouds.Cloud):
|
|
|
236
254
|
|
|
237
255
|
assert len(accelerators) == 1, resources
|
|
238
256
|
acc, acc_count = list(accelerators.items())[0]
|
|
239
|
-
(instance_list,
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
257
|
+
(instance_list,
|
|
258
|
+
fuzzy_candidate_list) = (catalog.get_instance_type_for_accelerator(
|
|
259
|
+
acc,
|
|
260
|
+
acc_count,
|
|
261
|
+
use_spot=resources.use_spot,
|
|
262
|
+
cpus=resources.cpus,
|
|
263
|
+
memory=resources.memory,
|
|
264
|
+
region=resources.region,
|
|
265
|
+
zone=resources.zone,
|
|
266
|
+
clouds='paperspace',
|
|
267
|
+
))
|
|
250
268
|
if instance_list is None:
|
|
251
269
|
return resources_utils.FeasibleResources([], fuzzy_candidate_list,
|
|
252
270
|
None)
|
|
@@ -254,7 +272,8 @@ class Paperspace(clouds.Cloud):
|
|
|
254
272
|
fuzzy_candidate_list, None)
|
|
255
273
|
|
|
256
274
|
@classmethod
|
|
257
|
-
def _check_compute_credentials(
|
|
275
|
+
def _check_compute_credentials(
|
|
276
|
+
cls) -> Tuple[bool, Optional[Union[str, Dict[str, str]]]]:
|
|
258
277
|
"""Checks if the user has access credentials to
|
|
259
278
|
Paperspace's compute service."""
|
|
260
279
|
try:
|
|
@@ -291,9 +310,7 @@ class Paperspace(clouds.Cloud):
|
|
|
291
310
|
return None
|
|
292
311
|
|
|
293
312
|
def instance_type_exists(self, instance_type: str) -> bool:
|
|
294
|
-
return
|
|
313
|
+
return catalog.instance_type_exists(instance_type, 'paperspace')
|
|
295
314
|
|
|
296
315
|
def validate_region_zone(self, region: Optional[str], zone: Optional[str]):
|
|
297
|
-
return
|
|
298
|
-
zone,
|
|
299
|
-
clouds='paperspace')
|
|
316
|
+
return catalog.validate_region_zone(region, zone, clouds='paperspace')
|