anyscale 0.26.62__py3-none-any.whl → 0.26.64__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (26) hide show
  1. anyscale/_private/anyscale_client/anyscale_client.py +4 -1
  2. anyscale/_private/docgen/__main__.py +0 -2
  3. anyscale/client/README.md +1 -0
  4. anyscale/client/openapi_client/__init__.py +1 -0
  5. anyscale/client/openapi_client/api/default_api.py +19 -6
  6. anyscale/client/openapi_client/models/__init__.py +1 -0
  7. anyscale/client/openapi_client/models/apply_production_service_v2_model.py +2 -2
  8. anyscale/client/openapi_client/models/operator_metrics.py +27 -1
  9. anyscale/client/openapi_client/models/task_summary_config.py +120 -0
  10. anyscale/client/openapi_client/models/task_table_config.py +29 -3
  11. anyscale/client/openapi_client/models/task_table_row.py +29 -3
  12. anyscale/commands/cloud_commands.py +146 -61
  13. anyscale/commands/command_examples.py +12 -0
  14. anyscale/commands/service_account_commands.py +0 -21
  15. anyscale/controllers/cloud_controller.py +94 -20
  16. anyscale/sdk/anyscale_client/models/apply_production_service_v2_model.py +2 -2
  17. anyscale/sdk/anyscale_client/models/apply_service_model.py +2 -2
  18. anyscale/service_account/_private/service_account_sdk.py +10 -1
  19. anyscale/version.py +1 -1
  20. {anyscale-0.26.62.dist-info → anyscale-0.26.64.dist-info}/METADATA +1 -1
  21. {anyscale-0.26.62.dist-info → anyscale-0.26.64.dist-info}/RECORD +26 -25
  22. {anyscale-0.26.62.dist-info → anyscale-0.26.64.dist-info}/WHEEL +0 -0
  23. {anyscale-0.26.62.dist-info → anyscale-0.26.64.dist-info}/entry_points.txt +0 -0
  24. {anyscale-0.26.62.dist-info → anyscale-0.26.64.dist-info}/licenses/LICENSE +0 -0
  25. {anyscale-0.26.62.dist-info → anyscale-0.26.64.dist-info}/licenses/NOTICE +0 -0
  26. {anyscale-0.26.62.dist-info → anyscale-0.26.64.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, name=name, collaborator_type=collaborator_type
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
@@ -193,7 +193,7 @@ class ApplyProductionServiceV2Model(object):
193
193
  def version(self):
194
194
  """Gets the version of this ApplyProductionServiceV2Model. # noqa: E501
195
195
 
196
- A version string that represents the version for this service. Will be populated with the hash of the config if not specified. # noqa: E501
196
+ A version string that represents the version for this service. Will be populated with a random version if not specified. # noqa: E501
197
197
 
198
198
  :return: The version of this ApplyProductionServiceV2Model. # noqa: E501
199
199
  :rtype: str
@@ -204,7 +204,7 @@ class ApplyProductionServiceV2Model(object):
204
204
  def version(self, version):
205
205
  """Sets the version of this ApplyProductionServiceV2Model.
206
206
 
207
- A version string that represents the version for this service. Will be populated with the hash of the config if not specified. # noqa: E501
207
+ A version string that represents the version for this service. Will be populated with a random version if not specified. # noqa: E501
208
208
 
209
209
  :param version: The version of this ApplyProductionServiceV2Model. # noqa: E501
210
210
  :type: str
@@ -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], name: Optional[str], cloud_id: 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, cloud_id=cloud_id,
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
- def cloud_config_update(
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
- if passed_enable_disable_flags:
516
- # Handle log ingestion configuration
517
- # TODO: enable_log_ingestion should be unified into cloud deployment config.
518
- if enable_log_ingestion is True:
519
- consent_message = click.prompt(
520
- "--enable-log-ingestion is specified. Please note the logs produced by "
521
- "your cluster will be ingested into Anyscale's service in region "
522
- "us-west-2. Your clusters may incur extra data transfer cost from the "
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=cloud_name or 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
- # Handle system cluster configuration
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=cloud_name or 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=cloud_name or name, cloud_id=cloud_id, spec_file=spec_file,
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, cloud_name: Optional[str] = None, cloud_id: Optional[str] = None,
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
- cloud_id, cloud_name = get_cloud_id_and_name(
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
- # In the future we will expose cloud_deployment id as a parameter, for now, it's just a placeholder.
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=cloud_id, cloud_deployment_id="default"
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
- cloud_id, cloud_name = get_cloud_id_and_name(
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=cloud_id, is_enabled=enable_log_ingestion, # type: ignore
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"{cloud_id} to {enable_log_ingestion}"
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=cloud_id,
1982
- cloud_deployment_id="default",
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(
@@ -193,7 +193,7 @@ class ApplyProductionServiceV2Model(object):
193
193
  def version(self):
194
194
  """Gets the version of this ApplyProductionServiceV2Model. # noqa: E501
195
195
 
196
- A version string that represents the version for this service. Will be populated with the hash of the config if not specified. # noqa: E501
196
+ A version string that represents the version for this service. Will be populated with a random version if not specified. # noqa: E501
197
197
 
198
198
  :return: The version of this ApplyProductionServiceV2Model. # noqa: E501
199
199
  :rtype: str
@@ -204,7 +204,7 @@ class ApplyProductionServiceV2Model(object):
204
204
  def version(self, version):
205
205
  """Sets the version of this ApplyProductionServiceV2Model.
206
206
 
207
- A version string that represents the version for this service. Will be populated with the hash of the config if not specified. # noqa: E501
207
+ A version string that represents the version for this service. Will be populated with a random version if not specified. # noqa: E501
208
208
 
209
209
  :param version: The version of this ApplyProductionServiceV2Model. # noqa: E501
210
210
  :type: str
@@ -193,7 +193,7 @@ class ApplyServiceModel(object):
193
193
  def version(self):
194
194
  """Gets the version of this ApplyServiceModel. # noqa: E501
195
195
 
196
- A version string that represents the version for this service. Will be populated with the hash of the config if not specified. # noqa: E501
196
+ A version string that represents the version for this service. Will be populated with a random version if not specified. # noqa: E501
197
197
 
198
198
  :return: The version of this ApplyServiceModel. # noqa: E501
199
199
  :rtype: str
@@ -204,7 +204,7 @@ class ApplyServiceModel(object):
204
204
  def version(self, version):
205
205
  """Sets the version of this ApplyServiceModel.
206
206
 
207
- A version string that represents the version for this service. Will be populated with the hash of the config if not specified. # noqa: E501
207
+ A version string that represents the version for this service. Will be populated with a random version if not specified. # noqa: E501
208
208
 
209
209
  :param version: The version of this ApplyServiceModel. # noqa: E501
210
210
  :type: str
@@ -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"Internal server error when fetching service account {identifier}. Please contact support."
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.62"
1
+ __version__ = "0.26.64"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: anyscale
3
- Version: 0.26.62
3
+ Version: 0.26.64
4
4
  Summary: Command Line Interface for Anyscale
5
5
  Author: Anyscale Inc.
6
6
  License: AS License
@@ -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=Twj-CKtwZV7IucbLSd0DRNuGmiADdqMaeYdnO9lBkL8,24
31
+ anyscale/version.py,sha256=LDmJUsd7HVbBrtp83kuXHAWyPugcqbc1S1cjE8vPCkk,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=iMc2DI45r5roA2_RCUU50iy0RZqI1F8YpV_vR1Dlh9A,80462
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=aKBQJ7g_IXiWRURA1SYkh5uYnixGNXtV0XXKQ5mU23E,25220
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=sXtRlpc1Z4aKDnBlMFBsYm9vLJxrMTU5i_M7tiSHLHg,125760
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=ITlpMtAZvdyYxNbqsNZjAMOasTi1cfMINT7j26M_vSY,56512
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=EqO5MS3EPXCMwmlzXPKMJLYmjJ5kIor5c1WtKklx-6Y,2054516
124
- anyscale/client/openapi_client/models/__init__.py,sha256=sUgvhvlkzxEwRb1GbW-zAq_sGW_kvxjQIHvh1hK7oHg,56022
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
@@ -148,7 +148,7 @@ anyscale/client/openapi_client/models/appconfig_list_response.py,sha256=rQBfyypj
148
148
  anyscale/client/openapi_client/models/appconfig_response.py,sha256=HLFj1evH-rcO1MoJfGh7BN2CL70RbhfuW7LJlGF6XAw,3517
149
149
  anyscale/client/openapi_client/models/application_type.py,sha256=JbtN0lMj9FwGMAGQKC1s4LMm3iusRAqsSx2G4ODgf8U,2808
150
150
  anyscale/client/openapi_client/models/applied_snapshot.py,sha256=E8NoLPyvm7W-gFjDiq3N5zvtyXHLTnHmSx_xQrK7gdM,5173
151
- anyscale/client/openapi_client/models/apply_production_service_v2_model.py,sha256=dp-el8mVBhMVYRkF8ZPOg4WETmbqUbkRrSGcbL25GxQ,21065
151
+ anyscale/client/openapi_client/models/apply_production_service_v2_model.py,sha256=hDRM4Z7LwBh7h9xo1NmlhjDyiL0_wXAT78UG-yQuaIA,21053
152
152
  anyscale/client/openapi_client/models/archive_status.py,sha256=wdqbSNwU-tjYNBcA4BSr0uHVCOL4iNimbV1llKObDJ0,2875
153
153
  anyscale/client/openapi_client/models/attach_machine_pool_to_cloud_request.py,sha256=M3iOlHPrWthJmqkBCoMAMk1Ks3oCWk0lvL0XZBClVJw,5011
154
154
  anyscale/client/openapi_client/models/attachmachinepooltocloudresponse_response.py,sha256=eCMGXJNPVGsaXAIzMbJKwyzTmzQh_WTQo3Hfw5_OArU,3692
@@ -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=Pl6H2qzNbNhSPOtg081yDuhdAltaPvojTIn-kzNH64c,8607
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/task_table_config.py,sha256=WMYjd4LFIb89Jv3k4KbseatYLYuI7M7uR9o6oaS1Bg4,7624
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=OgXHa1gc69xf6UJCjVK1DAqsEV0wwjRbTpZhKw3JUkQ,18016
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=dleBz1sFaGOoBg4JbMeVGJvWd7T6ykg16OEl8U6uO_s,52257
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=cVkl6zAhCAs9iwPmh7J1OQM6dim0Lvnnzcu3uNptiLY,24572
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=u45N2akHsZxyu5LK03FGEEnZh4dTt4B2Be-dXgbSg3U,3977
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=hVvI1uEGJwmfsomnoVfyjciilIl285E3LR13TUtrFf8,202411
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
@@ -916,8 +917,8 @@ anyscale/sdk/anyscale_client/models/__init__.py,sha256=Xes_6hp6Sl68Bxawg5yKHMzzc
916
917
  anyscale/sdk/anyscale_client/models/access_config.py,sha256=FOH_2UU2astWm_ilA1_FpWqKQRxwMYXjGC-UT4Zj65Y,3646
917
918
  anyscale/sdk/anyscale_client/models/app_config.py,sha256=1sWYt1jiljHiXtWCQi7HJw4sBvulaqPV8tmTvNpgZYI,13439
918
919
  anyscale/sdk/anyscale_client/models/app_config_config_schema.py,sha256=0RD9ffMfQ_XFXyVY7qjisOropKYT2tZ2p3XyxPrqjE0,7897
919
- anyscale/sdk/anyscale_client/models/apply_production_service_v2_model.py,sha256=L_wMc3vo6qX9IX98gFSoxzSTNQaCfq-SaWAnUxatmeE,21063
920
- anyscale/sdk/anyscale_client/models/apply_service_model.py,sha256=vTjg_zCiM2GmD7dM48gjnSS5aOj2NkO78QQ39oSt5-U,20295
920
+ anyscale/sdk/anyscale_client/models/apply_production_service_v2_model.py,sha256=Fql0K5fHEojt_Z1T7mlbGgdqFW45L0KW49KgpnP_8LY,21051
921
+ anyscale/sdk/anyscale_client/models/apply_service_model.py,sha256=FDB7ANoSG37SVt1q7Q8Xs5qCi8uTgGIimHiJXCJssdA,20283
921
922
  anyscale/sdk/anyscale_client/models/archive_status.py,sha256=C5z72r5glAaa5cOXzwhECfBN3QiVP769B_2_Q9G4znk,2873
922
923
  anyscale/sdk/anyscale_client/models/base_job_status.py,sha256=wW3Cq4H1Bchg1OVf-f0eQyEugMDvM8BgDu6zrAQuYic,3008
923
924
  anyscale/sdk/anyscale_client/models/baseimagesenum.py,sha256=7MluBXqSt0gNZ0tu6fnapZuewvEJ1VcE_L6_o-HzpYw,312225
@@ -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=MGF64copqVjDJgY05rOlKJOQ0KsIE6mjzWuM6XcyvUs,3590
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.62.dist-info/licenses/LICENSE,sha256=UOPu974Wzsna6frFv1mu4VrZgNdZT7lbcNPzo5ue3qs,3494
1150
- anyscale-0.26.62.dist-info/licenses/NOTICE,sha256=gHqDhSnUYlRXX-mDOL5FtE7774oiKyV_HO80qM3r9Xo,196
1151
- anyscale-0.26.62.dist-info/METADATA,sha256=5WxrAab6D0Th8W2DG3d4JybPt1KKqXQHKXkhZGiYQYE,3231
1152
- anyscale-0.26.62.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
1153
- anyscale-0.26.62.dist-info/entry_points.txt,sha256=NqO18sCZn6zG6J0S38itjcN00s7aE3C3v3k5lMAfCLk,51
1154
- anyscale-0.26.62.dist-info/top_level.txt,sha256=g3NVNS8Oh0NZwbFFgeX696C5MZZkS5dqV2NqcsbDRJE,9
1155
- anyscale-0.26.62.dist-info/RECORD,,
1150
+ anyscale-0.26.64.dist-info/licenses/LICENSE,sha256=UOPu974Wzsna6frFv1mu4VrZgNdZT7lbcNPzo5ue3qs,3494
1151
+ anyscale-0.26.64.dist-info/licenses/NOTICE,sha256=gHqDhSnUYlRXX-mDOL5FtE7774oiKyV_HO80qM3r9Xo,196
1152
+ anyscale-0.26.64.dist-info/METADATA,sha256=FcAz1ZXbIbonefx7jcibNyupO-mut9E-ygDzFTv8v1E,3231
1153
+ anyscale-0.26.64.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
1154
+ anyscale-0.26.64.dist-info/entry_points.txt,sha256=NqO18sCZn6zG6J0S38itjcN00s7aE3C3v3k5lMAfCLk,51
1155
+ anyscale-0.26.64.dist-info/top_level.txt,sha256=g3NVNS8Oh0NZwbFFgeX696C5MZZkS5dqV2NqcsbDRJE,9
1156
+ anyscale-0.26.64.dist-info/RECORD,,