lightning-sdk 2025.12.9__py3-none-any.whl → 2025.12.17__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.
Files changed (78) hide show
  1. lightning_sdk/__version__.py +1 -1
  2. lightning_sdk/api/job_api.py +16 -0
  3. lightning_sdk/api/org_api.py +7 -0
  4. lightning_sdk/api/studio_api.py +28 -3
  5. lightning_sdk/api/teamspace_api.py +42 -5
  6. lightning_sdk/api/user_api.py +5 -0
  7. lightning_sdk/cli/legacy/download.py +2 -1
  8. lightning_sdk/cli/legacy/studios_menu.py +8 -1
  9. lightning_sdk/job/base.py +26 -4
  10. lightning_sdk/job/job.py +16 -5
  11. lightning_sdk/job/v1.py +7 -2
  12. lightning_sdk/job/v2.py +41 -1
  13. lightning_sdk/lightning_cloud/openapi/__init__.py +26 -1
  14. lightning_sdk/lightning_cloud/openapi/api/__init__.py +1 -0
  15. lightning_sdk/lightning_cloud/openapi/api/cloud_space_service_api.py +5 -1
  16. lightning_sdk/lightning_cloud/openapi/api/cluster_service_api.py +517 -0
  17. lightning_sdk/lightning_cloud/openapi/api/data_connection_service_api.py +5 -1
  18. lightning_sdk/lightning_cloud/openapi/api/file_system_service_api.py +11 -11
  19. lightning_sdk/lightning_cloud/openapi/api/kubernetes_virtual_machine_service_api.py +557 -0
  20. lightning_sdk/lightning_cloud/openapi/api/storage_service_api.py +5 -1
  21. lightning_sdk/lightning_cloud/openapi/models/__init__.py +25 -1
  22. lightning_sdk/lightning_cloud/openapi/models/cloud_space_environment_template_service_update_cloud_space_environment_template_body.py +27 -1
  23. lightning_sdk/lightning_cloud/openapi/models/cluster_service_add_container_registry_body.py +123 -0
  24. lightning_sdk/lightning_cloud/openapi/models/cluster_service_create_machine_body.py +27 -1
  25. lightning_sdk/lightning_cloud/openapi/models/cluster_service_refresh_container_registry_credentials_body.py +97 -0
  26. lightning_sdk/lightning_cloud/openapi/models/cluster_service_validate_container_registry_body.py +97 -0
  27. lightning_sdk/lightning_cloud/openapi/models/kubernetes_virtual_machine_service_create_kubernetes_virtual_machine_body.py +513 -0
  28. lightning_sdk/lightning_cloud/openapi/models/kubernetes_virtual_machine_service_update_kubernetes_virtual_machine_body.py +97 -0
  29. lightning_sdk/lightning_cloud/openapi/models/v1_add_container_registry_response.py +123 -0
  30. lightning_sdk/lightning_cloud/openapi/models/v1_cloud_space_environment_template_config.py +27 -1
  31. lightning_sdk/lightning_cloud/openapi/models/v1_cloud_space_specialized_view.py +1 -0
  32. lightning_sdk/lightning_cloud/openapi/models/v1_container_registry.py +253 -0
  33. lightning_sdk/lightning_cloud/openapi/models/v1_container_registry_info.py +281 -0
  34. lightning_sdk/lightning_cloud/openapi/models/v1_container_registry_integration.py +123 -0
  35. lightning_sdk/lightning_cloud/openapi/models/v1_container_registry_status.py +105 -0
  36. lightning_sdk/lightning_cloud/openapi/models/v1_create_cloud_space_environment_template_request.py +27 -1
  37. lightning_sdk/lightning_cloud/openapi/models/v1_delete_container_registry_response.py +97 -0
  38. lightning_sdk/lightning_cloud/openapi/models/v1_delete_kubernetes_virtual_machine_response.py +97 -0
  39. lightning_sdk/lightning_cloud/openapi/models/v1_ecr_registry_config.py +175 -0
  40. lightning_sdk/lightning_cloud/openapi/models/v1_ecr_registry_config_input.py +123 -0
  41. lightning_sdk/lightning_cloud/openapi/models/v1_ecr_registry_details.py +201 -0
  42. lightning_sdk/lightning_cloud/openapi/models/v1_get_artifacts_page_response.py +29 -3
  43. lightning_sdk/lightning_cloud/openapi/models/v1_get_user_response.py +27 -1
  44. lightning_sdk/lightning_cloud/openapi/models/v1_kubernetes_direct_v1.py +53 -1
  45. lightning_sdk/lightning_cloud/openapi/models/v1_kubernetes_virtual_machine.py +383 -0
  46. lightning_sdk/lightning_cloud/openapi/models/v1_kubevirt_config.py +305 -0
  47. lightning_sdk/lightning_cloud/openapi/models/v1_kubevirt_provider_configuration.py +227 -0
  48. lightning_sdk/lightning_cloud/openapi/models/v1_kubevirt_vm_configuration.py +149 -0
  49. lightning_sdk/lightning_cloud/openapi/models/v1_kubevirt_vm_resources.py +201 -0
  50. lightning_sdk/lightning_cloud/openapi/models/v1_list_container_registries_response.py +123 -0
  51. lightning_sdk/lightning_cloud/openapi/models/v1_list_kubernetes_virtual_machines_response.py +123 -0
  52. lightning_sdk/lightning_cloud/openapi/models/v1_machine.py +27 -1
  53. lightning_sdk/lightning_cloud/openapi/models/v1_node_metrics.py +27 -1
  54. lightning_sdk/lightning_cloud/openapi/models/v1_refresh_container_registry_credentials_response.py +123 -0
  55. lightning_sdk/lightning_cloud/openapi/models/v1_search_user.py +27 -1
  56. lightning_sdk/lightning_cloud/openapi/models/v1_user_features.py +79 -1
  57. lightning_sdk/lightning_cloud/openapi/models/v1_validate_container_registry_response.py +149 -0
  58. lightning_sdk/lightning_cloud/openapi/rest.py +2 -2
  59. lightning_sdk/machine.py +1 -0
  60. lightning_sdk/mmt/base.py +26 -7
  61. lightning_sdk/mmt/mmt.py +11 -6
  62. lightning_sdk/mmt/v1.py +5 -2
  63. lightning_sdk/mmt/v2.py +5 -2
  64. lightning_sdk/organization.py +10 -1
  65. lightning_sdk/owner.py +4 -0
  66. lightning_sdk/pipeline/steps.py +3 -0
  67. lightning_sdk/plugin.py +2 -2
  68. lightning_sdk/studio.py +33 -2
  69. lightning_sdk/teamspace.py +44 -4
  70. lightning_sdk/user.py +22 -2
  71. lightning_sdk/utils/resolve.py +9 -7
  72. {lightning_sdk-2025.12.9.dist-info → lightning_sdk-2025.12.17.dist-info}/METADATA +1 -1
  73. {lightning_sdk-2025.12.9.dist-info → lightning_sdk-2025.12.17.dist-info}/RECORD +78 -53
  74. /lightning_sdk/lightning_cloud/openapi/models/{v1_list_filesystem_mm_ts_response.py → v1_list_filesystem_mmts_response.py} +0 -0
  75. {lightning_sdk-2025.12.9.dist-info → lightning_sdk-2025.12.17.dist-info}/LICENSE +0 -0
  76. {lightning_sdk-2025.12.9.dist-info → lightning_sdk-2025.12.17.dist-info}/WHEEL +0 -0
  77. {lightning_sdk-2025.12.9.dist-info → lightning_sdk-2025.12.17.dist-info}/entry_points.txt +0 -0
  78. {lightning_sdk-2025.12.9.dist-info → lightning_sdk-2025.12.17.dist-info}/top_level.txt +0 -0
@@ -1,3 +1,3 @@
1
1
  """Version information for lightning_sdk."""
2
2
 
3
- __version__ = "2025.12.09"
3
+ __version__ = "2025.12.17"
@@ -30,6 +30,7 @@ from lightning_sdk.lightning_cloud.openapi import (
30
30
  V1LightningworkState,
31
31
  V1ListLightningworkResponse,
32
32
  V1UserRequestedComputeConfig,
33
+ V1Volume,
33
34
  )
34
35
  from lightning_sdk.lightning_cloud.rest_client import LightningClient
35
36
  from lightning_sdk.machine import Machine
@@ -253,7 +254,16 @@ class JobApiV2:
253
254
  artifacts_remote: Optional[str], # deprecated in favor of path_mappings
254
255
  max_runtime: Optional[int] = None,
255
256
  reuse_snapshot: bool = True,
257
+ scratch_disks: Optional[Dict[str, int]] = None,
256
258
  ) -> V1Job:
259
+ if scratch_disks is not None:
260
+ sanitized_scratch_disks = {}
261
+ for k, v in scratch_disks.items():
262
+ sanitized_k = k if k.startswith("/teamspace/scratch/") else f"/teamspace/scratch/{k}"
263
+ sanitized_scratch_disks[sanitized_k] = v
264
+ else:
265
+ sanitized_scratch_disks = None
266
+
257
267
  body = self._create_job_body(
258
268
  name=name,
259
269
  command=command,
@@ -271,6 +281,7 @@ class JobApiV2:
271
281
  artifacts_remote=artifacts_remote,
272
282
  max_runtime=max_runtime,
273
283
  reuse_snapshot=reuse_snapshot,
284
+ scratch_disks=sanitized_scratch_disks,
274
285
  )
275
286
 
276
287
  job: V1Job = self._client.jobs_service_create_job(project_id=teamspace_id, body=body)
@@ -295,6 +306,7 @@ class JobApiV2:
295
306
  reuse_snapshot: bool,
296
307
  max_runtime: Optional[int] = None,
297
308
  machine_image_version: Optional[str] = None,
309
+ scratch_disks: Optional[Dict[str, int]] = None,
298
310
  ) -> JobsServiceCreateJobBody:
299
311
  env_vars = []
300
312
  if env is not None:
@@ -316,6 +328,9 @@ class JobApiV2:
316
328
  if max_runtime:
317
329
  optional_spec_kwargs["requested_run_duration_seconds"] = str(max_runtime)
318
330
 
331
+ # don't do default dicts, as they'll be mutable. Create a fresh one here
332
+ scratch_disks = scratch_disks or {}
333
+
319
334
  spec = V1JobSpec(
320
335
  cloudspace_id=studio_id or "",
321
336
  cluster_id=cloud_account or "",
@@ -330,6 +345,7 @@ class JobApiV2:
330
345
  image_secret_ref=image_credentials or "",
331
346
  path_mappings=path_mappings_list,
332
347
  machine_image_version=machine_image_version,
348
+ volumes=[V1Volume(path=k, size_gb=v, ephemeral=True) for k, v in scratch_disks.items()],
333
349
  **optional_spec_kwargs,
334
350
  )
335
351
  return JobsServiceCreateJobBody(name=name, spec=spec)
@@ -1,4 +1,5 @@
1
1
  from lightning_sdk.lightning_cloud.openapi import (
2
+ V1CreateProjectRequest,
2
3
  V1Organization,
3
4
  )
4
5
  from lightning_sdk.lightning_cloud.rest_client import LightningClient
@@ -20,3 +21,9 @@ class OrgApi:
20
21
  def _get_org_by_id(self, org_id: str) -> V1Organization:
21
22
  """Gets the organization from the given ID."""
22
23
  return self._client.organizations_service_get_organization(id=org_id)
24
+
25
+ def create_teamspace(self, name: str, organization_id: str) -> None:
26
+ """Creates a new teamspace."""
27
+ self._client.projects_service_create_project(
28
+ body=V1CreateProjectRequest(name=name, organization_id=organization_id, display_name=name)
29
+ )
@@ -962,9 +962,9 @@ class StudioApi:
962
962
  interruptible=interruptible,
963
963
  )
964
964
 
965
- def start_new_port(self, teamspace_id: str, studio_id: str, name: str, port: int, auto_start: bool = False) -> str:
965
+ def add_port(self, teamspace_id: str, studio_id: str, name: str, port: int, auto_start: bool = False) -> V1Endpoint:
966
966
  """Starts a new port to the given Studio."""
967
- endpoint = self._client.endpoint_service_create_endpoint(
967
+ return self._client.endpoint_service_create_endpoint(
968
968
  project_id=teamspace_id,
969
969
  body=EndpointServiceCreateEndpointBody(
970
970
  name=name,
@@ -974,7 +974,32 @@ class StudioApi:
974
974
  ),
975
975
  ),
976
976
  )
977
- return endpoint.urls[0]
977
+
978
+ def get_port_url(
979
+ self, teamspace_id: str, studio_id: str, port: Optional[int] = None, name: Optional[str] = None
980
+ ) -> str:
981
+ if port is None and name is None:
982
+ raise ValueError("Either 'port' or 'name' must be provided")
983
+
984
+ endpoints = self.list_ports(teamspace_id=teamspace_id, studio_id=studio_id)
985
+
986
+ for endpoint in endpoints:
987
+ if port is not None and port in endpoint.ports:
988
+ idx = endpoint.ports.index(port)
989
+ return endpoint.urls[idx]
990
+
991
+ if name is not None and endpoint.name == name:
992
+ return endpoint.urls[0] if endpoint.urls else None
993
+
994
+ identifier = f"port {port}" if port else f"name '{name}'"
995
+ raise ValueError(f"Endpoint with {identifier} not found")
996
+
997
+ def list_ports(self, teamspace_id: str, studio_id: str) -> List[V1Endpoint]:
998
+ """List ports that are exposed in the Studio."""
999
+ return self._client.endpoint_service_list_endpoints(
1000
+ project_id=teamspace_id,
1001
+ cloudspace_id=studio_id,
1002
+ ).endpoints
978
1003
 
979
1004
  def create_assistant(self, studio_id: str, teamspace_id: str, port: int, assistant_name: str) -> V1Assistant:
980
1005
  target_teamspace = self._client.projects_service_get_project(teamspace_id)
@@ -47,6 +47,7 @@ from lightning_sdk.lightning_cloud.openapi import (
47
47
  V1UpstreamOpenAI,
48
48
  )
49
49
  from lightning_sdk.lightning_cloud.rest_client import LightningClient
50
+ from lightning_sdk.machine import Machine
50
51
 
51
52
  __all__ = ["TeamspaceApi"]
52
53
 
@@ -323,11 +324,47 @@ class TeamspaceApi:
323
324
  jobs = self._client.jobs_service_list_multi_machine_jobs(project_id=teamspace_id).multi_machine_jobs
324
325
  return apps, jobs
325
326
 
326
- def list_machines(self, teamspace_id: str, cloud_account: str) -> List[V1ClusterAccelerator]:
327
- response = self._client.cluster_service_list_project_cluster_accelerators(
328
- project_id=teamspace_id, id=cloud_account
329
- )
330
- return response.accelerator
327
+ def list_machines(
328
+ self,
329
+ teamspace_id: str,
330
+ cloud_accounts: List[str],
331
+ machine: Optional[Machine] = None,
332
+ org_id: Optional[str] = None,
333
+ ) -> List[V1ClusterAccelerator]:
334
+ from lightning_sdk.api.cloud_account_api import CloudAccountApi
335
+
336
+ cloud_account_api = CloudAccountApi()
337
+ matched_accelerators = []
338
+ for ca in cloud_accounts:
339
+ try:
340
+ accelerators = cloud_account_api.list_cloud_account_accelerators(
341
+ teamspace_id=teamspace_id,
342
+ cloud_account_id=ca,
343
+ org_id=org_id,
344
+ )
345
+ if not accelerators.accelerator:
346
+ continue
347
+
348
+ if accelerators.accelerator:
349
+ for cluster_machine in accelerators.accelerator:
350
+ if not machine:
351
+ matched_accelerators.append(cluster_machine)
352
+ continue
353
+ if (
354
+ cluster_machine.resources.gpu == machine.accelerator_count
355
+ or cluster_machine.resources.cpu == machine.accelerator_count
356
+ ) and any(
357
+ machine.family.lower() in s
358
+ for s in (
359
+ cluster_machine.slug,
360
+ cluster_machine.slug_multi_cloud,
361
+ cluster_machine.instance_id,
362
+ )
363
+ ):
364
+ matched_accelerators.append(cluster_machine)
365
+ except Exception:
366
+ pass
367
+ return matched_accelerators
331
368
 
332
369
  def get_model(self, teamspace_id: str, model_id: Optional[str] = None, model_name: Optional[str] = None) -> V1Model:
333
370
  if model_id:
@@ -5,6 +5,7 @@ from lightning_sdk.lightning_cloud.login import Auth
5
5
  from lightning_sdk.lightning_cloud.openapi import (
6
6
  SecretServiceUpdateUserSecretBody,
7
7
  V1CloudSpace,
8
+ V1CreateProjectRequest,
8
9
  V1CreateUserSecretRequest,
9
10
  V1GetUserResponse,
10
11
  V1ListCloudSpacesResponse,
@@ -123,3 +124,7 @@ class UserApi:
123
124
  """
124
125
  pattern = r"^[A-Za-z_][A-Za-z0-9_]*$"
125
126
  return re.match(pattern, name) is not None
127
+
128
+ def create_teamspace(self, name: str) -> None:
129
+ """Creates a new teamspace."""
130
+ self._client.projects_service_create_project(body=V1CreateProjectRequest(name=name, display_name=name))
@@ -242,7 +242,8 @@ def _resolve_studio(studio: Optional[str]) -> Studio:
242
242
  and (re.match(studio_name, st["name"]) or studio_name in st["name"]),
243
243
  possible_studios,
244
244
  )
245
- if not len(possible_studios):
245
+ possible_studios = list(possible_studios)
246
+ if len(possible_studios) == 0:
246
247
  raise ValueError(
247
248
  f"Could not find Studio like '{studio}', please consider update your filtering pattern."
248
249
  )
@@ -31,7 +31,14 @@ class _StudiosMenu:
31
31
  title = "Please select a Studio of the following studios:"
32
32
 
33
33
  return TerminalMenu(
34
- [f"{s['teamspace']}/{s['name']}" for s in possible_studios], title=title, clear_menu_on_exit=True
34
+ [
35
+ f"{s['org']}/{s['teamspace']}/{s['name']}"
36
+ if s.get("org") is not None
37
+ else f"{s['teamspace']}/{s['name']}"
38
+ for s in possible_studios
39
+ ],
40
+ title=title,
41
+ clear_menu_on_exit=True,
35
42
  )
36
43
 
37
44
  @staticmethod
lightning_sdk/job/base.py CHANGED
@@ -87,11 +87,12 @@ class _BaseJob(ABC, metaclass=TrackCallsABCMeta):
87
87
  cloud_account_auth: bool = False,
88
88
  artifacts_local: Optional[str] = None,
89
89
  artifacts_remote: Optional[str] = None,
90
- entrypoint: str = "sh -c",
90
+ entrypoint: Optional[str] = None,
91
91
  path_mappings: Optional[Dict[str, str]] = None,
92
92
  max_runtime: Optional[int] = None,
93
93
  cluster: Optional[str] = None, # deprecated in favor of cloud_account
94
94
  reuse_snapshot: bool = True,
95
+ scratch_disks: Optional[Dict[str, int]] = None,
95
96
  ) -> "_BaseJob":
96
97
  """Run async workloads using a docker image or a compute environment from your studio.
97
98
 
@@ -192,7 +193,7 @@ class _BaseJob(ABC, metaclass=TrackCallsABCMeta):
192
193
  "Other jobs will automatically persist artifacts to the teamspace distributed filesystem."
193
194
  )
194
195
 
195
- if entrypoint != "sh -c":
196
+ if entrypoint is not None:
196
197
  raise ValueError("Specifying the entrypoint has no effect for jobs with Studio envs.")
197
198
 
198
199
  else:
@@ -218,6 +219,20 @@ class _BaseJob(ABC, metaclass=TrackCallsABCMeta):
218
219
  f"<CONNECTION_TYPE>:<CONNECTION_NAME>:<PATH_WITHIN_CONNECTION>, got {artifacts_local}"
219
220
  )
220
221
 
222
+ # command specified, so use the default entrypoint of sh -c
223
+ if command is not None and entrypoint is None:
224
+ entrypoint = "sh -c"
225
+
226
+ # entrypoint specifically set to empty string, so set to None here to fall back to the image entrypoint
227
+ elif entrypoint == "": # noqa: SIM114
228
+ entrypoint = None
229
+
230
+ # entrypoint not specified, but also no command specified, so use the image entrypoint
231
+ elif entrypoint is None:
232
+ entrypoint = None
233
+
234
+ # all other cases, the entrypoint has been specifically set, so use it as is
235
+
221
236
  inst = cls(name=name, teamspace=teamspace, org=org, user=user, _fetch_job=False)
222
237
  return inst._submit(
223
238
  machine=machine,
@@ -236,6 +251,7 @@ class _BaseJob(ABC, metaclass=TrackCallsABCMeta):
236
251
  path_mappings=path_mappings,
237
252
  max_runtime=max_runtime,
238
253
  reuse_snapshot=reuse_snapshot,
254
+ scratch_disks=scratch_disks,
239
255
  )
240
256
 
241
257
  @abstractmethod
@@ -253,10 +269,11 @@ class _BaseJob(ABC, metaclass=TrackCallsABCMeta):
253
269
  cloud_account_auth: bool = False,
254
270
  artifacts_local: Optional[str] = None,
255
271
  artifacts_remote: Optional[str] = None,
256
- entrypoint: str = "sh -c",
272
+ entrypoint: Optional[str] = None,
257
273
  path_mappings: Optional[Dict[str, str]] = None,
258
274
  max_runtime: Optional[int] = None,
259
275
  reuse_snapshot: bool = True,
276
+ scratch_disks: Optional[Dict[str, int]] = None,
260
277
  ) -> "_BaseJob":
261
278
  """Submit a new job to the Lightning AI platform.
262
279
 
@@ -289,7 +306,12 @@ class _BaseJob(ABC, metaclass=TrackCallsABCMeta):
289
306
  within it.
290
307
  Note that the connection needs to be added to the teamspace already in order for it to be found.
291
308
  Only supported for jobs with a docker image compute environment.
292
- entrypoint: The entrypoint of your docker container. Defaults to sh -c.
309
+ entrypoint: The entrypoint of your docker container. Defaults to `sh -c` which
310
+ just runs the provided command in a standard shell if a command is provided.
311
+ If no command is provided, it will run the pre-defined entrypoint of the provided image.
312
+ To use the pre-defined entrypoint of the provided image with a specified command,
313
+ set this to an empty string.
314
+ Only applicable when submitting docker jobs.
293
315
  To use the pre-defined entrypoint of the provided image, set this to an empty string.
294
316
  Only applicable when submitting docker jobs.
295
317
  max_runtime: the duration (in seconds) for which to allocate the machine.
lightning_sdk/job/job.py CHANGED
@@ -97,13 +97,14 @@ class Job(_BaseJob):
97
97
  interruptible: bool = False,
98
98
  image_credentials: Optional[str] = None,
99
99
  cloud_account_auth: bool = False,
100
- entrypoint: str = "sh -c",
100
+ entrypoint: Optional[str] = None,
101
101
  path_mappings: Optional[Dict[str, str]] = None,
102
102
  max_runtime: Optional[int] = None,
103
103
  artifacts_local: Optional[str] = None, # deprecated in terms of path_mappings
104
104
  artifacts_remote: Optional[str] = None, # deprecated in terms of path_mappings
105
105
  cluster: Optional[str] = None, # deprecated in favor of cloud_account
106
106
  reuse_snapshot: bool = True,
107
+ scratch_disks: Optional[Dict[str, int]] = None,
107
108
  ) -> "Job":
108
109
  """Run async workloads using a docker image or a compute environment from your studio.
109
110
 
@@ -131,8 +132,10 @@ class Job(_BaseJob):
131
132
  cloud_account_auth: Whether to authenticate with the cloud account to pull the image.
132
133
  Required if the registry is part of a cloud provider (e.g. ECR).
133
134
  entrypoint: The entrypoint of your docker container. Defaults to `sh -c` which
134
- just runs the provided command in a standard shell.
135
- To use the pre-defined entrypoint of the provided image, set this to an empty string.
135
+ just runs the provided command in a standard shell if a command is provided.
136
+ If no command is provided, it will run the pre-defined entrypoint of the provided image.
137
+ To use the pre-defined entrypoint of the provided image with a specified command,
138
+ set this to an empty string.
136
139
  Only applicable when submitting docker jobs.
137
140
  path_mappings: Dictionary of path mappings. The keys are the path inside the container whereas the value
138
141
  represents the data-connection name and the path inside that connection.
@@ -172,6 +175,7 @@ class Job(_BaseJob):
172
175
  max_runtime=max_runtime,
173
176
  cluster=cluster,
174
177
  reuse_snapshot=reuse_snapshot,
178
+ scratch_disks=scratch_disks,
175
179
  )
176
180
  # required for typing with "Job"
177
181
  assert isinstance(ret_val, cls)
@@ -191,12 +195,13 @@ class Job(_BaseJob):
191
195
  cloud_provider: Optional[Union["CloudProvider", str]] = None,
192
196
  image_credentials: Optional[str] = None,
193
197
  cloud_account_auth: bool = False,
194
- entrypoint: str = "sh -c",
198
+ entrypoint: Optional[str] = None,
195
199
  path_mappings: Optional[Dict[str, str]] = None,
196
200
  artifacts_local: Optional[str] = None, # deprecated in terms of path_mappings
197
201
  artifacts_remote: Optional[str] = None, # deprecated in terms of path_mappings
198
202
  max_runtime: Optional[int] = None,
199
203
  reuse_snapshot: bool = True,
204
+ scratch_disks: Optional[Dict[str, int]] = None,
200
205
  ) -> "Job":
201
206
  """Submit a new job to the Lightning AI platform.
202
207
 
@@ -219,7 +224,12 @@ class Job(_BaseJob):
219
224
  This should be the name of the respective credentials secret created on the Lightning AI platform.
220
225
  cloud_account_auth: Whether to authenticate with the cloud account to pull the image.
221
226
  Required if the registry is part of a cloud provider (e.g. ECR).
222
- entrypoint: The entrypoint of your docker container. Defaults to sh -c.
227
+ entrypoint: The entrypoint of your docker container. Defaults to `sh -c` which
228
+ just runs the provided command in a standard shell if a command is provided.
229
+ If no command is provided, it will run the pre-defined entrypoint of the provided image.
230
+ To use the pre-defined entrypoint of the provided image with a specified command,
231
+ set this to an empty string.
232
+ Only applicable when submitting docker jobs.
223
233
  To use the pre-defined entrypoint of the provided image, set this to an empty string.
224
234
  Only applicable when submitting docker jobs.
225
235
  path_mappings: Dictionary of path mappings. The keys are the path inside the container whereas the value
@@ -255,6 +265,7 @@ class Job(_BaseJob):
255
265
  artifacts_remote=artifacts_remote,
256
266
  max_runtime=max_runtime,
257
267
  reuse_snapshot=reuse_snapshot,
268
+ scratch_disks=scratch_disks,
258
269
  )
259
270
  return self
260
271
 
lightning_sdk/job/v1.py CHANGED
@@ -55,6 +55,7 @@ class _JobV1(_BaseJob):
55
55
  interruptible: bool = False,
56
56
  cluster: Optional[str] = None, # deprecated in favor of cloud_account
57
57
  reuse_snapshot: bool = True,
58
+ scratch_disks: Optional[Dict[str, int]] = None,
58
59
  ) -> "_BaseJob":
59
60
  """Start a new async workload from your studio.
60
61
 
@@ -107,10 +108,11 @@ class _JobV1(_BaseJob):
107
108
  cloud_account_auth: bool = False,
108
109
  artifacts_local: Optional[str] = None,
109
110
  artifacts_remote: Optional[str] = None,
110
- entrypoint: str = "sh -c",
111
+ entrypoint: Optional[str] = None,
111
112
  path_mappings: Optional[Dict[str, str]] = None,
112
113
  max_runtime: Optional[int] = None,
113
114
  reuse_snapshot: bool = True,
115
+ scratch_disks: Optional[Dict[str, int]] = None,
114
116
  ) -> "_JobV1":
115
117
  """Submit a job to run on a machine.
116
118
 
@@ -125,7 +127,10 @@ class _JobV1(_BaseJob):
125
127
  image_credentials: The image credentials for the job (not supported).
126
128
  cloud_account_auth: Whether to use cloud account authentication for the job (not supported).
127
129
  entrypoint: The entrypoint of your docker container (not supported).
128
- Defaults to `sh -c` which just runs the provided command in a standard shell.
130
+ Defaults to `sh -c` which just runs the provided command in a standard shell if a command is provided.
131
+ If no command is provided, it will run the pre-defined entrypoint of the provided image.
132
+ To use the pre-defined entrypoint of the provided image with a specified command,
133
+ set this to an empty string.
129
134
  To use the pre-defined entrypoint of the provided image, set this to an empty string.
130
135
  Only applicable when submitting docker jobs.
131
136
  path_mappings: The mappings from data connection inside your container (not supported)
lightning_sdk/job/v2.py CHANGED
@@ -1,3 +1,4 @@
1
+ from pathlib import PurePath
1
2
  from typing import TYPE_CHECKING, Dict, Optional, Union
2
3
 
3
4
  from lightning_sdk.api.job_api import JobApiV2
@@ -48,12 +49,13 @@ class _JobV2(_BaseJob):
48
49
  cloud_provider: Optional[Union["CloudProvider", str]] = None,
49
50
  image_credentials: Optional[str] = None,
50
51
  cloud_account_auth: bool = False,
51
- entrypoint: str = "sh -c",
52
+ entrypoint: Optional[str] = None,
52
53
  path_mappings: Optional[Dict[str, str]] = None,
53
54
  max_runtime: Optional[int] = None,
54
55
  artifacts_local: Optional[str] = None, # deprecated in favor of path_mappings
55
56
  artifacts_remote: Optional[str] = None, # deprecated in favor of path_mappings
56
57
  reuse_snapshot: bool = True,
58
+ scratch_disks: Optional[Dict[str, int]] = None,
57
59
  ) -> "_JobV2":
58
60
  """Submit a new job to the Lightning AI platform.
59
61
 
@@ -72,6 +74,14 @@ class _JobV2(_BaseJob):
72
74
  This should be the name of the respective credentials secret created on the Lightning AI platform.
73
75
  cloud_account_auth: Whether to authenticate with the cloud account to pull the image.
74
76
  Required if the registry is part of a cloud provider (e.g. ECR).
77
+ entrypoint: The entrypoint of your docker container. Defaults to `sh -c` which
78
+ just runs the provided command in a standard shell if a command is provided.
79
+ If no command is provided, it will run the pre-defined entrypoint of the provided image.
80
+ To use the pre-defined entrypoint of the provided image with a specified command,
81
+ set this to an empty string.
82
+ Only applicable when submitting docker jobs.
83
+ To use the pre-defined entrypoint of the provided image, set this to an empty string.
84
+ Only applicable when submitting docker jobs.
75
85
  artifacts_local: The path of inside the docker container, you want to persist images from.
76
86
  CAUTION: When setting this to "/", it will effectively erase your container.
77
87
  Only supported for jobs with a docker image compute environment.
@@ -90,6 +100,11 @@ class _JobV2(_BaseJob):
90
100
  Defaults to 3h
91
101
  reuse_snapshot: Whether the job should reuse a Studio snapshot when multiple jobs for the same Studio are
92
102
  submitted. Turning this off may result in longer job startup times. Defaults to True.
103
+ scratch_disks: Dictionary of scratch disks to add to the job. The keys are the path that the disk
104
+ will be mounted to, relative to the /teamspace/scratch directory. The values are the size of
105
+ the volume in GiB. For example, { "data": 100 } will add a 100GiB volume available under
106
+ /teamspace/scratch/data.
107
+
93
108
  """
94
109
  # Command is required if Studio is provided to know what to run
95
110
  # Image is mutually exclusive with Studio
@@ -115,6 +130,30 @@ class _JobV2(_BaseJob):
115
130
  default_cloud_account=self._teamspace.default_cloud_account,
116
131
  )
117
132
 
133
+ if scratch_disks is not None and len(scratch_disks) > 0:
134
+ if studio is None:
135
+ raise ValueError("scratch_disks are only supported within a studio job")
136
+
137
+ if len(scratch_disks) > 5:
138
+ raise ValueError("scratch_disk may only contain up to 5 elements")
139
+
140
+ for path, size in scratch_disks.items():
141
+ if size > 50000:
142
+ raise ValueError("scratch_disk size cannot exceed 50TiB")
143
+
144
+ path = PurePath(path)
145
+
146
+ if path.is_absolute():
147
+ # For compatibility with Python 3.8, which doesn't provide
148
+ # pathlib.PurePath.is_relative_to.
149
+ try:
150
+ path.relative_to("/teamspace/scratch")
151
+ except ValueError:
152
+ raise ValueError("scratch_disk paths must be relative to /teamspace/scratch") from None
153
+
154
+ if ".." in path.parts:
155
+ raise ValueError("scratch_disk path cannot contain '..'")
156
+
118
157
  submitted = self._job_api.submit_job(
119
158
  name=self.name,
120
159
  command=command,
@@ -133,6 +172,7 @@ class _JobV2(_BaseJob):
133
172
  path_mappings=path_mappings,
134
173
  max_runtime=max_runtime,
135
174
  reuse_snapshot=reuse_snapshot,
175
+ scratch_disks=scratch_disks,
136
176
  )
137
177
  self._job = submitted
138
178
  self._name = submitted.name
@@ -42,6 +42,7 @@ from lightning_sdk.lightning_cloud.openapi.api.git_credentials_service_api impor
42
42
  from lightning_sdk.lightning_cloud.openapi.api.incidents_service_api import IncidentsServiceApi
43
43
  from lightning_sdk.lightning_cloud.openapi.api.jobs_service_api import JobsServiceApi
44
44
  from lightning_sdk.lightning_cloud.openapi.api.k8_s_cluster_service_api import K8SClusterServiceApi
45
+ from lightning_sdk.lightning_cloud.openapi.api.kubernetes_virtual_machine_service_api import KubernetesVirtualMachineServiceApi
45
46
  from lightning_sdk.lightning_cloud.openapi.api.lightningapp_instance_service_api import LightningappInstanceServiceApi
46
47
  from lightning_sdk.lightning_cloud.openapi.api.lightningapp_v2_service_api import LightningappV2ServiceApi
47
48
  from lightning_sdk.lightning_cloud.openapi.api.lightningwork_service_api import LightningworkServiceApi
@@ -132,6 +133,7 @@ from lightning_sdk.lightning_cloud.openapi.models.cloud_space_service_update_clo
132
133
  from lightning_sdk.lightning_cloud.openapi.models.cloud_space_service_update_cloud_space_version_publication_body import CloudSpaceServiceUpdateCloudSpaceVersionPublicationBody
133
134
  from lightning_sdk.lightning_cloud.openapi.models.cloud_space_service_update_cloud_space_visibility_body import CloudSpaceServiceUpdateCloudSpaceVisibilityBody
134
135
  from lightning_sdk.lightning_cloud.openapi.models.cloudy_service_update_user_cloudy_settings_body import CloudyServiceUpdateUserCloudySettingsBody
136
+ from lightning_sdk.lightning_cloud.openapi.models.cluster_service_add_container_registry_body import ClusterServiceAddContainerRegistryBody
135
137
  from lightning_sdk.lightning_cloud.openapi.models.cluster_service_create_cluster_capacity_reservation_body import ClusterServiceCreateClusterCapacityReservationBody
136
138
  from lightning_sdk.lightning_cloud.openapi.models.cluster_service_create_cluster_proxy_body import ClusterServiceCreateClusterProxyBody
137
139
  from lightning_sdk.lightning_cloud.openapi.models.cluster_service_create_cluster_usage_restriction_body import ClusterServiceCreateClusterUsageRestrictionBody
@@ -140,11 +142,13 @@ from lightning_sdk.lightning_cloud.openapi.models.cluster_service_create_project
140
142
  from lightning_sdk.lightning_cloud.openapi.models.cluster_service_create_server_alert_body import ClusterServiceCreateServerAlertBody
141
143
  from lightning_sdk.lightning_cloud.openapi.models.cluster_service_interrupt_server_body import ClusterServiceInterruptServerBody
142
144
  from lightning_sdk.lightning_cloud.openapi.models.cluster_service_purchase_capacity_block_body import ClusterServicePurchaseCapacityBlockBody
145
+ from lightning_sdk.lightning_cloud.openapi.models.cluster_service_refresh_container_registry_credentials_body import ClusterServiceRefreshContainerRegistryCredentialsBody
143
146
  from lightning_sdk.lightning_cloud.openapi.models.cluster_service_server_check_in_body import ClusterServiceServerCheckInBody
144
147
  from lightning_sdk.lightning_cloud.openapi.models.cluster_service_sleep_server_body import ClusterServiceSleepServerBody
145
148
  from lightning_sdk.lightning_cloud.openapi.models.cluster_service_update_cluster_body import ClusterServiceUpdateClusterBody
146
149
  from lightning_sdk.lightning_cloud.openapi.models.cluster_service_update_cluster_usage_restriction_body import ClusterServiceUpdateClusterUsageRestrictionBody
147
150
  from lightning_sdk.lightning_cloud.openapi.models.cluster_service_update_project_cluster_body import ClusterServiceUpdateProjectClusterBody
151
+ from lightning_sdk.lightning_cloud.openapi.models.cluster_service_validate_container_registry_body import ClusterServiceValidateContainerRegistryBody
148
152
  from lightning_sdk.lightning_cloud.openapi.models.create_checkout_session_request_wallet_type import CreateCheckoutSessionRequestWalletType
149
153
  from lightning_sdk.lightning_cloud.openapi.models.data_connection_mount_data_connection_mount_copy_status import DataConnectionMountDataConnectionMountCopyStatus
150
154
  from lightning_sdk.lightning_cloud.openapi.models.data_connection_service_create_data_connection_body import DataConnectionServiceCreateDataConnectionBody
@@ -191,6 +195,8 @@ from lightning_sdk.lightning_cloud.openapi.models.k8_s_cluster_service_create_ku
191
195
  from lightning_sdk.lightning_cloud.openapi.models.k8_s_cluster_service_render_kubernetes_template_body import K8SClusterServiceRenderKubernetesTemplateBody
192
196
  from lightning_sdk.lightning_cloud.openapi.models.k8_s_cluster_service_report_k8_s_cluster_metrics_body import K8SClusterServiceReportK8SClusterMetricsBody
193
197
  from lightning_sdk.lightning_cloud.openapi.models.k8_s_cluster_service_update_kubernetes_template_body import K8SClusterServiceUpdateKubernetesTemplateBody
198
+ from lightning_sdk.lightning_cloud.openapi.models.kubernetes_virtual_machine_service_create_kubernetes_virtual_machine_body import KubernetesVirtualMachineServiceCreateKubernetesVirtualMachineBody
199
+ from lightning_sdk.lightning_cloud.openapi.models.kubernetes_virtual_machine_service_update_kubernetes_virtual_machine_body import KubernetesVirtualMachineServiceUpdateKubernetesVirtualMachineBody
194
200
  from lightning_sdk.lightning_cloud.openapi.models.lightningapp_instance_service_update_lightningapp_instance_body import LightningappInstanceServiceUpdateLightningappInstanceBody
195
201
  from lightning_sdk.lightning_cloud.openapi.models.lightningapp_instance_service_update_lightningapp_instance_release_body import LightningappInstanceServiceUpdateLightningappInstanceReleaseBody
196
202
  from lightning_sdk.lightning_cloud.openapi.models.lightningapp_instance_service_upload_lightningapp_instance_artifact_body import LightningappInstanceServiceUploadLightningappInstanceArtifactBody
@@ -295,6 +301,7 @@ from lightning_sdk.lightning_cloud.openapi.models.v1_aws_direct_v1_status import
295
301
  from lightning_sdk.lightning_cloud.openapi.models.v1_abort_storage_transfer_response import V1AbortStorageTransferResponse
296
302
  from lightning_sdk.lightning_cloud.openapi.models.v1_accelerator_quota_info import V1AcceleratorQuotaInfo
297
303
  from lightning_sdk.lightning_cloud.openapi.models.v1_ack_user_storage_violation_response import V1AckUserStorageViolationResponse
304
+ from lightning_sdk.lightning_cloud.openapi.models.v1_add_container_registry_response import V1AddContainerRegistryResponse
298
305
  from lightning_sdk.lightning_cloud.openapi.models.v1_add_job_timing_response import V1AddJobTimingResponse
299
306
  from lightning_sdk.lightning_cloud.openapi.models.v1_affiliate_link import V1AffiliateLink
300
307
  from lightning_sdk.lightning_cloud.openapi.models.v1_agent_complete_part_response import V1AgentCompletePartResponse
@@ -412,6 +419,10 @@ from lightning_sdk.lightning_cloud.openapi.models.v1_compute_config import V1Com
412
419
  from lightning_sdk.lightning_cloud.openapi.models.v1_contact_assistant_owner_reason import V1ContactAssistantOwnerReason
413
420
  from lightning_sdk.lightning_cloud.openapi.models.v1_contact_assistant_owner_response import V1ContactAssistantOwnerResponse
414
421
  from lightning_sdk.lightning_cloud.openapi.models.v1_container_metrics import V1ContainerMetrics
422
+ from lightning_sdk.lightning_cloud.openapi.models.v1_container_registry import V1ContainerRegistry
423
+ from lightning_sdk.lightning_cloud.openapi.models.v1_container_registry_info import V1ContainerRegistryInfo
424
+ from lightning_sdk.lightning_cloud.openapi.models.v1_container_registry_integration import V1ContainerRegistryIntegration
425
+ from lightning_sdk.lightning_cloud.openapi.models.v1_container_registry_status import V1ContainerRegistryStatus
415
426
  from lightning_sdk.lightning_cloud.openapi.models.v1_conversation import V1Conversation
416
427
  from lightning_sdk.lightning_cloud.openapi.models.v1_conversation_response_chunk import V1ConversationResponseChunk
417
428
  from lightning_sdk.lightning_cloud.openapi.models.v1_count_metrics_streams_response import V1CountMetricsStreamsResponse
@@ -481,6 +492,7 @@ from lightning_sdk.lightning_cloud.openapi.models.v1_delete_cluster_encryption_k
481
492
  from lightning_sdk.lightning_cloud.openapi.models.v1_delete_cluster_proxy_response import V1DeleteClusterProxyResponse
482
493
  from lightning_sdk.lightning_cloud.openapi.models.v1_delete_cluster_response import V1DeleteClusterResponse
483
494
  from lightning_sdk.lightning_cloud.openapi.models.v1_delete_cluster_usage_restriction_response import V1DeleteClusterUsageRestrictionResponse
495
+ from lightning_sdk.lightning_cloud.openapi.models.v1_delete_container_registry_response import V1DeleteContainerRegistryResponse
484
496
  from lightning_sdk.lightning_cloud.openapi.models.v1_delete_conversation_response import V1DeleteConversationResponse
485
497
  from lightning_sdk.lightning_cloud.openapi.models.v1_delete_data_connection_response import V1DeleteDataConnectionResponse
486
498
  from lightning_sdk.lightning_cloud.openapi.models.v1_delete_dataset_response import V1DeleteDatasetResponse
@@ -494,6 +506,7 @@ from lightning_sdk.lightning_cloud.openapi.models.v1_delete_incident_response im
494
506
  from lightning_sdk.lightning_cloud.openapi.models.v1_delete_index_response import V1DeleteIndexResponse
495
507
  from lightning_sdk.lightning_cloud.openapi.models.v1_delete_job_response import V1DeleteJobResponse
496
508
  from lightning_sdk.lightning_cloud.openapi.models.v1_delete_kubernetes_template_response import V1DeleteKubernetesTemplateResponse
509
+ from lightning_sdk.lightning_cloud.openapi.models.v1_delete_kubernetes_virtual_machine_response import V1DeleteKubernetesVirtualMachineResponse
497
510
  from lightning_sdk.lightning_cloud.openapi.models.v1_delete_license_response import V1DeleteLicenseResponse
498
511
  from lightning_sdk.lightning_cloud.openapi.models.v1_delete_lightning_run_response import V1DeleteLightningRunResponse
499
512
  from lightning_sdk.lightning_cloud.openapi.models.v1_delete_lightningapp_instance_artifact_response import V1DeleteLightningappInstanceArtifactResponse
@@ -569,6 +582,9 @@ from lightning_sdk.lightning_cloud.openapi.models.v1_drive_status import V1Drive
569
582
  from lightning_sdk.lightning_cloud.openapi.models.v1_drive_type import V1DriveType
570
583
  from lightning_sdk.lightning_cloud.openapi.models.v1_drive_type_spec import V1DriveTypeSpec
571
584
  from lightning_sdk.lightning_cloud.openapi.models.v1_drive_type_status import V1DriveTypeStatus
585
+ from lightning_sdk.lightning_cloud.openapi.models.v1_ecr_registry_config import V1ECRRegistryConfig
586
+ from lightning_sdk.lightning_cloud.openapi.models.v1_ecr_registry_config_input import V1ECRRegistryConfigInput
587
+ from lightning_sdk.lightning_cloud.openapi.models.v1_ecr_registry_details import V1ECRRegistryDetails
572
588
  from lightning_sdk.lightning_cloud.openapi.models.v1_efs_config import V1EfsConfig
573
589
  from lightning_sdk.lightning_cloud.openapi.models.v1_endpoint import V1Endpoint
574
590
  from lightning_sdk.lightning_cloud.openapi.models.v1_endpoint_auth import V1EndpointAuth
@@ -712,6 +728,11 @@ from lightning_sdk.lightning_cloud.openapi.models.v1_kubernetes_direct_v1_status
712
728
  from lightning_sdk.lightning_cloud.openapi.models.v1_kubernetes_pod import V1KubernetesPod
713
729
  from lightning_sdk.lightning_cloud.openapi.models.v1_kubernetes_template import V1KubernetesTemplate
714
730
  from lightning_sdk.lightning_cloud.openapi.models.v1_kubernetes_template_property import V1KubernetesTemplateProperty
731
+ from lightning_sdk.lightning_cloud.openapi.models.v1_kubernetes_virtual_machine import V1KubernetesVirtualMachine
732
+ from lightning_sdk.lightning_cloud.openapi.models.v1_kubevirt_config import V1KubevirtConfig
733
+ from lightning_sdk.lightning_cloud.openapi.models.v1_kubevirt_provider_configuration import V1KubevirtProviderConfiguration
734
+ from lightning_sdk.lightning_cloud.openapi.models.v1_kubevirt_vm_configuration import V1KubevirtVmConfiguration
735
+ from lightning_sdk.lightning_cloud.openapi.models.v1_kubevirt_vm_resources import V1KubevirtVmResources
715
736
  from lightning_sdk.lightning_cloud.openapi.models.v1_lambda_labs_direct_v1 import V1LambdaLabsDirectV1
716
737
  from lightning_sdk.lightning_cloud.openapi.models.v1_license import V1License
717
738
  from lightning_sdk.lightning_cloud.openapi.models.v1_lightning_app_user import V1LightningAppUser
@@ -764,6 +785,7 @@ from lightning_sdk.lightning_cloud.openapi.models.v1_list_cluster_proxies_respon
764
785
  from lightning_sdk.lightning_cloud.openapi.models.v1_list_cluster_usage_restrictions_response import V1ListClusterUsageRestrictionsResponse
765
786
  from lightning_sdk.lightning_cloud.openapi.models.v1_list_clusters_response import V1ListClustersResponse
766
787
  from lightning_sdk.lightning_cloud.openapi.models.v1_list_container_metrics_response import V1ListContainerMetricsResponse
788
+ from lightning_sdk.lightning_cloud.openapi.models.v1_list_container_registries_response import V1ListContainerRegistriesResponse
767
789
  from lightning_sdk.lightning_cloud.openapi.models.v1_list_conversation_message_actions_response import V1ListConversationMessageActionsResponse
768
790
  from lightning_sdk.lightning_cloud.openapi.models.v1_list_conversations_response import V1ListConversationsResponse
769
791
  from lightning_sdk.lightning_cloud.openapi.models.v1_list_data_connection_artifacts_response import V1ListDataConnectionArtifactsResponse
@@ -783,7 +805,7 @@ from lightning_sdk.lightning_cloud.openapi.models.v1_list_filesystem_apps_respon
783
805
  from lightning_sdk.lightning_cloud.openapi.models.v1_list_filesystem_cloud_spaces_response import V1ListFilesystemCloudSpacesResponse
784
806
  from lightning_sdk.lightning_cloud.openapi.models.v1_list_filesystem_datasets_response import V1ListFilesystemDatasetsResponse
785
807
  from lightning_sdk.lightning_cloud.openapi.models.v1_list_filesystem_jobs_response import V1ListFilesystemJobsResponse
786
- from lightning_sdk.lightning_cloud.openapi.models.v1_list_filesystem_mm_ts_response import V1ListFilesystemMMTsResponse
808
+ from lightning_sdk.lightning_cloud.openapi.models.v1_list_filesystem_mmts_response import V1ListFilesystemMMTsResponse
787
809
  from lightning_sdk.lightning_cloud.openapi.models.v1_list_filesystem_metrics_response import V1ListFilesystemMetricsResponse
788
810
  from lightning_sdk.lightning_cloud.openapi.models.v1_list_filesystem_slurm_jobs_response import V1ListFilesystemSlurmJobsResponse
789
811
  from lightning_sdk.lightning_cloud.openapi.models.v1_list_filesystem_snowflake_response import V1ListFilesystemSnowflakeResponse
@@ -803,6 +825,7 @@ from lightning_sdk.lightning_cloud.openapi.models.v1_list_joinable_organizations
803
825
  from lightning_sdk.lightning_cloud.openapi.models.v1_list_kai_scheduler_queues_metrics_response import V1ListKaiSchedulerQueuesMetricsResponse
804
826
  from lightning_sdk.lightning_cloud.openapi.models.v1_list_kubernetes_pods_response import V1ListKubernetesPodsResponse
805
827
  from lightning_sdk.lightning_cloud.openapi.models.v1_list_kubernetes_templates_response import V1ListKubernetesTemplatesResponse
828
+ from lightning_sdk.lightning_cloud.openapi.models.v1_list_kubernetes_virtual_machines_response import V1ListKubernetesVirtualMachinesResponse
806
829
  from lightning_sdk.lightning_cloud.openapi.models.v1_list_license_response import V1ListLicenseResponse
807
830
  from lightning_sdk.lightning_cloud.openapi.models.v1_list_lightning_run_response import V1ListLightningRunResponse
808
831
  from lightning_sdk.lightning_cloud.openapi.models.v1_list_lightningapp_instance_artifacts_response import V1ListLightningappInstanceArtifactsResponse
@@ -981,6 +1004,7 @@ from lightning_sdk.lightning_cloud.openapi.models.v1_quotas import V1Quotas
981
1004
  from lightning_sdk.lightning_cloud.openapi.models.v1_quote_annual_upsell_response import V1QuoteAnnualUpsellResponse
982
1005
  from lightning_sdk.lightning_cloud.openapi.models.v1_quote_subscription_response import V1QuoteSubscriptionResponse
983
1006
  from lightning_sdk.lightning_cloud.openapi.models.v1_r2_data_connection import V1R2DataConnection
1007
+ from lightning_sdk.lightning_cloud.openapi.models.v1_refresh_container_registry_credentials_response import V1RefreshContainerRegistryCredentialsResponse
984
1008
  from lightning_sdk.lightning_cloud.openapi.models.v1_refresh_index_response import V1RefreshIndexResponse
985
1009
  from lightning_sdk.lightning_cloud.openapi.models.v1_refresh_path_response import V1RefreshPathResponse
986
1010
  from lightning_sdk.lightning_cloud.openapi.models.v1_refresh_request import V1RefreshRequest
@@ -1141,6 +1165,7 @@ from lightning_sdk.lightning_cloud.openapi.models.v1_user_requested_flow_compute
1141
1165
  from lightning_sdk.lightning_cloud.openapi.models.v1_user_slurm_job_action_response import V1UserSLURMJobActionResponse
1142
1166
  from lightning_sdk.lightning_cloud.openapi.models.v1_validate_assistant_status_response import V1ValidateAssistantStatusResponse
1143
1167
  from lightning_sdk.lightning_cloud.openapi.models.v1_validate_auto_join_domain_response import V1ValidateAutoJoinDomainResponse
1168
+ from lightning_sdk.lightning_cloud.openapi.models.v1_validate_container_registry_response import V1ValidateContainerRegistryResponse
1144
1169
  from lightning_sdk.lightning_cloud.openapi.models.v1_validate_data_connection_response import V1ValidateDataConnectionResponse
1145
1170
  from lightning_sdk.lightning_cloud.openapi.models.v1_validate_deployment_image_request import V1ValidateDeploymentImageRequest
1146
1171
  from lightning_sdk.lightning_cloud.openapi.models.v1_validate_deployment_image_response import V1ValidateDeploymentImageResponse