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/__init__.py
CHANGED
|
@@ -4,8 +4,10 @@ import subprocess
|
|
|
4
4
|
from typing import Optional
|
|
5
5
|
import urllib.request
|
|
6
6
|
|
|
7
|
+
from sky.utils import directory_utils
|
|
8
|
+
|
|
7
9
|
# Replaced with the current commit when building the wheels.
|
|
8
|
-
_SKYPILOT_COMMIT_SHA = '
|
|
10
|
+
_SKYPILOT_COMMIT_SHA = 'd7530d48bc1a331b5644bd6fbbc51eaebf1432f3'
|
|
9
11
|
|
|
10
12
|
|
|
11
13
|
def _get_git_commit():
|
|
@@ -35,8 +37,8 @@ def _get_git_commit():
|
|
|
35
37
|
|
|
36
38
|
|
|
37
39
|
__commit__ = _get_git_commit()
|
|
38
|
-
__version__ = '1.0.0.
|
|
39
|
-
__root_dir__ =
|
|
40
|
+
__version__ = '1.0.0.dev20251107'
|
|
41
|
+
__root_dir__ = directory_utils.get_sky_dir()
|
|
40
42
|
|
|
41
43
|
|
|
42
44
|
# ---------------------- Proxy Configuration ---------------------- #
|
|
@@ -81,13 +83,14 @@ _set_http_proxy_env_vars()
|
|
|
81
83
|
# Keep this order to avoid cyclic imports
|
|
82
84
|
# pylint: disable=wrong-import-position
|
|
83
85
|
from sky import backends
|
|
84
|
-
from sky import benchmark
|
|
85
86
|
from sky import clouds
|
|
86
87
|
from sky.admin_policy import AdminPolicy
|
|
87
88
|
from sky.admin_policy import MutatedUserRequest
|
|
88
89
|
from sky.admin_policy import UserRequest
|
|
90
|
+
from sky.catalog import list_accelerators
|
|
89
91
|
from sky.client.sdk import api_cancel
|
|
90
92
|
from sky.client.sdk import api_info
|
|
93
|
+
from sky.client.sdk import api_login
|
|
91
94
|
from sky.client.sdk import api_server_logs
|
|
92
95
|
from sky.client.sdk import api_start
|
|
93
96
|
from sky.client.sdk import api_status
|
|
@@ -97,12 +100,14 @@ from sky.client.sdk import cancel
|
|
|
97
100
|
from sky.client.sdk import cost_report
|
|
98
101
|
from sky.client.sdk import down
|
|
99
102
|
from sky.client.sdk import download_logs
|
|
103
|
+
from sky.client.sdk import endpoints
|
|
100
104
|
from sky.client.sdk import exec # pylint: disable=redefined-builtin
|
|
101
105
|
from sky.client.sdk import get
|
|
102
106
|
from sky.client.sdk import job_status
|
|
103
107
|
from sky.client.sdk import launch
|
|
104
108
|
from sky.client.sdk import optimize
|
|
105
109
|
from sky.client.sdk import queue
|
|
110
|
+
from sky.client.sdk import reload_config
|
|
106
111
|
from sky.client.sdk import start
|
|
107
112
|
from sky.client.sdk import status
|
|
108
113
|
from sky.client.sdk import stop
|
|
@@ -110,7 +115,6 @@ from sky.client.sdk import storage_delete
|
|
|
110
115
|
from sky.client.sdk import storage_ls
|
|
111
116
|
from sky.client.sdk import stream_and_get
|
|
112
117
|
from sky.client.sdk import tail_logs
|
|
113
|
-
from sky.clouds.service_catalog import list_accelerators
|
|
114
118
|
from sky.dag import Dag
|
|
115
119
|
from sky.data import Storage
|
|
116
120
|
from sky.data import StorageMode
|
|
@@ -118,6 +122,7 @@ from sky.data import StoreType
|
|
|
118
122
|
from sky.jobs import ManagedJobStatus
|
|
119
123
|
from sky.optimizer import Optimizer
|
|
120
124
|
from sky.resources import Resources
|
|
125
|
+
from sky.server.requests.request_names import AdminPolicyRequestName
|
|
121
126
|
from sky.skylet.job_lib import JobStatus
|
|
122
127
|
from sky.task import Task
|
|
123
128
|
from sky.utils.common import OptimizeTarget
|
|
@@ -139,11 +144,15 @@ Kubernetes = clouds.Kubernetes
|
|
|
139
144
|
K8s = Kubernetes
|
|
140
145
|
OCI = clouds.OCI
|
|
141
146
|
Paperspace = clouds.Paperspace
|
|
147
|
+
PrimeIntellect = clouds.PrimeIntellect
|
|
142
148
|
RunPod = clouds.RunPod
|
|
143
149
|
Vast = clouds.Vast
|
|
144
150
|
Vsphere = clouds.Vsphere
|
|
145
151
|
Fluidstack = clouds.Fluidstack
|
|
146
152
|
Nebius = clouds.Nebius
|
|
153
|
+
Hyperbolic = clouds.Hyperbolic
|
|
154
|
+
Shadeform = clouds.Shadeform
|
|
155
|
+
Seeweb = clouds.Seeweb
|
|
147
156
|
|
|
148
157
|
__all__ = [
|
|
149
158
|
'__version__',
|
|
@@ -157,16 +166,19 @@ __all__ = [
|
|
|
157
166
|
'Lambda',
|
|
158
167
|
'OCI',
|
|
159
168
|
'Paperspace',
|
|
169
|
+
'PrimeIntellect',
|
|
160
170
|
'RunPod',
|
|
161
171
|
'Vast',
|
|
162
172
|
'SCP',
|
|
163
173
|
'Vsphere',
|
|
164
174
|
'Fluidstack',
|
|
165
175
|
'Nebius',
|
|
176
|
+
'Hyperbolic',
|
|
177
|
+
'Shadeform',
|
|
178
|
+
'Seeweb',
|
|
166
179
|
'Optimizer',
|
|
167
180
|
'OptimizeTarget',
|
|
168
181
|
'backends',
|
|
169
|
-
'benchmark',
|
|
170
182
|
'list_accelerators',
|
|
171
183
|
'__root_dir__',
|
|
172
184
|
'Storage',
|
|
@@ -184,6 +196,7 @@ __all__ = [
|
|
|
184
196
|
'optimize',
|
|
185
197
|
'launch',
|
|
186
198
|
'exec',
|
|
199
|
+
'reload_config',
|
|
187
200
|
# core APIs
|
|
188
201
|
'status',
|
|
189
202
|
'start',
|
|
@@ -191,6 +204,7 @@ __all__ = [
|
|
|
191
204
|
'down',
|
|
192
205
|
'autostop',
|
|
193
206
|
'cost_report',
|
|
207
|
+
'endpoints',
|
|
194
208
|
# core APIs Job Management
|
|
195
209
|
'queue',
|
|
196
210
|
'cancel',
|
|
@@ -206,6 +220,7 @@ __all__ = [
|
|
|
206
220
|
'api_status',
|
|
207
221
|
'api_cancel',
|
|
208
222
|
'api_info',
|
|
223
|
+
'api_login',
|
|
209
224
|
'api_start',
|
|
210
225
|
'api_stop',
|
|
211
226
|
'api_server_logs',
|
|
@@ -214,6 +229,7 @@ __all__ = [
|
|
|
214
229
|
'MutatedUserRequest',
|
|
215
230
|
'AdminPolicy',
|
|
216
231
|
'Config',
|
|
232
|
+
'AdminPolicyRequestName',
|
|
217
233
|
# Registry
|
|
218
234
|
'CLOUD_REGISTRY',
|
|
219
235
|
'JOBS_RECOVERY_STRATEGY_REGISTRY',
|
sky/adaptors/aws.py
CHANGED
|
@@ -34,6 +34,7 @@ import time
|
|
|
34
34
|
import typing
|
|
35
35
|
from typing import Callable, Literal, Optional, TypeVar
|
|
36
36
|
|
|
37
|
+
from sky import skypilot_config
|
|
37
38
|
from sky.adaptors import common
|
|
38
39
|
from sky.utils import annotations
|
|
39
40
|
from sky.utils import common_utils
|
|
@@ -119,12 +120,27 @@ def _create_aws_object(creation_fn_or_cls: Callable[[], T],
|
|
|
119
120
|
f'{common_utils.format_exception(e)}.')
|
|
120
121
|
|
|
121
122
|
|
|
123
|
+
def get_workspace_profile() -> Optional[str]:
|
|
124
|
+
"""Get AWS profile name from workspace config."""
|
|
125
|
+
return skypilot_config.get_workspace_cloud('aws').get('profile', None)
|
|
126
|
+
|
|
127
|
+
|
|
122
128
|
# The LRU cache needs to be thread-local to avoid multiple threads sharing the
|
|
123
129
|
# same session object, which is not guaranteed to be thread-safe.
|
|
124
130
|
@_thread_local_lru_cache()
|
|
125
|
-
def session(check_credentials: bool = True):
|
|
126
|
-
"""Create an AWS session.
|
|
127
|
-
|
|
131
|
+
def session(check_credentials: bool = True, profile: Optional[str] = None):
|
|
132
|
+
"""Create an AWS session.
|
|
133
|
+
|
|
134
|
+
Args:
|
|
135
|
+
check_credentials: Whether to check if credentials are available.
|
|
136
|
+
profile: AWS profile name to use. If None, uses default credentials.
|
|
137
|
+
"""
|
|
138
|
+
if profile is not None:
|
|
139
|
+
logger.debug(f'Using AWS profile \'{profile}\'.')
|
|
140
|
+
s = _create_aws_object(
|
|
141
|
+
lambda: boto3.session.Session(profile_name=profile), 'session')
|
|
142
|
+
else:
|
|
143
|
+
s = _create_aws_object(boto3.session.Session, 'session')
|
|
128
144
|
if check_credentials and s.get_credentials() is None:
|
|
129
145
|
# s.get_credentials() can be None if there are actually no credentials,
|
|
130
146
|
# or if we fail to get credentials from IMDS (e.g. due to throttling).
|
|
@@ -180,13 +196,14 @@ def resource(service_name: str, **kwargs):
|
|
|
180
196
|
kwargs['config'] = config
|
|
181
197
|
|
|
182
198
|
check_credentials = kwargs.pop('check_credentials', True)
|
|
199
|
+
profile = get_workspace_profile()
|
|
183
200
|
|
|
184
201
|
# Need to use the client retrieved from the per-thread session to avoid
|
|
185
202
|
# thread-safety issues (Directly creating the client with boto3.resource()
|
|
186
203
|
# is not thread-safe). Reference: https://stackoverflow.com/a/59635814
|
|
187
204
|
return _create_aws_object(
|
|
188
|
-
lambda: session(check_credentials=check_credentials).
|
|
189
|
-
|
|
205
|
+
lambda: session(check_credentials=check_credentials, profile=profile).
|
|
206
|
+
resource(service_name, **kwargs), 'resource')
|
|
190
207
|
|
|
191
208
|
|
|
192
209
|
# New typing overloads can be added as needed.
|
|
@@ -221,14 +238,15 @@ def client(service_name: str, **kwargs):
|
|
|
221
238
|
_assert_kwargs_builtin_type(kwargs)
|
|
222
239
|
|
|
223
240
|
check_credentials = kwargs.pop('check_credentials', True)
|
|
241
|
+
profile = get_workspace_profile()
|
|
224
242
|
|
|
225
243
|
# Need to use the client retrieved from the per-thread session to avoid
|
|
226
244
|
# thread-safety issues (Directly creating the client with boto3.client() is
|
|
227
245
|
# not thread-safe). Reference: https://stackoverflow.com/a/59635814
|
|
228
246
|
|
|
229
247
|
return _create_aws_object(
|
|
230
|
-
lambda: session(check_credentials=check_credentials).
|
|
231
|
-
|
|
248
|
+
lambda: session(check_credentials=check_credentials, profile=profile).
|
|
249
|
+
client(service_name, **kwargs), 'client')
|
|
232
250
|
|
|
233
251
|
|
|
234
252
|
@common.load_lazy_modules(modules=_LAZY_MODULES)
|
sky/adaptors/common.py
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
"""Lazy import for modules to avoid import error when not used."""
|
|
2
|
+
from importlib import util as importlib_util
|
|
2
3
|
import functools
|
|
3
4
|
import importlib
|
|
4
5
|
import threading
|
|
5
6
|
import types
|
|
6
|
-
from typing import Any, Callable, Optional, Tuple
|
|
7
|
+
from typing import Any, Callable, List, Optional, Tuple
|
|
7
8
|
|
|
8
9
|
|
|
9
10
|
class LazyImport(types.ModuleType):
|
|
@@ -78,3 +79,25 @@ def load_lazy_modules(modules: Tuple[LazyImport, ...]):
|
|
|
78
79
|
return wrapper
|
|
79
80
|
|
|
80
81
|
return decorator
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def can_import_modules(module_names: List[str]) -> bool:
|
|
85
|
+
""" module availability without actually importing it to
|
|
86
|
+
save memory footprint.
|
|
87
|
+
|
|
88
|
+
Args:
|
|
89
|
+
module_names: List[str], the names of the modules to check.
|
|
90
|
+
|
|
91
|
+
Returns:
|
|
92
|
+
True if all modules are available, False otherwise.
|
|
93
|
+
If a module exists in sys.modules, but is set to None,
|
|
94
|
+
then it is considered as not available.
|
|
95
|
+
"""
|
|
96
|
+
try:
|
|
97
|
+
for module_name in module_names:
|
|
98
|
+
module_spec = importlib_util.find_spec(module_name)
|
|
99
|
+
if module_spec is None:
|
|
100
|
+
return False
|
|
101
|
+
return True
|
|
102
|
+
except ValueError:
|
|
103
|
+
return False
|
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
"""CoreWeave cloud adaptor."""
|
|
2
|
+
|
|
3
|
+
import configparser
|
|
4
|
+
import contextlib
|
|
5
|
+
import os
|
|
6
|
+
import threading
|
|
7
|
+
from typing import Dict, Optional, Tuple
|
|
8
|
+
|
|
9
|
+
from sky import exceptions
|
|
10
|
+
from sky import sky_logging
|
|
11
|
+
from sky.adaptors import common
|
|
12
|
+
from sky.clouds import cloud
|
|
13
|
+
from sky.utils import annotations
|
|
14
|
+
from sky.utils import ux_utils
|
|
15
|
+
|
|
16
|
+
logger = sky_logging.init_logger(__name__)
|
|
17
|
+
|
|
18
|
+
COREWEAVE_PROFILE_NAME = 'cw'
|
|
19
|
+
COREWEAVE_CREDENTIALS_PATH = '~/.coreweave/cw.credentials'
|
|
20
|
+
COREWEAVE_CONFIG_PATH = '~/.coreweave/cw.config'
|
|
21
|
+
NAME = 'CoreWeave'
|
|
22
|
+
DEFAULT_REGION = 'US-EAST-01A'
|
|
23
|
+
_DEFAULT_ENDPOINT = 'https://cwobject.com'
|
|
24
|
+
_INDENT_PREFIX = ' '
|
|
25
|
+
|
|
26
|
+
_IMPORT_ERROR_MESSAGE = ('Failed to import dependencies for CoreWeave.'
|
|
27
|
+
'Try pip install "skypilot[coreweave]"')
|
|
28
|
+
|
|
29
|
+
boto3 = common.LazyImport('boto3', import_error_message=_IMPORT_ERROR_MESSAGE)
|
|
30
|
+
botocore = common.LazyImport('botocore',
|
|
31
|
+
import_error_message=_IMPORT_ERROR_MESSAGE)
|
|
32
|
+
|
|
33
|
+
_LAZY_MODULES = (boto3, botocore)
|
|
34
|
+
_session_creation_lock = threading.RLock()
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
@contextlib.contextmanager
|
|
38
|
+
def _load_cw_credentials_env():
|
|
39
|
+
"""Context manager to temporarily change the AWS credentials file path."""
|
|
40
|
+
prev_credentials_path = os.environ.get('AWS_SHARED_CREDENTIALS_FILE')
|
|
41
|
+
prev_config_path = os.environ.get('AWS_CONFIG_FILE')
|
|
42
|
+
os.environ['AWS_SHARED_CREDENTIALS_FILE'] = COREWEAVE_CREDENTIALS_PATH
|
|
43
|
+
os.environ['AWS_CONFIG_FILE'] = COREWEAVE_CONFIG_PATH
|
|
44
|
+
try:
|
|
45
|
+
yield
|
|
46
|
+
finally:
|
|
47
|
+
if prev_credentials_path is None:
|
|
48
|
+
del os.environ['AWS_SHARED_CREDENTIALS_FILE']
|
|
49
|
+
else:
|
|
50
|
+
os.environ['AWS_SHARED_CREDENTIALS_FILE'] = prev_credentials_path
|
|
51
|
+
if prev_config_path is None:
|
|
52
|
+
del os.environ['AWS_CONFIG_FILE']
|
|
53
|
+
else:
|
|
54
|
+
os.environ['AWS_CONFIG_FILE'] = prev_config_path
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def get_coreweave_credentials(boto3_session):
|
|
58
|
+
"""Gets the CoreWeave credentials from the boto3 session object.
|
|
59
|
+
|
|
60
|
+
Args:
|
|
61
|
+
boto3_session: The boto3 session object.
|
|
62
|
+
Returns:
|
|
63
|
+
botocore.credentials.ReadOnlyCredentials object with the CoreWeave
|
|
64
|
+
credentials.
|
|
65
|
+
"""
|
|
66
|
+
with _load_cw_credentials_env():
|
|
67
|
+
coreweave_credentials = boto3_session.get_credentials()
|
|
68
|
+
if coreweave_credentials is None:
|
|
69
|
+
with ux_utils.print_exception_no_traceback():
|
|
70
|
+
raise ValueError('CoreWeave credentials not found. Run '
|
|
71
|
+
'`sky check` to verify credentials are '
|
|
72
|
+
'correctly set up.')
|
|
73
|
+
return coreweave_credentials.get_frozen_credentials()
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
@annotations.lru_cache(scope='global')
|
|
77
|
+
def session():
|
|
78
|
+
"""Create an AWS session for CoreWeave."""
|
|
79
|
+
# Creating the session object is not thread-safe for boto3,
|
|
80
|
+
# so we add a reentrant lock to synchronize the session creation.
|
|
81
|
+
# Reference: https://github.com/boto/boto3/issues/1592
|
|
82
|
+
# However, the session object itself is thread-safe, so we are
|
|
83
|
+
# able to use lru_cache() to cache the session object.
|
|
84
|
+
with _session_creation_lock:
|
|
85
|
+
with _load_cw_credentials_env():
|
|
86
|
+
session_ = boto3.session.Session(
|
|
87
|
+
profile_name=COREWEAVE_PROFILE_NAME)
|
|
88
|
+
return session_
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
@annotations.lru_cache(scope='global')
|
|
92
|
+
def resource(resource_name: str, **kwargs):
|
|
93
|
+
"""Create a CoreWeave resource.
|
|
94
|
+
|
|
95
|
+
Args:
|
|
96
|
+
resource_name: CoreWeave resource name (e.g., 's3').
|
|
97
|
+
kwargs: Other options.
|
|
98
|
+
"""
|
|
99
|
+
# Need to use the resource retrieved from the per-thread session
|
|
100
|
+
# to avoid thread-safety issues (Directly creating the client
|
|
101
|
+
# with boto3.resource() is not thread-safe).
|
|
102
|
+
# Reference: https://stackoverflow.com/a/59635814
|
|
103
|
+
|
|
104
|
+
session_ = session()
|
|
105
|
+
coreweave_credentials = get_coreweave_credentials(session_)
|
|
106
|
+
endpoint = get_endpoint()
|
|
107
|
+
|
|
108
|
+
return session_.resource(
|
|
109
|
+
resource_name,
|
|
110
|
+
endpoint_url=endpoint,
|
|
111
|
+
aws_access_key_id=coreweave_credentials.access_key,
|
|
112
|
+
aws_secret_access_key=coreweave_credentials.secret_key,
|
|
113
|
+
region_name='auto',
|
|
114
|
+
config=botocore.config.Config(s3={'addressing_style': 'virtual'}),
|
|
115
|
+
**kwargs)
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
@annotations.lru_cache(scope='global')
|
|
119
|
+
def client(service_name: str):
|
|
120
|
+
"""Create CoreWeave client of a certain service.
|
|
121
|
+
|
|
122
|
+
Args:
|
|
123
|
+
service_name: CoreWeave service name (e.g., 's3').
|
|
124
|
+
"""
|
|
125
|
+
# Need to use the client retrieved from the per-thread session
|
|
126
|
+
# to avoid thread-safety issues (Directly creating the client
|
|
127
|
+
# with boto3.client() is not thread-safe).
|
|
128
|
+
# Reference: https://stackoverflow.com/a/59635814
|
|
129
|
+
|
|
130
|
+
session_ = session()
|
|
131
|
+
coreweave_credentials = get_coreweave_credentials(session_)
|
|
132
|
+
endpoint = get_endpoint()
|
|
133
|
+
|
|
134
|
+
return session_.client(
|
|
135
|
+
service_name,
|
|
136
|
+
endpoint_url=endpoint,
|
|
137
|
+
aws_access_key_id=coreweave_credentials.access_key,
|
|
138
|
+
aws_secret_access_key=coreweave_credentials.secret_key,
|
|
139
|
+
region_name='auto',
|
|
140
|
+
config=botocore.config.Config(s3={'addressing_style': 'virtual'}),
|
|
141
|
+
)
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
@common.load_lazy_modules(_LAZY_MODULES)
|
|
145
|
+
def botocore_exceptions():
|
|
146
|
+
"""AWS botocore exception."""
|
|
147
|
+
# pylint: disable=import-outside-toplevel
|
|
148
|
+
from botocore import exceptions as boto_exceptions
|
|
149
|
+
return boto_exceptions
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
def get_endpoint():
|
|
153
|
+
"""Parse the COREWEAVE_CONFIG_PATH to get the endpoint_url.
|
|
154
|
+
|
|
155
|
+
The config file is an AWS-style config file with format:
|
|
156
|
+
[profile cw]
|
|
157
|
+
endpoint_url = https://cwobject.com
|
|
158
|
+
s3 =
|
|
159
|
+
addressing_style = virtual
|
|
160
|
+
|
|
161
|
+
Returns:
|
|
162
|
+
str: The endpoint URL from the config file, or the default endpoint
|
|
163
|
+
if the file doesn't exist or doesn't contain the endpoint_url.
|
|
164
|
+
"""
|
|
165
|
+
config_path = os.path.expanduser(COREWEAVE_CONFIG_PATH)
|
|
166
|
+
if not os.path.isfile(config_path):
|
|
167
|
+
return _DEFAULT_ENDPOINT
|
|
168
|
+
|
|
169
|
+
try:
|
|
170
|
+
config = configparser.ConfigParser()
|
|
171
|
+
config.read(config_path)
|
|
172
|
+
|
|
173
|
+
# Try to get endpoint_url from [profile cw] section
|
|
174
|
+
profile_section = f'profile {COREWEAVE_PROFILE_NAME}'
|
|
175
|
+
if config.has_section(profile_section):
|
|
176
|
+
if config.has_option(profile_section, 'endpoint_url'):
|
|
177
|
+
endpoint = config.get(profile_section, 'endpoint_url')
|
|
178
|
+
return endpoint.strip()
|
|
179
|
+
except (configparser.Error, OSError) as e:
|
|
180
|
+
logger.warning(f'Failed to parse CoreWeave config file: {e}. '
|
|
181
|
+
f'Using default endpoint: {_DEFAULT_ENDPOINT}')
|
|
182
|
+
|
|
183
|
+
return _DEFAULT_ENDPOINT
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
def check_credentials(
|
|
187
|
+
cloud_capability: cloud.CloudCapability) -> Tuple[bool, Optional[str]]:
|
|
188
|
+
if cloud_capability == cloud.CloudCapability.STORAGE:
|
|
189
|
+
return check_storage_credentials()
|
|
190
|
+
else:
|
|
191
|
+
raise exceptions.NotSupportedError(
|
|
192
|
+
f'{NAME} does not support {cloud_capability}.')
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
def check_storage_credentials() -> Tuple[bool, Optional[str]]:
|
|
196
|
+
"""Checks if the user has access credentials to CoreWeave Object Storage.
|
|
197
|
+
|
|
198
|
+
Returns:
|
|
199
|
+
A tuple of a boolean value and a hint message where the bool
|
|
200
|
+
is True when both credentials needed for CoreWeave storage is set.
|
|
201
|
+
It is False when either of those are not set, which would hint with a
|
|
202
|
+
string on unset credential.
|
|
203
|
+
"""
|
|
204
|
+
hints = None
|
|
205
|
+
profile_in_cred = coreweave_profile_in_cred()
|
|
206
|
+
profile_in_config = coreweave_profile_in_config()
|
|
207
|
+
|
|
208
|
+
if not profile_in_cred:
|
|
209
|
+
hints = (f'[{COREWEAVE_PROFILE_NAME}] profile is not set in '
|
|
210
|
+
f'{COREWEAVE_CREDENTIALS_PATH}.')
|
|
211
|
+
if not profile_in_config:
|
|
212
|
+
if hints:
|
|
213
|
+
hints += ' Additionally, '
|
|
214
|
+
else:
|
|
215
|
+
hints = ''
|
|
216
|
+
hints += (f'[{COREWEAVE_PROFILE_NAME}] profile is not set in '
|
|
217
|
+
f'{COREWEAVE_CONFIG_PATH}.')
|
|
218
|
+
|
|
219
|
+
if hints:
|
|
220
|
+
hints += ' Run the following commands:'
|
|
221
|
+
if not profile_in_cred:
|
|
222
|
+
hints += f'\n{_INDENT_PREFIX} $ pip install boto3'
|
|
223
|
+
hints += (f'\n{_INDENT_PREFIX} $ AWS_SHARED_CREDENTIALS_FILE='
|
|
224
|
+
f'{COREWEAVE_CREDENTIALS_PATH} aws configure --profile '
|
|
225
|
+
f'{COREWEAVE_PROFILE_NAME}')
|
|
226
|
+
if not profile_in_config:
|
|
227
|
+
hints += (f'\n{_INDENT_PREFIX} $ AWS_CONFIG_FILE='
|
|
228
|
+
f'{COREWEAVE_CONFIG_PATH} aws configure set endpoint_url'
|
|
229
|
+
f' <ENDPOINT_URL> --profile '
|
|
230
|
+
f'{COREWEAVE_PROFILE_NAME}')
|
|
231
|
+
hints += (f'\n{_INDENT_PREFIX} $ AWS_CONFIG_FILE='
|
|
232
|
+
f'{COREWEAVE_CONFIG_PATH} aws configure set '
|
|
233
|
+
f's3.addressing_style virtual --profile '
|
|
234
|
+
f'{COREWEAVE_PROFILE_NAME}')
|
|
235
|
+
hints += f'\n{_INDENT_PREFIX}For more info: '
|
|
236
|
+
hints += 'https://docs.coreweave.com/docs/products/storage/object-storage/get-started-caios' # pylint: disable=line-too-long
|
|
237
|
+
|
|
238
|
+
return (False, hints) if hints else (True, hints)
|
|
239
|
+
|
|
240
|
+
|
|
241
|
+
def coreweave_profile_in_config() -> bool:
|
|
242
|
+
"""Checks if CoreWeave profile is set in config"""
|
|
243
|
+
conf_path = os.path.expanduser(COREWEAVE_CONFIG_PATH)
|
|
244
|
+
coreweave_profile_exists = False
|
|
245
|
+
if os.path.isfile(conf_path):
|
|
246
|
+
with open(conf_path, 'r', encoding='utf-8') as file:
|
|
247
|
+
for line in file:
|
|
248
|
+
if f'[profile {COREWEAVE_PROFILE_NAME}]' in line:
|
|
249
|
+
coreweave_profile_exists = True
|
|
250
|
+
break
|
|
251
|
+
return coreweave_profile_exists
|
|
252
|
+
|
|
253
|
+
|
|
254
|
+
def coreweave_profile_in_cred() -> bool:
|
|
255
|
+
"""Checks if CoreWeave profile is set in credentials"""
|
|
256
|
+
cred_path = os.path.expanduser(COREWEAVE_CREDENTIALS_PATH)
|
|
257
|
+
coreweave_profile_exists = False
|
|
258
|
+
if os.path.isfile(cred_path):
|
|
259
|
+
with open(cred_path, 'r', encoding='utf-8') as file:
|
|
260
|
+
for line in file:
|
|
261
|
+
if f'[{COREWEAVE_PROFILE_NAME}]' in line:
|
|
262
|
+
coreweave_profile_exists = True
|
|
263
|
+
break
|
|
264
|
+
return coreweave_profile_exists
|
|
265
|
+
|
|
266
|
+
|
|
267
|
+
def get_credential_file_mounts() -> Dict[str, str]:
|
|
268
|
+
"""Returns credential file mounts for CoreWeave.
|
|
269
|
+
|
|
270
|
+
Returns:
|
|
271
|
+
Dict[str, str]: A dictionary mapping source paths to destination paths
|
|
272
|
+
for credential files.
|
|
273
|
+
"""
|
|
274
|
+
coreweave_credential_mounts = {
|
|
275
|
+
COREWEAVE_CREDENTIALS_PATH: COREWEAVE_CREDENTIALS_PATH,
|
|
276
|
+
COREWEAVE_CONFIG_PATH: COREWEAVE_CONFIG_PATH
|
|
277
|
+
}
|
|
278
|
+
return coreweave_credential_mounts
|
sky/adaptors/do.py
CHANGED
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
"""Digital Ocean cloud adaptors"""
|
|
2
2
|
|
|
3
|
-
# pylint: disable=import-outside-toplevel
|
|
4
|
-
|
|
5
3
|
from sky.adaptors import common
|
|
6
4
|
|
|
7
5
|
_IMPORT_ERROR_MESSAGE = ('Failed to import dependencies for DO. '
|
|
@@ -16,5 +14,13 @@ _LAZY_MODULES = (pydo, azure)
|
|
|
16
14
|
@common.load_lazy_modules(modules=_LAZY_MODULES)
|
|
17
15
|
def exceptions():
|
|
18
16
|
"""Azure exceptions."""
|
|
17
|
+
# pylint: disable=import-outside-toplevel
|
|
19
18
|
from azure.core import exceptions as azure_exceptions
|
|
20
19
|
return azure_exceptions
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def check_exceptions_dependencies_installed():
|
|
23
|
+
"""Check if the azure.core.exceptions module is installed."""
|
|
24
|
+
if not common.can_import_modules(['azure.core.exceptions']):
|
|
25
|
+
return False, _IMPORT_ERROR_MESSAGE
|
|
26
|
+
return True, None
|