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.
- anyscale/_private/anyscale_client/anyscale_client.py +16 -3
- anyscale/_private/anyscale_client/common.py +13 -0
- anyscale/_private/anyscale_client/fake_anyscale_client.py +9 -0
- anyscale/_private/docgen/__main__.py +17 -2
- anyscale/_private/docgen/models.md +2 -2
- anyscale/client/openapi_client/models/project.py +59 -61
- anyscale/client/openapi_client/models/projects_sort_field.py +1 -3
- anyscale/client/openapi_client/models/resource_alert_event_type.py +2 -3
- anyscale/cloud/__init__.py +44 -5
- anyscale/cloud/_private/cloud_sdk.py +59 -2
- anyscale/cloud/commands.py +72 -4
- anyscale/cloud/models.py +121 -3
- anyscale/commands/cloud_commands.py +76 -0
- anyscale/commands/command_examples.py +22 -0
- anyscale/sdk/anyscale_client/models/project.py +9 -11
- anyscale/version.py +1 -1
- {anyscale-0.25.10.dist-info → anyscale-0.26.0.dist-info}/METADATA +1 -1
- {anyscale-0.25.10.dist-info → anyscale-0.26.0.dist-info}/RECORD +23 -23
- {anyscale-0.25.10.dist-info → anyscale-0.26.0.dist-info}/LICENSE +0 -0
- {anyscale-0.25.10.dist-info → anyscale-0.26.0.dist-info}/NOTICE +0 -0
- {anyscale-0.25.10.dist-info → anyscale-0.26.0.dist-info}/WHEEL +0 -0
- {anyscale-0.25.10.dist-info → anyscale-0.26.0.dist-info}/entry_points.txt +0 -0
- {anyscale-0.25.10.dist-info → anyscale-0.26.0.dist-info}/top_level.txt +0 -0
@@ -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.
|
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=[
|
449
|
-
|
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** |
|
1477
|
-
**last_activity_at** | **datetime** |
|
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,
|
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 = [
|
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
|
-
|
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 = [
|
35
|
+
allowable_values = [JOB_FAILED, JOB_SUCCEEDED, SERVICE_UNHEALTHY] # noqa: E501
|
37
36
|
|
38
37
|
"""
|
39
38
|
Attributes:
|
anyscale/cloud/__init__.py
CHANGED
@@ -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(
|
35
|
-
self, cloud: str, collaborators: List[CreateCloudCollaborator]
|
39
|
+
def add_collaborators(
|
40
|
+
self, cloud: str, collaborators: List[CreateCloudCollaborator],
|
36
41
|
) -> str:
|
37
|
-
"""
|
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
|
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
|
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
|
+
)
|
anyscale/cloud/commands.py
CHANGED
@@ -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
|
-
"""
|
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
|
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=
|
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
|
-
|
104
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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.
|
1
|
+
__version__ = "0.26.0"
|
@@ -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=
|
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=
|
35
|
-
anyscale/_private/anyscale_client/common.py,sha256=
|
36
|
-
anyscale/_private/anyscale_client/fake_anyscale_client.py,sha256=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
778
|
-
anyscale/cloud/commands.py,sha256=
|
779
|
-
anyscale/cloud/models.py,sha256=
|
780
|
-
anyscale/cloud/_private/cloud_sdk.py,sha256=
|
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=
|
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=
|
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=
|
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.
|
1164
|
-
anyscale-0.
|
1165
|
-
anyscale-0.
|
1166
|
-
anyscale-0.
|
1167
|
-
anyscale-0.
|
1168
|
-
anyscale-0.
|
1169
|
-
anyscale-0.
|
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,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|