anyscale 0.25.10__py3-none-any.whl → 0.26.0__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.
@@ -546,9 +546,7 @@ class AnyscaleClient(AnyscaleClientInterface):
546
546
  @handle_api_exceptions
547
547
  def get_cloud(self, *, cloud_id: str) -> Optional[Cloud]:
548
548
  try:
549
- cloud: Cloud = self._internal_api_client.get_cloud_api_v2_clouds_cloud_id_get(
550
- cloud_id
551
- ).result
549
+ cloud: Cloud = self._external_api_client.get_cloud(cloud_id=cloud_id).result
552
550
  return cloud
553
551
  except InternalApiException as e:
554
552
  if e.status == 404:
@@ -556,6 +554,21 @@ class AnyscaleClient(AnyscaleClientInterface):
556
554
 
557
555
  raise e from None
558
556
 
557
+ @handle_api_exceptions
558
+ def get_cloud_by_name(self, *, name) -> Optional[Cloud]:
559
+ cloud_id = self.get_cloud_id(cloud_name=name)
560
+ return self.get_cloud(cloud_id=cloud_id)
561
+
562
+ @handle_api_exceptions
563
+ def get_default_cloud(self) -> Optional[Cloud]:
564
+ try:
565
+ return self._external_api_client.get_default_cloud().result
566
+ except InternalApiException as e:
567
+ if e.status == 404:
568
+ return None
569
+
570
+ raise e from None
571
+
559
572
  @handle_api_exceptions
560
573
  def add_cloud_collaborators(
561
574
  self, cloud_id: str, collaborators: List[CreateCloudCollaborator]
@@ -150,6 +150,19 @@ class AnyscaleClientInterface(ABC):
150
150
  """
151
151
  raise NotImplementedError
152
152
 
153
+ @abstractmethod
154
+ def get_cloud_by_name(self, *, name: str) -> Optional[Cloud]:
155
+ """Get the cloud model for the provided cloud name.
156
+
157
+ Returns `None` if the cloud name was not found.
158
+ """
159
+ raise NotImplementedError
160
+
161
+ @abstractmethod
162
+ def get_default_cloud(self) -> Optional[Cloud]:
163
+ """Get the user's default cloud."""
164
+ raise NotImplementedError
165
+
153
166
  @abstractmethod
154
167
  def add_cloud_collaborators(
155
168
  self, cloud_id: str, collaborators: List[CreateCloudCollaborator]
@@ -368,6 +368,15 @@ class FakeAnyscaleClient(AnyscaleClientInterface):
368
368
  def get_cloud(self, *, cloud_id: str) -> Optional[Cloud]:
369
369
  return self._clouds.get(cloud_id, None)
370
370
 
371
+ def get_cloud_by_name(self, *, name: str) -> Optional[Cloud]:
372
+ for c in self._clouds.values():
373
+ if c.name == name:
374
+ return c
375
+ return None
376
+
377
+ def get_default_cloud(self) -> Optional[Cloud]:
378
+ return self._clouds.get(self.DEFAULT_CLOUD_ID, None)
379
+
371
380
  def add_cloud_collaborators(
372
381
  self, cloud_id: str, collaborators: List[CreateCloudCollaborator]
373
382
  ) -> None:
@@ -11,7 +11,10 @@ from anyscale import scripts
11
11
  from anyscale._private.docgen.generator import MarkdownGenerator, Module
12
12
  from anyscale.aggregated_instance_usage.models import DownloadCSVFilters
13
13
  from anyscale.cloud.models import (
14
+ Cloud,
14
15
  CloudPermissionLevel,
16
+ CloudProvider,
17
+ ComputeStack,
15
18
  CreateCloudCollaborator,
16
19
  )
17
20
  from anyscale.commands import (
@@ -443,10 +446,22 @@ ALL_MODULES = [
443
446
  cloud_commands.cloud_config_update,
444
447
  cloud_commands.cloud_set_default,
445
448
  cloud_commands.add_collaborators,
449
+ cloud_commands.get_cloud,
450
+ cloud_commands.get_default_cloud,
446
451
  ],
447
452
  sdk_prefix="anyscale.cloud",
448
- sdk_commands=[anyscale.cloud.add_collaborators],
449
- models=[CloudPermissionLevel, CreateCloudCollaborator],
453
+ sdk_commands=[
454
+ anyscale.cloud.add_collaborators,
455
+ anyscale.cloud.get,
456
+ anyscale.cloud.get_default,
457
+ ],
458
+ models=[
459
+ CloudPermissionLevel,
460
+ CreateCloudCollaborator,
461
+ Cloud,
462
+ ComputeStack,
463
+ CloudProvider,
464
+ ],
450
465
  cli_command_group_prefix={cloud_commands.cloud_config_update: "config"},
451
466
  legacy_sdk_commands={
452
467
  # limited support, no replacement yet
@@ -1473,8 +1473,8 @@ Name | Type | Description | Notes
1473
1473
  **last_used_cloud_id** | **str** | ID of the last cloud used in this project, or by the user if this is a new project. | [optional] [default to null]
1474
1474
  **is_default** | **bool** | True if this project is the default project for the organization. | [default to null]
1475
1475
  **directory_name** | **str** | Directory name of project to be used as working directory of clusters. | [default to null]
1476
- **active_sessions** | **int** | Read only. Number of active sessions for this project. | [default to null]
1477
- **last_activity_at** | **datetime** | Read only. The most recent activity for this project. This is based on the most recently created sessions | [default to null]
1476
+ **active_sessions** | **int** | DEPRECATED. Number of active sessions for this project. | [optional] [default to 0]
1477
+ **last_activity_at** | **datetime** | DEPRECATED. The most recent activity for this project. This is based on the most recently created sessions | [optional] [default to null]
1478
1478
 
1479
1479
  ## ProjectListResponse
1480
1480
 
@@ -46,10 +46,10 @@ class Project(object):
46
46
  'directory_name': 'str',
47
47
  'cloud': 'str',
48
48
  'last_used_cloud_id': 'str',
49
- 'active_sessions': 'int',
50
- 'last_activity_at': 'datetime',
51
49
  'owners': 'list[MiniUser]',
52
- 'is_default': 'bool'
50
+ 'is_default': 'bool',
51
+ 'active_sessions': 'int',
52
+ 'last_activity_at': 'datetime'
53
53
  }
54
54
 
55
55
  attribute_map = {
@@ -66,13 +66,13 @@ class Project(object):
66
66
  'directory_name': 'directory_name',
67
67
  'cloud': 'cloud',
68
68
  'last_used_cloud_id': 'last_used_cloud_id',
69
- 'active_sessions': 'active_sessions',
70
- 'last_activity_at': 'last_activity_at',
71
69
  'owners': 'owners',
72
- 'is_default': 'is_default'
70
+ 'is_default': 'is_default',
71
+ 'active_sessions': 'active_sessions',
72
+ 'last_activity_at': 'last_activity_at'
73
73
  }
74
74
 
75
- def __init__(self, name=None, description=None, cloud_id=None, initial_cluster_config=None, parent_cloud_id=None, id=None, created_at=None, creator_id=None, is_owner=None, is_read_only=None, directory_name=None, cloud=None, last_used_cloud_id=None, active_sessions=None, last_activity_at=None, owners=[], is_default=None, local_vars_configuration=None): # noqa: E501
75
+ def __init__(self, name=None, description=None, cloud_id=None, initial_cluster_config=None, parent_cloud_id=None, id=None, created_at=None, creator_id=None, is_owner=None, is_read_only=None, directory_name=None, cloud=None, last_used_cloud_id=None, owners=[], is_default=None, active_sessions=0, last_activity_at=None, local_vars_configuration=None): # noqa: E501
76
76
  """Project - a model defined in OpenAPI""" # noqa: E501
77
77
  if local_vars_configuration is None:
78
78
  local_vars_configuration = Configuration()
@@ -91,10 +91,10 @@ class Project(object):
91
91
  self._directory_name = None
92
92
  self._cloud = None
93
93
  self._last_used_cloud_id = None
94
- self._active_sessions = None
95
- self._last_activity_at = None
96
94
  self._owners = None
97
95
  self._is_default = None
96
+ self._active_sessions = None
97
+ self._last_activity_at = None
98
98
  self.discriminator = None
99
99
 
100
100
  self.name = name
@@ -116,11 +116,13 @@ class Project(object):
116
116
  self.cloud = cloud
117
117
  if last_used_cloud_id is not None:
118
118
  self.last_used_cloud_id = last_used_cloud_id
119
- self.active_sessions = active_sessions
120
- self.last_activity_at = last_activity_at
121
119
  if owners is not None:
122
120
  self.owners = owners
123
121
  self.is_default = is_default
122
+ if active_sessions is not None:
123
+ self.active_sessions = active_sessions
124
+ if last_activity_at is not None:
125
+ self.last_activity_at = last_activity_at
124
126
 
125
127
  @property
126
128
  def name(self):
@@ -409,56 +411,6 @@ class Project(object):
409
411
 
410
412
  self._last_used_cloud_id = last_used_cloud_id
411
413
 
412
- @property
413
- def active_sessions(self):
414
- """Gets the active_sessions of this Project. # noqa: E501
415
-
416
- Read only. Number of active sessions for this project. # noqa: E501
417
-
418
- :return: The active_sessions of this Project. # noqa: E501
419
- :rtype: int
420
- """
421
- return self._active_sessions
422
-
423
- @active_sessions.setter
424
- def active_sessions(self, active_sessions):
425
- """Sets the active_sessions of this Project.
426
-
427
- Read only. Number of active sessions for this project. # noqa: E501
428
-
429
- :param active_sessions: The active_sessions of this Project. # noqa: E501
430
- :type: int
431
- """
432
- if self.local_vars_configuration.client_side_validation and active_sessions is None: # noqa: E501
433
- raise ValueError("Invalid value for `active_sessions`, must not be `None`") # noqa: E501
434
-
435
- self._active_sessions = active_sessions
436
-
437
- @property
438
- def last_activity_at(self):
439
- """Gets the last_activity_at of this Project. # noqa: E501
440
-
441
- Read only. The most recent activity for this project. This is based on the most recently created sessions # noqa: E501
442
-
443
- :return: The last_activity_at of this Project. # noqa: E501
444
- :rtype: datetime
445
- """
446
- return self._last_activity_at
447
-
448
- @last_activity_at.setter
449
- def last_activity_at(self, last_activity_at):
450
- """Sets the last_activity_at of this Project.
451
-
452
- Read only. The most recent activity for this project. This is based on the most recently created sessions # noqa: E501
453
-
454
- :param last_activity_at: The last_activity_at of this Project. # noqa: E501
455
- :type: datetime
456
- """
457
- if self.local_vars_configuration.client_side_validation and last_activity_at is None: # noqa: E501
458
- raise ValueError("Invalid value for `last_activity_at`, must not be `None`") # noqa: E501
459
-
460
- self._last_activity_at = last_activity_at
461
-
462
414
  @property
463
415
  def owners(self):
464
416
  """Gets the owners of this Project. # noqa: E501
@@ -507,6 +459,52 @@ class Project(object):
507
459
 
508
460
  self._is_default = is_default
509
461
 
462
+ @property
463
+ def active_sessions(self):
464
+ """Gets the active_sessions of this Project. # noqa: E501
465
+
466
+ DEPRECATED. Number of active sessions for this project. # noqa: E501
467
+
468
+ :return: The active_sessions of this Project. # noqa: E501
469
+ :rtype: int
470
+ """
471
+ return self._active_sessions
472
+
473
+ @active_sessions.setter
474
+ def active_sessions(self, active_sessions):
475
+ """Sets the active_sessions of this Project.
476
+
477
+ DEPRECATED. Number of active sessions for this project. # noqa: E501
478
+
479
+ :param active_sessions: The active_sessions of this Project. # noqa: E501
480
+ :type: int
481
+ """
482
+
483
+ self._active_sessions = active_sessions
484
+
485
+ @property
486
+ def last_activity_at(self):
487
+ """Gets the last_activity_at of this Project. # noqa: E501
488
+
489
+ DEPRECATED. The most recent activity for this project. This is based on the most recently created sessions # noqa: E501
490
+
491
+ :return: The last_activity_at of this Project. # noqa: E501
492
+ :rtype: datetime
493
+ """
494
+ return self._last_activity_at
495
+
496
+ @last_activity_at.setter
497
+ def last_activity_at(self, last_activity_at):
498
+ """Sets the last_activity_at of this Project.
499
+
500
+ DEPRECATED. The most recent activity for this project. This is based on the most recently created sessions # noqa: E501
501
+
502
+ :param last_activity_at: The last_activity_at of this Project. # noqa: E501
503
+ :type: datetime
504
+ """
505
+
506
+ self._last_activity_at = last_activity_at
507
+
510
508
  def to_dict(self):
511
509
  """Returns the model properties as a dict"""
512
510
  result = {}
@@ -28,11 +28,9 @@ class ProjectsSortField(object):
28
28
  """
29
29
  allowed enum values
30
30
  """
31
- ACTIVE_CLUSTERS = "ACTIVE_CLUSTERS"
32
- LAST_UPDATED_AT = "LAST_UPDATED_AT"
33
31
  NAME = "NAME"
34
32
 
35
- allowable_values = [ACTIVE_CLUSTERS, LAST_UPDATED_AT, NAME] # noqa: E501
33
+ allowable_values = [NAME] # noqa: E501
36
34
 
37
35
  """
38
36
  Attributes:
@@ -28,12 +28,11 @@ class ResourceAlertEventType(object):
28
28
  """
29
29
  allowed enum values
30
30
  """
31
- JOB_FAILED_USER = "NOTIFICATION_EVENT_TYPE_JOB_FAILED_USER"
32
- JOB_FAILED_SYSTEM = "NOTIFICATION_EVENT_TYPE_JOB_FAILED_SYSTEM"
31
+ JOB_FAILED = "NOTIFICATION_EVENT_TYPE_JOB_FAILED"
33
32
  JOB_SUCCEEDED = "NOTIFICATION_EVENT_TYPE_JOB_SUCCEEDED"
34
33
  SERVICE_UNHEALTHY = "NOTIFICATION_EVENT_TYPE_SERVICE_UNHEALTHY"
35
34
 
36
- allowable_values = [JOB_FAILED_USER, JOB_FAILED_SYSTEM, JOB_SUCCEEDED, SERVICE_UNHEALTHY] # noqa: E501
35
+ allowable_values = [JOB_FAILED, JOB_SUCCEEDED, SERVICE_UNHEALTHY] # noqa: E501
37
36
 
38
37
  """
39
38
  Attributes:
@@ -11,9 +11,14 @@ from anyscale.cloud._private.cloud_sdk import PrivateCloudSDK
11
11
  from anyscale.cloud.commands import (
12
12
  _ADD_COLLABORATORS_ARG_DOCSTRINGS,
13
13
  _ADD_COLLABORATORS_EXAMPLE,
14
+ _GET_ARG_DOCSTRINGS,
15
+ _GET_DEFAULT_EXAMPLE,
16
+ _GET_EXAMPLE,
14
17
  add_collaborators,
18
+ get,
19
+ get_default,
15
20
  )
16
- from anyscale.cloud.models import CreateCloudCollaborator
21
+ from anyscale.cloud.models import Cloud, CreateCloudCollaborator
17
22
  from anyscale.connect import ClientBuilder
18
23
 
19
24
 
@@ -31,12 +36,43 @@ class CloudSDK:
31
36
  doc_py_example=_ADD_COLLABORATORS_EXAMPLE,
32
37
  arg_docstrings=_ADD_COLLABORATORS_ARG_DOCSTRINGS,
33
38
  )
34
- def add_collaborators( # noqa: F811
35
- self, cloud: str, collaborators: List[CreateCloudCollaborator]
39
+ def add_collaborators(
40
+ self, cloud: str, collaborators: List[CreateCloudCollaborator],
36
41
  ) -> str:
37
- """Batch add collaborators to a cloud."""
42
+ """
43
+ Batch add collaborators to a cloud.
44
+
45
+ :param cloud: The cloud to add users to.
46
+ :param collaborators: The list of collaborators to add to the cloud.
47
+ """
38
48
  return self._private_sdk.add_collaborators(cloud, collaborators)
39
49
 
50
+ @sdk_docs(
51
+ doc_py_example=_GET_EXAMPLE, arg_docstrings=_GET_ARG_DOCSTRINGS,
52
+ )
53
+ def get_cloud(
54
+ self, id: Optional[str], name: Optional[str], # noqa: A002
55
+ ) -> Optional[Cloud]:
56
+ """
57
+ Retrieve a cloud by its name or ID.
58
+
59
+ :param id: The ID of the cloud to retrieve.
60
+ :param name: The name of the cloud to retrieve.
61
+ :return: A ``Cloud`` object if found, otherwise ``None``.
62
+ """
63
+ return self._private_sdk.get(id=id, name=name)
64
+
65
+ @sdk_docs(
66
+ doc_py_example=_GET_DEFAULT_EXAMPLE, arg_docstrings={},
67
+ )
68
+ def get_default_cloud(self) -> Optional[Cloud]:
69
+ """
70
+ Get the default cloud for your organization.
71
+
72
+ :return: The default ``Cloud`` object if it exists, otherwise ``None``.
73
+ """
74
+ return self._private_sdk.get_default()
75
+
40
76
 
41
77
  # Note: indentation here matches that of connect.py::ClientBuilder.
42
78
  BUILDER_HELP_FOOTER = """
@@ -48,13 +84,16 @@ class CloudModule(ModuleType):
48
84
  """
49
85
  A custom callable module object for `anyscale.cloud`.
50
86
 
51
- This hack is needed since `anyscale.cloud` is a function for Anyscale connect but also a module for the SDK.
87
+ This hack is needed since `anyscale.cloud` is a function for Anyscale connect
88
+ but also a module for the SDK.
52
89
  """
53
90
 
54
91
  def __init__(self):
55
92
  # Expose attributes from the SDK.
56
93
  self.CloudSDK = CloudSDK
57
94
  self.add_collaborators = add_collaborators
95
+ self.get = get
96
+ self.get_default = get_default
58
97
 
59
98
  # Expose Anyscale connect
60
99
  self.new_builder = self._new_builder()
@@ -1,10 +1,16 @@
1
- from typing import List
1
+ from typing import List, Optional
2
2
 
3
3
  from anyscale._private.sdk.base_sdk import BaseSDK
4
4
  from anyscale.client.openapi_client.models import (
5
+ Cloud as CloudModel,
5
6
  CreateCloudCollaborator as CreateCloudCollaboratorModel,
6
7
  )
7
- from anyscale.cloud.models import CreateCloudCollaborator
8
+ from anyscale.cloud.models import (
9
+ Cloud,
10
+ CloudProvider,
11
+ ComputeStack,
12
+ CreateCloudCollaborator,
13
+ )
8
14
 
9
15
 
10
16
  class PrivateCloudSDK(BaseSDK):
@@ -23,3 +29,54 @@ class PrivateCloudSDK(BaseSDK):
23
29
  for collaborator in collaborators
24
30
  ],
25
31
  )
32
+
33
+ def get(
34
+ self, id: Optional[str], name: Optional[str], # noqa: A002
35
+ ) -> Optional[Cloud]:
36
+ if (id and name) or (not id and not name):
37
+ raise ValueError("Provide exactly one of 'id' or 'name'.")
38
+
39
+ if id:
40
+ openapi_cloud = self.client.get_cloud(cloud_id=id)
41
+ else:
42
+ assert name is not None, "Name must be provided if id is not."
43
+ openapi_cloud = self.client.get_cloud_by_name(name=name)
44
+
45
+ return self._to_sdk_cloud(openapi_cloud)
46
+
47
+ def get_default(self) -> Optional[Cloud]:
48
+ openapi_cloud = self.client.get_default_cloud()
49
+
50
+ return self._to_sdk_cloud(openapi_cloud)
51
+
52
+ def _to_sdk_cloud(self, openapi_cloud: Optional["CloudModel"]) -> Optional[Cloud]:
53
+ if openapi_cloud is None:
54
+ return None
55
+
56
+ # Validate provider, default to UNKNOWN if validation fails
57
+ if openapi_cloud.provider is not None:
58
+ try:
59
+ provider = CloudProvider.validate(openapi_cloud.provider)
60
+ except ValueError:
61
+ provider = CloudProvider.UNKNOWN
62
+ else:
63
+ provider = CloudProvider.UNKNOWN
64
+
65
+ # Validate compute_stack, default to UNKNOWN if validation fails
66
+ if openapi_cloud.compute_stack is not None:
67
+ try:
68
+ compute_stack = ComputeStack.validate(openapi_cloud.compute_stack)
69
+ except ValueError:
70
+ compute_stack = ComputeStack.UNKNOWN
71
+ else:
72
+ compute_stack = ComputeStack.UNKNOWN
73
+
74
+ return Cloud(
75
+ id=openapi_cloud.id,
76
+ name=openapi_cloud.name,
77
+ provider=provider,
78
+ region=openapi_cloud.region,
79
+ created_at=openapi_cloud.created_at,
80
+ is_default=openapi_cloud.is_default,
81
+ compute_stack=compute_stack,
82
+ )
@@ -1,7 +1,7 @@
1
- from typing import List
1
+ from typing import List, Optional
2
2
 
3
3
  from anyscale._private.sdk import sdk_command
4
- from anyscale.cloud._private.cloud_sdk import PrivateCloudSDK
4
+ from anyscale.cloud._private.cloud_sdk import Cloud, PrivateCloudSDK
5
5
  from anyscale.cloud.models import CreateCloudCollaborator
6
6
 
7
7
 
@@ -39,7 +39,75 @@ _ADD_COLLABORATORS_ARG_DOCSTRINGS = {
39
39
  arg_docstrings=_ADD_COLLABORATORS_ARG_DOCSTRINGS,
40
40
  )
41
41
  def add_collaborators(
42
- cloud: str, collaborators: List[CreateCloudCollaborator], *, _sdk: PrivateCloudSDK
42
+ cloud: str, collaborators: List[CreateCloudCollaborator], *, _sdk: PrivateCloudSDK,
43
43
  ) -> str:
44
- """Batch add collaborators to a cloud."""
44
+ """
45
+ Batch add collaborators to a cloud.
46
+
47
+ :param cloud: The cloud to add users to.
48
+ :param collaborators: The list of collaborators to add to the cloud.
49
+ """
45
50
  return _sdk.add_collaborators(cloud, collaborators)
51
+
52
+
53
+ _GET_EXAMPLE = """
54
+ import anyscale
55
+
56
+ # Get a cloud by ID
57
+ cloud_by_id = anyscale.cloud.get(id="cloud_id")
58
+
59
+ # Get a cloud by name
60
+ cloud_by_name = anyscale.cloud.get(name="cloud_name")
61
+ """
62
+
63
+ _GET_ARG_DOCSTRINGS = {
64
+ "id": "The ID of the cloud to retrieve.",
65
+ "name": "The name of the cloud to retrieve.",
66
+ }
67
+
68
+
69
+ @sdk_command(
70
+ _CLOUD_SDK_SINGLETON_KEY,
71
+ PrivateCloudSDK,
72
+ doc_py_example=_GET_EXAMPLE,
73
+ arg_docstrings=_GET_ARG_DOCSTRINGS,
74
+ )
75
+ def get(
76
+ id: Optional[str] = None, # noqa: A002
77
+ name: Optional[str] = None,
78
+ *,
79
+ _sdk: PrivateCloudSDK,
80
+ ) -> Optional[Cloud]:
81
+ """
82
+ Get the cloud model for the provided cloud ID or name.
83
+
84
+ If neither ID nor name is provided, returns `None`.
85
+
86
+ :param id: The ID of the cloud to retrieve.
87
+ :param name: The name of the cloud to retrieve.
88
+ :return: A `Cloud` object if found, otherwise `None`.
89
+ """
90
+ return _sdk.get(id=id, name=name)
91
+
92
+
93
+ _GET_DEFAULT_EXAMPLE = """
94
+ import anyscale
95
+
96
+ # Get the user's default cloud
97
+ default_cloud = anyscale.cloud.get_default()
98
+ """
99
+
100
+
101
+ @sdk_command(
102
+ _CLOUD_SDK_SINGLETON_KEY,
103
+ PrivateCloudSDK,
104
+ doc_py_example=_GET_DEFAULT_EXAMPLE,
105
+ arg_docstrings={},
106
+ )
107
+ def get_default(*, _sdk: PrivateCloudSDK,) -> Optional[Cloud]:
108
+ """
109
+ Get the user's default cloud.
110
+
111
+ :return: The default `Cloud` object if it exists, otherwise `None`.
112
+ """
113
+ return _sdk.get_default()
anyscale/cloud/models.py CHANGED
@@ -1,5 +1,6 @@
1
1
  from dataclasses import dataclass, field
2
- from typing import Any, Dict, List
2
+ from datetime import datetime
3
+ from typing import Any, Dict, List, Optional, Union
3
4
 
4
5
  from anyscale._private.models import ModelBase, ModelEnum
5
6
 
@@ -11,7 +12,7 @@ class CloudPermissionLevel(ModelEnum):
11
12
  __docstrings__ = {
12
13
  WRITE: "Write permission level for the cloud",
13
14
  READONLY: "Readonly permission level for the cloud",
14
- }
15
+ } # type: ignore
15
16
 
16
17
 
17
18
  @dataclass(frozen=True)
@@ -43,7 +44,7 @@ create_cloud_collaborator = CreateCloudCollaborator(
43
44
  self, permission_level: CloudPermissionLevel
44
45
  ) -> CloudPermissionLevel:
45
46
  if isinstance(permission_level, str):
46
- return CloudPermissionLevel.validate(permission_level)
47
+ return CloudPermissionLevel.validate(permission_level) # type: ignore
47
48
  elif isinstance(permission_level, CloudPermissionLevel):
48
49
  return permission_level
49
50
  else:
@@ -89,3 +90,120 @@ create_cloud_collaborators = CreateCloudCollaborators(
89
90
  def _validate_collaborators(self, collaborators: List[Dict[str, Any]]):
90
91
  if not isinstance(collaborators, list):
91
92
  raise TypeError("Collaborators must be a list.")
93
+
94
+
95
+ class ComputeStack(ModelEnum):
96
+ UNKNOWN = "UNKNOWN"
97
+ VM = "VM"
98
+ K8S = "K8S"
99
+
100
+ __docstrings__ = {
101
+ UNKNOWN: "Unknown compute stack.",
102
+ VM: "Virtual machine-based compute stack.",
103
+ K8S: "Kubernetes-based compute stack.",
104
+ } # type: ignore
105
+
106
+
107
+ class CloudProvider(ModelEnum):
108
+ UNKNOWN = "UNKNOWN"
109
+ AWS = "AWS"
110
+ GCP = "GCP"
111
+ AZURE = "AZURE"
112
+
113
+ __docstrings__ = {
114
+ UNKNOWN: "Unknown cloud provider.",
115
+ AWS: "Amazon Web Services.",
116
+ GCP: "Google Cloud Platform.",
117
+ AZURE: "Microsoft Azure.",
118
+ } # type: ignore
119
+
120
+
121
+ @dataclass(frozen=True)
122
+ class Cloud(ModelBase):
123
+ """Minimal Cloud resource model."""
124
+
125
+ __doc_py_example__ = """\
126
+ from datetime import datetime
127
+ from anyscale.cloud.models import Cloud, CloudProvider, ComputeStack
128
+
129
+ cloud = Cloud(
130
+ name="my-cloud",
131
+ id="cloud-123",
132
+ provider="AWS", # This will be validated as CloudProvider.AWS
133
+ region="us-west-2",
134
+ created_at=datetime.now(),
135
+ is_default=True,
136
+ compute_stack="VM" # This will be validated as ComputeStack.VM
137
+ )
138
+ """
139
+
140
+ name: str = field(metadata={"docstring": "Name of this Cloud."})
141
+ id: str = field(metadata={"docstring": "Unique identifier for this Cloud."})
142
+ provider: Union[CloudProvider, str] = field(
143
+ metadata={
144
+ "docstring": "Cloud provider (AWS, GCP, AZURE) or UNKNOWN if not recognized."
145
+ },
146
+ )
147
+ compute_stack: Union[ComputeStack, str] = field(
148
+ metadata={
149
+ "docstring": "The compute stack associated with this cloud's primary cloud resource, or UNKNOWN if not recognized."
150
+ },
151
+ )
152
+ region: Optional[str] = field(
153
+ default=None, metadata={"docstring": "Region for this Cloud."}
154
+ )
155
+ created_at: Optional[datetime] = field(
156
+ default=None, metadata={"docstring": "When the Cloud was created."}
157
+ )
158
+ is_default: Optional[bool] = field(
159
+ default=None, metadata={"docstring": "Whether this is the default cloud."}
160
+ )
161
+
162
+ def _validate_name(self, name: str) -> str:
163
+ if not isinstance(name, str) or not name.strip():
164
+ raise ValueError("name must be a non-empty string")
165
+ return name
166
+
167
+ def _validate_id(self, id: str) -> str: # noqa: A002
168
+ if not isinstance(id, str) or not id.strip():
169
+ raise ValueError("id must be a non-empty string")
170
+ return id
171
+
172
+ def _validate_provider(self, provider: Union[CloudProvider, str]) -> CloudProvider:
173
+ if isinstance(provider, str):
174
+ # This will raise a ValueError if the provider is unrecognized.
175
+ provider = CloudProvider(provider)
176
+ elif not isinstance(provider, CloudProvider):
177
+ raise TypeError("'provider' must be a CloudProvider.")
178
+
179
+ return provider
180
+
181
+ def _validate_region(self, region: Optional[str]) -> Optional[str]:
182
+ if region is not None and not isinstance(region, str):
183
+ raise TypeError("region must be a string")
184
+ return region
185
+
186
+ def _validate_created_at(
187
+ self, created_at: Optional[datetime]
188
+ ) -> Optional[datetime]:
189
+ if created_at is None:
190
+ return None
191
+ if not isinstance(created_at, datetime):
192
+ raise TypeError("created_at must be a datetime object")
193
+ return created_at
194
+
195
+ def _validate_is_default(self, is_default: Optional[bool]) -> Optional[bool]:
196
+ if is_default is not None and not isinstance(is_default, bool):
197
+ raise TypeError("is_default must be a bool")
198
+ return is_default
199
+
200
+ def _validate_compute_stack(
201
+ self, compute_stack: Union[ComputeStack, str]
202
+ ) -> ComputeStack:
203
+ if isinstance(compute_stack, str):
204
+ # This will raise a ValueError if the compute_stack is unrecognized.
205
+ compute_stack = ComputeStack(compute_stack)
206
+ elif not isinstance(compute_stack, ComputeStack):
207
+ raise TypeError("'compute_stack' must be a ComputeStack.")
208
+
209
+ return compute_stack
@@ -1090,3 +1090,79 @@ def add_collaborators(cloud: str, users_file: str,) -> None:
1090
1090
  log.info(
1091
1091
  f"Successfully added {len(collaborators.collaborators)} collaborators to cloud {cloud}."
1092
1092
  )
1093
+
1094
+
1095
+ @cloud_cli.command(
1096
+ name="get",
1097
+ help="Get information about a specific cloud.",
1098
+ cls=AnyscaleCommand,
1099
+ example=command_examples.CLOUD_GET_CLOUD_EXAMPLE,
1100
+ )
1101
+ @click.option(
1102
+ "--name",
1103
+ "-n",
1104
+ help="Name of the cloud to get information about.",
1105
+ type=str,
1106
+ required=False,
1107
+ )
1108
+ @click.option(
1109
+ "--cloud-id",
1110
+ "--id",
1111
+ help="ID of the cloud to get information about.",
1112
+ type=str,
1113
+ required=False,
1114
+ )
1115
+ def get_cloud(cloud_id: Optional[str], name: Optional[str]) -> None:
1116
+ """
1117
+ Retrieve a cloud by its name or ID and display its details.
1118
+
1119
+ :param cloud_id: The ID of the cloud to retrieve.
1120
+ :param name: The name of the cloud to retrieve.
1121
+ """
1122
+ # Validate that exactly one of --name or --cloud-id is provided
1123
+ if (cloud_id and name) or (not cloud_id and not name):
1124
+ log.error("Please provide exactly one of --name or --cloud-id.")
1125
+ return
1126
+
1127
+ try:
1128
+ cloud = anyscale.cloud.get(id=cloud_id, name=name)
1129
+
1130
+ if not cloud:
1131
+ log.error("Cloud not found.")
1132
+ return
1133
+
1134
+ cloud_dict = cloud.to_dict() if hasattr(cloud, "to_dict") else cloud.__dict__
1135
+
1136
+ print(yaml.dump(cloud_dict, sort_keys=False))
1137
+
1138
+ except ValueError as e:
1139
+ log.error(f"Error retrieving cloud: {e}")
1140
+
1141
+
1142
+ @cloud_cli.command(
1143
+ name="get-default",
1144
+ help="Get the default cloud for your organization.",
1145
+ cls=AnyscaleCommand,
1146
+ example=command_examples.CLOUD_GET_DEFAULT_CLOUD_EXAMPLE,
1147
+ )
1148
+ def get_default_cloud() -> None:
1149
+ """
1150
+ Retrieve and display the default cloud configured for your organization.
1151
+ """
1152
+ try:
1153
+ default_cloud = anyscale.cloud.get_default()
1154
+
1155
+ if not default_cloud:
1156
+ log.error("No default cloud found.")
1157
+ return
1158
+
1159
+ cloud_dict = (
1160
+ default_cloud.to_dict()
1161
+ if hasattr(default_cloud, "to_dict")
1162
+ else default_cloud.__dict__
1163
+ )
1164
+
1165
+ print(yaml.dump(cloud_dict, sort_keys=False))
1166
+
1167
+ except ValueError as e:
1168
+ log.error(f"Error retrieving default cloud: {e}")
@@ -561,6 +561,28 @@ collaborators:
561
561
  permission_level: "readonly"
562
562
  """
563
563
 
564
+ CLOUD_GET_CLOUD_EXAMPLE = """\
565
+ $ anyscale cloud get --name cloud_name
566
+ name: anyscale_v2_default_cloud
567
+ id: cld_123
568
+ provider: AWS
569
+ region: us-west-2
570
+ created_at: 2022-10-18 05:12:13.335803+00:00
571
+ is_default: false
572
+ compute_stack: VM
573
+ """
574
+
575
+ CLOUD_GET_DEFAULT_CLOUD_EXAMPLE = """\
576
+ $ anyscale cloud get-default
577
+ name: anyscale_v2_default_cloud
578
+ id: cld_abc
579
+ provider: AWS
580
+ region: us-west-2
581
+ created_at: 2022-10-18 05:12:13.335803+00:00
582
+ is_default: true
583
+ compute_stack: VM
584
+ """
585
+
564
586
  SERVICE_ARCHIVE_EXAMPLE = """\
565
587
  $ anyscale service archive --name my_service
566
588
  """
@@ -64,7 +64,7 @@ class Project(object):
64
64
  'last_activity_at': 'last_activity_at'
65
65
  }
66
66
 
67
- def __init__(self, name=None, cluster_config=None, description=None, parent_cloud_id=None, id=None, creator_id=None, created_at=None, organization_id=None, last_used_cloud_id=None, is_default=None, directory_name=None, active_sessions=None, last_activity_at=None, local_vars_configuration=None): # noqa: E501
67
+ def __init__(self, name=None, cluster_config=None, description=None, parent_cloud_id=None, id=None, creator_id=None, created_at=None, organization_id=None, last_used_cloud_id=None, is_default=None, directory_name=None, active_sessions=0, last_activity_at=None, local_vars_configuration=None): # noqa: E501
68
68
  """Project - a model defined in OpenAPI""" # noqa: E501
69
69
  if local_vars_configuration is None:
70
70
  local_vars_configuration = Configuration()
@@ -100,8 +100,10 @@ class Project(object):
100
100
  self.last_used_cloud_id = last_used_cloud_id
101
101
  self.is_default = is_default
102
102
  self.directory_name = directory_name
103
- self.active_sessions = active_sessions
104
- self.last_activity_at = last_activity_at
103
+ if active_sessions is not None:
104
+ self.active_sessions = active_sessions
105
+ if last_activity_at is not None:
106
+ self.last_activity_at = last_activity_at
105
107
 
106
108
  @property
107
109
  def name(self):
@@ -374,7 +376,7 @@ class Project(object):
374
376
  def active_sessions(self):
375
377
  """Gets the active_sessions of this Project. # noqa: E501
376
378
 
377
- Read only. Number of active sessions for this project. # noqa: E501
379
+ DEPRECATED. Number of active sessions for this project. # noqa: E501
378
380
 
379
381
  :return: The active_sessions of this Project. # noqa: E501
380
382
  :rtype: int
@@ -385,13 +387,11 @@ class Project(object):
385
387
  def active_sessions(self, active_sessions):
386
388
  """Sets the active_sessions of this Project.
387
389
 
388
- Read only. Number of active sessions for this project. # noqa: E501
390
+ DEPRECATED. Number of active sessions for this project. # noqa: E501
389
391
 
390
392
  :param active_sessions: The active_sessions of this Project. # noqa: E501
391
393
  :type: int
392
394
  """
393
- if self.local_vars_configuration.client_side_validation and active_sessions is None: # noqa: E501
394
- raise ValueError("Invalid value for `active_sessions`, must not be `None`") # noqa: E501
395
395
 
396
396
  self._active_sessions = active_sessions
397
397
 
@@ -399,7 +399,7 @@ class Project(object):
399
399
  def last_activity_at(self):
400
400
  """Gets the last_activity_at of this Project. # noqa: E501
401
401
 
402
- Read only. The most recent activity for this project. This is based on the most recently created sessions # noqa: E501
402
+ DEPRECATED. The most recent activity for this project. This is based on the most recently created sessions # noqa: E501
403
403
 
404
404
  :return: The last_activity_at of this Project. # noqa: E501
405
405
  :rtype: datetime
@@ -410,13 +410,11 @@ class Project(object):
410
410
  def last_activity_at(self, last_activity_at):
411
411
  """Sets the last_activity_at of this Project.
412
412
 
413
- Read only. The most recent activity for this project. This is based on the most recently created sessions # noqa: E501
413
+ DEPRECATED. The most recent activity for this project. This is based on the most recently created sessions # noqa: E501
414
414
 
415
415
  :param last_activity_at: The last_activity_at of this Project. # noqa: E501
416
416
  :type: datetime
417
417
  """
418
- if self.local_vars_configuration.client_side_validation and last_activity_at is None: # noqa: E501
419
- raise ValueError("Invalid value for `last_activity_at`, must not be `None`") # noqa: E501
420
418
 
421
419
  self._last_activity_at = last_activity_at
422
420
 
anyscale/version.py CHANGED
@@ -1 +1 @@
1
- __version__ = "0.25.10"
1
+ __version__ = "0.26.0"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: anyscale
3
- Version: 0.25.10
3
+ Version: 0.26.0
4
4
  Summary: Command Line Interface for Anyscale
5
5
  Author: Anyscale Inc.
6
6
  License: AS License
@@ -27,19 +27,19 @@ anyscale/scripts.py,sha256=HR6JOCBVBXMVi1Kz5uJmjsh73t2l1W8UbUge83ofnqk,5474
27
27
  anyscale/snapshot.py,sha256=UGJT5C1s_4xmQxjWODK5DFpGxHRBX5jOCdSCqXESH8E,1685
28
28
  anyscale/tables.py,sha256=TV4F2uLnwehvbkAfaP7iuLlT2wLIo6ORH2LVdRGXW5g,2840
29
29
  anyscale/util.py,sha256=Tqb9qWSxQI_PBJVSDxm9RWqFyGJFClgZDPByhb_fhU8,40813
30
- anyscale/version.py,sha256=Nw3Sk1aJKD__b1pX4zBOVEcqxnFwhwsJ1cNd5rN8Cgs,24
30
+ anyscale/version.py,sha256=S1dNBNSmHJkAHkq1vL1Yg-dFpQk0fri_CstNlL1u5qw,23
31
31
  anyscale/workspace_utils.py,sha256=OViE88CnIF5ruVxd3kazQ0Mf2BxqtMq6wx-XQ5A2cp8,1204
32
32
  anyscale/_private/anyscale_client/README.md,sha256=gk8obk7kqg6VWoUHcqDMwJULh35tYKEZFC0UF_dixGA,718
33
33
  anyscale/_private/anyscale_client/__init__.py,sha256=807Blx3RHQeS8BmKZcsOQQ4dYoKlCnpm6Bdsif2CrHg,337
34
- anyscale/_private/anyscale_client/anyscale_client.py,sha256=4yQD0pBE7s_oBmrB85G3gQePnCbbaqyqkki7VTfUrOc,79665
35
- anyscale/_private/anyscale_client/common.py,sha256=SXM-07Njsns-BMrUzP1nsTT7ZO7ZsDjN8zBeM8-mmIo,23729
36
- anyscale/_private/anyscale_client/fake_anyscale_client.py,sha256=QlC71hwzqbE0Jv6SeHDCFMi7DLH2U04hFFAN6mXJJPg,52883
34
+ anyscale/_private/anyscale_client/anyscale_client.py,sha256=CDjvf3Ke-scfMEJ1I17d0r5iOeIKlTUUSFHPehs-izs,80107
35
+ anyscale/_private/anyscale_client/common.py,sha256=4YRbGxX5eVM9WfFNw9o57ZVOGdN1tNAEr2P1frkIYgk,24130
36
+ anyscale/_private/anyscale_client/fake_anyscale_client.py,sha256=Nn7NUvhzf-Hq3RZ4CCTfviwrCF5eD9PijuSw-kmSjMY,53180
37
37
  anyscale/_private/docgen/README.md,sha256=z0tj8Jy0KmxWJBQMHKyzXGX_cYYgI8m5DCD6KCMU8oI,762
38
- anyscale/_private/docgen/__main__.py,sha256=K-U7QHryFUorzh8-Lj_uQYf-XEpvKsDkka3_Kw429t4,25824
38
+ anyscale/_private/docgen/__main__.py,sha256=ViMGLnYZT5VrPUhN9kHaHKBOoEsppu4Db7EPp4lG9zU,26158
39
39
  anyscale/_private/docgen/api.md,sha256=SzLoDy6GyriU60l8964CNWz3z_QNEJA7mFHr0FzXyPU,32527
40
40
  anyscale/_private/docgen/generator.py,sha256=dgC3qlqhJrTt0bTl3ExlRFLDwpn_Is2Yv47TJ33jaeE,21711
41
41
  anyscale/_private/docgen/generator_legacy.py,sha256=pss_6ONF55XhARrKGcREDmg0J5plWact6USgb5Tr5mM,3002
42
- anyscale/_private/docgen/models.md,sha256=2prwqU_iYGYvk1LLn6nNxKoLe9Up60279q6TUGuuzPs,284389
42
+ anyscale/_private/docgen/models.md,sha256=qdokNhgO_HJ6NxPPa2h0IpacylamJJGEfeHROXxAo4o,284410
43
43
  anyscale/_private/models/__init__.py,sha256=ZrkdHhJZNeCYiogsHc_po8m7vaVdxEjkNGixNeYdlgs,125
44
44
  anyscale/_private/models/image_uri.py,sha256=CMzHc-MNTBsBXvX0G73bjkiznCbm95DYQusgXJ8drm8,3971
45
45
  anyscale/_private/models/model_base.py,sha256=QdIKiyNpvjyUGqQtL4_J9qpCK6clHdmWiKV4jSFXunU,8217
@@ -571,7 +571,7 @@ anyscale/client/openapi_client/models/production_job_event_scope_filter.py,sha25
571
571
  anyscale/client/openapi_client/models/production_job_state_transition.py,sha256=b6bXss7U9japd-Vzt_ZIRBgBG-L9SgtdiLZSs-O5HyU,9808
572
572
  anyscale/client/openapi_client/models/productionjob_response.py,sha256=5ft3ywRCus84N9g1FUt85PPe2FVRHyQBFBaPThG0TAA,3561
573
573
  anyscale/client/openapi_client/models/productionjobevent_list_response.py,sha256=PNHTXQj4hx6e4vC-G9INezPNlc39B-9ByVgMh5zxuVs,4467
574
- anyscale/client/openapi_client/models/project.py,sha256=1jEqv3xVLzxm-1pRX5uKzqWzh7ht-i5JPcHWTuPbZFI,16927
574
+ anyscale/client/openapi_client/models/project.py,sha256=4HYfLu2e_tce6JJwOC2PvEG2OMq3aKV26xDEZINTICs,16597
575
575
  anyscale/client/openapi_client/models/project_base.py,sha256=VX3jSjb8rwTiSnJy_kLSXTkQ0zRamxQWvKCDb3vEBec,3367
576
576
  anyscale/client/openapi_client/models/project_collaborator.py,sha256=Fsk7Nteb7PAzSpiA-nZfQW6yJpdyonZf68-OLOyT9Ik,5321
577
577
  anyscale/client/openapi_client/models/project_collaborator_value.py,sha256=w5ai6p7zvY92xWeSdXC9S-omxUA-5ptNPRyPz_s6I7c,5050
@@ -585,7 +585,7 @@ anyscale/client/openapi_client/models/project_response.py,sha256=3k7Wde4R6rhJvwB
585
585
  anyscale/client/openapi_client/models/projectbase_response.py,sha256=Fts2s4-YMca4eK5ulFc-54P_F8YmGPSjHcpC3IpZ3zs,3539
586
586
  anyscale/client/openapi_client/models/projectcollaborator_list_response.py,sha256=xMXVnrYxPk_RXGPeGq15gAdYDf7kWX6DhGAXSUriKKU,4482
587
587
  anyscale/client/openapi_client/models/projectdefaultsessionname_response.py,sha256=nAfMRXSU79_okUok0_1ZSeaqAcaDu0VtdAnzSny2pUA,3693
588
- anyscale/client/openapi_client/models/projects_sort_field.py,sha256=xLN-Qx9kZAm16l07dbxzevJUMt2kgUzvXvzApx-97Is,2924
588
+ anyscale/client/openapi_client/models/projects_sort_field.py,sha256=3LW0ggf07NbFcKLr3MZoZDyNUrj5tFiK877sxINJIZs,2810
589
589
  anyscale/client/openapi_client/models/projects_violating_tree_hierarchy_response.py,sha256=uWddqitteSKeD9HH9msYznydnsPDgDLp383IQ0qRfKI,3790
590
590
  anyscale/client/openapi_client/models/projectsviolatingtreehierarchyresponse_response.py,sha256=GhgEbvaYs9M8UmN2c72gE1WYPVsqVUhR4Sl2ZQzN9rQ,3836
591
591
  anyscale/client/openapi_client/models/protocols.py,sha256=Q_QNTShXYTtz-Ct9iNGJl3QM4BVrZ6_6nNS7K5I8ip0,4098
@@ -607,7 +607,7 @@ anyscale/client/openapi_client/models/requestemailmagiclinkresponse_response.py,
607
607
  anyscale/client/openapi_client/models/requestotpreturnapimodel_response.py,sha256=MRpp_kGIa8jMDxQqjtM5mWmK5SBXCMd_c20ZCE6u17Y,3682
608
608
  anyscale/client/openapi_client/models/reset_password_params.py,sha256=UVh4iLrSOGIgIgnRy_dnGWPdvHOQLbHk2qyG8EPkLpg,4421
609
609
  anyscale/client/openapi_client/models/resource_alert.py,sha256=nQkMY04lQWdaKIJ2oTg0GzoVbAa7rjkyNKBUrPaSmK0,13797
610
- anyscale/client/openapi_client/models/resource_alert_event_type.py,sha256=ZawSDEoHyprgEn2vVGyX92ECTrfTi9E1BsQOOkbuB4U,3136
610
+ anyscale/client/openapi_client/models/resource_alert_event_type.py,sha256=mugR1KLXspjJV8wfDpLZXRHoTVpiSJ1xqi9bvoQRnjU,3034
611
611
  anyscale/client/openapi_client/models/resource_quota.py,sha256=jGTVnp54p9CvhtnCtDIVvMsj1vIFJzWprYjoUSZS8uU,14682
612
612
  anyscale/client/openapi_client/models/resource_quota_status.py,sha256=2c8ujJUAyF_f0s59EpmPRi5twm_Q_bWWWGLqFPkaOck,3726
613
613
  anyscale/client/openapi_client/models/resourcealert_list_response.py,sha256=sTsYWPunyxBfe1V5YPf4TWJ2XG6Qzvq_Y3DTbK_jqCs,4392
@@ -774,18 +774,18 @@ anyscale/client/openapi_client/models/write_cluster_config.py,sha256=7Lvjku3OKT4
774
774
  anyscale/client/openapi_client/models/write_project.py,sha256=48Jym8VDE57cZXTnVH_rl0bJlq7GPhLKKCje0G2P6yg,6686
775
775
  anyscale/client/openapi_client/models/write_session.py,sha256=q1XvzytpzcDUpc29UVg9ebemwc_V4QrITCMcSRnfGHE,4154
776
776
  anyscale/client/openapi_client/models/write_support_request.py,sha256=pFOalGDQi9FCDjeJV7ccBpq6iRq1Sub4NBfcUVfCglE,3614
777
- anyscale/cloud/__init__.py,sha256=X77Dj4bRhYruV9q_FZ9pTVj1QHBZXUZqAsnZlPALY4A,2749
778
- anyscale/cloud/commands.py,sha256=kvDfsvFIYufUC8VWacHO4XrGKWnzBYETLUH2c_Yge1o,1286
779
- anyscale/cloud/models.py,sha256=rc7t9Qif2Tkf2nzUK9lprj8rYlkzBqVJ3fpdcZ3Cwi8,3101
780
- anyscale/cloud/_private/cloud_sdk.py,sha256=kNhDJcbCArmgApATLgZb6b3kZ4YT_uHYCw0u9Pi_xMw,854
777
+ anyscale/cloud/__init__.py,sha256=xkY385pSbFUdkp7OKzJUzpRDR22yXr1L3TukS2yzf44,3898
778
+ anyscale/cloud/commands.py,sha256=P9bB8LpEfhJVvfSdP7kijt0vokVpaYqDUr5T8X9OFJE,2830
779
+ anyscale/cloud/models.py,sha256=dG7Ilc3lXAGorAtzxgHiyBZ7dxngOBA35Mli22z-SNc,7155
780
+ anyscale/cloud/_private/cloud_sdk.py,sha256=HrsPQxlhxFU4Bliu4IX-tPKxCYYhIL39P1pajR3P_Iw,2795
781
781
  anyscale/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
782
782
  anyscale/commands/aggregated_instance_usage_commands.py,sha256=TRP1X3hdIWbKg9V20VtazlDXsYAeV--M0DH3-Z5tnj4,2293
783
783
  anyscale/commands/auth_commands.py,sha256=X1g6Yu9kqgPb4HLODlZTYEk8G5AVLeyizPIgagWx-p0,1026
784
- anyscale/commands/cloud_commands.py,sha256=PwDGw8CMTdJRoIqmW8i4hzwJSAaegQVwUs_7IP8YfxA,39061
784
+ anyscale/commands/cloud_commands.py,sha256=C0AyWttfstcj66WX8y5hH4E0KMO4k33AQhnmGYzY5tw,41123
785
785
  anyscale/commands/cloud_commands_util.py,sha256=d-6TSZ_syrGkZ3Fc1uRX6jG4dqYMebNkBNpYLojOJFg,247
786
786
  anyscale/commands/cluster_commands.py,sha256=taNcffyFfqJ1MgOQd0cz9kzRXWFTdp-wfLPM4l_2tBc,13487
787
787
  anyscale/commands/cluster_env_commands.py,sha256=KNWylyE8Ew1sDi7yu2Tp4RLcRu2_KJJJIzVGRyPflJo,3899
788
- anyscale/commands/command_examples.py,sha256=WrZWuBNHmdtDLN8mE28q54BO6ZocTUzBHZFCHyj7DZw,21559
788
+ anyscale/commands/command_examples.py,sha256=Gpfy_hf-QzW9RZxgoAboa_yxm_MxzI5hXzV3fRuLMr0,22020
789
789
  anyscale/commands/compute_config_commands.py,sha256=vdyrtMcdP8eeK32p_Y6zF-qps6_SyzprhbjRZ9p18tQ,7828
790
790
  anyscale/commands/config_commands.py,sha256=p55uM6WrhfbFoRXC9hNAV-8c5ANghw7tBUYwaQDAtjE,7195
791
791
  anyscale/commands/exec_commands.py,sha256=cMOP1u6xQbl81h69Jug3y73XnNSwpbM6XC1X57SIp4c,465
@@ -1025,7 +1025,7 @@ anyscale/sdk/anyscale_client/models/production_service_v2_version_model.py,sha25
1025
1025
  anyscale/sdk/anyscale_client/models/productionjob_list_response.py,sha256=Dn8eUwKWtviO0htJpjptuE6NUtYNHCvQrVs5hJo2nxA,4390
1026
1026
  anyscale/sdk/anyscale_client/models/productionjob_response.py,sha256=gMFgAAl2TWpZLFRMw117ZwMj8vDmcCwiRIVbFBhdvV0,3559
1027
1027
  anyscale/sdk/anyscale_client/models/productionservicev2_model_response.py,sha256=QpHSaRp_55-kqr5TGXnqsDQxjBLJ3-7pB0NRUl_o88o,3680
1028
- anyscale/sdk/anyscale_client/models/project.py,sha256=dBeUUR9IHrglqA6Ig_qC0Au1t-mkCwUYpmxDxK0zq5E,15540
1028
+ anyscale/sdk/anyscale_client/models/project.py,sha256=3O9rRIwNidU9NK9ckHtnWPecKDDauKiVerQPpg3dVpQ,15210
1029
1029
  anyscale/sdk/anyscale_client/models/project_list_response.py,sha256=ONNb1uMpjOk10Dz40WAEMd2GebWVk6BKaVT-9e8cyzc,4300
1030
1030
  anyscale/sdk/anyscale_client/models/project_response.py,sha256=JBSxKFJgQ_PO66DH3X_KJNWCJ3pXdXGn4_ed-zfwi1o,3493
1031
1031
  anyscale/sdk/anyscale_client/models/projects_query.py,sha256=Z2nhAo-9u4DkrIqov59voIv63ug11Lr-k0MjV58nBmo,7132
@@ -1160,10 +1160,10 @@ anyscale/workspace/__init__.py,sha256=fIxkn8b_HADCQl5njPAbcJxAf0sajZoc55L_wMvGAx
1160
1160
  anyscale/workspace/commands.py,sha256=21FubFd2wmEwlVbk-ng-adwBm-O4ZPBgEJnoavbfvbU,14035
1161
1161
  anyscale/workspace/models.py,sha256=Ey67KqxdslS51yK7xetbRaFjE8sURAArpf-F38r3cUU,9760
1162
1162
  anyscale/workspace/_private/workspace_sdk.py,sha256=4LOBmMm7kd-O94ii5uP1UDbkWLComh6zI5QmE2lXRTY,26824
1163
- anyscale-0.25.10.dist-info/LICENSE,sha256=UOPu974Wzsna6frFv1mu4VrZgNdZT7lbcNPzo5ue3qs,3494
1164
- anyscale-0.25.10.dist-info/METADATA,sha256=P-LoSA6uSWUAiJuQwwww2FXv0DpDjVXyymGrxX7Svj0,3050
1165
- anyscale-0.25.10.dist-info/NOTICE,sha256=gHqDhSnUYlRXX-mDOL5FtE7774oiKyV_HO80qM3r9Xo,196
1166
- anyscale-0.25.10.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
1167
- anyscale-0.25.10.dist-info/entry_points.txt,sha256=NqO18sCZn6zG6J0S38itjcN00s7aE3C3v3k5lMAfCLk,51
1168
- anyscale-0.25.10.dist-info/top_level.txt,sha256=g3NVNS8Oh0NZwbFFgeX696C5MZZkS5dqV2NqcsbDRJE,9
1169
- anyscale-0.25.10.dist-info/RECORD,,
1163
+ anyscale-0.26.0.dist-info/LICENSE,sha256=UOPu974Wzsna6frFv1mu4VrZgNdZT7lbcNPzo5ue3qs,3494
1164
+ anyscale-0.26.0.dist-info/METADATA,sha256=TkDYNHxtKchUqx_nuabG8G0lGLvGewXKU2q7ik4yL84,3049
1165
+ anyscale-0.26.0.dist-info/NOTICE,sha256=gHqDhSnUYlRXX-mDOL5FtE7774oiKyV_HO80qM3r9Xo,196
1166
+ anyscale-0.26.0.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
1167
+ anyscale-0.26.0.dist-info/entry_points.txt,sha256=NqO18sCZn6zG6J0S38itjcN00s7aE3C3v3k5lMAfCLk,51
1168
+ anyscale-0.26.0.dist-info/top_level.txt,sha256=g3NVNS8Oh0NZwbFFgeX696C5MZZkS5dqV2NqcsbDRJE,9
1169
+ anyscale-0.26.0.dist-info/RECORD,,