Coverage for nova/api/openstack/compute/schemas/aggregates.py: 100%
47 statements
« prev ^ index » next coverage.py v7.6.12, created at 2025-04-24 11:16 +0000
« prev ^ index » next coverage.py v7.6.12, created at 2025-04-24 11:16 +0000
1# Copyright 2014 NEC Corporation. All rights reserved.
2#
3# Licensed under the Apache License, Version 2.0 (the "License"); you may
4# not use this file except in compliance with the License. You may obtain
5# a copy of the License at
6#
7# http://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12# License for the specific language governing permissions and limitations
13# under the License.
15import copy
17from nova.api.validation import parameter_types
19_availability_zone = {'oneOf': [parameter_types.az_name, {'type': 'null'}]}
20_availability_zone_with_leading_trailing_spaces = {
21 'oneOf': [parameter_types.az_name_with_leading_trailing_spaces,
22 {'type': 'null'}]
23}
25create = {
26 'type': 'object',
27 'properties': {
28 'aggregate': {
29 'type': 'object',
30 'properties': {
31 'name': parameter_types.name,
32 'availability_zone': _availability_zone,
33 },
34 'required': ['name'],
35 'additionalProperties': False,
36 },
37 },
38 'required': ['aggregate'],
39 'additionalProperties': False,
40}
43create_v20 = copy.deepcopy(create)
44create_v20['properties']['aggregate']['properties']['name'] = (
45 parameter_types.name_with_leading_trailing_spaces)
46create_v20['properties']['aggregate']['properties']['availability_zone'] = (
47 _availability_zone_with_leading_trailing_spaces)
50update = {
51 'type': 'object',
52 'properties': {
53 'aggregate': {
54 'type': 'object',
55 'properties': {
56 'name': parameter_types.name_with_leading_trailing_spaces,
57 'availability_zone': _availability_zone
58 },
59 'additionalProperties': False,
60 'anyOf': [
61 {'required': ['name']},
62 {'required': ['availability_zone']}
63 ]
64 },
65 },
66 'required': ['aggregate'],
67 'additionalProperties': False,
68}
71update_v20 = copy.deepcopy(update)
72update_v20['properties']['aggregate']['properties']['name'] = (
73 parameter_types.name_with_leading_trailing_spaces)
74update_v20['properties']['aggregate']['properties']['availability_zone'] = (
75 _availability_zone_with_leading_trailing_spaces)
78add_host = {
79 'type': 'object',
80 'properties': {
81 'add_host': {
82 'type': 'object',
83 'properties': {
84 'host': parameter_types.fqdn,
85 },
86 'required': ['host'],
87 'additionalProperties': False,
88 },
89 },
90 'required': ['add_host'],
91 'additionalProperties': False,
92}
94remove_host = {
95 'type': 'object',
96 'properties': {
97 'remove_host': {
98 'type': 'object',
99 'properties': {
100 'host': parameter_types.fqdn,
101 },
102 'required': ['host'],
103 'additionalProperties': False,
104 },
105 },
106 'required': ['remove_host'],
107 'additionalProperties': False,
108}
110set_metadata = {
111 'type': 'object',
112 'properties': {
113 'set_metadata': {
114 'type': 'object',
115 'properties': {
116 'metadata': parameter_types.metadata_with_null
117 },
118 'required': ['metadata'],
119 'additionalProperties': False,
120 },
121 },
122 'required': ['set_metadata'],
123 'additionalProperties': False,
124}
126# TODO(stephenfin): Remove additionalProperties in a future API version
127index_query = {
128 'type': 'object',
129 'properties': {},
130 'additionalProperties': True,
131}
133# TODO(stephenfin): Remove additionalProperties in a future API version
134show_query = {
135 'type': 'object',
136 'properties': {},
137 'additionalProperties': True,
138}
140_aggregate_response = {
141 'type': 'object',
142 'properties': {
143 'availability_zone': {'type': ['null', 'string']},
144 'created_at': {'type': 'string', 'format': 'date-time'},
145 'deleted': {'type': 'boolean'},
146 'deleted_at': {
147 'oneOf': [
148 {'type': 'null'},
149 {'type': 'string', 'format': 'date-time'},
150 ],
151 },
152 'hosts': {
153 'type': ['array', 'null'],
154 'items': {
155 'type': 'string',
156 },
157 },
158 'id': {'type': 'integer'},
159 # TODO(stephenfin): This could be stricter
160 'metadata': {
161 'type': ['null', 'object'],
162 'properties': {},
163 'additionalProperties': True,
164 },
165 'name': {'type': 'string'},
166 'updated_at': {
167 'oneOf': [
168 {'type': 'null'},
169 {'type': 'string', 'format': 'date-time'},
170 ],
171 },
172 },
173 'required': [
174 'availability_zone',
175 'created_at',
176 'deleted',
177 'deleted_at',
178 'hosts',
179 'id',
180 'metadata',
181 'name',
182 'updated_at',
183 ],
184 'additionalProperties': False,
185}
187_aggregate_response_v241 = copy.deepcopy(_aggregate_response)
188_aggregate_response_v241['properties'].update(
189 {'uuid': {'type': 'string', 'format': 'uuid'}},
190)
191_aggregate_response_v241['required'].append('uuid')
193index_response = {
194 'type': 'object',
195 'properties': {
196 'aggregates': {
197 'type': 'array',
198 'items': copy.deepcopy(_aggregate_response),
199 },
200 },
201 'required': ['aggregates'],
202 'additionalProperties': False,
203}
204index_response_v241 = copy.deepcopy(index_response)
205index_response_v241['properties']['aggregates']['items'] = copy.deepcopy(
206 _aggregate_response_v241
207)
209create_response = {
210 'type': 'object',
211 'properties': {
212 'aggregate': copy.deepcopy(_aggregate_response),
213 },
214 'required': ['aggregate'],
215 'additionalProperties': False,
216}
217del create_response['properties']['aggregate']['properties']['hosts']
218del create_response['properties']['aggregate']['properties']['metadata']
219create_response['properties']['aggregate']['required'].remove('hosts')
220create_response['properties']['aggregate']['required'].remove('metadata')
221create_response_v241 = copy.deepcopy(create_response)
222create_response_v241['properties']['aggregate'] = copy.deepcopy(
223 _aggregate_response_v241
224)
225del create_response_v241['properties']['aggregate']['properties']['hosts']
226del create_response_v241['properties']['aggregate']['properties']['metadata']
227create_response_v241['properties']['aggregate']['required'].remove('hosts')
228create_response_v241['properties']['aggregate']['required'].remove('metadata')
230show_response = {
231 'type': 'object',
232 'properties': {
233 'aggregate': copy.deepcopy(_aggregate_response),
234 },
235 'required': ['aggregate'],
236 'additionalProperties': False,
237}
238show_response_v241 = copy.deepcopy(show_response)
239show_response_v241['properties']['aggregate'] = copy.deepcopy(
240 _aggregate_response_v241
241)
243update_response = copy.deepcopy(show_response)
244update_response_v241 = copy.deepcopy(show_response_v241)
246delete_response = {'type': 'null'}
248add_host_response = copy.deepcopy(show_response)
249add_host_response_v241 = copy.deepcopy(show_response_v241)
251remove_host_response = copy.deepcopy(show_response)
252remove_host_response_v241 = copy.deepcopy(show_response_v241)
254set_metadata_response = copy.deepcopy(show_response)
255set_metadata_response_v241 = copy.deepcopy(show_response_v241)