anyscale 0.26.53__py3-none-any.whl → 0.26.55__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/client/README.md CHANGED
@@ -234,6 +234,7 @@ Class | Method | HTTP request | Description
234
234
  *DefaultApi* | [**get_resource_notification_api_v2_resource_notifications_resource_notification_id_get**](docs/DefaultApi.md#get_resource_notification_api_v2_resource_notifications_resource_notification_id_get) | **GET** /api/v2/resource_notifications/{resource_notification_id} | Get Resource Notification
235
235
  *DefaultApi* | [**get_resource_quota_api_v2_resource_quotas_resource_quota_id_get**](docs/DefaultApi.md#get_resource_quota_api_v2_resource_quotas_resource_quota_id_get) | **GET** /api/v2/resource_quotas/{resource_quota_id} | Get Resource Quota
236
236
  *DefaultApi* | [**get_root_cause_for_job_api_v2_iknow_get**](docs/DefaultApi.md#get_root_cause_for_job_api_v2_iknow_get) | **GET** /api/v2/iknow/ | Get Root Cause For Job
237
+ *DefaultApi* | [**get_sensitive_message_presigned_url_api_v2_decorated_ha_jobs_production_job_id_events_ha_job_event_id_sensitive_message_presigned_url_get**](docs/DefaultApi.md#get_sensitive_message_presigned_url_api_v2_decorated_ha_jobs_production_job_id_events_ha_job_event_id_sensitive_message_presigned_url_get) | **GET** /api/v2/decorated_ha_jobs/{production_job_id}/events/{ha_job_event_id}/sensitive_message_presigned_url | Get Sensitive Message Presigned Url
237
238
  *DefaultApi* | [**get_serve_logs_download_api_v2_logs_serve_logs_download_cluster_id_get**](docs/DefaultApi.md#get_serve_logs_download_api_v2_logs_serve_logs_download_cluster_id_get) | **GET** /api/v2/logs/serve_logs_download/{cluster_id} | Get Serve Logs Download
238
239
  *DefaultApi* | [**get_service_api_v2_services_v2_service_id_get**](docs/DefaultApi.md#get_service_api_v2_services_v2_service_id_get) | **GET** /api/v2/services-v2/{service_id} | Get Service
239
240
  *DefaultApi* | [**get_service_event_verbose_message_api_v2_services_v2_events_event_id_verbose_message_get**](docs/DefaultApi.md#get_service_event_verbose_message_api_v2_services_v2_events_event_id_verbose_message_get) | **GET** /api/v2/services-v2/events/{event_id}/verbose_message | Get Service Event Verbose Message
@@ -818,6 +819,7 @@ Class | Method | HTTP request | Description
818
819
  - [PauseSchedule](docs/PauseSchedule.md)
819
820
  - [PermissionLevel](docs/PermissionLevel.md)
820
821
  - [PlanStatus](docs/PlanStatus.md)
822
+ - [PresignedUrlResponse](docs/PresignedUrlResponse.md)
821
823
  - [ProductionJob](docs/ProductionJob.md)
822
824
  - [ProductionJobConfig](docs/ProductionJobConfig.md)
823
825
  - [ProductionJobEvent](docs/ProductionJobEvent.md)
@@ -458,6 +458,7 @@ from openapi_client.models.partition_info import PartitionInfo
458
458
  from openapi_client.models.pause_schedule import PauseSchedule
459
459
  from openapi_client.models.permission_level import PermissionLevel
460
460
  from openapi_client.models.plan_status import PlanStatus
461
+ from openapi_client.models.presigned_url_response import PresignedUrlResponse
461
462
  from openapi_client.models.production_job import ProductionJob
462
463
  from openapi_client.models.production_job_config import ProductionJobConfig
463
464
  from openapi_client.models.production_job_event import ProductionJobEvent
@@ -18764,6 +18764,129 @@ class DefaultApi(object):
18764
18764
  _request_timeout=local_var_params.get('_request_timeout'),
18765
18765
  collection_formats=collection_formats)
18766
18766
 
18767
+ def get_sensitive_message_presigned_url_api_v2_decorated_ha_jobs_production_job_id_events_ha_job_event_id_sensitive_message_presigned_url_get(self, production_job_id, ha_job_event_id, **kwargs): # noqa: E501
18768
+ """Get Sensitive Message Presigned Url # noqa: E501
18769
+
18770
+ Get the presigned url for the sensitive message details # noqa: E501
18771
+ This method makes a synchronous HTTP request by default. To make an
18772
+ asynchronous HTTP request, please pass async_req=True
18773
+ >>> thread = api.get_sensitive_message_presigned_url_api_v2_decorated_ha_jobs_production_job_id_events_ha_job_event_id_sensitive_message_presigned_url_get(production_job_id, ha_job_event_id, async_req=True)
18774
+ >>> result = thread.get()
18775
+
18776
+ :param async_req bool: execute request asynchronously
18777
+ :param str production_job_id: (required)
18778
+ :param str ha_job_event_id: (required)
18779
+ :param _preload_content: if False, the urllib3.HTTPResponse object will
18780
+ be returned without reading/decoding response
18781
+ data. Default is True.
18782
+ :param _request_timeout: timeout setting for this request. If one
18783
+ number provided, it will be total request
18784
+ timeout. It can also be a pair (tuple) of
18785
+ (connection, read) timeouts.
18786
+ :return: PresignedUrlResponse
18787
+ If the method is called asynchronously,
18788
+ returns the request thread.
18789
+ """
18790
+ kwargs['_return_http_data_only'] = True
18791
+ return self.get_sensitive_message_presigned_url_api_v2_decorated_ha_jobs_production_job_id_events_ha_job_event_id_sensitive_message_presigned_url_get_with_http_info(production_job_id, ha_job_event_id, **kwargs) # noqa: E501
18792
+
18793
+ def get_sensitive_message_presigned_url_api_v2_decorated_ha_jobs_production_job_id_events_ha_job_event_id_sensitive_message_presigned_url_get_with_http_info(self, production_job_id, ha_job_event_id, **kwargs): # noqa: E501
18794
+ """Get Sensitive Message Presigned Url # noqa: E501
18795
+
18796
+ Get the presigned url for the sensitive message details # noqa: E501
18797
+ This method makes a synchronous HTTP request by default. To make an
18798
+ asynchronous HTTP request, please pass async_req=True
18799
+ >>> thread = api.get_sensitive_message_presigned_url_api_v2_decorated_ha_jobs_production_job_id_events_ha_job_event_id_sensitive_message_presigned_url_get_with_http_info(production_job_id, ha_job_event_id, async_req=True)
18800
+ >>> result = thread.get()
18801
+
18802
+ :param async_req bool: execute request asynchronously
18803
+ :param str production_job_id: (required)
18804
+ :param str ha_job_event_id: (required)
18805
+ :param _return_http_data_only: response data without head status code
18806
+ and headers
18807
+ :param _preload_content: if False, the urllib3.HTTPResponse object will
18808
+ be returned without reading/decoding response
18809
+ data. Default is True.
18810
+ :param _request_timeout: timeout setting for this request. If one
18811
+ number provided, it will be total request
18812
+ timeout. It can also be a pair (tuple) of
18813
+ (connection, read) timeouts.
18814
+ :return: tuple(PresignedUrlResponse, status_code(int), headers(HTTPHeaderDict))
18815
+ If the method is called asynchronously,
18816
+ returns the request thread.
18817
+ """
18818
+
18819
+ local_var_params = locals()
18820
+
18821
+ all_params = [
18822
+ 'production_job_id',
18823
+ 'ha_job_event_id'
18824
+ ]
18825
+ all_params.extend(
18826
+ [
18827
+ 'async_req',
18828
+ '_return_http_data_only',
18829
+ '_preload_content',
18830
+ '_request_timeout'
18831
+ ]
18832
+ )
18833
+
18834
+ for key, val in six.iteritems(local_var_params['kwargs']):
18835
+ if key not in all_params:
18836
+ raise ApiTypeError(
18837
+ "Got an unexpected keyword argument '%s'"
18838
+ " to method get_sensitive_message_presigned_url_api_v2_decorated_ha_jobs_production_job_id_events_ha_job_event_id_sensitive_message_presigned_url_get" % key
18839
+ )
18840
+ local_var_params[key] = val
18841
+ del local_var_params['kwargs']
18842
+ # verify the required parameter 'production_job_id' is set
18843
+ if self.api_client.client_side_validation and ('production_job_id' not in local_var_params or # noqa: E501
18844
+ local_var_params['production_job_id'] is None): # noqa: E501
18845
+ raise ApiValueError("Missing the required parameter `production_job_id` when calling `get_sensitive_message_presigned_url_api_v2_decorated_ha_jobs_production_job_id_events_ha_job_event_id_sensitive_message_presigned_url_get`") # noqa: E501
18846
+ # verify the required parameter 'ha_job_event_id' is set
18847
+ if self.api_client.client_side_validation and ('ha_job_event_id' not in local_var_params or # noqa: E501
18848
+ local_var_params['ha_job_event_id'] is None): # noqa: E501
18849
+ raise ApiValueError("Missing the required parameter `ha_job_event_id` when calling `get_sensitive_message_presigned_url_api_v2_decorated_ha_jobs_production_job_id_events_ha_job_event_id_sensitive_message_presigned_url_get`") # noqa: E501
18850
+
18851
+ collection_formats = {}
18852
+
18853
+ path_params = {}
18854
+ if 'production_job_id' in local_var_params:
18855
+ path_params['production_job_id'] = local_var_params['production_job_id'] # noqa: E501
18856
+ if 'ha_job_event_id' in local_var_params:
18857
+ path_params['ha_job_event_id'] = local_var_params['ha_job_event_id'] # noqa: E501
18858
+
18859
+ query_params = []
18860
+
18861
+ header_params = {}
18862
+
18863
+ form_params = []
18864
+ local_var_files = {}
18865
+
18866
+ body_params = None
18867
+ # HTTP header `Accept`
18868
+ header_params['Accept'] = self.api_client.select_header_accept(
18869
+ ['application/json']) # noqa: E501
18870
+
18871
+ # Authentication setting
18872
+ auth_settings = [] # noqa: E501
18873
+
18874
+ return self.api_client.call_api(
18875
+ '/api/v2/decorated_ha_jobs/{production_job_id}/events/{ha_job_event_id}/sensitive_message_presigned_url', 'GET',
18876
+ path_params,
18877
+ query_params,
18878
+ header_params,
18879
+ body=body_params,
18880
+ post_params=form_params,
18881
+ files=local_var_files,
18882
+ response_type='PresignedUrlResponse', # noqa: E501
18883
+ auth_settings=auth_settings,
18884
+ async_req=local_var_params.get('async_req'),
18885
+ _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501
18886
+ _preload_content=local_var_params.get('_preload_content', True),
18887
+ _request_timeout=local_var_params.get('_request_timeout'),
18888
+ collection_formats=collection_formats)
18889
+
18767
18890
  def get_serve_logs_download_api_v2_logs_serve_logs_download_cluster_id_get(self, cluster_id, **kwargs): # noqa: E501
18768
18891
  """Get Serve Logs Download # noqa: E501
18769
18892
 
@@ -444,6 +444,7 @@ from openapi_client.models.partition_info import PartitionInfo
444
444
  from openapi_client.models.pause_schedule import PauseSchedule
445
445
  from openapi_client.models.permission_level import PermissionLevel
446
446
  from openapi_client.models.plan_status import PlanStatus
447
+ from openapi_client.models.presigned_url_response import PresignedUrlResponse
447
448
  from openapi_client.models.production_job import ProductionJob
448
449
  from openapi_client.models.production_job_config import ProductionJobConfig
449
450
  from openapi_client.models.production_job_event import ProductionJobEvent
@@ -33,8 +33,9 @@ class CloudDataBucketFileType(object):
33
33
  AUDIT_LOGS = "audit_logs"
34
34
  SYSTEM_STORAGE_WORKSPACE_TRACKING_DEPENDENCIES = "system_storage/workspace_tracking_dependencies"
35
35
  SYSTEM_STORAGE_WORKSPACES = "system_storage/workspaces"
36
+ JOB_MESSAGES = "job_messages"
36
37
 
37
- allowable_values = [RUNTIME_ENV_PACKAGES, DATASETS, AUDIT_LOGS, SYSTEM_STORAGE_WORKSPACE_TRACKING_DEPENDENCIES, SYSTEM_STORAGE_WORKSPACES] # noqa: E501
38
+ allowable_values = [RUNTIME_ENV_PACKAGES, DATASETS, AUDIT_LOGS, SYSTEM_STORAGE_WORKSPACE_TRACKING_DEPENDENCIES, SYSTEM_STORAGE_WORKSPACES, JOB_MESSAGES] # noqa: E501
38
39
 
39
40
  """
40
41
  Attributes:
@@ -0,0 +1,123 @@
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 PresignedUrlResponse(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
+ 'url': 'str'
37
+ }
38
+
39
+ attribute_map = {
40
+ 'url': 'url'
41
+ }
42
+
43
+ def __init__(self, url=None, local_vars_configuration=None): # noqa: E501
44
+ """PresignedUrlResponse - 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._url = None
50
+ self.discriminator = None
51
+
52
+ self.url = url
53
+
54
+ @property
55
+ def url(self):
56
+ """Gets the url of this PresignedUrlResponse. # noqa: E501
57
+
58
+ The presigned url # noqa: E501
59
+
60
+ :return: The url of this PresignedUrlResponse. # noqa: E501
61
+ :rtype: str
62
+ """
63
+ return self._url
64
+
65
+ @url.setter
66
+ def url(self, url):
67
+ """Sets the url of this PresignedUrlResponse.
68
+
69
+ The presigned url # noqa: E501
70
+
71
+ :param url: The url of this PresignedUrlResponse. # noqa: E501
72
+ :type: str
73
+ """
74
+ if self.local_vars_configuration.client_side_validation and url is None: # noqa: E501
75
+ raise ValueError("Invalid value for `url`, must not be `None`") # noqa: E501
76
+
77
+ self._url = url
78
+
79
+ def to_dict(self):
80
+ """Returns the model properties as a dict"""
81
+ result = {}
82
+
83
+ for attr, _ in six.iteritems(self.openapi_types):
84
+ value = getattr(self, attr)
85
+ if isinstance(value, list):
86
+ result[attr] = list(map(
87
+ lambda x: x.to_dict() if hasattr(x, "to_dict") else x,
88
+ value
89
+ ))
90
+ elif hasattr(value, "to_dict"):
91
+ result[attr] = value.to_dict()
92
+ elif isinstance(value, dict):
93
+ result[attr] = dict(map(
94
+ lambda item: (item[0], item[1].to_dict())
95
+ if hasattr(item[1], "to_dict") else item,
96
+ value.items()
97
+ ))
98
+ else:
99
+ result[attr] = value
100
+
101
+ return result
102
+
103
+ def to_str(self):
104
+ """Returns the string representation of the model"""
105
+ return pprint.pformat(self.to_dict())
106
+
107
+ def __repr__(self):
108
+ """For `print` and `pprint`"""
109
+ return self.to_str()
110
+
111
+ def __eq__(self, other):
112
+ """Returns true if both objects are equal"""
113
+ if not isinstance(other, PresignedUrlResponse):
114
+ return False
115
+
116
+ return self.to_dict() == other.to_dict()
117
+
118
+ def __ne__(self, other):
119
+ """Returns true if both objects are not equal"""
120
+ if not isinstance(other, PresignedUrlResponse):
121
+ return True
122
+
123
+ return self.to_dict() != other.to_dict()
@@ -42,7 +42,8 @@ class ProductionJobEvent(object):
42
42
  'origin': 'HaJobEventOrigin',
43
43
  'ha_job_id': 'str',
44
44
  'cluster_id': 'str',
45
- 'metadata': 'object'
45
+ 'metadata': 'object',
46
+ 'has_additional_sensitive_message': 'bool'
46
47
  }
47
48
 
48
49
  attribute_map = {
@@ -55,10 +56,11 @@ class ProductionJobEvent(object):
55
56
  'origin': 'origin',
56
57
  'ha_job_id': 'ha_job_id',
57
58
  'cluster_id': 'cluster_id',
58
- 'metadata': 'metadata'
59
+ 'metadata': 'metadata',
60
+ 'has_additional_sensitive_message': 'has_additional_sensitive_message'
59
61
  }
60
62
 
61
- def __init__(self, id=None, created_at=None, event_type=None, error_type=None, level=None, message=None, origin=None, ha_job_id=None, cluster_id=None, metadata=None, local_vars_configuration=None): # noqa: E501
63
+ def __init__(self, id=None, created_at=None, event_type=None, error_type=None, level=None, message=None, origin=None, ha_job_id=None, cluster_id=None, metadata=None, has_additional_sensitive_message=False, local_vars_configuration=None): # noqa: E501
62
64
  """ProductionJobEvent - a model defined in OpenAPI""" # noqa: E501
63
65
  if local_vars_configuration is None:
64
66
  local_vars_configuration = Configuration()
@@ -74,6 +76,7 @@ class ProductionJobEvent(object):
74
76
  self._ha_job_id = None
75
77
  self._cluster_id = None
76
78
  self._metadata = None
79
+ self._has_additional_sensitive_message = None
77
80
  self.discriminator = None
78
81
 
79
82
  self.id = id
@@ -92,6 +95,8 @@ class ProductionJobEvent(object):
92
95
  self.cluster_id = cluster_id
93
96
  if metadata is not None:
94
97
  self.metadata = metadata
98
+ if has_additional_sensitive_message is not None:
99
+ self.has_additional_sensitive_message = has_additional_sensitive_message
95
100
 
96
101
  @property
97
102
  def id(self):
@@ -331,6 +336,29 @@ class ProductionJobEvent(object):
331
336
 
332
337
  self._metadata = metadata
333
338
 
339
+ @property
340
+ def has_additional_sensitive_message(self):
341
+ """Gets the has_additional_sensitive_message of this ProductionJobEvent. # noqa: E501
342
+
343
+ Whether we have additional sensitive message details stored that can be subsequently fetched. # noqa: E501
344
+
345
+ :return: The has_additional_sensitive_message of this ProductionJobEvent. # noqa: E501
346
+ :rtype: bool
347
+ """
348
+ return self._has_additional_sensitive_message
349
+
350
+ @has_additional_sensitive_message.setter
351
+ def has_additional_sensitive_message(self, has_additional_sensitive_message):
352
+ """Sets the has_additional_sensitive_message of this ProductionJobEvent.
353
+
354
+ Whether we have additional sensitive message details stored that can be subsequently fetched. # noqa: E501
355
+
356
+ :param has_additional_sensitive_message: The has_additional_sensitive_message of this ProductionJobEvent. # noqa: E501
357
+ :type: bool
358
+ """
359
+
360
+ self._has_additional_sensitive_message = has_additional_sensitive_message
361
+
334
362
  def to_dict(self):
335
363
  """Returns the model properties as a dict"""
336
364
  result = {}
@@ -43,6 +43,7 @@ class TaskTableRow(object):
43
43
  'start_time_ns': 'int',
44
44
  'end_time_ns': 'int',
45
45
  'required_resources': 'str',
46
+ 'runtime_env': 'str',
46
47
  'node_id': 'str',
47
48
  'worker_id': 'str',
48
49
  'worker_pid': 'str',
@@ -62,6 +63,7 @@ class TaskTableRow(object):
62
63
  'start_time_ns': 'start_time_ns',
63
64
  'end_time_ns': 'end_time_ns',
64
65
  'required_resources': 'required_resources',
66
+ 'runtime_env': 'runtime_env',
65
67
  'node_id': 'node_id',
66
68
  'worker_id': 'worker_id',
67
69
  'worker_pid': 'worker_pid',
@@ -70,7 +72,7 @@ class TaskTableRow(object):
70
72
  'exception_type': 'exception_type'
71
73
  }
72
74
 
73
- def __init__(self, id=None, attempt_number=None, job_id=None, function_name=None, task_type=None, current_state=None, error_message=None, start_time_ns=None, end_time_ns=None, required_resources=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
75
+ def __init__(self, id=None, attempt_number=None, job_id=None, function_name=None, task_type=None, current_state=None, error_message=None, start_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
74
76
  """TaskTableRow - a model defined in OpenAPI""" # noqa: E501
75
77
  if local_vars_configuration is None:
76
78
  local_vars_configuration = Configuration()
@@ -86,6 +88,7 @@ class TaskTableRow(object):
86
88
  self._start_time_ns = None
87
89
  self._end_time_ns = None
88
90
  self._required_resources = None
91
+ self._runtime_env = None
89
92
  self._node_id = None
90
93
  self._worker_id = None
91
94
  self._worker_pid = None
@@ -108,6 +111,8 @@ class TaskTableRow(object):
108
111
  self.end_time_ns = end_time_ns
109
112
  if required_resources is not None:
110
113
  self.required_resources = required_resources
114
+ if runtime_env is not None:
115
+ self.runtime_env = runtime_env
111
116
  if node_id is not None:
112
117
  self.node_id = node_id
113
118
  if worker_id is not None:
@@ -342,6 +347,27 @@ class TaskTableRow(object):
342
347
 
343
348
  self._required_resources = required_resources
344
349
 
350
+ @property
351
+ def runtime_env(self):
352
+ """Gets the runtime_env of this TaskTableRow. # noqa: E501
353
+
354
+
355
+ :return: The runtime_env of this TaskTableRow. # noqa: E501
356
+ :rtype: str
357
+ """
358
+ return self._runtime_env
359
+
360
+ @runtime_env.setter
361
+ def runtime_env(self, runtime_env):
362
+ """Sets the runtime_env of this TaskTableRow.
363
+
364
+
365
+ :param runtime_env: The runtime_env of this TaskTableRow. # noqa: E501
366
+ :type: str
367
+ """
368
+
369
+ self._runtime_env = runtime_env
370
+
345
371
  @property
346
372
  def node_id(self):
347
373
  """Gets the node_id of this TaskTableRow. # noqa: E501
anyscale/cloud/models.py CHANGED
@@ -109,12 +109,14 @@ class CloudProvider(ModelEnum):
109
109
  AWS = "AWS"
110
110
  GCP = "GCP"
111
111
  AZURE = "AZURE"
112
+ GENERIC = "GENERIC"
112
113
 
113
114
  __docstrings__ = {
114
115
  UNKNOWN: "Unknown cloud provider.",
115
116
  AWS: "Amazon Web Services.",
116
117
  GCP: "Google Cloud Platform.",
117
118
  AZURE: "Microsoft Azure.",
119
+ GENERIC: "Generic cloud provider.",
118
120
  } # type: ignore
119
121
 
120
122
 
@@ -141,7 +143,7 @@ cloud = Cloud(
141
143
  id: str = field(metadata={"docstring": "Unique identifier for this Cloud."})
142
144
  provider: Union[CloudProvider, str] = field(
143
145
  metadata={
144
- "docstring": "Cloud provider (AWS, GCP, AZURE) or UNKNOWN if not recognized."
146
+ "docstring": "Cloud provider (AWS, GCP, AZURE, GENERIC) or UNKNOWN if not recognized."
145
147
  },
146
148
  )
147
149
  compute_stack: Union[ComputeStack, str] = field(
@@ -499,15 +501,15 @@ bucket_name: s3://my-bucket
499
501
  file_storage:
500
502
  file_storage_id: fs-12345678901234567
501
503
  aws_config:
502
- vpc_id: vpc-12345678901234567
503
- subnet_ids:
504
- - subnet-11111111111111111
505
- - subnet-22222222222222222
506
- security_group_ids:
507
- - sg-12345678901234567
508
- anyscale_iam_role_id: arn:aws:iam::123456789012:role/anyscale-iam-role
509
- cluster_iam_role_id: arn:aws:iam::123456789012:role/cluster-node-role
510
- memorydb_cluster_name: my-memorydb-cluster
504
+ vpc_id: vpc-12345678901234567
505
+ subnet_ids:
506
+ - subnet-11111111111111111
507
+ - subnet-22222222222222222
508
+ security_group_ids:
509
+ - sg-12345678901234567
510
+ anyscale_iam_role_id: arn:aws:iam::123456789012:role/anyscale-iam-role
511
+ cluster_iam_role_id: arn:aws:iam::123456789012:role/cluster-node-role
512
+ memorydb_cluster_name: my-memorydb-cluster
511
513
  """
512
514
 
513
515
  cloud_resource_id: Optional[str] = field(
@@ -519,7 +521,9 @@ memorydb_cluster_name: my-memorydb-cluster
519
521
  )
520
522
  provider: Union[CloudProvider, str] = field(
521
523
  default=CloudProvider.UNKNOWN,
522
- metadata={"docstring": "The cloud provider type (e.g., AWS, GCP, or AZURE)."},
524
+ metadata={
525
+ "docstring": "The cloud provider type (e.g., AWS, GCP, AZURE, or GENERIC)."
526
+ },
523
527
  )
524
528
  compute_stack: Union[ComputeStack, str] = field(
525
529
  default=ComputeStack.VM,
@@ -1471,18 +1471,26 @@ class CloudController(BaseController):
1471
1471
  d.pop("cloud_deployment_id", None)
1472
1472
  return formatted_cloud_resources
1473
1473
 
1474
- def get_cloud_resources(self, cloud_id: str) -> List[CloudDeployment]:
1475
- decorated_cloud_resources = self.get_decorated_cloud_resources(cloud_id)
1476
-
1474
+ def _convert_decorated_cloud_resource_to_cloud_deployment(
1475
+ self, decorated_cloud_resource: DecoratedCloudResource
1476
+ ) -> CloudDeployment:
1477
1477
  # DecoratedCloudResource has extra fields that are not in CloudDeployment.
1478
1478
  allowed_keys = set(CloudDeployment.attribute_map.keys())
1479
1479
  allowed_keys.remove(
1480
1480
  "cloud_deployment_id"
1481
1481
  ) # Remove deprecated cloud_deployment_id field.
1482
+ return CloudDeployment(
1483
+ **{
1484
+ k: v
1485
+ for k, v in decorated_cloud_resource.to_dict().items()
1486
+ if k in allowed_keys
1487
+ }
1488
+ )
1489
+
1490
+ def get_cloud_resources(self, cloud_id: str) -> List[CloudDeployment]:
1491
+ decorated_cloud_resources = self.get_decorated_cloud_resources(cloud_id)
1482
1492
  return [
1483
- CloudDeployment(
1484
- **{k: v for k, v in resource.to_dict().items() if k in allowed_keys}
1485
- )
1493
+ self._convert_decorated_cloud_resource_to_cloud_deployment(resource)
1486
1494
  for resource in decorated_cloud_resources
1487
1495
  ]
1488
1496
 
@@ -1815,24 +1823,25 @@ class CloudController(BaseController):
1815
1823
  "Please use `anyscale cloud resource create` to add cloud resources."
1816
1824
  )
1817
1825
 
1818
- # Diff the existing and new specs
1819
- diff = self._generate_diff(
1820
- [self._remove_empty_values(r.to_dict()) for r in existing_resources], spec
1821
- )
1822
- if not diff:
1823
- self.log.info("No changes detected.")
1824
- return
1825
-
1826
1826
  existing_resources_dict = {
1827
1827
  resource.cloud_resource_id: resource for resource in existing_resources
1828
1828
  }
1829
1829
 
1830
+ all_deployments: List[CloudDeployment] = []
1830
1831
  updated_deployments: List[CloudDeployment] = []
1831
1832
  for d in spec:
1832
1833
  try:
1833
1834
  deployment = CloudDeployment(**d)
1834
1835
  except Exception as e: # noqa: BLE001
1835
- raise ClickException(f"Failed to parse cloud resource: {e}")
1836
+ try:
1837
+ # Try to parse the cloud deployment as a DecoratedCloudResource as well,
1838
+ # which has extra fields that are not in CloudDeployment.
1839
+ deployment = self._convert_decorated_cloud_resource_to_cloud_deployment(
1840
+ DecoratedCloudResource(**d)
1841
+ )
1842
+ except: # noqa: E722
1843
+ # Raise original error from parsing as CloudDeployment.
1844
+ raise ClickException(f"Failed to parse cloud resource: {e}")
1836
1845
 
1837
1846
  if not deployment.cloud_resource_id:
1838
1847
  raise ClickException(
@@ -1846,10 +1855,20 @@ class CloudController(BaseController):
1846
1855
  raise ClickException(
1847
1856
  "Please use the `anyscale machine-pool` CLI to update machine pools."
1848
1857
  )
1858
+
1859
+ all_deployments.append(deployment)
1849
1860
  if deployment != existing_resources_dict[deployment.cloud_resource_id]:
1850
1861
  updated_deployments.append(deployment)
1851
1862
 
1852
- # Log the diff and confirm.
1863
+ # Diff the existing and new specs and confirm.
1864
+ diff = self._generate_diff(
1865
+ [self._remove_empty_values(r.to_dict()) for r in existing_resources],
1866
+ [self._remove_empty_values(r.to_dict()) for r in all_deployments],
1867
+ )
1868
+ if not diff:
1869
+ self.log.info("No changes detected.")
1870
+ return
1871
+
1853
1872
  self.log.info(f"Detected the following changes:\n{diff}")
1854
1873
 
1855
1874
  confirm("Would you like to proceed with updating this cloud?", yes)
anyscale/version.py CHANGED
@@ -1 +1 @@
1
- __version__ = "0.26.53"
1
+ __version__ = "0.26.55"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: anyscale
3
- Version: 0.26.53
3
+ Version: 0.26.55
4
4
  Summary: Command Line Interface for Anyscale
5
5
  Author: Anyscale Inc.
6
6
  License: AS License
@@ -28,7 +28,7 @@ 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=KYK87Ie_qnRuNorZIFSLv1eb5nf6iI6UXZPyQ1ZgBmI,24
31
+ anyscale/version.py,sha256=Q91RXdcQACvk1n5hluPOYNf8C1ugDnw4_PqOP-z1lsI,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
@@ -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=-MkkZDPYB6pjZLFUVpZrU6bNfJBiQypWC1-NQ0VNoJ8,116558
109
+ anyscale/client/README.md,sha256=drReIpsz3aOF68F7ZdDWi-tdexu2HtkkAFIqHzpZPYs,117082
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=n_BVjUXeEZ9s5SsMy29_JiEfq11b9HCnckrt7u7GuXQ,52076
117
+ anyscale/client/openapi_client/__init__.py,sha256=KOoXXkErPM_UsuBVuf8Qi3gvLAseOrCukFI6EAx49Sc,52154
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=o_JD8Os3cfTCa1kjBVWbEuas_iw7RDLW4Nvc4Af_RPU,1888525
124
- anyscale/client/openapi_client/models/__init__.py,sha256=TfxKCPxJlILOTC6TLICbTHEPTnI-EzW1ijB1GuvFBU8,51586
123
+ anyscale/client/openapi_client/api/default_api.py,sha256=ZE4su4Qoq_SDdJt6yFfoCe11NwnugVy_2GltALBXuHY,1895564
124
+ anyscale/client/openapi_client/models/__init__.py,sha256=xveymwyO79TG-b3lfrZWJWV3sp9tDwB0pMYrQpbqmc8,51664
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
@@ -188,7 +188,7 @@ anyscale/client/openapi_client/models/cloud_collaborator_value.py,sha256=67xXXXl
188
188
  anyscale/client/openapi_client/models/cloud_collaborators_query.py,sha256=G2pjjNQZ6lvktbjsbl-M9JV2Pwer8LiNPRB-4Xa68qI,3853
189
189
  anyscale/client/openapi_client/models/cloud_config.py,sha256=cAn8jOFF9lX1Uy2Z1noDvXZ40s6aqqC9ZrUGU3A-R4M,7507
190
190
  anyscale/client/openapi_client/models/cloud_data_bucket_access_mode.py,sha256=RpskZfLKeCtLrM-DKtpW9W6Xo9lKKrTq1HIOFGHUzaQ,2869
191
- anyscale/client/openapi_client/models/cloud_data_bucket_file_type.py,sha256=3-qbvSLTkchZoQ0T_mzi53qL6aZFDnU0FXFijUMoXxI,3197
191
+ anyscale/client/openapi_client/models/cloud_data_bucket_file_type.py,sha256=Oz3rb36kt479cUWz-7s9lA42i7V9owda_q1QUfm2YJ8,3245
192
192
  anyscale/client/openapi_client/models/cloud_data_bucket_presigned_upload_info.py,sha256=oDuxszeCGe8_mMBx84yIE9uQypMRNDvUoN8CR84QaDQ,10068
193
193
  anyscale/client/openapi_client/models/cloud_data_bucket_presigned_upload_request.py,sha256=1a5lhtKDaXO46Mrdm6s5HMGFuoj5o_4kkEc7gFTadiI,5268
194
194
  anyscale/client/openapi_client/models/cloud_data_bucket_presigned_upload_scheme.py,sha256=5si79TIn1yIdm52omXlmNmyrfHgbCykKPmVXtOIlWXQ,2943
@@ -552,9 +552,10 @@ anyscale/client/openapi_client/models/partition_info.py,sha256=XaAsTffyjTxdCZN3w
552
552
  anyscale/client/openapi_client/models/pause_schedule.py,sha256=ru7_OzH7oDw5y2h1o5QNfKW8TXbkF1h-NDwccbUDRd0,3661
553
553
  anyscale/client/openapi_client/models/permission_level.py,sha256=fGnBgKrcZkGLYl7RpQQm0_gaGzkTehnJjOnIX8G4jAw,2868
554
554
  anyscale/client/openapi_client/models/plan_status.py,sha256=4Gl0dZDiPeP4ar87viHvggfjZwQeqWuMZ78i8bRWV9k,3855
555
+ anyscale/client/openapi_client/models/presigned_url_response.py,sha256=2f2D4FGpCCzaP2fRUBMGiMeG94JKu9OPQ0E3HOGhcQ4,3540
555
556
  anyscale/client/openapi_client/models/production_job.py,sha256=fVDrDRonEiH6OVfKl3Xwc1RPaPs0S4EKLqBEzvRIraY,13672
556
557
  anyscale/client/openapi_client/models/production_job_config.py,sha256=cW2TxSTUw-dDm3kGWa_tNet7dmJM3VVPJ75pWumosiA,12527
557
- anyscale/client/openapi_client/models/production_job_event.py,sha256=VljH0Qm09GbEHsb9je3LDcENu9MwD3pRISRJipwrV_s,11432
558
+ anyscale/client/openapi_client/models/production_job_event.py,sha256=TbXg3vxM8FKkctaYg8BQKbjFjiXCbivQa362t_afz54,12829
558
559
  anyscale/client/openapi_client/models/production_job_event_scope_filter.py,sha256=12DobzeEMTXhjDgELgR4noOLLodf-7lkwHcER2IED7s,2910
559
560
  anyscale/client/openapi_client/models/production_job_state_transition.py,sha256=yj6OVCo_bmJYNSa3t7RquX98KPdyaL3M-qlDcSwPUPU,9692
560
561
  anyscale/client/openapi_client/models/productionjob_response.py,sha256=5ft3ywRCus84N9g1FUt85PPe2FVRHyQBFBaPThG0TAA,3561
@@ -666,7 +667,7 @@ anyscale/client/openapi_client/models/task_state.py,sha256=KpRA6VImK3r0qNeaiHh4a
666
667
  anyscale/client/openapi_client/models/task_summary.py,sha256=8GIpf9xxmPDV8LJgIsGmSQex2R6CDKx0oJ9_VrL7oPw,9102
667
668
  anyscale/client/openapi_client/models/task_table_config.py,sha256=sy9cStVRjjT6KFU_47ibBbSRPf7fXjXe9YW2hwtPFhM,6928
668
669
  anyscale/client/openapi_client/models/task_table_response.py,sha256=T8VDBMlOzD1c2hY_Q1JdOF8ZF1MqA5JUMbnRjCKZmcg,5074
669
- anyscale/client/openapi_client/models/task_table_row.py,sha256=neF3ZAb_A12MsZkm_5tc8QV_PaItUirrVugGLTP27eE,15434
670
+ anyscale/client/openapi_client/models/task_table_row.py,sha256=7fXOimaIWXfTd7SLMsktKVUH6Mg7P4IOshBCL3bm9rs,16151
670
671
  anyscale/client/openapi_client/models/task_type.py,sha256=BwGeFgSgxL8aazGdhr58L7KyPHK5EqRrE_rVWuWyWCE,2807
671
672
  anyscale/client/openapi_client/models/tasksummary_response.py,sha256=sgOV63ZyYroVvcLbISXz0LU44tW8tLCefcqYB1WFsQ0,3539
672
673
  anyscale/client/openapi_client/models/text_query.py,sha256=aMcKF6nRme1J1jYKhvqUIG8VzlcDN72znSFF9kKCc2Y,5107
@@ -747,7 +748,7 @@ anyscale/client/openapi_client/models/write_project.py,sha256=48Jym8VDE57cZXTnVH
747
748
  anyscale/client/openapi_client/models/write_support_request.py,sha256=pFOalGDQi9FCDjeJV7ccBpq6iRq1Sub4NBfcUVfCglE,3614
748
749
  anyscale/cloud/__init__.py,sha256=cpMh-fHKh-LaK2VKF7uDtUN4gnFXhgWnVrtaIEZPPuU,4508
749
750
  anyscale/cloud/commands.py,sha256=2tGXjhL4QinVUE2ayGhUNRnsRPgHdSust1flWBi7QIw,4159
750
- anyscale/cloud/models.py,sha256=HMGzcQr0xnHTO0FvdOuFvO57RpNRLFiPMNCRv71U5p0,18945
751
+ anyscale/cloud/models.py,sha256=cy2NPzBmyg614QXqDe69Lx627XcMSSTXe20jPFY6C14,19059
751
752
  anyscale/cloud/_private/cloud_sdk.py,sha256=5TBGyGSjMI4jLOnSle1WWC6za0psP9xgTGWU2LgwemA,4099
752
753
  anyscale/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
753
754
  anyscale/commands/aggregated_instance_usage_commands.py,sha256=TRP1X3hdIWbKg9V20VtazlDXsYAeV--M0DH3-Z5tnj4,2293
@@ -797,7 +798,7 @@ anyscale/connect_utils/start_interactive_session.py,sha256=DbuIK2wuWofmbwJ9MLbsb
797
798
  anyscale/controllers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
798
799
  anyscale/controllers/auth_controller.py,sha256=hDY2sPvUP8pvh8PnlDYH5rCHjQes2v3b_KBVjMbrzeE,5127
799
800
  anyscale/controllers/base_controller.py,sha256=1QFJoScFUV7YTzpKarhwPOc1SvI-xqX3TZmwxKonW6I,1998
800
- anyscale/controllers/cloud_controller.py,sha256=WslkGFtv0YE4VIvNiPA-F9kRfqfeQvGgapunBb5OjAU,201395
801
+ anyscale/controllers/cloud_controller.py,sha256=Yjrqmy-gcUXD0mmTyVON0fRc2ok0bReGbNKn2qixsOY,202329
801
802
  anyscale/controllers/cloud_file_storage_utils.py,sha256=ifaqClEybTgxhqGWHYoH1vrlbxwjRuO-De_3666R2O4,6987
802
803
  anyscale/controllers/cloud_functional_verification_controller.py,sha256=YsEfdHT9hPtxy_3a5Q62UlRXW0iFJ1lVS4IZ_NHoemE,33399
803
804
  anyscale/controllers/cluster_controller.py,sha256=Sb5wVjrjpycg5iqmENAVtZ4iy9Kr6kM97_ck-KH85LM,28745
@@ -1091,10 +1092,10 @@ anyscale/workspace/__init__.py,sha256=Innbm5ZhCyADEVBiYSo_vbpKwUNcMzVSAfxIGKOYe6
1091
1092
  anyscale/workspace/commands.py,sha256=GBwZenhxe4LFAOCoW8y8KLSgm2HxMxozJ3njEcx53QE,18555
1092
1093
  anyscale/workspace/models.py,sha256=uiMqoJRQNRgTcOIIsysSrtlHMtnI7paUWS34EN626Cg,10016
1093
1094
  anyscale/workspace/_private/workspace_sdk.py,sha256=2CMeYfJt0UtIFCocDn1ukw1iI5esKHdopLe6duEs-qE,27599
1094
- anyscale-0.26.53.dist-info/licenses/LICENSE,sha256=UOPu974Wzsna6frFv1mu4VrZgNdZT7lbcNPzo5ue3qs,3494
1095
- anyscale-0.26.53.dist-info/licenses/NOTICE,sha256=gHqDhSnUYlRXX-mDOL5FtE7774oiKyV_HO80qM3r9Xo,196
1096
- anyscale-0.26.53.dist-info/METADATA,sha256=l2ZT1nqe0TSKHx4MQ8LIldjR5b6MfYSDj6YaDA4tXNs,3231
1097
- anyscale-0.26.53.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
1098
- anyscale-0.26.53.dist-info/entry_points.txt,sha256=NqO18sCZn6zG6J0S38itjcN00s7aE3C3v3k5lMAfCLk,51
1099
- anyscale-0.26.53.dist-info/top_level.txt,sha256=g3NVNS8Oh0NZwbFFgeX696C5MZZkS5dqV2NqcsbDRJE,9
1100
- anyscale-0.26.53.dist-info/RECORD,,
1095
+ anyscale-0.26.55.dist-info/licenses/LICENSE,sha256=UOPu974Wzsna6frFv1mu4VrZgNdZT7lbcNPzo5ue3qs,3494
1096
+ anyscale-0.26.55.dist-info/licenses/NOTICE,sha256=gHqDhSnUYlRXX-mDOL5FtE7774oiKyV_HO80qM3r9Xo,196
1097
+ anyscale-0.26.55.dist-info/METADATA,sha256=Eckny4k8rW5-VXvfnrA2lu9Mx6GXNWP_aPUMFeMksLo,3231
1098
+ anyscale-0.26.55.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
1099
+ anyscale-0.26.55.dist-info/entry_points.txt,sha256=NqO18sCZn6zG6J0S38itjcN00s7aE3C3v3k5lMAfCLk,51
1100
+ anyscale-0.26.55.dist-info/top_level.txt,sha256=g3NVNS8Oh0NZwbFFgeX696C5MZZkS5dqV2NqcsbDRJE,9
1101
+ anyscale-0.26.55.dist-info/RECORD,,