skypilot-nightly 1.0.0.dev20250905__py3-none-any.whl → 1.0.0.dev20251203__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- sky/__init__.py +10 -2
- sky/adaptors/aws.py +81 -16
- sky/adaptors/common.py +25 -2
- sky/adaptors/coreweave.py +278 -0
- sky/adaptors/do.py +8 -2
- sky/adaptors/gcp.py +11 -0
- sky/adaptors/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/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 +588 -184
- sky/backends/cloud_vm_ray_backend.py +1088 -904
- sky/backends/local_docker_backend.py +9 -5
- sky/backends/task_codegen.py +633 -0
- sky/backends/wheel_utils.py +18 -0
- sky/catalog/__init__.py +8 -0
- 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 +24 -28
- 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/check.py +73 -43
- sky/client/cli/command.py +675 -412
- 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 +132 -63
- sky/client/sdk_async.py +34 -33
- sky/cloud_stores.py +82 -3
- sky/clouds/__init__.py +6 -0
- sky/clouds/aws.py +337 -129
- sky/clouds/azure.py +24 -18
- sky/clouds/cloud.py +40 -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/ssh.py +4 -2
- sky/clouds/utils/scp_utils.py +61 -50
- sky/clouds/vast.py +33 -27
- sky/clouds/vsphere.py +14 -16
- sky/core.py +174 -165
- sky/dashboard/out/404.html +1 -1
- sky/dashboard/out/_next/static/96_E2yl3QAiIJGOYCkSpB/_buildManifest.js +1 -0
- sky/dashboard/out/_next/static/chunks/1141-e6aa9ab418717c59.js +11 -0
- sky/dashboard/out/_next/static/chunks/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.20a8540fe697d5ee.js +1 -0
- sky/dashboard/out/_next/static/chunks/3785.7e245f318f9d1121.js +1 -0
- sky/dashboard/out/_next/static/chunks/{6601-06114c982db410b6.js → 3800-7b45f9fbb6308557.js} +1 -1
- 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-8f27d1c10c98def8.js +1 -0
- sky/dashboard/out/_next/static/chunks/6990-9146207c4567fdfd.js +1 -0
- sky/dashboard/out/_next/static/chunks/7359-c8d04e06886000b3.js +30 -0
- sky/dashboard/out/_next/static/chunks/7615-019513abc55b3b47.js +1 -0
- sky/dashboard/out/_next/static/chunks/8640.5b9475a2d18c5416.js +16 -0
- sky/dashboard/out/_next/static/chunks/8969-452f9d5cbdd2dc73.js +1 -0
- sky/dashboard/out/_next/static/chunks/9025.fa408f3242e9028d.js +6 -0
- sky/dashboard/out/_next/static/chunks/9353-cff34f7e773b2e2b.js +1 -0
- sky/dashboard/out/_next/static/chunks/9360.a536cf6b1fa42355.js +31 -0
- sky/dashboard/out/_next/static/chunks/9847.3aaca6bb33455140.js +30 -0
- sky/dashboard/out/_next/static/chunks/pages/{_app-ce361c6959bc2001.js → _app-bde01e4a2beec258.js} +1 -1
- sky/dashboard/out/_next/static/chunks/pages/clusters/[cluster]/[job]-792db96d918c98c9.js +16 -0
- sky/dashboard/out/_next/static/chunks/pages/clusters/[cluster]-abfcac9c137aa543.js +1 -0
- sky/dashboard/out/_next/static/chunks/pages/clusters-ee39056f9851a3ff.js +1 -0
- sky/dashboard/out/_next/static/chunks/pages/infra/{[context]-6563820e094f68ca.js → [context]-c0b5935149902e6f.js} +1 -1
- sky/dashboard/out/_next/static/chunks/pages/{infra-aabba60d57826e0f.js → infra-aed0ea19df7cf961.js} +1 -1
- sky/dashboard/out/_next/static/chunks/pages/jobs/[job]-d66997e2bfc837cf.js +16 -0
- sky/dashboard/out/_next/static/chunks/pages/jobs/pools/[pool]-9faf940b253e3e06.js +21 -0
- sky/dashboard/out/_next/static/chunks/pages/jobs-2072b48b617989c9.js +1 -0
- sky/dashboard/out/_next/static/chunks/pages/users-f42674164aa73423.js +1 -0
- sky/dashboard/out/_next/static/chunks/pages/volumes-b84b948ff357c43e.js +1 -0
- sky/dashboard/out/_next/static/chunks/pages/workspaces/{[name]-af76bb06dbb3954f.js → [name]-84a40f8c7c627fe4.js} +1 -1
- sky/dashboard/out/_next/static/chunks/pages/{workspaces-7598c33a746cdc91.js → workspaces-531b2f8c4bf89f82.js} +1 -1
- sky/dashboard/out/_next/static/chunks/webpack-64e05f17bf2cf8ce.js +1 -0
- sky/dashboard/out/_next/static/css/0748ce22df867032.css +3 -0
- sky/dashboard/out/clusters/[cluster]/[job].html +1 -1
- sky/dashboard/out/clusters/[cluster].html +1 -1
- sky/dashboard/out/clusters.html +1 -1
- sky/dashboard/out/config.html +1 -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/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 +162 -29
- 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/optimizer.py +1 -1
- sky/provision/__init__.py +37 -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 +2 -0
- sky/provision/cudo/instance.py +4 -3
- sky/provision/do/instance.py +4 -3
- sky/provision/docker_utils.py +97 -26
- 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 +382 -418
- 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 +30 -9
- 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/vast/instance.py +5 -3
- 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/requests/executor.py +381 -145
- sky/server/requests/payloads.py +71 -18
- sky/server/requests/preconditions.py +15 -13
- sky/server/requests/request_names.py +121 -0
- sky/server/requests/requests.py +507 -157
- sky/server/requests/serializers/decoders.py +48 -17
- sky/server/requests/serializers/encoders.py +85 -20
- sky/server/requests/threads.py +117 -0
- sky/server/rest.py +116 -24
- sky/server/server.py +420 -172
- 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 +62 -19
- sky/setup_files/setup.py +44 -44
- sky/sky_logging.py +13 -5
- sky/skylet/attempt_skylet.py +106 -24
- sky/skylet/configs.py +3 -1
- sky/skylet/constants.py +111 -26
- sky/skylet/events.py +64 -10
- sky/skylet/job_lib.py +141 -104
- sky/skylet/log_lib.py +233 -5
- sky/skylet/log_lib.pyi +40 -2
- 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 +22 -1
- sky/skylet/subprocess_daemon.py +104 -29
- sky/skypilot_config.py +99 -79
- sky/ssh_node_pools/server.py +9 -8
- 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 +196 -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/vast-ray.yml.j2 +1 -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/permission.py +60 -43
- sky/utils/accelerator_registry.py +6 -3
- sky/utils/admin_policy_utils.py +18 -5
- sky/utils/annotations.py +22 -0
- 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 +88 -27
- sky/utils/command_runner.pyi +36 -3
- sky/utils/common.py +3 -1
- sky/utils/common_utils.py +37 -4
- 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/{deploy_remote_cluster.py → deploy_ssh_node_pools.py} +258 -380
- 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 +213 -194
- sky/utils/kubernetes/rsync_helper.sh +11 -3
- 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 +107 -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.dev20251203.dist-info}/METADATA +331 -65
- skypilot_nightly-1.0.0.dev20251203.dist-info/RECORD +611 -0
- skypilot_nightly-1.0.0.dev20251203.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/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/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/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 → 96_E2yl3QAiIJGOYCkSpB}/_ssgManifest.js +0 -0
- {skypilot_nightly-1.0.0.dev20250905.dist-info → skypilot_nightly-1.0.0.dev20251203.dist-info}/WHEEL +0 -0
- {skypilot_nightly-1.0.0.dev20250905.dist-info → skypilot_nightly-1.0.0.dev20251203.dist-info}/entry_points.txt +0 -0
- {skypilot_nightly-1.0.0.dev20250905.dist-info → skypilot_nightly-1.0.0.dev20251203.dist-info}/licenses/LICENSE +0 -0
sky/skylet/subprocess_daemon.py
CHANGED
|
@@ -4,11 +4,16 @@ processes of proc_pid.
|
|
|
4
4
|
"""
|
|
5
5
|
import argparse
|
|
6
6
|
import os
|
|
7
|
+
import signal
|
|
7
8
|
import sys
|
|
8
9
|
import time
|
|
10
|
+
from typing import List, Optional
|
|
9
11
|
|
|
10
12
|
import psutil
|
|
11
13
|
|
|
14
|
+
# Environment variable to enable kill_pg in subprocess daemon.
|
|
15
|
+
USE_KILL_PG_ENV_VAR = 'SKYPILOT_SUBPROCESS_DAEMON_KILL_PG'
|
|
16
|
+
|
|
12
17
|
|
|
13
18
|
def daemonize():
|
|
14
19
|
"""Detaches the process from its parent process with double-forking.
|
|
@@ -38,8 +43,74 @@ def daemonize():
|
|
|
38
43
|
# This process is now fully detached from the original parent and terminal
|
|
39
44
|
|
|
40
45
|
|
|
41
|
-
|
|
42
|
-
|
|
46
|
+
def get_pgid_if_leader(pid) -> Optional[int]:
|
|
47
|
+
"""Get the process group ID of the target process if it is the leader."""
|
|
48
|
+
try:
|
|
49
|
+
pgid = os.getpgid(pid)
|
|
50
|
+
# Only use process group if the target process is the leader. This is
|
|
51
|
+
# to avoid killing the entire process group while the target process is
|
|
52
|
+
# just a subprocess in the group.
|
|
53
|
+
if pgid == pid:
|
|
54
|
+
print(f'Process group {pgid} is the leader.')
|
|
55
|
+
return pgid
|
|
56
|
+
return None
|
|
57
|
+
except Exception: # pylint: disable=broad-except
|
|
58
|
+
# Process group is only available in UNIX.
|
|
59
|
+
return None
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def kill_process_group(pgid: int) -> bool:
|
|
63
|
+
"""Kill the target process group."""
|
|
64
|
+
try:
|
|
65
|
+
print(f'Terminating process group {pgid}...')
|
|
66
|
+
os.killpg(pgid, signal.SIGTERM)
|
|
67
|
+
except Exception: # pylint: disable=broad-except
|
|
68
|
+
return False
|
|
69
|
+
|
|
70
|
+
# Wait 30s for the process group to exit gracefully.
|
|
71
|
+
time.sleep(30)
|
|
72
|
+
|
|
73
|
+
try:
|
|
74
|
+
print(f'Force killing process group {pgid}...')
|
|
75
|
+
os.killpg(pgid, signal.SIGKILL)
|
|
76
|
+
except Exception: # pylint: disable=broad-except
|
|
77
|
+
pass
|
|
78
|
+
|
|
79
|
+
return True
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def kill_process_tree(process: psutil.Process,
|
|
83
|
+
children: List[psutil.Process]) -> bool:
|
|
84
|
+
"""Kill the process tree of the target process."""
|
|
85
|
+
if process is not None:
|
|
86
|
+
# Kill the target process first to avoid having more children, or fail
|
|
87
|
+
# the process due to the children being defunct.
|
|
88
|
+
children = [process] + children
|
|
89
|
+
|
|
90
|
+
if not children:
|
|
91
|
+
sys.exit()
|
|
92
|
+
|
|
93
|
+
for child in children:
|
|
94
|
+
try:
|
|
95
|
+
child.terminate()
|
|
96
|
+
except psutil.NoSuchProcess:
|
|
97
|
+
continue
|
|
98
|
+
|
|
99
|
+
# Wait 30s for the processes to exit gracefully.
|
|
100
|
+
time.sleep(30)
|
|
101
|
+
|
|
102
|
+
# SIGKILL if they're still running.
|
|
103
|
+
for child in children:
|
|
104
|
+
try:
|
|
105
|
+
child.kill()
|
|
106
|
+
except psutil.NoSuchProcess:
|
|
107
|
+
continue
|
|
108
|
+
|
|
109
|
+
return True
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
def main():
|
|
113
|
+
# daemonize()
|
|
43
114
|
parser = argparse.ArgumentParser()
|
|
44
115
|
parser.add_argument('--parent-pid', type=int, required=True)
|
|
45
116
|
parser.add_argument('--proc-pid', type=int, required=True)
|
|
@@ -72,37 +143,41 @@ if __name__ == '__main__':
|
|
|
72
143
|
except (psutil.NoSuchProcess, ValueError):
|
|
73
144
|
pass
|
|
74
145
|
|
|
146
|
+
pgid: Optional[int] = None
|
|
147
|
+
if os.environ.get(USE_KILL_PG_ENV_VAR) == '1':
|
|
148
|
+
# Use kill_pg on UNIX system if allowed to reduce the resource usage.
|
|
149
|
+
# Note that both implementations might leave subprocessed uncancelled:
|
|
150
|
+
# - kill_process_tree(default): a subprocess is able to detach itself
|
|
151
|
+
# from the process tree use the same technique as daemonize(). Also,
|
|
152
|
+
# since we refresh the process tree per second, if the subprocess is
|
|
153
|
+
# launched between the [last_poll, parent_die] interval, the
|
|
154
|
+
# subprocess will not be captured will not be killed.
|
|
155
|
+
# - kill_process_group: kill_pg will kill all the processed in the group
|
|
156
|
+
# but if a subprocess calls setpgid(0, 0) to detach itself from the
|
|
157
|
+
# process group (usually to daemonize itself), the subprocess will
|
|
158
|
+
# not be killed.
|
|
159
|
+
if process is not None:
|
|
160
|
+
pgid = get_pgid_if_leader(process.pid)
|
|
161
|
+
|
|
75
162
|
if process is not None and parent_process is not None:
|
|
76
163
|
# Wait for either parent or target process to exit
|
|
77
164
|
while process.is_running() and parent_process.is_running():
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
165
|
+
if pgid is None:
|
|
166
|
+
# Refresh process tree for cleanup if process group is not
|
|
167
|
+
# available.
|
|
168
|
+
try:
|
|
169
|
+
tmp_children = process.children(recursive=True)
|
|
170
|
+
if tmp_children:
|
|
171
|
+
children = tmp_children
|
|
172
|
+
except psutil.NoSuchProcess:
|
|
173
|
+
pass
|
|
84
174
|
time.sleep(1)
|
|
85
175
|
|
|
86
|
-
if
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
176
|
+
if pgid is not None:
|
|
177
|
+
kill_process_group(pgid)
|
|
178
|
+
else:
|
|
179
|
+
kill_process_tree(process, children)
|
|
90
180
|
|
|
91
|
-
if not children:
|
|
92
|
-
sys.exit()
|
|
93
181
|
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
child.terminate()
|
|
97
|
-
except psutil.NoSuchProcess:
|
|
98
|
-
continue
|
|
99
|
-
|
|
100
|
-
# Wait 30s for the processes to exit gracefully.
|
|
101
|
-
time.sleep(30)
|
|
102
|
-
|
|
103
|
-
# SIGKILL if they're still running.
|
|
104
|
-
for child in children:
|
|
105
|
-
try:
|
|
106
|
-
child.kill()
|
|
107
|
-
except psutil.NoSuchProcess:
|
|
108
|
-
continue
|
|
182
|
+
if __name__ == '__main__':
|
|
183
|
+
main()
|
sky/skypilot_config.py
CHANGED
|
@@ -64,7 +64,6 @@ from sqlalchemy import orm
|
|
|
64
64
|
from sqlalchemy.dialects import postgresql
|
|
65
65
|
from sqlalchemy.dialects import sqlite
|
|
66
66
|
from sqlalchemy.ext import declarative
|
|
67
|
-
from sqlalchemy.pool import NullPool
|
|
68
67
|
|
|
69
68
|
from sky import exceptions
|
|
70
69
|
from sky import sky_logging
|
|
@@ -77,6 +76,7 @@ from sky.utils import schemas
|
|
|
77
76
|
from sky.utils import ux_utils
|
|
78
77
|
from sky.utils import yaml_utils
|
|
79
78
|
from sky.utils.db import db_utils
|
|
79
|
+
from sky.utils.db import migration_utils
|
|
80
80
|
from sky.utils.kubernetes import config_map_utils
|
|
81
81
|
|
|
82
82
|
if typing.TYPE_CHECKING:
|
|
@@ -121,7 +121,8 @@ _PROJECT_CONFIG_PATH = '.sky.yaml'
|
|
|
121
121
|
|
|
122
122
|
API_SERVER_CONFIG_KEY = 'api_server_config'
|
|
123
123
|
|
|
124
|
-
|
|
124
|
+
_SQLALCHEMY_ENGINE: Optional[sqlalchemy.engine.Engine] = None
|
|
125
|
+
_SQLALCHEMY_ENGINE_LOCK = threading.Lock()
|
|
125
126
|
|
|
126
127
|
Base = declarative.declarative_base()
|
|
127
128
|
|
|
@@ -415,10 +416,17 @@ def local_active_workspace_ctx(workspace: str) -> Iterator[None]:
|
|
|
415
416
|
def get_active_workspace(force_user_workspace: bool = False) -> str:
|
|
416
417
|
context_workspace = getattr(_active_workspace_context, 'workspace', None)
|
|
417
418
|
if not force_user_workspace and context_workspace is not None:
|
|
418
|
-
logger.debug(f'
|
|
419
|
+
logger.debug(f'Got context workspace: {context_workspace}')
|
|
419
420
|
return context_workspace
|
|
420
|
-
|
|
421
|
-
|
|
421
|
+
active_workspace = get_nested(keys=('active_workspace',),
|
|
422
|
+
default_value=None)
|
|
423
|
+
if active_workspace is None:
|
|
424
|
+
logger.debug(f'No active workspace found, using default workspace: '
|
|
425
|
+
f'{constants.SKYPILOT_DEFAULT_WORKSPACE}')
|
|
426
|
+
active_workspace = constants.SKYPILOT_DEFAULT_WORKSPACE
|
|
427
|
+
else:
|
|
428
|
+
logger.debug(f'Got active workspace: {active_workspace}')
|
|
429
|
+
return active_workspace
|
|
422
430
|
|
|
423
431
|
|
|
424
432
|
def set_nested(keys: Tuple[str, ...], value: Any) -> Dict[str, Any]:
|
|
@@ -474,7 +482,7 @@ def safe_reload_config() -> None:
|
|
|
474
482
|
reload_config()
|
|
475
483
|
|
|
476
484
|
|
|
477
|
-
def reload_config() -> None:
|
|
485
|
+
def reload_config(init_db: bool = False) -> None:
|
|
478
486
|
internal_config_path = os.environ.get(ENV_VAR_SKYPILOT_CONFIG)
|
|
479
487
|
if internal_config_path is not None:
|
|
480
488
|
# {ENV_VAR_SKYPILOT_CONFIG} is used internally.
|
|
@@ -486,7 +494,7 @@ def reload_config() -> None:
|
|
|
486
494
|
return
|
|
487
495
|
|
|
488
496
|
if os.environ.get(constants.ENV_VAR_IS_SKYPILOT_SERVER) is not None:
|
|
489
|
-
_reload_config_as_server()
|
|
497
|
+
_reload_config_as_server(init_db=init_db)
|
|
490
498
|
else:
|
|
491
499
|
_reload_config_as_client()
|
|
492
500
|
|
|
@@ -557,7 +565,43 @@ def _reload_config_from_internal_file(internal_config_path: str) -> None:
|
|
|
557
565
|
_set_loaded_config_path(config_path)
|
|
558
566
|
|
|
559
567
|
|
|
560
|
-
def
|
|
568
|
+
def _create_table(engine: sqlalchemy.engine.Engine):
|
|
569
|
+
"""Initialize the config database with migrations."""
|
|
570
|
+
migration_utils.safe_alembic_upgrade(
|
|
571
|
+
engine, migration_utils.SKYPILOT_CONFIG_DB_NAME,
|
|
572
|
+
migration_utils.SKYPILOT_CONFIG_VERSION)
|
|
573
|
+
|
|
574
|
+
|
|
575
|
+
def _initialize_and_get_db() -> sqlalchemy.engine.Engine:
|
|
576
|
+
"""Initialize and return the config database engine.
|
|
577
|
+
|
|
578
|
+
This function should only be called by the API Server during initialization.
|
|
579
|
+
Client-side code should never call this function.
|
|
580
|
+
"""
|
|
581
|
+
assert os.environ.get(constants.ENV_VAR_IS_SKYPILOT_SERVER) is not None, (
|
|
582
|
+
'initialize_and_get_db() can only be called by the API Server')
|
|
583
|
+
|
|
584
|
+
global _SQLALCHEMY_ENGINE
|
|
585
|
+
|
|
586
|
+
if _SQLALCHEMY_ENGINE is not None:
|
|
587
|
+
return _SQLALCHEMY_ENGINE
|
|
588
|
+
|
|
589
|
+
with _SQLALCHEMY_ENGINE_LOCK:
|
|
590
|
+
if _SQLALCHEMY_ENGINE is not None:
|
|
591
|
+
return _SQLALCHEMY_ENGINE
|
|
592
|
+
|
|
593
|
+
# We only store config in the DB when using Postgres,
|
|
594
|
+
# so no need to pass in db_name here.
|
|
595
|
+
engine = db_utils.get_engine(None)
|
|
596
|
+
|
|
597
|
+
# Run migrations if needed
|
|
598
|
+
_create_table(engine)
|
|
599
|
+
|
|
600
|
+
_SQLALCHEMY_ENGINE = engine
|
|
601
|
+
return _SQLALCHEMY_ENGINE
|
|
602
|
+
|
|
603
|
+
|
|
604
|
+
def _reload_config_as_server(init_db: bool = False) -> None:
|
|
561
605
|
# Reset the global variables, to avoid using stale values.
|
|
562
606
|
_set_loaded_config(config_utils.Config())
|
|
563
607
|
_set_loaded_config_path(None)
|
|
@@ -573,37 +617,24 @@ def _reload_config_as_server() -> None:
|
|
|
573
617
|
raise ValueError(
|
|
574
618
|
'If db config is specified, no other config is allowed')
|
|
575
619
|
logger.debug('retrieving config from database')
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
db_config = config_utils.Config(
|
|
595
|
-
yaml_utils.safe_load(row.value))
|
|
596
|
-
db_config.pop_nested(('db',), None)
|
|
597
|
-
return db_config
|
|
598
|
-
return None
|
|
599
|
-
|
|
600
|
-
db_config = _get_config_yaml_from_db(API_SERVER_CONFIG_KEY)
|
|
601
|
-
if db_config:
|
|
602
|
-
server_config = overlay_skypilot_config(server_config,
|
|
603
|
-
db_config)
|
|
604
|
-
# Close the engine to avoid connection leaks
|
|
605
|
-
if dispose_engine:
|
|
606
|
-
sqlalchemy_engine.dispose()
|
|
620
|
+
|
|
621
|
+
if init_db:
|
|
622
|
+
_initialize_and_get_db()
|
|
623
|
+
|
|
624
|
+
def _get_config_yaml_from_db(key: str) -> Optional[config_utils.Config]:
|
|
625
|
+
assert _SQLALCHEMY_ENGINE is not None
|
|
626
|
+
with orm.Session(_SQLALCHEMY_ENGINE) as session:
|
|
627
|
+
row = session.query(config_yaml_table).filter_by(
|
|
628
|
+
key=key).first()
|
|
629
|
+
if row:
|
|
630
|
+
db_config = config_utils.Config(yaml_utils.safe_load(row.value))
|
|
631
|
+
db_config.pop_nested(('db',), None)
|
|
632
|
+
return db_config
|
|
633
|
+
return None
|
|
634
|
+
|
|
635
|
+
db_config = _get_config_yaml_from_db(API_SERVER_CONFIG_KEY)
|
|
636
|
+
if db_config:
|
|
637
|
+
server_config = overlay_skypilot_config(server_config, db_config)
|
|
607
638
|
if sky_logging.logging_enabled(logger, sky_logging.DEBUG):
|
|
608
639
|
logger.debug(f'server config: \n'
|
|
609
640
|
f'{yaml_utils.dump_yaml_str(dict(server_config))}')
|
|
@@ -659,7 +690,7 @@ def loaded_config_path_serialized() -> Optional[str]:
|
|
|
659
690
|
|
|
660
691
|
|
|
661
692
|
# Load on import, synchronization is guaranteed by python interpreter.
|
|
662
|
-
reload_config()
|
|
693
|
+
reload_config(init_db=True)
|
|
663
694
|
|
|
664
695
|
|
|
665
696
|
def loaded() -> bool:
|
|
@@ -818,7 +849,8 @@ def _compose_cli_config(cli_config: Optional[List[str]]) -> config_utils.Config:
|
|
|
818
849
|
except ValueError as e:
|
|
819
850
|
raise ValueError(f'Invalid config override: {cli_config}. '
|
|
820
851
|
f'Check if config file exists or if the dotlist '
|
|
821
|
-
f'is formatted as: key1=value1,key2=value2'
|
|
852
|
+
f'is formatted as: key1=value1,key2=value2.\n'
|
|
853
|
+
f'Details: {e}') from e
|
|
822
854
|
logger.debug('CLI overrides config syntax check passed.')
|
|
823
855
|
|
|
824
856
|
return parsed_config
|
|
@@ -872,44 +904,32 @@ def update_api_server_config_no_lock(config: config_utils.Config) -> None:
|
|
|
872
904
|
if new_db_url and new_db_url != existing_db_url:
|
|
873
905
|
raise ValueError('Cannot change db url while server is running')
|
|
874
906
|
if existing_db_url:
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
do_update_stmt = insert_stmnt.on_conflict_do_update(
|
|
902
|
-
index_elements=[config_yaml_table.c.key],
|
|
903
|
-
set_={config_yaml_table.c.value: config_str})
|
|
904
|
-
session.execute(do_update_stmt)
|
|
905
|
-
session.commit()
|
|
906
|
-
|
|
907
|
-
logger.debug('saving api_server config to db')
|
|
908
|
-
_set_config_yaml_to_db(API_SERVER_CONFIG_KEY, config)
|
|
909
|
-
db_updated = True
|
|
910
|
-
# Close the engine to avoid connection leaks
|
|
911
|
-
if dispose_engine:
|
|
912
|
-
sqlalchemy_engine.dispose()
|
|
907
|
+
|
|
908
|
+
def _set_config_yaml_to_db(key: str, config: config_utils.Config):
|
|
909
|
+
# reload_config(init_db=True) is called when this module is
|
|
910
|
+
# imported, so the database engine must already be initialized.
|
|
911
|
+
assert _SQLALCHEMY_ENGINE is not None
|
|
912
|
+
config_str = yaml_utils.dump_yaml_str(dict(config))
|
|
913
|
+
with orm.Session(_SQLALCHEMY_ENGINE) as session:
|
|
914
|
+
if (_SQLALCHEMY_ENGINE.dialect.name ==
|
|
915
|
+
db_utils.SQLAlchemyDialect.SQLITE.value):
|
|
916
|
+
insert_func = sqlite.insert
|
|
917
|
+
elif (_SQLALCHEMY_ENGINE.dialect.name ==
|
|
918
|
+
db_utils.SQLAlchemyDialect.POSTGRESQL.value):
|
|
919
|
+
insert_func = postgresql.insert
|
|
920
|
+
else:
|
|
921
|
+
raise ValueError('Unsupported database dialect')
|
|
922
|
+
insert_stmnt = insert_func(config_yaml_table).values(
|
|
923
|
+
key=key, value=config_str)
|
|
924
|
+
do_update_stmt = insert_stmnt.on_conflict_do_update(
|
|
925
|
+
index_elements=[config_yaml_table.c.key],
|
|
926
|
+
set_={config_yaml_table.c.value: config_str})
|
|
927
|
+
session.execute(do_update_stmt)
|
|
928
|
+
session.commit()
|
|
929
|
+
|
|
930
|
+
logger.debug('saving api_server config to db')
|
|
931
|
+
_set_config_yaml_to_db(API_SERVER_CONFIG_KEY, config)
|
|
932
|
+
db_updated = True
|
|
913
933
|
|
|
914
934
|
if not db_updated:
|
|
915
935
|
# save to the local file (PVC in Kubernetes, local file otherwise)
|
sky/ssh_node_pools/server.py
CHANGED
|
@@ -7,6 +7,7 @@ import fastapi
|
|
|
7
7
|
from sky import core as sky_core
|
|
8
8
|
from sky.server.requests import executor
|
|
9
9
|
from sky.server.requests import payloads
|
|
10
|
+
from sky.server.requests import request_names
|
|
10
11
|
from sky.server.requests import requests as requests_lib
|
|
11
12
|
from sky.ssh_node_pools import core as ssh_node_pools_core
|
|
12
13
|
from sky.utils import common_utils
|
|
@@ -99,9 +100,9 @@ async def deploy_ssh_node_pool(request: fastapi.Request,
|
|
|
99
100
|
"""Deploy SSH Node Pool using existing ssh_up functionality."""
|
|
100
101
|
try:
|
|
101
102
|
ssh_up_body = payloads.SSHUpBody(infra=pool_name, cleanup=False)
|
|
102
|
-
executor.
|
|
103
|
+
await executor.schedule_request_async(
|
|
103
104
|
request_id=request.state.request_id,
|
|
104
|
-
request_name=
|
|
105
|
+
request_name=request_names.RequestName.SSH_NODE_POOLS_UP,
|
|
105
106
|
request_body=ssh_up_body,
|
|
106
107
|
func=sky_core.ssh_up,
|
|
107
108
|
schedule_type=requests_lib.ScheduleType.LONG,
|
|
@@ -124,9 +125,9 @@ async def deploy_ssh_node_pool_general(
|
|
|
124
125
|
ssh_up_body: payloads.SSHUpBody) -> Dict[str, str]:
|
|
125
126
|
"""Deploys all SSH Node Pools."""
|
|
126
127
|
try:
|
|
127
|
-
executor.
|
|
128
|
+
await executor.schedule_request_async(
|
|
128
129
|
request_id=request.state.request_id,
|
|
129
|
-
request_name=
|
|
130
|
+
request_name=request_names.RequestName.SSH_NODE_POOLS_UP,
|
|
130
131
|
request_body=ssh_up_body,
|
|
131
132
|
func=sky_core.ssh_up,
|
|
132
133
|
schedule_type=requests_lib.ScheduleType.LONG,
|
|
@@ -150,9 +151,9 @@ async def down_ssh_node_pool(request: fastapi.Request,
|
|
|
150
151
|
"""Cleans up a SSH Node Pools."""
|
|
151
152
|
try:
|
|
152
153
|
ssh_up_body = payloads.SSHUpBody(infra=pool_name, cleanup=True)
|
|
153
|
-
executor.
|
|
154
|
+
await executor.schedule_request_async(
|
|
154
155
|
request_id=request.state.request_id,
|
|
155
|
-
request_name=
|
|
156
|
+
request_name=request_names.RequestName.SSH_NODE_POOLS_DOWN,
|
|
156
157
|
request_body=ssh_up_body,
|
|
157
158
|
func=sky_core.ssh_up, # Reuse ssh_up function with cleanup=True
|
|
158
159
|
schedule_type=requests_lib.ScheduleType.LONG,
|
|
@@ -178,9 +179,9 @@ async def down_ssh_node_pool_general(
|
|
|
178
179
|
try:
|
|
179
180
|
# Set cleanup=True for down operation
|
|
180
181
|
ssh_up_body.cleanup = True
|
|
181
|
-
executor.
|
|
182
|
+
await executor.schedule_request_async(
|
|
182
183
|
request_id=request.state.request_id,
|
|
183
|
-
request_name=
|
|
184
|
+
request_name=request_names.RequestName.SSH_NODE_POOLS_DOWN,
|
|
184
185
|
request_body=ssh_up_body,
|
|
185
186
|
func=sky_core.ssh_up, # Reuse ssh_up function with cleanup=True
|
|
186
187
|
schedule_type=requests_lib.ScheduleType.LONG,
|