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/client/cli/flags.py
CHANGED
|
@@ -284,8 +284,10 @@ def config_option(expose_value: bool):
|
|
|
284
284
|
return return_option_decorator
|
|
285
285
|
|
|
286
286
|
|
|
287
|
-
def yes_option():
|
|
287
|
+
def yes_option(helptext: Optional[str] = None):
|
|
288
288
|
"""A decorator for the --yes/-y option."""
|
|
289
|
+
if helptext is None:
|
|
290
|
+
helptext = 'Skip confirmation prompt.'
|
|
289
291
|
|
|
290
292
|
def return_option_decorator(func):
|
|
291
293
|
return click.option('--yes',
|
|
@@ -293,7 +295,7 @@ def yes_option():
|
|
|
293
295
|
is_flag=True,
|
|
294
296
|
default=False,
|
|
295
297
|
required=False,
|
|
296
|
-
help=
|
|
298
|
+
help=helptext)(func)
|
|
297
299
|
|
|
298
300
|
return return_option_decorator
|
|
299
301
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"""
|
|
1
|
+
"""Utilities for formatting tables for CLI output."""
|
|
2
2
|
import abc
|
|
3
3
|
from datetime import datetime
|
|
4
4
|
from typing import Any, Dict, List, Optional
|
|
@@ -6,6 +6,8 @@ from typing import Any, Dict, List, Optional
|
|
|
6
6
|
import prettytable
|
|
7
7
|
|
|
8
8
|
from sky import sky_logging
|
|
9
|
+
from sky.jobs import utils as managed_jobs
|
|
10
|
+
from sky.schemas.api import responses
|
|
9
11
|
from sky.skylet import constants
|
|
10
12
|
from sky.utils import common_utils
|
|
11
13
|
from sky.utils import log_utils
|
|
@@ -13,6 +15,98 @@ from sky.utils import volume
|
|
|
13
15
|
|
|
14
16
|
logger = sky_logging.init_logger(__name__)
|
|
15
17
|
|
|
18
|
+
|
|
19
|
+
def format_job_queue(jobs: List[responses.ClusterJobRecord]):
|
|
20
|
+
"""Format the job queue for display.
|
|
21
|
+
|
|
22
|
+
Usage:
|
|
23
|
+
jobs = get_job_queue()
|
|
24
|
+
print(format_job_queue(jobs))
|
|
25
|
+
"""
|
|
26
|
+
job_table = log_utils.create_table([
|
|
27
|
+
'ID', 'NAME', 'USER', 'SUBMITTED', 'STARTED', 'DURATION', 'RESOURCES',
|
|
28
|
+
'STATUS', 'LOG', 'GIT COMMIT'
|
|
29
|
+
])
|
|
30
|
+
for job in jobs:
|
|
31
|
+
job_table.add_row([
|
|
32
|
+
job.job_id,
|
|
33
|
+
job.job_name,
|
|
34
|
+
job.username,
|
|
35
|
+
log_utils.readable_time_duration(job.submitted_at),
|
|
36
|
+
log_utils.readable_time_duration(job.start_at),
|
|
37
|
+
log_utils.readable_time_duration(job.start_at,
|
|
38
|
+
job.end_at,
|
|
39
|
+
absolute=True),
|
|
40
|
+
job.resources,
|
|
41
|
+
job.status.colored_str(),
|
|
42
|
+
job.log_path,
|
|
43
|
+
job.metadata.get('git_commit', '-'),
|
|
44
|
+
])
|
|
45
|
+
return job_table
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def format_storage_table(storages: List[responses.StorageRecord],
|
|
49
|
+
show_all: bool = False) -> str:
|
|
50
|
+
"""Format the storage table for display.
|
|
51
|
+
|
|
52
|
+
Args:
|
|
53
|
+
storage_table (dict): The storage table.
|
|
54
|
+
|
|
55
|
+
Returns:
|
|
56
|
+
str: The formatted storage table.
|
|
57
|
+
"""
|
|
58
|
+
storage_table = log_utils.create_table([
|
|
59
|
+
'NAME',
|
|
60
|
+
'UPDATED',
|
|
61
|
+
'STORE',
|
|
62
|
+
'COMMAND',
|
|
63
|
+
'STATUS',
|
|
64
|
+
])
|
|
65
|
+
|
|
66
|
+
for row in storages:
|
|
67
|
+
launched_at = row.launched_at
|
|
68
|
+
if show_all:
|
|
69
|
+
command = row.last_use
|
|
70
|
+
else:
|
|
71
|
+
command = common_utils.truncate_long_string(
|
|
72
|
+
row.last_use, constants.LAST_USE_TRUNC_LENGTH)
|
|
73
|
+
storage_table.add_row([
|
|
74
|
+
# NAME
|
|
75
|
+
row.name,
|
|
76
|
+
# LAUNCHED
|
|
77
|
+
log_utils.readable_time_duration(launched_at),
|
|
78
|
+
# CLOUDS
|
|
79
|
+
', '.join([s.value for s in row.store]),
|
|
80
|
+
# COMMAND,
|
|
81
|
+
command,
|
|
82
|
+
# STATUS
|
|
83
|
+
row.status.value,
|
|
84
|
+
])
|
|
85
|
+
if storages:
|
|
86
|
+
return str(storage_table)
|
|
87
|
+
else:
|
|
88
|
+
return 'No existing storage.'
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
def format_job_table(
|
|
92
|
+
jobs: List[responses.ManagedJobRecord],
|
|
93
|
+
show_all: bool,
|
|
94
|
+
show_user: bool,
|
|
95
|
+
pool_status: Optional[List[Dict[str, Any]]] = None,
|
|
96
|
+
max_jobs: Optional[int] = None,
|
|
97
|
+
status_counts: Optional[Dict[str, int]] = None,
|
|
98
|
+
):
|
|
99
|
+
jobs = [job.model_dump() for job in jobs]
|
|
100
|
+
return managed_jobs.format_job_table(
|
|
101
|
+
jobs,
|
|
102
|
+
pool_status=pool_status,
|
|
103
|
+
show_all=show_all,
|
|
104
|
+
show_user=show_user,
|
|
105
|
+
max_jobs=max_jobs,
|
|
106
|
+
job_status_counts=status_counts,
|
|
107
|
+
)
|
|
108
|
+
|
|
109
|
+
|
|
16
110
|
_BASIC_COLUMNS = [
|
|
17
111
|
'NAME',
|
|
18
112
|
'TYPE',
|
|
@@ -43,13 +137,15 @@ def _get_infra_str(cloud: Optional[str], region: Optional[str],
|
|
|
43
137
|
class VolumeTable(abc.ABC):
|
|
44
138
|
"""The volume table."""
|
|
45
139
|
|
|
46
|
-
def __init__(self,
|
|
140
|
+
def __init__(self,
|
|
141
|
+
volumes: List[responses.VolumeRecord],
|
|
142
|
+
show_all: bool = False):
|
|
47
143
|
super().__init__()
|
|
48
144
|
self.table = self._create_table(show_all)
|
|
49
145
|
self._add_rows(volumes, show_all)
|
|
50
146
|
|
|
51
147
|
def _get_row_base_columns(self,
|
|
52
|
-
row:
|
|
148
|
+
row: responses.VolumeRecord,
|
|
53
149
|
show_all: bool = False) -> List[str]:
|
|
54
150
|
"""Get the base columns for a row."""
|
|
55
151
|
# Convert last_attached_at timestamp to human readable string
|
|
@@ -94,7 +190,7 @@ class VolumeTable(abc.ABC):
|
|
|
94
190
|
raise NotImplementedError
|
|
95
191
|
|
|
96
192
|
def _add_rows(self,
|
|
97
|
-
volumes: List[
|
|
193
|
+
volumes: List[responses.VolumeRecord],
|
|
98
194
|
show_all: bool = False) -> None:
|
|
99
195
|
"""Add rows to the volume table."""
|
|
100
196
|
raise NotImplementedError
|
|
@@ -112,30 +208,32 @@ class PVCVolumeTable(VolumeTable):
|
|
|
112
208
|
"""Create the PVC volume table."""
|
|
113
209
|
# If show_all is False, show the table with the columns:
|
|
114
210
|
# NAME, TYPE, INFRA, SIZE, USER, WORKSPACE,
|
|
115
|
-
# AGE, STATUS, LAST_USE, USED_BY
|
|
211
|
+
# AGE, STATUS, LAST_USE, USED_BY, IS_EPHEMERAL
|
|
116
212
|
# If show_all is True, show the table with the columns:
|
|
117
213
|
# NAME, TYPE, INFRA, SIZE, USER, WORKSPACE,
|
|
118
|
-
# AGE, STATUS, LAST_USE, USED_BY, NAME_ON_CLOUD
|
|
214
|
+
# AGE, STATUS, LAST_USE, USED_BY, IS_EPHEMERAL, NAME_ON_CLOUD
|
|
119
215
|
# STORAGE_CLASS, ACCESS_MODE
|
|
120
216
|
|
|
217
|
+
columns = _BASIC_COLUMNS + [
|
|
218
|
+
'IS_EPHEMERAL',
|
|
219
|
+
]
|
|
121
220
|
if show_all:
|
|
122
|
-
columns =
|
|
221
|
+
columns = columns + [
|
|
123
222
|
'NAME_ON_CLOUD',
|
|
124
223
|
'STORAGE_CLASS',
|
|
125
224
|
'ACCESS_MODE',
|
|
126
225
|
]
|
|
127
|
-
else:
|
|
128
|
-
columns = _BASIC_COLUMNS
|
|
129
226
|
|
|
130
227
|
table = log_utils.create_table(columns)
|
|
131
228
|
return table
|
|
132
229
|
|
|
133
230
|
def _add_rows(self,
|
|
134
|
-
volumes: List[
|
|
231
|
+
volumes: List[responses.VolumeRecord],
|
|
135
232
|
show_all: bool = False) -> None:
|
|
136
233
|
"""Add rows to the PVC volume table."""
|
|
137
234
|
for row in volumes:
|
|
138
235
|
table_row = self._get_row_base_columns(row, show_all)
|
|
236
|
+
table_row.append(row.get('is_ephemeral', False))
|
|
139
237
|
if show_all:
|
|
140
238
|
table_row.append(row.get('name_on_cloud', ''))
|
|
141
239
|
table_row.append(
|
|
@@ -170,7 +268,7 @@ class RunPodVolumeTable(VolumeTable):
|
|
|
170
268
|
return table
|
|
171
269
|
|
|
172
270
|
def _add_rows(self,
|
|
173
|
-
volumes: List[
|
|
271
|
+
volumes: List[responses.VolumeRecord],
|
|
174
272
|
show_all: bool = False) -> None:
|
|
175
273
|
"""Add rows to the RunPod volume table."""
|
|
176
274
|
for row in volumes:
|
|
@@ -185,7 +283,7 @@ class RunPodVolumeTable(VolumeTable):
|
|
|
185
283
|
return 'RunPod Network Volumes:\n' + str(self.table)
|
|
186
284
|
|
|
187
285
|
|
|
188
|
-
def format_volume_table(volumes: List[
|
|
286
|
+
def format_volume_table(volumes: List[responses.VolumeRecord],
|
|
189
287
|
show_all: bool = False) -> str:
|
|
190
288
|
"""Format the volume table for display.
|
|
191
289
|
|
|
@@ -195,7 +293,7 @@ def format_volume_table(volumes: List[Dict[str, Any]],
|
|
|
195
293
|
Returns:
|
|
196
294
|
str: The formatted volume table.
|
|
197
295
|
"""
|
|
198
|
-
volumes_per_type: Dict[str, List[
|
|
296
|
+
volumes_per_type: Dict[str, List[responses.VolumeRecord]] = {}
|
|
199
297
|
supported_volume_types = [
|
|
200
298
|
volume_type.value for volume_type in volume.VolumeType
|
|
201
299
|
]
|
sky/client/cli/utils.py
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"""Utility functions for the CLI."""
|
|
2
|
+
import enum
|
|
3
|
+
import typing
|
|
4
|
+
from typing import Dict, List, Optional, Tuple, Union
|
|
5
|
+
|
|
6
|
+
from sky import exceptions
|
|
7
|
+
from sky import jobs as managed_jobs
|
|
8
|
+
from sky.schemas.api import responses
|
|
9
|
+
from sky.server import common as server_common
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class QueueResultVersion(enum.Enum):
|
|
13
|
+
"""The version of the queue result.
|
|
14
|
+
|
|
15
|
+
V1: The old version of the queue result.
|
|
16
|
+
- job_records (List[responses.ManagedJobRecord]): A list of dicts,
|
|
17
|
+
with each dict containing the information of a job.
|
|
18
|
+
V2: The new version of the queue result.
|
|
19
|
+
- job_records (List[responses.ManagedJobRecord]): A list of dicts,
|
|
20
|
+
with each dict containing the information of a job.
|
|
21
|
+
- total (int): Total number of jobs after filter.
|
|
22
|
+
- status_counts (Dict[str, int]): Status counts after filter.
|
|
23
|
+
- total_no_filter (int): Total number of jobs before filter.
|
|
24
|
+
"""
|
|
25
|
+
V1 = 'v1'
|
|
26
|
+
V2 = 'v2'
|
|
27
|
+
|
|
28
|
+
def v2(self) -> bool:
|
|
29
|
+
return self == QueueResultVersion.V2
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def get_managed_job_queue(
|
|
33
|
+
refresh: bool,
|
|
34
|
+
skip_finished: bool = False,
|
|
35
|
+
all_users: bool = False,
|
|
36
|
+
job_ids: Optional[List[int]] = None,
|
|
37
|
+
limit: Optional[int] = None,
|
|
38
|
+
fields: Optional[List[str]] = None,
|
|
39
|
+
) -> Tuple[server_common.RequestId[Union[List[responses.ManagedJobRecord],
|
|
40
|
+
Tuple[List[responses.ManagedJobRecord],
|
|
41
|
+
int, Dict[str, int], int]]],
|
|
42
|
+
QueueResultVersion]:
|
|
43
|
+
"""Gets statuses of managed jobs.
|
|
44
|
+
|
|
45
|
+
Please refer to sky.cli.job_queue for documentation.
|
|
46
|
+
|
|
47
|
+
Args:
|
|
48
|
+
refresh: Whether to restart the jobs controller if it is stopped.
|
|
49
|
+
skip_finished: Whether to skip finished jobs.
|
|
50
|
+
all_users: Whether to show all users' jobs.
|
|
51
|
+
job_ids: IDs of the managed jobs to show.
|
|
52
|
+
limit: Number of jobs to show.
|
|
53
|
+
fields: Fields to get for the managed jobs.
|
|
54
|
+
|
|
55
|
+
Returns:
|
|
56
|
+
- the request ID of the queue request
|
|
57
|
+
- the version of the queue result
|
|
58
|
+
|
|
59
|
+
Request Raises:
|
|
60
|
+
sky.exceptions.ClusterNotUpError: the jobs controller is not up or
|
|
61
|
+
does not exist.
|
|
62
|
+
RuntimeError: if failed to get the managed jobs with ssh.
|
|
63
|
+
"""
|
|
64
|
+
try:
|
|
65
|
+
return typing.cast(
|
|
66
|
+
server_common.RequestId[
|
|
67
|
+
Union[List[responses.ManagedJobRecord],
|
|
68
|
+
Tuple[List[responses.ManagedJobRecord], int,
|
|
69
|
+
Dict[str, int], int]]],
|
|
70
|
+
managed_jobs.queue_v2(refresh, skip_finished, all_users, job_ids,
|
|
71
|
+
limit, fields)), QueueResultVersion.V2
|
|
72
|
+
except exceptions.APINotSupportedError:
|
|
73
|
+
return typing.cast(
|
|
74
|
+
server_common.RequestId[
|
|
75
|
+
Union[List[responses.ManagedJobRecord],
|
|
76
|
+
Tuple[List[responses.ManagedJobRecord], int,
|
|
77
|
+
Dict[str, int], int]]],
|
|
78
|
+
managed_jobs.queue(refresh, skip_finished, all_users,
|
|
79
|
+
job_ids)), QueueResultVersion.V1
|
sky/client/common.py
CHANGED
|
@@ -44,8 +44,10 @@ logger = sky_logging.init_logger(__name__)
|
|
|
44
44
|
_DOWNLOAD_CHUNK_BYTES = 8192
|
|
45
45
|
# The chunk size for the zip file to be uploaded to the API server. We split
|
|
46
46
|
# the zip file into chunks to avoid network issues for large request body that
|
|
47
|
-
# can be caused by NGINX's client_max_body_size.
|
|
48
|
-
|
|
47
|
+
# can be caused by NGINX's client_max_body_size or Cloudflare's upload limit.
|
|
48
|
+
# As of 09/25/2025, the upload limit for Cloudflare's free plan is 100MiB:
|
|
49
|
+
# https://developers.cloudflare.com/support/troubleshooting/http-status-codes/4xx-client-error/error-413/
|
|
50
|
+
_UPLOAD_CHUNK_BYTES = 100 * 1024 * 1024
|
|
49
51
|
|
|
50
52
|
FILE_UPLOAD_LOGS_DIR = os.path.join(constants.SKY_LOGS_DIRECTORY,
|
|
51
53
|
'file_uploads')
|
|
@@ -81,6 +83,14 @@ def download_logs_from_api_server(
|
|
|
81
83
|
remote_machine_prefix,
|
|
82
84
|
local_machine_prefix) for remote_path in paths_on_api_server
|
|
83
85
|
}
|
|
86
|
+
# Check if any local log directories already exist before downloading
|
|
87
|
+
for local_path in remote2local_path_dict.values():
|
|
88
|
+
expanded_path = os.path.expanduser(local_path)
|
|
89
|
+
if os.path.exists(expanded_path):
|
|
90
|
+
logger.warning(
|
|
91
|
+
f'Log directory {local_path} already exists. '
|
|
92
|
+
f'This may overwrite logs from a previous cluster with the '
|
|
93
|
+
f'same name and job ID.')
|
|
84
94
|
body = payloads.DownloadBody(folder_paths=list(paths_on_api_server),)
|
|
85
95
|
response = server_common.make_authenticated_request(
|
|
86
96
|
'POST',
|