skypilot-nightly 1.0.0.dev20250509__py3-none-any.whl → 1.0.0.dev20251107__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.
- sky/__init__.py +22 -6
- sky/adaptors/aws.py +25 -7
- sky/adaptors/common.py +24 -1
- sky/adaptors/coreweave.py +278 -0
- sky/adaptors/do.py +8 -2
- sky/adaptors/hyperbolic.py +8 -0
- sky/adaptors/kubernetes.py +149 -18
- sky/adaptors/nebius.py +170 -17
- sky/adaptors/primeintellect.py +1 -0
- sky/adaptors/runpod.py +68 -0
- sky/adaptors/seeweb.py +167 -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 +1299 -380
- sky/backends/cloud_vm_ray_backend.py +1715 -518
- sky/backends/docker_utils.py +1 -1
- sky/backends/local_docker_backend.py +11 -6
- sky/backends/wheel_utils.py +37 -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 +89 -48
- 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 +30 -40
- sky/{clouds/service_catalog → catalog}/data_fetchers/fetch_cudo.py +38 -38
- sky/{clouds/service_catalog → catalog}/data_fetchers/fetch_gcp.py +42 -15
- 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 +335 -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 +491 -203
- sky/cli.py +5 -6005
- sky/client/{cli.py → cli/command.py} +2477 -1885
- sky/client/cli/deprecation_utils.py +99 -0
- sky/client/cli/flags.py +359 -0
- sky/client/cli/table_utils.py +320 -0
- sky/client/common.py +70 -32
- sky/client/oauth.py +82 -0
- sky/client/sdk.py +1203 -297
- sky/client/sdk_async.py +833 -0
- sky/client/service_account_auth.py +47 -0
- sky/cloud_stores.py +73 -0
- sky/clouds/__init__.py +13 -0
- sky/clouds/aws.py +358 -93
- sky/clouds/azure.py +105 -83
- sky/clouds/cloud.py +127 -36
- 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 +563 -162
- sky/clouds/lambda_cloud.py +74 -54
- sky/clouds/nebius.py +206 -80
- 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 -83
- sky/clouds/seeweb.py +466 -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 +177 -124
- sky/clouds/vast.py +99 -77
- sky/clouds/vsphere.py +51 -40
- sky/core.py +349 -139
- sky/dag.py +15 -0
- sky/dashboard/out/404.html +1 -1
- 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-74503c8e80fd253b.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.fff53c4a3fcae910.js +26 -0
- sky/dashboard/out/_next/static/chunks/3294.72362fa129305b19.js +1 -0
- sky/dashboard/out/_next/static/chunks/3785.ad6adaa2a0fa9768.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.a830b5c9e7867c92.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/6601-06114c982db410b6.js +1 -0
- sky/dashboard/out/_next/static/chunks/6856-ef8ba11f96d8c4a3.js +1 -0
- sky/dashboard/out/_next/static/chunks/6989-01359c57e018caa4.js +1 -0
- sky/dashboard/out/_next/static/chunks/6990-32b6e2d3822301fa.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-3301e838e5f25772.js +1 -0
- sky/dashboard/out/_next/static/chunks/8640.5b9475a2d18c5416.js +16 -0
- sky/dashboard/out/_next/static/chunks/8969-1e4613c651bf4051.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.7310982cf5a0dc79.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]-c736ead69c2d86ec.js +16 -0
- sky/dashboard/out/_next/static/chunks/pages/clusters/[cluster]-a37d2063af475a1c.js +1 -0
- sky/dashboard/out/_next/static/chunks/pages/clusters-d44859594e6f8064.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]-5796e8d6aea291a0.js +16 -0
- sky/dashboard/out/_next/static/chunks/pages/jobs/pools/[pool]-6edeb7d06032adfc.js +21 -0
- sky/dashboard/out/_next/static/chunks/pages/jobs-479dde13399cf270.js +1 -0
- sky/dashboard/out/_next/static/chunks/pages/users-5ab3b907622cf0fe.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]-c5a3eeee1c218af1.js +1 -0
- sky/dashboard/out/_next/static/chunks/pages/workspaces-22b23febb3e89ce1.js +1 -0
- sky/dashboard/out/_next/static/chunks/webpack-2679be77fc08a2f8.js +1 -0
- sky/dashboard/out/_next/static/css/0748ce22df867032.css +3 -0
- sky/dashboard/out/_next/static/zB0ed6ge_W1MDszVHhijS/_buildManifest.js +1 -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 +1451 -1807
- sky/data/storage_utils.py +43 -57
- sky/exceptions.py +132 -2
- sky/execution.py +206 -63
- sky/global_user_state.py +2374 -586
- sky/jobs/__init__.py +5 -0
- sky/jobs/client/sdk.py +242 -65
- sky/jobs/client/sdk_async.py +143 -0
- sky/jobs/constants.py +9 -8
- sky/jobs/controller.py +839 -277
- sky/jobs/file_content_utils.py +80 -0
- sky/jobs/log_gc.py +201 -0
- sky/jobs/recovery_strategy.py +398 -152
- sky/jobs/scheduler.py +315 -189
- sky/jobs/server/core.py +829 -255
- sky/jobs/server/server.py +156 -115
- sky/jobs/server/utils.py +136 -0
- sky/jobs/state.py +2092 -701
- sky/jobs/utils.py +1242 -160
- 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 +443 -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 +135 -50
- sky/provision/azure/instance.py +10 -5
- 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 +114 -23
- 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 +93 -14
- 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 +789 -247
- sky/provision/kubernetes/manifests/fusermount-server-daemonset.yaml +1 -2
- sky/provision/kubernetes/network.py +27 -17
- sky/provision/kubernetes/network_utils.py +40 -43
- sky/provision/kubernetes/utils.py +1192 -531
- sky/provision/kubernetes/volume.py +282 -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 +196 -91
- 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 +110 -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 +180 -0
- sky/provision/scp/__init__.py +15 -0
- sky/provision/scp/config.py +93 -0
- sky/provision/scp/instance.py +531 -0
- sky/provision/seeweb/__init__.py +11 -0
- sky/provision/seeweb/config.py +13 -0
- sky/provision/seeweb/instance.py +807 -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/vsphere/common/vim_utils.py +1 -2
- sky/provision/vsphere/instance.py +15 -10
- sky/provision/vsphere/vsphere_utils.py +9 -19
- sky/py.typed +0 -0
- sky/resources.py +844 -118
- sky/schemas/__init__.py +0 -0
- sky/schemas/api/__init__.py +0 -0
- sky/schemas/api/responses.py +225 -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/script.py.mako +28 -0
- sky/schemas/db/serve_state/001_initial_schema.py +67 -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/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 +74 -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 +10 -8
- sky/serve/controller.py +64 -19
- sky/serve/load_balancer.py +106 -60
- sky/serve/load_balancing_policies.py +115 -1
- sky/serve/replica_managers.py +273 -162
- sky/serve/serve_rpc_utils.py +179 -0
- sky/serve/serve_state.py +554 -251
- sky/serve/serve_utils.py +733 -220
- 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 +133 -48
- sky/serve/service_spec.py +135 -16
- 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 +200 -0
- sky/server/common.py +475 -181
- sky/server/config.py +81 -23
- sky/server/constants.py +44 -6
- sky/server/daemons.py +229 -0
- sky/server/html/token_page.html +185 -0
- sky/server/metrics.py +160 -0
- sky/server/requests/executor.py +528 -138
- sky/server/requests/payloads.py +351 -17
- sky/server/requests/preconditions.py +21 -17
- sky/server/requests/process.py +112 -29
- sky/server/requests/request_names.py +120 -0
- sky/server/requests/requests.py +817 -224
- sky/server/requests/serializers/decoders.py +82 -31
- sky/server/requests/serializers/encoders.py +140 -22
- sky/server/requests/threads.py +106 -0
- sky/server/rest.py +417 -0
- sky/server/server.py +1290 -284
- sky/server/state.py +20 -0
- sky/server/stream_utils.py +345 -57
- sky/server/uvicorn.py +217 -3
- sky/server/versions.py +270 -0
- sky/setup_files/MANIFEST.in +5 -0
- sky/setup_files/alembic.ini +156 -0
- sky/setup_files/dependencies.py +136 -31
- sky/setup_files/setup.py +44 -42
- sky/sky_logging.py +102 -5
- sky/skylet/attempt_skylet.py +1 -0
- sky/skylet/autostop_lib.py +129 -8
- sky/skylet/configs.py +27 -20
- sky/skylet/constants.py +171 -19
- sky/skylet/events.py +105 -21
- sky/skylet/job_lib.py +335 -104
- sky/skylet/log_lib.py +297 -18
- sky/skylet/log_lib.pyi +44 -1
- 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/services.py +564 -0
- sky/skylet/skylet.py +63 -4
- sky/skylet/subprocess_daemon.py +103 -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 +621 -137
- sky/templates/aws-ray.yml.j2 +10 -3
- sky/templates/azure-ray.yml.j2 +1 -1
- sky/templates/do-ray.yml.j2 +1 -1
- sky/templates/gcp-ray.yml.j2 +57 -0
- sky/templates/hyperbolic-ray.yml.j2 +67 -0
- sky/templates/jobs-controller.yaml.j2 +27 -24
- sky/templates/kubernetes-loadbalancer.yml.j2 +2 -0
- sky/templates/kubernetes-ray.yml.j2 +607 -51
- sky/templates/lambda-ray.yml.j2 +1 -1
- sky/templates/nebius-ray.yml.j2 +33 -12
- sky/templates/paperspace-ray.yml.j2 +1 -1
- sky/templates/primeintellect-ray.yml.j2 +71 -0
- sky/templates/runpod-ray.yml.j2 +9 -1
- sky/templates/scp-ray.yml.j2 +3 -50
- sky/templates/seeweb-ray.yml.j2 +108 -0
- sky/templates/shadeform-ray.yml.j2 +72 -0
- sky/templates/sky-serve-controller.yaml.j2 +22 -2
- sky/templates/websocket_proxy.py +178 -18
- sky/usage/usage_lib.py +18 -11
- sky/users/__init__.py +0 -0
- sky/users/model.conf +15 -0
- sky/users/permission.py +387 -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 +34 -5
- sky/utils/admin_policy_utils.py +84 -38
- sky/utils/annotations.py +16 -5
- sky/utils/asyncio_utils.py +78 -0
- 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 +310 -87
- sky/utils/config_utils.py +87 -5
- sky/utils/context.py +402 -0
- sky/utils/context_utils.py +222 -0
- sky/utils/controller_utils.py +264 -89
- sky/utils/dag_utils.py +31 -12
- sky/utils/db/__init__.py +0 -0
- sky/utils/db/db_utils.py +470 -0
- sky/utils/db/migration_utils.py +133 -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 +13 -27
- sky/utils/kubernetes/delete_cluster.sh +10 -7
- sky/utils/kubernetes/deploy_remote_cluster.py +1299 -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 +5 -5
- sky/utils/kubernetes/kubernetes_deploy_utils.py +354 -47
- 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 +368 -0
- sky/utils/log_utils.py +300 -6
- 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 +213 -37
- sky/utils/schemas.py +905 -147
- sky/utils/serialize_utils.py +16 -0
- sky/utils/status_lib.py +10 -0
- sky/utils/subprocess_utils.py +38 -15
- sky/utils/tempstore.py +70 -0
- sky/utils/timeline.py +24 -52
- sky/utils/ux_utils.py +84 -15
- sky/utils/validator.py +11 -1
- sky/utils/volume.py +86 -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 +149 -0
- sky/volumes/server/__init__.py +0 -0
- sky/volumes/server/core.py +258 -0
- sky/volumes/server/server.py +122 -0
- sky/volumes/volume.py +212 -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
- skypilot_nightly-1.0.0.dev20251107.dist-info/METADATA +675 -0
- skypilot_nightly-1.0.0.dev20251107.dist-info/RECORD +594 -0
- {skypilot_nightly-1.0.0.dev20250509.dist-info → skypilot_nightly-1.0.0.dev20251107.dist-info}/WHEEL +1 -1
- 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/LksQgChY5izXjokL3LcEu/_buildManifest.js +0 -1
- sky/dashboard/out/_next/static/chunks/236-f49500b82ad5392d.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-0f8017370869e269.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]-e15db85d0ea1fbe1.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]-03f279c6741fb48b.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.dev20250509.dist-info/METADATA +0 -361
- skypilot_nightly-1.0.0.dev20250509.dist-info/RECORD +0 -396
- /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/{LksQgChY5izXjokL3LcEu → zB0ed6ge_W1MDszVHhijS}/_ssgManifest.js +0 -0
- {skypilot_nightly-1.0.0.dev20250509.dist-info → skypilot_nightly-1.0.0.dev20251107.dist-info}/entry_points.txt +0 -0
- {skypilot_nightly-1.0.0.dev20250509.dist-info → skypilot_nightly-1.0.0.dev20251107.dist-info}/licenses/LICENSE +0 -0
- {skypilot_nightly-1.0.0.dev20250509.dist-info → skypilot_nightly-1.0.0.dev20251107.dist-info}/top_level.txt +0 -0
sky/clouds/azure.py
CHANGED
|
@@ -9,12 +9,13 @@ from typing import Any, Dict, Iterator, List, Optional, Tuple, Union
|
|
|
9
9
|
import colorama
|
|
10
10
|
from packaging import version as pversion
|
|
11
11
|
|
|
12
|
+
from sky import catalog
|
|
12
13
|
from sky import clouds
|
|
13
14
|
from sky import exceptions
|
|
14
15
|
from sky import sky_logging
|
|
15
16
|
from sky import skypilot_config
|
|
16
17
|
from sky.adaptors import azure
|
|
17
|
-
from sky.
|
|
18
|
+
from sky.adaptors import common as adaptors_common
|
|
18
19
|
from sky.clouds.utils import azure_utils
|
|
19
20
|
from sky.utils import annotations
|
|
20
21
|
from sky.utils import common_utils
|
|
@@ -24,6 +25,7 @@ from sky.utils import ux_utils
|
|
|
24
25
|
|
|
25
26
|
if typing.TYPE_CHECKING:
|
|
26
27
|
from sky import resources
|
|
28
|
+
from sky.utils import volume as volume_lib
|
|
27
29
|
|
|
28
30
|
logger = sky_logging.init_logger(__name__)
|
|
29
31
|
|
|
@@ -85,7 +87,9 @@ class Azure(clouds.Cloud):
|
|
|
85
87
|
|
|
86
88
|
@classmethod
|
|
87
89
|
def _unsupported_features_for_resources(
|
|
88
|
-
cls,
|
|
90
|
+
cls,
|
|
91
|
+
resources: 'resources.Resources',
|
|
92
|
+
region: Optional[str] = None,
|
|
89
93
|
) -> Dict[clouds.CloudImplementationFeatures, str]:
|
|
90
94
|
features = {
|
|
91
95
|
clouds.CloudImplementationFeatures.CLONE_DISK_FROM_CLUSTER:
|
|
@@ -93,6 +97,9 @@ class Azure(clouds.Cloud):
|
|
|
93
97
|
clouds.CloudImplementationFeatures.HIGH_AVAILABILITY_CONTROLLERS: (
|
|
94
98
|
f'High availability controllers are not supported on {cls._REPR}.'
|
|
95
99
|
),
|
|
100
|
+
clouds.CloudImplementationFeatures.CUSTOM_MULTI_NETWORK: (
|
|
101
|
+
f'Customized multiple network interfaces are not supported on {cls._REPR}.'
|
|
102
|
+
),
|
|
96
103
|
}
|
|
97
104
|
if resources.use_spot:
|
|
98
105
|
features[clouds.CloudImplementationFeatures.STOP] = (
|
|
@@ -109,11 +116,11 @@ class Azure(clouds.Cloud):
|
|
|
109
116
|
use_spot: bool,
|
|
110
117
|
region: Optional[str] = None,
|
|
111
118
|
zone: Optional[str] = None) -> float:
|
|
112
|
-
return
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
119
|
+
return catalog.get_hourly_cost(instance_type,
|
|
120
|
+
use_spot=use_spot,
|
|
121
|
+
region=region,
|
|
122
|
+
zone=zone,
|
|
123
|
+
clouds='azure')
|
|
117
124
|
|
|
118
125
|
def accelerators_to_hourly_cost(self,
|
|
119
126
|
accelerators: Dict[str, int],
|
|
@@ -150,23 +157,25 @@ class Azure(clouds.Cloud):
|
|
|
150
157
|
return cost
|
|
151
158
|
|
|
152
159
|
@classmethod
|
|
153
|
-
def get_default_instance_type(
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
160
|
+
def get_default_instance_type(cls,
|
|
161
|
+
cpus: Optional[str] = None,
|
|
162
|
+
memory: Optional[str] = None,
|
|
163
|
+
disk_tier: Optional[
|
|
164
|
+
resources_utils.DiskTier] = None,
|
|
165
|
+
region: Optional[str] = None,
|
|
166
|
+
zone: Optional[str] = None) -> Optional[str]:
|
|
167
|
+
return catalog.get_default_instance_type(cpus=cpus,
|
|
168
|
+
memory=memory,
|
|
169
|
+
disk_tier=disk_tier,
|
|
170
|
+
region=region,
|
|
171
|
+
zone=zone,
|
|
172
|
+
clouds='azure')
|
|
163
173
|
|
|
164
174
|
@classmethod
|
|
165
175
|
def get_image_size(cls, image_id: str, region: Optional[str]) -> float:
|
|
166
176
|
# Process skypilot images.
|
|
167
177
|
if image_id.startswith('skypilot:'):
|
|
168
|
-
image_id =
|
|
169
|
-
clouds='azure')
|
|
178
|
+
image_id = catalog.get_image_id_from_tag(image_id, clouds='azure')
|
|
170
179
|
if image_id.startswith(_COMMUNITY_IMAGE_PREFIX):
|
|
171
180
|
# Avoid querying the image size from Azure as
|
|
172
181
|
# all skypilot custom images have the same size.
|
|
@@ -257,13 +266,18 @@ class Azure(clouds.Cloud):
|
|
|
257
266
|
return _DEFAULT_GPU_IMAGE_ID
|
|
258
267
|
|
|
259
268
|
@classmethod
|
|
260
|
-
def regions_with_offering(
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
269
|
+
def regions_with_offering(
|
|
270
|
+
cls,
|
|
271
|
+
instance_type: str,
|
|
272
|
+
accelerators: Optional[Dict[str, int]],
|
|
273
|
+
use_spot: bool,
|
|
274
|
+
region: Optional[str],
|
|
275
|
+
zone: Optional[str],
|
|
276
|
+
resources: Optional['resources.Resources'] = None,
|
|
277
|
+
) -> List[clouds.Region]:
|
|
264
278
|
del accelerators # unused
|
|
265
279
|
assert zone is None, 'Azure does not support zones'
|
|
266
|
-
regions =
|
|
280
|
+
regions = catalog.get_region_zones_for_instance_type(
|
|
267
281
|
instance_type, use_spot, 'azure')
|
|
268
282
|
|
|
269
283
|
if region is not None:
|
|
@@ -298,36 +312,39 @@ class Azure(clouds.Cloud):
|
|
|
298
312
|
cls,
|
|
299
313
|
instance_type: str,
|
|
300
314
|
) -> Optional[Dict[str, Union[int, float]]]:
|
|
301
|
-
return
|
|
302
|
-
|
|
315
|
+
return catalog.get_accelerators_from_instance_type(instance_type,
|
|
316
|
+
clouds='azure')
|
|
303
317
|
|
|
304
318
|
@classmethod
|
|
305
319
|
def get_vcpus_mem_from_instance_type(
|
|
306
320
|
cls,
|
|
307
321
|
instance_type: str,
|
|
308
322
|
) -> Tuple[Optional[float], Optional[float]]:
|
|
309
|
-
return
|
|
310
|
-
|
|
323
|
+
return catalog.get_vcpus_mem_from_instance_type(instance_type,
|
|
324
|
+
clouds='azure')
|
|
311
325
|
|
|
312
326
|
@classmethod
|
|
313
327
|
def get_zone_shell_cmd(cls) -> Optional[str]:
|
|
314
328
|
return None
|
|
315
329
|
|
|
316
330
|
def make_deploy_resources_variables(
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
331
|
+
self,
|
|
332
|
+
resources: 'resources.Resources',
|
|
333
|
+
cluster_name: resources_utils.ClusterName,
|
|
334
|
+
region: 'clouds.Region',
|
|
335
|
+
zones: Optional[List['clouds.Zone']],
|
|
336
|
+
num_nodes: int,
|
|
337
|
+
dryrun: bool = False,
|
|
338
|
+
volume_mounts: Optional[List['volume_lib.VolumeMount']] = None,
|
|
339
|
+
) -> Dict[str, Any]:
|
|
324
340
|
assert zones is None, ('Azure does not support zones', zones)
|
|
325
341
|
|
|
326
342
|
region_name = region.name
|
|
327
343
|
|
|
328
|
-
|
|
329
|
-
#
|
|
330
|
-
acc_dict = self.get_accelerators_from_instance_type(
|
|
344
|
+
resources = resources.assert_launchable()
|
|
345
|
+
# resources.accelerators is cleared but .instance_type encodes the info.
|
|
346
|
+
acc_dict = self.get_accelerators_from_instance_type(
|
|
347
|
+
resources.instance_type)
|
|
331
348
|
acc_count = None
|
|
332
349
|
if acc_dict is not None:
|
|
333
350
|
acc_count = str(sum(acc_dict.values()))
|
|
@@ -337,10 +354,11 @@ class Azure(clouds.Cloud):
|
|
|
337
354
|
if (resources.image_id is None or
|
|
338
355
|
resources.extract_docker_image() is not None):
|
|
339
356
|
# pylint: disable=import-outside-toplevel
|
|
340
|
-
from sky.
|
|
357
|
+
from sky.catalog import azure_catalog
|
|
341
358
|
gen_version = azure_catalog.get_gen_version_from_instance_type(
|
|
342
|
-
|
|
343
|
-
image_id = self._get_default_image_tag(gen_version,
|
|
359
|
+
resources.instance_type)
|
|
360
|
+
image_id = self._get_default_image_tag(gen_version,
|
|
361
|
+
resources.instance_type)
|
|
344
362
|
else:
|
|
345
363
|
if None in resources.image_id:
|
|
346
364
|
image_id = resources.image_id[None]
|
|
@@ -350,8 +368,7 @@ class Azure(clouds.Cloud):
|
|
|
350
368
|
|
|
351
369
|
# Checked basic image syntax in resources.py
|
|
352
370
|
if image_id.startswith('skypilot:'):
|
|
353
|
-
image_id =
|
|
354
|
-
clouds='azure')
|
|
371
|
+
image_id = catalog.get_image_id_from_tag(image_id, clouds='azure')
|
|
355
372
|
# Fallback if image does not exist in the specified region.
|
|
356
373
|
# Putting fallback here instead of at image validation
|
|
357
374
|
# when creating the resource because community images are
|
|
@@ -362,8 +379,8 @@ class Azure(clouds.Cloud):
|
|
|
362
379
|
) and region_name not in azure_catalog.COMMUNITY_IMAGE_AVAILABLE_REGIONS:
|
|
363
380
|
logger.info(f'Azure image {image_id} does not exist in region '
|
|
364
381
|
f'{region_name} so use the fallback image instead.')
|
|
365
|
-
image_id =
|
|
366
|
-
|
|
382
|
+
image_id = catalog.get_image_id_from_tag(_FALLBACK_IMAGE_ID,
|
|
383
|
+
clouds='azure')
|
|
367
384
|
|
|
368
385
|
if image_id.startswith(_COMMUNITY_IMAGE_PREFIX):
|
|
369
386
|
image_config = {'community_gallery_image_id': image_id}
|
|
@@ -377,8 +394,11 @@ class Azure(clouds.Cloud):
|
|
|
377
394
|
}
|
|
378
395
|
|
|
379
396
|
# Determine resource group for deploying the instance.
|
|
380
|
-
resource_group_name = skypilot_config.
|
|
381
|
-
|
|
397
|
+
resource_group_name = skypilot_config.get_effective_region_config(
|
|
398
|
+
cloud='azure',
|
|
399
|
+
region=region_name,
|
|
400
|
+
keys=('resource_group_vm',),
|
|
401
|
+
default_value=None)
|
|
382
402
|
use_external_resource_group = resource_group_name is not None
|
|
383
403
|
if resource_group_name is None:
|
|
384
404
|
resource_group_name = f'{cluster_name.name_on_cloud}-{region_name}'
|
|
@@ -407,18 +427,19 @@ class Azure(clouds.Cloud):
|
|
|
407
427
|
""").split('\n')
|
|
408
428
|
|
|
409
429
|
def _failover_disk_tier() -> Optional[resources_utils.DiskTier]:
|
|
410
|
-
if (
|
|
411
|
-
|
|
412
|
-
return
|
|
430
|
+
if (resources.disk_tier is not None and
|
|
431
|
+
resources.disk_tier != resources_utils.DiskTier.BEST):
|
|
432
|
+
return resources.disk_tier
|
|
413
433
|
# Failover disk tier from high to low. Default disk tier
|
|
414
434
|
# (Premium_LRS, medium) only support s-series instance types,
|
|
415
435
|
# so we failover to lower tiers for non-s-series.
|
|
416
436
|
all_tiers = list(reversed(resources_utils.DiskTier))
|
|
417
437
|
start_index = all_tiers.index(
|
|
418
|
-
Azure._translate_disk_tier(
|
|
438
|
+
Azure._translate_disk_tier(resources.disk_tier))
|
|
419
439
|
while start_index < len(all_tiers):
|
|
420
440
|
disk_tier = all_tiers[start_index]
|
|
421
|
-
ok, _ = Azure.check_disk_tier(
|
|
441
|
+
ok, _ = Azure.check_disk_tier(resources.instance_type,
|
|
442
|
+
disk_tier)
|
|
422
443
|
if ok:
|
|
423
444
|
return disk_tier
|
|
424
445
|
start_index += 1
|
|
@@ -426,11 +447,11 @@ class Azure(clouds.Cloud):
|
|
|
426
447
|
|
|
427
448
|
disk_tier = _failover_disk_tier()
|
|
428
449
|
|
|
429
|
-
resources_vars = {
|
|
430
|
-
'instance_type':
|
|
450
|
+
resources_vars: Dict[str, Any] = {
|
|
451
|
+
'instance_type': resources.instance_type,
|
|
431
452
|
'custom_resources': custom_resources,
|
|
432
453
|
'num_gpus': acc_count,
|
|
433
|
-
'use_spot':
|
|
454
|
+
'use_spot': resources.use_spot,
|
|
434
455
|
'region': region_name,
|
|
435
456
|
# Azure does not support specific zones.
|
|
436
457
|
'zones': None,
|
|
@@ -489,7 +510,9 @@ class Azure(clouds.Cloud):
|
|
|
489
510
|
default_instance_type = Azure.get_default_instance_type(
|
|
490
511
|
cpus=resources.cpus,
|
|
491
512
|
memory=resources.memory,
|
|
492
|
-
disk_tier=resources.disk_tier
|
|
513
|
+
disk_tier=resources.disk_tier,
|
|
514
|
+
region=resources.region,
|
|
515
|
+
zone=resources.zone)
|
|
493
516
|
if default_instance_type is None:
|
|
494
517
|
return resources_utils.FeasibleResources([], [], None)
|
|
495
518
|
else:
|
|
@@ -498,16 +521,16 @@ class Azure(clouds.Cloud):
|
|
|
498
521
|
|
|
499
522
|
assert len(accelerators) == 1, resources
|
|
500
523
|
acc, acc_count = list(accelerators.items())[0]
|
|
501
|
-
(instance_list,
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
524
|
+
(instance_list,
|
|
525
|
+
fuzzy_candidate_list) = catalog.get_instance_type_for_accelerator(
|
|
526
|
+
acc,
|
|
527
|
+
acc_count,
|
|
528
|
+
cpus=resources.cpus,
|
|
529
|
+
memory=resources.memory,
|
|
530
|
+
use_spot=resources.use_spot,
|
|
531
|
+
region=resources.region,
|
|
532
|
+
zone=resources.zone,
|
|
533
|
+
clouds='azure')
|
|
511
534
|
if instance_list is None:
|
|
512
535
|
return resources_utils.FeasibleResources([], fuzzy_candidate_list,
|
|
513
536
|
None)
|
|
@@ -515,12 +538,14 @@ class Azure(clouds.Cloud):
|
|
|
515
538
|
fuzzy_candidate_list, None)
|
|
516
539
|
|
|
517
540
|
@classmethod
|
|
518
|
-
def _check_compute_credentials(
|
|
541
|
+
def _check_compute_credentials(
|
|
542
|
+
cls) -> Tuple[bool, Optional[Union[str, Dict[str, str]]]]:
|
|
519
543
|
"""Checks if the user has access credentials to this cloud's compute service."""
|
|
520
544
|
return cls._check_credentials()
|
|
521
545
|
|
|
522
546
|
@classmethod
|
|
523
|
-
def _check_storage_credentials(
|
|
547
|
+
def _check_storage_credentials(
|
|
548
|
+
cls) -> Tuple[bool, Optional[Union[str, Dict[str, str]]]]:
|
|
524
549
|
"""Checks if the user has access credentials to this cloud's storage service."""
|
|
525
550
|
# TODO(seungjin): Implement separate check for
|
|
526
551
|
# if the user has access to Azure Blob Storage.
|
|
@@ -529,6 +554,7 @@ class Azure(clouds.Cloud):
|
|
|
529
554
|
@classmethod
|
|
530
555
|
def _check_credentials(cls) -> Tuple[bool, Optional[str]]:
|
|
531
556
|
"""Checks if the user has access credentials to this cloud."""
|
|
557
|
+
|
|
532
558
|
help_str = (
|
|
533
559
|
' Run the following commands:'
|
|
534
560
|
f'\n{cls._INDENT_PREFIX} $ az login'
|
|
@@ -544,6 +570,16 @@ class Azure(clouds.Cloud):
|
|
|
544
570
|
return (False,
|
|
545
571
|
f'{azure_token_cache_file} does not exist.' + help_str)
|
|
546
572
|
|
|
573
|
+
dependency_installation_hints = (
|
|
574
|
+
'Azure dependencies are not installed. '
|
|
575
|
+
'Run the following commands:'
|
|
576
|
+
f'\n{cls._INDENT_PREFIX} $ pip install skypilot[azure]'
|
|
577
|
+
f'\n{cls._INDENT_PREFIX}Credentials may also need to be set.')
|
|
578
|
+
# Check if the azure blob storage dependencies are installed.
|
|
579
|
+
if not adaptors_common.can_import_modules(
|
|
580
|
+
['azure.storage.blob', 'msgraph']):
|
|
581
|
+
return False, dependency_installation_hints
|
|
582
|
+
|
|
547
583
|
try:
|
|
548
584
|
_run_output('az --version')
|
|
549
585
|
except subprocess.CalledProcessError as e:
|
|
@@ -563,19 +599,6 @@ class Azure(clouds.Cloud):
|
|
|
563
599
|
return False, (f'Getting user\'s Azure identity failed.{help_str}\n'
|
|
564
600
|
f'{cls._INDENT_PREFIX}Details: '
|
|
565
601
|
f'{common_utils.format_exception(e)}')
|
|
566
|
-
|
|
567
|
-
# Check if the azure blob storage dependencies are installed.
|
|
568
|
-
try:
|
|
569
|
-
# pylint: disable=redefined-outer-name, import-outside-toplevel, unused-import
|
|
570
|
-
from azure.storage import blob
|
|
571
|
-
import msgraph
|
|
572
|
-
except ImportError as e:
|
|
573
|
-
return False, (
|
|
574
|
-
f'Azure blob storage depdencies are not installed. '
|
|
575
|
-
'Run the following commands:'
|
|
576
|
-
f'\n{cls._INDENT_PREFIX} $ pip install skypilot[azure]'
|
|
577
|
-
f'\n{cls._INDENT_PREFIX}Details: '
|
|
578
|
-
f'{common_utils.format_exception(e)}')
|
|
579
602
|
return True, None
|
|
580
603
|
|
|
581
604
|
def get_credential_file_mounts(self) -> Dict[str, str]:
|
|
@@ -586,8 +609,7 @@ class Azure(clouds.Cloud):
|
|
|
586
609
|
}
|
|
587
610
|
|
|
588
611
|
def instance_type_exists(self, instance_type):
|
|
589
|
-
return
|
|
590
|
-
clouds='azure')
|
|
612
|
+
return catalog.instance_type_exists(instance_type, clouds='azure')
|
|
591
613
|
|
|
592
614
|
@classmethod
|
|
593
615
|
@annotations.lru_cache(scope='global',
|