anyscale 0.26.69__py3-none-any.whl → 0.26.70__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 (67) hide show
  1. anyscale/_private/anyscale_client/anyscale_client.py +67 -1
  2. anyscale/_private/anyscale_client/common.py +20 -1
  3. anyscale/_private/anyscale_client/fake_anyscale_client.py +77 -10
  4. anyscale/client/README.md +14 -4
  5. anyscale/client/openapi_client/__init__.py +11 -4
  6. anyscale/client/openapi_client/api/default_api.py +462 -23
  7. anyscale/client/openapi_client/models/__init__.py +11 -4
  8. anyscale/client/openapi_client/models/api_key_info.py +29 -3
  9. anyscale/client/openapi_client/models/apply_autoscaling_config_update_model.py +350 -0
  10. anyscale/client/openapi_client/models/apply_production_service_multi_version_v2_model.py +207 -0
  11. anyscale/client/openapi_client/models/apply_production_service_v2_model.py +31 -3
  12. anyscale/client/openapi_client/models/baseimagesenum.py +70 -1
  13. anyscale/client/openapi_client/models/cloud_data_bucket_file_type.py +2 -1
  14. anyscale/client/openapi_client/models/{oauthconnectionresponse_response.py → clouddeployment_response.py} +11 -11
  15. anyscale/client/openapi_client/models/create_experimental_workspace.py +29 -1
  16. anyscale/client/openapi_client/models/create_workspace_from_template.py +29 -1
  17. anyscale/client/openapi_client/models/create_workspace_template_version.py +31 -3
  18. anyscale/client/openapi_client/models/decorated_list_service_api_model.py +58 -1
  19. anyscale/client/openapi_client/models/decorated_production_service_v2_api_model.py +60 -3
  20. anyscale/client/openapi_client/models/decorated_service_event_api_model.py +3 -3
  21. anyscale/client/openapi_client/models/describe_machine_pool_machines_filters.py +33 -5
  22. anyscale/client/openapi_client/models/describe_machine_pool_workloads_filters.py +33 -5
  23. anyscale/client/openapi_client/models/{service_event_level.py → entity_type.py} +9 -9
  24. anyscale/client/openapi_client/models/event_level.py +2 -1
  25. anyscale/client/openapi_client/models/job_event_fields.py +206 -0
  26. anyscale/client/openapi_client/models/machine_type_partition_filter.py +152 -0
  27. anyscale/client/openapi_client/models/partition_info.py +30 -1
  28. anyscale/client/openapi_client/models/production_job_event.py +3 -3
  29. anyscale/client/openapi_client/models/rollout_strategy.py +2 -1
  30. anyscale/client/openapi_client/models/service_event_fields.py +318 -0
  31. anyscale/client/openapi_client/models/supportedbaseimagesenum.py +70 -1
  32. anyscale/client/openapi_client/models/task_summary_config.py +29 -3
  33. anyscale/client/openapi_client/models/task_table_config.py +29 -3
  34. anyscale/client/openapi_client/models/unified_event.py +377 -0
  35. anyscale/client/openapi_client/models/{ha_job_event_level.py → unified_origin_filter.py} +21 -9
  36. anyscale/client/openapi_client/models/unifiedevent_list_response.py +147 -0
  37. anyscale/client/openapi_client/models/workspace_event_fields.py +122 -0
  38. anyscale/client/openapi_client/models/workspace_template_version.py +30 -1
  39. anyscale/client/openapi_client/models/workspace_template_version_data_object.py +30 -1
  40. anyscale/cloud/models.py +2 -2
  41. anyscale/commands/cloud_commands.py +133 -2
  42. anyscale/commands/job_commands.py +1 -1
  43. anyscale/commands/service_commands.py +130 -67
  44. anyscale/commands/setup_k8s.py +546 -31
  45. anyscale/controllers/cloud_controller.py +15 -2
  46. anyscale/controllers/kubernetes_verifier.py +80 -66
  47. anyscale/job/_private/job_sdk.py +47 -1
  48. anyscale/job/commands.py +3 -0
  49. anyscale/sdk/anyscale_client/models/apply_production_service_v2_model.py +31 -3
  50. anyscale/sdk/anyscale_client/models/apply_service_model.py +31 -3
  51. anyscale/sdk/anyscale_client/models/baseimagesenum.py +70 -1
  52. anyscale/sdk/anyscale_client/models/rollout_strategy.py +2 -1
  53. anyscale/sdk/anyscale_client/models/supportedbaseimagesenum.py +70 -1
  54. anyscale/service/__init__.py +11 -3
  55. anyscale/service/_private/service_sdk.py +361 -35
  56. anyscale/service/commands.py +15 -3
  57. anyscale/service/models.py +12 -0
  58. anyscale/shared_anyscale_utils/latest_ray_version.py +1 -1
  59. anyscale/version.py +1 -1
  60. {anyscale-0.26.69.dist-info → anyscale-0.26.70.dist-info}/METADATA +1 -1
  61. {anyscale-0.26.69.dist-info → anyscale-0.26.70.dist-info}/RECORD +66 -59
  62. anyscale/client/openapi_client/models/o_auth_connection_response.py +0 -229
  63. {anyscale-0.26.69.dist-info → anyscale-0.26.70.dist-info}/WHEEL +0 -0
  64. {anyscale-0.26.69.dist-info → anyscale-0.26.70.dist-info}/entry_points.txt +0 -0
  65. {anyscale-0.26.69.dist-info → anyscale-0.26.70.dist-info}/licenses/LICENSE +0 -0
  66. {anyscale-0.26.69.dist-info → anyscale-0.26.70.dist-info}/licenses/NOTICE +0 -0
  67. {anyscale-0.26.69.dist-info → anyscale-0.26.70.dist-info}/top_level.txt +0 -0
@@ -18,7 +18,7 @@ import six
18
18
  from openapi_client.configuration import Configuration
19
19
 
20
20
 
21
- class ServiceEventLevel(object):
21
+ class EntityType(object):
22
22
  """NOTE: This class is auto generated by OpenAPI Generator.
23
23
  Ref: https://openapi-generator.tech
24
24
 
@@ -28,12 +28,12 @@ class ServiceEventLevel(object):
28
28
  """
29
29
  allowed enum values
30
30
  """
31
- ERROR = "ERROR"
32
- INFO = "INFO"
33
- WARNING = "WARNING"
34
- TRACE = "TRACE"
31
+ PRODUCTION_JOB = "production_job"
32
+ WORKSPACE = "workspace"
33
+ SERVICE = "service"
34
+ SESSION = "session"
35
35
 
36
- allowable_values = [ERROR, INFO, WARNING, TRACE] # noqa: E501
36
+ allowable_values = [PRODUCTION_JOB, WORKSPACE, SERVICE, SESSION] # noqa: E501
37
37
 
38
38
  """
39
39
  Attributes:
@@ -49,7 +49,7 @@ class ServiceEventLevel(object):
49
49
  }
50
50
 
51
51
  def __init__(self, local_vars_configuration=None): # noqa: E501
52
- """ServiceEventLevel - a model defined in OpenAPI""" # noqa: E501
52
+ """EntityType - a model defined in OpenAPI""" # noqa: E501
53
53
  if local_vars_configuration is None:
54
54
  local_vars_configuration = Configuration()
55
55
  self.local_vars_configuration = local_vars_configuration
@@ -89,14 +89,14 @@ class ServiceEventLevel(object):
89
89
 
90
90
  def __eq__(self, other):
91
91
  """Returns true if both objects are equal"""
92
- if not isinstance(other, ServiceEventLevel):
92
+ if not isinstance(other, EntityType):
93
93
  return False
94
94
 
95
95
  return self.to_dict() == other.to_dict()
96
96
 
97
97
  def __ne__(self, other):
98
98
  """Returns true if both objects are not equal"""
99
- if not isinstance(other, ServiceEventLevel):
99
+ if not isinstance(other, EntityType):
100
100
  return True
101
101
 
102
102
  return self.to_dict() != other.to_dict()
@@ -33,9 +33,10 @@ class EventLevel(object):
33
33
  ERROR = "ERROR"
34
34
  TRACE = "TRACE"
35
35
  DEBUG = "DEBUG"
36
+ CRITICAL = "CRITICAL"
36
37
  UNKNOWN = "UNKNOWN"
37
38
 
38
- allowable_values = [INFO, WARNING, ERROR, TRACE, DEBUG, UNKNOWN] # noqa: E501
39
+ allowable_values = [INFO, WARNING, ERROR, TRACE, DEBUG, CRITICAL, UNKNOWN] # noqa: E501
39
40
 
40
41
  """
41
42
  Attributes:
@@ -0,0 +1,206 @@
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 JobEventFields(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
+ 'ha_job_id': 'str',
37
+ 'error_type': 'HaJobErrorTypes',
38
+ 'has_additional_sensitive_message': 'bool',
39
+ 'event_type': 'str'
40
+ }
41
+
42
+ attribute_map = {
43
+ 'ha_job_id': 'ha_job_id',
44
+ 'error_type': 'error_type',
45
+ 'has_additional_sensitive_message': 'has_additional_sensitive_message',
46
+ 'event_type': 'event_type'
47
+ }
48
+
49
+ def __init__(self, ha_job_id=None, error_type=None, has_additional_sensitive_message=False, event_type=None, local_vars_configuration=None): # noqa: E501
50
+ """JobEventFields - a model defined in OpenAPI""" # noqa: E501
51
+ if local_vars_configuration is None:
52
+ local_vars_configuration = Configuration()
53
+ self.local_vars_configuration = local_vars_configuration
54
+
55
+ self._ha_job_id = None
56
+ self._error_type = None
57
+ self._has_additional_sensitive_message = None
58
+ self._event_type = None
59
+ self.discriminator = None
60
+
61
+ if ha_job_id is not None:
62
+ self.ha_job_id = ha_job_id
63
+ if error_type is not None:
64
+ self.error_type = error_type
65
+ if has_additional_sensitive_message is not None:
66
+ self.has_additional_sensitive_message = has_additional_sensitive_message
67
+ if event_type is not None:
68
+ self.event_type = event_type
69
+
70
+ @property
71
+ def ha_job_id(self):
72
+ """Gets the ha_job_id of this JobEventFields. # noqa: E501
73
+
74
+ The id of the Job. # noqa: E501
75
+
76
+ :return: The ha_job_id of this JobEventFields. # noqa: E501
77
+ :rtype: str
78
+ """
79
+ return self._ha_job_id
80
+
81
+ @ha_job_id.setter
82
+ def ha_job_id(self, ha_job_id):
83
+ """Sets the ha_job_id of this JobEventFields.
84
+
85
+ The id of the Job. # noqa: E501
86
+
87
+ :param ha_job_id: The ha_job_id of this JobEventFields. # noqa: E501
88
+ :type: str
89
+ """
90
+
91
+ self._ha_job_id = ha_job_id
92
+
93
+ @property
94
+ def error_type(self):
95
+ """Gets the error_type of this JobEventFields. # noqa: E501
96
+
97
+ Type of Job error. Only populated for JOB type events that are in error state # noqa: E501
98
+
99
+ :return: The error_type of this JobEventFields. # noqa: E501
100
+ :rtype: HaJobErrorTypes
101
+ """
102
+ return self._error_type
103
+
104
+ @error_type.setter
105
+ def error_type(self, error_type):
106
+ """Sets the error_type of this JobEventFields.
107
+
108
+ Type of Job error. Only populated for JOB type events that are in error state # noqa: E501
109
+
110
+ :param error_type: The error_type of this JobEventFields. # noqa: E501
111
+ :type: HaJobErrorTypes
112
+ """
113
+
114
+ self._error_type = error_type
115
+
116
+ @property
117
+ def has_additional_sensitive_message(self):
118
+ """Gets the has_additional_sensitive_message of this JobEventFields. # noqa: E501
119
+
120
+ Whether we have additional sensitive message details stored that can be subsequently fetched. # noqa: E501
121
+
122
+ :return: The has_additional_sensitive_message of this JobEventFields. # noqa: E501
123
+ :rtype: bool
124
+ """
125
+ return self._has_additional_sensitive_message
126
+
127
+ @has_additional_sensitive_message.setter
128
+ def has_additional_sensitive_message(self, has_additional_sensitive_message):
129
+ """Sets the has_additional_sensitive_message of this JobEventFields.
130
+
131
+ Whether we have additional sensitive message details stored that can be subsequently fetched. # noqa: E501
132
+
133
+ :param has_additional_sensitive_message: The has_additional_sensitive_message of this JobEventFields. # noqa: E501
134
+ :type: bool
135
+ """
136
+
137
+ self._has_additional_sensitive_message = has_additional_sensitive_message
138
+
139
+ @property
140
+ def event_type(self):
141
+ """Gets the event_type of this JobEventFields. # noqa: E501
142
+
143
+ Type of job event # noqa: E501
144
+
145
+ :return: The event_type of this JobEventFields. # noqa: E501
146
+ :rtype: str
147
+ """
148
+ return self._event_type
149
+
150
+ @event_type.setter
151
+ def event_type(self, event_type):
152
+ """Sets the event_type of this JobEventFields.
153
+
154
+ Type of job event # noqa: E501
155
+
156
+ :param event_type: The event_type of this JobEventFields. # noqa: E501
157
+ :type: str
158
+ """
159
+
160
+ self._event_type = event_type
161
+
162
+ def to_dict(self):
163
+ """Returns the model properties as a dict"""
164
+ result = {}
165
+
166
+ for attr, _ in six.iteritems(self.openapi_types):
167
+ value = getattr(self, attr)
168
+ if isinstance(value, list):
169
+ result[attr] = list(map(
170
+ lambda x: x.to_dict() if hasattr(x, "to_dict") else x,
171
+ value
172
+ ))
173
+ elif hasattr(value, "to_dict"):
174
+ result[attr] = value.to_dict()
175
+ elif isinstance(value, dict):
176
+ result[attr] = dict(map(
177
+ lambda item: (item[0], item[1].to_dict())
178
+ if hasattr(item[1], "to_dict") else item,
179
+ value.items()
180
+ ))
181
+ else:
182
+ result[attr] = value
183
+
184
+ return result
185
+
186
+ def to_str(self):
187
+ """Returns the string representation of the model"""
188
+ return pprint.pformat(self.to_dict())
189
+
190
+ def __repr__(self):
191
+ """For `print` and `pprint`"""
192
+ return self.to_str()
193
+
194
+ def __eq__(self, other):
195
+ """Returns true if both objects are equal"""
196
+ if not isinstance(other, JobEventFields):
197
+ return False
198
+
199
+ return self.to_dict() == other.to_dict()
200
+
201
+ def __ne__(self, other):
202
+ """Returns true if both objects are not equal"""
203
+ if not isinstance(other, JobEventFields):
204
+ return True
205
+
206
+ return self.to_dict() != other.to_dict()
@@ -0,0 +1,152 @@
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 MachineTypePartitionFilter(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
+ 'machine_type': 'str',
37
+ 'partition': 'str'
38
+ }
39
+
40
+ attribute_map = {
41
+ 'machine_type': 'machine_type',
42
+ 'partition': 'partition'
43
+ }
44
+
45
+ def __init__(self, machine_type=None, partition=None, local_vars_configuration=None): # noqa: E501
46
+ """MachineTypePartitionFilter - 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._machine_type = None
52
+ self._partition = None
53
+ self.discriminator = None
54
+
55
+ self.machine_type = machine_type
56
+ self.partition = partition
57
+
58
+ @property
59
+ def machine_type(self):
60
+ """Gets the machine_type of this MachineTypePartitionFilter. # noqa: E501
61
+
62
+ The machine type to filter by. # noqa: E501
63
+
64
+ :return: The machine_type of this MachineTypePartitionFilter. # noqa: E501
65
+ :rtype: str
66
+ """
67
+ return self._machine_type
68
+
69
+ @machine_type.setter
70
+ def machine_type(self, machine_type):
71
+ """Sets the machine_type of this MachineTypePartitionFilter.
72
+
73
+ The machine type to filter by. # noqa: E501
74
+
75
+ :param machine_type: The machine_type of this MachineTypePartitionFilter. # noqa: E501
76
+ :type: str
77
+ """
78
+ if self.local_vars_configuration.client_side_validation and machine_type is None: # noqa: E501
79
+ raise ValueError("Invalid value for `machine_type`, must not be `None`") # noqa: E501
80
+
81
+ self._machine_type = machine_type
82
+
83
+ @property
84
+ def partition(self):
85
+ """Gets the partition of this MachineTypePartitionFilter. # noqa: E501
86
+
87
+ The partition to filter by. # noqa: E501
88
+
89
+ :return: The partition of this MachineTypePartitionFilter. # noqa: E501
90
+ :rtype: str
91
+ """
92
+ return self._partition
93
+
94
+ @partition.setter
95
+ def partition(self, partition):
96
+ """Sets the partition of this MachineTypePartitionFilter.
97
+
98
+ The partition to filter by. # noqa: E501
99
+
100
+ :param partition: The partition of this MachineTypePartitionFilter. # noqa: E501
101
+ :type: str
102
+ """
103
+ if self.local_vars_configuration.client_side_validation and partition is None: # noqa: E501
104
+ raise ValueError("Invalid value for `partition`, must not be `None`") # noqa: E501
105
+
106
+ self._partition = partition
107
+
108
+ def to_dict(self):
109
+ """Returns the model properties as a dict"""
110
+ result = {}
111
+
112
+ for attr, _ in six.iteritems(self.openapi_types):
113
+ value = getattr(self, attr)
114
+ if isinstance(value, list):
115
+ result[attr] = list(map(
116
+ lambda x: x.to_dict() if hasattr(x, "to_dict") else x,
117
+ value
118
+ ))
119
+ elif hasattr(value, "to_dict"):
120
+ result[attr] = value.to_dict()
121
+ elif isinstance(value, dict):
122
+ result[attr] = dict(map(
123
+ lambda item: (item[0], item[1].to_dict())
124
+ if hasattr(item[1], "to_dict") else item,
125
+ value.items()
126
+ ))
127
+ else:
128
+ result[attr] = value
129
+
130
+ return result
131
+
132
+ def to_str(self):
133
+ """Returns the string representation of the model"""
134
+ return pprint.pformat(self.to_dict())
135
+
136
+ def __repr__(self):
137
+ """For `print` and `pprint`"""
138
+ return self.to_str()
139
+
140
+ def __eq__(self, other):
141
+ """Returns true if both objects are equal"""
142
+ if not isinstance(other, MachineTypePartitionFilter):
143
+ return False
144
+
145
+ return self.to_dict() == other.to_dict()
146
+
147
+ def __ne__(self, other):
148
+ """Returns true if both objects are not equal"""
149
+ if not isinstance(other, MachineTypePartitionFilter):
150
+ return True
151
+
152
+ return self.to_dict() != other.to_dict()
@@ -34,25 +34,29 @@ class PartitionInfo(object):
34
34
  """
35
35
  openapi_types = {
36
36
  'partition_name': 'str',
37
+ 'machine_type': 'str',
37
38
  'allocation_states': 'dict(str, int)'
38
39
  }
39
40
 
40
41
  attribute_map = {
41
42
  'partition_name': 'partition_name',
43
+ 'machine_type': 'machine_type',
42
44
  'allocation_states': 'allocation_states'
43
45
  }
44
46
 
45
- def __init__(self, partition_name=None, allocation_states=None, local_vars_configuration=None): # noqa: E501
47
+ def __init__(self, partition_name=None, machine_type=None, allocation_states=None, local_vars_configuration=None): # noqa: E501
46
48
  """PartitionInfo - a model defined in OpenAPI""" # noqa: E501
47
49
  if local_vars_configuration is None:
48
50
  local_vars_configuration = Configuration()
49
51
  self.local_vars_configuration = local_vars_configuration
50
52
 
51
53
  self._partition_name = None
54
+ self._machine_type = None
52
55
  self._allocation_states = None
53
56
  self.discriminator = None
54
57
 
55
58
  self.partition_name = partition_name
59
+ self.machine_type = machine_type
56
60
  self.allocation_states = allocation_states
57
61
 
58
62
  @property
@@ -80,6 +84,31 @@ class PartitionInfo(object):
80
84
 
81
85
  self._partition_name = partition_name
82
86
 
87
+ @property
88
+ def machine_type(self):
89
+ """Gets the machine_type of this PartitionInfo. # noqa: E501
90
+
91
+ The type of the machine. # noqa: E501
92
+
93
+ :return: The machine_type of this PartitionInfo. # noqa: E501
94
+ :rtype: str
95
+ """
96
+ return self._machine_type
97
+
98
+ @machine_type.setter
99
+ def machine_type(self, machine_type):
100
+ """Sets the machine_type of this PartitionInfo.
101
+
102
+ The type of the machine. # noqa: E501
103
+
104
+ :param machine_type: The machine_type of this PartitionInfo. # noqa: E501
105
+ :type: str
106
+ """
107
+ if self.local_vars_configuration.client_side_validation and machine_type is None: # noqa: E501
108
+ raise ValueError("Invalid value for `machine_type`, must not be `None`") # noqa: E501
109
+
110
+ self._machine_type = machine_type
111
+
83
112
  @property
84
113
  def allocation_states(self):
85
114
  """Gets the allocation_states of this PartitionInfo. # noqa: E501
@@ -37,7 +37,7 @@ class ProductionJobEvent(object):
37
37
  'created_at': 'datetime',
38
38
  'event_type': 'HaJobStates',
39
39
  'error_type': 'HaJobErrorTypes',
40
- 'level': 'HaJobEventLevel',
40
+ 'level': 'EventLevel',
41
41
  'message': 'str',
42
42
  'origin': 'HaJobEventOrigin',
43
43
  'ha_job_id': 'str',
@@ -201,7 +201,7 @@ class ProductionJobEvent(object):
201
201
  Level of Job event # noqa: E501
202
202
 
203
203
  :return: The level of this ProductionJobEvent. # noqa: E501
204
- :rtype: HaJobEventLevel
204
+ :rtype: EventLevel
205
205
  """
206
206
  return self._level
207
207
 
@@ -212,7 +212,7 @@ class ProductionJobEvent(object):
212
212
  Level of Job event # noqa: E501
213
213
 
214
214
  :param level: The level of this ProductionJobEvent. # noqa: E501
215
- :type: HaJobEventLevel
215
+ :type: EventLevel
216
216
  """
217
217
 
218
218
  self._level = level
@@ -30,8 +30,9 @@ class RolloutStrategy(object):
30
30
  """
31
31
  ROLLOUT = "ROLLOUT"
32
32
  IN_PLACE = "IN_PLACE"
33
+ MULTI_VERSION = "MULTI_VERSION"
33
34
 
34
- allowable_values = [ROLLOUT, IN_PLACE] # noqa: E501
35
+ allowable_values = [ROLLOUT, IN_PLACE, MULTI_VERSION] # noqa: E501
35
36
 
36
37
  """
37
38
  Attributes: