skypilot-nightly 1.0.0.dev20250509__py3-none-any.whl → 1.0.0.dev20251107__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of skypilot-nightly might be problematic. Click here for more details.
- sky/__init__.py +22 -6
- sky/adaptors/aws.py +25 -7
- sky/adaptors/common.py +24 -1
- sky/adaptors/coreweave.py +278 -0
- sky/adaptors/do.py +8 -2
- sky/adaptors/hyperbolic.py +8 -0
- sky/adaptors/kubernetes.py +149 -18
- sky/adaptors/nebius.py +170 -17
- sky/adaptors/primeintellect.py +1 -0
- sky/adaptors/runpod.py +68 -0
- sky/adaptors/seeweb.py +167 -0
- sky/adaptors/shadeform.py +89 -0
- sky/admin_policy.py +187 -4
- sky/authentication.py +179 -225
- sky/backends/__init__.py +4 -2
- sky/backends/backend.py +22 -9
- sky/backends/backend_utils.py +1299 -380
- sky/backends/cloud_vm_ray_backend.py +1715 -518
- sky/backends/docker_utils.py +1 -1
- sky/backends/local_docker_backend.py +11 -6
- sky/backends/wheel_utils.py +37 -9
- sky/{clouds/service_catalog → catalog}/__init__.py +21 -19
- sky/{clouds/service_catalog → catalog}/aws_catalog.py +27 -8
- sky/{clouds/service_catalog → catalog}/azure_catalog.py +10 -7
- sky/{clouds/service_catalog → catalog}/common.py +89 -48
- sky/{clouds/service_catalog → catalog}/cudo_catalog.py +8 -5
- sky/{clouds/service_catalog → catalog}/data_fetchers/analyze.py +1 -1
- sky/{clouds/service_catalog → catalog}/data_fetchers/fetch_aws.py +30 -40
- sky/{clouds/service_catalog → catalog}/data_fetchers/fetch_cudo.py +38 -38
- sky/{clouds/service_catalog → catalog}/data_fetchers/fetch_gcp.py +42 -15
- sky/catalog/data_fetchers/fetch_hyperbolic.py +136 -0
- sky/{clouds/service_catalog → catalog}/data_fetchers/fetch_lambda_cloud.py +1 -0
- sky/catalog/data_fetchers/fetch_nebius.py +335 -0
- sky/catalog/data_fetchers/fetch_runpod.py +698 -0
- sky/catalog/data_fetchers/fetch_seeweb.py +329 -0
- sky/catalog/data_fetchers/fetch_shadeform.py +142 -0
- sky/{clouds/service_catalog → catalog}/data_fetchers/fetch_vast.py +1 -1
- sky/{clouds/service_catalog → catalog}/data_fetchers/fetch_vsphere.py +1 -1
- sky/{clouds/service_catalog → catalog}/do_catalog.py +5 -2
- sky/{clouds/service_catalog → catalog}/fluidstack_catalog.py +6 -3
- sky/{clouds/service_catalog → catalog}/gcp_catalog.py +41 -15
- sky/catalog/hyperbolic_catalog.py +136 -0
- sky/{clouds/service_catalog → catalog}/ibm_catalog.py +9 -6
- sky/{clouds/service_catalog → catalog}/kubernetes_catalog.py +36 -24
- sky/{clouds/service_catalog → catalog}/lambda_catalog.py +9 -6
- sky/{clouds/service_catalog → catalog}/nebius_catalog.py +9 -7
- sky/{clouds/service_catalog → catalog}/oci_catalog.py +9 -6
- sky/{clouds/service_catalog → catalog}/paperspace_catalog.py +5 -2
- sky/catalog/primeintellect_catalog.py +95 -0
- sky/{clouds/service_catalog → catalog}/runpod_catalog.py +11 -4
- sky/{clouds/service_catalog → catalog}/scp_catalog.py +9 -6
- sky/catalog/seeweb_catalog.py +184 -0
- sky/catalog/shadeform_catalog.py +165 -0
- sky/catalog/ssh_catalog.py +167 -0
- sky/{clouds/service_catalog → catalog}/vast_catalog.py +6 -3
- sky/{clouds/service_catalog → catalog}/vsphere_catalog.py +5 -2
- sky/check.py +491 -203
- sky/cli.py +5 -6005
- sky/client/{cli.py → cli/command.py} +2477 -1885
- sky/client/cli/deprecation_utils.py +99 -0
- sky/client/cli/flags.py +359 -0
- sky/client/cli/table_utils.py +320 -0
- sky/client/common.py +70 -32
- sky/client/oauth.py +82 -0
- sky/client/sdk.py +1203 -297
- sky/client/sdk_async.py +833 -0
- sky/client/service_account_auth.py +47 -0
- sky/cloud_stores.py +73 -0
- sky/clouds/__init__.py +13 -0
- sky/clouds/aws.py +358 -93
- sky/clouds/azure.py +105 -83
- sky/clouds/cloud.py +127 -36
- sky/clouds/cudo.py +68 -50
- sky/clouds/do.py +66 -48
- sky/clouds/fluidstack.py +63 -44
- sky/clouds/gcp.py +339 -110
- sky/clouds/hyperbolic.py +293 -0
- sky/clouds/ibm.py +70 -49
- sky/clouds/kubernetes.py +563 -162
- sky/clouds/lambda_cloud.py +74 -54
- sky/clouds/nebius.py +206 -80
- sky/clouds/oci.py +88 -66
- sky/clouds/paperspace.py +61 -44
- sky/clouds/primeintellect.py +317 -0
- sky/clouds/runpod.py +164 -74
- sky/clouds/scp.py +89 -83
- sky/clouds/seeweb.py +466 -0
- sky/clouds/shadeform.py +400 -0
- sky/clouds/ssh.py +263 -0
- sky/clouds/utils/aws_utils.py +10 -4
- sky/clouds/utils/gcp_utils.py +87 -11
- sky/clouds/utils/oci_utils.py +38 -14
- sky/clouds/utils/scp_utils.py +177 -124
- sky/clouds/vast.py +99 -77
- sky/clouds/vsphere.py +51 -40
- sky/core.py +349 -139
- sky/dag.py +15 -0
- sky/dashboard/out/404.html +1 -1
- sky/dashboard/out/_next/static/chunks/1141-e6aa9ab418717c59.js +11 -0
- sky/dashboard/out/_next/static/chunks/1272-1ef0bf0237faccdb.js +1 -0
- sky/dashboard/out/_next/static/chunks/1871-74503c8e80fd253b.js +6 -0
- sky/dashboard/out/_next/static/chunks/2260-7703229c33c5ebd5.js +1 -0
- sky/dashboard/out/_next/static/chunks/2350.fab69e61bac57b23.js +1 -0
- sky/dashboard/out/_next/static/chunks/2369.fc20f0c2c8ed9fe7.js +15 -0
- sky/dashboard/out/_next/static/chunks/2755.fff53c4a3fcae910.js +26 -0
- sky/dashboard/out/_next/static/chunks/3294.72362fa129305b19.js +1 -0
- sky/dashboard/out/_next/static/chunks/3785.ad6adaa2a0fa9768.js +1 -0
- sky/dashboard/out/_next/static/chunks/3850-ff4a9a69d978632b.js +1 -0
- sky/dashboard/out/_next/static/chunks/3937.210053269f121201.js +1 -0
- sky/dashboard/out/_next/static/chunks/4725.a830b5c9e7867c92.js +1 -0
- sky/dashboard/out/_next/static/chunks/4937.a2baa2df5572a276.js +15 -0
- sky/dashboard/out/_next/static/chunks/5739-d67458fcb1386c92.js +8 -0
- sky/dashboard/out/_next/static/chunks/6130-2be46d70a38f1e82.js +1 -0
- sky/dashboard/out/_next/static/chunks/616-3d59f75e2ccf9321.js +39 -0
- sky/dashboard/out/_next/static/chunks/6212-7bd06f60ba693125.js +13 -0
- sky/dashboard/out/_next/static/chunks/6601-06114c982db410b6.js +1 -0
- sky/dashboard/out/_next/static/chunks/6856-ef8ba11f96d8c4a3.js +1 -0
- sky/dashboard/out/_next/static/chunks/6989-01359c57e018caa4.js +1 -0
- sky/dashboard/out/_next/static/chunks/6990-32b6e2d3822301fa.js +1 -0
- sky/dashboard/out/_next/static/chunks/7359-c8d04e06886000b3.js +30 -0
- sky/dashboard/out/_next/static/chunks/7411-b15471acd2cba716.js +41 -0
- sky/dashboard/out/_next/static/chunks/7615-3301e838e5f25772.js +1 -0
- sky/dashboard/out/_next/static/chunks/8640.5b9475a2d18c5416.js +16 -0
- sky/dashboard/out/_next/static/chunks/8969-1e4613c651bf4051.js +1 -0
- sky/dashboard/out/_next/static/chunks/9025.fa408f3242e9028d.js +6 -0
- sky/dashboard/out/_next/static/chunks/9353-cff34f7e773b2e2b.js +1 -0
- sky/dashboard/out/_next/static/chunks/9360.7310982cf5a0dc79.js +31 -0
- sky/dashboard/out/_next/static/chunks/9847.3aaca6bb33455140.js +30 -0
- sky/dashboard/out/_next/static/chunks/fd9d1056-86323a29a8f7e46a.js +1 -0
- sky/dashboard/out/_next/static/chunks/framework-cf60a09ccd051a10.js +33 -0
- sky/dashboard/out/_next/static/chunks/main-app-587214043926b3cc.js +1 -0
- sky/dashboard/out/_next/static/chunks/main-f15ccb73239a3bf1.js +1 -0
- sky/dashboard/out/_next/static/chunks/pages/_app-bde01e4a2beec258.js +34 -0
- sky/dashboard/out/_next/static/chunks/pages/_error-c66a4e8afc46f17b.js +1 -0
- sky/dashboard/out/_next/static/chunks/pages/clusters/[cluster]/[job]-c736ead69c2d86ec.js +16 -0
- sky/dashboard/out/_next/static/chunks/pages/clusters/[cluster]-a37d2063af475a1c.js +1 -0
- sky/dashboard/out/_next/static/chunks/pages/clusters-d44859594e6f8064.js +1 -0
- sky/dashboard/out/_next/static/chunks/pages/config-dfb9bf07b13045f4.js +1 -0
- sky/dashboard/out/_next/static/chunks/pages/index-444f1804401f04ea.js +1 -0
- sky/dashboard/out/_next/static/chunks/pages/infra/[context]-c0b5935149902e6f.js +1 -0
- sky/dashboard/out/_next/static/chunks/pages/infra-aed0ea19df7cf961.js +1 -0
- sky/dashboard/out/_next/static/chunks/pages/jobs/[job]-5796e8d6aea291a0.js +16 -0
- sky/dashboard/out/_next/static/chunks/pages/jobs/pools/[pool]-6edeb7d06032adfc.js +21 -0
- sky/dashboard/out/_next/static/chunks/pages/jobs-479dde13399cf270.js +1 -0
- sky/dashboard/out/_next/static/chunks/pages/users-5ab3b907622cf0fe.js +1 -0
- sky/dashboard/out/_next/static/chunks/pages/volumes-b84b948ff357c43e.js +1 -0
- sky/dashboard/out/_next/static/chunks/pages/workspace/new-3f88a1c7e86a3f86.js +1 -0
- sky/dashboard/out/_next/static/chunks/pages/workspaces/[name]-c5a3eeee1c218af1.js +1 -0
- sky/dashboard/out/_next/static/chunks/pages/workspaces-22b23febb3e89ce1.js +1 -0
- sky/dashboard/out/_next/static/chunks/webpack-2679be77fc08a2f8.js +1 -0
- sky/dashboard/out/_next/static/css/0748ce22df867032.css +3 -0
- sky/dashboard/out/_next/static/zB0ed6ge_W1MDszVHhijS/_buildManifest.js +1 -0
- sky/dashboard/out/clusters/[cluster]/[job].html +1 -1
- sky/dashboard/out/clusters/[cluster].html +1 -1
- sky/dashboard/out/clusters.html +1 -1
- sky/dashboard/out/config.html +1 -0
- sky/dashboard/out/index.html +1 -1
- sky/dashboard/out/infra/[context].html +1 -0
- sky/dashboard/out/infra.html +1 -0
- sky/dashboard/out/jobs/[job].html +1 -1
- sky/dashboard/out/jobs/pools/[pool].html +1 -0
- sky/dashboard/out/jobs.html +1 -1
- sky/dashboard/out/users.html +1 -0
- sky/dashboard/out/volumes.html +1 -0
- sky/dashboard/out/workspace/new.html +1 -0
- sky/dashboard/out/workspaces/[name].html +1 -0
- sky/dashboard/out/workspaces.html +1 -0
- sky/data/data_utils.py +137 -1
- sky/data/mounting_utils.py +269 -84
- sky/data/storage.py +1451 -1807
- sky/data/storage_utils.py +43 -57
- sky/exceptions.py +132 -2
- sky/execution.py +206 -63
- sky/global_user_state.py +2374 -586
- sky/jobs/__init__.py +5 -0
- sky/jobs/client/sdk.py +242 -65
- sky/jobs/client/sdk_async.py +143 -0
- sky/jobs/constants.py +9 -8
- sky/jobs/controller.py +839 -277
- sky/jobs/file_content_utils.py +80 -0
- sky/jobs/log_gc.py +201 -0
- sky/jobs/recovery_strategy.py +398 -152
- sky/jobs/scheduler.py +315 -189
- sky/jobs/server/core.py +829 -255
- sky/jobs/server/server.py +156 -115
- sky/jobs/server/utils.py +136 -0
- sky/jobs/state.py +2092 -701
- sky/jobs/utils.py +1242 -160
- sky/logs/__init__.py +21 -0
- sky/logs/agent.py +108 -0
- sky/logs/aws.py +243 -0
- sky/logs/gcp.py +91 -0
- sky/metrics/__init__.py +0 -0
- sky/metrics/utils.py +443 -0
- sky/models.py +78 -1
- sky/optimizer.py +164 -70
- sky/provision/__init__.py +90 -4
- sky/provision/aws/config.py +147 -26
- sky/provision/aws/instance.py +135 -50
- sky/provision/azure/instance.py +10 -5
- sky/provision/common.py +13 -1
- sky/provision/cudo/cudo_machine_type.py +1 -1
- sky/provision/cudo/cudo_utils.py +14 -8
- sky/provision/cudo/cudo_wrapper.py +72 -71
- sky/provision/cudo/instance.py +10 -6
- sky/provision/do/instance.py +10 -6
- sky/provision/do/utils.py +4 -3
- sky/provision/docker_utils.py +114 -23
- sky/provision/fluidstack/instance.py +13 -8
- sky/provision/gcp/__init__.py +1 -0
- sky/provision/gcp/config.py +301 -19
- sky/provision/gcp/constants.py +218 -0
- sky/provision/gcp/instance.py +36 -8
- sky/provision/gcp/instance_utils.py +18 -4
- sky/provision/gcp/volume_utils.py +247 -0
- sky/provision/hyperbolic/__init__.py +12 -0
- sky/provision/hyperbolic/config.py +10 -0
- sky/provision/hyperbolic/instance.py +437 -0
- sky/provision/hyperbolic/utils.py +373 -0
- sky/provision/instance_setup.py +93 -14
- sky/provision/kubernetes/__init__.py +5 -0
- sky/provision/kubernetes/config.py +9 -52
- sky/provision/kubernetes/constants.py +17 -0
- sky/provision/kubernetes/instance.py +789 -247
- sky/provision/kubernetes/manifests/fusermount-server-daemonset.yaml +1 -2
- sky/provision/kubernetes/network.py +27 -17
- sky/provision/kubernetes/network_utils.py +40 -43
- sky/provision/kubernetes/utils.py +1192 -531
- sky/provision/kubernetes/volume.py +282 -0
- sky/provision/lambda_cloud/instance.py +22 -16
- sky/provision/nebius/constants.py +50 -0
- sky/provision/nebius/instance.py +19 -6
- sky/provision/nebius/utils.py +196 -91
- sky/provision/oci/instance.py +10 -5
- sky/provision/paperspace/instance.py +10 -7
- sky/provision/paperspace/utils.py +1 -1
- sky/provision/primeintellect/__init__.py +10 -0
- sky/provision/primeintellect/config.py +11 -0
- sky/provision/primeintellect/instance.py +454 -0
- sky/provision/primeintellect/utils.py +398 -0
- sky/provision/provisioner.py +110 -36
- sky/provision/runpod/__init__.py +5 -0
- sky/provision/runpod/instance.py +27 -6
- sky/provision/runpod/utils.py +51 -18
- sky/provision/runpod/volume.py +180 -0
- sky/provision/scp/__init__.py +15 -0
- sky/provision/scp/config.py +93 -0
- sky/provision/scp/instance.py +531 -0
- sky/provision/seeweb/__init__.py +11 -0
- sky/provision/seeweb/config.py +13 -0
- sky/provision/seeweb/instance.py +807 -0
- sky/provision/shadeform/__init__.py +11 -0
- sky/provision/shadeform/config.py +12 -0
- sky/provision/shadeform/instance.py +351 -0
- sky/provision/shadeform/shadeform_utils.py +83 -0
- sky/provision/ssh/__init__.py +18 -0
- sky/provision/vast/instance.py +13 -8
- sky/provision/vast/utils.py +10 -7
- sky/provision/vsphere/common/vim_utils.py +1 -2
- sky/provision/vsphere/instance.py +15 -10
- sky/provision/vsphere/vsphere_utils.py +9 -19
- sky/py.typed +0 -0
- sky/resources.py +844 -118
- sky/schemas/__init__.py +0 -0
- sky/schemas/api/__init__.py +0 -0
- sky/schemas/api/responses.py +225 -0
- sky/schemas/db/README +4 -0
- sky/schemas/db/env.py +90 -0
- sky/schemas/db/global_user_state/001_initial_schema.py +124 -0
- sky/schemas/db/global_user_state/002_add_workspace_to_cluster_history.py +35 -0
- sky/schemas/db/global_user_state/003_fix_initial_revision.py +61 -0
- sky/schemas/db/global_user_state/004_is_managed.py +34 -0
- sky/schemas/db/global_user_state/005_cluster_event.py +32 -0
- sky/schemas/db/global_user_state/006_provision_log.py +41 -0
- sky/schemas/db/global_user_state/007_cluster_event_request_id.py +34 -0
- sky/schemas/db/global_user_state/008_skylet_ssh_tunnel_metadata.py +34 -0
- sky/schemas/db/global_user_state/009_last_activity_and_launched_at.py +89 -0
- sky/schemas/db/global_user_state/010_save_ssh_key.py +66 -0
- sky/schemas/db/script.py.mako +28 -0
- sky/schemas/db/serve_state/001_initial_schema.py +67 -0
- sky/schemas/db/skypilot_config/001_initial_schema.py +30 -0
- sky/schemas/db/spot_jobs/001_initial_schema.py +97 -0
- sky/schemas/db/spot_jobs/002_cluster_pool.py +42 -0
- sky/schemas/db/spot_jobs/003_pool_hash.py +34 -0
- sky/schemas/db/spot_jobs/004_job_file_contents.py +42 -0
- sky/schemas/db/spot_jobs/005_logs_gc.py +38 -0
- sky/schemas/generated/__init__.py +0 -0
- sky/schemas/generated/autostopv1_pb2.py +36 -0
- sky/schemas/generated/autostopv1_pb2.pyi +43 -0
- sky/schemas/generated/autostopv1_pb2_grpc.py +146 -0
- sky/schemas/generated/jobsv1_pb2.py +86 -0
- sky/schemas/generated/jobsv1_pb2.pyi +254 -0
- sky/schemas/generated/jobsv1_pb2_grpc.py +542 -0
- sky/schemas/generated/managed_jobsv1_pb2.py +74 -0
- sky/schemas/generated/managed_jobsv1_pb2.pyi +278 -0
- sky/schemas/generated/managed_jobsv1_pb2_grpc.py +278 -0
- sky/schemas/generated/servev1_pb2.py +58 -0
- sky/schemas/generated/servev1_pb2.pyi +115 -0
- sky/schemas/generated/servev1_pb2_grpc.py +322 -0
- sky/serve/autoscalers.py +357 -5
- sky/serve/client/impl.py +310 -0
- sky/serve/client/sdk.py +47 -139
- sky/serve/client/sdk_async.py +130 -0
- sky/serve/constants.py +10 -8
- sky/serve/controller.py +64 -19
- sky/serve/load_balancer.py +106 -60
- sky/serve/load_balancing_policies.py +115 -1
- sky/serve/replica_managers.py +273 -162
- sky/serve/serve_rpc_utils.py +179 -0
- sky/serve/serve_state.py +554 -251
- sky/serve/serve_utils.py +733 -220
- sky/serve/server/core.py +66 -711
- sky/serve/server/impl.py +1093 -0
- sky/serve/server/server.py +21 -18
- sky/serve/service.py +133 -48
- sky/serve/service_spec.py +135 -16
- sky/serve/spot_placer.py +3 -0
- sky/server/auth/__init__.py +0 -0
- sky/server/auth/authn.py +50 -0
- sky/server/auth/loopback.py +38 -0
- sky/server/auth/oauth2_proxy.py +200 -0
- sky/server/common.py +475 -181
- sky/server/config.py +81 -23
- sky/server/constants.py +44 -6
- sky/server/daemons.py +229 -0
- sky/server/html/token_page.html +185 -0
- sky/server/metrics.py +160 -0
- sky/server/requests/executor.py +528 -138
- sky/server/requests/payloads.py +351 -17
- sky/server/requests/preconditions.py +21 -17
- sky/server/requests/process.py +112 -29
- sky/server/requests/request_names.py +120 -0
- sky/server/requests/requests.py +817 -224
- sky/server/requests/serializers/decoders.py +82 -31
- sky/server/requests/serializers/encoders.py +140 -22
- sky/server/requests/threads.py +106 -0
- sky/server/rest.py +417 -0
- sky/server/server.py +1290 -284
- sky/server/state.py +20 -0
- sky/server/stream_utils.py +345 -57
- sky/server/uvicorn.py +217 -3
- sky/server/versions.py +270 -0
- sky/setup_files/MANIFEST.in +5 -0
- sky/setup_files/alembic.ini +156 -0
- sky/setup_files/dependencies.py +136 -31
- sky/setup_files/setup.py +44 -42
- sky/sky_logging.py +102 -5
- sky/skylet/attempt_skylet.py +1 -0
- sky/skylet/autostop_lib.py +129 -8
- sky/skylet/configs.py +27 -20
- sky/skylet/constants.py +171 -19
- sky/skylet/events.py +105 -21
- sky/skylet/job_lib.py +335 -104
- sky/skylet/log_lib.py +297 -18
- sky/skylet/log_lib.pyi +44 -1
- sky/skylet/ray_patches/__init__.py +17 -3
- sky/skylet/ray_patches/autoscaler.py.diff +18 -0
- sky/skylet/ray_patches/cli.py.diff +19 -0
- sky/skylet/ray_patches/command_runner.py.diff +17 -0
- sky/skylet/ray_patches/log_monitor.py.diff +20 -0
- sky/skylet/ray_patches/resource_demand_scheduler.py.diff +32 -0
- sky/skylet/ray_patches/updater.py.diff +18 -0
- sky/skylet/ray_patches/worker.py.diff +41 -0
- sky/skylet/services.py +564 -0
- sky/skylet/skylet.py +63 -4
- sky/skylet/subprocess_daemon.py +103 -29
- sky/skypilot_config.py +506 -99
- sky/ssh_node_pools/__init__.py +1 -0
- sky/ssh_node_pools/core.py +135 -0
- sky/ssh_node_pools/server.py +233 -0
- sky/task.py +621 -137
- sky/templates/aws-ray.yml.j2 +10 -3
- sky/templates/azure-ray.yml.j2 +1 -1
- sky/templates/do-ray.yml.j2 +1 -1
- sky/templates/gcp-ray.yml.j2 +57 -0
- sky/templates/hyperbolic-ray.yml.j2 +67 -0
- sky/templates/jobs-controller.yaml.j2 +27 -24
- sky/templates/kubernetes-loadbalancer.yml.j2 +2 -0
- sky/templates/kubernetes-ray.yml.j2 +607 -51
- sky/templates/lambda-ray.yml.j2 +1 -1
- sky/templates/nebius-ray.yml.j2 +33 -12
- sky/templates/paperspace-ray.yml.j2 +1 -1
- sky/templates/primeintellect-ray.yml.j2 +71 -0
- sky/templates/runpod-ray.yml.j2 +9 -1
- sky/templates/scp-ray.yml.j2 +3 -50
- sky/templates/seeweb-ray.yml.j2 +108 -0
- sky/templates/shadeform-ray.yml.j2 +72 -0
- sky/templates/sky-serve-controller.yaml.j2 +22 -2
- sky/templates/websocket_proxy.py +178 -18
- sky/usage/usage_lib.py +18 -11
- sky/users/__init__.py +0 -0
- sky/users/model.conf +15 -0
- sky/users/permission.py +387 -0
- sky/users/rbac.py +121 -0
- sky/users/server.py +720 -0
- sky/users/token_service.py +218 -0
- sky/utils/accelerator_registry.py +34 -5
- sky/utils/admin_policy_utils.py +84 -38
- sky/utils/annotations.py +16 -5
- sky/utils/asyncio_utils.py +78 -0
- sky/utils/auth_utils.py +153 -0
- sky/utils/benchmark_utils.py +60 -0
- sky/utils/cli_utils/status_utils.py +159 -86
- sky/utils/cluster_utils.py +31 -9
- sky/utils/command_runner.py +354 -68
- sky/utils/command_runner.pyi +93 -3
- sky/utils/common.py +35 -8
- sky/utils/common_utils.py +310 -87
- sky/utils/config_utils.py +87 -5
- sky/utils/context.py +402 -0
- sky/utils/context_utils.py +222 -0
- sky/utils/controller_utils.py +264 -89
- sky/utils/dag_utils.py +31 -12
- sky/utils/db/__init__.py +0 -0
- sky/utils/db/db_utils.py +470 -0
- sky/utils/db/migration_utils.py +133 -0
- sky/utils/directory_utils.py +12 -0
- sky/utils/env_options.py +13 -0
- sky/utils/git.py +567 -0
- sky/utils/git_clone.sh +460 -0
- sky/utils/infra_utils.py +195 -0
- sky/utils/kubernetes/cleanup-tunnel.sh +62 -0
- sky/utils/kubernetes/config_map_utils.py +133 -0
- sky/utils/kubernetes/create_cluster.sh +13 -27
- sky/utils/kubernetes/delete_cluster.sh +10 -7
- sky/utils/kubernetes/deploy_remote_cluster.py +1299 -0
- sky/utils/kubernetes/exec_kubeconfig_converter.py +22 -31
- sky/utils/kubernetes/generate_kind_config.py +6 -66
- sky/utils/kubernetes/generate_kubeconfig.sh +4 -1
- sky/utils/kubernetes/gpu_labeler.py +5 -5
- sky/utils/kubernetes/kubernetes_deploy_utils.py +354 -47
- sky/utils/kubernetes/ssh-tunnel.sh +379 -0
- sky/utils/kubernetes/ssh_utils.py +221 -0
- sky/utils/kubernetes_enums.py +8 -15
- sky/utils/lock_events.py +94 -0
- sky/utils/locks.py +368 -0
- sky/utils/log_utils.py +300 -6
- sky/utils/perf_utils.py +22 -0
- sky/utils/resource_checker.py +298 -0
- sky/utils/resources_utils.py +249 -32
- sky/utils/rich_utils.py +213 -37
- sky/utils/schemas.py +905 -147
- sky/utils/serialize_utils.py +16 -0
- sky/utils/status_lib.py +10 -0
- sky/utils/subprocess_utils.py +38 -15
- sky/utils/tempstore.py +70 -0
- sky/utils/timeline.py +24 -52
- sky/utils/ux_utils.py +84 -15
- sky/utils/validator.py +11 -1
- sky/utils/volume.py +86 -0
- sky/utils/yaml_utils.py +111 -0
- sky/volumes/__init__.py +13 -0
- sky/volumes/client/__init__.py +0 -0
- sky/volumes/client/sdk.py +149 -0
- sky/volumes/server/__init__.py +0 -0
- sky/volumes/server/core.py +258 -0
- sky/volumes/server/server.py +122 -0
- sky/volumes/volume.py +212 -0
- sky/workspaces/__init__.py +0 -0
- sky/workspaces/core.py +655 -0
- sky/workspaces/server.py +101 -0
- sky/workspaces/utils.py +56 -0
- skypilot_nightly-1.0.0.dev20251107.dist-info/METADATA +675 -0
- skypilot_nightly-1.0.0.dev20251107.dist-info/RECORD +594 -0
- {skypilot_nightly-1.0.0.dev20250509.dist-info → skypilot_nightly-1.0.0.dev20251107.dist-info}/WHEEL +1 -1
- sky/benchmark/benchmark_state.py +0 -256
- sky/benchmark/benchmark_utils.py +0 -641
- sky/clouds/service_catalog/constants.py +0 -7
- sky/dashboard/out/_next/static/LksQgChY5izXjokL3LcEu/_buildManifest.js +0 -1
- sky/dashboard/out/_next/static/chunks/236-f49500b82ad5392d.js +0 -6
- sky/dashboard/out/_next/static/chunks/312-c3c8845990db8ffc.js +0 -15
- sky/dashboard/out/_next/static/chunks/37-0a572fe0dbb89c4d.js +0 -6
- sky/dashboard/out/_next/static/chunks/678-206dddca808e6d16.js +0 -59
- sky/dashboard/out/_next/static/chunks/845-0f8017370869e269.js +0 -1
- sky/dashboard/out/_next/static/chunks/979-7bf73a4c7cea0f5c.js +0 -1
- sky/dashboard/out/_next/static/chunks/fd9d1056-2821b0f0cabcd8bd.js +0 -1
- sky/dashboard/out/_next/static/chunks/framework-87d061ee6ed71b28.js +0 -33
- sky/dashboard/out/_next/static/chunks/main-app-241eb28595532291.js +0 -1
- sky/dashboard/out/_next/static/chunks/main-e0e2335212e72357.js +0 -1
- sky/dashboard/out/_next/static/chunks/pages/_app-e6b013bc3f77ad60.js +0 -1
- sky/dashboard/out/_next/static/chunks/pages/_error-1be831200e60c5c0.js +0 -1
- sky/dashboard/out/_next/static/chunks/pages/clusters/[cluster]/[job]-e15db85d0ea1fbe1.js +0 -1
- sky/dashboard/out/_next/static/chunks/pages/clusters/[cluster]-f383db7389368ea7.js +0 -1
- sky/dashboard/out/_next/static/chunks/pages/clusters-a93b93e10b8b074e.js +0 -1
- sky/dashboard/out/_next/static/chunks/pages/index-f9f039532ca8cbc4.js +0 -1
- sky/dashboard/out/_next/static/chunks/pages/jobs/[job]-03f279c6741fb48b.js +0 -1
- sky/dashboard/out/_next/static/chunks/pages/jobs-a75029b67aab6a2e.js +0 -1
- sky/dashboard/out/_next/static/chunks/webpack-830f59b8404e96b8.js +0 -1
- sky/dashboard/out/_next/static/css/c6933bbb2ce7f4dd.css +0 -3
- sky/jobs/dashboard/dashboard.py +0 -223
- sky/jobs/dashboard/static/favicon.ico +0 -0
- sky/jobs/dashboard/templates/index.html +0 -831
- sky/jobs/server/dashboard_utils.py +0 -69
- sky/skylet/providers/scp/__init__.py +0 -2
- sky/skylet/providers/scp/config.py +0 -149
- sky/skylet/providers/scp/node_provider.py +0 -578
- sky/templates/kubernetes-ssh-jump.yml.j2 +0 -94
- sky/utils/db_utils.py +0 -100
- sky/utils/kubernetes/deploy_remote_cluster.sh +0 -308
- sky/utils/kubernetes/ssh_jump_lifecycle_manager.py +0 -191
- skypilot_nightly-1.0.0.dev20250509.dist-info/METADATA +0 -361
- skypilot_nightly-1.0.0.dev20250509.dist-info/RECORD +0 -396
- /sky/{clouds/service_catalog → catalog}/config.py +0 -0
- /sky/{benchmark → catalog/data_fetchers}/__init__.py +0 -0
- /sky/{clouds/service_catalog → catalog}/data_fetchers/fetch_azure.py +0 -0
- /sky/{clouds/service_catalog → catalog}/data_fetchers/fetch_fluidstack.py +0 -0
- /sky/{clouds/service_catalog → catalog}/data_fetchers/fetch_ibm.py +0 -0
- /sky/{clouds/service_catalog/data_fetchers → client/cli}/__init__.py +0 -0
- /sky/dashboard/out/_next/static/{LksQgChY5izXjokL3LcEu → zB0ed6ge_W1MDszVHhijS}/_ssgManifest.js +0 -0
- {skypilot_nightly-1.0.0.dev20250509.dist-info → skypilot_nightly-1.0.0.dev20251107.dist-info}/entry_points.txt +0 -0
- {skypilot_nightly-1.0.0.dev20250509.dist-info → skypilot_nightly-1.0.0.dev20251107.dist-info}/licenses/LICENSE +0 -0
- {skypilot_nightly-1.0.0.dev20250509.dist-info → skypilot_nightly-1.0.0.dev20251107.dist-info}/top_level.txt +0 -0
sky/templates/websocket_proxy.py
CHANGED
|
@@ -11,18 +11,41 @@ This script is useful for users who do not have local Kubernetes credentials.
|
|
|
11
11
|
import asyncio
|
|
12
12
|
from http.cookiejar import MozillaCookieJar
|
|
13
13
|
import os
|
|
14
|
+
import struct
|
|
14
15
|
import sys
|
|
15
|
-
|
|
16
|
+
import time
|
|
17
|
+
from typing import Dict, Optional
|
|
16
18
|
from urllib.request import Request
|
|
17
19
|
|
|
20
|
+
import requests
|
|
18
21
|
import websockets
|
|
22
|
+
from websockets.asyncio.client import ClientConnection
|
|
19
23
|
from websockets.asyncio.client import connect
|
|
20
24
|
|
|
25
|
+
from sky.server import constants
|
|
26
|
+
from sky.server.server import KubernetesSSHMessageType
|
|
27
|
+
from sky.skylet import constants as skylet_constants
|
|
28
|
+
|
|
29
|
+
BUFFER_SIZE = 2**16 # 64KB
|
|
30
|
+
HEARTBEAT_INTERVAL_SECONDS = 10
|
|
31
|
+
|
|
32
|
+
# Environment variable for a file path to the API cookie file.
|
|
33
|
+
# Keep in sync with server/constants.py
|
|
34
|
+
API_COOKIE_FILE_ENV_VAR = 'SKYPILOT_API_COOKIE_FILE'
|
|
35
|
+
# Default file if unset.
|
|
36
|
+
# Keep in sync with server/constants.py
|
|
37
|
+
API_COOKIE_FILE_DEFAULT_LOCATION = '~/.sky/cookies.txt'
|
|
38
|
+
|
|
39
|
+
MAX_UNANSWERED_PINGS = 100
|
|
40
|
+
|
|
21
41
|
|
|
22
42
|
def _get_cookie_header(url: str) -> Dict[str, str]:
|
|
23
43
|
"""Extract Cookie header value from a cookie jar for a specific URL"""
|
|
24
|
-
cookie_path = os.environ.get(
|
|
44
|
+
cookie_path = os.environ.get(API_COOKIE_FILE_ENV_VAR)
|
|
25
45
|
if cookie_path is None:
|
|
46
|
+
cookie_path = API_COOKIE_FILE_DEFAULT_LOCATION
|
|
47
|
+
cookie_path = os.path.expanduser(cookie_path)
|
|
48
|
+
if not os.path.exists(cookie_path):
|
|
26
49
|
return {}
|
|
27
50
|
|
|
28
51
|
request = Request(url)
|
|
@@ -36,7 +59,7 @@ def _get_cookie_header(url: str) -> Dict[str, str]:
|
|
|
36
59
|
return {'Cookie': cookie_header}
|
|
37
60
|
|
|
38
61
|
|
|
39
|
-
async def main(url: str) -> None:
|
|
62
|
+
async def main(url: str, timestamps_supported: bool) -> None:
|
|
40
63
|
cookie_header = _get_cookie_header(url)
|
|
41
64
|
async with connect(url,
|
|
42
65
|
ping_interval=None,
|
|
@@ -51,39 +74,160 @@ async def main(url: str) -> None:
|
|
|
51
74
|
old_settings = None
|
|
52
75
|
|
|
53
76
|
try:
|
|
54
|
-
|
|
55
|
-
|
|
77
|
+
loop = asyncio.get_running_loop()
|
|
78
|
+
# Use asyncio.Stream primitives to wrap stdin and stdout, this is to
|
|
79
|
+
# avoid creating a new thread for each read/write operation
|
|
80
|
+
# excessively.
|
|
81
|
+
stdin_reader = asyncio.StreamReader()
|
|
82
|
+
protocol = asyncio.StreamReaderProtocol(stdin_reader)
|
|
83
|
+
await loop.connect_read_pipe(lambda: protocol, sys.stdin)
|
|
84
|
+
transport, protocol = await loop.connect_write_pipe(
|
|
85
|
+
asyncio.streams.FlowControlMixin, sys.stdout) # type: ignore
|
|
86
|
+
stdout_writer = asyncio.StreamWriter(transport, protocol, None,
|
|
87
|
+
loop)
|
|
88
|
+
# Dictionary to store last ping time for latency measurement
|
|
89
|
+
last_ping_time_dict: Optional[Dict[int, float]] = None
|
|
90
|
+
if timestamps_supported:
|
|
91
|
+
last_ping_time_dict = {}
|
|
92
|
+
|
|
93
|
+
# Use an Event to signal when websocket is closed
|
|
94
|
+
websocket_closed_event = asyncio.Event()
|
|
95
|
+
websocket_lock = asyncio.Lock()
|
|
96
|
+
|
|
97
|
+
await asyncio.gather(
|
|
98
|
+
stdin_to_websocket(stdin_reader, websocket,
|
|
99
|
+
timestamps_supported, websocket_closed_event,
|
|
100
|
+
websocket_lock),
|
|
101
|
+
websocket_to_stdout(websocket, stdout_writer,
|
|
102
|
+
timestamps_supported, last_ping_time_dict,
|
|
103
|
+
websocket_closed_event, websocket_lock),
|
|
104
|
+
latency_monitor(websocket, last_ping_time_dict,
|
|
105
|
+
websocket_closed_event, websocket_lock),
|
|
106
|
+
return_exceptions=True)
|
|
56
107
|
finally:
|
|
57
108
|
if old_settings:
|
|
58
109
|
termios.tcsetattr(sys.stdin.fileno(), termios.TCSADRAIN,
|
|
59
110
|
old_settings)
|
|
60
111
|
|
|
61
112
|
|
|
62
|
-
async def
|
|
113
|
+
async def latency_monitor(websocket: ClientConnection,
|
|
114
|
+
last_ping_time_dict: Optional[dict],
|
|
115
|
+
websocket_closed_event: asyncio.Event,
|
|
116
|
+
websocket_lock: asyncio.Lock):
|
|
117
|
+
"""Periodically send PING messages (type 1) to measure latency."""
|
|
118
|
+
if last_ping_time_dict is None:
|
|
119
|
+
return
|
|
120
|
+
next_id = 0
|
|
121
|
+
while not websocket_closed_event.is_set():
|
|
122
|
+
try:
|
|
123
|
+
await asyncio.sleep(HEARTBEAT_INTERVAL_SECONDS)
|
|
124
|
+
if len(last_ping_time_dict) >= MAX_UNANSWERED_PINGS:
|
|
125
|
+
# We are not getting responses, clear the dictionary so
|
|
126
|
+
# as not to grow unbounded.
|
|
127
|
+
last_ping_time_dict.clear()
|
|
128
|
+
ping_time = time.time()
|
|
129
|
+
next_id += 1
|
|
130
|
+
last_ping_time_dict[next_id] = ping_time
|
|
131
|
+
message_header_bytes = struct.pack(
|
|
132
|
+
'!BI', KubernetesSSHMessageType.PINGPONG.value, next_id)
|
|
133
|
+
try:
|
|
134
|
+
async with websocket_lock:
|
|
135
|
+
await websocket.send(message_header_bytes)
|
|
136
|
+
except websockets.exceptions.ConnectionClosed as e:
|
|
137
|
+
# Websocket is already closed.
|
|
138
|
+
print(f'Failed to send PING message: {e}', file=sys.stderr)
|
|
139
|
+
break
|
|
140
|
+
except Exception as e:
|
|
141
|
+
print(f'Error in latency_monitor: {e}', file=sys.stderr)
|
|
142
|
+
websocket_closed_event.set()
|
|
143
|
+
raise e
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
async def stdin_to_websocket(reader: asyncio.StreamReader,
|
|
147
|
+
websocket: ClientConnection,
|
|
148
|
+
timestamps_supported: bool,
|
|
149
|
+
websocket_closed_event: asyncio.Event,
|
|
150
|
+
websocket_lock: asyncio.Lock):
|
|
63
151
|
try:
|
|
64
|
-
while
|
|
65
|
-
|
|
66
|
-
|
|
152
|
+
while not websocket_closed_event.is_set():
|
|
153
|
+
# Read at most BUFFER_SIZE bytes, this not affect
|
|
154
|
+
# responsiveness since it will return as soon as
|
|
155
|
+
# there is at least one byte.
|
|
156
|
+
# The BUFFER_SIZE is chosen to be large enough to improve
|
|
157
|
+
# throughput.
|
|
158
|
+
data = await reader.read(BUFFER_SIZE)
|
|
159
|
+
|
|
67
160
|
if not data:
|
|
68
161
|
break
|
|
69
|
-
|
|
162
|
+
if timestamps_supported:
|
|
163
|
+
# Send message with type 0 to indicate data.
|
|
164
|
+
message_type_bytes = struct.pack(
|
|
165
|
+
'!B', KubernetesSSHMessageType.REGULAR_DATA.value)
|
|
166
|
+
data = message_type_bytes + data
|
|
167
|
+
async with websocket_lock:
|
|
168
|
+
await websocket.send(data)
|
|
169
|
+
|
|
70
170
|
except Exception as e: # pylint: disable=broad-except
|
|
71
171
|
print(f'Error in stdin_to_websocket: {e}', file=sys.stderr)
|
|
72
172
|
finally:
|
|
73
|
-
|
|
173
|
+
async with websocket_lock:
|
|
174
|
+
await websocket.close()
|
|
175
|
+
websocket_closed_event.set()
|
|
74
176
|
|
|
75
177
|
|
|
76
|
-
async def websocket_to_stdout(websocket
|
|
178
|
+
async def websocket_to_stdout(websocket: ClientConnection,
|
|
179
|
+
writer: asyncio.StreamWriter,
|
|
180
|
+
timestamps_supported: bool,
|
|
181
|
+
last_ping_time_dict: Optional[dict],
|
|
182
|
+
websocket_closed_event: asyncio.Event,
|
|
183
|
+
websocket_lock: asyncio.Lock):
|
|
77
184
|
try:
|
|
78
|
-
while
|
|
185
|
+
while not websocket_closed_event.is_set():
|
|
79
186
|
message = await websocket.recv()
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
187
|
+
if (timestamps_supported and len(message) > 0 and
|
|
188
|
+
last_ping_time_dict is not None):
|
|
189
|
+
message_type = struct.unpack('!B', message[:1])[0]
|
|
190
|
+
if message_type == KubernetesSSHMessageType.REGULAR_DATA.value:
|
|
191
|
+
# Regular data - strip type byte and write to stdout
|
|
192
|
+
message = message[1:]
|
|
193
|
+
elif message_type == KubernetesSSHMessageType.PINGPONG.value:
|
|
194
|
+
# PONG response - calculate latency and send measurement
|
|
195
|
+
if not len(message) == struct.calcsize('!BI'):
|
|
196
|
+
raise ValueError(
|
|
197
|
+
f'Invalid PONG message length: {len(message)}')
|
|
198
|
+
pong_id = struct.unpack('!I', message[1:5])[0]
|
|
199
|
+
pong_time = time.time()
|
|
200
|
+
|
|
201
|
+
ping_time = last_ping_time_dict.pop(pong_id, None)
|
|
202
|
+
|
|
203
|
+
if ping_time is None:
|
|
204
|
+
continue
|
|
205
|
+
|
|
206
|
+
latency_seconds = pong_time - ping_time
|
|
207
|
+
latency_ms = int(latency_seconds * 1000)
|
|
208
|
+
|
|
209
|
+
# Send latency measurement (type 2)
|
|
210
|
+
message_type_bytes = struct.pack(
|
|
211
|
+
'!B',
|
|
212
|
+
KubernetesSSHMessageType.LATENCY_MEASUREMENT.value)
|
|
213
|
+
latency_bytes = struct.pack('!Q', latency_ms)
|
|
214
|
+
message = message_type_bytes + latency_bytes
|
|
215
|
+
# Send to server.
|
|
216
|
+
async with websocket_lock:
|
|
217
|
+
await websocket.send(message)
|
|
218
|
+
continue
|
|
219
|
+
# No timestamps support, write directly
|
|
220
|
+
writer.write(message)
|
|
221
|
+
await writer.drain()
|
|
83
222
|
except websockets.exceptions.ConnectionClosed:
|
|
84
223
|
print('WebSocket connection closed', file=sys.stderr)
|
|
85
224
|
except Exception as e: # pylint: disable=broad-except
|
|
86
225
|
print(f'Error in websocket_to_stdout: {e}', file=sys.stderr)
|
|
226
|
+
raise e
|
|
227
|
+
finally:
|
|
228
|
+
async with websocket_lock:
|
|
229
|
+
await websocket.close()
|
|
230
|
+
websocket_closed_event.set()
|
|
87
231
|
|
|
88
232
|
|
|
89
233
|
if __name__ == '__main__':
|
|
@@ -93,11 +237,27 @@ if __name__ == '__main__':
|
|
|
93
237
|
# TODO(aylei): Remove this after 0.10.0
|
|
94
238
|
server_url = f'http://{server_url}'
|
|
95
239
|
|
|
240
|
+
disable_latency_measurement = os.environ.get(
|
|
241
|
+
skylet_constants.SSH_DISABLE_LATENCY_MEASUREMENT_ENV_VAR, '0') == '1'
|
|
242
|
+
if disable_latency_measurement:
|
|
243
|
+
timestamps_are_supported = False
|
|
244
|
+
else:
|
|
245
|
+
health_url = f'{server_url}/api/health'
|
|
246
|
+
cookie_hdr = _get_cookie_header(health_url)
|
|
247
|
+
health_response = requests.get(health_url, headers=cookie_hdr)
|
|
248
|
+
health_data = health_response.json()
|
|
249
|
+
timestamps_are_supported = int(health_data.get('api_version', 0)) > 21
|
|
250
|
+
|
|
96
251
|
server_proto, server_fqdn = server_url.split('://')
|
|
97
252
|
websocket_proto = 'ws'
|
|
98
253
|
if server_proto == 'https':
|
|
99
254
|
websocket_proto = 'wss'
|
|
100
255
|
server_url = f'{websocket_proto}://{server_fqdn}'
|
|
256
|
+
|
|
257
|
+
client_version_str = (f'&client_version={constants.API_VERSION}'
|
|
258
|
+
if timestamps_are_supported else '')
|
|
259
|
+
|
|
101
260
|
websocket_url = (f'{server_url}/kubernetes-pod-ssh-proxy'
|
|
102
|
-
f'?cluster_name={sys.argv[2]}'
|
|
103
|
-
|
|
261
|
+
f'?cluster_name={sys.argv[2]}'
|
|
262
|
+
f'{client_version_str}')
|
|
263
|
+
asyncio.run(main(websocket_url, timestamps_are_supported))
|
sky/usage/usage_lib.py
CHANGED
|
@@ -10,13 +10,17 @@ import traceback
|
|
|
10
10
|
import typing
|
|
11
11
|
from typing import Any, Callable, Dict, List, Optional, Union
|
|
12
12
|
|
|
13
|
+
from typing_extensions import ParamSpec
|
|
14
|
+
|
|
13
15
|
import sky
|
|
14
16
|
from sky import sky_logging
|
|
17
|
+
from sky import skypilot_config
|
|
15
18
|
from sky.adaptors import common as adaptors_common
|
|
16
19
|
from sky.usage import constants
|
|
17
20
|
from sky.utils import common_utils
|
|
18
21
|
from sky.utils import env_options
|
|
19
22
|
from sky.utils import ux_utils
|
|
23
|
+
from sky.utils import yaml_utils
|
|
20
24
|
|
|
21
25
|
if typing.TYPE_CHECKING:
|
|
22
26
|
import inspect
|
|
@@ -164,6 +168,7 @@ class UsageMessageToReport(MessageToReport):
|
|
|
164
168
|
self.runtimes: Dict[str, float] = {} # update_runtime
|
|
165
169
|
self.exception: Optional[str] = None # entrypoint_context
|
|
166
170
|
self.stacktrace: Optional[str] = None # entrypoint_context
|
|
171
|
+
self.skypilot_config: Optional[Dict[str, Any]] = None
|
|
167
172
|
|
|
168
173
|
# Whether API server is deployed remotely.
|
|
169
174
|
self.using_remote_api_server: bool = (
|
|
@@ -174,6 +179,7 @@ class UsageMessageToReport(MessageToReport):
|
|
|
174
179
|
self.client_entrypoint = common_utils.get_current_client_entrypoint(
|
|
175
180
|
msg)
|
|
176
181
|
self.entrypoint = msg
|
|
182
|
+
self.skypilot_config = dict(skypilot_config.to_dict())
|
|
177
183
|
|
|
178
184
|
def set_internal(self):
|
|
179
185
|
self.internal = True
|
|
@@ -205,8 +211,8 @@ class UsageMessageToReport(MessageToReport):
|
|
|
205
211
|
logger.debug('Multiple accelerators are not supported: '
|
|
206
212
|
f'{resources.accelerators}.')
|
|
207
213
|
self.task_accelerators = list(resources.accelerators.keys())[0]
|
|
208
|
-
self.task_num_accelerators =
|
|
209
|
-
self.task_accelerators]
|
|
214
|
+
self.task_num_accelerators = int(
|
|
215
|
+
resources.accelerators[self.task_accelerators])
|
|
210
216
|
else:
|
|
211
217
|
self.task_accelerators = None
|
|
212
218
|
self.task_num_accelerators = None
|
|
@@ -245,7 +251,8 @@ class UsageMessageToReport(MessageToReport):
|
|
|
245
251
|
logger.debug('Multiple accelerators are not supported: '
|
|
246
252
|
f'{resources.accelerators}.')
|
|
247
253
|
self.accelerators = list(resources.accelerators.keys())[0]
|
|
248
|
-
self.num_accelerators =
|
|
254
|
+
self.num_accelerators = int(
|
|
255
|
+
resources.accelerators[self.accelerators])
|
|
249
256
|
else:
|
|
250
257
|
self.accelerators = None
|
|
251
258
|
self.num_accelerators = None
|
|
@@ -399,7 +406,7 @@ def _clean_yaml(yaml_info: Dict[str, Optional[str]]):
|
|
|
399
406
|
contents = inspect.getsource(contents)
|
|
400
407
|
|
|
401
408
|
if type(contents) in constants.USAGE_MESSAGE_REDACT_TYPES:
|
|
402
|
-
lines =
|
|
409
|
+
lines = yaml_utils.dump_yaml_str({
|
|
403
410
|
redact_type: contents
|
|
404
411
|
}).strip().split('\n')
|
|
405
412
|
message = (f'{len(lines)} lines {redact_type.upper()}'
|
|
@@ -428,7 +435,7 @@ def prepare_json_from_yaml_config(
|
|
|
428
435
|
with open(yaml_config_or_path, 'r', encoding='utf-8') as f:
|
|
429
436
|
lines = f.readlines()
|
|
430
437
|
comment_lines = [line for line in lines if line.startswith('#')]
|
|
431
|
-
yaml_info =
|
|
438
|
+
yaml_info = yaml_utils.read_yaml_all(yaml_config_or_path)
|
|
432
439
|
|
|
433
440
|
for i in range(len(yaml_info)):
|
|
434
441
|
if yaml_info[i] is None:
|
|
@@ -516,26 +523,26 @@ def entrypoint_context(name: str, fallback: bool = False):
|
|
|
516
523
|
|
|
517
524
|
|
|
518
525
|
T = typing.TypeVar('T')
|
|
526
|
+
P = ParamSpec('P')
|
|
519
527
|
|
|
520
528
|
|
|
521
529
|
@typing.overload
|
|
522
530
|
def entrypoint(
|
|
523
531
|
name_or_fn: str,
|
|
524
|
-
fallback: bool = False
|
|
525
|
-
) -> Callable[[Callable[..., T]], Callable[..., T]]:
|
|
532
|
+
fallback: bool = False) -> Callable[[Callable[P, T]], Callable[P, T]]:
|
|
526
533
|
...
|
|
527
534
|
|
|
528
535
|
|
|
529
536
|
@typing.overload
|
|
530
|
-
def entrypoint(name_or_fn: Callable[
|
|
531
|
-
fallback: bool = False) -> Callable[
|
|
537
|
+
def entrypoint(name_or_fn: Callable[P, T],
|
|
538
|
+
fallback: bool = False) -> Callable[P, T]:
|
|
532
539
|
...
|
|
533
540
|
|
|
534
541
|
|
|
535
542
|
def entrypoint(
|
|
536
|
-
name_or_fn: Union[str, Callable[
|
|
543
|
+
name_or_fn: Union[str, Callable[P, T]],
|
|
537
544
|
fallback: bool = False
|
|
538
|
-
) -> Union[Callable[
|
|
545
|
+
) -> Union[Callable[P, T], Callable[[Callable[P, T]], Callable[P, T]]]:
|
|
539
546
|
return common_utils.make_decorator(entrypoint_context,
|
|
540
547
|
name_or_fn,
|
|
541
548
|
fallback=fallback)
|
sky/users/__init__.py
ADDED
|
File without changes
|
sky/users/model.conf
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# rbac_model.conf
|
|
2
|
+
[request_definition]
|
|
3
|
+
r = sub, obj, act
|
|
4
|
+
|
|
5
|
+
[policy_definition]
|
|
6
|
+
p = sub, obj, act
|
|
7
|
+
|
|
8
|
+
[role_definition]
|
|
9
|
+
g = _, _
|
|
10
|
+
|
|
11
|
+
[policy_effect]
|
|
12
|
+
e = some(where (p.eft == allow))
|
|
13
|
+
|
|
14
|
+
[matchers]
|
|
15
|
+
m = (g(r.sub, p.sub)|| p.sub == '*') && r.obj == p.obj && r.act == p.act
|