skypilot-nightly 1.0.0.dev20250905__py3-none-any.whl → 1.0.0.dev20251210__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 +12 -2
- sky/adaptors/aws.py +27 -22
- 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/ibm.py +5 -2
- sky/adaptors/kubernetes.py +64 -0
- sky/adaptors/nebius.py +3 -1
- sky/adaptors/primeintellect.py +1 -0
- sky/adaptors/seeweb.py +183 -0
- sky/adaptors/shadeform.py +89 -0
- sky/adaptors/slurm.py +478 -0
- sky/admin_policy.py +20 -0
- sky/authentication.py +157 -263
- sky/backends/__init__.py +3 -2
- sky/backends/backend.py +11 -3
- sky/backends/backend_utils.py +630 -185
- sky/backends/cloud_vm_ray_backend.py +1111 -928
- sky/backends/local_docker_backend.py +9 -5
- sky/backends/task_codegen.py +971 -0
- sky/backends/wheel_utils.py +18 -0
- sky/catalog/__init__.py +8 -3
- sky/catalog/aws_catalog.py +4 -0
- sky/catalog/common.py +19 -1
- sky/catalog/data_fetchers/fetch_aws.py +102 -80
- sky/catalog/data_fetchers/fetch_gcp.py +30 -3
- sky/catalog/data_fetchers/fetch_nebius.py +9 -6
- 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/catalog/kubernetes_catalog.py +36 -32
- sky/catalog/primeintellect_catalog.py +95 -0
- sky/catalog/runpod_catalog.py +5 -1
- sky/catalog/seeweb_catalog.py +184 -0
- sky/catalog/shadeform_catalog.py +165 -0
- sky/catalog/slurm_catalog.py +243 -0
- sky/check.py +87 -46
- sky/client/cli/command.py +1004 -434
- sky/client/cli/flags.py +4 -2
- sky/{volumes/utils.py → client/cli/table_utils.py} +111 -13
- sky/client/cli/utils.py +79 -0
- sky/client/common.py +12 -2
- sky/client/sdk.py +188 -65
- sky/client/sdk_async.py +34 -33
- sky/cloud_stores.py +82 -3
- sky/clouds/__init__.py +8 -0
- sky/clouds/aws.py +337 -129
- sky/clouds/azure.py +24 -18
- sky/clouds/cloud.py +47 -13
- sky/clouds/cudo.py +16 -13
- sky/clouds/do.py +9 -7
- sky/clouds/fluidstack.py +12 -5
- sky/clouds/gcp.py +14 -7
- sky/clouds/hyperbolic.py +12 -5
- sky/clouds/ibm.py +12 -5
- sky/clouds/kubernetes.py +80 -45
- sky/clouds/lambda_cloud.py +12 -5
- sky/clouds/nebius.py +23 -9
- sky/clouds/oci.py +19 -12
- sky/clouds/paperspace.py +4 -1
- sky/clouds/primeintellect.py +317 -0
- sky/clouds/runpod.py +85 -24
- sky/clouds/scp.py +12 -8
- sky/clouds/seeweb.py +477 -0
- sky/clouds/shadeform.py +400 -0
- sky/clouds/slurm.py +578 -0
- sky/clouds/ssh.py +6 -3
- sky/clouds/utils/scp_utils.py +61 -50
- sky/clouds/vast.py +43 -27
- sky/clouds/vsphere.py +14 -16
- sky/core.py +296 -195
- sky/dashboard/out/404.html +1 -1
- sky/dashboard/out/_next/static/KYAhEFa3FTfq4JyKVgo-s/_buildManifest.js +1 -0
- sky/dashboard/out/_next/static/chunks/1141-9c810f01ff4f398a.js +11 -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/2369.fc20f0c2c8ed9fe7.js +15 -0
- sky/dashboard/out/_next/static/chunks/2755.edd818326d489a1d.js +26 -0
- sky/dashboard/out/_next/static/chunks/3294.ddda8c6c6f9f24dc.js +1 -0
- sky/dashboard/out/_next/static/chunks/3785.7e245f318f9d1121.js +1 -0
- sky/dashboard/out/_next/static/chunks/{6601-06114c982db410b6.js → 3800-b589397dc09c5b4e.js} +1 -1
- sky/dashboard/out/_next/static/chunks/3850-fd5696f3bbbaddae.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/6212-7bd06f60ba693125.js +13 -0
- sky/dashboard/out/_next/static/chunks/6856-da20c5fd999f319c.js +1 -0
- sky/dashboard/out/_next/static/chunks/6990-09cbf02d3cd518c3.js +1 -0
- sky/dashboard/out/_next/static/chunks/7359-c8d04e06886000b3.js +30 -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-8369df1cf105221c.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/pages/_app-68b647e26f9d2793.js +34 -0
- sky/dashboard/out/_next/static/chunks/pages/clusters/[cluster]/[job]-33f525539665fdfd.js +16 -0
- sky/dashboard/out/_next/static/chunks/pages/clusters/[cluster]-a7565f586ef86467.js +1 -0
- sky/dashboard/out/_next/static/chunks/pages/clusters-9e5d47818b9bdadd.js +1 -0
- sky/dashboard/out/_next/static/chunks/pages/{config-dfb9bf07b13045f4.js → config-718cdc365de82689.js} +1 -1
- sky/dashboard/out/_next/static/chunks/pages/infra/{[context]-6563820e094f68ca.js → [context]-12c559ec4d81fdbd.js} +1 -1
- sky/dashboard/out/_next/static/chunks/pages/{infra-aabba60d57826e0f.js → infra-d187cd0413d72475.js} +1 -1
- sky/dashboard/out/_next/static/chunks/pages/jobs/[job]-895847b6cf200b04.js +16 -0
- sky/dashboard/out/_next/static/chunks/pages/jobs/pools/[pool]-8d0f4655400b4eb9.js +21 -0
- sky/dashboard/out/_next/static/chunks/pages/jobs-e5a98f17f8513a96.js +1 -0
- sky/dashboard/out/_next/static/chunks/pages/plugins/[...slug]-4f46050ca065d8f8.js +1 -0
- sky/dashboard/out/_next/static/chunks/pages/users-2f7646eb77785a2c.js +1 -0
- sky/dashboard/out/_next/static/chunks/pages/volumes-ef19d49c6d0e8500.js +1 -0
- sky/dashboard/out/_next/static/chunks/pages/workspaces/{[name]-af76bb06dbb3954f.js → [name]-96e0f298308da7e2.js} +1 -1
- sky/dashboard/out/_next/static/chunks/pages/{workspaces-7598c33a746cdc91.js → workspaces-cb4da3abe08ebf19.js} +1 -1
- sky/dashboard/out/_next/static/chunks/webpack-fba3de387ff6bb08.js +1 -0
- sky/dashboard/out/_next/static/css/c5a4cfd2600fc715.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 -1
- sky/dashboard/out/index.html +1 -1
- sky/dashboard/out/infra/[context].html +1 -1
- sky/dashboard/out/infra.html +1 -1
- sky/dashboard/out/jobs/[job].html +1 -1
- sky/dashboard/out/jobs/pools/[pool].html +1 -1
- sky/dashboard/out/jobs.html +1 -1
- sky/dashboard/out/plugins/[...slug].html +1 -0
- sky/dashboard/out/users.html +1 -1
- sky/dashboard/out/volumes.html +1 -1
- sky/dashboard/out/workspace/new.html +1 -1
- sky/dashboard/out/workspaces/[name].html +1 -1
- sky/dashboard/out/workspaces.html +1 -1
- sky/data/data_utils.py +92 -1
- sky/data/mounting_utils.py +177 -30
- sky/data/storage.py +200 -19
- sky/data/storage_utils.py +10 -45
- sky/exceptions.py +18 -7
- sky/execution.py +74 -31
- sky/global_user_state.py +605 -191
- sky/jobs/__init__.py +2 -0
- sky/jobs/client/sdk.py +101 -4
- sky/jobs/client/sdk_async.py +31 -5
- sky/jobs/constants.py +15 -8
- sky/jobs/controller.py +726 -284
- sky/jobs/file_content_utils.py +128 -0
- sky/jobs/log_gc.py +193 -0
- sky/jobs/recovery_strategy.py +250 -100
- sky/jobs/scheduler.py +271 -173
- sky/jobs/server/core.py +367 -114
- sky/jobs/server/server.py +81 -35
- sky/jobs/server/utils.py +89 -35
- sky/jobs/state.py +1498 -620
- sky/jobs/utils.py +771 -306
- sky/logs/agent.py +40 -5
- sky/logs/aws.py +9 -19
- sky/metrics/utils.py +282 -39
- sky/models.py +2 -0
- sky/optimizer.py +7 -6
- sky/provision/__init__.py +38 -1
- sky/provision/aws/config.py +34 -13
- sky/provision/aws/instance.py +5 -2
- sky/provision/azure/instance.py +5 -3
- sky/provision/common.py +22 -0
- sky/provision/cudo/instance.py +4 -3
- sky/provision/do/instance.py +4 -3
- sky/provision/docker_utils.py +112 -28
- sky/provision/fluidstack/instance.py +6 -5
- sky/provision/gcp/config.py +6 -1
- sky/provision/gcp/instance.py +4 -2
- sky/provision/hyperbolic/instance.py +4 -2
- sky/provision/instance_setup.py +66 -20
- sky/provision/kubernetes/__init__.py +2 -0
- sky/provision/kubernetes/config.py +7 -44
- sky/provision/kubernetes/constants.py +0 -1
- sky/provision/kubernetes/instance.py +609 -213
- sky/provision/kubernetes/manifests/fusermount-server-daemonset.yaml +1 -2
- sky/provision/kubernetes/network.py +12 -8
- sky/provision/kubernetes/network_utils.py +8 -25
- sky/provision/kubernetes/utils.py +422 -422
- sky/provision/kubernetes/volume.py +150 -18
- sky/provision/lambda_cloud/instance.py +16 -13
- sky/provision/nebius/instance.py +6 -2
- sky/provision/nebius/utils.py +103 -86
- sky/provision/oci/instance.py +4 -2
- sky/provision/paperspace/instance.py +4 -3
- 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 +45 -15
- sky/provision/runpod/__init__.py +2 -0
- sky/provision/runpod/instance.py +4 -3
- sky/provision/runpod/volume.py +69 -13
- sky/provision/scp/instance.py +307 -130
- 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/slurm/__init__.py +12 -0
- sky/provision/slurm/config.py +13 -0
- sky/provision/slurm/instance.py +572 -0
- sky/provision/slurm/utils.py +583 -0
- sky/provision/vast/instance.py +9 -4
- sky/provision/vast/utils.py +10 -6
- 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 +3 -2
- sky/provision/vsphere/instance.py +8 -6
- sky/provision/vsphere/vsphere_utils.py +8 -1
- sky/resources.py +11 -3
- sky/schemas/api/responses.py +107 -6
- 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/serve_state/002_yaml_content.py +34 -0
- sky/schemas/db/skypilot_config/001_initial_schema.py +30 -0
- sky/schemas/db/spot_jobs/002_cluster_pool.py +3 -3
- 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/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 +2 -0
- sky/serve/client/impl.py +55 -21
- sky/serve/constants.py +4 -3
- sky/serve/controller.py +17 -11
- sky/serve/load_balancing_policies.py +1 -1
- sky/serve/replica_managers.py +219 -142
- sky/serve/serve_rpc_utils.py +179 -0
- sky/serve/serve_state.py +63 -54
- sky/serve/serve_utils.py +145 -109
- sky/serve/server/core.py +46 -25
- sky/serve/server/impl.py +311 -162
- sky/serve/server/server.py +21 -19
- sky/serve/service.py +84 -68
- sky/serve/service_spec.py +45 -7
- sky/server/auth/loopback.py +38 -0
- sky/server/auth/oauth2_proxy.py +12 -7
- sky/server/common.py +47 -24
- sky/server/config.py +62 -28
- sky/server/constants.py +9 -1
- sky/server/daemons.py +109 -38
- sky/server/metrics.py +76 -96
- sky/server/middleware_utils.py +166 -0
- sky/server/plugins.py +222 -0
- sky/server/requests/executor.py +384 -145
- sky/server/requests/payloads.py +83 -19
- sky/server/requests/preconditions.py +15 -13
- sky/server/requests/request_names.py +123 -0
- sky/server/requests/requests.py +511 -157
- sky/server/requests/serializers/decoders.py +48 -17
- sky/server/requests/serializers/encoders.py +102 -20
- sky/server/requests/serializers/return_value_serializers.py +60 -0
- sky/server/requests/threads.py +117 -0
- sky/server/rest.py +116 -24
- sky/server/server.py +497 -179
- sky/server/server_utils.py +30 -0
- sky/server/stream_utils.py +219 -45
- sky/server/uvicorn.py +30 -19
- sky/setup_files/MANIFEST.in +6 -1
- sky/setup_files/alembic.ini +8 -0
- sky/setup_files/dependencies.py +64 -19
- sky/setup_files/setup.py +44 -44
- sky/sky_logging.py +13 -5
- sky/skylet/attempt_skylet.py +116 -24
- sky/skylet/configs.py +3 -1
- sky/skylet/constants.py +139 -29
- sky/skylet/events.py +74 -14
- sky/skylet/executor/__init__.py +1 -0
- sky/skylet/executor/slurm.py +189 -0
- sky/skylet/job_lib.py +143 -105
- sky/skylet/log_lib.py +252 -8
- sky/skylet/log_lib.pyi +47 -7
- sky/skylet/providers/ibm/node_provider.py +12 -8
- sky/skylet/providers/ibm/vpc_provider.py +13 -12
- sky/skylet/runtime_utils.py +21 -0
- sky/skylet/services.py +524 -0
- sky/skylet/skylet.py +27 -2
- sky/skylet/subprocess_daemon.py +104 -28
- sky/skypilot_config.py +99 -79
- sky/ssh_node_pools/constants.py +12 -0
- sky/ssh_node_pools/core.py +40 -3
- sky/ssh_node_pools/deploy/__init__.py +4 -0
- sky/ssh_node_pools/deploy/deploy.py +952 -0
- sky/ssh_node_pools/deploy/tunnel_utils.py +199 -0
- sky/ssh_node_pools/deploy/utils.py +173 -0
- sky/ssh_node_pools/server.py +20 -21
- sky/{utils/kubernetes/ssh_utils.py → ssh_node_pools/utils.py} +9 -6
- sky/task.py +221 -104
- sky/templates/aws-ray.yml.j2 +1 -0
- sky/templates/azure-ray.yml.j2 +1 -0
- sky/templates/cudo-ray.yml.j2 +1 -0
- sky/templates/do-ray.yml.j2 +1 -0
- sky/templates/fluidstack-ray.yml.j2 +1 -0
- sky/templates/gcp-ray.yml.j2 +1 -0
- sky/templates/hyperbolic-ray.yml.j2 +1 -0
- sky/templates/ibm-ray.yml.j2 +2 -1
- sky/templates/jobs-controller.yaml.j2 +3 -0
- sky/templates/kubernetes-ray.yml.j2 +204 -55
- sky/templates/lambda-ray.yml.j2 +1 -0
- sky/templates/nebius-ray.yml.j2 +3 -0
- sky/templates/oci-ray.yml.j2 +1 -0
- sky/templates/paperspace-ray.yml.j2 +1 -0
- sky/templates/primeintellect-ray.yml.j2 +72 -0
- sky/templates/runpod-ray.yml.j2 +1 -0
- sky/templates/scp-ray.yml.j2 +1 -0
- sky/templates/seeweb-ray.yml.j2 +171 -0
- sky/templates/shadeform-ray.yml.j2 +73 -0
- sky/templates/slurm-ray.yml.j2 +85 -0
- sky/templates/vast-ray.yml.j2 +2 -0
- sky/templates/vsphere-ray.yml.j2 +1 -0
- sky/templates/websocket_proxy.py +188 -43
- sky/usage/usage_lib.py +16 -4
- sky/users/model.conf +1 -1
- sky/users/permission.py +84 -44
- sky/users/rbac.py +31 -3
- sky/utils/accelerator_registry.py +6 -3
- sky/utils/admin_policy_utils.py +18 -5
- sky/utils/annotations.py +128 -6
- sky/utils/asyncio_utils.py +78 -0
- sky/utils/atomic.py +1 -1
- sky/utils/auth_utils.py +153 -0
- sky/utils/cli_utils/status_utils.py +12 -7
- sky/utils/cluster_utils.py +28 -6
- sky/utils/command_runner.py +283 -30
- sky/utils/command_runner.pyi +63 -7
- sky/utils/common.py +3 -1
- sky/utils/common_utils.py +55 -7
- sky/utils/config_utils.py +1 -14
- sky/utils/context.py +127 -40
- sky/utils/context_utils.py +73 -18
- sky/utils/controller_utils.py +229 -70
- sky/utils/db/db_utils.py +95 -18
- sky/utils/db/kv_cache.py +149 -0
- sky/utils/db/migration_utils.py +24 -7
- sky/utils/env_options.py +4 -0
- sky/utils/git.py +559 -1
- sky/utils/kubernetes/create_cluster.sh +15 -30
- sky/utils/kubernetes/delete_cluster.sh +10 -7
- sky/utils/kubernetes/generate_kind_config.py +6 -66
- sky/utils/kubernetes/gpu_labeler.py +13 -3
- 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 +187 -260
- sky/utils/kubernetes/rsync_helper.sh +11 -3
- sky/utils/kubernetes/ssh-tunnel.sh +7 -376
- sky/utils/kubernetes_enums.py +7 -15
- sky/utils/lock_events.py +4 -4
- sky/utils/locks.py +128 -31
- sky/utils/log_utils.py +0 -319
- sky/utils/resource_checker.py +13 -10
- sky/utils/resources_utils.py +53 -29
- sky/utils/rich_utils.py +8 -4
- sky/utils/schemas.py +138 -52
- sky/utils/subprocess_utils.py +17 -4
- sky/utils/thread_utils.py +91 -0
- sky/utils/timeline.py +2 -1
- sky/utils/ux_utils.py +35 -1
- sky/utils/volume.py +88 -4
- sky/utils/yaml_utils.py +9 -0
- sky/volumes/client/sdk.py +48 -10
- sky/volumes/server/core.py +59 -22
- sky/volumes/server/server.py +46 -17
- sky/volumes/volume.py +54 -42
- sky/workspaces/core.py +57 -21
- sky/workspaces/server.py +13 -12
- 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.dev20250905.dist-info → skypilot_nightly-1.0.0.dev20251210.dist-info}/METADATA +343 -65
- skypilot_nightly-1.0.0.dev20251210.dist-info/RECORD +629 -0
- skypilot_nightly-1.0.0.dev20251210.dist-info/top_level.txt +2 -0
- sky/client/cli/git.py +0 -549
- sky/dashboard/out/_next/static/chunks/1121-408ed10b2f9fce17.js +0 -1
- sky/dashboard/out/_next/static/chunks/1141-943efc7aff0f0c06.js +0 -1
- sky/dashboard/out/_next/static/chunks/1836-37fede578e2da5f8.js +0 -40
- sky/dashboard/out/_next/static/chunks/3015-86cabed5d4669ad0.js +0 -1
- sky/dashboard/out/_next/static/chunks/3294.c80326aec9bfed40.js +0 -6
- sky/dashboard/out/_next/static/chunks/3785.4872a2f3aa489880.js +0 -1
- sky/dashboard/out/_next/static/chunks/3850-ff4a9a69d978632b.js +0 -1
- sky/dashboard/out/_next/static/chunks/4045.b30465273dc5e468.js +0 -21
- sky/dashboard/out/_next/static/chunks/4676-9da7fdbde90b5549.js +0 -10
- sky/dashboard/out/_next/static/chunks/4725.10f7a9a5d3ea8208.js +0 -1
- sky/dashboard/out/_next/static/chunks/5339.3fda4a4010ff4e06.js +0 -51
- sky/dashboard/out/_next/static/chunks/6135-4b4d5e824b7f9d3c.js +0 -1
- sky/dashboard/out/_next/static/chunks/649.b9d7f7d10c1b8c53.js +0 -45
- sky/dashboard/out/_next/static/chunks/6856-dca7962af4814e1b.js +0 -1
- sky/dashboard/out/_next/static/chunks/6990-08b2a1cae076a943.js +0 -1
- sky/dashboard/out/_next/static/chunks/7325.b4bc99ce0892dcd5.js +0 -6
- sky/dashboard/out/_next/static/chunks/754-d0da8ab45f9509e9.js +0 -18
- sky/dashboard/out/_next/static/chunks/7669.1f5d9a402bf5cc42.js +0 -36
- sky/dashboard/out/_next/static/chunks/8969-0be3036bf86f8256.js +0 -1
- sky/dashboard/out/_next/static/chunks/9025.c12318fb6a1a9093.js +0 -6
- sky/dashboard/out/_next/static/chunks/9037-fa1737818d0a0969.js +0 -6
- sky/dashboard/out/_next/static/chunks/pages/_app-ce361c6959bc2001.js +0 -34
- sky/dashboard/out/_next/static/chunks/pages/clusters/[cluster]/[job]-1cbba24bd1bd35f8.js +0 -16
- sky/dashboard/out/_next/static/chunks/pages/clusters/[cluster]-0b4b35dc1dfe046c.js +0 -16
- sky/dashboard/out/_next/static/chunks/pages/clusters-469814d711d63b1b.js +0 -1
- sky/dashboard/out/_next/static/chunks/pages/jobs/[job]-dd64309c3fe67ed2.js +0 -11
- sky/dashboard/out/_next/static/chunks/pages/jobs/pools/[pool]-07349868f7905d37.js +0 -16
- sky/dashboard/out/_next/static/chunks/pages/jobs-1f70d9faa564804f.js +0 -1
- sky/dashboard/out/_next/static/chunks/pages/users-018bf31cda52e11b.js +0 -1
- sky/dashboard/out/_next/static/chunks/pages/volumes-739726d6b823f532.js +0 -1
- sky/dashboard/out/_next/static/chunks/webpack-4fe903277b57b523.js +0 -1
- sky/dashboard/out/_next/static/css/4614e06482d7309e.css +0 -3
- sky/dashboard/out/_next/static/mS-4qZPSkRuA1u-g2wQhg/_buildManifest.js +0 -1
- sky/templates/kubernetes-ssh-jump.yml.j2 +0 -94
- sky/utils/kubernetes/cleanup-tunnel.sh +0 -62
- sky/utils/kubernetes/deploy_remote_cluster.py +0 -1299
- sky/utils/kubernetes/ssh_jump_lifecycle_manager.py +0 -191
- skypilot_nightly-1.0.0.dev20250905.dist-info/RECORD +0 -547
- skypilot_nightly-1.0.0.dev20250905.dist-info/top_level.txt +0 -1
- /sky/dashboard/out/_next/static/{mS-4qZPSkRuA1u-g2wQhg → KYAhEFa3FTfq4JyKVgo-s}/_ssgManifest.js +0 -0
- {skypilot_nightly-1.0.0.dev20250905.dist-info → skypilot_nightly-1.0.0.dev20251210.dist-info}/WHEEL +0 -0
- {skypilot_nightly-1.0.0.dev20250905.dist-info → skypilot_nightly-1.0.0.dev20251210.dist-info}/entry_points.txt +0 -0
- {skypilot_nightly-1.0.0.dev20250905.dist-info → skypilot_nightly-1.0.0.dev20251210.dist-info}/licenses/LICENSE +0 -0
sky/clouds/utils/scp_utils.py
CHANGED
|
@@ -3,7 +3,6 @@
|
|
|
3
3
|
This module contains a set of rest api functions accessing SCP Open-API.
|
|
4
4
|
"""
|
|
5
5
|
import base64
|
|
6
|
-
import datetime
|
|
7
6
|
from functools import wraps
|
|
8
7
|
import hashlib
|
|
9
8
|
import hmac
|
|
@@ -171,15 +170,18 @@ class SCPClient:
|
|
|
171
170
|
self.secret_key = self._credentials['secret_key']
|
|
172
171
|
self.project_id = self._credentials['project_id']
|
|
173
172
|
self.client_type = 'OpenApi'
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
self.
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
'X-Cmp-
|
|
182
|
-
'X-Cmp-
|
|
173
|
+
|
|
174
|
+
def _signed_headers(self, method: str, url: str) -> dict:
|
|
175
|
+
timestamp = str(int(time.time() * 1000))
|
|
176
|
+
signature = self.get_signature(method=method,
|
|
177
|
+
url=url,
|
|
178
|
+
timestamp=timestamp)
|
|
179
|
+
return {
|
|
180
|
+
'X-Cmp-AccessKey': self.access_key,
|
|
181
|
+
'X-Cmp-ClientType': self.client_type,
|
|
182
|
+
'X-Cmp-ProjectId': self.project_id,
|
|
183
|
+
'X-Cmp-Timestamp': timestamp,
|
|
184
|
+
'X-Cmp-Signature': signature,
|
|
183
185
|
}
|
|
184
186
|
|
|
185
187
|
def create_instance(self, instance_config):
|
|
@@ -190,10 +192,8 @@ class SCPClient:
|
|
|
190
192
|
@_retry
|
|
191
193
|
def _get(self, url, contents_key='contents'):
|
|
192
194
|
method = 'GET'
|
|
193
|
-
self.
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
response = requests.get(url, headers=self.headers)
|
|
195
|
+
headers = self._signed_headers(method, url)
|
|
196
|
+
response = requests.get(url, headers=headers)
|
|
197
197
|
raise_scp_error(response)
|
|
198
198
|
if contents_key is not None:
|
|
199
199
|
return response.json().get(contents_key, [])
|
|
@@ -203,26 +203,19 @@ class SCPClient:
|
|
|
203
203
|
@_retry
|
|
204
204
|
def _post(self, url, request_body):
|
|
205
205
|
method = 'POST'
|
|
206
|
-
self.
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
response = requests.post(url, json=request_body, headers=self.headers)
|
|
210
|
-
|
|
206
|
+
headers = self._signed_headers(method, url)
|
|
207
|
+
response = requests.post(url, json=request_body, headers=headers)
|
|
211
208
|
raise_scp_error(response)
|
|
212
209
|
return response.json()
|
|
213
210
|
|
|
214
211
|
@_retry
|
|
215
212
|
def _delete(self, url, request_body=None):
|
|
216
213
|
method = 'DELETE'
|
|
217
|
-
self.
|
|
218
|
-
self.set_signature(url=url, method=method)
|
|
214
|
+
headers = self._signed_headers(method, url)
|
|
219
215
|
if request_body:
|
|
220
|
-
response = requests.delete(url,
|
|
221
|
-
json=request_body,
|
|
222
|
-
headers=self.headers)
|
|
223
|
-
|
|
216
|
+
response = requests.delete(url, json=request_body, headers=headers)
|
|
224
217
|
else:
|
|
225
|
-
response = requests.delete(url, headers=
|
|
218
|
+
response = requests.delete(url, headers=headers)
|
|
226
219
|
raise_scp_error(response)
|
|
227
220
|
return response.json()
|
|
228
221
|
|
|
@@ -252,12 +245,22 @@ class SCPClient:
|
|
|
252
245
|
return True
|
|
253
246
|
|
|
254
247
|
def add_security_group_rule(self, sg_id, direction,
|
|
255
|
-
ports: Optional[List[str]]
|
|
248
|
+
ports: Optional[List[str]],
|
|
249
|
+
cnt: Optional[int]) -> None:
|
|
256
250
|
if ports is None:
|
|
257
251
|
if direction == 'IN':
|
|
258
|
-
|
|
252
|
+
if cnt == 1:
|
|
253
|
+
ports = ['22']
|
|
254
|
+
else:
|
|
255
|
+
ports = ['22', '6380', '8076', '10001', '11001-11200']
|
|
259
256
|
else:
|
|
260
|
-
|
|
257
|
+
if cnt == 1:
|
|
258
|
+
ports = ['21', '22', '80', '443']
|
|
259
|
+
else:
|
|
260
|
+
ports = [
|
|
261
|
+
'21', '22', '80', '443', '6380', '8076', '10001',
|
|
262
|
+
'11001-11200'
|
|
263
|
+
]
|
|
261
264
|
services = []
|
|
262
265
|
for port in ports:
|
|
263
266
|
services.append({'serviceType': 'TCP', 'serviceValue': port})
|
|
@@ -273,7 +276,9 @@ class SCPClient:
|
|
|
273
276
|
target_address: ['0.0.0.0/0'],
|
|
274
277
|
'ruleDescription': 'sky security group rule'
|
|
275
278
|
}
|
|
276
|
-
|
|
279
|
+
self._post(url, request_body)
|
|
280
|
+
else:
|
|
281
|
+
return None
|
|
277
282
|
|
|
278
283
|
def _firewall_rule_not_exist(self, firewall_id, internal_ip, direction,
|
|
279
284
|
ports):
|
|
@@ -293,12 +298,22 @@ class SCPClient:
|
|
|
293
298
|
return False
|
|
294
299
|
return True
|
|
295
300
|
|
|
296
|
-
def add_firewall_rule(self, firewall_id, internal_ip, direction,
|
|
301
|
+
def add_firewall_rule(self, firewall_id, internal_ip, direction,
|
|
302
|
+
ports: Optional[List[str]], cnt: Optional[int]):
|
|
297
303
|
if ports is None:
|
|
298
304
|
if direction == 'IN':
|
|
299
|
-
|
|
305
|
+
if cnt == 1:
|
|
306
|
+
ports = ['22']
|
|
307
|
+
else:
|
|
308
|
+
ports = ['22', '6380', '8076', '10001', '11001-11200']
|
|
300
309
|
else:
|
|
301
|
-
|
|
310
|
+
if cnt == 1:
|
|
311
|
+
ports = ['21', '22', '80', '443']
|
|
312
|
+
else:
|
|
313
|
+
ports = [
|
|
314
|
+
'21', '22', '80', '443', '6380', '8076', '10001',
|
|
315
|
+
'11001-11200'
|
|
316
|
+
]
|
|
302
317
|
services = []
|
|
303
318
|
for port in ports:
|
|
304
319
|
services.append({'serviceType': 'TCP', 'serviceValue': port})
|
|
@@ -322,6 +337,8 @@ class SCPClient:
|
|
|
322
337
|
'ruleDescription': 'sky firewall rule'
|
|
323
338
|
}
|
|
324
339
|
return self._post(url, request_body)
|
|
340
|
+
else:
|
|
341
|
+
return None
|
|
325
342
|
|
|
326
343
|
def terminate_instance(self, instance_id):
|
|
327
344
|
url = f'{API_ENDPOINT}/virtual-server/v2/virtual-servers/{instance_id}'
|
|
@@ -334,12 +351,19 @@ class SCPClient:
|
|
|
334
351
|
|
|
335
352
|
def get_catalog(self) -> Dict[str, Any]:
|
|
336
353
|
"""List offered instances and their availability."""
|
|
337
|
-
|
|
338
|
-
|
|
354
|
+
url = f'{API_ENDPOINT}/instance-types'
|
|
355
|
+
headers = self._signed_headers('GET', url)
|
|
356
|
+
response = requests.get(url, headers=headers)
|
|
339
357
|
raise_scp_error(response)
|
|
340
358
|
return response.json().get('data', [])
|
|
341
359
|
|
|
342
|
-
def get_signature(self,
|
|
360
|
+
def get_signature(self,
|
|
361
|
+
method: str,
|
|
362
|
+
url: str,
|
|
363
|
+
timestamp: Optional[str] = None) -> str:
|
|
364
|
+
if timestamp is None:
|
|
365
|
+
timestamp = str(int(time.time() * 1000))
|
|
366
|
+
|
|
343
367
|
url_info = parse.urlsplit(url)
|
|
344
368
|
url = (f'{url_info.scheme}://{url_info.netloc}'
|
|
345
369
|
f'{parse.quote(url_info.path)}')
|
|
@@ -349,7 +373,7 @@ class SCPClient:
|
|
|
349
373
|
parse.parse_qs(url_info.query).items()))
|
|
350
374
|
url = f'{url}?{parse.urlencode(enc_params)}'
|
|
351
375
|
|
|
352
|
-
message = method + url +
|
|
376
|
+
message = method + url + timestamp \
|
|
353
377
|
+ self.access_key + self.project_id + self.client_type
|
|
354
378
|
message = bytes(message, 'utf-8')
|
|
355
379
|
secret = bytes(self.secret_key, 'utf-8')
|
|
@@ -360,19 +384,6 @@ class SCPClient:
|
|
|
360
384
|
|
|
361
385
|
return str(signature)
|
|
362
386
|
|
|
363
|
-
def set_timestamp(self) -> None:
|
|
364
|
-
self.timestamp = str(
|
|
365
|
-
int(
|
|
366
|
-
round(
|
|
367
|
-
datetime.datetime.timestamp(datetime.datetime.now() -
|
|
368
|
-
datetime.timedelta(minutes=1)) *
|
|
369
|
-
1000)))
|
|
370
|
-
self.headers['X-Cmp-Timestamp'] = self.timestamp
|
|
371
|
-
|
|
372
|
-
def set_signature(self, method: str, url: str) -> None:
|
|
373
|
-
self.signature = self.get_signature(url=url, method=method)
|
|
374
|
-
self.headers['X-Cmp-Signature'] = self.signature
|
|
375
|
-
|
|
376
387
|
def get_nic(self, instance_id) -> List[dict]:
|
|
377
388
|
url = f'{API_ENDPOINT}/virtual-server/v2/virtual-servers/{instance_id}/nics' # pylint: disable=line-too-long
|
|
378
389
|
return self._get(url)
|
sky/clouds/vast.py
CHANGED
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
""" Vast Cloud. """
|
|
2
2
|
|
|
3
|
+
import os
|
|
3
4
|
import typing
|
|
4
5
|
from typing import Dict, Iterator, List, Optional, Tuple, Union
|
|
5
6
|
|
|
6
7
|
from sky import catalog
|
|
7
8
|
from sky import clouds
|
|
9
|
+
from sky import skypilot_config
|
|
10
|
+
from sky.adaptors import common
|
|
8
11
|
from sky.utils import registry
|
|
9
12
|
from sky.utils import resources_utils
|
|
10
13
|
|
|
@@ -12,6 +15,8 @@ if typing.TYPE_CHECKING:
|
|
|
12
15
|
from sky import resources as resources_lib
|
|
13
16
|
from sky.utils import volume as volume_lib
|
|
14
17
|
|
|
18
|
+
_CREDENTIAL_PATH = '~/.config/vastai/vast_api_key'
|
|
19
|
+
|
|
15
20
|
|
|
16
21
|
@registry.CLOUD_REGISTRY.register
|
|
17
22
|
class Vast(clouds.Cloud):
|
|
@@ -51,7 +56,9 @@ class Vast(clouds.Cloud):
|
|
|
51
56
|
|
|
52
57
|
@classmethod
|
|
53
58
|
def _unsupported_features_for_resources(
|
|
54
|
-
cls,
|
|
59
|
+
cls,
|
|
60
|
+
resources: 'resources_lib.Resources',
|
|
61
|
+
region: Optional[str] = None,
|
|
55
62
|
) -> Dict[clouds.CloudImplementationFeatures, str]:
|
|
56
63
|
"""The features not supported based on the resources provided.
|
|
57
64
|
|
|
@@ -70,10 +77,15 @@ class Vast(clouds.Cloud):
|
|
|
70
77
|
return cls._MAX_CLUSTER_NAME_LEN_LIMIT
|
|
71
78
|
|
|
72
79
|
@classmethod
|
|
73
|
-
def regions_with_offering(
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
80
|
+
def regions_with_offering(
|
|
81
|
+
cls,
|
|
82
|
+
instance_type: str,
|
|
83
|
+
accelerators: Optional[Dict[str, int]],
|
|
84
|
+
use_spot: bool,
|
|
85
|
+
region: Optional[str],
|
|
86
|
+
zone: Optional[str],
|
|
87
|
+
resources: Optional['resources_lib.Resources'] = None,
|
|
88
|
+
) -> List[clouds.Region]:
|
|
77
89
|
assert zone is None, 'Vast does not support zones.'
|
|
78
90
|
del accelerators, zone # unused
|
|
79
91
|
regions = catalog.get_region_zones_for_instance_type(
|
|
@@ -185,11 +197,20 @@ class Vast(clouds.Cloud):
|
|
|
185
197
|
else:
|
|
186
198
|
image_id = resources.image_id[resources.region]
|
|
187
199
|
|
|
200
|
+
secure_only = skypilot_config.get_effective_region_config(
|
|
201
|
+
cloud='vast',
|
|
202
|
+
region=region.name,
|
|
203
|
+
keys=('secure_only',),
|
|
204
|
+
default_value=False,
|
|
205
|
+
override_configs=resources.cluster_config_overrides,
|
|
206
|
+
)
|
|
207
|
+
|
|
188
208
|
return {
|
|
189
209
|
'instance_type': resources.instance_type,
|
|
190
210
|
'custom_resources': custom_resources,
|
|
191
211
|
'region': region.name,
|
|
192
212
|
'image_id': image_id,
|
|
213
|
+
'secure_only': secure_only,
|
|
193
214
|
}
|
|
194
215
|
|
|
195
216
|
def _get_feasible_launchable_resources(
|
|
@@ -253,32 +274,27 @@ class Vast(clouds.Cloud):
|
|
|
253
274
|
def _check_compute_credentials(
|
|
254
275
|
cls) -> Tuple[bool, Optional[Union[str, Dict[str, str]]]]:
|
|
255
276
|
"""Checks if the user has valid credentials for
|
|
256
|
-
Vast's compute service.
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
if vast.creds_source != 'FILE':
|
|
263
|
-
return False, (
|
|
264
|
-
'error \n' # First line is indented by 4 spaces
|
|
265
|
-
' Credentials can be set up by running: \n'
|
|
266
|
-
' $ pip install vastai\n'
|
|
267
|
-
' $ mkdir -p ~/.config/vastai\n'
|
|
268
|
-
' $ echo [key] > ~/.config/vastai/vast_api_key\n'
|
|
269
|
-
' For more information, see https://skypilot.readthedocs.io/en/latest/getting-started/installation.html#vast' # pylint: disable=line-too-long
|
|
270
|
-
)
|
|
277
|
+
Vast's compute service."""
|
|
278
|
+
|
|
279
|
+
dependency_error_msg = ('Failed to import vast. '
|
|
280
|
+
'To install, run: pip install skypilot[vast]')
|
|
281
|
+
if not common.can_import_modules(['vastai_sdk']):
|
|
282
|
+
return False, dependency_error_msg
|
|
271
283
|
|
|
272
|
-
|
|
284
|
+
if not os.path.exists(os.path.expanduser(_CREDENTIAL_PATH)):
|
|
285
|
+
return False, (
|
|
286
|
+
'error \n' # First line is indented by 4 spaces
|
|
287
|
+
' Credentials can be set up by running: \n'
|
|
288
|
+
' $ pip install vastai\n'
|
|
289
|
+
' $ mkdir -p ~/.config/vastai\n'
|
|
290
|
+
f' $ echo [key] > {_CREDENTIAL_PATH}\n'
|
|
291
|
+
' For more information, see https://skypilot.readthedocs.io/en/latest/getting-started/installation.html#vast' # pylint: disable=line-too-long
|
|
292
|
+
)
|
|
273
293
|
|
|
274
|
-
|
|
275
|
-
return False, ('Failed to import vast. '
|
|
276
|
-
'To install, run: pip install skypilot[vast]')
|
|
294
|
+
return True, None
|
|
277
295
|
|
|
278
296
|
def get_credential_file_mounts(self) -> Dict[str, str]:
|
|
279
|
-
return {
|
|
280
|
-
'~/.config/vastai/vast_api_key': '~/.config/vastai/vast_api_key'
|
|
281
|
-
}
|
|
297
|
+
return {f'{_CREDENTIAL_PATH}': f'{_CREDENTIAL_PATH}'}
|
|
282
298
|
|
|
283
299
|
@classmethod
|
|
284
300
|
def get_user_identities(cls) -> Optional[List[List[str]]]:
|
sky/clouds/vsphere.py
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
"""Vsphere cloud implementation."""
|
|
2
|
-
import subprocess
|
|
3
2
|
import typing
|
|
4
3
|
from typing import Dict, Iterator, List, Optional, Tuple, Union
|
|
5
4
|
|
|
@@ -9,7 +8,6 @@ from sky.adaptors import common as adaptors_common
|
|
|
9
8
|
from sky.provision.vsphere import vsphere_utils
|
|
10
9
|
from sky.provision.vsphere.vsphere_utils import get_vsphere_credentials
|
|
11
10
|
from sky.provision.vsphere.vsphere_utils import initialize_vsphere_data
|
|
12
|
-
from sky.utils import common_utils
|
|
13
11
|
from sky.utils import registry
|
|
14
12
|
from sky.utils import resources_utils
|
|
15
13
|
|
|
@@ -75,7 +73,9 @@ class Vsphere(clouds.Cloud):
|
|
|
75
73
|
|
|
76
74
|
@classmethod
|
|
77
75
|
def _unsupported_features_for_resources(
|
|
78
|
-
cls,
|
|
76
|
+
cls,
|
|
77
|
+
resources: 'resources_lib.Resources',
|
|
78
|
+
region: Optional[str] = None,
|
|
79
79
|
) -> Dict[clouds.CloudImplementationFeatures, str]:
|
|
80
80
|
features = cls._CLOUD_UNSUPPORTED_FEATURES
|
|
81
81
|
return features
|
|
@@ -92,6 +92,7 @@ class Vsphere(clouds.Cloud):
|
|
|
92
92
|
use_spot: bool,
|
|
93
93
|
region: Optional[str],
|
|
94
94
|
zone: Optional[str],
|
|
95
|
+
resources: Optional['resources_lib.Resources'] = None,
|
|
95
96
|
) -> List[clouds.Region]:
|
|
96
97
|
del accelerators, zone # unused
|
|
97
98
|
regions = catalog.get_region_zones_for_instance_type(
|
|
@@ -278,19 +279,16 @@ class Vsphere(clouds.Cloud):
|
|
|
278
279
|
cls) -> Tuple[bool, Optional[Union[str, Dict[str, str]]]]:
|
|
279
280
|
"""Checks if the user has access credentials to
|
|
280
281
|
vSphere's compute service."""
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
f'\n{cls._INDENT_PREFIX}Credentials may also need to be set. '
|
|
292
|
-
'For more details. See https://docs.skypilot.co/en/latest/getting-started/installation.html#vmware-vsphere' # pylint: disable=line-too-long
|
|
293
|
-
f'{common_utils.format_exception(e, use_bracket=True)}')
|
|
282
|
+
dependency_error_msg = (
|
|
283
|
+
'vSphere dependencies are not installed. '
|
|
284
|
+
'Run the following commands:'
|
|
285
|
+
f'\n{cls._INDENT_PREFIX} $ pip install skypilot[vSphere]'
|
|
286
|
+
f'\n{cls._INDENT_PREFIX}Credentials may also need to be set. '
|
|
287
|
+
'For more details. See https://docs.skypilot.co/en/latest/getting-started/installation.html#vmware-vsphere' # pylint: disable=line-too-long
|
|
288
|
+
)
|
|
289
|
+
# Check pyVmomi installation.
|
|
290
|
+
if not adaptors_common.can_import_modules(['pyVmomi']):
|
|
291
|
+
return False, dependency_error_msg
|
|
294
292
|
|
|
295
293
|
required_keys = ['name', 'username', 'password', 'clusters']
|
|
296
294
|
skip_key = 'skip_verification'
|