anyscale 0.26.68__py3-none-any.whl → 0.26.69__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 +2 -0
- anyscale/client/openapi_client/__init__.py +1 -0
- anyscale/client/openapi_client/api/default_api.py +126 -0
- anyscale/client/openapi_client/models/__init__.py +1 -0
- anyscale/client/openapi_client/models/clusterdashboardnode_response.py +121 -0
- anyscale/client/openapi_client/models/lineage_graph_node.py +70 -42
- anyscale/client/openapi_client/models/lineage_workload.py +31 -3
- anyscale/commands/cloud_commands.py +15 -9
- anyscale/commands/command_examples.py +53 -0
- anyscale/commands/setup_k8s.py +70 -19
- anyscale/controllers/cloud_controller.py +4 -3
- anyscale/version.py +1 -1
- {anyscale-0.26.68.dist-info → anyscale-0.26.69.dist-info}/METADATA +1 -1
- {anyscale-0.26.68.dist-info → anyscale-0.26.69.dist-info}/RECORD +19 -18
- {anyscale-0.26.68.dist-info → anyscale-0.26.69.dist-info}/WHEEL +0 -0
- {anyscale-0.26.68.dist-info → anyscale-0.26.69.dist-info}/entry_points.txt +0 -0
- {anyscale-0.26.68.dist-info → anyscale-0.26.69.dist-info}/licenses/LICENSE +0 -0
- {anyscale-0.26.68.dist-info → anyscale-0.26.69.dist-info}/licenses/NOTICE +0 -0
- {anyscale-0.26.68.dist-info → anyscale-0.26.69.dist-info}/top_level.txt +0 -0
anyscale/client/README.md
CHANGED
|
@@ -231,6 +231,7 @@ Class | Method | HTTP request | Description
|
|
|
231
231
|
*DefaultApi* | [**get_metronome_embedded_usage_dashboard_by_organization_api_v2_organization_billing_organization_id_metronome_embedded_dashboard_url_dashboard_type_get**](docs/DefaultApi.md#get_metronome_embedded_usage_dashboard_by_organization_api_v2_organization_billing_organization_id_metronome_embedded_dashboard_url_dashboard_type_get) | **GET** /api/v2/organization_billing/{organization_id}/metronome_embedded_dashboard_url/{dashboard_type} | Get Metronome Embedded Usage Dashboard By Organization
|
|
232
232
|
*DefaultApi* | [**get_model_api_v2_llm_models_model_id_get**](docs/DefaultApi.md#get_model_api_v2_llm_models_model_id_get) | **GET** /api/v2/llm/models/{model_id} | Get Model
|
|
233
233
|
*DefaultApi* | [**get_model_by_job_id_api_v2_llm_models_get_by_job_id_job_id_get**](docs/DefaultApi.md#get_model_by_job_id_api_v2_llm_models_get_by_job_id_job_id_get) | **GET** /api/v2/llm/models/get_by_job_id/{job_id} | Get Model By Job Id
|
|
234
|
+
*DefaultApi* | [**get_node_api_v2_cluster_dashboard_node_id_get**](docs/DefaultApi.md#get_node_api_v2_cluster_dashboard_node_id_get) | **GET** /api/v2/cluster_dashboard/{node_id} | Get Node
|
|
234
235
|
*DefaultApi* | [**get_nodes_api_v2_cluster_dashboard_get**](docs/DefaultApi.md#get_nodes_api_v2_cluster_dashboard_get) | **GET** /api/v2/cluster_dashboard/ | Get Nodes
|
|
235
236
|
*DefaultApi* | [**get_oauth_login_url_api_v2_integrations_oauth_login_get**](docs/DefaultApi.md#get_oauth_login_url_api_v2_integrations_oauth_login_get) | **GET** /api/v2/integrations/oauth/login | Get Oauth Login Url
|
|
236
237
|
*DefaultApi* | [**get_operator_events_api_v2_dataset_runs_operator_events_get**](docs/DefaultApi.md#get_operator_events_api_v2_dataset_runs_operator_events_get) | **GET** /api/v2/dataset_runs/operator_events | Get Operator Events
|
|
@@ -551,6 +552,7 @@ Class | Method | HTTP request | Description
|
|
|
551
552
|
- [ClusterStatusDetails](docs/ClusterStatusDetails.md)
|
|
552
553
|
- [ClusterauthresponseResponse](docs/ClusterauthresponseResponse.md)
|
|
553
554
|
- [ClusterdashboardnodeListResponse](docs/ClusterdashboardnodeListResponse.md)
|
|
555
|
+
- [ClusterdashboardnodeResponse](docs/ClusterdashboardnodeResponse.md)
|
|
554
556
|
- [ClustereventListResponse](docs/ClustereventListResponse.md)
|
|
555
557
|
- [ClustereventsoutputResponse](docs/ClustereventsoutputResponse.md)
|
|
556
558
|
- [ClusteroperationResponse](docs/ClusteroperationResponse.md)
|
|
@@ -149,6 +149,7 @@ from openapi_client.models.cluster_status import ClusterStatus
|
|
|
149
149
|
from openapi_client.models.cluster_status_details import ClusterStatusDetails
|
|
150
150
|
from openapi_client.models.clusterauthresponse_response import ClusterauthresponseResponse
|
|
151
151
|
from openapi_client.models.clusterdashboardnode_list_response import ClusterdashboardnodeListResponse
|
|
152
|
+
from openapi_client.models.clusterdashboardnode_response import ClusterdashboardnodeResponse
|
|
152
153
|
from openapi_client.models.clusterevent_list_response import ClustereventListResponse
|
|
153
154
|
from openapi_client.models.clustereventsoutput_response import ClustereventsoutputResponse
|
|
154
155
|
from openapi_client.models.clusteroperation_response import ClusteroperationResponse
|
|
@@ -18490,6 +18490,132 @@ class DefaultApi(object):
|
|
|
18490
18490
|
_request_timeout=local_var_params.get('_request_timeout'),
|
|
18491
18491
|
collection_formats=collection_formats)
|
|
18492
18492
|
|
|
18493
|
+
def get_node_api_v2_cluster_dashboard_node_id_get(self, node_id, cluster_id, **kwargs): # noqa: E501
|
|
18494
|
+
"""Get Node # noqa: E501
|
|
18495
|
+
|
|
18496
|
+
This method makes a synchronous HTTP request by default. To make an
|
|
18497
|
+
asynchronous HTTP request, please pass async_req=True
|
|
18498
|
+
>>> thread = api.get_node_api_v2_cluster_dashboard_node_id_get(node_id, cluster_id, async_req=True)
|
|
18499
|
+
>>> result = thread.get()
|
|
18500
|
+
|
|
18501
|
+
:param async_req bool: execute request asynchronously
|
|
18502
|
+
:param str node_id: (required)
|
|
18503
|
+
:param str cluster_id: (required)
|
|
18504
|
+
:param str session_name: The name of the session to the node belongs to.
|
|
18505
|
+
:param _preload_content: if False, the urllib3.HTTPResponse object will
|
|
18506
|
+
be returned without reading/decoding response
|
|
18507
|
+
data. Default is True.
|
|
18508
|
+
:param _request_timeout: timeout setting for this request. If one
|
|
18509
|
+
number provided, it will be total request
|
|
18510
|
+
timeout. It can also be a pair (tuple) of
|
|
18511
|
+
(connection, read) timeouts.
|
|
18512
|
+
:return: ClusterdashboardnodeResponse
|
|
18513
|
+
If the method is called asynchronously,
|
|
18514
|
+
returns the request thread.
|
|
18515
|
+
"""
|
|
18516
|
+
kwargs['_return_http_data_only'] = True
|
|
18517
|
+
return self.get_node_api_v2_cluster_dashboard_node_id_get_with_http_info(node_id, cluster_id, **kwargs) # noqa: E501
|
|
18518
|
+
|
|
18519
|
+
def get_node_api_v2_cluster_dashboard_node_id_get_with_http_info(self, node_id, cluster_id, **kwargs): # noqa: E501
|
|
18520
|
+
"""Get Node # noqa: E501
|
|
18521
|
+
|
|
18522
|
+
This method makes a synchronous HTTP request by default. To make an
|
|
18523
|
+
asynchronous HTTP request, please pass async_req=True
|
|
18524
|
+
>>> thread = api.get_node_api_v2_cluster_dashboard_node_id_get_with_http_info(node_id, cluster_id, async_req=True)
|
|
18525
|
+
>>> result = thread.get()
|
|
18526
|
+
|
|
18527
|
+
:param async_req bool: execute request asynchronously
|
|
18528
|
+
:param str node_id: (required)
|
|
18529
|
+
:param str cluster_id: (required)
|
|
18530
|
+
:param str session_name: The name of the session to the node belongs to.
|
|
18531
|
+
:param _return_http_data_only: response data without head status code
|
|
18532
|
+
and headers
|
|
18533
|
+
:param _preload_content: if False, the urllib3.HTTPResponse object will
|
|
18534
|
+
be returned without reading/decoding response
|
|
18535
|
+
data. Default is True.
|
|
18536
|
+
:param _request_timeout: timeout setting for this request. If one
|
|
18537
|
+
number provided, it will be total request
|
|
18538
|
+
timeout. It can also be a pair (tuple) of
|
|
18539
|
+
(connection, read) timeouts.
|
|
18540
|
+
:return: tuple(ClusterdashboardnodeResponse, status_code(int), headers(HTTPHeaderDict))
|
|
18541
|
+
If the method is called asynchronously,
|
|
18542
|
+
returns the request thread.
|
|
18543
|
+
"""
|
|
18544
|
+
|
|
18545
|
+
local_var_params = locals()
|
|
18546
|
+
|
|
18547
|
+
all_params = [
|
|
18548
|
+
'node_id',
|
|
18549
|
+
'cluster_id',
|
|
18550
|
+
'session_name'
|
|
18551
|
+
]
|
|
18552
|
+
all_params.extend(
|
|
18553
|
+
[
|
|
18554
|
+
'async_req',
|
|
18555
|
+
'_return_http_data_only',
|
|
18556
|
+
'_preload_content',
|
|
18557
|
+
'_request_timeout'
|
|
18558
|
+
]
|
|
18559
|
+
)
|
|
18560
|
+
|
|
18561
|
+
for key, val in six.iteritems(local_var_params['kwargs']):
|
|
18562
|
+
if key not in all_params:
|
|
18563
|
+
raise ApiTypeError(
|
|
18564
|
+
"Got an unexpected keyword argument '%s'"
|
|
18565
|
+
" to method get_node_api_v2_cluster_dashboard_node_id_get" % key
|
|
18566
|
+
)
|
|
18567
|
+
local_var_params[key] = val
|
|
18568
|
+
del local_var_params['kwargs']
|
|
18569
|
+
# verify the required parameter 'node_id' is set
|
|
18570
|
+
if self.api_client.client_side_validation and ('node_id' not in local_var_params or # noqa: E501
|
|
18571
|
+
local_var_params['node_id'] is None): # noqa: E501
|
|
18572
|
+
raise ApiValueError("Missing the required parameter `node_id` when calling `get_node_api_v2_cluster_dashboard_node_id_get`") # noqa: E501
|
|
18573
|
+
# verify the required parameter 'cluster_id' is set
|
|
18574
|
+
if self.api_client.client_side_validation and ('cluster_id' not in local_var_params or # noqa: E501
|
|
18575
|
+
local_var_params['cluster_id'] is None): # noqa: E501
|
|
18576
|
+
raise ApiValueError("Missing the required parameter `cluster_id` when calling `get_node_api_v2_cluster_dashboard_node_id_get`") # noqa: E501
|
|
18577
|
+
|
|
18578
|
+
collection_formats = {}
|
|
18579
|
+
|
|
18580
|
+
path_params = {}
|
|
18581
|
+
if 'node_id' in local_var_params:
|
|
18582
|
+
path_params['node_id'] = local_var_params['node_id'] # noqa: E501
|
|
18583
|
+
|
|
18584
|
+
query_params = []
|
|
18585
|
+
if 'cluster_id' in local_var_params and local_var_params['cluster_id'] is not None: # noqa: E501
|
|
18586
|
+
query_params.append(('cluster_id', local_var_params['cluster_id'])) # noqa: E501
|
|
18587
|
+
if 'session_name' in local_var_params and local_var_params['session_name'] is not None: # noqa: E501
|
|
18588
|
+
query_params.append(('session_name', local_var_params['session_name'])) # noqa: E501
|
|
18589
|
+
|
|
18590
|
+
header_params = {}
|
|
18591
|
+
|
|
18592
|
+
form_params = []
|
|
18593
|
+
local_var_files = {}
|
|
18594
|
+
|
|
18595
|
+
body_params = None
|
|
18596
|
+
# HTTP header `Accept`
|
|
18597
|
+
header_params['Accept'] = self.api_client.select_header_accept(
|
|
18598
|
+
['application/json']) # noqa: E501
|
|
18599
|
+
|
|
18600
|
+
# Authentication setting
|
|
18601
|
+
auth_settings = [] # noqa: E501
|
|
18602
|
+
|
|
18603
|
+
return self.api_client.call_api(
|
|
18604
|
+
'/api/v2/cluster_dashboard/{node_id}', 'GET',
|
|
18605
|
+
path_params,
|
|
18606
|
+
query_params,
|
|
18607
|
+
header_params,
|
|
18608
|
+
body=body_params,
|
|
18609
|
+
post_params=form_params,
|
|
18610
|
+
files=local_var_files,
|
|
18611
|
+
response_type='ClusterdashboardnodeResponse', # noqa: E501
|
|
18612
|
+
auth_settings=auth_settings,
|
|
18613
|
+
async_req=local_var_params.get('async_req'),
|
|
18614
|
+
_return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501
|
|
18615
|
+
_preload_content=local_var_params.get('_preload_content', True),
|
|
18616
|
+
_request_timeout=local_var_params.get('_request_timeout'),
|
|
18617
|
+
collection_formats=collection_formats)
|
|
18618
|
+
|
|
18493
18619
|
def get_nodes_api_v2_cluster_dashboard_get(self, cluster_id, **kwargs): # noqa: E501
|
|
18494
18620
|
"""Get Nodes # noqa: E501
|
|
18495
18621
|
|
|
@@ -135,6 +135,7 @@ from openapi_client.models.cluster_status import ClusterStatus
|
|
|
135
135
|
from openapi_client.models.cluster_status_details import ClusterStatusDetails
|
|
136
136
|
from openapi_client.models.clusterauthresponse_response import ClusterauthresponseResponse
|
|
137
137
|
from openapi_client.models.clusterdashboardnode_list_response import ClusterdashboardnodeListResponse
|
|
138
|
+
from openapi_client.models.clusterdashboardnode_response import ClusterdashboardnodeResponse
|
|
138
139
|
from openapi_client.models.clusterevent_list_response import ClustereventListResponse
|
|
139
140
|
from openapi_client.models.clustereventsoutput_response import ClustereventsoutputResponse
|
|
140
141
|
from openapi_client.models.clusteroperation_response import ClusteroperationResponse
|
|
@@ -0,0 +1,121 @@
|
|
|
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 ClusterdashboardnodeResponse(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
|
+
'result': 'ClusterDashboardNode'
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
attribute_map = {
|
|
40
|
+
'result': 'result'
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
def __init__(self, result=None, local_vars_configuration=None): # noqa: E501
|
|
44
|
+
"""ClusterdashboardnodeResponse - 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._result = None
|
|
50
|
+
self.discriminator = None
|
|
51
|
+
|
|
52
|
+
self.result = result
|
|
53
|
+
|
|
54
|
+
@property
|
|
55
|
+
def result(self):
|
|
56
|
+
"""Gets the result of this ClusterdashboardnodeResponse. # noqa: E501
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
:return: The result of this ClusterdashboardnodeResponse. # noqa: E501
|
|
60
|
+
:rtype: ClusterDashboardNode
|
|
61
|
+
"""
|
|
62
|
+
return self._result
|
|
63
|
+
|
|
64
|
+
@result.setter
|
|
65
|
+
def result(self, result):
|
|
66
|
+
"""Sets the result of this ClusterdashboardnodeResponse.
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
:param result: The result of this ClusterdashboardnodeResponse. # noqa: E501
|
|
70
|
+
:type: ClusterDashboardNode
|
|
71
|
+
"""
|
|
72
|
+
if self.local_vars_configuration.client_side_validation and result is None: # noqa: E501
|
|
73
|
+
raise ValueError("Invalid value for `result`, must not be `None`") # noqa: E501
|
|
74
|
+
|
|
75
|
+
self._result = result
|
|
76
|
+
|
|
77
|
+
def to_dict(self):
|
|
78
|
+
"""Returns the model properties as a dict"""
|
|
79
|
+
result = {}
|
|
80
|
+
|
|
81
|
+
for attr, _ in six.iteritems(self.openapi_types):
|
|
82
|
+
value = getattr(self, attr)
|
|
83
|
+
if isinstance(value, list):
|
|
84
|
+
result[attr] = list(map(
|
|
85
|
+
lambda x: x.to_dict() if hasattr(x, "to_dict") else x,
|
|
86
|
+
value
|
|
87
|
+
))
|
|
88
|
+
elif hasattr(value, "to_dict"):
|
|
89
|
+
result[attr] = value.to_dict()
|
|
90
|
+
elif isinstance(value, dict):
|
|
91
|
+
result[attr] = dict(map(
|
|
92
|
+
lambda item: (item[0], item[1].to_dict())
|
|
93
|
+
if hasattr(item[1], "to_dict") else item,
|
|
94
|
+
value.items()
|
|
95
|
+
))
|
|
96
|
+
else:
|
|
97
|
+
result[attr] = value
|
|
98
|
+
|
|
99
|
+
return result
|
|
100
|
+
|
|
101
|
+
def to_str(self):
|
|
102
|
+
"""Returns the string representation of the model"""
|
|
103
|
+
return pprint.pformat(self.to_dict())
|
|
104
|
+
|
|
105
|
+
def __repr__(self):
|
|
106
|
+
"""For `print` and `pprint`"""
|
|
107
|
+
return self.to_str()
|
|
108
|
+
|
|
109
|
+
def __eq__(self, other):
|
|
110
|
+
"""Returns true if both objects are equal"""
|
|
111
|
+
if not isinstance(other, ClusterdashboardnodeResponse):
|
|
112
|
+
return False
|
|
113
|
+
|
|
114
|
+
return self.to_dict() == other.to_dict()
|
|
115
|
+
|
|
116
|
+
def __ne__(self, other):
|
|
117
|
+
"""Returns true if both objects are not equal"""
|
|
118
|
+
if not isinstance(other, ClusterdashboardnodeResponse):
|
|
119
|
+
return True
|
|
120
|
+
|
|
121
|
+
return self.to_dict() != other.to_dict()
|
|
@@ -41,10 +41,11 @@ class LineageGraphNode(object):
|
|
|
41
41
|
'updated_at': 'datetime',
|
|
42
42
|
'created_by': 'str',
|
|
43
43
|
'updated_by': 'str',
|
|
44
|
-
'
|
|
44
|
+
'workload_type': 'LineageWorkloadType',
|
|
45
|
+
'anyscale_workload_id': 'str',
|
|
45
46
|
'artifact_type': 'LineageArtifactType',
|
|
46
47
|
'artifact_file_format': 'str',
|
|
47
|
-
'
|
|
48
|
+
'node_type': 'LineageNodeType'
|
|
48
49
|
}
|
|
49
50
|
|
|
50
51
|
attribute_map = {
|
|
@@ -56,13 +57,14 @@ class LineageGraphNode(object):
|
|
|
56
57
|
'updated_at': 'updated_at',
|
|
57
58
|
'created_by': 'created_by',
|
|
58
59
|
'updated_by': 'updated_by',
|
|
59
|
-
'
|
|
60
|
+
'workload_type': 'workload_type',
|
|
61
|
+
'anyscale_workload_id': 'anyscale_workload_id',
|
|
60
62
|
'artifact_type': 'artifact_type',
|
|
61
63
|
'artifact_file_format': 'artifact_file_format',
|
|
62
|
-
'
|
|
64
|
+
'node_type': 'node_type'
|
|
63
65
|
}
|
|
64
66
|
|
|
65
|
-
def __init__(self, id=None, name=None, namespace_name=None, uri=None, created_at=None, updated_at=None, created_by=None, updated_by=None,
|
|
67
|
+
def __init__(self, id=None, name=None, namespace_name=None, uri=None, created_at=None, updated_at=None, created_by=None, updated_by=None, workload_type=None, anyscale_workload_id=None, artifact_type=None, artifact_file_format=None, node_type=None, local_vars_configuration=None): # noqa: E501
|
|
66
68
|
"""LineageGraphNode - a model defined in OpenAPI""" # noqa: E501
|
|
67
69
|
if local_vars_configuration is None:
|
|
68
70
|
local_vars_configuration = Configuration()
|
|
@@ -76,10 +78,11 @@ class LineageGraphNode(object):
|
|
|
76
78
|
self._updated_at = None
|
|
77
79
|
self._created_by = None
|
|
78
80
|
self._updated_by = None
|
|
79
|
-
self.
|
|
81
|
+
self._workload_type = None
|
|
82
|
+
self._anyscale_workload_id = None
|
|
80
83
|
self._artifact_type = None
|
|
81
84
|
self._artifact_file_format = None
|
|
82
|
-
self.
|
|
85
|
+
self._node_type = None
|
|
83
86
|
self.discriminator = None
|
|
84
87
|
|
|
85
88
|
self.id = id
|
|
@@ -90,13 +93,15 @@ class LineageGraphNode(object):
|
|
|
90
93
|
self.updated_at = updated_at
|
|
91
94
|
self.created_by = created_by
|
|
92
95
|
self.updated_by = updated_by
|
|
93
|
-
|
|
96
|
+
if workload_type is not None:
|
|
97
|
+
self.workload_type = workload_type
|
|
98
|
+
if anyscale_workload_id is not None:
|
|
99
|
+
self.anyscale_workload_id = anyscale_workload_id
|
|
94
100
|
if artifact_type is not None:
|
|
95
101
|
self.artifact_type = artifact_type
|
|
96
102
|
if artifact_file_format is not None:
|
|
97
103
|
self.artifact_file_format = artifact_file_format
|
|
98
|
-
|
|
99
|
-
self.workload_type = workload_type
|
|
104
|
+
self.node_type = node_type
|
|
100
105
|
|
|
101
106
|
@property
|
|
102
107
|
def id(self):
|
|
@@ -299,35 +304,56 @@ class LineageGraphNode(object):
|
|
|
299
304
|
self._updated_by = updated_by
|
|
300
305
|
|
|
301
306
|
@property
|
|
302
|
-
def
|
|
303
|
-
"""Gets the
|
|
307
|
+
def workload_type(self):
|
|
308
|
+
"""Gets the workload_type of this LineageGraphNode. # noqa: E501
|
|
304
309
|
|
|
305
|
-
Type of
|
|
310
|
+
Type of workload (WORKSPACE/SERVICE/JOB) # noqa: E501
|
|
306
311
|
|
|
307
|
-
:return: The
|
|
308
|
-
:rtype:
|
|
312
|
+
:return: The workload_type of this LineageGraphNode. # noqa: E501
|
|
313
|
+
:rtype: LineageWorkloadType
|
|
309
314
|
"""
|
|
310
|
-
return self.
|
|
315
|
+
return self._workload_type
|
|
311
316
|
|
|
312
|
-
@
|
|
313
|
-
def
|
|
314
|
-
"""Sets the
|
|
317
|
+
@workload_type.setter
|
|
318
|
+
def workload_type(self, workload_type):
|
|
319
|
+
"""Sets the workload_type of this LineageGraphNode.
|
|
315
320
|
|
|
316
|
-
Type of
|
|
321
|
+
Type of workload (WORKSPACE/SERVICE/JOB) # noqa: E501
|
|
317
322
|
|
|
318
|
-
:param
|
|
319
|
-
:type:
|
|
323
|
+
:param workload_type: The workload_type of this LineageGraphNode. # noqa: E501
|
|
324
|
+
:type: LineageWorkloadType
|
|
320
325
|
"""
|
|
321
|
-
if self.local_vars_configuration.client_side_validation and node_type is None: # noqa: E501
|
|
322
|
-
raise ValueError("Invalid value for `node_type`, must not be `None`") # noqa: E501
|
|
323
326
|
|
|
324
|
-
self.
|
|
327
|
+
self._workload_type = workload_type
|
|
328
|
+
|
|
329
|
+
@property
|
|
330
|
+
def anyscale_workload_id(self):
|
|
331
|
+
"""Gets the anyscale_workload_id of this LineageGraphNode. # noqa: E501
|
|
332
|
+
|
|
333
|
+
Anyscale workload ID # noqa: E501
|
|
334
|
+
|
|
335
|
+
:return: The anyscale_workload_id of this LineageGraphNode. # noqa: E501
|
|
336
|
+
:rtype: str
|
|
337
|
+
"""
|
|
338
|
+
return self._anyscale_workload_id
|
|
339
|
+
|
|
340
|
+
@anyscale_workload_id.setter
|
|
341
|
+
def anyscale_workload_id(self, anyscale_workload_id):
|
|
342
|
+
"""Sets the anyscale_workload_id of this LineageGraphNode.
|
|
343
|
+
|
|
344
|
+
Anyscale workload ID # noqa: E501
|
|
345
|
+
|
|
346
|
+
:param anyscale_workload_id: The anyscale_workload_id of this LineageGraphNode. # noqa: E501
|
|
347
|
+
:type: str
|
|
348
|
+
"""
|
|
349
|
+
|
|
350
|
+
self._anyscale_workload_id = anyscale_workload_id
|
|
325
351
|
|
|
326
352
|
@property
|
|
327
353
|
def artifact_type(self):
|
|
328
354
|
"""Gets the artifact_type of this LineageGraphNode. # noqa: E501
|
|
329
355
|
|
|
330
|
-
Type of artifact
|
|
356
|
+
Type of artifact (DATASET/MODEL) # noqa: E501
|
|
331
357
|
|
|
332
358
|
:return: The artifact_type of this LineageGraphNode. # noqa: E501
|
|
333
359
|
:rtype: LineageArtifactType
|
|
@@ -338,7 +364,7 @@ class LineageGraphNode(object):
|
|
|
338
364
|
def artifact_type(self, artifact_type):
|
|
339
365
|
"""Sets the artifact_type of this LineageGraphNode.
|
|
340
366
|
|
|
341
|
-
Type of artifact
|
|
367
|
+
Type of artifact (DATASET/MODEL) # noqa: E501
|
|
342
368
|
|
|
343
369
|
:param artifact_type: The artifact_type of this LineageGraphNode. # noqa: E501
|
|
344
370
|
:type: LineageArtifactType
|
|
@@ -350,7 +376,7 @@ class LineageGraphNode(object):
|
|
|
350
376
|
def artifact_file_format(self):
|
|
351
377
|
"""Gets the artifact_file_format of this LineageGraphNode. # noqa: E501
|
|
352
378
|
|
|
353
|
-
File format
|
|
379
|
+
File format (e.g., parquet, csv) # noqa: E501
|
|
354
380
|
|
|
355
381
|
:return: The artifact_file_format of this LineageGraphNode. # noqa: E501
|
|
356
382
|
:rtype: str
|
|
@@ -361,7 +387,7 @@ class LineageGraphNode(object):
|
|
|
361
387
|
def artifact_file_format(self, artifact_file_format):
|
|
362
388
|
"""Sets the artifact_file_format of this LineageGraphNode.
|
|
363
389
|
|
|
364
|
-
File format
|
|
390
|
+
File format (e.g., parquet, csv) # noqa: E501
|
|
365
391
|
|
|
366
392
|
:param artifact_file_format: The artifact_file_format of this LineageGraphNode. # noqa: E501
|
|
367
393
|
:type: str
|
|
@@ -370,27 +396,29 @@ class LineageGraphNode(object):
|
|
|
370
396
|
self._artifact_file_format = artifact_file_format
|
|
371
397
|
|
|
372
398
|
@property
|
|
373
|
-
def
|
|
374
|
-
"""Gets the
|
|
399
|
+
def node_type(self):
|
|
400
|
+
"""Gets the node_type of this LineageGraphNode. # noqa: E501
|
|
375
401
|
|
|
376
|
-
Type of
|
|
402
|
+
Type of node (ARTIFACT/WORKLOAD) # noqa: E501
|
|
377
403
|
|
|
378
|
-
:return: The
|
|
379
|
-
:rtype:
|
|
404
|
+
:return: The node_type of this LineageGraphNode. # noqa: E501
|
|
405
|
+
:rtype: LineageNodeType
|
|
380
406
|
"""
|
|
381
|
-
return self.
|
|
407
|
+
return self._node_type
|
|
382
408
|
|
|
383
|
-
@
|
|
384
|
-
def
|
|
385
|
-
"""Sets the
|
|
409
|
+
@node_type.setter
|
|
410
|
+
def node_type(self, node_type):
|
|
411
|
+
"""Sets the node_type of this LineageGraphNode.
|
|
386
412
|
|
|
387
|
-
Type of
|
|
413
|
+
Type of node (ARTIFACT/WORKLOAD) # noqa: E501
|
|
388
414
|
|
|
389
|
-
:param
|
|
390
|
-
:type:
|
|
415
|
+
:param node_type: The node_type of this LineageGraphNode. # noqa: E501
|
|
416
|
+
:type: LineageNodeType
|
|
391
417
|
"""
|
|
418
|
+
if self.local_vars_configuration.client_side_validation and node_type is None: # noqa: E501
|
|
419
|
+
raise ValueError("Invalid value for `node_type`, must not be `None`") # noqa: E501
|
|
392
420
|
|
|
393
|
-
self.
|
|
421
|
+
self._node_type = node_type
|
|
394
422
|
|
|
395
423
|
def to_dict(self):
|
|
396
424
|
"""Returns the model properties as a dict"""
|
|
@@ -41,7 +41,8 @@ class LineageWorkload(object):
|
|
|
41
41
|
'updated_at': 'datetime',
|
|
42
42
|
'created_by': 'str',
|
|
43
43
|
'updated_by': 'str',
|
|
44
|
-
'workload_type': 'LineageWorkloadType'
|
|
44
|
+
'workload_type': 'LineageWorkloadType',
|
|
45
|
+
'anyscale_workload_id': 'str'
|
|
45
46
|
}
|
|
46
47
|
|
|
47
48
|
attribute_map = {
|
|
@@ -53,10 +54,11 @@ class LineageWorkload(object):
|
|
|
53
54
|
'updated_at': 'updated_at',
|
|
54
55
|
'created_by': 'created_by',
|
|
55
56
|
'updated_by': 'updated_by',
|
|
56
|
-
'workload_type': 'workload_type'
|
|
57
|
+
'workload_type': 'workload_type',
|
|
58
|
+
'anyscale_workload_id': 'anyscale_workload_id'
|
|
57
59
|
}
|
|
58
60
|
|
|
59
|
-
def __init__(self, id=None, name=None, namespace_name=None, uri=None, created_at=None, updated_at=None, created_by=None, updated_by=None, workload_type=None, local_vars_configuration=None): # noqa: E501
|
|
61
|
+
def __init__(self, id=None, name=None, namespace_name=None, uri=None, created_at=None, updated_at=None, created_by=None, updated_by=None, workload_type=None, anyscale_workload_id=None, local_vars_configuration=None): # noqa: E501
|
|
60
62
|
"""LineageWorkload - a model defined in OpenAPI""" # noqa: E501
|
|
61
63
|
if local_vars_configuration is None:
|
|
62
64
|
local_vars_configuration = Configuration()
|
|
@@ -71,6 +73,7 @@ class LineageWorkload(object):
|
|
|
71
73
|
self._created_by = None
|
|
72
74
|
self._updated_by = None
|
|
73
75
|
self._workload_type = None
|
|
76
|
+
self._anyscale_workload_id = None
|
|
74
77
|
self.discriminator = None
|
|
75
78
|
|
|
76
79
|
self.id = id
|
|
@@ -82,6 +85,8 @@ class LineageWorkload(object):
|
|
|
82
85
|
self.created_by = created_by
|
|
83
86
|
self.updated_by = updated_by
|
|
84
87
|
self.workload_type = workload_type
|
|
88
|
+
if anyscale_workload_id is not None:
|
|
89
|
+
self.anyscale_workload_id = anyscale_workload_id
|
|
85
90
|
|
|
86
91
|
@property
|
|
87
92
|
def id(self):
|
|
@@ -308,6 +313,29 @@ class LineageWorkload(object):
|
|
|
308
313
|
|
|
309
314
|
self._workload_type = workload_type
|
|
310
315
|
|
|
316
|
+
@property
|
|
317
|
+
def anyscale_workload_id(self):
|
|
318
|
+
"""Gets the anyscale_workload_id of this LineageWorkload. # noqa: E501
|
|
319
|
+
|
|
320
|
+
Anyscale workload ID # noqa: E501
|
|
321
|
+
|
|
322
|
+
:return: The anyscale_workload_id of this LineageWorkload. # noqa: E501
|
|
323
|
+
:rtype: str
|
|
324
|
+
"""
|
|
325
|
+
return self._anyscale_workload_id
|
|
326
|
+
|
|
327
|
+
@anyscale_workload_id.setter
|
|
328
|
+
def anyscale_workload_id(self, anyscale_workload_id):
|
|
329
|
+
"""Sets the anyscale_workload_id of this LineageWorkload.
|
|
330
|
+
|
|
331
|
+
Anyscale workload ID # noqa: E501
|
|
332
|
+
|
|
333
|
+
:param anyscale_workload_id: The anyscale_workload_id of this LineageWorkload. # noqa: E501
|
|
334
|
+
:type: str
|
|
335
|
+
"""
|
|
336
|
+
|
|
337
|
+
self._anyscale_workload_id = anyscale_workload_id
|
|
338
|
+
|
|
311
339
|
def to_dict(self):
|
|
312
340
|
"""Returns the model properties as a dict"""
|
|
313
341
|
result = {}
|
|
@@ -137,14 +137,11 @@ def default_region(provider: str) -> str:
|
|
|
137
137
|
show_default=True,
|
|
138
138
|
)
|
|
139
139
|
@click.option(
|
|
140
|
-
"--cluster-name",
|
|
141
|
-
help="Kubernetes cluster name (required for k8s stack).",
|
|
142
|
-
required=False,
|
|
143
|
-
type=str,
|
|
140
|
+
"--cluster-name", help="Kubernetes cluster name. (K8s)", required=False, type=str,
|
|
144
141
|
)
|
|
145
142
|
@click.option(
|
|
146
143
|
"--namespace",
|
|
147
|
-
help="Kubernetes namespace for Anyscale operator (
|
|
144
|
+
help="Kubernetes namespace for Anyscale operator. (K8s)",
|
|
148
145
|
required=False,
|
|
149
146
|
type=str,
|
|
150
147
|
default="anyscale-operator",
|
|
@@ -166,13 +163,13 @@ def default_region(provider: str) -> str:
|
|
|
166
163
|
"--anyscale-managed",
|
|
167
164
|
is_flag=True,
|
|
168
165
|
default=False,
|
|
169
|
-
help="Let anyscale create all the resources.",
|
|
166
|
+
help="Let anyscale create all the resources. (VM)",
|
|
170
167
|
)
|
|
171
168
|
@click.option(
|
|
172
169
|
"--enable-head-node-fault-tolerance",
|
|
173
170
|
is_flag=True,
|
|
174
171
|
default=False,
|
|
175
|
-
help="Whether to enable head node fault tolerance for services.",
|
|
172
|
+
help="Whether to enable head node fault tolerance for services. (VM)",
|
|
176
173
|
)
|
|
177
174
|
@click.option(
|
|
178
175
|
"--yes", "-y", is_flag=True, default=False, help="Skip asking for confirmation."
|
|
@@ -193,17 +190,24 @@ def default_region(provider: str) -> str:
|
|
|
193
190
|
type=click.Choice([e.value for e in SharedStorageType], case_sensitive=False),
|
|
194
191
|
default=SharedStorageType.OBJECT_STORAGE.value,
|
|
195
192
|
show_default=True,
|
|
196
|
-
help="The type of shared storage to use for the cloud. Use 'object-storage' for cloud bucket-based storage (e.g., S3, GCS), or 'nfs' for network file systems.",
|
|
193
|
+
help="The type of shared storage to use for the cloud. Use 'object-storage' for cloud bucket-based storage (e.g., S3, GCS), or 'nfs' for network file systems. (VM)",
|
|
197
194
|
)
|
|
198
195
|
@click.option(
|
|
199
196
|
"--values-file",
|
|
200
|
-
help="Path to save the generated Helm values file (for k8s stack, default: auto-generated with timestamp).",
|
|
197
|
+
help="Path to save the generated Helm values file (for k8s stack, default: auto-generated with timestamp). (K8s)",
|
|
201
198
|
required=False,
|
|
202
199
|
type=str,
|
|
203
200
|
)
|
|
204
201
|
@click.option(
|
|
205
202
|
"--debug", is_flag=True, default=False, help="Enable debug logging.",
|
|
206
203
|
)
|
|
204
|
+
@click.option(
|
|
205
|
+
"--operator-chart",
|
|
206
|
+
help="Path to operator chart (skips helm repo add/update). (K8s)",
|
|
207
|
+
required=False,
|
|
208
|
+
type=str,
|
|
209
|
+
hidden=True,
|
|
210
|
+
)
|
|
207
211
|
def setup_cloud( # noqa: PLR0913
|
|
208
212
|
provider: str,
|
|
209
213
|
region: str,
|
|
@@ -220,6 +224,7 @@ def setup_cloud( # noqa: PLR0913
|
|
|
220
224
|
shared_storage: str,
|
|
221
225
|
values_file: Optional[str],
|
|
222
226
|
debug: bool,
|
|
227
|
+
operator_chart: Optional[str],
|
|
223
228
|
) -> None:
|
|
224
229
|
# TODO (congding): remove `anyscale_managed` in the future, now keeping it for compatibility
|
|
225
230
|
|
|
@@ -241,6 +246,7 @@ def setup_cloud( # noqa: PLR0913
|
|
|
241
246
|
yes=yes,
|
|
242
247
|
values_file=values_file,
|
|
243
248
|
debug=debug,
|
|
249
|
+
operator_chart=operator_chart,
|
|
244
250
|
)
|
|
245
251
|
return
|
|
246
252
|
|
|
@@ -538,6 +538,59 @@ $ anyscale project get-default --cloud my-cloud-id --json
|
|
|
538
538
|
"""
|
|
539
539
|
|
|
540
540
|
|
|
541
|
+
CLOUD_SETUP_K8S_AWS_EXAMPLE = """\
|
|
542
|
+
# Set up a Kubernetes cloud on AWS EKS
|
|
543
|
+
$ anyscale cloud setup --provider aws --region us-west-2 --name my-k8s-cloud \\
|
|
544
|
+
--stack k8s --cluster-name my-eks-cluster --namespace anyscale-operator \\
|
|
545
|
+
--debug --yes
|
|
546
|
+
Output
|
|
547
|
+
(anyscale +1.0s) Setting up Kubernetes cloud 'my-k8s-cloud' on AWS
|
|
548
|
+
(anyscale +1.5s) Required CLI tools are installed (kubectl, helm, aws)
|
|
549
|
+
(anyscale +2.3s) Using namespace: anyscale-operator
|
|
550
|
+
(anyscale +5.2s) Cluster discovered: arn:aws:eks:us-west-2:123456789012:cluster/my-eks-cluster
|
|
551
|
+
(anyscale +8.4s) Setting up AWS infrastructure...
|
|
552
|
+
(anyscale +1m12.3s) CloudFormation stack created
|
|
553
|
+
(anyscale +1m15.7s) Cloud registered with ID: cld_abc123
|
|
554
|
+
(anyscale +1m18.2s) Adding Anyscale Helm repository...
|
|
555
|
+
(anyscale +1m20.5s) Installing Anyscale operator...
|
|
556
|
+
(anyscale +1m25.8s) Generated Helm values file: anyscale-helm-values-aws-anyscale-operator-20241015_175602.yaml
|
|
557
|
+
(anyscale +2m45.3s) Helm installation completed successfully
|
|
558
|
+
(anyscale +2m45.4s) Kubernetes cloud 'my-k8s-cloud' setup completed successfully!
|
|
559
|
+
"""
|
|
560
|
+
|
|
561
|
+
CLOUD_SETUP_K8S_GCP_EXAMPLE = """\
|
|
562
|
+
# Set up a Kubernetes cloud on GCP GKE
|
|
563
|
+
$ anyscale cloud setup --provider gcp --region us-central1 --name my-gke-cloud \\
|
|
564
|
+
--stack k8s --cluster-name my-gke-cluster --namespace anyscale-operator \\
|
|
565
|
+
--project-id my-project-123 --yes
|
|
566
|
+
Output
|
|
567
|
+
(anyscale +1.0s) Setting up Kubernetes cloud 'my-gke-cloud' on GCP
|
|
568
|
+
(anyscale +1.5s) Required CLI tools are installed (kubectl, helm, gcloud, gsutil)
|
|
569
|
+
(anyscale +2.3s) Using namespace: anyscale-operator
|
|
570
|
+
(anyscale +5.8s) Cluster discovered: gke_my-project-123_us-central1_my-gke-cluster
|
|
571
|
+
(anyscale +9.2s) Setting up GCP infrastructure...
|
|
572
|
+
(anyscale +15.4s) Created GCS bucket: anyscale-k8s-my-gke-cloud-a1b2c3d4
|
|
573
|
+
(anyscale +18.7s) Created service account: anyscale-operator-e5f6g7h8@my-project-123.iam.gserviceaccount.com
|
|
574
|
+
(anyscale +25.3s) GCP resources created successfully
|
|
575
|
+
(anyscale +28.1s) Cloud registered with ID: cld_xyz789
|
|
576
|
+
(anyscale +30.5s) Installing Anyscale operator...
|
|
577
|
+
(anyscale +35.8s) Generated Helm values file: anyscale-helm-values-gcp-anyscale-operator-20241015_180215.yaml
|
|
578
|
+
(anyscale +1m55.2s) Helm installation completed successfully
|
|
579
|
+
(anyscale +1m55.3s) Kubernetes cloud 'my-gke-cloud' setup completed successfully!
|
|
580
|
+
"""
|
|
581
|
+
|
|
582
|
+
CLOUD_SETUP_K8S_CUSTOM_VALUES_EXAMPLE = """\
|
|
583
|
+
# Set up a Kubernetes cloud with a custom Helm values file path
|
|
584
|
+
$ anyscale cloud setup --provider aws --region us-west-2 --name my-k8s-cloud \\
|
|
585
|
+
--stack k8s --cluster-name my-eks-cluster \\
|
|
586
|
+
--values-file /path/to/custom-values.yaml --yes
|
|
587
|
+
Output
|
|
588
|
+
(anyscale +1.0s) Setting up Kubernetes cloud 'my-k8s-cloud' on AWS
|
|
589
|
+
...
|
|
590
|
+
(anyscale +1m25.8s) Generated Helm values file: /path/to/custom-values.yaml
|
|
591
|
+
...
|
|
592
|
+
"""
|
|
593
|
+
|
|
541
594
|
CLOUD_ADD_COLLABORATORS_EXAMPLE = """\
|
|
542
595
|
$ anyscale cloud add-collaborators --cloud cloud_name --users-file collaborators.yaml
|
|
543
596
|
(anyscale +1.3s) Successfully added 2 collaborators to cloud cloud_name.
|
anyscale/commands/setup_k8s.py
CHANGED
|
@@ -75,6 +75,7 @@ class KubernetesCloudSetupCommand:
|
|
|
75
75
|
functional_verify: bool,
|
|
76
76
|
yes: bool,
|
|
77
77
|
values_file: Optional[str] = None,
|
|
78
|
+
operator_chart: Optional[str] = None,
|
|
78
79
|
) -> None:
|
|
79
80
|
"""
|
|
80
81
|
Main entry point for Kubernetes cloud setup.
|
|
@@ -89,6 +90,7 @@ class KubernetesCloudSetupCommand:
|
|
|
89
90
|
functional_verify: Whether to run functional verification
|
|
90
91
|
yes: Skip confirmation prompts
|
|
91
92
|
values_file: Optional custom path for Helm values file
|
|
93
|
+
operator_chart: Optional path to operator chart (skips helm repo add/update)
|
|
92
94
|
"""
|
|
93
95
|
self.log.open_block(
|
|
94
96
|
"Setup", f"Setting up Kubernetes cloud '{name}' on {provider.upper()}"
|
|
@@ -130,6 +132,7 @@ class KubernetesCloudSetupCommand:
|
|
|
130
132
|
final_namespace,
|
|
131
133
|
infrastructure,
|
|
132
134
|
values_file,
|
|
135
|
+
operator_chart,
|
|
133
136
|
)
|
|
134
137
|
|
|
135
138
|
# Step 6: Verify installation
|
|
@@ -1165,6 +1168,7 @@ class KubernetesCloudSetupCommand:
|
|
|
1165
1168
|
namespace: str,
|
|
1166
1169
|
infrastructure: InfrastructureResources,
|
|
1167
1170
|
values_file: Optional[str] = None,
|
|
1171
|
+
operator_chart: Optional[str] = None,
|
|
1168
1172
|
) -> None:
|
|
1169
1173
|
"""Install the Anyscale operator using Helm."""
|
|
1170
1174
|
self.log.info("Installing Anyscale operator...", block_label="Setup")
|
|
@@ -1201,14 +1205,21 @@ class KubernetesCloudSetupCommand:
|
|
|
1201
1205
|
additional_values=set_string_values,
|
|
1202
1206
|
)
|
|
1203
1207
|
|
|
1204
|
-
#
|
|
1205
|
-
|
|
1206
|
-
|
|
1208
|
+
# Determine chart reference based on operator_chart parameter
|
|
1209
|
+
if operator_chart:
|
|
1210
|
+
# Use the provided chart path directly
|
|
1211
|
+
self._debug(f"Using operator chart from: {operator_chart}")
|
|
1212
|
+
chart_reference = operator_chart
|
|
1213
|
+
else:
|
|
1214
|
+
# Add Helm repo before installing
|
|
1215
|
+
self._debug("Adding Anyscale Helm repository...")
|
|
1216
|
+
self._add_helm_repo()
|
|
1217
|
+
chart_reference = "anyscale/anyscale-operator"
|
|
1207
1218
|
|
|
1208
1219
|
# Build a simple Helm command that only uses the values file
|
|
1209
1220
|
self._debug("Generating Helm command...")
|
|
1210
1221
|
helm_command = (
|
|
1211
|
-
f"helm upgrade {release_name}
|
|
1222
|
+
f"helm upgrade {release_name} {chart_reference} "
|
|
1212
1223
|
f"--values {values_file_path} "
|
|
1213
1224
|
f"--namespace {namespace} "
|
|
1214
1225
|
f"--create-namespace "
|
|
@@ -1276,6 +1287,35 @@ class KubernetesCloudSetupCommand:
|
|
|
1276
1287
|
|
|
1277
1288
|
return set_string_values
|
|
1278
1289
|
|
|
1290
|
+
def _set_nested_value(self, d: Dict[str, Any], key_path: str, value: Any) -> None:
|
|
1291
|
+
"""
|
|
1292
|
+
Set a value in a nested dictionary using a dotted key path.
|
|
1293
|
+
|
|
1294
|
+
Args:
|
|
1295
|
+
d: The dictionary to modify
|
|
1296
|
+
key_path: Dotted key path (e.g., "workloads.serviceaccount.name")
|
|
1297
|
+
value: The value to set
|
|
1298
|
+
|
|
1299
|
+
Example:
|
|
1300
|
+
_set_nested_value({}, "workloads.serviceaccount.name", "my-sa")
|
|
1301
|
+
# Results in: {"workloads": {"serviceaccount": {"name": "my-sa"}}}
|
|
1302
|
+
"""
|
|
1303
|
+
keys = key_path.split(".")
|
|
1304
|
+
current = d
|
|
1305
|
+
|
|
1306
|
+
# Navigate/create the nested structure
|
|
1307
|
+
for key in keys[:-1]:
|
|
1308
|
+
if key not in current:
|
|
1309
|
+
current[key] = {}
|
|
1310
|
+
elif not isinstance(current[key], dict):
|
|
1311
|
+
# If the key exists but isn't a dict, we have a conflict
|
|
1312
|
+
# In this case, we'll overwrite it with a dict
|
|
1313
|
+
current[key] = {}
|
|
1314
|
+
current = current[key]
|
|
1315
|
+
|
|
1316
|
+
# Set the final value
|
|
1317
|
+
current[keys[-1]] = value
|
|
1318
|
+
|
|
1279
1319
|
def _prompt_for_namespace(
|
|
1280
1320
|
self, default_namespace: str, skip_confirmation: bool = False
|
|
1281
1321
|
) -> str:
|
|
@@ -1287,10 +1327,12 @@ class KubernetesCloudSetupCommand:
|
|
|
1287
1327
|
return final_namespace
|
|
1288
1328
|
|
|
1289
1329
|
self.log.info("Configuring Kubernetes namespace...")
|
|
1290
|
-
|
|
1291
1330
|
self.log.info(
|
|
1292
|
-
f"
|
|
1331
|
+
f"Specify the namespace to use for the Anyscale operator (leave blank for default: {final_namespace})."
|
|
1293
1332
|
)
|
|
1333
|
+
self.log.info("If the namespace does not exist, it will be created.")
|
|
1334
|
+
self.log.info("Enter your namespace:")
|
|
1335
|
+
|
|
1294
1336
|
final_namespace = click.prompt("", default=final_namespace, show_default=True)
|
|
1295
1337
|
|
|
1296
1338
|
# Validate namespace (Kubernetes DNS-1123 label requirements)
|
|
@@ -1323,25 +1365,31 @@ class KubernetesCloudSetupCommand:
|
|
|
1323
1365
|
"""Generate Helm values file and save it locally."""
|
|
1324
1366
|
self.log.info("Generating Helm values file...")
|
|
1325
1367
|
|
|
1326
|
-
#
|
|
1327
|
-
values: Dict[str, Any] = {
|
|
1328
|
-
"global": {
|
|
1329
|
-
"cloudDeploymentId": cloud_deployment_id,
|
|
1330
|
-
"cloudProvider": provider,
|
|
1331
|
-
"region": region,
|
|
1332
|
-
"auth": {"iamIdentity": infrastructure.iam_role_arn,},
|
|
1333
|
-
},
|
|
1334
|
-
"ingress-nginx": {"enabled": True},
|
|
1335
|
-
}
|
|
1368
|
+
# Start with an empty dictionary to build up values
|
|
1369
|
+
values: Dict[str, Any] = {}
|
|
1336
1370
|
|
|
1371
|
+
# First, parse and merge additional_values with nested keys
|
|
1337
1372
|
if additional_values:
|
|
1338
1373
|
for key, value in additional_values.items():
|
|
1339
|
-
|
|
1340
|
-
|
|
1374
|
+
self._set_nested_value(values, key, value)
|
|
1375
|
+
|
|
1376
|
+
# Now overlay our constants on top (these take precedence)
|
|
1377
|
+
# Use _set_nested_value to ensure proper nesting
|
|
1378
|
+
self._set_nested_value(values, "global.cloudDeploymentId", cloud_deployment_id)
|
|
1379
|
+
self._set_nested_value(values, "global.cloudProvider", provider)
|
|
1380
|
+
self._set_nested_value(
|
|
1381
|
+
values, "global.auth.iamIdentity", infrastructure.iam_role_arn
|
|
1382
|
+
)
|
|
1383
|
+
self._set_nested_value(values, "ingress-nginx.enabled", True)
|
|
1384
|
+
|
|
1385
|
+
# Add region for AWS only (using global.aws.region)
|
|
1386
|
+
# Region field is deprecated for other providers
|
|
1387
|
+
if provider == "aws":
|
|
1388
|
+
self._set_nested_value(values, "global.aws.region", region)
|
|
1341
1389
|
|
|
1342
1390
|
# Add control plane URL from ANYSCALE_HOST environment variable
|
|
1343
1391
|
if ANYSCALE_HOST:
|
|
1344
|
-
values
|
|
1392
|
+
self._set_nested_value(values, "global.controlPlaneURL", ANYSCALE_HOST)
|
|
1345
1393
|
self.log.info(f"Using control plane URL: {ANYSCALE_HOST}")
|
|
1346
1394
|
|
|
1347
1395
|
if custom_path:
|
|
@@ -1429,6 +1477,7 @@ def setup_kubernetes_cloud( # noqa: PLR0913
|
|
|
1429
1477
|
yes: bool = False,
|
|
1430
1478
|
values_file: Optional[str] = None,
|
|
1431
1479
|
debug: bool = False,
|
|
1480
|
+
operator_chart: Optional[str] = None,
|
|
1432
1481
|
) -> None:
|
|
1433
1482
|
"""
|
|
1434
1483
|
Set up Anyscale on a Kubernetes cluster.
|
|
@@ -1447,6 +1496,7 @@ def setup_kubernetes_cloud( # noqa: PLR0913
|
|
|
1447
1496
|
yes: Skip confirmation prompts
|
|
1448
1497
|
values_file: Optional path for Helm values file
|
|
1449
1498
|
debug: Enable debug logging
|
|
1499
|
+
operator_chart: Optional path to operator chart (skips helm repo add/update)
|
|
1450
1500
|
"""
|
|
1451
1501
|
cmd = KubernetesCloudSetupCommand(debug=debug)
|
|
1452
1502
|
|
|
@@ -1461,6 +1511,7 @@ def setup_kubernetes_cloud( # noqa: PLR0913
|
|
|
1461
1511
|
functional_verify=functional_verify,
|
|
1462
1512
|
yes=yes,
|
|
1463
1513
|
values_file=values_file,
|
|
1514
|
+
operator_chart=operator_chart,
|
|
1464
1515
|
)
|
|
1465
1516
|
except Exception as e: # noqa: BLE001
|
|
1466
1517
|
click.echo(f"Setup failed: {e}", err=True)
|
|
@@ -4197,9 +4197,10 @@ class CloudController(BaseController):
|
|
|
4197
4197
|
f" --set-string global.cloudProvider={provider}",
|
|
4198
4198
|
]
|
|
4199
4199
|
|
|
4200
|
-
# Add region for
|
|
4201
|
-
|
|
4202
|
-
|
|
4200
|
+
# Add region only for AWS (using global.aws.region)
|
|
4201
|
+
# Region field is deprecated for other providers
|
|
4202
|
+
if region and provider == "aws":
|
|
4203
|
+
command_parts.append(f" --set-string global.aws.region={region}")
|
|
4203
4204
|
|
|
4204
4205
|
# Add provider-specific parameters
|
|
4205
4206
|
if provider == "gcp" and operator_iam_identity:
|
anyscale/version.py
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
__version__ = "0.26.
|
|
1
|
+
__version__ = "0.26.69"
|
|
@@ -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=3jfGH2CyDmXrSg-3owSF7F8FnqKbLJ-aHUbepyCKuqQ,42903
|
|
31
|
-
anyscale/version.py,sha256=
|
|
31
|
+
anyscale/version.py,sha256=8l-HVlfTILDzHo06U3dRLRAa9a7jz3Fn-EMAVFoKZlI,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=
|
|
109
|
+
anyscale/client/README.md,sha256=8kvEOItPcb2zSd8QQSyM8N4ojn4ZFPAMO2p3veTtl50,132253
|
|
110
110
|
anyscale/client/git_push.sh,sha256=EDCZOTTiLxbtPHmiU63qC99rGH67B7dhdPZdNUKivF0,1827
|
|
111
111
|
anyscale/client/requirements.txt,sha256=dkVKYUStC5h_g_87SH7pRdhXCj7ySozAJMGAFEzGgFc,126
|
|
112
112
|
anyscale/client/setup.cfg,sha256=l7bdKSIedeBhhoDtupsBwx1xPrlBf2yYeTH7a8kMga4,28
|
|
@@ -114,14 +114,14 @@ anyscale/client/setup.py,sha256=tSxqw1kAL1B9adnrnOarjnQfSbwGmnTr_kg8ZXhlm5A,1109
|
|
|
114
114
|
anyscale/client/test-requirements.txt,sha256=sTjmDTj5W9fh1ZAeo8UT2EBdeGDBNttj_PHiPBXg1D4,111
|
|
115
115
|
anyscale/client/tox.ini,sha256=M6L3UmvAdvU65LsoAF-Oi7oRjwZlCJZn8I7ofdXn5Ok,156
|
|
116
116
|
anyscale/client/.openapi-generator/VERSION,sha256=J0RzX-4u4jfin1kviKtmncjUePyjHm2kyvmkobOrt_E,5
|
|
117
|
-
anyscale/client/openapi_client/__init__.py,sha256=
|
|
117
|
+
anyscale/client/openapi_client/__init__.py,sha256=jolh0VOen_4BrBV_GUvVTgyzUqM6PUWvLXCprQQ7BrY,59974
|
|
118
118
|
anyscale/client/openapi_client/api_client.py,sha256=d8Un6j2Ny2vlS2qBXPVFj6_ql0k36DFahpWt_28TfCk,25563
|
|
119
119
|
anyscale/client/openapi_client/configuration.py,sha256=Dd5XrlHwv-wxnf0C35PG_-HBQoY3Yaz6hKrmkZz-m0E,12363
|
|
120
120
|
anyscale/client/openapi_client/exceptions.py,sha256=3egwsXQG2j_vARbqgBxUO1xSltAhpfiHTYVP7VXTvU0,3792
|
|
121
121
|
anyscale/client/openapi_client/rest.py,sha256=Ehj37v7GHW6SXV067Hze5HE42ayKaGi6a6ZlkR7u3Lg,12501
|
|
122
122
|
anyscale/client/openapi_client/api/__init__.py,sha256=i8u7BI2xX1GrXTL3hN0pKpYIlnT-D_uDxH2ElOfYG1I,141
|
|
123
|
-
anyscale/client/openapi_client/api/default_api.py,sha256=
|
|
124
|
-
anyscale/client/openapi_client/models/__init__.py,sha256=
|
|
123
|
+
anyscale/client/openapi_client/api/default_api.py,sha256=cT2oGICbOppuDOHso9iNBBXEWJS4GO6BsplKrLgRc4E,2157781
|
|
124
|
+
anyscale/client/openapi_client/models/__init__.py,sha256=YhAEQIPW4Bl10Oijs9DWzoXHe-Vg3SHWwIfIFn0RfnI,59484
|
|
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
|
|
@@ -243,6 +243,7 @@ anyscale/client/openapi_client/models/cluster_status.py,sha256=9bvifs50nFxxfufad
|
|
|
243
243
|
anyscale/client/openapi_client/models/cluster_status_details.py,sha256=Sj086_AZaPrRE_4ANgO7utZ084U-dSzFBGIXN64h2j0,2999
|
|
244
244
|
anyscale/client/openapi_client/models/clusterauthresponse_response.py,sha256=rwq8UV5AKtjFkrWg0_k94EggUQ2OrSFkm36tIFK7YEk,3627
|
|
245
245
|
anyscale/client/openapi_client/models/clusterdashboardnode_list_response.py,sha256=mXRbpQeGCGKpXxlV_InrlUmwjo2e6_2umtLa50s0wjM,4497
|
|
246
|
+
anyscale/client/openapi_client/models/clusterdashboardnode_response.py,sha256=sayAz6snjMiWnXxwyvGZ509OE2Hc1y0v5HNKlVzUk6I,3638
|
|
246
247
|
anyscale/client/openapi_client/models/clusterevent_list_response.py,sha256=mtfYHoHjpzqg_VOyIn6XvcW71pfBPlfrxjVP6wxHsX4,4377
|
|
247
248
|
anyscale/client/openapi_client/models/clustereventsoutput_response.py,sha256=vFPLzXf_sRs8LAg16Ht6Oel18w6FISg7MLFi4YlTvHs,3627
|
|
248
249
|
anyscale/client/openapi_client/models/clusteroperation_response.py,sha256=g0tNqDigTKkzGSmhrDyhQYcUE0JQMCJTzk44INGhoV4,3594
|
|
@@ -486,9 +487,9 @@ anyscale/client/openapi_client/models/lineage_artifact_sort_field.py,sha256=pOic
|
|
|
486
487
|
anyscale/client/openapi_client/models/lineage_artifact_type.py,sha256=rZV5nndrPi0P75fpsg6ZnGRDUxwk0OFWNef22840Kl0,2854
|
|
487
488
|
anyscale/client/openapi_client/models/lineage_direction.py,sha256=tvIjSwnt4MSxuczUBI_KlI7gHiMCB76skHSdx_N8oIc,2848
|
|
488
489
|
anyscale/client/openapi_client/models/lineage_graph.py,sha256=yn34T-j0-PWdvIMCTemoOLyGZ5UQgu2HYnimmODd_Ys,5216
|
|
489
|
-
anyscale/client/openapi_client/models/lineage_graph_node.py,sha256=
|
|
490
|
+
anyscale/client/openapi_client/models/lineage_graph_node.py,sha256=vDKxQJGkGzPGBbD6bWbri8m-NMk6ALHU0kN38xwq9kg,14943
|
|
490
491
|
anyscale/client/openapi_client/models/lineage_node_type.py,sha256=bi8gje1x01FtL0l1PzN76aQbBCeOkLWk_e2YXd3jdwY,2850
|
|
491
|
-
anyscale/client/openapi_client/models/lineage_workload.py,sha256=
|
|
492
|
+
anyscale/client/openapi_client/models/lineage_workload.py,sha256=8h5-gsqDh5w2ZYuqv6I27lSCtE7phKVJhNJH0vlMECY,12110
|
|
492
493
|
anyscale/client/openapi_client/models/lineage_workload_sort_field.py,sha256=u5seM0kQtRVrEAhbQ38MlMvGYbIBTwUB52Yc7pyr7n0,2922
|
|
493
494
|
anyscale/client/openapi_client/models/lineage_workload_type.py,sha256=kjZlfsIo6rRarGpnahuZEX1zM-qyqe3drQb1QO3xkZI,2914
|
|
494
495
|
anyscale/client/openapi_client/models/lineageartifact_list_response.py,sha256=t4QnqXbEkoADCzpm4q23EP9VPQueTLWKmDUJ6msKZZE,4422
|
|
@@ -849,10 +850,10 @@ anyscale/cloud/_private/cloud_sdk.py,sha256=5TBGyGSjMI4jLOnSle1WWC6za0psP9xgTGWU
|
|
|
849
850
|
anyscale/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
850
851
|
anyscale/commands/aggregated_instance_usage_commands.py,sha256=TRP1X3hdIWbKg9V20VtazlDXsYAeV--M0DH3-Z5tnj4,2293
|
|
851
852
|
anyscale/commands/auth_commands.py,sha256=X1g6Yu9kqgPb4HLODlZTYEk8G5AVLeyizPIgagWx-p0,1026
|
|
852
|
-
anyscale/commands/cloud_commands.py,sha256=
|
|
853
|
+
anyscale/commands/cloud_commands.py,sha256=rchYt9HmzDMBAAOZ3KS1s8hpcHNwcK1frzSttQJPkPE,60406
|
|
853
854
|
anyscale/commands/cluster_commands.py,sha256=taNcffyFfqJ1MgOQd0cz9kzRXWFTdp-wfLPM4l_2tBc,13487
|
|
854
855
|
anyscale/commands/cluster_env_commands.py,sha256=KNWylyE8Ew1sDi7yu2Tp4RLcRu2_KJJJIzVGRyPflJo,3899
|
|
855
|
-
anyscale/commands/command_examples.py,sha256=
|
|
856
|
+
anyscale/commands/command_examples.py,sha256=Py9DxWNZysdt8fgSnVgSRrqMlMHkXwnOZDTSTk9pCSY,27913
|
|
856
857
|
anyscale/commands/compute_config_commands.py,sha256=e_k4SOIa0MoFq51nzu4dNFk5SGlrJPCbPyq_sWBVnHg,7899
|
|
857
858
|
anyscale/commands/config_commands.py,sha256=p55uM6WrhfbFoRXC9hNAV-8c5ANghw7tBUYwaQDAtjE,7195
|
|
858
859
|
anyscale/commands/exec_commands.py,sha256=PjgHQpVXFQX2jhX_04fnPOu8knJWzvvZNv9khqG9gZs,957
|
|
@@ -874,7 +875,7 @@ anyscale/commands/schedule_commands.py,sha256=Bw2aKp_w6xcuRSVVi9FLdUjRVCr8_v4Tt2
|
|
|
874
875
|
anyscale/commands/service_account_commands.py,sha256=JlppTmcaDofJn7TYqd3PW4hDGykdEN56fr0PT3qgBIg,3271
|
|
875
876
|
anyscale/commands/service_commands.py,sha256=DBrPkW7JH3kCsr038aQStm7AF1u-n80sLjwc2Hjifks,34014
|
|
876
877
|
anyscale/commands/session_commands_hidden.py,sha256=APEypnUB1yV2Rr6wdSFWy1vQbAnn-lOn0rU2enF5JdM,6200
|
|
877
|
-
anyscale/commands/setup_k8s.py,sha256=
|
|
878
|
+
anyscale/commands/setup_k8s.py,sha256=1IiuAOz3qJO5VWqpHDhppLbEfAQePGq9AbkRmoHEQeM,60631
|
|
878
879
|
anyscale/commands/user_commands.py,sha256=C-i1dGpdhboywN_2XgPS2BekKx2y6LZq8c8gvS0S-tY,1259
|
|
879
880
|
anyscale/commands/util.py,sha256=fIob29G1jZ4VU9PKVSJnT6hqX7wAqsS4L9sApsMZcNs,8585
|
|
880
881
|
anyscale/commands/workspace_commands.py,sha256=5JoF5xftkwkxHidp8xyj9POrlZE_WxwSKtZGnKCbDV4,18597
|
|
@@ -894,7 +895,7 @@ anyscale/connect_utils/start_interactive_session.py,sha256=m-RCH0e_bQBF6dAOskbP9
|
|
|
894
895
|
anyscale/controllers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
895
896
|
anyscale/controllers/auth_controller.py,sha256=hDY2sPvUP8pvh8PnlDYH5rCHjQes2v3b_KBVjMbrzeE,5127
|
|
896
897
|
anyscale/controllers/base_controller.py,sha256=1QFJoScFUV7YTzpKarhwPOc1SvI-xqX3TZmwxKonW6I,1998
|
|
897
|
-
anyscale/controllers/cloud_controller.py,sha256=
|
|
898
|
+
anyscale/controllers/cloud_controller.py,sha256=nWEP_LmTZTBVVhAbShQP_Qc-G-y8oSZL-BsUhzkU49g,202138
|
|
898
899
|
anyscale/controllers/cloud_file_storage_utils.py,sha256=ifaqClEybTgxhqGWHYoH1vrlbxwjRuO-De_3666R2O4,6987
|
|
899
900
|
anyscale/controllers/cloud_functional_verification_controller.py,sha256=uro10r981CTlt2zlisUCmNYljbrYBiWzh7vrqrcur3I,33475
|
|
900
901
|
anyscale/controllers/cluster_controller.py,sha256=Sb5wVjrjpycg5iqmENAVtZ4iy9Kr6kM97_ck-KH85LM,28745
|
|
@@ -1189,10 +1190,10 @@ anyscale/workspace/__init__.py,sha256=Innbm5ZhCyADEVBiYSo_vbpKwUNcMzVSAfxIGKOYe6
|
|
|
1189
1190
|
anyscale/workspace/commands.py,sha256=b1sqNseoPj-1VXznqQOLe0V_a663bOTvJX-TaOMJa1Y,14590
|
|
1190
1191
|
anyscale/workspace/models.py,sha256=uiMqoJRQNRgTcOIIsysSrtlHMtnI7paUWS34EN626Cg,10016
|
|
1191
1192
|
anyscale/workspace/_private/workspace_sdk.py,sha256=2CMeYfJt0UtIFCocDn1ukw1iI5esKHdopLe6duEs-qE,27599
|
|
1192
|
-
anyscale-0.26.
|
|
1193
|
-
anyscale-0.26.
|
|
1194
|
-
anyscale-0.26.
|
|
1195
|
-
anyscale-0.26.
|
|
1196
|
-
anyscale-0.26.
|
|
1197
|
-
anyscale-0.26.
|
|
1198
|
-
anyscale-0.26.
|
|
1193
|
+
anyscale-0.26.69.dist-info/licenses/LICENSE,sha256=UOPu974Wzsna6frFv1mu4VrZgNdZT7lbcNPzo5ue3qs,3494
|
|
1194
|
+
anyscale-0.26.69.dist-info/licenses/NOTICE,sha256=gHqDhSnUYlRXX-mDOL5FtE7774oiKyV_HO80qM3r9Xo,196
|
|
1195
|
+
anyscale-0.26.69.dist-info/METADATA,sha256=bh83I4fwRpynsPUpm9SbAvANvAmTmOh6kiEJj9PjOtM,3231
|
|
1196
|
+
anyscale-0.26.69.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
1197
|
+
anyscale-0.26.69.dist-info/entry_points.txt,sha256=NqO18sCZn6zG6J0S38itjcN00s7aE3C3v3k5lMAfCLk,51
|
|
1198
|
+
anyscale-0.26.69.dist-info/top_level.txt,sha256=g3NVNS8Oh0NZwbFFgeX696C5MZZkS5dqV2NqcsbDRJE,9
|
|
1199
|
+
anyscale-0.26.69.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|