skypilot-nightly 1.0.0.dev20250502__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 +22 -6
- 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/hyperbolic.py +8 -0
- sky/adaptors/ibm.py +5 -2
- sky/adaptors/kubernetes.py +149 -18
- sky/adaptors/nebius.py +173 -30
- sky/adaptors/primeintellect.py +1 -0
- sky/adaptors/runpod.py +68 -0
- sky/adaptors/seeweb.py +183 -0
- sky/adaptors/shadeform.py +89 -0
- sky/admin_policy.py +187 -4
- sky/authentication.py +179 -225
- sky/backends/__init__.py +4 -2
- sky/backends/backend.py +22 -9
- sky/backends/backend_utils.py +1323 -397
- sky/backends/cloud_vm_ray_backend.py +1749 -1029
- sky/backends/docker_utils.py +1 -1
- sky/backends/local_docker_backend.py +11 -6
- sky/backends/task_codegen.py +633 -0
- sky/backends/wheel_utils.py +55 -9
- sky/{clouds/service_catalog → catalog}/__init__.py +21 -19
- sky/{clouds/service_catalog → catalog}/aws_catalog.py +27 -8
- sky/{clouds/service_catalog → catalog}/azure_catalog.py +10 -7
- sky/{clouds/service_catalog → catalog}/common.py +90 -49
- sky/{clouds/service_catalog → catalog}/cudo_catalog.py +8 -5
- sky/{clouds/service_catalog → catalog}/data_fetchers/analyze.py +1 -1
- sky/{clouds/service_catalog → catalog}/data_fetchers/fetch_aws.py +116 -80
- sky/{clouds/service_catalog → catalog}/data_fetchers/fetch_cudo.py +38 -38
- sky/{clouds/service_catalog → catalog}/data_fetchers/fetch_gcp.py +70 -16
- sky/catalog/data_fetchers/fetch_hyperbolic.py +136 -0
- sky/{clouds/service_catalog → catalog}/data_fetchers/fetch_lambda_cloud.py +1 -0
- sky/catalog/data_fetchers/fetch_nebius.py +338 -0
- sky/catalog/data_fetchers/fetch_runpod.py +698 -0
- sky/catalog/data_fetchers/fetch_seeweb.py +329 -0
- sky/catalog/data_fetchers/fetch_shadeform.py +142 -0
- sky/{clouds/service_catalog → catalog}/data_fetchers/fetch_vast.py +1 -1
- sky/{clouds/service_catalog → catalog}/data_fetchers/fetch_vsphere.py +1 -1
- sky/{clouds/service_catalog → catalog}/do_catalog.py +5 -2
- sky/{clouds/service_catalog → catalog}/fluidstack_catalog.py +6 -3
- sky/{clouds/service_catalog → catalog}/gcp_catalog.py +41 -15
- sky/catalog/hyperbolic_catalog.py +136 -0
- sky/{clouds/service_catalog → catalog}/ibm_catalog.py +9 -6
- sky/{clouds/service_catalog → catalog}/kubernetes_catalog.py +36 -24
- sky/{clouds/service_catalog → catalog}/lambda_catalog.py +9 -6
- sky/{clouds/service_catalog → catalog}/nebius_catalog.py +9 -7
- sky/{clouds/service_catalog → catalog}/oci_catalog.py +9 -6
- sky/{clouds/service_catalog → catalog}/paperspace_catalog.py +5 -2
- sky/catalog/primeintellect_catalog.py +95 -0
- sky/{clouds/service_catalog → catalog}/runpod_catalog.py +11 -4
- sky/{clouds/service_catalog → catalog}/scp_catalog.py +9 -6
- sky/catalog/seeweb_catalog.py +184 -0
- sky/catalog/shadeform_catalog.py +165 -0
- sky/catalog/ssh_catalog.py +167 -0
- sky/{clouds/service_catalog → catalog}/vast_catalog.py +6 -3
- sky/{clouds/service_catalog → catalog}/vsphere_catalog.py +5 -2
- sky/check.py +533 -185
- sky/cli.py +5 -5975
- sky/client/{cli.py → cli/command.py} +2591 -1956
- sky/client/cli/deprecation_utils.py +99 -0
- sky/client/cli/flags.py +359 -0
- sky/client/cli/table_utils.py +322 -0
- sky/client/cli/utils.py +79 -0
- sky/client/common.py +78 -32
- sky/client/oauth.py +82 -0
- sky/client/sdk.py +1219 -319
- sky/client/sdk_async.py +827 -0
- sky/client/service_account_auth.py +47 -0
- sky/cloud_stores.py +82 -3
- sky/clouds/__init__.py +13 -0
- sky/clouds/aws.py +564 -164
- sky/clouds/azure.py +105 -83
- sky/clouds/cloud.py +140 -40
- sky/clouds/cudo.py +68 -50
- sky/clouds/do.py +66 -48
- sky/clouds/fluidstack.py +63 -44
- sky/clouds/gcp.py +339 -110
- sky/clouds/hyperbolic.py +293 -0
- sky/clouds/ibm.py +70 -49
- sky/clouds/kubernetes.py +570 -162
- sky/clouds/lambda_cloud.py +74 -54
- sky/clouds/nebius.py +210 -81
- sky/clouds/oci.py +88 -66
- sky/clouds/paperspace.py +61 -44
- sky/clouds/primeintellect.py +317 -0
- sky/clouds/runpod.py +164 -74
- sky/clouds/scp.py +89 -86
- sky/clouds/seeweb.py +477 -0
- sky/clouds/shadeform.py +400 -0
- sky/clouds/ssh.py +263 -0
- sky/clouds/utils/aws_utils.py +10 -4
- sky/clouds/utils/gcp_utils.py +87 -11
- sky/clouds/utils/oci_utils.py +38 -14
- sky/clouds/utils/scp_utils.py +231 -167
- sky/clouds/vast.py +99 -77
- sky/clouds/vsphere.py +51 -40
- sky/core.py +375 -173
- sky/dag.py +15 -0
- 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/1272-1ef0bf0237faccdb.js +1 -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/2350.fab69e61bac57b23.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/3800-7b45f9fbb6308557.js +1 -0
- sky/dashboard/out/_next/static/chunks/3850-ff4a9a69d978632b.js +1 -0
- sky/dashboard/out/_next/static/chunks/3937.210053269f121201.js +1 -0
- sky/dashboard/out/_next/static/chunks/4725.172ede95d1b21022.js +1 -0
- sky/dashboard/out/_next/static/chunks/4937.a2baa2df5572a276.js +15 -0
- sky/dashboard/out/_next/static/chunks/5739-d67458fcb1386c92.js +8 -0
- sky/dashboard/out/_next/static/chunks/6130-2be46d70a38f1e82.js +1 -0
- sky/dashboard/out/_next/static/chunks/616-3d59f75e2ccf9321.js +39 -0
- sky/dashboard/out/_next/static/chunks/6212-7bd06f60ba693125.js +13 -0
- sky/dashboard/out/_next/static/chunks/6856-8f27d1c10c98def8.js +1 -0
- sky/dashboard/out/_next/static/chunks/6989-01359c57e018caa4.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/7411-b15471acd2cba716.js +41 -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/fd9d1056-86323a29a8f7e46a.js +1 -0
- sky/dashboard/out/_next/static/chunks/framework-cf60a09ccd051a10.js +33 -0
- sky/dashboard/out/_next/static/chunks/main-app-587214043926b3cc.js +1 -0
- sky/dashboard/out/_next/static/chunks/main-f15ccb73239a3bf1.js +1 -0
- sky/dashboard/out/_next/static/chunks/pages/_app-bde01e4a2beec258.js +34 -0
- sky/dashboard/out/_next/static/chunks/pages/_error-c66a4e8afc46f17b.js +1 -0
- sky/dashboard/out/_next/static/chunks/pages/clusters/[cluster]/[job]-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/config-dfb9bf07b13045f4.js +1 -0
- sky/dashboard/out/_next/static/chunks/pages/index-444f1804401f04ea.js +1 -0
- sky/dashboard/out/_next/static/chunks/pages/infra/[context]-c0b5935149902e6f.js +1 -0
- sky/dashboard/out/_next/static/chunks/pages/infra-aed0ea19df7cf961.js +1 -0
- sky/dashboard/out/_next/static/chunks/pages/jobs/[job]-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/workspace/new-3f88a1c7e86a3f86.js +1 -0
- sky/dashboard/out/_next/static/chunks/pages/workspaces/[name]-84a40f8c7c627fe4.js +1 -0
- sky/dashboard/out/_next/static/chunks/pages/workspaces-531b2f8c4bf89f82.js +1 -0
- 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 -0
- sky/dashboard/out/index.html +1 -1
- sky/dashboard/out/infra/[context].html +1 -0
- sky/dashboard/out/infra.html +1 -0
- sky/dashboard/out/jobs/[job].html +1 -1
- sky/dashboard/out/jobs/pools/[pool].html +1 -0
- sky/dashboard/out/jobs.html +1 -1
- sky/dashboard/out/users.html +1 -0
- sky/dashboard/out/volumes.html +1 -0
- sky/dashboard/out/workspace/new.html +1 -0
- sky/dashboard/out/workspaces/[name].html +1 -0
- sky/dashboard/out/workspaces.html +1 -0
- sky/data/data_utils.py +137 -1
- sky/data/mounting_utils.py +269 -84
- sky/data/storage.py +1460 -1807
- sky/data/storage_utils.py +43 -57
- sky/exceptions.py +126 -2
- sky/execution.py +216 -63
- sky/global_user_state.py +2390 -586
- sky/jobs/__init__.py +7 -0
- sky/jobs/client/sdk.py +300 -58
- sky/jobs/client/sdk_async.py +161 -0
- sky/jobs/constants.py +15 -8
- sky/jobs/controller.py +848 -275
- sky/jobs/file_content_utils.py +128 -0
- sky/jobs/log_gc.py +193 -0
- sky/jobs/recovery_strategy.py +402 -152
- sky/jobs/scheduler.py +314 -189
- sky/jobs/server/core.py +836 -255
- sky/jobs/server/server.py +156 -115
- sky/jobs/server/utils.py +136 -0
- sky/jobs/state.py +2109 -706
- sky/jobs/utils.py +1306 -215
- sky/logs/__init__.py +21 -0
- sky/logs/agent.py +108 -0
- sky/logs/aws.py +243 -0
- sky/logs/gcp.py +91 -0
- sky/metrics/__init__.py +0 -0
- sky/metrics/utils.py +453 -0
- sky/models.py +78 -1
- sky/optimizer.py +164 -70
- sky/provision/__init__.py +90 -4
- sky/provision/aws/config.py +147 -26
- sky/provision/aws/instance.py +136 -50
- sky/provision/azure/instance.py +11 -6
- sky/provision/common.py +13 -1
- sky/provision/cudo/cudo_machine_type.py +1 -1
- sky/provision/cudo/cudo_utils.py +14 -8
- sky/provision/cudo/cudo_wrapper.py +72 -71
- sky/provision/cudo/instance.py +10 -6
- sky/provision/do/instance.py +10 -6
- sky/provision/do/utils.py +4 -3
- sky/provision/docker_utils.py +140 -33
- sky/provision/fluidstack/instance.py +13 -8
- sky/provision/gcp/__init__.py +1 -0
- sky/provision/gcp/config.py +301 -19
- sky/provision/gcp/constants.py +218 -0
- sky/provision/gcp/instance.py +36 -8
- sky/provision/gcp/instance_utils.py +18 -4
- sky/provision/gcp/volume_utils.py +247 -0
- sky/provision/hyperbolic/__init__.py +12 -0
- sky/provision/hyperbolic/config.py +10 -0
- sky/provision/hyperbolic/instance.py +437 -0
- sky/provision/hyperbolic/utils.py +373 -0
- sky/provision/instance_setup.py +101 -20
- sky/provision/kubernetes/__init__.py +5 -0
- sky/provision/kubernetes/config.py +9 -52
- sky/provision/kubernetes/constants.py +17 -0
- sky/provision/kubernetes/instance.py +919 -280
- sky/provision/kubernetes/manifests/fusermount-server-daemonset.yaml +1 -2
- sky/provision/kubernetes/network.py +27 -17
- sky/provision/kubernetes/network_utils.py +44 -43
- sky/provision/kubernetes/utils.py +1221 -534
- sky/provision/kubernetes/volume.py +343 -0
- sky/provision/lambda_cloud/instance.py +22 -16
- sky/provision/nebius/constants.py +50 -0
- sky/provision/nebius/instance.py +19 -6
- sky/provision/nebius/utils.py +237 -137
- sky/provision/oci/instance.py +10 -5
- sky/provision/paperspace/instance.py +10 -7
- sky/provision/paperspace/utils.py +1 -1
- sky/provision/primeintellect/__init__.py +10 -0
- sky/provision/primeintellect/config.py +11 -0
- sky/provision/primeintellect/instance.py +454 -0
- sky/provision/primeintellect/utils.py +398 -0
- sky/provision/provisioner.py +117 -36
- sky/provision/runpod/__init__.py +5 -0
- sky/provision/runpod/instance.py +27 -6
- sky/provision/runpod/utils.py +51 -18
- sky/provision/runpod/volume.py +214 -0
- sky/provision/scp/__init__.py +15 -0
- sky/provision/scp/config.py +93 -0
- sky/provision/scp/instance.py +707 -0
- 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/ssh/__init__.py +18 -0
- sky/provision/vast/instance.py +13 -8
- sky/provision/vast/utils.py +10 -7
- 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 +4 -4
- sky/provision/vsphere/instance.py +15 -10
- sky/provision/vsphere/vsphere_utils.py +17 -20
- sky/py.typed +0 -0
- sky/resources.py +845 -119
- sky/schemas/__init__.py +0 -0
- sky/schemas/api/__init__.py +0 -0
- sky/schemas/api/responses.py +227 -0
- sky/schemas/db/README +4 -0
- sky/schemas/db/env.py +90 -0
- sky/schemas/db/global_user_state/001_initial_schema.py +124 -0
- sky/schemas/db/global_user_state/002_add_workspace_to_cluster_history.py +35 -0
- sky/schemas/db/global_user_state/003_fix_initial_revision.py +61 -0
- sky/schemas/db/global_user_state/004_is_managed.py +34 -0
- sky/schemas/db/global_user_state/005_cluster_event.py +32 -0
- sky/schemas/db/global_user_state/006_provision_log.py +41 -0
- sky/schemas/db/global_user_state/007_cluster_event_request_id.py +34 -0
- sky/schemas/db/global_user_state/008_skylet_ssh_tunnel_metadata.py +34 -0
- sky/schemas/db/global_user_state/009_last_activity_and_launched_at.py +89 -0
- sky/schemas/db/global_user_state/010_save_ssh_key.py +66 -0
- sky/schemas/db/global_user_state/011_is_ephemeral.py +34 -0
- sky/schemas/db/kv_cache/001_initial_schema.py +29 -0
- sky/schemas/db/script.py.mako +28 -0
- sky/schemas/db/serve_state/001_initial_schema.py +67 -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/001_initial_schema.py +97 -0
- sky/schemas/db/spot_jobs/002_cluster_pool.py +42 -0
- sky/schemas/db/spot_jobs/003_pool_hash.py +34 -0
- sky/schemas/db/spot_jobs/004_job_file_contents.py +42 -0
- sky/schemas/db/spot_jobs/005_logs_gc.py +38 -0
- sky/schemas/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/__init__.py +0 -0
- sky/schemas/generated/autostopv1_pb2.py +36 -0
- sky/schemas/generated/autostopv1_pb2.pyi +43 -0
- sky/schemas/generated/autostopv1_pb2_grpc.py +146 -0
- sky/schemas/generated/jobsv1_pb2.py +86 -0
- sky/schemas/generated/jobsv1_pb2.pyi +254 -0
- sky/schemas/generated/jobsv1_pb2_grpc.py +542 -0
- sky/schemas/generated/managed_jobsv1_pb2.py +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 +357 -5
- sky/serve/client/impl.py +310 -0
- sky/serve/client/sdk.py +47 -139
- sky/serve/client/sdk_async.py +130 -0
- sky/serve/constants.py +12 -9
- sky/serve/controller.py +68 -17
- sky/serve/load_balancer.py +106 -60
- sky/serve/load_balancing_policies.py +116 -2
- sky/serve/replica_managers.py +434 -249
- sky/serve/serve_rpc_utils.py +179 -0
- sky/serve/serve_state.py +569 -257
- sky/serve/serve_utils.py +775 -265
- sky/serve/server/core.py +66 -711
- sky/serve/server/impl.py +1093 -0
- sky/serve/server/server.py +21 -18
- sky/serve/service.py +192 -89
- sky/serve/service_spec.py +144 -20
- sky/serve/spot_placer.py +3 -0
- sky/server/auth/__init__.py +0 -0
- sky/server/auth/authn.py +50 -0
- sky/server/auth/loopback.py +38 -0
- sky/server/auth/oauth2_proxy.py +202 -0
- sky/server/common.py +478 -182
- sky/server/config.py +85 -23
- sky/server/constants.py +44 -6
- sky/server/daemons.py +295 -0
- sky/server/html/token_page.html +185 -0
- sky/server/metrics.py +160 -0
- sky/server/middleware_utils.py +166 -0
- sky/server/requests/executor.py +558 -138
- sky/server/requests/payloads.py +364 -24
- sky/server/requests/preconditions.py +21 -17
- sky/server/requests/process.py +112 -29
- sky/server/requests/request_names.py +121 -0
- sky/server/requests/requests.py +822 -226
- sky/server/requests/serializers/decoders.py +82 -31
- sky/server/requests/serializers/encoders.py +140 -22
- sky/server/requests/threads.py +117 -0
- sky/server/rest.py +455 -0
- sky/server/server.py +1309 -285
- sky/server/state.py +20 -0
- sky/server/stream_utils.py +327 -61
- sky/server/uvicorn.py +217 -3
- sky/server/versions.py +270 -0
- sky/setup_files/MANIFEST.in +11 -1
- sky/setup_files/alembic.ini +160 -0
- sky/setup_files/dependencies.py +139 -31
- sky/setup_files/setup.py +44 -42
- sky/sky_logging.py +114 -7
- sky/skylet/attempt_skylet.py +106 -24
- sky/skylet/autostop_lib.py +129 -8
- sky/skylet/configs.py +29 -20
- sky/skylet/constants.py +216 -25
- sky/skylet/events.py +101 -21
- sky/skylet/job_lib.py +345 -164
- sky/skylet/log_lib.py +297 -18
- sky/skylet/log_lib.pyi +44 -1
- sky/skylet/providers/ibm/node_provider.py +12 -8
- sky/skylet/providers/ibm/vpc_provider.py +13 -12
- sky/skylet/ray_patches/__init__.py +17 -3
- sky/skylet/ray_patches/autoscaler.py.diff +18 -0
- sky/skylet/ray_patches/cli.py.diff +19 -0
- sky/skylet/ray_patches/command_runner.py.diff +17 -0
- sky/skylet/ray_patches/log_monitor.py.diff +20 -0
- sky/skylet/ray_patches/resource_demand_scheduler.py.diff +32 -0
- sky/skylet/ray_patches/updater.py.diff +18 -0
- sky/skylet/ray_patches/worker.py.diff +41 -0
- sky/skylet/runtime_utils.py +21 -0
- sky/skylet/services.py +568 -0
- sky/skylet/skylet.py +72 -4
- sky/skylet/subprocess_daemon.py +104 -29
- sky/skypilot_config.py +506 -99
- sky/ssh_node_pools/__init__.py +1 -0
- sky/ssh_node_pools/core.py +135 -0
- sky/ssh_node_pools/server.py +233 -0
- sky/task.py +685 -163
- sky/templates/aws-ray.yml.j2 +11 -3
- sky/templates/azure-ray.yml.j2 +2 -1
- sky/templates/cudo-ray.yml.j2 +1 -0
- sky/templates/do-ray.yml.j2 +2 -1
- sky/templates/fluidstack-ray.yml.j2 +1 -0
- sky/templates/gcp-ray.yml.j2 +62 -1
- sky/templates/hyperbolic-ray.yml.j2 +68 -0
- sky/templates/ibm-ray.yml.j2 +2 -1
- sky/templates/jobs-controller.yaml.j2 +27 -24
- sky/templates/kubernetes-loadbalancer.yml.j2 +2 -0
- sky/templates/kubernetes-ray.yml.j2 +611 -50
- sky/templates/lambda-ray.yml.j2 +2 -1
- sky/templates/nebius-ray.yml.j2 +34 -12
- sky/templates/oci-ray.yml.j2 +1 -0
- sky/templates/paperspace-ray.yml.j2 +2 -1
- sky/templates/primeintellect-ray.yml.j2 +72 -0
- sky/templates/runpod-ray.yml.j2 +10 -1
- sky/templates/scp-ray.yml.j2 +4 -50
- sky/templates/seeweb-ray.yml.j2 +171 -0
- sky/templates/shadeform-ray.yml.j2 +73 -0
- sky/templates/sky-serve-controller.yaml.j2 +22 -2
- sky/templates/vast-ray.yml.j2 +1 -0
- sky/templates/vsphere-ray.yml.j2 +1 -0
- sky/templates/websocket_proxy.py +212 -37
- sky/usage/usage_lib.py +31 -15
- sky/users/__init__.py +0 -0
- sky/users/model.conf +15 -0
- sky/users/permission.py +397 -0
- sky/users/rbac.py +121 -0
- sky/users/server.py +720 -0
- sky/users/token_service.py +218 -0
- sky/utils/accelerator_registry.py +35 -5
- sky/utils/admin_policy_utils.py +84 -38
- sky/utils/annotations.py +38 -5
- sky/utils/asyncio_utils.py +78 -0
- sky/utils/atomic.py +1 -1
- sky/utils/auth_utils.py +153 -0
- sky/utils/benchmark_utils.py +60 -0
- sky/utils/cli_utils/status_utils.py +159 -86
- sky/utils/cluster_utils.py +31 -9
- sky/utils/command_runner.py +354 -68
- sky/utils/command_runner.pyi +93 -3
- sky/utils/common.py +35 -8
- sky/utils/common_utils.py +314 -91
- sky/utils/config_utils.py +74 -5
- sky/utils/context.py +403 -0
- sky/utils/context_utils.py +242 -0
- sky/utils/controller_utils.py +383 -89
- sky/utils/dag_utils.py +31 -12
- sky/utils/db/__init__.py +0 -0
- sky/utils/db/db_utils.py +485 -0
- sky/utils/db/kv_cache.py +149 -0
- sky/utils/db/migration_utils.py +137 -0
- sky/utils/directory_utils.py +12 -0
- sky/utils/env_options.py +13 -0
- sky/utils/git.py +567 -0
- sky/utils/git_clone.sh +460 -0
- sky/utils/infra_utils.py +195 -0
- sky/utils/kubernetes/cleanup-tunnel.sh +62 -0
- sky/utils/kubernetes/config_map_utils.py +133 -0
- sky/utils/kubernetes/create_cluster.sh +15 -29
- sky/utils/kubernetes/delete_cluster.sh +10 -7
- sky/utils/kubernetes/deploy_ssh_node_pools.py +1177 -0
- sky/utils/kubernetes/exec_kubeconfig_converter.py +22 -31
- sky/utils/kubernetes/generate_kind_config.py +6 -66
- sky/utils/kubernetes/generate_kubeconfig.sh +4 -1
- sky/utils/kubernetes/gpu_labeler.py +18 -8
- 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 +284 -114
- sky/utils/kubernetes/rsync_helper.sh +11 -3
- sky/utils/kubernetes/ssh-tunnel.sh +379 -0
- sky/utils/kubernetes/ssh_utils.py +221 -0
- sky/utils/kubernetes_enums.py +8 -15
- sky/utils/lock_events.py +94 -0
- sky/utils/locks.py +416 -0
- sky/utils/log_utils.py +82 -107
- sky/utils/perf_utils.py +22 -0
- sky/utils/resource_checker.py +298 -0
- sky/utils/resources_utils.py +249 -32
- sky/utils/rich_utils.py +217 -39
- sky/utils/schemas.py +955 -160
- sky/utils/serialize_utils.py +16 -0
- sky/utils/status_lib.py +10 -0
- sky/utils/subprocess_utils.py +29 -15
- sky/utils/tempstore.py +70 -0
- sky/utils/thread_utils.py +91 -0
- sky/utils/timeline.py +26 -53
- sky/utils/ux_utils.py +84 -15
- sky/utils/validator.py +11 -1
- sky/utils/volume.py +165 -0
- sky/utils/yaml_utils.py +111 -0
- sky/volumes/__init__.py +13 -0
- sky/volumes/client/__init__.py +0 -0
- sky/volumes/client/sdk.py +150 -0
- sky/volumes/server/__init__.py +0 -0
- sky/volumes/server/core.py +270 -0
- sky/volumes/server/server.py +124 -0
- sky/volumes/volume.py +215 -0
- sky/workspaces/__init__.py +0 -0
- sky/workspaces/core.py +655 -0
- sky/workspaces/server.py +101 -0
- sky/workspaces/utils.py +56 -0
- 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.dev20251203.dist-info/METADATA +676 -0
- skypilot_nightly-1.0.0.dev20251203.dist-info/RECORD +611 -0
- {skypilot_nightly-1.0.0.dev20250502.dist-info → skypilot_nightly-1.0.0.dev20251203.dist-info}/WHEEL +1 -1
- skypilot_nightly-1.0.0.dev20251203.dist-info/top_level.txt +2 -0
- sky/benchmark/benchmark_state.py +0 -256
- sky/benchmark/benchmark_utils.py +0 -641
- sky/clouds/service_catalog/constants.py +0 -7
- sky/dashboard/out/_next/static/GWvVBSCS7FmUiVmjaL1a7/_buildManifest.js +0 -1
- sky/dashboard/out/_next/static/chunks/236-2db3ee3fba33dd9e.js +0 -6
- sky/dashboard/out/_next/static/chunks/312-c3c8845990db8ffc.js +0 -15
- sky/dashboard/out/_next/static/chunks/37-0a572fe0dbb89c4d.js +0 -6
- sky/dashboard/out/_next/static/chunks/678-206dddca808e6d16.js +0 -59
- sky/dashboard/out/_next/static/chunks/845-9e60713e0c441abc.js +0 -1
- sky/dashboard/out/_next/static/chunks/979-7bf73a4c7cea0f5c.js +0 -1
- sky/dashboard/out/_next/static/chunks/fd9d1056-2821b0f0cabcd8bd.js +0 -1
- sky/dashboard/out/_next/static/chunks/framework-87d061ee6ed71b28.js +0 -33
- sky/dashboard/out/_next/static/chunks/main-app-241eb28595532291.js +0 -1
- sky/dashboard/out/_next/static/chunks/main-e0e2335212e72357.js +0 -1
- sky/dashboard/out/_next/static/chunks/pages/_app-e6b013bc3f77ad60.js +0 -1
- sky/dashboard/out/_next/static/chunks/pages/_error-1be831200e60c5c0.js +0 -1
- sky/dashboard/out/_next/static/chunks/pages/clusters/[cluster]/[job]-6ac338bc2239cb45.js +0 -1
- sky/dashboard/out/_next/static/chunks/pages/clusters/[cluster]-f383db7389368ea7.js +0 -1
- sky/dashboard/out/_next/static/chunks/pages/clusters-a93b93e10b8b074e.js +0 -1
- sky/dashboard/out/_next/static/chunks/pages/index-f9f039532ca8cbc4.js +0 -1
- sky/dashboard/out/_next/static/chunks/pages/jobs/[job]-1c519e1afc523dc9.js +0 -1
- sky/dashboard/out/_next/static/chunks/pages/jobs-a75029b67aab6a2e.js +0 -1
- sky/dashboard/out/_next/static/chunks/webpack-830f59b8404e96b8.js +0 -1
- sky/dashboard/out/_next/static/css/c6933bbb2ce7f4dd.css +0 -3
- sky/jobs/dashboard/dashboard.py +0 -223
- sky/jobs/dashboard/static/favicon.ico +0 -0
- sky/jobs/dashboard/templates/index.html +0 -831
- sky/jobs/server/dashboard_utils.py +0 -69
- sky/skylet/providers/scp/__init__.py +0 -2
- sky/skylet/providers/scp/config.py +0 -149
- sky/skylet/providers/scp/node_provider.py +0 -578
- sky/templates/kubernetes-ssh-jump.yml.j2 +0 -94
- sky/utils/db_utils.py +0 -100
- sky/utils/kubernetes/deploy_remote_cluster.sh +0 -308
- sky/utils/kubernetes/ssh_jump_lifecycle_manager.py +0 -191
- skypilot_nightly-1.0.0.dev20250502.dist-info/METADATA +0 -361
- skypilot_nightly-1.0.0.dev20250502.dist-info/RECORD +0 -396
- skypilot_nightly-1.0.0.dev20250502.dist-info/top_level.txt +0 -1
- /sky/{clouds/service_catalog → catalog}/config.py +0 -0
- /sky/{benchmark → catalog/data_fetchers}/__init__.py +0 -0
- /sky/{clouds/service_catalog → catalog}/data_fetchers/fetch_azure.py +0 -0
- /sky/{clouds/service_catalog → catalog}/data_fetchers/fetch_fluidstack.py +0 -0
- /sky/{clouds/service_catalog → catalog}/data_fetchers/fetch_ibm.py +0 -0
- /sky/{clouds/service_catalog/data_fetchers → client/cli}/__init__.py +0 -0
- /sky/dashboard/out/_next/static/{GWvVBSCS7FmUiVmjaL1a7 → 96_E2yl3QAiIJGOYCkSpB}/_ssgManifest.js +0 -0
- {skypilot_nightly-1.0.0.dev20250502.dist-info → skypilot_nightly-1.0.0.dev20251203.dist-info}/entry_points.txt +0 -0
- {skypilot_nightly-1.0.0.dev20250502.dist-info → skypilot_nightly-1.0.0.dev20251203.dist-info}/licenses/LICENSE +0 -0
sky/utils/db/kv_cache.py
ADDED
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
"""Persistent KV cache, backed by a sqlite or postgres database."""
|
|
2
|
+
import functools
|
|
3
|
+
import threading
|
|
4
|
+
import time
|
|
5
|
+
from typing import Optional
|
|
6
|
+
|
|
7
|
+
import sqlalchemy
|
|
8
|
+
from sqlalchemy import exc as sqlalchemy_exc
|
|
9
|
+
from sqlalchemy import orm
|
|
10
|
+
from sqlalchemy.dialects import postgresql
|
|
11
|
+
from sqlalchemy.dialects import sqlite
|
|
12
|
+
from sqlalchemy.ext import declarative
|
|
13
|
+
|
|
14
|
+
from sky import sky_logging
|
|
15
|
+
from sky.metrics import utils as metrics_lib
|
|
16
|
+
from sky.utils import common_utils
|
|
17
|
+
from sky.utils.db import db_utils
|
|
18
|
+
from sky.utils.db import migration_utils
|
|
19
|
+
|
|
20
|
+
logger = sky_logging.init_logger(__name__)
|
|
21
|
+
|
|
22
|
+
_SQLALCHEMY_ENGINE: Optional[sqlalchemy.engine.Engine] = None
|
|
23
|
+
_SQLALCHEMY_ENGINE_LOCK = threading.Lock()
|
|
24
|
+
|
|
25
|
+
Base = declarative.declarative_base()
|
|
26
|
+
|
|
27
|
+
kv_cache_table = sqlalchemy.Table(
|
|
28
|
+
'kv_cache',
|
|
29
|
+
Base.metadata,
|
|
30
|
+
sqlalchemy.Column('key', sqlalchemy.Text, primary_key=True),
|
|
31
|
+
sqlalchemy.Column('value', sqlalchemy.Text),
|
|
32
|
+
sqlalchemy.Column('expires_at', sqlalchemy.Float),
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def create_table(engine: sqlalchemy.engine.Engine):
|
|
37
|
+
# Enable WAL mode to avoid locking issues.
|
|
38
|
+
# See: issue #1441 and PR #1509
|
|
39
|
+
# https://github.com/microsoft/WSL/issues/2395
|
|
40
|
+
# TODO(romilb): We do not enable WAL for WSL because of known issue in WSL.
|
|
41
|
+
# This may cause the database locked problem from WSL issue #1441.
|
|
42
|
+
if (engine.dialect.name == db_utils.SQLAlchemyDialect.SQLITE.value and
|
|
43
|
+
not common_utils.is_wsl()):
|
|
44
|
+
try:
|
|
45
|
+
with orm.Session(engine) as session:
|
|
46
|
+
session.execute(sqlalchemy.text('PRAGMA journal_mode=WAL'))
|
|
47
|
+
session.commit()
|
|
48
|
+
except sqlalchemy_exc.OperationalError as e:
|
|
49
|
+
if 'database is locked' not in str(e):
|
|
50
|
+
raise
|
|
51
|
+
# If the database is locked, it is OK to continue, as the WAL mode
|
|
52
|
+
# is not critical and is likely to be enabled by other processes.
|
|
53
|
+
|
|
54
|
+
migration_utils.safe_alembic_upgrade(engine,
|
|
55
|
+
migration_utils.KV_CACHE_DB_NAME,
|
|
56
|
+
migration_utils.KV_CACHE_VERSION)
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
# We wrap the sqlalchemy engine initialization in a thread
|
|
60
|
+
# lock to ensure that multiple threads do not initialize the
|
|
61
|
+
# engine which could result in a rare race condition where
|
|
62
|
+
# a session has already been created with _SQLALCHEMY_ENGINE = e1,
|
|
63
|
+
# and then another thread overwrites _SQLALCHEMY_ENGINE = e2
|
|
64
|
+
# which could result in e1 being garbage collected unexpectedly.
|
|
65
|
+
def initialize_and_get_db() -> sqlalchemy.engine.Engine:
|
|
66
|
+
global _SQLALCHEMY_ENGINE
|
|
67
|
+
|
|
68
|
+
if _SQLALCHEMY_ENGINE is not None:
|
|
69
|
+
return _SQLALCHEMY_ENGINE
|
|
70
|
+
with _SQLALCHEMY_ENGINE_LOCK:
|
|
71
|
+
if _SQLALCHEMY_ENGINE is not None:
|
|
72
|
+
return _SQLALCHEMY_ENGINE
|
|
73
|
+
# get an engine to the db
|
|
74
|
+
engine = db_utils.get_engine('kv_cache')
|
|
75
|
+
|
|
76
|
+
# run migrations if needed
|
|
77
|
+
create_table(engine)
|
|
78
|
+
_SQLALCHEMY_ENGINE = engine
|
|
79
|
+
return _SQLALCHEMY_ENGINE
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def _init_db(func):
|
|
83
|
+
"""Initialize the database."""
|
|
84
|
+
|
|
85
|
+
@functools.wraps(func)
|
|
86
|
+
def wrapper(*args, **kwargs):
|
|
87
|
+
initialize_and_get_db()
|
|
88
|
+
return func(*args, **kwargs)
|
|
89
|
+
|
|
90
|
+
return wrapper
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
initialize_and_get_db()
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
@_init_db
|
|
97
|
+
@metrics_lib.time_me
|
|
98
|
+
def add_or_update_cache_entry(
|
|
99
|
+
key: str,
|
|
100
|
+
value: str,
|
|
101
|
+
expires_at: float,
|
|
102
|
+
) -> None:
|
|
103
|
+
"""Store the mapping from user hash to user name for display purposes.
|
|
104
|
+
|
|
105
|
+
Args:
|
|
106
|
+
key: The key of the cache entry.
|
|
107
|
+
value: The value of the cache entry.
|
|
108
|
+
expires_at: The timestamp when the cache entry expires.
|
|
109
|
+
"""
|
|
110
|
+
assert _SQLALCHEMY_ENGINE is not None
|
|
111
|
+
if (_SQLALCHEMY_ENGINE.dialect.name ==
|
|
112
|
+
db_utils.SQLAlchemyDialect.SQLITE.value):
|
|
113
|
+
insert_func = sqlite.insert
|
|
114
|
+
elif (_SQLALCHEMY_ENGINE.dialect.name ==
|
|
115
|
+
db_utils.SQLAlchemyDialect.POSTGRESQL.value):
|
|
116
|
+
insert_func = postgresql.insert
|
|
117
|
+
else:
|
|
118
|
+
raise ValueError('Unsupported database dialect')
|
|
119
|
+
|
|
120
|
+
with orm.Session(_SQLALCHEMY_ENGINE) as session:
|
|
121
|
+
insert_stmt = insert_func(kv_cache_table).values(key=key,
|
|
122
|
+
value=value,
|
|
123
|
+
expires_at=expires_at)
|
|
124
|
+
do_update_stmt = insert_stmt.on_conflict_do_update(
|
|
125
|
+
index_elements=[kv_cache_table.c.key],
|
|
126
|
+
set_={
|
|
127
|
+
kv_cache_table.c.value: value,
|
|
128
|
+
kv_cache_table.c.expires_at: expires_at
|
|
129
|
+
})
|
|
130
|
+
session.execute(do_update_stmt)
|
|
131
|
+
|
|
132
|
+
session.commit()
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
@_init_db
|
|
136
|
+
@metrics_lib.time_me
|
|
137
|
+
def get_cache_entry(key: str) -> Optional[str]:
|
|
138
|
+
"""Get the value of the cache entry.
|
|
139
|
+
|
|
140
|
+
Args:
|
|
141
|
+
key: The key of the cache entry.
|
|
142
|
+
"""
|
|
143
|
+
assert _SQLALCHEMY_ENGINE is not None
|
|
144
|
+
with orm.Session(_SQLALCHEMY_ENGINE) as session:
|
|
145
|
+
result = session.execute(
|
|
146
|
+
sqlalchemy.select(kv_cache_table.c.value).where(
|
|
147
|
+
kv_cache_table.c.key == key).where(
|
|
148
|
+
kv_cache_table.c.expires_at > time.time()))
|
|
149
|
+
return result.scalar()
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
"""Constants for the database schemas."""
|
|
2
|
+
|
|
3
|
+
import contextlib
|
|
4
|
+
import logging
|
|
5
|
+
import os
|
|
6
|
+
|
|
7
|
+
from alembic import command as alembic_command
|
|
8
|
+
from alembic.config import Config
|
|
9
|
+
from alembic.runtime import migration
|
|
10
|
+
import filelock
|
|
11
|
+
import sqlalchemy
|
|
12
|
+
|
|
13
|
+
from sky import sky_logging
|
|
14
|
+
from sky.skylet import constants
|
|
15
|
+
|
|
16
|
+
logger = sky_logging.init_logger(__name__)
|
|
17
|
+
|
|
18
|
+
DB_INIT_LOCK_TIMEOUT_SECONDS = 10
|
|
19
|
+
|
|
20
|
+
GLOBAL_USER_STATE_DB_NAME = 'state_db'
|
|
21
|
+
GLOBAL_USER_STATE_VERSION = '011'
|
|
22
|
+
GLOBAL_USER_STATE_LOCK_PATH = f'~/.sky/locks/.{GLOBAL_USER_STATE_DB_NAME}.lock'
|
|
23
|
+
|
|
24
|
+
SPOT_JOBS_DB_NAME = 'spot_jobs_db'
|
|
25
|
+
SPOT_JOBS_VERSION = '007'
|
|
26
|
+
SPOT_JOBS_LOCK_PATH = f'~/.sky/locks/.{SPOT_JOBS_DB_NAME}.lock'
|
|
27
|
+
|
|
28
|
+
SERVE_DB_NAME = 'serve_db'
|
|
29
|
+
SERVE_VERSION = '002'
|
|
30
|
+
SERVE_LOCK_PATH = f'~/.sky/locks/.{SERVE_DB_NAME}.lock'
|
|
31
|
+
|
|
32
|
+
SKYPILOT_CONFIG_DB_NAME = 'sky_config_db'
|
|
33
|
+
SKYPILOT_CONFIG_VERSION = '001'
|
|
34
|
+
SKYPILOT_CONFIG_LOCK_PATH = f'~/.sky/locks/.{SKYPILOT_CONFIG_DB_NAME}.lock'
|
|
35
|
+
|
|
36
|
+
KV_CACHE_DB_NAME = 'kv_cache_db'
|
|
37
|
+
KV_CACHE_VERSION = '001'
|
|
38
|
+
KV_CACHE_LOCK_PATH = f'~/.sky/locks/.{KV_CACHE_DB_NAME}.lock'
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
@contextlib.contextmanager
|
|
42
|
+
def db_lock(db_name: str):
|
|
43
|
+
lock_path = os.path.expanduser(f'~/.sky/locks/.{db_name}.lock')
|
|
44
|
+
try:
|
|
45
|
+
with filelock.FileLock(lock_path, timeout=DB_INIT_LOCK_TIMEOUT_SECONDS):
|
|
46
|
+
yield
|
|
47
|
+
except filelock.Timeout as e:
|
|
48
|
+
raise RuntimeError(f'Failed to initialize database due to a timeout '
|
|
49
|
+
f'when trying to acquire the lock at '
|
|
50
|
+
f'{lock_path}. '
|
|
51
|
+
'Please try again or manually remove the lock '
|
|
52
|
+
f'file if you believe it is stale.') from e
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def get_alembic_config(engine: sqlalchemy.engine.Engine, section: str):
|
|
56
|
+
"""Get Alembic configuration for the given section"""
|
|
57
|
+
# From sky/utils/db/migration_utils.py -> sky/setup_files/alembic.ini
|
|
58
|
+
alembic_ini_path = os.path.join(
|
|
59
|
+
os.path.dirname(os.path.dirname(os.path.dirname(__file__))),
|
|
60
|
+
'setup_files', 'alembic.ini')
|
|
61
|
+
alembic_cfg = Config(alembic_ini_path, ini_section=section)
|
|
62
|
+
|
|
63
|
+
# Override the database URL to match SkyPilot's current connection
|
|
64
|
+
# Use render_as_string to get the full URL with password
|
|
65
|
+
url = engine.url.render_as_string(hide_password=False)
|
|
66
|
+
# Replace % with %% to escape the % character in the URL
|
|
67
|
+
# set_section_option uses variable interpolation, which treats % as a
|
|
68
|
+
# special character.
|
|
69
|
+
# any '%' symbol not used for interpolation needs to be escaped.
|
|
70
|
+
url = url.replace('%', '%%')
|
|
71
|
+
alembic_cfg.set_section_option(section, 'sqlalchemy.url', url)
|
|
72
|
+
|
|
73
|
+
return alembic_cfg
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def needs_upgrade(engine: sqlalchemy.engine.Engine, section: str,
|
|
77
|
+
target_revision: str):
|
|
78
|
+
"""Check if the database needs to be upgraded.
|
|
79
|
+
|
|
80
|
+
Args:
|
|
81
|
+
engine: SQLAlchemy engine for the database
|
|
82
|
+
section: Alembic section to upgrade (e.g., 'state_db' or 'spot_jobs_db')
|
|
83
|
+
target_revision: Target revision to upgrade to (e.g., '001')
|
|
84
|
+
"""
|
|
85
|
+
current_rev = None
|
|
86
|
+
|
|
87
|
+
# get alembic config for the given section
|
|
88
|
+
alembic_config = get_alembic_config(engine, section)
|
|
89
|
+
version_table = alembic_config.get_section_option(
|
|
90
|
+
alembic_config.config_ini_section, 'version_table', 'alembic_version')
|
|
91
|
+
|
|
92
|
+
with engine.connect() as connection:
|
|
93
|
+
context = migration.MigrationContext.configure(
|
|
94
|
+
connection, opts={'version_table': version_table})
|
|
95
|
+
current_rev = context.get_current_revision()
|
|
96
|
+
|
|
97
|
+
target_rev_num = int(target_revision)
|
|
98
|
+
if current_rev is None:
|
|
99
|
+
if os.environ.get(constants.ENV_VAR_IS_SKYPILOT_SERVER) is not None:
|
|
100
|
+
logger.debug(f'{section} database currently uninitialized, '
|
|
101
|
+
f'targeting revision {target_rev_num}')
|
|
102
|
+
return True
|
|
103
|
+
|
|
104
|
+
# Compare revisions - assuming they are numeric strings like '001', '002'
|
|
105
|
+
current_rev_num = int(current_rev)
|
|
106
|
+
if (current_rev_num < target_rev_num and
|
|
107
|
+
os.environ.get(constants.ENV_VAR_IS_SKYPILOT_SERVER) is not None):
|
|
108
|
+
logger.debug(
|
|
109
|
+
f'{section} database currently at revision {current_rev_num}, '
|
|
110
|
+
f'targeting revision {target_rev_num}')
|
|
111
|
+
|
|
112
|
+
return current_rev_num < target_rev_num
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
def safe_alembic_upgrade(engine: sqlalchemy.engine.Engine, section: str,
|
|
116
|
+
target_revision: str):
|
|
117
|
+
"""Upgrade the database if needed. Uses a file lock to ensure
|
|
118
|
+
that only one process tries to upgrade the database at a time.
|
|
119
|
+
|
|
120
|
+
Args:
|
|
121
|
+
engine: SQLAlchemy engine for the database
|
|
122
|
+
section: Alembic section to upgrade (e.g., 'state_db' or 'spot_jobs_db')
|
|
123
|
+
target_revision: Target revision to upgrade to (e.g., '001')
|
|
124
|
+
"""
|
|
125
|
+
# set alembic logger to warning level
|
|
126
|
+
alembic_logger = logging.getLogger('alembic')
|
|
127
|
+
alembic_logger.setLevel(logging.WARNING)
|
|
128
|
+
|
|
129
|
+
alembic_config = get_alembic_config(engine, section)
|
|
130
|
+
|
|
131
|
+
# only acquire lock if db needs upgrade
|
|
132
|
+
if needs_upgrade(engine, section, target_revision):
|
|
133
|
+
with db_lock(section):
|
|
134
|
+
# check again if db needs upgrade in case another
|
|
135
|
+
# process upgraded it while we were waiting for the lock
|
|
136
|
+
if needs_upgrade(engine, section, target_revision):
|
|
137
|
+
alembic_command.upgrade(alembic_config, target_revision)
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"""Directory utilities."""
|
|
2
|
+
|
|
3
|
+
import os
|
|
4
|
+
|
|
5
|
+
# This file is in '<project_root>/sky/utils/directory_utils.py'
|
|
6
|
+
# So we need to go up 2 levels to get to the '<project_root>/sky' directory
|
|
7
|
+
SKY_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def get_sky_dir():
|
|
11
|
+
"""Get the sky root directory."""
|
|
12
|
+
return SKY_DIR
|
sky/utils/env_options.py
CHANGED
|
@@ -19,8 +19,21 @@ class Options(enum.Enum):
|
|
|
19
19
|
# will not be multiple identities, and skipping the check can increase
|
|
20
20
|
# robustness.
|
|
21
21
|
SKIP_CLOUD_IDENTITY_CHECK = ('SKYPILOT_SKIP_CLOUD_IDENTITY_CHECK', False)
|
|
22
|
+
# Internal: This environment variable is set to "true" by Buildkite
|
|
23
|
+
# agent when running tests. It is used to identify when SkyPilot is
|
|
24
|
+
# running in a Buildkite container environment, which requires special
|
|
25
|
+
# handling for networking between containers.
|
|
26
|
+
RUNNING_IN_BUILDKITE = ('BUILDKITE', False)
|
|
27
|
+
# Internal: This is used for testing to enable grpc for communication
|
|
28
|
+
# between the API server and the Skylet.
|
|
29
|
+
ENABLE_GRPC = ('SKYPILOT_ENABLE_GRPC', False)
|
|
30
|
+
# Allow all contexts for Kubernetes if allowed_contexts is not set in
|
|
31
|
+
# config.
|
|
32
|
+
ALLOW_ALL_KUBERNETES_CONTEXTS = ('SKYPILOT_ALLOW_ALL_KUBERNETES_CONTEXTS',
|
|
33
|
+
False)
|
|
22
34
|
|
|
23
35
|
def __init__(self, env_var: str, default: bool) -> None:
|
|
36
|
+
super().__init__()
|
|
24
37
|
self.env_var = env_var
|
|
25
38
|
self.default = default
|
|
26
39
|
|