anyscale 0.24.88__py3-none-any.whl → 0.25.5__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (148) hide show
  1. anyscale/__init__.py +56 -0
  2. anyscale/_private/anyscale_client/anyscale_client.py +179 -28
  3. anyscale/_private/anyscale_client/common.py +109 -2
  4. anyscale/_private/anyscale_client/fake_anyscale_client.py +239 -1
  5. anyscale/_private/docgen/README.md +1 -1
  6. anyscale/_private/docgen/__main__.py +71 -21
  7. anyscale/_private/docgen/api.md +13 -20
  8. anyscale/_private/docgen/generator.py +3 -2
  9. anyscale/_private/docgen/models.md +4 -49
  10. anyscale/_private/workload/workload_config.py +21 -7
  11. anyscale/aggregated_instance_usage/__init__.py +1 -1
  12. anyscale/aggregated_instance_usage/commands.py +2 -4
  13. anyscale/aggregated_instance_usage/models.py +8 -8
  14. anyscale/client/README.md +25 -22
  15. anyscale/client/openapi_client/__init__.py +16 -14
  16. anyscale/client/openapi_client/api/default_api.py +1139 -959
  17. anyscale/client/openapi_client/models/__init__.py +16 -14
  18. anyscale/client/openapi_client/models/baseimagesenum.py +43 -1
  19. anyscale/client/openapi_client/models/{session_event_types.py → cloud_deployment_config.py} +35 -24
  20. anyscale/client/openapi_client/models/{platformfinetuningjob_response.py → clouddeploymentconfig_response.py} +11 -11
  21. anyscale/client/openapi_client/models/{log_level_types.py → cluster_event_source.py} +12 -7
  22. anyscale/client/openapi_client/models/{company_size.py → cluster_size.py} +10 -10
  23. anyscale/client/openapi_client/models/cluster_status_details.py +2 -1
  24. anyscale/client/openapi_client/models/{sessionevent_list_response.py → clusterevent_list_response.py} +15 -15
  25. anyscale/client/openapi_client/models/create_experimental_workspace.py +29 -1
  26. anyscale/client/openapi_client/models/create_notification_channel_record.py +29 -3
  27. anyscale/client/openapi_client/models/decorated_interactive_session.py +1 -57
  28. anyscale/client/openapi_client/models/decorated_job.py +1 -57
  29. anyscale/client/openapi_client/models/decorated_job_submission.py +1 -29
  30. anyscale/client/openapi_client/models/decorated_production_job.py +1 -29
  31. anyscale/client/openapi_client/models/decorated_session.py +1 -57
  32. anyscale/client/openapi_client/models/decorated_unified_job.py +1 -30
  33. anyscale/client/openapi_client/models/{resubmit_ft_job_request.py → describe_machine_pool_request.py} +21 -20
  34. anyscale/client/openapi_client/models/describe_machine_pool_response.py +123 -0
  35. anyscale/client/openapi_client/models/describemachinepoolresponse_response.py +121 -0
  36. anyscale/client/openapi_client/models/ha_jobs_sort_field.py +1 -2
  37. anyscale/client/openapi_client/models/internal_production_job.py +1 -29
  38. anyscale/client/openapi_client/models/jobs_sort_field.py +1 -2
  39. anyscale/client/openapi_client/models/machine_allocation_state.py +3 -1
  40. anyscale/client/openapi_client/models/machine_state_info.py +326 -0
  41. anyscale/client/openapi_client/models/{fine_tuning_job_status.py → notification_channel_slack_config.py} +34 -16
  42. anyscale/client/openapi_client/models/organization_marketing_questions.py +80 -54
  43. anyscale/client/openapi_client/models/request_state_info.py +210 -0
  44. anyscale/client/openapi_client/models/{platformfinetuningjob_list_response.py → scheduler_info.py} +43 -38
  45. anyscale/client/openapi_client/models/serve_deployment_fast_api_docs_status.py +123 -0
  46. anyscale/client/openapi_client/models/serve_deployment_state.py +2 -1
  47. anyscale/client/openapi_client/models/servedeploymentfastapidocsstatus_response.py +121 -0
  48. anyscale/client/openapi_client/models/sessions_sort_field.py +1 -2
  49. anyscale/client/openapi_client/models/supportedbaseimagesenum.py +43 -1
  50. anyscale/client/openapi_client/models/unified_job_sort_field.py +1 -2
  51. anyscale/client/openapi_client/models/update_cloud_collaborator.py +121 -0
  52. anyscale/client/openapi_client/models/usage_by_cluster.py +28 -1
  53. anyscale/client/openapi_client/models/usage_by_user.py +30 -3
  54. anyscale/client/openapi_client/models/workload_info.py +210 -0
  55. anyscale/cloud/__init__.py +83 -0
  56. anyscale/cloud/_private/cloud_sdk.py +25 -0
  57. anyscale/cloud/commands.py +45 -0
  58. anyscale/cloud/models.py +91 -0
  59. anyscale/cluster_compute.py +1 -1
  60. anyscale/commands/aggregated_instance_usage_commands.py +4 -4
  61. anyscale/commands/cloud_commands.py +87 -14
  62. anyscale/commands/command_examples.py +65 -0
  63. anyscale/commands/job_commands.py +15 -3
  64. anyscale/commands/machine_pool_commands.py +113 -1
  65. anyscale/commands/organization_invitation_commands.py +98 -0
  66. anyscale/commands/project_commands.py +52 -2
  67. anyscale/commands/resource_quota_commands.py +98 -11
  68. anyscale/commands/service_account_commands.py +65 -8
  69. anyscale/commands/service_commands.py +61 -1
  70. anyscale/commands/session_commands_hidden.py +5 -1
  71. anyscale/commands/user_commands.py +1 -1
  72. anyscale/commands/util.py +2 -2
  73. anyscale/commands/workspace_commands.py +1 -1
  74. anyscale/connect.py +1 -1
  75. anyscale/connect_utils/project.py +7 -4
  76. anyscale/controllers/cloud_controller.py +63 -30
  77. anyscale/controllers/cloud_functional_verification_controller.py +1 -1
  78. anyscale/controllers/cluster_controller.py +3 -11
  79. anyscale/controllers/compute_config_controller.py +1 -1
  80. anyscale/controllers/experimental_integrations_controller.py +1 -1
  81. anyscale/controllers/job_controller.py +8 -6
  82. anyscale/controllers/list_controller.py +2 -2
  83. anyscale/controllers/machine_pool_controller.py +12 -1
  84. anyscale/controllers/project_controller.py +4 -3
  85. anyscale/controllers/schedule_controller.py +1 -1
  86. anyscale/controllers/service_controller.py +1 -1
  87. anyscale/controllers/workspace_controller.py +1 -1
  88. anyscale/models/job_model.py +1 -1
  89. anyscale/organization_invitation/__init__.py +61 -0
  90. anyscale/organization_invitation/_private/organization_invitation_sdk.py +24 -0
  91. anyscale/organization_invitation/commands.py +84 -0
  92. anyscale/organization_invitation/models.py +45 -0
  93. anyscale/project/__init__.py +35 -0
  94. anyscale/project/_private/project_sdk.py +27 -0
  95. anyscale/project/commands.py +56 -0
  96. anyscale/project/models.py +91 -0
  97. anyscale/{project.py → project_utils.py} +3 -4
  98. anyscale/resource_quota/__init__.py +99 -0
  99. anyscale/resource_quota/_private/resource_quota_sdk.py +120 -0
  100. anyscale/resource_quota/commands.py +150 -0
  101. anyscale/resource_quota/models.py +303 -0
  102. anyscale/scripts.py +4 -0
  103. anyscale/sdk/anyscale_client/__init__.py +0 -5
  104. anyscale/sdk/anyscale_client/api/default_api.py +119 -150
  105. anyscale/sdk/anyscale_client/models/__init__.py +0 -5
  106. anyscale/sdk/anyscale_client/models/baseimagesenum.py +43 -1
  107. anyscale/sdk/anyscale_client/models/cluster_status_details.py +2 -1
  108. anyscale/sdk/anyscale_client/models/jobs_sort_field.py +1 -2
  109. anyscale/sdk/anyscale_client/models/supportedbaseimagesenum.py +43 -1
  110. anyscale/sdk/anyscale_client/sdk.py +1 -1
  111. anyscale/service/__init__.py +21 -0
  112. anyscale/service/_private/service_sdk.py +13 -0
  113. anyscale/service/commands.py +35 -0
  114. anyscale/service_account/__init__.py +88 -0
  115. anyscale/service_account/_private/service_account_sdk.py +101 -0
  116. anyscale/service_account/commands.py +147 -0
  117. anyscale/service_account/models.py +66 -0
  118. anyscale/shared_anyscale_utils/latest_ray_version.py +1 -1
  119. anyscale/shared_anyscale_utils/utils/id_gen.py +2 -0
  120. anyscale/user/__init__.py +1 -1
  121. anyscale/user/commands.py +1 -1
  122. anyscale/user/models.py +25 -15
  123. anyscale/util.py +23 -0
  124. anyscale/utils/cloud_utils.py +1 -1
  125. anyscale/version.py +1 -1
  126. anyscale/workspace_utils.py +1 -1
  127. {anyscale-0.24.88.dist-info → anyscale-0.25.5.dist-info}/METADATA +1 -5
  128. {anyscale-0.24.88.dist-info → anyscale-0.25.5.dist-info}/RECORD +134 -119
  129. anyscale/client/openapi_client/models/create_fine_tuning_hyperparameters.py +0 -156
  130. anyscale/client/openapi_client/models/create_fine_tuning_job_product_request.py +0 -353
  131. anyscale/client/openapi_client/models/finish_ft_job_request.py +0 -204
  132. anyscale/client/openapi_client/models/platform_fine_tuning_job.py +0 -577
  133. anyscale/client/openapi_client/models/session_event.py +0 -267
  134. anyscale/client/openapi_client/models/session_event_cause.py +0 -150
  135. anyscale/controllers/resource_quota_controller.py +0 -183
  136. anyscale/controllers/service_account_controller.py +0 -168
  137. anyscale/sdk/anyscale_client/models/log_level_types.py +0 -100
  138. anyscale/sdk/anyscale_client/models/session_event.py +0 -267
  139. anyscale/sdk/anyscale_client/models/session_event_cause.py +0 -150
  140. anyscale/sdk/anyscale_client/models/session_event_types.py +0 -111
  141. anyscale/sdk/anyscale_client/models/sessionevent_list_response.py +0 -147
  142. anyscale/utils/imports/azure.py +0 -14
  143. /anyscale/{cloud.py → cloud_utils.py} +0 -0
  144. {anyscale-0.24.88.dist-info → anyscale-0.25.5.dist-info}/LICENSE +0 -0
  145. {anyscale-0.24.88.dist-info → anyscale-0.25.5.dist-info}/NOTICE +0 -0
  146. {anyscale-0.24.88.dist-info → anyscale-0.25.5.dist-info}/WHEEL +0 -0
  147. {anyscale-0.24.88.dist-info → anyscale-0.25.5.dist-info}/entry_points.txt +0 -0
  148. {anyscale-0.24.88.dist-info → anyscale-0.25.5.dist-info}/top_level.txt +0 -0
@@ -1,267 +0,0 @@
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 SessionEvent(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
- 'event_type': 'str',
37
- 'log_level': 'LogLevelTypes',
38
- 'timestamp': 'datetime',
39
- 'description': 'str',
40
- 'cause': 'SessionEventCause',
41
- 'id': 'str'
42
- }
43
-
44
- attribute_map = {
45
- 'event_type': 'event_type',
46
- 'log_level': 'log_level',
47
- 'timestamp': 'timestamp',
48
- 'description': 'description',
49
- 'cause': 'cause',
50
- 'id': 'id'
51
- }
52
-
53
- def __init__(self, event_type=None, log_level=None, timestamp=None, description=None, cause=None, id=None, local_vars_configuration=None): # noqa: E501
54
- """SessionEvent - a model defined in OpenAPI""" # noqa: E501
55
- if local_vars_configuration is None:
56
- local_vars_configuration = Configuration()
57
- self.local_vars_configuration = local_vars_configuration
58
-
59
- self._event_type = None
60
- self._log_level = None
61
- self._timestamp = None
62
- self._description = None
63
- self._cause = None
64
- self._id = None
65
- self.discriminator = None
66
-
67
- self.event_type = event_type
68
- self.log_level = log_level
69
- self.timestamp = timestamp
70
- self.description = description
71
- if cause is not None:
72
- self.cause = cause
73
- self.id = id
74
-
75
- @property
76
- def event_type(self):
77
- """Gets the event_type of this SessionEvent. # noqa: E501
78
-
79
- The category of session event. # noqa: E501
80
-
81
- :return: The event_type of this SessionEvent. # noqa: E501
82
- :rtype: str
83
- """
84
- return self._event_type
85
-
86
- @event_type.setter
87
- def event_type(self, event_type):
88
- """Sets the event_type of this SessionEvent.
89
-
90
- The category of session event. # noqa: E501
91
-
92
- :param event_type: The event_type of this SessionEvent. # noqa: E501
93
- :type: str
94
- """
95
- if self.local_vars_configuration.client_side_validation and event_type is None: # noqa: E501
96
- raise ValueError("Invalid value for `event_type`, must not be `None`") # noqa: E501
97
-
98
- self._event_type = event_type
99
-
100
- @property
101
- def log_level(self):
102
- """Gets the log_level of this SessionEvent. # noqa: E501
103
-
104
- The severity of the session event. # noqa: E501
105
-
106
- :return: The log_level of this SessionEvent. # noqa: E501
107
- :rtype: LogLevelTypes
108
- """
109
- return self._log_level
110
-
111
- @log_level.setter
112
- def log_level(self, log_level):
113
- """Sets the log_level of this SessionEvent.
114
-
115
- The severity of the session event. # noqa: E501
116
-
117
- :param log_level: The log_level of this SessionEvent. # noqa: E501
118
- :type: LogLevelTypes
119
- """
120
- if self.local_vars_configuration.client_side_validation and log_level is None: # noqa: E501
121
- raise ValueError("Invalid value for `log_level`, must not be `None`") # noqa: E501
122
-
123
- self._log_level = log_level
124
-
125
- @property
126
- def timestamp(self):
127
- """Gets the timestamp of this SessionEvent. # noqa: E501
128
-
129
- The time at which the session event occurred. # noqa: E501
130
-
131
- :return: The timestamp of this SessionEvent. # noqa: E501
132
- :rtype: datetime
133
- """
134
- return self._timestamp
135
-
136
- @timestamp.setter
137
- def timestamp(self, timestamp):
138
- """Sets the timestamp of this SessionEvent.
139
-
140
- The time at which the session event occurred. # noqa: E501
141
-
142
- :param timestamp: The timestamp of this SessionEvent. # noqa: E501
143
- :type: datetime
144
- """
145
- if self.local_vars_configuration.client_side_validation and timestamp is None: # noqa: E501
146
- raise ValueError("Invalid value for `timestamp`, must not be `None`") # noqa: E501
147
-
148
- self._timestamp = timestamp
149
-
150
- @property
151
- def description(self):
152
- """Gets the description of this SessionEvent. # noqa: E501
153
-
154
- A human readable description of the session event. # noqa: E501
155
-
156
- :return: The description of this SessionEvent. # noqa: E501
157
- :rtype: str
158
- """
159
- return self._description
160
-
161
- @description.setter
162
- def description(self, description):
163
- """Sets the description of this SessionEvent.
164
-
165
- A human readable description of the session event. # noqa: E501
166
-
167
- :param description: The description of this SessionEvent. # noqa: E501
168
- :type: str
169
- """
170
- if self.local_vars_configuration.client_side_validation and description is None: # noqa: E501
171
- raise ValueError("Invalid value for `description`, must not be `None`") # noqa: E501
172
-
173
- self._description = description
174
-
175
- @property
176
- def cause(self):
177
- """Gets the cause of this SessionEvent. # noqa: E501
178
-
179
- The reason why the session event occurred. None indicates an unknown cause. # noqa: E501
180
-
181
- :return: The cause of this SessionEvent. # noqa: E501
182
- :rtype: SessionEventCause
183
- """
184
- return self._cause
185
-
186
- @cause.setter
187
- def cause(self, cause):
188
- """Sets the cause of this SessionEvent.
189
-
190
- The reason why the session event occurred. None indicates an unknown cause. # noqa: E501
191
-
192
- :param cause: The cause of this SessionEvent. # noqa: E501
193
- :type: SessionEventCause
194
- """
195
-
196
- self._cause = cause
197
-
198
- @property
199
- def id(self):
200
- """Gets the id of this SessionEvent. # noqa: E501
201
-
202
- A unique identifier for the session event. # noqa: E501
203
-
204
- :return: The id of this SessionEvent. # noqa: E501
205
- :rtype: str
206
- """
207
- return self._id
208
-
209
- @id.setter
210
- def id(self, id):
211
- """Sets the id of this SessionEvent.
212
-
213
- A unique identifier for the session event. # noqa: E501
214
-
215
- :param id: The id of this SessionEvent. # noqa: E501
216
- :type: str
217
- """
218
- if self.local_vars_configuration.client_side_validation and id is None: # noqa: E501
219
- raise ValueError("Invalid value for `id`, must not be `None`") # noqa: E501
220
-
221
- self._id = id
222
-
223
- def to_dict(self):
224
- """Returns the model properties as a dict"""
225
- result = {}
226
-
227
- for attr, _ in six.iteritems(self.openapi_types):
228
- value = getattr(self, attr)
229
- if isinstance(value, list):
230
- result[attr] = list(map(
231
- lambda x: x.to_dict() if hasattr(x, "to_dict") else x,
232
- value
233
- ))
234
- elif hasattr(value, "to_dict"):
235
- result[attr] = value.to_dict()
236
- elif isinstance(value, dict):
237
- result[attr] = dict(map(
238
- lambda item: (item[0], item[1].to_dict())
239
- if hasattr(item[1], "to_dict") else item,
240
- value.items()
241
- ))
242
- else:
243
- result[attr] = value
244
-
245
- return result
246
-
247
- def to_str(self):
248
- """Returns the string representation of the model"""
249
- return pprint.pformat(self.to_dict())
250
-
251
- def __repr__(self):
252
- """For `print` and `pprint`"""
253
- return self.to_str()
254
-
255
- def __eq__(self, other):
256
- """Returns true if both objects are equal"""
257
- if not isinstance(other, SessionEvent):
258
- return False
259
-
260
- return self.to_dict() == other.to_dict()
261
-
262
- def __ne__(self, other):
263
- """Returns true if both objects are not equal"""
264
- if not isinstance(other, SessionEvent):
265
- return True
266
-
267
- return self.to_dict() != other.to_dict()
@@ -1,150 +0,0 @@
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 SessionEventCause(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
- 'cause_user': 'str',
37
- 'cause_system': 'str'
38
- }
39
-
40
- attribute_map = {
41
- 'cause_user': 'cause_user',
42
- 'cause_system': 'cause_system'
43
- }
44
-
45
- def __init__(self, cause_user=None, cause_system=None, local_vars_configuration=None): # noqa: E501
46
- """SessionEventCause - a model defined in OpenAPI""" # noqa: E501
47
- if local_vars_configuration is None:
48
- local_vars_configuration = Configuration()
49
- self.local_vars_configuration = local_vars_configuration
50
-
51
- self._cause_user = None
52
- self._cause_system = None
53
- self.discriminator = None
54
-
55
- if cause_user is not None:
56
- self.cause_user = cause_user
57
- if cause_system is not None:
58
- self.cause_system = cause_system
59
-
60
- @property
61
- def cause_user(self):
62
- """Gets the cause_user of this SessionEventCause. # noqa: E501
63
-
64
- The username of the user who caused the session event. # noqa: E501
65
-
66
- :return: The cause_user of this SessionEventCause. # noqa: E501
67
- :rtype: str
68
- """
69
- return self._cause_user
70
-
71
- @cause_user.setter
72
- def cause_user(self, cause_user):
73
- """Sets the cause_user of this SessionEventCause.
74
-
75
- The username of the user who caused the session event. # noqa: E501
76
-
77
- :param cause_user: The cause_user of this SessionEventCause. # noqa: E501
78
- :type: str
79
- """
80
-
81
- self._cause_user = cause_user
82
-
83
- @property
84
- def cause_system(self):
85
- """Gets the cause_system of this SessionEventCause. # noqa: E501
86
-
87
- The name of the internal anyscale system that caused the session event. # noqa: E501
88
-
89
- :return: The cause_system of this SessionEventCause. # noqa: E501
90
- :rtype: str
91
- """
92
- return self._cause_system
93
-
94
- @cause_system.setter
95
- def cause_system(self, cause_system):
96
- """Sets the cause_system of this SessionEventCause.
97
-
98
- The name of the internal anyscale system that caused the session event. # noqa: E501
99
-
100
- :param cause_system: The cause_system of this SessionEventCause. # noqa: E501
101
- :type: str
102
- """
103
-
104
- self._cause_system = cause_system
105
-
106
- def to_dict(self):
107
- """Returns the model properties as a dict"""
108
- result = {}
109
-
110
- for attr, _ in six.iteritems(self.openapi_types):
111
- value = getattr(self, attr)
112
- if isinstance(value, list):
113
- result[attr] = list(map(
114
- lambda x: x.to_dict() if hasattr(x, "to_dict") else x,
115
- value
116
- ))
117
- elif hasattr(value, "to_dict"):
118
- result[attr] = value.to_dict()
119
- elif isinstance(value, dict):
120
- result[attr] = dict(map(
121
- lambda item: (item[0], item[1].to_dict())
122
- if hasattr(item[1], "to_dict") else item,
123
- value.items()
124
- ))
125
- else:
126
- result[attr] = value
127
-
128
- return result
129
-
130
- def to_str(self):
131
- """Returns the string representation of the model"""
132
- return pprint.pformat(self.to_dict())
133
-
134
- def __repr__(self):
135
- """For `print` and `pprint`"""
136
- return self.to_str()
137
-
138
- def __eq__(self, other):
139
- """Returns true if both objects are equal"""
140
- if not isinstance(other, SessionEventCause):
141
- return False
142
-
143
- return self.to_dict() == other.to_dict()
144
-
145
- def __ne__(self, other):
146
- """Returns true if both objects are not equal"""
147
- if not isinstance(other, SessionEventCause):
148
- return True
149
-
150
- return self.to_dict() != other.to_dict()
@@ -1,183 +0,0 @@
1
- from typing import Dict, List, Optional
2
-
3
- import tabulate
4
-
5
- from anyscale.cli_logger import LogsLogger
6
- from anyscale.client.openapi_client.models.create_resource_quota import (
7
- CreateResourceQuota,
8
- )
9
- from anyscale.client.openapi_client.models.list_resource_quotas_query import (
10
- ListResourceQuotasQuery,
11
- )
12
- from anyscale.client.openapi_client.models.quota import Quota
13
- from anyscale.client.openapi_client.models.resource_quota import ResourceQuota
14
- from anyscale.client.openapi_client.models.resource_quota_status import (
15
- ResourceQuotaStatus,
16
- )
17
- from anyscale.cloud import get_cloud_id_and_name
18
- from anyscale.controllers.base_controller import BaseController
19
- from anyscale.project import get_project_id_for_cloud_from_name
20
- from anyscale.sdk.anyscale_client.models.page_query import PageQuery
21
- from anyscale.sdk.anyscale_client.models.text_query import TextQuery
22
- from anyscale.utils.user_utils import get_user_id_by_email
23
-
24
-
25
- class ResourceQuotaController(BaseController):
26
- def __init__(self):
27
- super().__init__()
28
- self.log = LogsLogger()
29
-
30
- def create( # noqa: PLR0913
31
- self,
32
- name: str,
33
- cloud: str,
34
- project: Optional[str] = None,
35
- user_email: Optional[str] = None,
36
- num_cpus: Optional[int] = None,
37
- num_instances: Optional[int] = None,
38
- num_gpus: Optional[int] = None,
39
- num_accelerators: Optional[Dict[str, int]] = None,
40
- ) -> str:
41
-
42
- cloud_id, _ = get_cloud_id_and_name(self.api_client, cloud_name=cloud)
43
- project_id = (
44
- get_project_id_for_cloud_from_name(
45
- project, cloud_id, self.api_client, self.anyscale_api_client
46
- )
47
- if project
48
- else None
49
- )
50
- user_id = (
51
- get_user_id_by_email(self.api_client, user_email) if user_email else None
52
- )
53
-
54
- create_resource_quota = CreateResourceQuota(
55
- name=name,
56
- cloud_id=cloud_id,
57
- project_id=project_id,
58
- user_id=user_id,
59
- quota=Quota(
60
- num_cpus=num_cpus,
61
- num_instances=num_instances,
62
- num_gpus=num_gpus,
63
- num_accelerators=num_accelerators,
64
- ),
65
- )
66
-
67
- with self.log.spinner("Creating resource quota..."):
68
- resource_quota_id = self.api_client.create_resource_quota_api_v2_resource_quotas_post(
69
- create_resource_quota
70
- ).result.id
71
-
72
- create_resource_quota_message = [f"Name: {name}\nCloud name: {cloud}"]
73
- if project:
74
- create_resource_quota_message.append(f"Project name: {project}")
75
- if user_email:
76
- create_resource_quota_message.append(f"User email: {user_email}")
77
- if num_cpus:
78
- create_resource_quota_message.append(f"Number of CPUs: {num_cpus}")
79
- if num_instances:
80
- create_resource_quota_message.append(
81
- f"Number of instances: {num_instances}"
82
- )
83
- if num_gpus:
84
- create_resource_quota_message.append(f"Number of GPUs: {num_gpus}")
85
- if num_accelerators:
86
- create_resource_quota_message.append(
87
- f"Number of accelerators: {dict(num_accelerators)}"
88
- )
89
-
90
- self.log.info("\n".join(create_resource_quota_message))
91
- self.log.info(f"Resource quota created successfully ID: {resource_quota_id}")
92
-
93
- return resource_quota_id
94
-
95
- def _format_resource_quotas(self, resource_quotas: List[ResourceQuota]) -> str:
96
- table_rows = []
97
- for resource_quota in resource_quotas:
98
- table_rows.append(
99
- [
100
- resource_quota.id,
101
- resource_quota.name,
102
- resource_quota.cloud_id,
103
- resource_quota.project_id,
104
- resource_quota.user_id,
105
- resource_quota.is_enabled,
106
- resource_quota.created_at.strftime("%m/%d/%Y"),
107
- resource_quota.deleted_at.strftime("%m/%d/%Y")
108
- if resource_quota.deleted_at
109
- else None,
110
- resource_quota.quota,
111
- ]
112
- )
113
- table = tabulate.tabulate(
114
- table_rows,
115
- headers=[
116
- "ID",
117
- "NAME",
118
- "CLOUD ID",
119
- "PROJECT ID",
120
- "USER ID",
121
- "IS ENABLED",
122
- "CREATED AT",
123
- "DELETED AT",
124
- "QUOTA",
125
- ],
126
- tablefmt="plain",
127
- )
128
-
129
- return f"Resource quotas:\n{table}"
130
-
131
- def list_resource_quotas(
132
- self,
133
- *,
134
- name: Optional[str] = None,
135
- cloud: Optional[str] = None,
136
- creator_id: Optional[str] = None,
137
- is_enabled: Optional[bool] = None,
138
- max_items: int = 20,
139
- ) -> List[ResourceQuota]:
140
- cloud_id, _ = (
141
- get_cloud_id_and_name(self.api_client, cloud_name=cloud)
142
- if cloud
143
- else (None, None)
144
- )
145
-
146
- resource_quotas = self.api_client.search_resource_quotas_api_v2_resource_quotas_search_post(
147
- ListResourceQuotasQuery(
148
- name=TextQuery(equals=name) if name else None,
149
- cloud_id=cloud_id,
150
- creator_id=creator_id,
151
- is_enabled=is_enabled,
152
- paging=PageQuery(count=max_items),
153
- )
154
- ).results
155
-
156
- print(self._format_resource_quotas(resource_quotas))
157
- return resource_quotas
158
-
159
- def delete(self, resource_quota_id: str,) -> None:
160
- """
161
- Delete a resource quota.
162
- """
163
- with self.log.spinner("Deleting resource quota..."):
164
- self.api_client.delete_resource_quota_api_v2_resource_quotas_resource_quota_id_delete(
165
- resource_quota_id
166
- )
167
-
168
- self.log.info(
169
- f"Resource quota with ID {resource_quota_id} deleted successfully."
170
- )
171
-
172
- def set_status(self, resource_quota_id: str, *, is_enabled: bool,) -> None:
173
- """
174
- Set the status of a resource quota.
175
- """
176
- with self.log.spinner("Setting resource quota status..."):
177
- self.api_client.set_resource_quota_status_api_v2_resource_quotas_resource_quota_id_status_patch(
178
- resource_quota_id, ResourceQuotaStatus(is_enabled=is_enabled)
179
- )
180
-
181
- self.log.info(
182
- f"{'Enabled' if is_enabled else 'Disabled'} resource quota with ID {resource_quota_id} successfully."
183
- )