anyscale 0.26.62__py3-none-any.whl → 0.26.63__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 +4 -1
- anyscale/_private/docgen/__main__.py +0 -2
- anyscale/client/README.md +1 -0
- anyscale/client/openapi_client/__init__.py +1 -0
- anyscale/client/openapi_client/api/default_api.py +19 -6
- anyscale/client/openapi_client/models/__init__.py +1 -0
- anyscale/client/openapi_client/models/operator_metrics.py +27 -1
- anyscale/client/openapi_client/models/task_summary_config.py +120 -0
- anyscale/client/openapi_client/models/task_table_config.py +29 -3
- anyscale/client/openapi_client/models/task_table_row.py +29 -3
- anyscale/commands/cloud_commands.py +146 -61
- anyscale/commands/command_examples.py +12 -0
- anyscale/commands/service_account_commands.py +0 -21
- anyscale/controllers/cloud_controller.py +94 -20
- anyscale/service_account/_private/service_account_sdk.py +10 -1
- anyscale/version.py +1 -1
- {anyscale-0.26.62.dist-info → anyscale-0.26.63.dist-info}/METADATA +1 -1
- {anyscale-0.26.62.dist-info → anyscale-0.26.63.dist-info}/RECORD +23 -22
- {anyscale-0.26.62.dist-info → anyscale-0.26.63.dist-info}/WHEEL +0 -0
- {anyscale-0.26.62.dist-info → anyscale-0.26.63.dist-info}/entry_points.txt +0 -0
- {anyscale-0.26.62.dist-info → anyscale-0.26.63.dist-info}/licenses/LICENSE +0 -0
- {anyscale-0.26.62.dist-info → anyscale-0.26.63.dist-info}/licenses/NOTICE +0 -0
- {anyscale-0.26.62.dist-info → anyscale-0.26.63.dist-info}/top_level.txt +0 -0
@@ -2014,7 +2014,10 @@ class AnyscaleClient(AnyscaleClientInterface):
|
|
2014
2014
|
is_service_account: Optional[bool] = None, # noqa: ARG002
|
2015
2015
|
) -> List[OrganizationCollaborator]:
|
2016
2016
|
results = self._internal_api_client.list_organization_collaborators_api_v2_organization_collaborators_get(
|
2017
|
-
email=email,
|
2017
|
+
email=email,
|
2018
|
+
name=name,
|
2019
|
+
collaborator_type=collaborator_type,
|
2020
|
+
is_service_account=is_service_account,
|
2018
2021
|
).results
|
2019
2022
|
|
2020
2023
|
return results
|
@@ -376,7 +376,6 @@ ALL_MODULES = [
|
|
376
376
|
service_account_commands.create_api_key,
|
377
377
|
service_account_commands.list_service_accounts,
|
378
378
|
service_account_commands.delete,
|
379
|
-
service_account_commands.rotate_api_keys,
|
380
379
|
],
|
381
380
|
sdk_prefix="anyscale.service_account",
|
382
381
|
sdk_commands=[
|
@@ -384,7 +383,6 @@ ALL_MODULES = [
|
|
384
383
|
anyscale.service_account.create_api_key,
|
385
384
|
anyscale.service_account.list,
|
386
385
|
anyscale.service_account.delete,
|
387
|
-
anyscale.service_account.rotate_api_keys,
|
388
386
|
],
|
389
387
|
models=[ServiceAccount, OrganizationPermissionLevel],
|
390
388
|
),
|
anyscale/client/README.md
CHANGED
@@ -996,6 +996,7 @@ Class | Method | HTTP request | Description
|
|
996
996
|
- [TaskJobGroupAggregateResponse](docs/TaskJobGroupAggregateResponse.md)
|
997
997
|
- [TaskState](docs/TaskState.md)
|
998
998
|
- [TaskSummary](docs/TaskSummary.md)
|
999
|
+
- [TaskSummaryConfig](docs/TaskSummaryConfig.md)
|
999
1000
|
- [TaskTableConfig](docs/TaskTableConfig.md)
|
1000
1001
|
- [TaskTableResponse](docs/TaskTableResponse.md)
|
1001
1002
|
- [TaskTableRow](docs/TaskTableRow.md)
|
@@ -609,6 +609,7 @@ from openapi_client.models.task_job_group_aggregate import TaskJobGroupAggregate
|
|
609
609
|
from openapi_client.models.task_job_group_aggregate_response import TaskJobGroupAggregateResponse
|
610
610
|
from openapi_client.models.task_state import TaskState
|
611
611
|
from openapi_client.models.task_summary import TaskSummary
|
612
|
+
from openapi_client.models.task_summary_config import TaskSummaryConfig
|
612
613
|
from openapi_client.models.task_table_config import TaskTableConfig
|
613
614
|
from openapi_client.models.task_table_response import TaskTableResponse
|
614
615
|
from openapi_client.models.task_table_row import TaskTableRow
|
@@ -21484,16 +21484,17 @@ class DefaultApi(object):
|
|
21484
21484
|
_request_timeout=local_var_params.get('_request_timeout'),
|
21485
21485
|
collection_formats=collection_formats)
|
21486
21486
|
|
21487
|
-
def get_task_summary_api_v2_tasks_dashboard_summary_get(self, cluster_id, **kwargs): # noqa: E501
|
21487
|
+
def get_task_summary_api_v2_tasks_dashboard_summary_get(self, cluster_id, task_summary_config, **kwargs): # noqa: E501
|
21488
21488
|
"""Get Task Summary # noqa: E501
|
21489
21489
|
|
21490
21490
|
This method makes a synchronous HTTP request by default. To make an
|
21491
21491
|
asynchronous HTTP request, please pass async_req=True
|
21492
|
-
>>> thread = api.get_task_summary_api_v2_tasks_dashboard_summary_get(cluster_id, async_req=True)
|
21492
|
+
>>> thread = api.get_task_summary_api_v2_tasks_dashboard_summary_get(cluster_id, task_summary_config, async_req=True)
|
21493
21493
|
>>> result = thread.get()
|
21494
21494
|
|
21495
21495
|
:param async_req bool: execute request asynchronously
|
21496
21496
|
:param str cluster_id: (required)
|
21497
|
+
:param TaskSummaryConfig task_summary_config: (required)
|
21497
21498
|
:param _preload_content: if False, the urllib3.HTTPResponse object will
|
21498
21499
|
be returned without reading/decoding response
|
21499
21500
|
data. Default is True.
|
@@ -21506,18 +21507,19 @@ class DefaultApi(object):
|
|
21506
21507
|
returns the request thread.
|
21507
21508
|
"""
|
21508
21509
|
kwargs['_return_http_data_only'] = True
|
21509
|
-
return self.get_task_summary_api_v2_tasks_dashboard_summary_get_with_http_info(cluster_id, **kwargs) # noqa: E501
|
21510
|
+
return self.get_task_summary_api_v2_tasks_dashboard_summary_get_with_http_info(cluster_id, task_summary_config, **kwargs) # noqa: E501
|
21510
21511
|
|
21511
|
-
def get_task_summary_api_v2_tasks_dashboard_summary_get_with_http_info(self, cluster_id, **kwargs): # noqa: E501
|
21512
|
+
def get_task_summary_api_v2_tasks_dashboard_summary_get_with_http_info(self, cluster_id, task_summary_config, **kwargs): # noqa: E501
|
21512
21513
|
"""Get Task Summary # noqa: E501
|
21513
21514
|
|
21514
21515
|
This method makes a synchronous HTTP request by default. To make an
|
21515
21516
|
asynchronous HTTP request, please pass async_req=True
|
21516
|
-
>>> thread = api.get_task_summary_api_v2_tasks_dashboard_summary_get_with_http_info(cluster_id, async_req=True)
|
21517
|
+
>>> thread = api.get_task_summary_api_v2_tasks_dashboard_summary_get_with_http_info(cluster_id, task_summary_config, async_req=True)
|
21517
21518
|
>>> result = thread.get()
|
21518
21519
|
|
21519
21520
|
:param async_req bool: execute request asynchronously
|
21520
21521
|
:param str cluster_id: (required)
|
21522
|
+
:param TaskSummaryConfig task_summary_config: (required)
|
21521
21523
|
:param _return_http_data_only: response data without head status code
|
21522
21524
|
and headers
|
21523
21525
|
:param _preload_content: if False, the urllib3.HTTPResponse object will
|
@@ -21535,7 +21537,8 @@ class DefaultApi(object):
|
|
21535
21537
|
local_var_params = locals()
|
21536
21538
|
|
21537
21539
|
all_params = [
|
21538
|
-
'cluster_id'
|
21540
|
+
'cluster_id',
|
21541
|
+
'task_summary_config'
|
21539
21542
|
]
|
21540
21543
|
all_params.extend(
|
21541
21544
|
[
|
@@ -21558,6 +21561,10 @@ class DefaultApi(object):
|
|
21558
21561
|
if self.api_client.client_side_validation and ('cluster_id' not in local_var_params or # noqa: E501
|
21559
21562
|
local_var_params['cluster_id'] is None): # noqa: E501
|
21560
21563
|
raise ApiValueError("Missing the required parameter `cluster_id` when calling `get_task_summary_api_v2_tasks_dashboard_summary_get`") # noqa: E501
|
21564
|
+
# verify the required parameter 'task_summary_config' is set
|
21565
|
+
if self.api_client.client_side_validation and ('task_summary_config' not in local_var_params or # noqa: E501
|
21566
|
+
local_var_params['task_summary_config'] is None): # noqa: E501
|
21567
|
+
raise ApiValueError("Missing the required parameter `task_summary_config` when calling `get_task_summary_api_v2_tasks_dashboard_summary_get`") # noqa: E501
|
21561
21568
|
|
21562
21569
|
collection_formats = {}
|
21563
21570
|
|
@@ -21573,10 +21580,16 @@ class DefaultApi(object):
|
|
21573
21580
|
local_var_files = {}
|
21574
21581
|
|
21575
21582
|
body_params = None
|
21583
|
+
if 'task_summary_config' in local_var_params:
|
21584
|
+
body_params = local_var_params['task_summary_config']
|
21576
21585
|
# HTTP header `Accept`
|
21577
21586
|
header_params['Accept'] = self.api_client.select_header_accept(
|
21578
21587
|
['application/json']) # noqa: E501
|
21579
21588
|
|
21589
|
+
# HTTP header `Content-Type`
|
21590
|
+
header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501
|
21591
|
+
['application/json']) # noqa: E501
|
21592
|
+
|
21580
21593
|
# Authentication setting
|
21581
21594
|
auth_settings = [] # noqa: E501
|
21582
21595
|
|
@@ -595,6 +595,7 @@ from openapi_client.models.task_job_group_aggregate import TaskJobGroupAggregate
|
|
595
595
|
from openapi_client.models.task_job_group_aggregate_response import TaskJobGroupAggregateResponse
|
596
596
|
from openapi_client.models.task_state import TaskState
|
597
597
|
from openapi_client.models.task_summary import TaskSummary
|
598
|
+
from openapi_client.models.task_summary_config import TaskSummaryConfig
|
598
599
|
from openapi_client.models.task_table_config import TaskTableConfig
|
599
600
|
from openapi_client.models.task_table_response import TaskTableResponse
|
600
601
|
from openapi_client.models.task_table_row import TaskTableRow
|
@@ -35,6 +35,7 @@ class OperatorMetrics(object):
|
|
35
35
|
openapi_types = {
|
36
36
|
'id': 'str',
|
37
37
|
'name': 'str',
|
38
|
+
'uuid': 'str',
|
38
39
|
'state': 'DatasetState',
|
39
40
|
'progress': 'int',
|
40
41
|
'total': 'int',
|
@@ -46,6 +47,7 @@ class OperatorMetrics(object):
|
|
46
47
|
attribute_map = {
|
47
48
|
'id': 'id',
|
48
49
|
'name': 'name',
|
50
|
+
'uuid': 'uuid',
|
49
51
|
'state': 'state',
|
50
52
|
'progress': 'progress',
|
51
53
|
'total': 'total',
|
@@ -54,7 +56,7 @@ class OperatorMetrics(object):
|
|
54
56
|
'metrics': 'metrics'
|
55
57
|
}
|
56
58
|
|
57
|
-
def __init__(self, id=None, name=None, state=None, progress=None, total=None, start_time=None, end_time=None, metrics=None, local_vars_configuration=None): # noqa: E501
|
59
|
+
def __init__(self, id=None, name=None, uuid=None, state=None, progress=None, total=None, start_time=None, end_time=None, metrics=None, local_vars_configuration=None): # noqa: E501
|
58
60
|
"""OperatorMetrics - a model defined in OpenAPI""" # noqa: E501
|
59
61
|
if local_vars_configuration is None:
|
60
62
|
local_vars_configuration = Configuration()
|
@@ -62,6 +64,7 @@ class OperatorMetrics(object):
|
|
62
64
|
|
63
65
|
self._id = None
|
64
66
|
self._name = None
|
67
|
+
self._uuid = None
|
65
68
|
self._state = None
|
66
69
|
self._progress = None
|
67
70
|
self._total = None
|
@@ -72,6 +75,8 @@ class OperatorMetrics(object):
|
|
72
75
|
|
73
76
|
self.id = id
|
74
77
|
self.name = name
|
78
|
+
if uuid is not None:
|
79
|
+
self.uuid = uuid
|
75
80
|
self.state = state
|
76
81
|
self.progress = progress
|
77
82
|
if total is not None:
|
@@ -128,6 +133,27 @@ class OperatorMetrics(object):
|
|
128
133
|
|
129
134
|
self._name = name
|
130
135
|
|
136
|
+
@property
|
137
|
+
def uuid(self):
|
138
|
+
"""Gets the uuid of this OperatorMetrics. # noqa: E501
|
139
|
+
|
140
|
+
|
141
|
+
:return: The uuid of this OperatorMetrics. # noqa: E501
|
142
|
+
:rtype: str
|
143
|
+
"""
|
144
|
+
return self._uuid
|
145
|
+
|
146
|
+
@uuid.setter
|
147
|
+
def uuid(self, uuid):
|
148
|
+
"""Sets the uuid of this OperatorMetrics.
|
149
|
+
|
150
|
+
|
151
|
+
:param uuid: The uuid of this OperatorMetrics. # noqa: E501
|
152
|
+
:type: str
|
153
|
+
"""
|
154
|
+
|
155
|
+
self._uuid = uuid
|
156
|
+
|
131
157
|
@property
|
132
158
|
def state(self):
|
133
159
|
"""Gets the state of this OperatorMetrics. # noqa: E501
|
@@ -0,0 +1,120 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
"""
|
4
|
+
Managed Ray API
|
5
|
+
|
6
|
+
No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) # noqa: E501
|
7
|
+
|
8
|
+
The version of the OpenAPI document: 0.1.0
|
9
|
+
Generated by: https://openapi-generator.tech
|
10
|
+
"""
|
11
|
+
|
12
|
+
|
13
|
+
import pprint
|
14
|
+
import re # noqa: F401
|
15
|
+
|
16
|
+
import six
|
17
|
+
|
18
|
+
from openapi_client.configuration import Configuration
|
19
|
+
|
20
|
+
|
21
|
+
class TaskSummaryConfig(object):
|
22
|
+
"""NOTE: This class is auto generated by OpenAPI Generator.
|
23
|
+
Ref: https://openapi-generator.tech
|
24
|
+
|
25
|
+
Do not edit the class manually.
|
26
|
+
"""
|
27
|
+
|
28
|
+
"""
|
29
|
+
Attributes:
|
30
|
+
openapi_types (dict): The key is attribute name
|
31
|
+
and the value is attribute type.
|
32
|
+
attribute_map (dict): The key is attribute name
|
33
|
+
and the value is json key in definition.
|
34
|
+
"""
|
35
|
+
openapi_types = {
|
36
|
+
'data_operator_id': 'str'
|
37
|
+
}
|
38
|
+
|
39
|
+
attribute_map = {
|
40
|
+
'data_operator_id': 'data_operator_id'
|
41
|
+
}
|
42
|
+
|
43
|
+
def __init__(self, data_operator_id=None, local_vars_configuration=None): # noqa: E501
|
44
|
+
"""TaskSummaryConfig - a model defined in OpenAPI""" # noqa: E501
|
45
|
+
if local_vars_configuration is None:
|
46
|
+
local_vars_configuration = Configuration()
|
47
|
+
self.local_vars_configuration = local_vars_configuration
|
48
|
+
|
49
|
+
self._data_operator_id = None
|
50
|
+
self.discriminator = None
|
51
|
+
|
52
|
+
if data_operator_id is not None:
|
53
|
+
self.data_operator_id = data_operator_id
|
54
|
+
|
55
|
+
@property
|
56
|
+
def data_operator_id(self):
|
57
|
+
"""Gets the data_operator_id of this TaskSummaryConfig. # noqa: E501
|
58
|
+
|
59
|
+
|
60
|
+
:return: The data_operator_id of this TaskSummaryConfig. # noqa: E501
|
61
|
+
:rtype: str
|
62
|
+
"""
|
63
|
+
return self._data_operator_id
|
64
|
+
|
65
|
+
@data_operator_id.setter
|
66
|
+
def data_operator_id(self, data_operator_id):
|
67
|
+
"""Sets the data_operator_id of this TaskSummaryConfig.
|
68
|
+
|
69
|
+
|
70
|
+
:param data_operator_id: The data_operator_id of this TaskSummaryConfig. # noqa: E501
|
71
|
+
:type: str
|
72
|
+
"""
|
73
|
+
|
74
|
+
self._data_operator_id = data_operator_id
|
75
|
+
|
76
|
+
def to_dict(self):
|
77
|
+
"""Returns the model properties as a dict"""
|
78
|
+
result = {}
|
79
|
+
|
80
|
+
for attr, _ in six.iteritems(self.openapi_types):
|
81
|
+
value = getattr(self, attr)
|
82
|
+
if isinstance(value, list):
|
83
|
+
result[attr] = list(map(
|
84
|
+
lambda x: x.to_dict() if hasattr(x, "to_dict") else x,
|
85
|
+
value
|
86
|
+
))
|
87
|
+
elif hasattr(value, "to_dict"):
|
88
|
+
result[attr] = value.to_dict()
|
89
|
+
elif isinstance(value, dict):
|
90
|
+
result[attr] = dict(map(
|
91
|
+
lambda item: (item[0], item[1].to_dict())
|
92
|
+
if hasattr(item[1], "to_dict") else item,
|
93
|
+
value.items()
|
94
|
+
))
|
95
|
+
else:
|
96
|
+
result[attr] = value
|
97
|
+
|
98
|
+
return result
|
99
|
+
|
100
|
+
def to_str(self):
|
101
|
+
"""Returns the string representation of the model"""
|
102
|
+
return pprint.pformat(self.to_dict())
|
103
|
+
|
104
|
+
def __repr__(self):
|
105
|
+
"""For `print` and `pprint`"""
|
106
|
+
return self.to_str()
|
107
|
+
|
108
|
+
def __eq__(self, other):
|
109
|
+
"""Returns true if both objects are equal"""
|
110
|
+
if not isinstance(other, TaskSummaryConfig):
|
111
|
+
return False
|
112
|
+
|
113
|
+
return self.to_dict() == other.to_dict()
|
114
|
+
|
115
|
+
def __ne__(self, other):
|
116
|
+
"""Returns true if both objects are not equal"""
|
117
|
+
if not isinstance(other, TaskSummaryConfig):
|
118
|
+
return True
|
119
|
+
|
120
|
+
return self.to_dict() != other.to_dict()
|
@@ -39,7 +39,8 @@ class TaskTableConfig(object):
|
|
39
39
|
'text': 'str',
|
40
40
|
'job_id': 'str',
|
41
41
|
'exception_type': 'str',
|
42
|
-
'attempts': 'TaskAttempts'
|
42
|
+
'attempts': 'TaskAttempts',
|
43
|
+
'data_operator_id': 'str'
|
43
44
|
}
|
44
45
|
|
45
46
|
attribute_map = {
|
@@ -49,10 +50,11 @@ class TaskTableConfig(object):
|
|
49
50
|
'text': 'text',
|
50
51
|
'job_id': 'job_id',
|
51
52
|
'exception_type': 'exception_type',
|
52
|
-
'attempts': 'attempts'
|
53
|
+
'attempts': 'attempts',
|
54
|
+
'data_operator_id': 'data_operator_id'
|
53
55
|
}
|
54
56
|
|
55
|
-
def __init__(self, task_id=None, function_name=None, current_state=None, text=None, job_id=None, exception_type=None, attempts=None, local_vars_configuration=None): # noqa: E501
|
57
|
+
def __init__(self, task_id=None, function_name=None, current_state=None, text=None, job_id=None, exception_type=None, attempts=None, data_operator_id=None, local_vars_configuration=None): # noqa: E501
|
56
58
|
"""TaskTableConfig - a model defined in OpenAPI""" # noqa: E501
|
57
59
|
if local_vars_configuration is None:
|
58
60
|
local_vars_configuration = Configuration()
|
@@ -65,6 +67,7 @@ class TaskTableConfig(object):
|
|
65
67
|
self._job_id = None
|
66
68
|
self._exception_type = None
|
67
69
|
self._attempts = None
|
70
|
+
self._data_operator_id = None
|
68
71
|
self.discriminator = None
|
69
72
|
|
70
73
|
if task_id is not None:
|
@@ -81,6 +84,8 @@ class TaskTableConfig(object):
|
|
81
84
|
self.exception_type = exception_type
|
82
85
|
if attempts is not None:
|
83
86
|
self.attempts = attempts
|
87
|
+
if data_operator_id is not None:
|
88
|
+
self.data_operator_id = data_operator_id
|
84
89
|
|
85
90
|
@property
|
86
91
|
def task_id(self):
|
@@ -229,6 +234,27 @@ class TaskTableConfig(object):
|
|
229
234
|
|
230
235
|
self._attempts = attempts
|
231
236
|
|
237
|
+
@property
|
238
|
+
def data_operator_id(self):
|
239
|
+
"""Gets the data_operator_id of this TaskTableConfig. # noqa: E501
|
240
|
+
|
241
|
+
|
242
|
+
:return: The data_operator_id of this TaskTableConfig. # noqa: E501
|
243
|
+
:rtype: str
|
244
|
+
"""
|
245
|
+
return self._data_operator_id
|
246
|
+
|
247
|
+
@data_operator_id.setter
|
248
|
+
def data_operator_id(self, data_operator_id):
|
249
|
+
"""Sets the data_operator_id of this TaskTableConfig.
|
250
|
+
|
251
|
+
|
252
|
+
:param data_operator_id: The data_operator_id of this TaskTableConfig. # noqa: E501
|
253
|
+
:type: str
|
254
|
+
"""
|
255
|
+
|
256
|
+
self._data_operator_id = data_operator_id
|
257
|
+
|
232
258
|
def to_dict(self):
|
233
259
|
"""Returns the model properties as a dict"""
|
234
260
|
result = {}
|
@@ -51,7 +51,8 @@ class TaskTableRow(object):
|
|
51
51
|
'worker_pid': 'str',
|
52
52
|
'parent_task_id': 'str',
|
53
53
|
'ray_session_name': 'str',
|
54
|
-
'exception_type': 'str'
|
54
|
+
'exception_type': 'str',
|
55
|
+
'data_operator_id': 'str'
|
55
56
|
}
|
56
57
|
|
57
58
|
attribute_map = {
|
@@ -73,10 +74,11 @@ class TaskTableRow(object):
|
|
73
74
|
'worker_pid': 'worker_pid',
|
74
75
|
'parent_task_id': 'parent_task_id',
|
75
76
|
'ray_session_name': 'ray_session_name',
|
76
|
-
'exception_type': 'exception_type'
|
77
|
+
'exception_type': 'exception_type',
|
78
|
+
'data_operator_id': 'data_operator_id'
|
77
79
|
}
|
78
80
|
|
79
|
-
def __init__(self, id=None, attempt_number=None, total_attempts=None, job_id=None, function_name=None, task_type=None, current_state=None, error_message=None, start_time_ns=None, start_running_time_ns=None, end_time_ns=None, required_resources=None, runtime_env=None, node_id=None, worker_id=None, worker_pid=None, parent_task_id=None, ray_session_name=None, exception_type=None, local_vars_configuration=None): # noqa: E501
|
81
|
+
def __init__(self, id=None, attempt_number=None, total_attempts=None, job_id=None, function_name=None, task_type=None, current_state=None, error_message=None, start_time_ns=None, start_running_time_ns=None, end_time_ns=None, required_resources=None, runtime_env=None, node_id=None, worker_id=None, worker_pid=None, parent_task_id=None, ray_session_name=None, exception_type=None, data_operator_id=None, local_vars_configuration=None): # noqa: E501
|
80
82
|
"""TaskTableRow - a model defined in OpenAPI""" # noqa: E501
|
81
83
|
if local_vars_configuration is None:
|
82
84
|
local_vars_configuration = Configuration()
|
@@ -101,6 +103,7 @@ class TaskTableRow(object):
|
|
101
103
|
self._parent_task_id = None
|
102
104
|
self._ray_session_name = None
|
103
105
|
self._exception_type = None
|
106
|
+
self._data_operator_id = None
|
104
107
|
self.discriminator = None
|
105
108
|
|
106
109
|
self.id = id
|
@@ -133,6 +136,8 @@ class TaskTableRow(object):
|
|
133
136
|
self.ray_session_name = ray_session_name
|
134
137
|
if exception_type is not None:
|
135
138
|
self.exception_type = exception_type
|
139
|
+
if data_operator_id is not None:
|
140
|
+
self.data_operator_id = data_operator_id
|
136
141
|
|
137
142
|
@property
|
138
143
|
def id(self):
|
@@ -549,6 +554,27 @@ class TaskTableRow(object):
|
|
549
554
|
|
550
555
|
self._exception_type = exception_type
|
551
556
|
|
557
|
+
@property
|
558
|
+
def data_operator_id(self):
|
559
|
+
"""Gets the data_operator_id of this TaskTableRow. # noqa: E501
|
560
|
+
|
561
|
+
|
562
|
+
:return: The data_operator_id of this TaskTableRow. # noqa: E501
|
563
|
+
:rtype: str
|
564
|
+
"""
|
565
|
+
return self._data_operator_id
|
566
|
+
|
567
|
+
@data_operator_id.setter
|
568
|
+
def data_operator_id(self, data_operator_id):
|
569
|
+
"""Sets the data_operator_id of this TaskTableRow.
|
570
|
+
|
571
|
+
|
572
|
+
:param data_operator_id: The data_operator_id of this TaskTableRow. # noqa: E501
|
573
|
+
:type: str
|
574
|
+
"""
|
575
|
+
|
576
|
+
self._data_operator_id = data_operator_id
|
577
|
+
|
552
578
|
def to_dict(self):
|
553
579
|
"""Returns the model properties as a dict"""
|
554
580
|
result = {}
|
@@ -433,22 +433,130 @@ def cloud_update( # noqa: PLR0913
|
|
433
433
|
help="Cloud id to get details about. Alternative to cloud name.",
|
434
434
|
required=False,
|
435
435
|
)
|
436
|
+
@click.option(
|
437
|
+
"--resource",
|
438
|
+
help="Name of the cloud resource to get details for. If not provided, defaults to the primary resource for the cloud.",
|
439
|
+
type=str,
|
440
|
+
required=False,
|
441
|
+
)
|
442
|
+
@click.option(
|
443
|
+
"--resource-id",
|
444
|
+
"cloud_resource_id",
|
445
|
+
help="Cloud resource ID to get details for. Alternative to cloud resource name.",
|
446
|
+
type=str,
|
447
|
+
required=False,
|
448
|
+
)
|
436
449
|
def cloud_config_get(
|
437
|
-
cloud_name: Optional[str],
|
450
|
+
cloud_name: Optional[str],
|
451
|
+
name: Optional[str],
|
452
|
+
cloud_id: Optional[str],
|
453
|
+
resource: Optional[str],
|
454
|
+
cloud_resource_id: Optional[str],
|
438
455
|
) -> None:
|
439
456
|
if cloud_name and name and cloud_name != name:
|
440
457
|
raise click.ClickException(
|
441
458
|
"The positional argument CLOUD_NAME and the keyword argument --name "
|
442
459
|
"were both provided. Please only provide one of these two arguments."
|
443
460
|
)
|
461
|
+
|
462
|
+
# Validate resource selection options
|
463
|
+
if resource and cloud_resource_id:
|
464
|
+
raise click.ClickException(
|
465
|
+
"Cannot specify both --resource and --resource-id. Please provide only one."
|
466
|
+
)
|
467
|
+
|
444
468
|
config = CloudController().get_cloud_config(
|
445
|
-
cloud_name=cloud_name or name,
|
469
|
+
cloud_name=cloud_name or name,
|
470
|
+
cloud_id=cloud_id,
|
471
|
+
resource=resource,
|
472
|
+
cloud_resource_id=cloud_resource_id,
|
446
473
|
)
|
447
474
|
stream = StringIO()
|
448
475
|
yaml.dump(config.spec, stream)
|
449
476
|
print(stream.getvalue())
|
450
477
|
|
451
478
|
|
479
|
+
def _validate_cloud_config_update_args(
|
480
|
+
cloud_name: Optional[str],
|
481
|
+
name: Optional[str],
|
482
|
+
resource: Optional[str],
|
483
|
+
cloud_resource_id: Optional[str],
|
484
|
+
passed_enable_disable_flags: bool,
|
485
|
+
spec_file: Optional[str],
|
486
|
+
) -> None:
|
487
|
+
"""Validate arguments for cloud config update command."""
|
488
|
+
if cloud_name and name and cloud_name != name:
|
489
|
+
raise click.ClickException(
|
490
|
+
"The positional argument CLOUD_NAME and the keyword argument --name "
|
491
|
+
"were both provided. Please only provide one of these two arguments."
|
492
|
+
)
|
493
|
+
|
494
|
+
if resource and cloud_resource_id:
|
495
|
+
raise click.ClickException(
|
496
|
+
"Cannot specify both --resource and --resource-id. Please provide only one."
|
497
|
+
)
|
498
|
+
|
499
|
+
if passed_enable_disable_flags and spec_file:
|
500
|
+
raise click.ClickException(
|
501
|
+
"Invalid combination of arguments: --spec-file should not be provided with any other enable/disable flags."
|
502
|
+
)
|
503
|
+
|
504
|
+
if (resource or cloud_resource_id) and not spec_file:
|
505
|
+
raise click.ClickException(
|
506
|
+
"--resource and --resource-id can only be used with --spec-file."
|
507
|
+
)
|
508
|
+
|
509
|
+
|
510
|
+
def _handle_log_ingestion_config(enable_log_ingestion: Optional[bool]) -> None:
|
511
|
+
"""Handle log ingestion configuration with user prompts."""
|
512
|
+
if enable_log_ingestion is True:
|
513
|
+
consent_message = click.prompt(
|
514
|
+
"--enable-log-ingestion is specified. Please note the logs produced by "
|
515
|
+
"your cluster will be ingested into Anyscale's service in region "
|
516
|
+
"us-west-2. Your clusters may incur extra data transfer cost from the "
|
517
|
+
"cloud provider. If you are sure you want to enable this feature, "
|
518
|
+
'please type "consent"',
|
519
|
+
type=str,
|
520
|
+
)
|
521
|
+
if consent_message != "consent":
|
522
|
+
raise click.ClickException(
|
523
|
+
'You must type "consent" to enable log ingestion.'
|
524
|
+
)
|
525
|
+
elif enable_log_ingestion is False:
|
526
|
+
confirm_response = click.confirm(
|
527
|
+
"--disable-log-ingestion is specified. Please note the logs that's "
|
528
|
+
"already ingested will not be deleted. Existing clusters will not stop"
|
529
|
+
"the log ingestion until you restart them. Logs are automatically "
|
530
|
+
"deleted after 30 days from the time of ingestion. Are you sure you "
|
531
|
+
"want to disable log ingestion?"
|
532
|
+
)
|
533
|
+
if not confirm_response:
|
534
|
+
raise click.ClickException("You must confirm to disable log ingestion.")
|
535
|
+
|
536
|
+
|
537
|
+
def _handle_system_cluster_config(enable_system_cluster: Optional[bool]) -> None:
|
538
|
+
"""Handle system cluster configuration with user prompts."""
|
539
|
+
confirm_response = True
|
540
|
+
if enable_system_cluster is True:
|
541
|
+
confirm_response = click.confirm(
|
542
|
+
"--enable-system-cluster is specified. Please note that this will enable "
|
543
|
+
"system cluster functionality for the cloud and will incur extra cost. "
|
544
|
+
"Are you sure you want to enable system cluster?"
|
545
|
+
)
|
546
|
+
elif enable_system_cluster is False:
|
547
|
+
confirm_response = click.confirm(
|
548
|
+
"--disable-system-cluster is specified. This will disable system cluster "
|
549
|
+
"functionality for the cloud. Please note that this will not terminate "
|
550
|
+
"the system cluster if it is currently running. "
|
551
|
+
"Are you sure you want to disable system cluster?"
|
552
|
+
)
|
553
|
+
|
554
|
+
if enable_system_cluster is not None and not confirm_response:
|
555
|
+
raise click.ClickException(
|
556
|
+
f"You must confirm to {'enable' if enable_system_cluster else 'disable'} system cluster."
|
557
|
+
)
|
558
|
+
|
559
|
+
|
452
560
|
@cloud_config_group.command(
|
453
561
|
"update",
|
454
562
|
help="Update the current configuration for a cloud.",
|
@@ -490,88 +598,65 @@ def cloud_config_get(
|
|
490
598
|
required=False,
|
491
599
|
help="Provide a path to a specification file.",
|
492
600
|
)
|
493
|
-
|
601
|
+
@click.option(
|
602
|
+
"--resource",
|
603
|
+
help="Name of the cloud resource to get details for. If not provided, defaults to the primary resource for the cloud.",
|
604
|
+
type=str,
|
605
|
+
required=False,
|
606
|
+
)
|
607
|
+
@click.option(
|
608
|
+
"--resource-id",
|
609
|
+
"cloud_resource_id",
|
610
|
+
help="Cloud resource ID to get details for. Alternative to cloud resource name.",
|
611
|
+
type=str,
|
612
|
+
required=False,
|
613
|
+
)
|
614
|
+
def cloud_config_update( # noqa: PLR0913
|
494
615
|
cloud_name: Optional[str],
|
495
616
|
name: Optional[str],
|
496
617
|
cloud_id: Optional[str],
|
497
618
|
enable_log_ingestion: Optional[bool],
|
498
619
|
enable_system_cluster: Optional[bool],
|
499
620
|
spec_file: Optional[str],
|
621
|
+
resource: Optional[str],
|
622
|
+
cloud_resource_id: Optional[str],
|
500
623
|
) -> None:
|
501
|
-
if cloud_name and name and cloud_name != name:
|
502
|
-
raise click.ClickException(
|
503
|
-
"The positional argument CLOUD_NAME and the keyword argument --name "
|
504
|
-
"were both provided. Please only provide one of these two arguments."
|
505
|
-
)
|
506
|
-
|
507
624
|
passed_enable_disable_flags = any(
|
508
625
|
[enable_log_ingestion is not None, enable_system_cluster is not None]
|
509
626
|
)
|
510
|
-
if passed_enable_disable_flags and spec_file:
|
511
|
-
raise click.ClickException(
|
512
|
-
"Invalid combination of arguments: --spec-file should not be provided with any other enable/disable flags."
|
513
|
-
)
|
514
627
|
|
515
|
-
|
516
|
-
|
517
|
-
|
518
|
-
|
519
|
-
|
520
|
-
|
521
|
-
|
522
|
-
|
523
|
-
"cloud provider. If you are sure you want to enable this feature, "
|
524
|
-
'please type "consent"',
|
525
|
-
type=str,
|
526
|
-
)
|
527
|
-
if consent_message != "consent":
|
528
|
-
raise click.ClickException(
|
529
|
-
'You must type "consent" to enable log ingestion.'
|
530
|
-
)
|
531
|
-
elif enable_log_ingestion is False:
|
532
|
-
confirm_response = click.confirm(
|
533
|
-
"--disable-log-ingestion is specified. Please note the logs that's "
|
534
|
-
"already ingested will not be deleted. Existing clusters will not stop"
|
535
|
-
"the log ingestion until you restart them. Logs are automatically "
|
536
|
-
"deleted after 30 days from the time of ingestion. Are you sure you "
|
537
|
-
"want to disable log ingestion?"
|
538
|
-
)
|
539
|
-
if not confirm_response:
|
540
|
-
raise click.ClickException("You must confirm to disable log ingestion.")
|
628
|
+
_validate_cloud_config_update_args(
|
629
|
+
cloud_name,
|
630
|
+
name,
|
631
|
+
resource,
|
632
|
+
cloud_resource_id,
|
633
|
+
passed_enable_disable_flags,
|
634
|
+
spec_file,
|
635
|
+
)
|
541
636
|
|
637
|
+
cloud_name_resolved = cloud_name or name
|
638
|
+
|
639
|
+
if passed_enable_disable_flags:
|
640
|
+
_handle_log_ingestion_config(enable_log_ingestion)
|
542
641
|
CloudController().update_cloud_config(
|
543
|
-
cloud_name=
|
642
|
+
cloud_name=cloud_name_resolved,
|
544
643
|
cloud_id=cloud_id,
|
545
644
|
enable_log_ingestion=enable_log_ingestion,
|
546
645
|
)
|
547
646
|
|
548
|
-
|
549
|
-
if enable_system_cluster is True:
|
550
|
-
confirm_response = click.confirm(
|
551
|
-
"--enable-system-cluster is specified. Please note that this will enable "
|
552
|
-
"system cluster functionality for the cloud and will incur extra cost. "
|
553
|
-
"Are you sure you want to enable system cluster?"
|
554
|
-
)
|
555
|
-
elif enable_system_cluster is False:
|
556
|
-
confirm_response = click.confirm(
|
557
|
-
"--disable-system-cluster is specified. This will disable system cluster "
|
558
|
-
"functionality for the cloud. Please note that this will not terminate "
|
559
|
-
"the system cluster if it is currently running. "
|
560
|
-
"Are you sure you want to disable system cluster?"
|
561
|
-
)
|
562
|
-
if enable_system_cluster is not None and not confirm_response:
|
563
|
-
raise click.ClickException(
|
564
|
-
f"You must confirm to {'enable' if enable_system_cluster else 'disable'} system cluster."
|
565
|
-
)
|
566
|
-
|
647
|
+
_handle_system_cluster_config(enable_system_cluster)
|
567
648
|
CloudController().update_system_cluster_config(
|
568
|
-
cloud_name=
|
649
|
+
cloud_name=cloud_name_resolved,
|
569
650
|
cloud_id=cloud_id,
|
570
651
|
system_cluster_enabled=enable_system_cluster,
|
571
652
|
)
|
572
653
|
elif spec_file:
|
573
654
|
CloudController().update_cloud_config(
|
574
|
-
cloud_name=
|
655
|
+
cloud_name=cloud_name_resolved,
|
656
|
+
cloud_id=cloud_id,
|
657
|
+
spec_file=spec_file,
|
658
|
+
resource=resource,
|
659
|
+
cloud_resource_id=cloud_resource_id,
|
575
660
|
)
|
576
661
|
else:
|
577
662
|
raise click.ClickException(
|
@@ -629,6 +629,18 @@ Output
|
|
629
629
|
--enable-system-cluster is specified. [...] Are you sure you want to enable system cluster? [y/N]: y
|
630
630
|
Output
|
631
631
|
(anyscale +11.4s) Successfully enabled system cluster for cloud cloud_id
|
632
|
+
|
633
|
+
$ anyscale cloud config update --cloud-id cloud_id --spec-file iam.yaml
|
634
|
+
Output
|
635
|
+
(anyscale +2.1s) Successfully updated cloud configuration for cloud my-cloud (resource: cldrsrc_xyz123)
|
636
|
+
|
637
|
+
$ anyscale cloud config update --cloud-id cloud_id --resource shared-usw2 --spec-file iam.yaml
|
638
|
+
Output
|
639
|
+
(anyscale +2.1s) Successfully updated cloud configuration for cloud my-cloud (resource: cldrsrc_abc456)
|
640
|
+
|
641
|
+
$ anyscale cloud config update --cloud-id cloud_id --cloud-resource-id cldrsrc_xyz123 --spec-file iam.yaml
|
642
|
+
Output
|
643
|
+
(anyscale +2.1s) Successfully updated cloud configuration for cloud my-cloud (resource: cldrsrc_xyz123)
|
632
644
|
"""
|
633
645
|
|
634
646
|
CLOUD_TERMINATE_SYSTEM_CLUSTER_EXAMPLE = """\
|
@@ -106,24 +106,3 @@ def delete(email: Optional[str], name: Optional[str]) -> None:
|
|
106
106
|
log.info(f"Service account {email or name} deleted successfully.")
|
107
107
|
except ValueError as e:
|
108
108
|
log.error(f"Error deleting service account: {e}")
|
109
|
-
|
110
|
-
|
111
|
-
@service_account_cli.command(
|
112
|
-
name="rotate-api-keys", help="Rotate all api keys of a service account."
|
113
|
-
)
|
114
|
-
@click.option(
|
115
|
-
"--email", help="Rotate API keys for the service account with this email.", type=str
|
116
|
-
)
|
117
|
-
@click.option(
|
118
|
-
"--name", help="Rotate API keys for the service account with this name.", type=str
|
119
|
-
)
|
120
|
-
def rotate_api_keys(email: Optional[str], name: Optional[str]) -> None:
|
121
|
-
try:
|
122
|
-
api_key = anyscale.service_account.rotate_api_keys(email, name)
|
123
|
-
|
124
|
-
log.info(
|
125
|
-
f"\nAll API keys for service account {email or name} rotated successfully."
|
126
|
-
)
|
127
|
-
_print_new_api_key(api_key)
|
128
|
-
except ValueError as e:
|
129
|
-
log.error(f"Error rotating API keys: {e}")
|
@@ -1929,18 +1929,94 @@ class CloudController(BaseController):
|
|
1929
1929
|
f"Successfully removed resource {resource_name} from cloud {cloud_name}!"
|
1930
1930
|
)
|
1931
1931
|
|
1932
|
+
def _resolve_cloud_resource_id(
|
1933
|
+
self,
|
1934
|
+
cloud_id: str,
|
1935
|
+
resource: Optional[str] = None,
|
1936
|
+
cloud_resource_id: Optional[str] = None,
|
1937
|
+
) -> str:
|
1938
|
+
"""
|
1939
|
+
Resolve cloud resource ID based on resolution order: id > name > primary.
|
1940
|
+
|
1941
|
+
Returns the resolved cloud_resource_id to use for API calls.
|
1942
|
+
"""
|
1943
|
+
# If cloud_resource_id is provided, use it directly
|
1944
|
+
if cloud_resource_id:
|
1945
|
+
self.log.info(f"Using provided cloud resource ID: {cloud_resource_id}")
|
1946
|
+
return cloud_resource_id
|
1947
|
+
|
1948
|
+
# If resource name is provided, resolve by name
|
1949
|
+
if resource:
|
1950
|
+
# Get all cloud resources to resolve by name
|
1951
|
+
cloud_resources = self.api_client.get_cloud_deployments_api_v2_clouds_cloud_id_deployments_get(
|
1952
|
+
cloud_id=cloud_id
|
1953
|
+
).results
|
1954
|
+
|
1955
|
+
if not cloud_resources:
|
1956
|
+
raise RuntimeError(f"No cloud resources found for cloud {cloud_id}")
|
1957
|
+
|
1958
|
+
# Find resources with matching name
|
1959
|
+
matching_resources = [r for r in cloud_resources if r.name == resource]
|
1960
|
+
|
1961
|
+
if not matching_resources:
|
1962
|
+
raise RuntimeError(
|
1963
|
+
f"No cloud resource found with name '{resource}' in cloud {cloud_id}"
|
1964
|
+
)
|
1965
|
+
|
1966
|
+
if len(matching_resources) > 1:
|
1967
|
+
raise RuntimeError(
|
1968
|
+
f"Multiple cloud resources found with name '{resource}'. "
|
1969
|
+
f"Please use --cloud-resource-id to specify which resource to use. "
|
1970
|
+
f"Available resource IDs: {[r.cloud_deployment_id for r in matching_resources]}"
|
1971
|
+
)
|
1972
|
+
|
1973
|
+
resolved_id = matching_resources[0].cloud_deployment_id
|
1974
|
+
self.log.info(f"Resolved resource name '{resource}' to ID: {resolved_id}")
|
1975
|
+
return resolved_id
|
1976
|
+
|
1977
|
+
# Default to primary resource (marked with is_default=True)
|
1978
|
+
cloud_resources = self.api_client.get_cloud_deployments_api_v2_clouds_cloud_id_deployments_get(
|
1979
|
+
cloud_id=cloud_id
|
1980
|
+
).results
|
1981
|
+
|
1982
|
+
if not cloud_resources:
|
1983
|
+
raise RuntimeError(f"No cloud resources found for cloud {cloud_id}")
|
1984
|
+
|
1985
|
+
# Find primary resource (is_default=True)
|
1986
|
+
primary_resources = [r for r in cloud_resources if r.is_default]
|
1987
|
+
|
1988
|
+
if not primary_resources:
|
1989
|
+
raise RuntimeError(f"No primary cloud resource found for cloud {cloud_id}")
|
1990
|
+
|
1991
|
+
if len(primary_resources) > 1:
|
1992
|
+
raise RuntimeError(
|
1993
|
+
f"Multiple primary cloud resources found for cloud {cloud_id}"
|
1994
|
+
)
|
1995
|
+
|
1996
|
+
resolved_id = primary_resources[0].cloud_deployment_id
|
1997
|
+
self.log.info(f"Using primary cloud resource ID: {resolved_id}")
|
1998
|
+
return resolved_id
|
1999
|
+
|
1932
2000
|
def get_cloud_config(
|
1933
|
-
self,
|
2001
|
+
self,
|
2002
|
+
cloud_name: Optional[str] = None,
|
2003
|
+
cloud_id: Optional[str] = None,
|
2004
|
+
resource: Optional[str] = None,
|
2005
|
+
cloud_resource_id: Optional[str] = None,
|
1934
2006
|
) -> CloudDeploymentConfig:
|
1935
2007
|
"""Get a cloud's current JSON configuration."""
|
1936
2008
|
|
1937
|
-
|
2009
|
+
resolved_cloud_id, cloud_name = get_cloud_id_and_name(
|
1938
2010
|
self.api_client, cloud_id, cloud_name
|
1939
2011
|
)
|
1940
2012
|
|
1941
|
-
#
|
2013
|
+
# Resolve the cloud resource ID to use
|
2014
|
+
resolved_cloud_resource_id = self._resolve_cloud_resource_id(
|
2015
|
+
resolved_cloud_id, resource, cloud_resource_id
|
2016
|
+
)
|
2017
|
+
|
1942
2018
|
config: CloudDeploymentConfig = self.api_client.get_cloud_deployment_config_api_v2_clouds_cloud_id_deployment_cloud_deployment_id_config_get(
|
1943
|
-
cloud_id=
|
2019
|
+
cloud_id=resolved_cloud_id, cloud_deployment_id=resolved_cloud_resource_id
|
1944
2020
|
).result
|
1945
2021
|
|
1946
2022
|
return config
|
@@ -1951,21 +2027,23 @@ class CloudController(BaseController):
|
|
1951
2027
|
cloud_id: Optional[str] = None,
|
1952
2028
|
enable_log_ingestion: Optional[bool] = None,
|
1953
2029
|
spec_file: Optional[str] = None,
|
2030
|
+
resource: Optional[str] = None,
|
2031
|
+
cloud_resource_id: Optional[str] = None,
|
1954
2032
|
):
|
1955
2033
|
"""Update a cloud's configuration."""
|
1956
2034
|
if enable_log_ingestion is None and spec_file is None:
|
1957
2035
|
return
|
1958
2036
|
|
1959
|
-
|
2037
|
+
resolved_cloud_id, cloud_name = get_cloud_id_and_name(
|
1960
2038
|
self.api_client, cloud_id, cloud_name
|
1961
2039
|
)
|
1962
2040
|
if enable_log_ingestion is not None:
|
1963
2041
|
self._update_customer_aggregated_logs_config(
|
1964
|
-
cloud_id=
|
2042
|
+
cloud_id=resolved_cloud_id, is_enabled=enable_log_ingestion, # type: ignore
|
1965
2043
|
)
|
1966
2044
|
self.log.info(
|
1967
2045
|
f"Successfully updated log ingestion configuration for cloud, "
|
1968
|
-
f"{
|
2046
|
+
f"{resolved_cloud_id} to {enable_log_ingestion}"
|
1969
2047
|
)
|
1970
2048
|
elif spec_file is not None:
|
1971
2049
|
path = pathlib.Path(spec_file)
|
@@ -1975,15 +2053,21 @@ class CloudController(BaseController):
|
|
1975
2053
|
if not path.is_file():
|
1976
2054
|
raise ValueError(f"File {spec_file} is not a file.")
|
1977
2055
|
|
2056
|
+
# Resolve the cloud resource ID to use
|
2057
|
+
resolved_cloud_resource_id = self._resolve_cloud_resource_id(
|
2058
|
+
resolved_cloud_id, resource, cloud_resource_id
|
2059
|
+
)
|
2060
|
+
|
1978
2061
|
spec = yaml.safe_load(path.read_text())
|
1979
2062
|
config = CloudDeploymentConfig(spec=spec)
|
1980
2063
|
self.api_client.update_cloud_deployment_config_api_v2_clouds_cloud_id_deployment_cloud_deployment_id_config_put(
|
1981
|
-
cloud_id=
|
1982
|
-
cloud_deployment_id=
|
2064
|
+
cloud_id=resolved_cloud_id,
|
2065
|
+
cloud_deployment_id=resolved_cloud_resource_id,
|
1983
2066
|
cloud_deployment_config=config,
|
1984
2067
|
)
|
1985
2068
|
self.log.info(
|
1986
|
-
f"Successfully updated cloud configuration for cloud {cloud_name}"
|
2069
|
+
f"Successfully updated cloud configuration for cloud {cloud_name} "
|
2070
|
+
f"(resource: {resolved_cloud_resource_id})"
|
1987
2071
|
)
|
1988
2072
|
|
1989
2073
|
def set_default_cloud(
|
@@ -2693,7 +2777,6 @@ class CloudController(BaseController):
|
|
2693
2777
|
provider=provider,
|
2694
2778
|
cloud_deployment_id=cloud_resource_id,
|
2695
2779
|
region=region if cloud_provider == CloudProviders.AZURE else None,
|
2696
|
-
kubernetes_zones=kubernetes_zones,
|
2697
2780
|
operator_iam_identity=anyscale_operator_iam_identity
|
2698
2781
|
if cloud_provider == CloudProviders.AZURE
|
2699
2782
|
else None,
|
@@ -2939,7 +3022,6 @@ class CloudController(BaseController):
|
|
2939
3022
|
provider="aws",
|
2940
3023
|
cloud_deployment_id=cloud_resource_id,
|
2941
3024
|
region=region,
|
2942
|
-
kubernetes_zones=kubernetes_zones,
|
2943
3025
|
)
|
2944
3026
|
self.log.info(
|
2945
3027
|
f"Cloud registration complete! To install the Anyscale operator, run:\n\n{helm_command}"
|
@@ -3434,7 +3516,6 @@ class CloudController(BaseController):
|
|
3434
3516
|
provider="gcp",
|
3435
3517
|
cloud_deployment_id=cloud_resource_id,
|
3436
3518
|
region=region,
|
3437
|
-
kubernetes_zones=kubernetes_zones,
|
3438
3519
|
operator_iam_identity=anyscale_service_account_email,
|
3439
3520
|
)
|
3440
3521
|
gcloud_command = self._generate_gcp_workload_identity_command(
|
@@ -4160,7 +4241,6 @@ class CloudController(BaseController):
|
|
4160
4241
|
provider: str,
|
4161
4242
|
cloud_deployment_id: str,
|
4162
4243
|
region: Optional[str] = None,
|
4163
|
-
kubernetes_zones: Optional[List[str]] = None,
|
4164
4244
|
operator_iam_identity: Optional[str] = None,
|
4165
4245
|
anyscale_cli_token: Optional[str] = None,
|
4166
4246
|
) -> str:
|
@@ -4171,7 +4251,6 @@ class CloudController(BaseController):
|
|
4171
4251
|
provider: Cloud provider ('aws', 'gcp', 'azure', 'generic')
|
4172
4252
|
cloud_deployment_id: The cloud deployment ID from registration
|
4173
4253
|
region: Cloud region (optional for generic provider)
|
4174
|
-
kubernetes_zones: Optional list of Kubernetes zones
|
4175
4254
|
operator_iam_identity: IAM identity for the operator (GCP service account email, Azure client ID)
|
4176
4255
|
anyscale_cli_token: CLI token (required for Azure and generic providers)
|
4177
4256
|
|
@@ -4226,11 +4305,6 @@ class CloudController(BaseController):
|
|
4226
4305
|
]
|
4227
4306
|
)
|
4228
4307
|
|
4229
|
-
# Add zones if provided (mainly for K8s deployments)
|
4230
|
-
if kubernetes_zones:
|
4231
|
-
zones_str = ",".join(kubernetes_zones)
|
4232
|
-
command_parts.append(f" --set-string zones={zones_str}")
|
4233
|
-
|
4234
4308
|
return " \\\n".join(command_parts)
|
4235
4309
|
|
4236
4310
|
def _generate_gcp_workload_identity_command(
|
@@ -33,8 +33,11 @@ class PrivateServiceAccountSDK(BaseSDK):
|
|
33
33
|
raise ValueError(f"No service account {identifier} found.")
|
34
34
|
|
35
35
|
if len(service_accounts) > 1:
|
36
|
+
names = [sa.name for sa in service_accounts]
|
37
|
+
emails = [sa.email for sa in service_accounts]
|
36
38
|
raise ValueError(
|
37
|
-
f"
|
39
|
+
f"Found {len(service_accounts)} service accounts matching '{identifier}'. "
|
40
|
+
f"Names: {names}, Emails: {emails}. This should not happen - please contact support."
|
38
41
|
)
|
39
42
|
|
40
43
|
def _get_service_account(
|
@@ -44,6 +47,12 @@ class PrivateServiceAccountSDK(BaseSDK):
|
|
44
47
|
service_accounts = self.client.get_organization_collaborators(
|
45
48
|
email=email, name=name, is_service_account=True
|
46
49
|
)
|
50
|
+
|
51
|
+
if name is not None:
|
52
|
+
service_accounts = [sa for sa in service_accounts if sa.name == name]
|
53
|
+
if email is not None:
|
54
|
+
service_accounts = [sa for sa in service_accounts if sa.email == email]
|
55
|
+
|
47
56
|
self._validate_exactly_one_service_account_per_email_or_name(
|
48
57
|
service_accounts, identifier
|
49
58
|
)
|
anyscale/version.py
CHANGED
@@ -1 +1 @@
|
|
1
|
-
__version__ = "0.26.
|
1
|
+
__version__ = "0.26.63"
|
@@ -28,15 +28,15 @@ anyscale/snapshot.py,sha256=UGJT5C1s_4xmQxjWODK5DFpGxHRBX5jOCdSCqXESH8E,1685
|
|
28
28
|
anyscale/tables.py,sha256=TV4F2uLnwehvbkAfaP7iuLlT2wLIo6ORH2LVdRGXW5g,2840
|
29
29
|
anyscale/telemetry.py,sha256=U90C2Vgx48z9PMTI6EbzHFbP3jWnDUutbIfMPBb8-SI,14711
|
30
30
|
anyscale/util.py,sha256=7YPUcm1KCWnmwQpgO0iy0Ly3kSKEAdsCI2jmFridKH0,42881
|
31
|
-
anyscale/version.py,sha256=
|
31
|
+
anyscale/version.py,sha256=YwHEJi7ifYX9dLo3P3a2Toi-dP28q3wJuObI_gswiw4,24
|
32
32
|
anyscale/workspace_utils.py,sha256=OViE88CnIF5ruVxd3kazQ0Mf2BxqtMq6wx-XQ5A2cp8,1204
|
33
33
|
anyscale/_private/anyscale_client/README.md,sha256=kSfI2Jfw5RHZWYtu0di3XtdSCx0d2pSwKMfjmDvw7Tg,3770
|
34
34
|
anyscale/_private/anyscale_client/__init__.py,sha256=807Blx3RHQeS8BmKZcsOQQ4dYoKlCnpm6Bdsif2CrHg,337
|
35
|
-
anyscale/_private/anyscale_client/anyscale_client.py,sha256=
|
35
|
+
anyscale/_private/anyscale_client/anyscale_client.py,sha256=wmOKitarsg5d9pH0PsvIRCwJCJdHBhL46hB0dF8qTPs,80538
|
36
36
|
anyscale/_private/anyscale_client/common.py,sha256=w7PtoLKfZZGBjNz4_5_KF2I38HjaXzAt2Xb05pHtYKI,27436
|
37
37
|
anyscale/_private/anyscale_client/fake_anyscale_client.py,sha256=y_Rq-nqVndWdO5y55KVL262YKCQRM8AGYvg-SbQxe_c,63526
|
38
38
|
anyscale/_private/docgen/README.md,sha256=z0tj8Jy0KmxWJBQMHKyzXGX_cYYgI8m5DCD6KCMU8oI,762
|
39
|
-
anyscale/_private/docgen/__main__.py,sha256=
|
39
|
+
anyscale/_private/docgen/__main__.py,sha256=2kz6Kp1QKPiuMu3FmdwccC-GVzKETBrUNy9wiXMx4tc,25112
|
40
40
|
anyscale/_private/docgen/api.md,sha256=VKW293yubbeUG17A38wYuaONKDL5XICMguyfZ2xkIyY,27495
|
41
41
|
anyscale/_private/docgen/generator.py,sha256=9HvkVxTmaeAFBjK59eZ5pil6tpGjFQDqf0LNP2-lg4s,24041
|
42
42
|
anyscale/_private/docgen/generator_legacy.py,sha256=f6eJzQXjkqGEOWsKPIthl8Bx1yh5MHidhEuEHN-nukk,4853
|
@@ -106,7 +106,7 @@ anyscale/background/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSu
|
|
106
106
|
anyscale/background/job_runner.py,sha256=LTuv9JOahyv6C9i7DLQAONgQF6--FfYZEmJrKy-sUG8,2687
|
107
107
|
anyscale/client/.gitignore,sha256=JZyvYEtT2DCSK9V5Joi6lQofhMik4PXiJRCWsg7SvqI,807
|
108
108
|
anyscale/client/.openapi-generator-ignore,sha256=pu2PTide7pJtJ-DFLzDy0cTYQJRlrB-8RRH3zGLeUds,1040
|
109
|
-
anyscale/client/README.md,sha256=
|
109
|
+
anyscale/client/README.md,sha256=xfqDhkI-BxZ51Uk7GdGHo3E_cY6yYa1OFEwFJtVkEjQ,125810
|
110
110
|
anyscale/client/git_push.sh,sha256=EDCZOTTiLxbtPHmiU63qC99rGH67B7dhdPZdNUKivF0,1827
|
111
111
|
anyscale/client/requirements.txt,sha256=dkVKYUStC5h_g_87SH7pRdhXCj7ySozAJMGAFEzGgFc,126
|
112
112
|
anyscale/client/setup.cfg,sha256=l7bdKSIedeBhhoDtupsBwx1xPrlBf2yYeTH7a8kMga4,28
|
@@ -114,14 +114,14 @@ anyscale/client/setup.py,sha256=tSxqw1kAL1B9adnrnOarjnQfSbwGmnTr_kg8ZXhlm5A,1109
|
|
114
114
|
anyscale/client/test-requirements.txt,sha256=sTjmDTj5W9fh1ZAeo8UT2EBdeGDBNttj_PHiPBXg1D4,111
|
115
115
|
anyscale/client/tox.ini,sha256=M6L3UmvAdvU65LsoAF-Oi7oRjwZlCJZn8I7ofdXn5Ok,156
|
116
116
|
anyscale/client/.openapi-generator/VERSION,sha256=J0RzX-4u4jfin1kviKtmncjUePyjHm2kyvmkobOrt_E,5
|
117
|
-
anyscale/client/openapi_client/__init__.py,sha256=
|
117
|
+
anyscale/client/openapi_client/__init__.py,sha256=ZJ_wYTQVawWm9ghn_bER3vixvPS1wagjfoRgbBnf7bo,56584
|
118
118
|
anyscale/client/openapi_client/api_client.py,sha256=d8Un6j2Ny2vlS2qBXPVFj6_ql0k36DFahpWt_28TfCk,25563
|
119
119
|
anyscale/client/openapi_client/configuration.py,sha256=Dd5XrlHwv-wxnf0C35PG_-HBQoY3Yaz6hKrmkZz-m0E,12363
|
120
120
|
anyscale/client/openapi_client/exceptions.py,sha256=3egwsXQG2j_vARbqgBxUO1xSltAhpfiHTYVP7VXTvU0,3792
|
121
121
|
anyscale/client/openapi_client/rest.py,sha256=Ehj37v7GHW6SXV067Hze5HE42ayKaGi6a6ZlkR7u3Lg,12501
|
122
122
|
anyscale/client/openapi_client/api/__init__.py,sha256=i8u7BI2xX1GrXTL3hN0pKpYIlnT-D_uDxH2ElOfYG1I,141
|
123
|
-
anyscale/client/openapi_client/api/default_api.py,sha256=
|
124
|
-
anyscale/client/openapi_client/models/__init__.py,sha256=
|
123
|
+
anyscale/client/openapi_client/api/default_api.py,sha256=pb3jaNTgTPVtONsxcSAS2GYyx0kjf7wCuyfw4-_BP9s,2055566
|
124
|
+
anyscale/client/openapi_client/models/__init__.py,sha256=aOd4ASAlQcUBfi6N4bGVLj5JGU8VBuKzhePVGEhVPik,56094
|
125
125
|
anyscale/client/openapi_client/models/access_config.py,sha256=b2mA0qtuTA5PFbp6C61Jc_T2zUMaojM1v32IhZo0MfY,3648
|
126
126
|
anyscale/client/openapi_client/models/actor_status.py,sha256=6xyX_aIqURj2raBdY9DmBxsdDACFrqqYvElGiM6YG2E,2813
|
127
127
|
anyscale/client/openapi_client/models/admin_create_user.py,sha256=9DPr8D0lKgoEZ3Z2kGsAd8L7ocFCiP6woOGLVs8SRb8,7251
|
@@ -548,7 +548,7 @@ anyscale/client/openapi_client/models/operator_event.py,sha256=t0zfTHPkx_ZofOWyp
|
|
548
548
|
anyscale/client/openapi_client/models/operator_event_response.py,sha256=AFIOi7Hz5mEhZhc_pjLh2xq35IiiWJd9113Mq1KFepk,4526
|
549
549
|
anyscale/client/openapi_client/models/operator_event_type.py,sha256=tagRrGDQnv5v5PG-ZzTfyWDrmcgWASQ3zrRZBxFX_wk,3005
|
550
550
|
anyscale/client/openapi_client/models/operator_id.py,sha256=D1gfzRMkSIl5svx9CuRdyd_WdsBwS135D6mjAUuReVg,3359
|
551
|
-
anyscale/client/openapi_client/models/operator_metrics.py,sha256=
|
551
|
+
anyscale/client/openapi_client/models/operator_metrics.py,sha256=RSywfDVKPJlSHMgNhrRbYsazTOXBBBac2CWralguDCY,9196
|
552
552
|
anyscale/client/openapi_client/models/operator_status.py,sha256=Av-_FizOfXNjcMjS1MlE37s_QPQdzKeAr_HWt2zF0S8,2939
|
553
553
|
anyscale/client/openapi_client/models/operator_status_details.py,sha256=BZABehq5rwacGZi8O0LBtWdsBxcimK5NPrQVDnsFGNs,5598
|
554
554
|
anyscale/client/openapi_client/models/organization.py,sha256=denL5QGkErdMLQkEkGWCIxLt-Wv1EWc5u7REMOTKqrw,17320
|
@@ -703,9 +703,10 @@ anyscale/client/openapi_client/models/task_job_group_aggregate.py,sha256=hsF9Ebe
|
|
703
703
|
anyscale/client/openapi_client/models/task_job_group_aggregate_response.py,sha256=kB3KdyeS8dFUIKv216_KG3ZFWFTVR7OdudDG8fAelKE,5293
|
704
704
|
anyscale/client/openapi_client/models/task_state.py,sha256=KpRA6VImK3r0qNeaiHh4an-HsKmbpeOJdGRFlmRrP1Y,2985
|
705
705
|
anyscale/client/openapi_client/models/task_summary.py,sha256=8GIpf9xxmPDV8LJgIsGmSQex2R6CDKx0oJ9_VrL7oPw,9102
|
706
|
-
anyscale/client/openapi_client/models/
|
706
|
+
anyscale/client/openapi_client/models/task_summary_config.py,sha256=aMWbb9gJJCefjvJODfLMw6cr6qDE5pza8EhgP3w-Izk,3543
|
707
|
+
anyscale/client/openapi_client/models/task_table_config.py,sha256=WRCj5BdcM3cleUOyvdfoaZ21vW3fZLRDciEizqZH61I,8453
|
707
708
|
anyscale/client/openapi_client/models/task_table_response.py,sha256=T8VDBMlOzD1c2hY_Q1JdOF8ZF1MqA5JUMbnRjCKZmcg,5074
|
708
|
-
anyscale/client/openapi_client/models/task_table_row.py,sha256=
|
709
|
+
anyscale/client/openapi_client/models/task_table_row.py,sha256=PLflvQBFSsyXGZwCkDLIy480NyFpuvy8AvpAxLkOq94,18833
|
709
710
|
anyscale/client/openapi_client/models/task_type.py,sha256=I6JbtPZIDcPHIDCFupqeZ9KkvE4fb-NewPPZ31dVG8A,2951
|
710
711
|
anyscale/client/openapi_client/models/tasksummary_response.py,sha256=sgOV63ZyYroVvcLbISXz0LU44tW8tLCefcqYB1WFsQ0,3539
|
711
712
|
anyscale/client/openapi_client/models/text_query.py,sha256=aMcKF6nRme1J1jYKhvqUIG8VzlcDN72znSFF9kKCc2Y,5107
|
@@ -807,11 +808,11 @@ anyscale/cloud/_private/cloud_sdk.py,sha256=5TBGyGSjMI4jLOnSle1WWC6za0psP9xgTGWU
|
|
807
808
|
anyscale/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
808
809
|
anyscale/commands/aggregated_instance_usage_commands.py,sha256=TRP1X3hdIWbKg9V20VtazlDXsYAeV--M0DH3-Z5tnj4,2293
|
809
810
|
anyscale/commands/auth_commands.py,sha256=X1g6Yu9kqgPb4HLODlZTYEk8G5AVLeyizPIgagWx-p0,1026
|
810
|
-
anyscale/commands/cloud_commands.py,sha256=
|
811
|
+
anyscale/commands/cloud_commands.py,sha256=YVKcaUS6ftHHlUCy-c_UNQKH9kiUGmLi61GvS30rR10,54573
|
811
812
|
anyscale/commands/cloud_commands_util.py,sha256=d-6TSZ_syrGkZ3Fc1uRX6jG4dqYMebNkBNpYLojOJFg,247
|
812
813
|
anyscale/commands/cluster_commands.py,sha256=taNcffyFfqJ1MgOQd0cz9kzRXWFTdp-wfLPM4l_2tBc,13487
|
813
814
|
anyscale/commands/cluster_env_commands.py,sha256=KNWylyE8Ew1sDi7yu2Tp4RLcRu2_KJJJIzVGRyPflJo,3899
|
814
|
-
anyscale/commands/command_examples.py,sha256=
|
815
|
+
anyscale/commands/command_examples.py,sha256=pSj1DyHwlzmSxw-Ko5RUTQ57uFA7v7Jgur0s7K55bts,25182
|
815
816
|
anyscale/commands/compute_config_commands.py,sha256=e_k4SOIa0MoFq51nzu4dNFk5SGlrJPCbPyq_sWBVnHg,7899
|
816
817
|
anyscale/commands/config_commands.py,sha256=p55uM6WrhfbFoRXC9hNAV-8c5ANghw7tBUYwaQDAtjE,7195
|
817
818
|
anyscale/commands/exec_commands.py,sha256=PjgHQpVXFQX2jhX_04fnPOu8knJWzvvZNv9khqG9gZs,957
|
@@ -830,7 +831,7 @@ anyscale/commands/organization_invitation_commands.py,sha256=L0OEz_mF5Dm02KjVzDu
|
|
830
831
|
anyscale/commands/project_commands.py,sha256=NFGYcPY8qaMHhO_325jeZp4Yj79JvWWN_bGW_s4_M6U,15387
|
831
832
|
anyscale/commands/resource_quota_commands.py,sha256=J6r8b6Bo1wMys5pYWieD6F-VsC2OpQZGVLaNFlvAKmI,8536
|
832
833
|
anyscale/commands/schedule_commands.py,sha256=Bw2aKp_w6xcuRSVVi9FLdUjRVCr8_v4Tt2kGL6Y4aRg,14924
|
833
|
-
anyscale/commands/service_account_commands.py,sha256=
|
834
|
+
anyscale/commands/service_account_commands.py,sha256=JlppTmcaDofJn7TYqd3PW4hDGykdEN56fr0PT3qgBIg,3271
|
834
835
|
anyscale/commands/service_commands.py,sha256=DBrPkW7JH3kCsr038aQStm7AF1u-n80sLjwc2Hjifks,34014
|
835
836
|
anyscale/commands/session_commands_hidden.py,sha256=APEypnUB1yV2Rr6wdSFWy1vQbAnn-lOn0rU2enF5JdM,6200
|
836
837
|
anyscale/commands/user_commands.py,sha256=C-i1dGpdhboywN_2XgPS2BekKx2y6LZq8c8gvS0S-tY,1259
|
@@ -852,7 +853,7 @@ anyscale/connect_utils/start_interactive_session.py,sha256=m-RCH0e_bQBF6dAOskbP9
|
|
852
853
|
anyscale/controllers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
853
854
|
anyscale/controllers/auth_controller.py,sha256=hDY2sPvUP8pvh8PnlDYH5rCHjQes2v3b_KBVjMbrzeE,5127
|
854
855
|
anyscale/controllers/base_controller.py,sha256=1QFJoScFUV7YTzpKarhwPOc1SvI-xqX3TZmwxKonW6I,1998
|
855
|
-
anyscale/controllers/cloud_controller.py,sha256=
|
856
|
+
anyscale/controllers/cloud_controller.py,sha256=9LKmEtEUVO4V3jDMG0VuyaGluFjbn8c-as52oj1l-_o,205316
|
856
857
|
anyscale/controllers/cloud_file_storage_utils.py,sha256=ifaqClEybTgxhqGWHYoH1vrlbxwjRuO-De_3666R2O4,6987
|
857
858
|
anyscale/controllers/cloud_functional_verification_controller.py,sha256=YsEfdHT9hPtxy_3a5Q62UlRXW0iFJ1lVS4IZ_NHoemE,33399
|
858
859
|
anyscale/controllers/cluster_controller.py,sha256=Sb5wVjrjpycg5iqmENAVtZ4iy9Kr6kM97_ck-KH85LM,28745
|
@@ -1083,7 +1084,7 @@ anyscale/service/_private/service_sdk.py,sha256=pODsuYJg6vofz4hlVj8nt5roxG9NWDUk
|
|
1083
1084
|
anyscale/service_account/__init__.py,sha256=jV1OFo_ZTxU3vuPztO1300TuoMz-Ocudm6_84ZtjPQ4,2764
|
1084
1085
|
anyscale/service_account/commands.py,sha256=pkJjZwK8aRKFFVfE5swMTJrm9CTnPcNJETEFdMkPiic,3680
|
1085
1086
|
anyscale/service_account/models.py,sha256=MhY-Fo5AZQ68brqtolTUMW3WQDrkNyL1udtNg70sNAU,2189
|
1086
|
-
anyscale/service_account/_private/service_account_sdk.py,sha256=
|
1087
|
+
anyscale/service_account/_private/service_account_sdk.py,sha256=PXi5SV9ZFGNURsmFnRANGRnEvZqCceCI9mt_bXM8Zyg,4018
|
1087
1088
|
anyscale/shared_anyscale_utils/__init__.py,sha256=2iCXV0v5drnxM8pyFCGm4cthya6zkw1R5RwqMtNO5a0,80
|
1088
1089
|
anyscale/shared_anyscale_utils/aws.py,sha256=MDWTFNOAD4fwxLWzv1taGhl1qP9u08qdsdbwSRvxbd4,5119
|
1089
1090
|
anyscale/shared_anyscale_utils/bytes_util.py,sha256=6cpIW0LMymqivnww4uxFeWdPuyBxtwLf8Oo8FusMBxg,226
|
@@ -1146,10 +1147,10 @@ anyscale/workspace/__init__.py,sha256=Innbm5ZhCyADEVBiYSo_vbpKwUNcMzVSAfxIGKOYe6
|
|
1146
1147
|
anyscale/workspace/commands.py,sha256=b1sqNseoPj-1VXznqQOLe0V_a663bOTvJX-TaOMJa1Y,14590
|
1147
1148
|
anyscale/workspace/models.py,sha256=uiMqoJRQNRgTcOIIsysSrtlHMtnI7paUWS34EN626Cg,10016
|
1148
1149
|
anyscale/workspace/_private/workspace_sdk.py,sha256=2CMeYfJt0UtIFCocDn1ukw1iI5esKHdopLe6duEs-qE,27599
|
1149
|
-
anyscale-0.26.
|
1150
|
-
anyscale-0.26.
|
1151
|
-
anyscale-0.26.
|
1152
|
-
anyscale-0.26.
|
1153
|
-
anyscale-0.26.
|
1154
|
-
anyscale-0.26.
|
1155
|
-
anyscale-0.26.
|
1150
|
+
anyscale-0.26.63.dist-info/licenses/LICENSE,sha256=UOPu974Wzsna6frFv1mu4VrZgNdZT7lbcNPzo5ue3qs,3494
|
1151
|
+
anyscale-0.26.63.dist-info/licenses/NOTICE,sha256=gHqDhSnUYlRXX-mDOL5FtE7774oiKyV_HO80qM3r9Xo,196
|
1152
|
+
anyscale-0.26.63.dist-info/METADATA,sha256=XfE0ilmn6pG-37QpZla7kJYWSXjtNE-L_fyVKwoed7Q,3231
|
1153
|
+
anyscale-0.26.63.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
1154
|
+
anyscale-0.26.63.dist-info/entry_points.txt,sha256=NqO18sCZn6zG6J0S38itjcN00s7aE3C3v3k5lMAfCLk,51
|
1155
|
+
anyscale-0.26.63.dist-info/top_level.txt,sha256=g3NVNS8Oh0NZwbFFgeX696C5MZZkS5dqV2NqcsbDRJE,9
|
1156
|
+
anyscale-0.26.63.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|