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

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. 

14 

15import copy 

16 

17from nova.api.validation import parameter_types 

18 

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} 

24 

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} 

41 

42 

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) 

48 

49 

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} 

69 

70 

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) 

76 

77 

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} 

93 

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} 

109 

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} 

125 

126# TODO(stephenfin): Remove additionalProperties in a future API version 

127index_query = { 

128 'type': 'object', 

129 'properties': {}, 

130 'additionalProperties': True, 

131} 

132 

133# TODO(stephenfin): Remove additionalProperties in a future API version 

134show_query = { 

135 'type': 'object', 

136 'properties': {}, 

137 'additionalProperties': True, 

138} 

139 

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} 

186 

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') 

192 

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) 

208 

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') 

229 

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) 

242 

243update_response = copy.deepcopy(show_response) 

244update_response_v241 = copy.deepcopy(show_response_v241) 

245 

246delete_response = {'type': 'null'} 

247 

248add_host_response = copy.deepcopy(show_response) 

249add_host_response_v241 = copy.deepcopy(show_response_v241) 

250 

251remove_host_response = copy.deepcopy(show_response) 

252remove_host_response_v241 = copy.deepcopy(show_response_v241) 

253 

254set_metadata_response = copy.deepcopy(show_response) 

255set_metadata_response_v241 = copy.deepcopy(show_response_v241)