Coverage for osm_nbi/validation.py: 99%

140 statements  

« prev     ^ index     » next       coverage.py v7.3.1, created at 2024-06-25 09:03 +0000

1# -*- coding: utf-8 -*- 

2 

3# Licensed under the Apache License, Version 2.0 (the "License"); 

4# you may not use this file except in compliance with the License. 

5# You may obtain 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, 

11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 

12# implied. 

13# See the License for the specific language governing permissions and 

14# limitations under the License. 

15 

16from jsonschema import validate as js_v, exceptions as js_e 

17from http import HTTPStatus 

18from copy import deepcopy 

19from uuid import UUID # To test for valid UUID 

20 

21__author__ = "Alfonso Tierno <alfonso.tiernosepulveda@telefonica.com>" 

22__version__ = "0.1" 

23version_date = "Mar 2018" 

24 

25""" 

26Validator of input data using JSON schemas for those items that not contains an OSM yang information model 

27""" 

28 

29# Basis schemas 

30patern_name = "^[ -~]+$" 

31shortname_schema = { 

32 "type": "string", 

33 "minLength": 1, 

34 "maxLength": 60, 

35 "pattern": "^[^,;()\\.\\$'\"]+$", 

36} 

37passwd_schema = {"type": "string", "minLength": 1, "maxLength": 60} 

38user_passwd_schema = { 

39 "type": "string", 

40 "pattern": "^.*(?=.{8,})((?=.*[!@#$%^&*()\\-_=+{};:,<.>]){1})(?=.*\\d)((?=.*[a-z]){1})((?=.*[A-Z]){1}).*$", 

41} 

42name_schema = { 

43 "type": "string", 

44 "minLength": 1, 

45 "maxLength": 255, 

46 "pattern": "^[^,;()'\"]+$", 

47} 

48string_schema = {"type": "string", "minLength": 1, "maxLength": 255} 

49xml_text_schema = { 

50 "type": "string", 

51 "minLength": 1, 

52 "maxLength": 1000, 

53 "pattern": "^[^']+$", 

54} 

55description_schema = { 

56 "type": ["string", "null"], 

57 "maxLength": 255, 

58 "pattern": "^[^'\"]+$", 

59} 

60long_description_schema = { 

61 "type": ["string", "null"], 

62 "maxLength": 3000, 

63 "pattern": "^[^'\"]+$", 

64} 

65id_schema_fake = {"type": "string", "minLength": 2, "maxLength": 36} 

66bool_schema = {"type": "boolean"} 

67null_schema = {"type": "null"} 

68# "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$" 

69id_schema = { 

70 "type": "string", 

71 "pattern": "^[a-fA-F0-9]{8}(-[a-fA-F0-9]{4}){3}-[a-fA-F0-9]{12}$", 

72} 

73time_schema = { 

74 "type": "string", 

75 "pattern": "^[0-9]{4}-[0-1][0-9]-[0-3][0-9]T[0-2][0-9]([0-5]:){2}", 

76} 

77pci_schema = { 

78 "type": "string", 

79 "pattern": "^[0-9a-fA-F]{4}(:[0-9a-fA-F]{2}){2}\\.[0-9a-fA-F]$", 

80} 

81# allows [] for wildcards. For that reason huge length limit is set 

82pci_extended_schema = {"type": "string", "pattern": "^[0-9a-fA-F.:-\\[\\]]{12,40}$"} 

83http_schema = {"type": "string", "pattern": "^(https?|http)://[^'\"=]+$"} 

84bandwidth_schema = {"type": "string", "pattern": "^[0-9]+ *([MG]bps)?$"} 

85memory_schema = {"type": "string", "pattern": "^[0-9]+ *([MG]i?[Bb])?$"} 

86integer0_schema = {"type": "integer", "minimum": 0} 

87integer1_schema = {"type": "integer", "minimum": 1} 

88path_schema = {"type": "string", "pattern": "^(\\.){0,2}(/[^/\"':{}\\(\\)]+)+$"} 

89vlan_schema = {"type": "integer", "minimum": 1, "maximum": 4095} 

90vlan1000_schema = {"type": "integer", "minimum": 1000, "maximum": 4095} 

91mac_schema = { 

92 "type": "string", 

93 "pattern": "^[0-9a-fA-F][02468aceACE](:[0-9a-fA-F]{2}){5}$", 

94} # must be unicast: LSB bit of MSB byte ==0 

95dpid_Schema = {"type": "string", "pattern": "^[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){7}$"} 

96# mac_schema={"type":"string", "pattern":"^([0-9a-fA-F]{2}:){5}[0-9a-fA-F]{2}$"} 

97ip_schema = { 

98 "type": "string", 

99 "pattern": "^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$", 

100} 

101ipv6_schema = { 

102 "type": "string", 

103 "pattern": "(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))", # noqa: W605 

104} 

105ip_prefix_schema = { 

106 "type": "string", 

107 "pattern": "^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}" 

108 "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)/(30|[12]?[0-9])$", 

109} 

110port_schema = {"type": "integer", "minimum": 1, "maximum": 65534} 

111object_schema = {"type": "object"} 

112schema_version_2 = {"type": "integer", "minimum": 2, "maximum": 2} 

113# schema_version_string={"type":"string","enum": ["0.1", "2", "0.2", "3", "0.3"]} 

114log_level_schema = { 

115 "type": "string", 

116 "enum": ["DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"], 

117} 

118checksum_schema = {"type": "string", "pattern": "^[0-9a-fA-F]{32}$"} 

119size_schema = {"type": "integer", "minimum": 1, "maximum": 100} 

120array_edition_schema = { 

121 "type": "object", 

122 "patternProperties": {"^\\$": {}}, 

123 "additionalProperties": False, 

124 "minProperties": 1, 

125} 

126nameshort_list_schema = { 

127 "type": "array", 

128 "minItems": 1, 

129 "items": shortname_schema, 

130} 

131 

132description_list_schema = { 

133 "type": "array", 

134 "minItems": 1, 

135 "items": description_schema, 

136} 

137 

138ns_instantiate_vdu = { 

139 "title": "ns action instantiate input schema for vdu", 

140 "$schema": "http://json-schema.org/draft-04/schema#", 

141 "type": "object", 

142 "properties": { 

143 "id": name_schema, 

144 "vim-flavor-id": name_schema, 

145 "volume": { 

146 "type": "array", 

147 "minItems": 1, 

148 "items": { 

149 "type": "object", 

150 "properties": { 

151 "name": name_schema, 

152 "vim-volume-id": name_schema, 

153 }, 

154 "required": ["name", "vim-volume-id"], 

155 "additionalProperties": False, 

156 }, 

157 }, 

158 "interface": { 

159 "type": "array", 

160 "minItems": 1, 

161 "items": { 

162 "type": "object", 

163 "properties": { 

164 "name": name_schema, 

165 "ip-address": {"oneOf": [ip_schema, ipv6_schema]}, 

166 "mac-address": mac_schema, 

167 "floating-ip-required": bool_schema, 

168 }, 

169 "required": ["name"], 

170 "additionalProperties": False, 

171 }, 

172 }, 

173 }, 

174 "required": ["id"], 

175 "additionalProperties": False, 

176} 

177 

178ip_profile_dns_schema = { 

179 "type": "array", 

180 "minItems": 1, 

181 "items": { 

182 "type": "object", 

183 "properties": { 

184 "address": {"oneOf": [ip_schema, ipv6_schema]}, 

185 }, 

186 "required": ["address"], 

187 "additionalProperties": False, 

188 }, 

189} 

190 

191ip_profile_dhcp_schema = { 

192 "type": "object", 

193 "properties": { 

194 "enabled": {"type": "boolean"}, 

195 "count": integer1_schema, 

196 "start-address": ip_schema, 

197 }, 

198 "additionalProperties": False, 

199} 

200 

201ip_profile_schema = { 

202 "title": "ip profile validation schema", 

203 "$schema": "http://json-schema.org/draft-04/schema#", 

204 "type": "object", 

205 "properties": { 

206 "ip-version": {"enum": ["ipv4", "ipv6"]}, 

207 "subnet-address": {"oneOf": [null_schema, ip_prefix_schema]}, 

208 "gateway-address": {"oneOf": [null_schema, ip_schema]}, 

209 "dns-server": {"oneOf": [null_schema, ip_profile_dns_schema]}, 

210 "dhcp-params": {"oneOf": [null_schema, ip_profile_dhcp_schema]}, 

211 }, 

212 "additionalProperties": False, 

213} 

214 

215provider_network_schema = { 

216 "title": "provider network validation schema", 

217 "$schema": "http://json-schema.org/draft-04/schema#", 

218 "type": "object", 

219 "properties": { 

220 "physical-network": name_schema, 

221 "segmentation-id": name_schema, 

222 "sdn-ports": { # external ports to append to the SDN-assist network 

223 "type": "array", 

224 "items": { 

225 "type": "object", 

226 "properties": { 

227 "switch_id": shortname_schema, 

228 "switch_port": shortname_schema, 

229 "mac_address": mac_schema, 

230 "vlan": vlan_schema, 

231 }, 

232 "additionalProperties": True, 

233 }, 

234 }, 

235 "network-type": shortname_schema, 

236 }, 

237 "additionalProperties": True, 

238} 

239 

240ns_instantiate_internal_vld = { 

241 "title": "ns action instantiate input schema for vld", 

242 "$schema": "http://json-schema.org/draft-04/schema#", 

243 "type": "object", 

244 "properties": { 

245 "name": name_schema, 

246 "vim-network-name": name_schema, 

247 "vim-network-id": name_schema, 

248 "ip-profile": ip_profile_schema, 

249 "provider-network": provider_network_schema, 

250 "internal-connection-point": { 

251 "type": "array", 

252 "minItems": 1, 

253 "items": { 

254 "type": "object", 

255 "properties": { 

256 "id-ref": name_schema, 

257 "ip-address": ip_schema, 

258 # "mac-address": mac_schema, 

259 }, 

260 "required": ["id-ref"], 

261 "minProperties": 2, 

262 "additionalProperties": False, 

263 }, 

264 }, 

265 }, 

266 "required": ["name"], 

267 "minProperties": 2, 

268 "additionalProperties": False, 

269} 

270 

271additional_params_for_vnf = { 

272 "type": "array", 

273 "items": { 

274 "type": "object", 

275 "properties": { 

276 "member-vnf-index": name_schema, 

277 "additionalParams": object_schema, 

278 "k8s-namespace": name_schema, 

279 "config-units": integer1_schema, # number of configuration units of this vnf, by default 1 

280 "additionalParamsForVdu": { 

281 "type": "array", 

282 "items": { 

283 "type": "object", 

284 "properties": { 

285 "vdu_id": name_schema, 

286 "additionalParams": object_schema, 

287 "config-units": integer1_schema, # number of configuration units of this vdu, by default 1 

288 }, 

289 "required": ["vdu_id"], 

290 "minProperties": 2, 

291 "additionalProperties": False, 

292 }, 

293 }, 

294 "additionalParamsForKdu": { 

295 "type": "array", 

296 "items": { 

297 "type": "object", 

298 "properties": { 

299 "kdu_name": name_schema, 

300 "additionalParams": object_schema, 

301 "kdu_model": name_schema, 

302 "k8s-namespace": name_schema, 

303 "config-units": integer1_schema, # number of configuration units of this knf, by default 1 

304 "kdu-deployment-name": name_schema, 

305 }, 

306 "required": ["kdu_name"], 

307 "minProperties": 2, 

308 "additionalProperties": False, 

309 }, 

310 }, 

311 "affinity-or-anti-affinity-group": { 

312 "type": "array", 

313 "items": { 

314 "type": "object", 

315 "properties": { 

316 "id": name_schema, 

317 "vim-affinity-group-id": name_schema, 

318 }, 

319 "required": ["id"], 

320 "minProperties": 2, 

321 "additionalProperties": False, 

322 }, 

323 }, 

324 }, 

325 "required": ["member-vnf-index"], 

326 "minProperties": 2, 

327 "additionalProperties": False, 

328 }, 

329} 

330 

331ns_instantiate = { 

332 "title": "ns action instantiate input schema", 

333 "$schema": "http://json-schema.org/draft-04/schema#", 

334 "type": "object", 

335 "properties": { 

336 "lcmOperationType": string_schema, 

337 "nsInstanceId": id_schema, 

338 "netsliceInstanceId": id_schema, 

339 "nsName": name_schema, 

340 "nsDescription": {"oneOf": [description_schema, null_schema]}, 

341 "nsdId": id_schema, 

342 "vimAccountId": id_schema, 

343 "wimAccountId": {"oneOf": [id_schema, bool_schema, null_schema]}, 

344 "placement-engine": string_schema, 

345 "placement-constraints": object_schema, 

346 "additionalParamsForNs": object_schema, 

347 "additionalParamsForVnf": additional_params_for_vnf, 

348 "config-units": integer1_schema, # number of configuration units of this ns, by default 1 

349 "k8s-namespace": name_schema, 

350 "ssh_keys": {"type": "array", "items": {"type": "string"}}, 

351 "timeout_ns_deploy": integer1_schema, 

352 "nsr_id": id_schema, 

353 "vduImage": name_schema, 

354 "vnf": { 

355 "type": "array", 

356 "minItems": 1, 

357 "items": { 

358 "type": "object", 

359 "properties": { 

360 "member-vnf-index": name_schema, 

361 "vimAccountId": id_schema, 

362 "vdu": { 

363 "type": "array", 

364 "minItems": 1, 

365 "items": ns_instantiate_vdu, 

366 }, 

367 "internal-vld": { 

368 "type": "array", 

369 "minItems": 1, 

370 "items": ns_instantiate_internal_vld, 

371 }, 

372 }, 

373 "required": ["member-vnf-index"], 

374 "minProperties": 2, 

375 "additionalProperties": False, 

376 }, 

377 }, 

378 "vld": { 

379 "type": "array", 

380 "minItems": 1, 

381 "items": { 

382 "type": "object", 

383 "properties": { 

384 "name": string_schema, 

385 "vim-network-name": {"oneOf": [string_schema, object_schema]}, 

386 "vim-network-id": {"oneOf": [string_schema, object_schema]}, 

387 "ns-net": object_schema, 

388 "wimAccountId": {"oneOf": [id_schema, bool_schema, null_schema]}, 

389 "ip-profile": ip_profile_schema, 

390 "provider-network": provider_network_schema, 

391 "vnfd-connection-point-ref": { 

392 "type": "array", 

393 "minItems": 1, 

394 "items": { 

395 "type": "object", 

396 "properties": { 

397 "member-vnf-index-ref": name_schema, 

398 "vnfd-connection-point-ref": name_schema, 

399 "ip-address": {"oneOf": [ip_schema, ipv6_schema]}, 

400 # "mac-address": mac_schema, 

401 }, 

402 "required": [ 

403 "member-vnf-index-ref", 

404 "vnfd-connection-point-ref", 

405 ], 

406 "minProperties": 3, 

407 "additionalProperties": False, 

408 }, 

409 }, 

410 }, 

411 "required": ["name"], 

412 "additionalProperties": False, 

413 }, 

414 }, 

415 }, 

416 "required": ["nsName", "nsdId", "vimAccountId"], 

417 "additionalProperties": False, 

418} 

419 

420ns_terminate = { 

421 "title": "ns terminate input schema", 

422 "$schema": "http://json-schema.org/draft-04/schema#", 

423 "type": "object", 

424 "properties": { 

425 "lcmOperationType": string_schema, 

426 "nsInstanceId": id_schema, 

427 "autoremove": bool_schema, 

428 "timeout_ns_terminate": integer1_schema, 

429 "skip_terminate_primitives": bool_schema, 

430 "netsliceInstanceId": id_schema, 

431 }, 

432 "additionalProperties": False, 

433} 

434 

435ns_update = { 

436 "title": "ns update input schema", 

437 "$schema": "http://json-schema.org/draft-04/schema#", 

438 "type": "object", 

439 "properties": { 

440 "lcmOperationType": string_schema, 

441 "nsInstanceId": id_schema, 

442 "timeout_ns_update": integer1_schema, 

443 "updateType": { 

444 "enum": [ 

445 "CHANGE_VNFPKG", 

446 "REMOVE_VNF", 

447 "MODIFY_VNF_INFORMATION", 

448 "OPERATE_VNF", 

449 ] 

450 }, 

451 "modifyVnfInfoData": { 

452 "type": "object", 

453 "properties": { 

454 "vnfInstanceId": id_schema, 

455 "vnfdId": id_schema, 

456 }, 

457 "required": ["vnfInstanceId", "vnfdId"], 

458 }, 

459 "removeVnfInstanceId": id_schema, 

460 "changeVnfPackageData": { 

461 "type": "object", 

462 "properties": { 

463 "vnfInstanceId": id_schema, 

464 "vnfdId": id_schema, 

465 }, 

466 "required": ["vnfInstanceId", "vnfdId"], 

467 }, 

468 "operateVnfData": { 

469 "type": "object", 

470 "properties": { 

471 "vnfInstanceId": id_schema, 

472 "changeStateTo": name_schema, 

473 "additionalParam": { 

474 "type": "object", 

475 "properties": { 

476 "run-day1": bool_schema, 

477 "vdu_id": name_schema, 

478 "count-index": integer0_schema, 

479 }, 

480 "required": ["vdu_id", "count-index"], 

481 "additionalProperties": False, 

482 }, 

483 }, 

484 "required": ["vnfInstanceId", "changeStateTo"], 

485 }, 

486 }, 

487 "required": ["updateType"], 

488 "additionalProperties": False, 

489} 

490 

491ns_action = { # TODO for the moment it is only contemplated the vnfd primitive execution 

492 "title": "ns action input schema", 

493 "$schema": "http://json-schema.org/draft-04/schema#", 

494 "type": "object", 

495 "properties": { 

496 "lcmOperationType": string_schema, 

497 "nsInstanceId": id_schema, 

498 "member_vnf_index": name_schema, 

499 "vnf_member_index": name_schema, # TODO for backward compatibility. To remove in future 

500 "vdu_id": name_schema, 

501 "vdu_count_index": integer0_schema, 

502 "kdu_name": name_schema, 

503 "primitive": name_schema, 

504 "timeout_ns_action": integer1_schema, 

505 "primitive_params": {"type": "object"}, 

506 }, 

507 "required": ["primitive", "primitive_params"], # TODO add member_vnf_index 

508 "additionalProperties": False, 

509} 

510 

511ns_scale = { # TODO for the moment it is only VDU-scaling 

512 "title": "ns scale input schema", 

513 "$schema": "http://json-schema.org/draft-04/schema#", 

514 "type": "object", 

515 "properties": { 

516 "lcmOperationType": string_schema, 

517 "nsInstanceId": id_schema, 

518 "scaleType": {"enum": ["SCALE_VNF"]}, 

519 "timeout_ns_scale": integer1_schema, 

520 "scaleVnfData": { 

521 "type": "object", 

522 "properties": { 

523 "vnfInstanceId": name_schema, 

524 "scaleVnfType": {"enum": ["SCALE_OUT", "SCALE_IN"]}, 

525 "scaleByStepData": { 

526 "type": "object", 

527 "properties": { 

528 "scaling-group-descriptor": name_schema, 

529 "member-vnf-index": name_schema, 

530 "scaling-policy": name_schema, 

531 }, 

532 "required": ["scaling-group-descriptor", "member-vnf-index"], 

533 "additionalProperties": False, 

534 }, 

535 }, 

536 "required": ["scaleVnfType", "scaleByStepData"], # vnfInstanceId 

537 "additionalProperties": False, 

538 }, 

539 "scaleTime": time_schema, 

540 }, 

541 "required": ["scaleType", "scaleVnfData"], 

542 "additionalProperties": False, 

543} 

544 

545ns_migrate = { 

546 "title": "ns migrate input schema", 

547 "$schema": "http://json-schema.org/draft-04/schema#", 

548 "type": "object", 

549 "properties": { 

550 "lcmOperationType": string_schema, 

551 "nsInstanceId": id_schema, 

552 "vnfInstanceId": id_schema, 

553 "migrateToHost": string_schema, 

554 "vdu": { 

555 "type": "object", 

556 "properties": { 

557 "vduId": name_schema, 

558 "vduCountIndex": integer0_schema, 

559 }, 

560 "required": ["vduId"], 

561 "additionalProperties": False, 

562 }, 

563 }, 

564 "required": ["vnfInstanceId"], 

565 "additionalProperties": False, 

566} 

567 

568ns_heal = { 

569 "title": "ns heal input schema", 

570 "$schema": "http://json-schema.org/draft-04/schema#", 

571 "type": "object", 

572 "properties": { 

573 "lcmOperationType": string_schema, 

574 "nsInstanceId": id_schema, 

575 "timeout_ns_heal": integer1_schema, 

576 "healVnfData": { 

577 "type": "array", 

578 "items": { 

579 "type": "object", 

580 "properties": { 

581 "vnfInstanceId": id_schema, 

582 "cause": description_schema, 

583 "additionalParams": { 

584 "type": "object", 

585 "properties": { 

586 "run-day1": bool_schema, 

587 "vdu": { 

588 "type": "array", 

589 "items": { 

590 "type": "object", 

591 "properties": { 

592 "run-day1": bool_schema, 

593 "vdu-id": name_schema, 

594 "count-index": integer0_schema, 

595 }, 

596 "required": ["vdu-id"], 

597 "additionalProperties": False, 

598 }, 

599 }, 

600 }, 

601 "additionalProperties": False, 

602 }, 

603 }, 

604 "required": ["vnfInstanceId"], 

605 "additionalProperties": False, 

606 }, 

607 }, 

608 }, 

609 "required": ["healVnfData"], 

610 "additionalProperties": False, 

611} 

612 

613ns_verticalscale = { 

614 "title": "vertial scale input schema", 

615 "$schema": "http://json-schema.org/draft-04/schema#", 

616 "type": "object", 

617 "properties": { 

618 "lcmOperationType": string_schema, 

619 "verticalScale": string_schema, 

620 "nsInstanceId": id_schema, 

621 "changeVnfFlavorData": { 

622 "type": "object", 

623 "properties": { 

624 "vnfInstanceId": id_schema, 

625 "additionalParams": { 

626 "type": "object", 

627 "properties": { 

628 "vduid": string_schema, 

629 "vduCountIndex": integer0_schema, 

630 "virtualMemory": integer1_schema, 

631 "sizeOfStorage": integer0_schema, 

632 "numVirtualCpu": integer1_schema, 

633 }, 

634 }, 

635 }, 

636 "required": ["vnfInstanceId", "additionalParams"], 

637 "additionalProperties": False, 

638 }, 

639 }, 

640 "required": ["lcmOperationType", "verticalScale", "nsInstanceId"], 

641 "additionalProperties": False, 

642} 

643 

644nslcmop_cancel = { 

645 "title": "Cancel nslcmop input schema", 

646 "$schema": "http://json-schema.org/draft-04/schema#", 

647 "type": "object", 

648 "properties": { 

649 "nsLcmOpOccId": id_schema, 

650 "cancelMode": { 

651 "enum": [ 

652 "GRACEFUL", 

653 "FORCEFUL", 

654 ] 

655 }, 

656 }, 

657 "required": ["cancelMode"], 

658 "additionalProperties": False, 

659} 

660 

661schema_version = {"type": "string", "enum": ["1.0"]} 

662schema_type = {"type": "string"} 

663vim_type = shortname_schema # {"enum": ["openstack", "openvim", "vmware", "opennebula", "aws", "azure", "fos"]} 

664 

665vim_account_edit_schema = { 

666 "title": "vim_account edit input schema", 

667 "$schema": "http://json-schema.org/draft-04/schema#", 

668 "type": "object", 

669 "properties": { 

670 "name": name_schema, 

671 "description": description_schema, 

672 "vim": name_schema, 

673 "datacenter": name_schema, 

674 "vim_type": vim_type, 

675 "vim_url": description_schema, 

676 # "vim_url_admin": description_schema, 

677 # "vim_tenant": name_schema, 

678 "vim_tenant_name": name_schema, 

679 "vim_user": string_schema, 

680 "vim_password": passwd_schema, 

681 "vca": id_schema, 

682 "config": {"type": "object"}, 

683 "prometheus-config": {"type": "object"}, 

684 }, 

685 "additionalProperties": False, 

686} 

687 

688vim_account_new_schema = { 

689 "title": "vim_account creation input schema", 

690 "$schema": "http://json-schema.org/draft-04/schema#", 

691 "type": "object", 

692 "properties": { 

693 "schema_version": schema_version, 

694 "schema_type": schema_type, 

695 "name": name_schema, 

696 "description": description_schema, 

697 "vim": name_schema, 

698 "datacenter": name_schema, 

699 "vim_type": vim_type, 

700 "vim_url": description_schema, 

701 # "vim_url_admin": description_schema, 

702 # "vim_tenant": name_schema, 

703 "vim_tenant_name": name_schema, 

704 "vim_user": string_schema, 

705 "vim_password": passwd_schema, 

706 "vca": id_schema, 

707 "config": {"type": "object"}, 

708 "prometheus-config": {"type": "object"}, 

709 }, 

710 "required": [ 

711 "name", 

712 "vim_url", 

713 "vim_type", 

714 "vim_user", 

715 "vim_password", 

716 "vim_tenant_name", 

717 ], 

718 "additionalProperties": False, 

719} 

720 

721wim_type = shortname_schema # {"enum": ["ietfl2vpn", "onos", "odl", "dynpac", "fake"]} 

722 

723wim_account_edit_schema = { 

724 "title": "wim_account edit input schema", 

725 "$schema": "http://json-schema.org/draft-04/schema#", 

726 "type": "object", 

727 "properties": { 

728 "name": name_schema, 

729 "description": description_schema, 

730 "wim": name_schema, 

731 "wim_type": wim_type, 

732 "wim_url": description_schema, 

733 "user": string_schema, 

734 "password": passwd_schema, 

735 "config": {"type": "object"}, 

736 }, 

737 "additionalProperties": False, 

738} 

739 

740wim_account_new_schema = { 

741 "title": "wim_account creation input schema", 

742 "$schema": "http://json-schema.org/draft-04/schema#", 

743 "type": "object", 

744 "properties": { 

745 "schema_version": schema_version, 

746 "schema_type": schema_type, 

747 "name": name_schema, 

748 "description": description_schema, 

749 "wim": name_schema, 

750 "wim_type": wim_type, 

751 "wim_url": description_schema, 

752 "user": string_schema, 

753 "password": passwd_schema, 

754 "config": { 

755 "type": "object", 

756 "patternProperties": {".": {"not": {"type": "null"}}}, 

757 }, 

758 }, 

759 "required": ["name", "wim_url", "wim_type"], 

760 "additionalProperties": False, 

761} 

762 

763sdn_properties = { 

764 "name": name_schema, 

765 "type": {"type": "string"}, 

766 "url": {"type": "string"}, 

767 "user": string_schema, 

768 "password": passwd_schema, 

769 "config": {"type": "object"}, 

770 "description": description_schema, 

771 # The folowing are deprecated. Maintanied for backward compatibility 

772 "dpid": dpid_Schema, 

773 "ip": ip_schema, 

774 "port": port_schema, 

775 "version": {"type": "string", "minLength": 1, "maxLength": 12}, 

776} 

777sdn_new_schema = { 

778 "title": "sdn controller information schema", 

779 "$schema": "http://json-schema.org/draft-04/schema#", 

780 "type": "object", 

781 "properties": sdn_properties, 

782 "required": ["name", "type"], 

783 "additionalProperties": False, 

784} 

785sdn_edit_schema = { 

786 "title": "sdn controller update information schema", 

787 "$schema": "http://json-schema.org/draft-04/schema#", 

788 "type": "object", 

789 "properties": sdn_properties, 

790 # "required": ["name", "port", 'ip', 'dpid', 'type'], 

791 "additionalProperties": False, 

792} 

793sdn_port_mapping_schema = { 

794 "$schema": "http://json-schema.org/draft-04/schema#", 

795 "title": "sdn port mapping information schema", 

796 "type": "array", 

797 "items": { 

798 "type": "object", 

799 "properties": { 

800 "compute_node": shortname_schema, 

801 "ports": { 

802 "type": "array", 

803 "items": { 

804 "type": "object", 

805 "properties": { 

806 "pci": pci_extended_schema, 

807 "switch_port": shortname_schema, 

808 "switch_mac": mac_schema, 

809 }, 

810 "required": ["pci"], 

811 }, 

812 }, 

813 }, 

814 "required": ["compute_node", "ports"], 

815 }, 

816} 

817sdn_external_port_schema = { 

818 "$schema": "http://json-schema.org/draft-04/schema#", 

819 "title": "External port information", 

820 "type": "object", 

821 "properties": { 

822 "port": {"type": "string", "minLength": 1, "maxLength": 60}, 

823 "vlan": vlan_schema, 

824 "mac": mac_schema, 

825 }, 

826 "required": ["port"], 

827} 

828 

829# K8s Clusters 

830k8scluster_deploy_method_schema = { 

831 "$schema": "http://json-schema.org/draft-04/schema#", 

832 "title": "Deployment methods for K8s cluster", 

833 "type": "object", 

834 "properties": { 

835 "juju-bundle": {"type": "boolean"}, 

836 "helm-chart-v3": {"type": "boolean"}, 

837 }, 

838 "additionalProperties": False, 

839 "minProperties": 2, 

840} 

841k8scluster_nets_schema = { 

842 "title": "k8scluster nets input schema", 

843 "$schema": "http://json-schema.org/draft-04/schema#", 

844 "type": "object", 

845 "patternProperties": {".": {"oneOf": [name_schema, null_schema]}}, 

846 "minProperties": 1, 

847 "additionalProperties": False, 

848} 

849k8scluster_new_schema = { 

850 "title": "k8scluster creation input schema", 

851 "$schema": "http://json-schema.org/draft-04/schema#", 

852 "type": "object", 

853 "properties": { 

854 "schema_version": schema_version, 

855 "schema_type": schema_type, 

856 "name": name_schema, 

857 "description": description_schema, 

858 "credentials": object_schema, 

859 "vim_account": id_schema, 

860 "vca_id": id_schema, 

861 "k8s_version": string_schema, 

862 "nets": k8scluster_nets_schema, 

863 "deployment_methods": k8scluster_deploy_method_schema, 

864 "namespace": name_schema, 

865 "cni": nameshort_list_schema, 

866 }, 

867 "required": ["name", "credentials", "vim_account", "k8s_version", "nets"], 

868 "additionalProperties": False, 

869} 

870k8scluster_edit_schema = { 

871 "title": "vim_account edit input schema", 

872 "$schema": "http://json-schema.org/draft-04/schema#", 

873 "type": "object", 

874 "properties": { 

875 "name": name_schema, 

876 "description": description_schema, 

877 "credentials": object_schema, 

878 "vim_account": id_schema, 

879 "vca_id": id_schema, 

880 "k8s_version": string_schema, 

881 "nets": k8scluster_nets_schema, 

882 "namespace": name_schema, 

883 "cni": nameshort_list_schema, 

884 }, 

885 "additionalProperties": False, 

886} 

887 

888# VCA 

889vca_new_schema = { 

890 "title": "vca creation input schema", 

891 "$schema": "http://json-schema.org/draft-04/schema#", 

892 "type": "object", 

893 "properties": { 

894 "schema_version": schema_version, 

895 "schema_type": schema_type, 

896 "name": name_schema, 

897 "description": description_schema, 

898 "endpoints": description_list_schema, 

899 "user": string_schema, 

900 "secret": passwd_schema, 

901 "cacert": long_description_schema, 

902 "lxd-cloud": shortname_schema, 

903 "lxd-credentials": shortname_schema, 

904 "k8s-cloud": shortname_schema, 

905 "k8s-credentials": shortname_schema, 

906 "model-config": object_schema, 

907 }, 

908 "required": [ 

909 "name", 

910 "endpoints", 

911 "user", 

912 "secret", 

913 "cacert", 

914 "lxd-cloud", 

915 "lxd-credentials", 

916 "k8s-cloud", 

917 "k8s-credentials", 

918 ], 

919 "additionalProperties": False, 

920} 

921vca_edit_schema = { 

922 "title": "vca creation input schema", 

923 "$schema": "http://json-schema.org/draft-04/schema#", 

924 "type": "object", 

925 "properties": { 

926 "name": name_schema, 

927 "description": description_schema, 

928 "endpoints": description_list_schema, 

929 "port": integer1_schema, 

930 "user": string_schema, 

931 "secret": passwd_schema, 

932 "cacert": long_description_schema, 

933 "lxd-cloud": shortname_schema, 

934 "lxd-credentials": shortname_schema, 

935 "k8s-cloud": shortname_schema, 

936 "k8s-credentials": shortname_schema, 

937 "model-config": object_schema, 

938 }, 

939 "additionalProperties": False, 

940} 

941 

942# K8s Repos 

943k8srepo_types = {"enum": ["helm-chart", "juju-bundle"]} 

944k8srepo_properties = { 

945 "name": name_schema, 

946 "description": description_schema, 

947 "type": k8srepo_types, 

948 "url": description_schema, 

949 "cacert": long_description_schema, 

950 "user": string_schema, 

951 "password": passwd_schema, 

952 "oci": bool_schema, 

953} 

954k8srepo_new_schema = { 

955 "title": "k8scluster creation input schema", 

956 "$schema": "http://json-schema.org/draft-04/schema#", 

957 "type": "object", 

958 "properties": k8srepo_properties, 

959 "required": ["name", "type", "url"], 

960 "additionalProperties": False, 

961} 

962k8srepo_edit_schema = { 

963 "title": "vim_account edit input schema", 

964 "$schema": "http://json-schema.org/draft-04/schema#", 

965 "type": "object", 

966 "properties": k8srepo_properties, 

967 "additionalProperties": False, 

968} 

969 

970# OSM Repos 

971osmrepo_types = {"enum": ["osm"]} 

972osmrepo_properties = { 

973 "name": name_schema, 

974 "description": description_schema, 

975 "type": osmrepo_types, 

976 "url": description_schema 

977 # "user": string_schema, 

978 # "password": passwd_schema 

979} 

980osmrepo_new_schema = { 

981 "title": "osm repo creation input schema", 

982 "$schema": "http://json-schema.org/draft-04/schema#", 

983 "type": "object", 

984 "properties": osmrepo_properties, 

985 "required": ["name", "type", "url"], 

986 "additionalProperties": False, 

987} 

988osmrepo_edit_schema = { 

989 "title": "osm repo edit input schema", 

990 "$schema": "http://json-schema.org/draft-04/schema#", 

991 "type": "object", 

992 "properties": osmrepo_properties, 

993 "additionalProperties": False, 

994} 

995 

996# PDUs 

997pdu_interface = { 

998 "type": "object", 

999 "properties": { 

1000 "name": shortname_schema, 

1001 "mgmt": bool_schema, 

1002 "type": {"enum": ["overlay", "underlay"]}, 

1003 "ip-address": {"oneOf": [ip_schema, ipv6_schema]}, 

1004 # TODO, add user, password, ssh-key 

1005 "mac-address": mac_schema, 

1006 "vim-network-name": shortname_schema, # interface is connected to one vim network, or switch port 

1007 "vim-network-id": shortname_schema, 

1008 # # provide this in case SDN assist must deal with this interface 

1009 # "switch-dpid": dpid_Schema, 

1010 # "switch-port": shortname_schema, 

1011 # "switch-mac": shortname_schema, 

1012 # "switch-vlan": vlan_schema, 

1013 }, 

1014 "required": ["name", "mgmt", "ip-address"], 

1015 "additionalProperties": False, 

1016} 

1017pdu_new_schema = { 

1018 "title": "pdu creation input schema", 

1019 "$schema": "http://json-schema.org/draft-04/schema#", 

1020 "type": "object", 

1021 "properties": { 

1022 "name": shortname_schema, 

1023 "type": shortname_schema, 

1024 "description": description_schema, 

1025 "shared": bool_schema, 

1026 "vims": nameshort_list_schema, 

1027 "vim_accounts": nameshort_list_schema, 

1028 "interfaces": {"type": "array", "items": pdu_interface, "minItems": 1}, 

1029 }, 

1030 "required": ["name", "type", "interfaces"], 

1031 "additionalProperties": False, 

1032} 

1033pdu_edit_schema = { 

1034 "title": "pdu edit input schema", 

1035 "$schema": "http://json-schema.org/draft-04/schema#", 

1036 "type": "object", 

1037 "properties": { 

1038 "name": shortname_schema, 

1039 "type": shortname_schema, 

1040 "description": description_schema, 

1041 "shared": bool_schema, 

1042 "vims": {"oneOf": [array_edition_schema, nameshort_list_schema]}, 

1043 "vim_accounts": {"oneOf": [array_edition_schema, nameshort_list_schema]}, 

1044 "interfaces": { 

1045 "oneOf": [ 

1046 array_edition_schema, 

1047 {"type": "array", "items": pdu_interface, "minItems": 1}, 

1048 ] 

1049 }, 

1050 }, 

1051 "additionalProperties": False, 

1052 "minProperties": 1, 

1053} 

1054 

1055# VNF PKG OPERATIONS 

1056vnfpkgop_new_schema = { 

1057 "title": "VNF PKG operation creation input schema", 

1058 "$schema": "http://json-schema.org/draft-04/schema#", 

1059 "type": "object", 

1060 "properties": { 

1061 "lcmOperationType": string_schema, 

1062 "vnfPkgId": id_schema, 

1063 "kdu_name": name_schema, 

1064 "primitive": name_schema, 

1065 "primitive_params": {"type": "object"}, 

1066 }, 

1067 "required": [ 

1068 "lcmOperationType", 

1069 "vnfPkgId", 

1070 "kdu_name", 

1071 "primitive", 

1072 "primitive_params", 

1073 ], 

1074 "additionalProperties": False, 

1075} 

1076 

1077# USERS 

1078project_role_mappings = { 

1079 "title": "list pf projects/roles", 

1080 "$schema": "http://json-schema.org/draft-04/schema#", 

1081 "type": "array", 

1082 "items": { 

1083 "type": "object", 

1084 "properties": {"project": shortname_schema, "role": shortname_schema}, 

1085 "required": ["project", "role"], 

1086 "additionalProperties": False, 

1087 }, 

1088 "minItems": 1, 

1089} 

1090project_role_mappings_optional = { 

1091 "title": "list of projects/roles or projects only", 

1092 "$schema": "http://json-schema.org/draft-04/schema#", 

1093 "type": "array", 

1094 "items": { 

1095 "type": "object", 

1096 "properties": {"project": shortname_schema, "role": shortname_schema}, 

1097 "required": ["project"], 

1098 "additionalProperties": False, 

1099 }, 

1100 "minItems": 1, 

1101} 

1102user_new_schema = { 

1103 "$schema": "http://json-schema.org/draft-04/schema#", 

1104 "title": "New user schema", 

1105 "type": "object", 

1106 "properties": { 

1107 "username": string_schema, 

1108 "domain_name": shortname_schema, 

1109 "password": user_passwd_schema, 

1110 "projects": nameshort_list_schema, 

1111 "project_role_mappings": project_role_mappings, 

1112 }, 

1113 "required": ["username", "password"], 

1114 "additionalProperties": False, 

1115} 

1116user_edit_schema = { 

1117 "$schema": "http://json-schema.org/draft-04/schema#", 

1118 "title": "User edit schema for administrators", 

1119 "type": "object", 

1120 "properties": { 

1121 "password": user_passwd_schema, 

1122 "old_password": passwd_schema, 

1123 "username": string_schema, # To allow User Name modification 

1124 "projects": {"oneOf": [nameshort_list_schema, array_edition_schema]}, 

1125 "project_role_mappings": project_role_mappings, 

1126 "add_project_role_mappings": project_role_mappings, 

1127 "remove_project_role_mappings": project_role_mappings_optional, 

1128 "system_admin_id": id_schema, 

1129 "unlock": bool_schema, 

1130 "renew": bool_schema, 

1131 }, 

1132 "minProperties": 1, 

1133 "additionalProperties": False, 

1134} 

1135 

1136# PROJECTS 

1137topics_with_quota = [ 

1138 "vnfds", 

1139 "nsds", 

1140 "slice_templates", 

1141 "pduds", 

1142 "ns_instances", 

1143 "slice_instances", 

1144 "vim_accounts", 

1145 "wim_accounts", 

1146 "sdn_controllers", 

1147 "k8sclusters", 

1148 "vca", 

1149 "k8srepos", 

1150 "osmrepos", 

1151 "ns_subscriptions", 

1152] 

1153project_new_schema = { 

1154 "$schema": "http://json-schema.org/draft-04/schema#", 

1155 "title": "New project schema for administrators", 

1156 "type": "object", 

1157 "properties": { 

1158 "name": shortname_schema, 

1159 "admin": bool_schema, 

1160 "domain_name": shortname_schema, 

1161 "quotas": { 

1162 "type": "object", 

1163 "properties": {topic: integer0_schema for topic in topics_with_quota}, 

1164 "additionalProperties": False, 

1165 }, 

1166 }, 

1167 "required": ["name"], 

1168 "additionalProperties": False, 

1169} 

1170project_edit_schema = { 

1171 "$schema": "http://json-schema.org/draft-04/schema#", 

1172 "title": "Project edit schema for administrators", 

1173 "type": "object", 

1174 "properties": { 

1175 "admin": bool_schema, 

1176 "name": shortname_schema, # To allow Project Name modification 

1177 "quotas": { 

1178 "type": "object", 

1179 "properties": { 

1180 topic: {"oneOf": [integer0_schema, null_schema]} 

1181 for topic in topics_with_quota 

1182 }, 

1183 "additionalProperties": False, 

1184 }, 

1185 }, 

1186 "additionalProperties": False, 

1187 "minProperties": 1, 

1188} 

1189 

1190# ROLES 

1191roles_new_schema = { 

1192 "$schema": "http://json-schema.org/draft-04/schema#", 

1193 "title": "New role schema for administrators", 

1194 "type": "object", 

1195 "properties": { 

1196 "name": shortname_schema, 

1197 "permissions": { 

1198 "type": "object", 

1199 "patternProperties": { 

1200 ".": bool_schema, 

1201 }, 

1202 # "minProperties": 1, 

1203 }, 

1204 }, 

1205 "required": ["name"], 

1206 "additionalProperties": False, 

1207} 

1208roles_edit_schema = { 

1209 "$schema": "http://json-schema.org/draft-04/schema#", 

1210 "title": "Roles edit schema for administrators", 

1211 "type": "object", 

1212 "properties": { 

1213 "name": shortname_schema, 

1214 "permissions": { 

1215 "type": "object", 

1216 "patternProperties": {".": {"oneOf": [bool_schema, null_schema]}}, 

1217 # "minProperties": 1, 

1218 }, 

1219 }, 

1220 "additionalProperties": False, 

1221 "minProperties": 1, 

1222} 

1223 

1224# GLOBAL SCHEMAS 

1225 

1226nbi_new_input_schemas = { 

1227 "users": user_new_schema, 

1228 "projects": project_new_schema, 

1229 "vim_accounts": vim_account_new_schema, 

1230 "sdns": sdn_new_schema, 

1231 "ns_instantiate": ns_instantiate, 

1232 "ns_action": ns_action, 

1233 "ns_scale": ns_scale, 

1234 "ns_update": ns_update, 

1235 "ns_heal": ns_heal, 

1236 "pdus": pdu_new_schema, 

1237} 

1238 

1239nbi_edit_input_schemas = { 

1240 "users": user_edit_schema, 

1241 "projects": project_edit_schema, 

1242 "vim_accounts": vim_account_edit_schema, 

1243 "sdns": sdn_edit_schema, 

1244 "pdus": pdu_edit_schema, 

1245} 

1246 

1247# NETSLICE SCHEMAS 

1248nsi_subnet_instantiate = deepcopy(ns_instantiate) 

1249nsi_subnet_instantiate["title"] = "netslice subnet instantiation params input schema" 

1250nsi_subnet_instantiate["properties"]["id"] = name_schema 

1251del nsi_subnet_instantiate["required"] 

1252 

1253nsi_vld_instantiate = { 

1254 "title": "netslice vld instantiation params input schema", 

1255 "$schema": "http://json-schema.org/draft-04/schema#", 

1256 "type": "object", 

1257 "properties": { 

1258 "name": string_schema, 

1259 "vim-network-name": {"oneOf": [string_schema, object_schema]}, 

1260 "vim-network-id": {"oneOf": [string_schema, object_schema]}, 

1261 "ip-profile": object_schema, 

1262 }, 

1263 "required": ["name"], 

1264 "additionalProperties": False, 

1265} 

1266 

1267nsi_instantiate = { 

1268 "title": "netslice action instantiate input schema", 

1269 "$schema": "http://json-schema.org/draft-04/schema#", 

1270 "type": "object", 

1271 "properties": { 

1272 "lcmOperationType": string_schema, 

1273 "netsliceInstanceId": id_schema, 

1274 "nsiName": name_schema, 

1275 "nsiDescription": {"oneOf": [description_schema, null_schema]}, 

1276 "nstId": string_schema, 

1277 "vimAccountId": id_schema, 

1278 "timeout_nsi_deploy": integer1_schema, 

1279 "ssh_keys": {"type": "array", "items": {"type": "string"}}, 

1280 "nsi_id": id_schema, 

1281 "additionalParamsForNsi": object_schema, 

1282 "netslice-subnet": { 

1283 "type": "array", 

1284 "minItems": 1, 

1285 "items": nsi_subnet_instantiate, 

1286 }, 

1287 "netslice-vld": {"type": "array", "minItems": 1, "items": nsi_vld_instantiate}, 

1288 }, 

1289 "required": ["nsiName", "nstId", "vimAccountId"], 

1290 "additionalProperties": False, 

1291} 

1292 

1293nsi_action = {} 

1294 

1295nsi_terminate = {} 

1296 

1297nsinstancesubscriptionfilter_schema = { 

1298 "title": "instance identifier schema", 

1299 "$schema": "http://json-schema.org/draft-07/schema#", 

1300 "type": "object", 

1301 "properties": { 

1302 "nsdIds": {"type": "array"}, 

1303 "vnfdIds": {"type": "array"}, 

1304 "pnfdIds": {"type": "array"}, 

1305 "nsInstanceIds": {"type": "array"}, 

1306 "nsInstanceNames": {"type": "array"}, 

1307 }, 

1308} 

1309 

1310nslcmsub_schema = { 

1311 "title": "nslcmsubscription input schema", 

1312 "$schema": "http://json-schema.org/draft-07/schema#", 

1313 "type": "object", 

1314 "properties": { 

1315 "nsInstanceSubscriptionFilter": nsinstancesubscriptionfilter_schema, 

1316 "notificationTypes": { 

1317 "type": "array", 

1318 "items": { 

1319 "enum": [ 

1320 "NsLcmOperationOccurrenceNotification", 

1321 "NsChangeNotification", 

1322 "NsIdentifierCreationNotification", 

1323 "NsIdentifierDeletionNotification", 

1324 ] 

1325 }, 

1326 }, 

1327 "operationTypes": { 

1328 "type": "array", 

1329 "items": {"enum": ["INSTANTIATE", "SCALE", "TERMINATE", "UPDATE", "HEAL"]}, 

1330 }, 

1331 "operationStates": { 

1332 "type": "array", 

1333 "items": { 

1334 "enum": [ 

1335 "PROCESSING", 

1336 "COMPLETED", 

1337 "PARTIALLY_COMPLETED", 

1338 "FAILED", 

1339 "FAILED_TEMP", 

1340 "ROLLING_BACK", 

1341 "ROLLED_BACK", 

1342 ] 

1343 }, 

1344 }, 

1345 "nsComponentTypes": {"type": "array", "items": {"enum": ["VNF", "NS", "PNF"]}}, 

1346 "lcmOpNameImpactingNsComponent": { 

1347 "type": "array", 

1348 "items": { 

1349 "enum": [ 

1350 "VNF_INSTANTIATE", 

1351 "VNF_SCALE", 

1352 "VNF_SCALE_TO_LEVEL", 

1353 "VNF_CHANGE_FLAVOUR", 

1354 "VNF_TERMINATE", 

1355 "VNF_HEAL", 

1356 "VNF_OPERATE", 

1357 "VNF_CHANGE_EXT_CONN", 

1358 "VNF_MODIFY_INFO", 

1359 "NS_INSTANTIATE", 

1360 "NS_SCALE", 

1361 "NS_UPDATE", 

1362 "NS_TERMINATE", 

1363 "NS_HEAL", 

1364 ] 

1365 }, 

1366 }, 

1367 "lcmOpOccStatusImpactingNsComponent": { 

1368 "type": "array", 

1369 "items": { 

1370 "enum": [ 

1371 "START", 

1372 "COMPLETED", 

1373 "PARTIALLY_COMPLETED", 

1374 "FAILED", 

1375 "ROLLED_BACK", 

1376 ] 

1377 }, 

1378 }, 

1379 }, 

1380 "allOf": [ 

1381 { 

1382 "if": { 

1383 "properties": { 

1384 "notificationTypes": { 

1385 "contains": {"const": "NsLcmOperationOccurrenceNotification"} 

1386 } 

1387 }, 

1388 }, 

1389 "then": { 

1390 "anyOf": [ 

1391 {"required": ["operationTypes"]}, 

1392 {"required": ["operationStates"]}, 

1393 ] 

1394 }, 

1395 }, 

1396 { 

1397 "if": { 

1398 "properties": { 

1399 "notificationTypes": {"contains": {"const": "NsChangeNotification"}} 

1400 }, 

1401 }, 

1402 "then": { 

1403 "anyOf": [ 

1404 {"required": ["nsComponentTypes"]}, 

1405 {"required": ["lcmOpNameImpactingNsComponent"]}, 

1406 {"required": ["lcmOpOccStatusImpactingNsComponent"]}, 

1407 ] 

1408 }, 

1409 }, 

1410 ], 

1411} 

1412 

1413authentication_schema = { 

1414 "title": "authentication schema for subscription", 

1415 "$schema": "http://json-schema.org/draft-07/schema#", 

1416 "type": "object", 

1417 "properties": { 

1418 "authType": {"enum": ["basic"]}, 

1419 "paramsBasic": { 

1420 "type": "object", 

1421 "properties": { 

1422 "userName": string_schema, 

1423 "password": passwd_schema, 

1424 }, 

1425 }, 

1426 }, 

1427} 

1428 

1429subscription = { 

1430 "title": "subscription input schema", 

1431 "$schema": "http://json-schema.org/draft-07/schema#", 

1432 "type": "object", 

1433 "properties": { 

1434 "filter": nslcmsub_schema, 

1435 "CallbackUri": description_schema, 

1436 "authentication": authentication_schema, 

1437 }, 

1438 "required": ["CallbackUri"], 

1439} 

1440 

1441vnflcmsub_schema = { 

1442 "title": "vnflcmsubscription input schema", 

1443 "$schema": "http://json-schema.org/draft-07/schema#", 

1444 "type": "object", 

1445 "properties": { 

1446 "VnfInstanceSubscriptionFilter": { 

1447 "type": "object", 

1448 "properties": { 

1449 "vnfdIds": {"type": "array"}, 

1450 "vnfInstanceIds": {"type": "array"}, 

1451 }, 

1452 }, 

1453 "notificationTypes": { 

1454 "type": "array", 

1455 "items": { 

1456 "enum": [ 

1457 "VnfIdentifierCreationNotification", 

1458 "VnfLcmOperationOccurrenceNotification", 

1459 "VnfIdentifierDeletionNotification", 

1460 ] 

1461 }, 

1462 }, 

1463 "operationTypes": { 

1464 "type": "array", 

1465 "items": { 

1466 "enum": [ 

1467 "INSTANTIATE", 

1468 "SCALE", 

1469 "SCALE_TO_LEVEL", 

1470 "CHANGE_FLAVOUR", 

1471 "TERMINATE", 

1472 "HEAL", 

1473 "OPERATE", 

1474 "CHANGE_EXT_CONN", 

1475 "MODIFY_INFO", 

1476 "CREATE_SNAPSHOT", 

1477 "REVERT_TO_SNAPSHOT", 

1478 "CHANGE_VNFPKG", 

1479 ] 

1480 }, 

1481 }, 

1482 "operationStates": { 

1483 "type": "array", 

1484 "items": { 

1485 "enum": [ 

1486 "STARTING", 

1487 "PROCESSING", 

1488 "COMPLETED", 

1489 "FAILED_TEMP", 

1490 "FAILED", 

1491 "ROLLING_BACK", 

1492 "ROLLED_BACK", 

1493 ] 

1494 }, 

1495 }, 

1496 }, 

1497 "required": ["VnfInstanceSubscriptionFilter", "notificationTypes"], 

1498} 

1499 

1500vnf_subscription = { 

1501 "title": "vnf subscription input schema", 

1502 "$schema": "http://json-schema.org/draft-07/schema#", 

1503 "type": "object", 

1504 "properties": { 

1505 "filter": vnflcmsub_schema, 

1506 "CallbackUri": description_schema, 

1507 "authentication": authentication_schema, 

1508 }, 

1509 "required": ["filter", "CallbackUri"], 

1510} 

1511 

1512 

1513class ValidationError(Exception): 

1514 def __init__(self, message, http_code=HTTPStatus.UNPROCESSABLE_ENTITY): 

1515 self.http_code = http_code 

1516 Exception.__init__(self, message) 

1517 

1518 

1519def validate_input(indata, schema_to_use): 

1520 """ 

1521 Validates input data against json schema 

1522 :param indata: user input data. Should be a dictionary 

1523 :param schema_to_use: jsonschema to test 

1524 :return: None if ok, raises ValidationError exception on error 

1525 """ 

1526 try: 

1527 if schema_to_use: 

1528 js_v(indata, schema_to_use) 

1529 return None 

1530 except js_e.ValidationError as e: 

1531 if e.path: 

1532 error_pos = "at '" + ":".join(map(str, e.path)) + "'" 

1533 else: 

1534 error_pos = "" 

1535 raise ValidationError("Format error {} '{}' ".format(error_pos, e.message)) 

1536 except js_e.SchemaError: 

1537 raise ValidationError( 

1538 "Bad json schema {}".format(schema_to_use), 

1539 http_code=HTTPStatus.INTERNAL_SERVER_ERROR, 

1540 ) 

1541 

1542 

1543def is_valid_uuid(x): 

1544 """ 

1545 Test for a valid UUID 

1546 :param x: string to test 

1547 :return: True if x is a valid uuid, False otherwise 

1548 """ 

1549 try: 

1550 if UUID(x): 

1551 return True 

1552 except (TypeError, ValueError, AttributeError): 

1553 return False