skypilot-nightly 1.0.0.dev20250910__py3-none-any.whl → 1.0.0.dev20250913__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.

Files changed (105) hide show
  1. sky/__init__.py +4 -2
  2. sky/adaptors/seeweb.py +103 -0
  3. sky/authentication.py +38 -0
  4. sky/backends/backend_utils.py +148 -30
  5. sky/backends/cloud_vm_ray_backend.py +606 -223
  6. sky/catalog/__init__.py +7 -0
  7. sky/catalog/aws_catalog.py +4 -0
  8. sky/catalog/common.py +18 -0
  9. sky/catalog/data_fetchers/fetch_aws.py +13 -37
  10. sky/catalog/data_fetchers/fetch_seeweb.py +329 -0
  11. sky/catalog/seeweb_catalog.py +184 -0
  12. sky/client/cli/command.py +2 -71
  13. sky/client/sdk_async.py +5 -2
  14. sky/clouds/__init__.py +2 -0
  15. sky/clouds/aws.py +23 -5
  16. sky/clouds/cloud.py +8 -0
  17. sky/clouds/kubernetes.py +2 -0
  18. sky/clouds/seeweb.py +463 -0
  19. sky/core.py +46 -12
  20. sky/dashboard/out/404.html +1 -1
  21. sky/dashboard/out/_next/static/{3SYxqNGnvvPS8h3gdD2T7 → Y0Q7LyrxiFoWWbTdwb5nh}/_buildManifest.js +1 -1
  22. sky/dashboard/out/_next/static/chunks/1141-159df2d4c441a9d1.js +1 -0
  23. sky/dashboard/out/_next/static/chunks/3015-2ea98b57e318bd6e.js +1 -0
  24. sky/dashboard/out/_next/static/chunks/3294.03e02ae73455f48e.js +6 -0
  25. sky/dashboard/out/_next/static/chunks/3785.0fa442e16dd3f00e.js +1 -0
  26. sky/dashboard/out/_next/static/chunks/5339.c033b29835da0f35.js +51 -0
  27. sky/dashboard/out/_next/static/chunks/6856-e0754534b3015377.js +1 -0
  28. sky/dashboard/out/_next/static/chunks/6990-11c8e9b982e8ffec.js +1 -0
  29. sky/dashboard/out/_next/static/chunks/9037-f9800e64eb05dd1c.js +6 -0
  30. sky/dashboard/out/_next/static/chunks/{webpack-1d7e11230da3ca89.js → webpack-d1e29b3aa66bf4cf.js} +1 -1
  31. sky/dashboard/out/clusters/[cluster]/[job].html +1 -1
  32. sky/dashboard/out/clusters/[cluster].html +1 -1
  33. sky/dashboard/out/clusters.html +1 -1
  34. sky/dashboard/out/config.html +1 -1
  35. sky/dashboard/out/index.html +1 -1
  36. sky/dashboard/out/infra/[context].html +1 -1
  37. sky/dashboard/out/infra.html +1 -1
  38. sky/dashboard/out/jobs/[job].html +1 -1
  39. sky/dashboard/out/jobs/pools/[pool].html +1 -1
  40. sky/dashboard/out/jobs.html +1 -1
  41. sky/dashboard/out/users.html +1 -1
  42. sky/dashboard/out/volumes.html +1 -1
  43. sky/dashboard/out/workspace/new.html +1 -1
  44. sky/dashboard/out/workspaces/[name].html +1 -1
  45. sky/dashboard/out/workspaces.html +1 -1
  46. sky/exceptions.py +5 -0
  47. sky/global_user_state.py +75 -26
  48. sky/jobs/client/sdk_async.py +4 -2
  49. sky/jobs/controller.py +4 -2
  50. sky/jobs/recovery_strategy.py +1 -1
  51. sky/jobs/state.py +26 -16
  52. sky/jobs/utils.py +67 -24
  53. sky/logs/agent.py +10 -2
  54. sky/provision/__init__.py +1 -0
  55. sky/provision/kubernetes/config.py +7 -2
  56. sky/provision/kubernetes/instance.py +84 -41
  57. sky/provision/kubernetes/utils.py +14 -3
  58. sky/provision/seeweb/__init__.py +11 -0
  59. sky/provision/seeweb/config.py +13 -0
  60. sky/provision/seeweb/instance.py +806 -0
  61. sky/provision/vast/instance.py +1 -1
  62. sky/schemas/db/global_user_state/008_skylet_ssh_tunnel_metadata.py +34 -0
  63. sky/schemas/generated/jobsv1_pb2.py +86 -0
  64. sky/schemas/generated/jobsv1_pb2.pyi +252 -0
  65. sky/schemas/generated/jobsv1_pb2_grpc.py +542 -0
  66. sky/server/config.py +14 -5
  67. sky/server/metrics.py +41 -8
  68. sky/server/requests/executor.py +41 -4
  69. sky/server/server.py +1 -0
  70. sky/server/uvicorn.py +11 -5
  71. sky/setup_files/dependencies.py +8 -1
  72. sky/skylet/constants.py +14 -8
  73. sky/skylet/job_lib.py +128 -10
  74. sky/skylet/log_lib.py +14 -3
  75. sky/skylet/log_lib.pyi +9 -0
  76. sky/skylet/services.py +203 -0
  77. sky/skylet/skylet.py +4 -0
  78. sky/task.py +62 -0
  79. sky/templates/kubernetes-ray.yml.j2 +120 -3
  80. sky/templates/seeweb-ray.yml.j2 +108 -0
  81. sky/utils/accelerator_registry.py +3 -1
  82. sky/utils/command_runner.py +35 -11
  83. sky/utils/command_runner.pyi +22 -0
  84. sky/utils/context_utils.py +15 -2
  85. sky/utils/controller_utils.py +11 -5
  86. sky/utils/db/migration_utils.py +1 -1
  87. sky/utils/git.py +559 -1
  88. sky/utils/resource_checker.py +8 -7
  89. sky/workspaces/core.py +57 -21
  90. {skypilot_nightly-1.0.0.dev20250910.dist-info → skypilot_nightly-1.0.0.dev20250913.dist-info}/METADATA +40 -35
  91. {skypilot_nightly-1.0.0.dev20250910.dist-info → skypilot_nightly-1.0.0.dev20250913.dist-info}/RECORD +96 -85
  92. sky/client/cli/git.py +0 -549
  93. sky/dashboard/out/_next/static/chunks/1141-943efc7aff0f0c06.js +0 -1
  94. sky/dashboard/out/_next/static/chunks/3015-86cabed5d4669ad0.js +0 -1
  95. sky/dashboard/out/_next/static/chunks/3294.c80326aec9bfed40.js +0 -6
  96. sky/dashboard/out/_next/static/chunks/3785.4872a2f3aa489880.js +0 -1
  97. sky/dashboard/out/_next/static/chunks/5339.3fda4a4010ff4e06.js +0 -51
  98. sky/dashboard/out/_next/static/chunks/6856-6e2bc8a6fd0867af.js +0 -1
  99. sky/dashboard/out/_next/static/chunks/6990-08b2a1cae076a943.js +0 -1
  100. sky/dashboard/out/_next/static/chunks/9037-fa1737818d0a0969.js +0 -6
  101. /sky/dashboard/out/_next/static/{3SYxqNGnvvPS8h3gdD2T7 → Y0Q7LyrxiFoWWbTdwb5nh}/_ssgManifest.js +0 -0
  102. {skypilot_nightly-1.0.0.dev20250910.dist-info → skypilot_nightly-1.0.0.dev20250913.dist-info}/WHEEL +0 -0
  103. {skypilot_nightly-1.0.0.dev20250910.dist-info → skypilot_nightly-1.0.0.dev20250913.dist-info}/entry_points.txt +0 -0
  104. {skypilot_nightly-1.0.0.dev20250910.dist-info → skypilot_nightly-1.0.0.dev20250913.dist-info}/licenses/LICENSE +0 -0
  105. {skypilot_nightly-1.0.0.dev20250910.dist-info → skypilot_nightly-1.0.0.dev20250913.dist-info}/top_level.txt +0 -0
sky/workspaces/core.py CHANGED
@@ -14,6 +14,7 @@ from sky.backends import backend_utils
14
14
  from sky.skylet import constants
15
15
  from sky.usage import usage_lib
16
16
  from sky.users import permission
17
+ from sky.users import rbac
17
18
  from sky.utils import annotations
18
19
  from sky.utils import common_utils
19
20
  from sky.utils import config_utils
@@ -147,11 +148,15 @@ def _compare_workspace_configs(
147
148
  private_new = new_config.get('private', False)
148
149
  private_changed = private_old != private_new
149
150
 
151
+ admin_user_ids = permission.permission_service.get_users_for_role(
152
+ rbac.RoleName.ADMIN.value)
150
153
  # Get allowed users (resolve to user IDs for comparison)
151
154
  allowed_users_old = workspaces_utils.get_workspace_users(
152
155
  current_config) if private_old else []
156
+ allowed_users_old += admin_user_ids
153
157
  allowed_users_new = workspaces_utils.get_workspace_users(
154
158
  new_config) if private_new else []
159
+ allowed_users_new += admin_user_ids
155
160
 
156
161
  # Convert to sets for easier comparison
157
162
  old_users_set = set(allowed_users_old)
@@ -188,6 +193,24 @@ def _compare_workspace_configs(
188
193
  added_users=added_users)
189
194
 
190
195
 
196
+ def _validate_workspace_config_changes_with_lock(
197
+ workspace_name: str, current_config: Dict[str, Any],
198
+ new_config: Dict[str, Any]) -> None:
199
+ lock_id = backend_utils.workspace_lock_id(workspace_name)
200
+ lock_timeout = backend_utils.WORKSPACE_LOCK_TIMEOUT_SECONDS
201
+ try:
202
+ with locks.get_lock(lock_id, lock_timeout):
203
+ # Validate the configuration changes based on active resources
204
+ _validate_workspace_config_changes(workspace_name, current_config,
205
+ new_config)
206
+ except locks.LockTimeout as e:
207
+ raise RuntimeError(
208
+ f'Failed to validate workspace {workspace_name!r} due to '
209
+ 'a timeout when trying to access database. Please '
210
+ f'try again or manually remove the lock at {lock_id}. '
211
+ f'{common_utils.format_exception(e)}') from None
212
+
213
+
191
214
  def _validate_workspace_config_changes(workspace_name: str,
192
215
  current_config: Dict[str, Any],
193
216
  new_config: Dict[str, Any]) -> None:
@@ -232,7 +255,7 @@ def _validate_workspace_config_changes(workspace_name: str,
232
255
  f' private. Checking that all active resources belong'
233
256
  f' to allowed users.')
234
257
 
235
- error_summary, missed_users_names = (
258
+ error_summary, missed_users_names, _ = (
236
259
  resource_checker.check_users_workspaces_active_resources(
237
260
  config_comparison.allowed_users_new, [workspace_name]))
238
261
  if error_summary:
@@ -259,11 +282,35 @@ def _validate_workspace_config_changes(workspace_name: str,
259
282
  f'Checking that removed users'
260
283
  f' {config_comparison.removed_users} do not have'
261
284
  f' active resources in workspace {workspace_name!r}.')
262
- user_operations = []
263
- for user_id in config_comparison.removed_users:
264
- user_operations.append((user_id, 'remove'))
265
- resource_checker.check_no_active_resources_for_users(
266
- user_operations)
285
+ error_summary, missed_users_names, missed_user_dict = (
286
+ resource_checker.check_users_workspaces_active_resources(
287
+ config_comparison.allowed_users_new, [workspace_name]))
288
+ if error_summary:
289
+ error_user_ids = []
290
+ for user_id in config_comparison.removed_users:
291
+ if user_id in missed_user_dict:
292
+ error_user_ids.append(user_id)
293
+ error_user_names = []
294
+ if error_user_ids:
295
+ error_user_names = [
296
+ missed_user_dict[user_id]
297
+ for user_id in error_user_ids
298
+ ]
299
+
300
+ error_msg = 'Cannot '
301
+ error_users_list = ', '.join(error_user_names)
302
+ if len(error_user_names) == 1:
303
+ error_msg += f'remove user {error_users_list!r} ' \
304
+ f'from workspace {workspace_name!r} because the ' \
305
+ f'user has {error_summary}'
306
+ else:
307
+ error_msg += f'remove users {error_users_list!r}' \
308
+ f' from workspace {workspace_name!r} because the' \
309
+ f' users have {error_summary}'
310
+ error_msg += ', but not in the allowed_users list.' \
311
+ ' Please either add the users to allowed_users or' \
312
+ ' ask them to terminate their resources.'
313
+ raise ValueError(error_msg)
267
314
  else:
268
315
  # Other configuration changes - check that workspace has no active
269
316
  # resources
@@ -310,20 +357,8 @@ def update_workspace(workspace_name: str, config: Dict[str,
310
357
  default_value={})
311
358
  current_config = current_workspaces.get(workspace_name, {})
312
359
 
313
- if current_config:
314
- lock_id = backend_utils.workspace_lock_id(workspace_name)
315
- lock_timeout = backend_utils.WORKSPACE_LOCK_TIMEOUT_SECONDS
316
- try:
317
- with locks.get_lock(lock_id, lock_timeout):
318
- # Validate the configuration changes based on active resources
319
- _validate_workspace_config_changes(workspace_name,
320
- current_config, config)
321
- except locks.LockTimeout as e:
322
- raise RuntimeError(
323
- f'Failed to validate workspace {workspace_name!r} due to '
324
- 'a timeout when trying to access database. Please '
325
- f'try again or manually remove the lock at {lock_id}. '
326
- f'{common_utils.format_exception(e)}') from None
360
+ _validate_workspace_config_changes_with_lock(workspace_name, current_config,
361
+ config)
327
362
 
328
363
  def update_workspace_fn(workspaces: Dict[str, Any]) -> None:
329
364
  """Function to update workspace inside the lock."""
@@ -510,7 +545,8 @@ def update_config(config: Dict[str, Any]) -> Dict[str, Any]:
510
545
  # If workspace configuration is changing, validate and mark for checking
511
546
  if current_workspace_config != new_workspace_config:
512
547
  _validate_workspace_config(workspace_name, new_workspace_config)
513
- workspaces_to_check.append((workspace_name, 'update'))
548
+ _validate_workspace_config_changes_with_lock(
549
+ workspace_name, current_workspace_config, new_workspace_config)
514
550
  users = workspaces_utils.get_workspace_users(new_workspace_config)
515
551
  workspaces_to_check_policy['update'][workspace_name] = users
516
552
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: skypilot-nightly
3
- Version: 1.0.0.dev20250910
3
+ Version: 1.0.0.dev20250913
4
4
  Summary: SkyPilot: Run AI on Any Infra — Unified, Faster, Cheaper.
5
5
  Author: SkyPilot Team
6
6
  License: Apache 2.0
@@ -131,11 +131,15 @@ Provides-Extra: vsphere
131
131
  Requires-Dist: pyvmomi==8.0.1.0.2; extra == "vsphere"
132
132
  Provides-Extra: nebius
133
133
  Requires-Dist: nebius>=0.2.47; extra == "nebius"
134
+ Requires-Dist: grpcio>=1.63.0; extra == "nebius"
135
+ Requires-Dist: protobuf<7.0.0,>=5.26.1; extra == "nebius"
134
136
  Requires-Dist: awscli>=1.27.10; extra == "nebius"
135
137
  Requires-Dist: botocore>=1.29.10; extra == "nebius"
136
138
  Requires-Dist: boto3>=1.26.1; extra == "nebius"
137
139
  Requires-Dist: colorama<0.4.5; extra == "nebius"
138
140
  Provides-Extra: hyperbolic
141
+ Provides-Extra: seeweb
142
+ Requires-Dist: ecsapi>=0.2.0; extra == "seeweb"
139
143
  Provides-Extra: server
140
144
  Requires-Dist: casbin; extra == "server"
141
145
  Requires-Dist: sqlalchemy_adapter; extra == "server"
@@ -147,48 +151,49 @@ Requires-Dist: grpcio>=1.63.0; extra == "server"
147
151
  Requires-Dist: protobuf<7.0.0,>=5.26.1; extra == "server"
148
152
  Requires-Dist: aiosqlite; extra == "server"
149
153
  Provides-Extra: all
150
- Requires-Dist: pyjwt; extra == "all"
151
- Requires-Dist: casbin; extra == "all"
152
- Requires-Dist: colorama<0.4.5; extra == "all"
153
154
  Requires-Dist: cudo-compute>=0.1.10; extra == "all"
154
- Requires-Dist: python-dateutil; extra == "all"
155
- Requires-Dist: ray[default]>=2.6.1; extra == "all"
156
- Requires-Dist: pyopenssl<24.3.0,>=23.2.0; extra == "all"
157
- Requires-Dist: docker; extra == "all"
158
- Requires-Dist: websockets; extra == "all"
159
- Requires-Dist: awscli>=1.27.10; extra == "all"
160
- Requires-Dist: aiosqlite; extra == "all"
161
- Requires-Dist: ibm-vpc; extra == "all"
162
- Requires-Dist: azure-mgmt-compute>=33.0.0; extra == "all"
163
- Requires-Dist: azure-core>=1.31.0; extra == "all"
164
- Requires-Dist: passlib; extra == "all"
165
155
  Requires-Dist: vastai-sdk>=0.1.12; extra == "all"
166
- Requires-Dist: oci; extra == "all"
167
- Requires-Dist: boto3>=1.26.1; extra == "all"
168
156
  Requires-Dist: azure-core>=1.24.0; extra == "all"
169
- Requires-Dist: azure-mgmt-network>=27.0.0; extra == "all"
170
- Requires-Dist: nebius>=0.2.47; extra == "all"
171
- Requires-Dist: google-api-python-client>=2.69.0; extra == "all"
172
- Requires-Dist: google-cloud-storage; extra == "all"
173
- Requires-Dist: msgraph-sdk; extra == "all"
174
- Requires-Dist: ibm-platform-services>=0.48.0; extra == "all"
175
- Requires-Dist: azure-common; extra == "all"
176
- Requires-Dist: pydo>=0.3.0; extra == "all"
177
- Requires-Dist: msrestazure; extra == "all"
178
- Requires-Dist: anyio; extra == "all"
179
- Requires-Dist: sqlalchemy_adapter; extra == "all"
157
+ Requires-Dist: azure-identity>=1.19.0; extra == "all"
180
158
  Requires-Dist: azure-storage-blob>=12.23.1; extra == "all"
159
+ Requires-Dist: sqlalchemy_adapter; extra == "all"
160
+ Requires-Dist: azure-mgmt-compute>=33.0.0; extra == "all"
161
+ Requires-Dist: grpcio>=1.63.0; extra == "all"
162
+ Requires-Dist: boto3>=1.26.1; extra == "all"
163
+ Requires-Dist: ibm-cos-sdk; extra == "all"
164
+ Requires-Dist: pydo>=0.3.0; extra == "all"
165
+ Requires-Dist: pyvmomi==8.0.1.0.2; extra == "all"
181
166
  Requires-Dist: botocore>=1.29.10; extra == "all"
167
+ Requires-Dist: aiohttp; extra == "all"
168
+ Requires-Dist: anyio; extra == "all"
169
+ Requires-Dist: pyopenssl<24.3.0,>=23.2.0; extra == "all"
170
+ Requires-Dist: awscli>=1.27.10; extra == "all"
182
171
  Requires-Dist: ibm-cloud-sdk-core; extra == "all"
183
- Requires-Dist: kubernetes!=32.0.0,>=20.0.0; extra == "all"
184
- Requires-Dist: pyvmomi==8.0.1.0.2; extra == "all"
185
- Requires-Dist: ibm-cos-sdk; extra == "all"
186
- Requires-Dist: runpod>=1.6.1; extra == "all"
187
- Requires-Dist: grpcio>=1.63.0; extra == "all"
188
172
  Requires-Dist: protobuf<7.0.0,>=5.26.1; extra == "all"
189
- Requires-Dist: azure-identity>=1.19.0; extra == "all"
173
+ Requires-Dist: azure-common; extra == "all"
174
+ Requires-Dist: nebius>=0.2.47; extra == "all"
175
+ Requires-Dist: msgraph-sdk; extra == "all"
176
+ Requires-Dist: ibm-platform-services>=0.48.0; extra == "all"
177
+ Requires-Dist: ecsapi>=0.2.0; extra == "all"
178
+ Requires-Dist: runpod>=1.6.1; extra == "all"
179
+ Requires-Dist: passlib; extra == "all"
180
+ Requires-Dist: ibm-vpc; extra == "all"
181
+ Requires-Dist: pyjwt; extra == "all"
182
+ Requires-Dist: google-cloud-storage; extra == "all"
183
+ Requires-Dist: websockets; extra == "all"
184
+ Requires-Dist: ray[default]>=2.6.1; extra == "all"
185
+ Requires-Dist: colorama<0.4.5; extra == "all"
186
+ Requires-Dist: python-dateutil; extra == "all"
190
187
  Requires-Dist: azure-cli>=2.65.0; extra == "all"
191
- Requires-Dist: aiohttp; extra == "all"
188
+ Requires-Dist: azure-core>=1.31.0; extra == "all"
189
+ Requires-Dist: azure-mgmt-network>=27.0.0; extra == "all"
190
+ Requires-Dist: msrestazure; extra == "all"
191
+ Requires-Dist: aiosqlite; extra == "all"
192
+ Requires-Dist: kubernetes!=32.0.0,>=20.0.0; extra == "all"
193
+ Requires-Dist: casbin; extra == "all"
194
+ Requires-Dist: google-api-python-client>=2.69.0; extra == "all"
195
+ Requires-Dist: docker; extra == "all"
196
+ Requires-Dist: oci; extra == "all"
192
197
  Dynamic: author
193
198
  Dynamic: classifier
194
199
  Dynamic: description