Code Coverage

Cobertura Coverage Report > osm_nbi >

validation.py

Trend

Classes100%
 
Lines99%
   
Conditionals100%
 

File Coverage summary

NameClassesLinesConditionals
validation.py
100%
1/1
99%
136/138
100%
0/0

Coverage Breakdown by Class

NameLinesConditionals
validation.py
99%
136/138
N/A

Source

osm_nbi/validation.py
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
16 1 from jsonschema import validate as js_v, exceptions as js_e
17 1 from http import HTTPStatus
18 1 from copy import deepcopy
19 1 from uuid import UUID  # To test for valid UUID
20
21 1 __author__ = "Alfonso Tierno <alfonso.tiernosepulveda@telefonica.com>"
22 1 __version__ = "0.1"
23 1 version_date = "Mar 2018"
24
25 """
26 Validator of input data using JSON schemas for those items that not contains an  OSM yang information model
27 """
28
29 # Basis schemas
30 1 patern_name = "^[ -~]+$"
31 1 shortname_schema = {
32     "type": "string",
33     "minLength": 1,
34     "maxLength": 60,
35     "pattern": "^[^,;()\\.\\$'\"]+$",
36 }
37 1 passwd_schema = {"type": "string", "minLength": 1, "maxLength": 60}
38 1 name_schema = {
39     "type": "string",
40     "minLength": 1,
41     "maxLength": 255,
42     "pattern": "^[^,;()'\"]+$",
43 }
44 1 string_schema = {"type": "string", "minLength": 1, "maxLength": 255}
45 1 xml_text_schema = {
46     "type": "string",
47     "minLength": 1,
48     "maxLength": 1000,
49     "pattern": "^[^']+$",
50 }
51 1 description_schema = {
52     "type": ["string", "null"],
53     "maxLength": 255,
54     "pattern": "^[^'\"]+$",
55 }
56 1 long_description_schema = {
57     "type": ["string", "null"],
58     "maxLength": 3000,
59     "pattern": "^[^'\"]+$",
60 }
61 1 id_schema_fake = {"type": "string", "minLength": 2, "maxLength": 36}
62 1 bool_schema = {"type": "boolean"}
63 1 null_schema = {"type": "null"}
64 # "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}$"
65 1 id_schema = {
66     "type": "string",
67     "pattern": "^[a-fA-F0-9]{8}(-[a-fA-F0-9]{4}){3}-[a-fA-F0-9]{12}$",
68 }
69 1 time_schema = {
70     "type": "string",
71     "pattern": "^[0-9]{4}-[0-1][0-9]-[0-3][0-9]T[0-2][0-9]([0-5]:){2}",
72 }
73 1 pci_schema = {
74     "type": "string",
75     "pattern": "^[0-9a-fA-F]{4}(:[0-9a-fA-F]{2}){2}\\.[0-9a-fA-F]$",
76 }
77 # allows [] for wildcards. For that reason huge length limit is set
78 1 pci_extended_schema = {"type": "string", "pattern": "^[0-9a-fA-F.:-\\[\\]]{12,40}$"}
79 1 http_schema = {"type": "string", "pattern": "^(https?|http)://[^'\"=]+$"}
80 1 bandwidth_schema = {"type": "string", "pattern": "^[0-9]+ *([MG]bps)?$"}
81 1 memory_schema = {"type": "string", "pattern": "^[0-9]+ *([MG]i?[Bb])?$"}
82 1 integer0_schema = {"type": "integer", "minimum": 0}
83 1 integer1_schema = {"type": "integer", "minimum": 1}
84 1 path_schema = {"type": "string", "pattern": "^(\\.){0,2}(/[^/\"':{}\\(\\)]+)+$"}
85 1 vlan_schema = {"type": "integer", "minimum": 1, "maximum": 4095}
86 1 vlan1000_schema = {"type": "integer", "minimum": 1000, "maximum": 4095}
87 1 mac_schema = {
88     "type": "string",
89     "pattern": "^[0-9a-fA-F][02468aceACE](:[0-9a-fA-F]{2}){5}$",
90 }  # must be unicast: LSB bit of MSB byte ==0
91 1 dpid_Schema = {"type": "string", "pattern": "^[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){7}$"}
92 # mac_schema={"type":"string", "pattern":"^([0-9a-fA-F]{2}:){5}[0-9a-fA-F]{2}$"}
93 1 ip_schema = {
94     "type": "string",
95     "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]?)$",
96 }
97 1 ipv6_schema = {
98     "type": "string",
99     "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]))",
100 }
101 1 ip_prefix_schema = {
102     "type": "string",
103     "pattern": "^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}"
104     "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)/(30|[12]?[0-9])$",
105 }
106 1 port_schema = {"type": "integer", "minimum": 1, "maximum": 65534}
107 1 object_schema = {"type": "object"}
108 1 schema_version_2 = {"type": "integer", "minimum": 2, "maximum": 2}
109 # schema_version_string={"type":"string","enum": ["0.1", "2", "0.2", "3", "0.3"]}
110 1 log_level_schema = {
111     "type": "string",
112     "enum": ["DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"],
113 }
114 1 checksum_schema = {"type": "string", "pattern": "^[0-9a-fA-F]{32}$"}
115 1 size_schema = {"type": "integer", "minimum": 1, "maximum": 100}
116 1 array_edition_schema = {
117     "type": "object",
118     "patternProperties": {"^\\$": {}},
119     "additionalProperties": False,
120     "minProperties": 1,
121 }
122 1 nameshort_list_schema = {
123     "type": "array",
124     "minItems": 1,
125     "items": shortname_schema,
126 }
127
128 1 description_list_schema = {
129     "type": "array",
130     "minItems": 1,
131     "items": description_schema,
132 }
133
134 1 ns_instantiate_vdu = {
135     "title": "ns action instantiate input schema for vdu",
136     "$schema": "http://json-schema.org/draft-04/schema#",
137     "type": "object",
138     "properties": {
139         "id": name_schema,
140         "volume": {
141             "type": "array",
142             "minItems": 1,
143             "items": {
144                 "type": "object",
145                 "properties": {
146                     "name": name_schema,
147                     "vim-volume-id": name_schema,
148                 },
149                 "required": ["name", "vim-volume-id"],
150                 "additionalProperties": False,
151             },
152         },
153         "interface": {
154             "type": "array",
155             "minItems": 1,
156             "items": {
157                 "type": "object",
158                 "properties": {
159                     "name": name_schema,
160                     "ip-address": {"oneOf": [ip_schema, ipv6_schema]},
161                     "mac-address": mac_schema,
162                     "floating-ip-required": bool_schema,
163                 },
164                 "required": ["name"],
165                 "additionalProperties": False,
166             },
167         },
168     },
169     "required": ["id"],
170     "additionalProperties": False,
171 }
172
173 1 ip_profile_dns_schema = {
174     "type": "array",
175     "minItems": 1,
176     "items": {
177         "type": "object",
178         "properties": {
179             "address": {"oneOf": [ip_schema, ipv6_schema]},
180         },
181         "required": ["address"],
182         "additionalProperties": False,
183     },
184 }
185
186 1 ip_profile_dhcp_schema = {
187     "type": "object",
188     "properties": {
189         "enabled": {"type": "boolean"},
190         "count": integer1_schema,
191         "start-address": ip_schema,
192     },
193     "additionalProperties": False,
194 }
195
196 1 ip_profile_schema = {
197     "title": "ip profile validation schema",
198     "$schema": "http://json-schema.org/draft-04/schema#",
199     "type": "object",
200     "properties": {
201         "ip-version": {"enum": ["ipv4", "ipv6"]},
202         "subnet-address": ip_prefix_schema,
203         "gateway-address": ip_schema,
204         "dns-server": ip_profile_dns_schema,
205         "dhcp-params": ip_profile_dhcp_schema,
206     },
207 }
208
209 1 ip_profile_update_schema = {
210     "title": "ip profile validation schema",
211     "$schema": "http://json-schema.org/draft-04/schema#",
212     "type": "object",
213     "properties": {
214         "ip-version": {"enum": ["ipv4", "ipv6"]},
215         "subnet-address": {"oneOf": [null_schema, ip_prefix_schema]},
216         "gateway-address": {"oneOf": [null_schema, ip_schema]},
217         "dns-server": {"oneOf": [null_schema, ip_profile_dns_schema]},
218         "dhcp-params": {"oneOf": [null_schema, ip_profile_dhcp_schema]},
219     },
220     "additionalProperties": False,
221 }
222
223 1 provider_network_schema = {
224     "title": "provider network validation schema",
225     "$schema": "http://json-schema.org/draft-04/schema#",
226     "type": "object",
227     "properties": {
228         "physical-network": name_schema,
229         "segmentation-id": name_schema,
230         "sdn-ports": {  # external ports to append to the SDN-assist network
231             "type": "array",
232             "items": {
233                 "type": "object",
234                 "properties": {
235                     "switch_id": shortname_schema,
236                     "switch_port": shortname_schema,
237                     "mac_address": mac_schema,
238                     "vlan": vlan_schema,
239                 },
240                 "additionalProperties": True,
241             },
242         },
243         "network-type": shortname_schema,
244     },
245     "additionalProperties": True,
246 }
247
248 1 ns_instantiate_internal_vld = {
249     "title": "ns action instantiate input schema for vld",
250     "$schema": "http://json-schema.org/draft-04/schema#",
251     "type": "object",
252     "properties": {
253         "name": name_schema,
254         "vim-network-name": name_schema,
255         "vim-network-id": name_schema,
256         "ip-profile": ip_profile_update_schema,
257         "provider-network": provider_network_schema,
258         "internal-connection-point": {
259             "type": "array",
260             "minItems": 1,
261             "items": {
262                 "type": "object",
263                 "properties": {
264                     "id-ref": name_schema,
265                     "ip-address": ip_schema,
266                     # "mac-address": mac_schema,
267                 },
268                 "required": ["id-ref"],
269                 "minProperties": 2,
270                 "additionalProperties": False,
271             },
272         },
273     },
274     "required": ["name"],
275     "minProperties": 2,
276     "additionalProperties": False,
277 }
278
279 1 additional_params_for_vnf = {
280     "type": "array",
281     "items": {
282         "type": "object",
283         "properties": {
284             "member-vnf-index": name_schema,
285             "additionalParams": object_schema,
286             "k8s-namespace": name_schema,
287             "config-units": integer1_schema,  # number of configuration units of this vnf, by default 1
288             "additionalParamsForVdu": {
289                 "type": "array",
290                 "items": {
291                     "type": "object",
292                     "properties": {
293                         "vdu_id": name_schema,
294                         "additionalParams": object_schema,
295                         "config-units": integer1_schema,  # number of configuration units of this vdu, by default 1
296                     },
297                     "required": ["vdu_id"],
298                     "minProperties": 2,
299                     "additionalProperties": False,
300                 },
301             },
302             "additionalParamsForKdu": {
303                 "type": "array",
304                 "items": {
305                     "type": "object",
306                     "properties": {
307                         "kdu_name": name_schema,
308                         "additionalParams": object_schema,
309                         "kdu_model": name_schema,
310                         "k8s-namespace": name_schema,
311                         "config-units": integer1_schema,  # number of configuration units of this knf, by default 1
312                         "kdu-deployment-name": name_schema,
313                     },
314                     "required": ["kdu_name"],
315                     "minProperties": 2,
316                     "additionalProperties": False,
317                 },
318             },
319             "affinity-or-anti-affinity-group": {
320                 "type": "array",
321                 "items": {
322                     "type": "object",
323                     "properties": {
324                         "id": name_schema,
325                         "vim-affinity-group-id": name_schema,
326                     },
327                     "required": ["id"],
328                     "minProperties": 2,
329                     "additionalProperties": False,
330                 },
331             },
332         },
333         "required": ["member-vnf-index"],
334         "minProperties": 2,
335         "additionalProperties": False,
336     },
337 }
338
339 1 ns_instantiate = {
340     "title": "ns action instantiate input schema",
341     "$schema": "http://json-schema.org/draft-04/schema#",
342     "type": "object",
343     "properties": {
344         "lcmOperationType": string_schema,
345         "nsInstanceId": id_schema,
346         "netsliceInstanceId": id_schema,
347         "nsName": name_schema,
348         "nsDescription": {"oneOf": [description_schema, null_schema]},
349         "nsdId": id_schema,
350         "vimAccountId": id_schema,
351         "wimAccountId": {"oneOf": [id_schema, bool_schema, null_schema]},
352         "placement-engine": string_schema,
353         "placement-constraints": object_schema,
354         "additionalParamsForNs": object_schema,
355         "additionalParamsForVnf": additional_params_for_vnf,
356         "config-units": integer1_schema,  # number of configuration units of this ns, by default 1
357         "k8s-namespace": name_schema,
358         "ssh_keys": {"type": "array", "items": {"type": "string"}},
359         "timeout_ns_deploy": integer1_schema,
360         "nsr_id": id_schema,
361         "vduImage": name_schema,
362         "vnf": {
363             "type": "array",
364             "minItems": 1,
365             "items": {
366                 "type": "object",
367                 "properties": {
368                     "member-vnf-index": name_schema,
369                     "vimAccountId": id_schema,
370                     "vdu": {
371                         "type": "array",
372                         "minItems": 1,
373                         "items": ns_instantiate_vdu,
374                     },
375                     "internal-vld": {
376                         "type": "array",
377                         "minItems": 1,
378                         "items": ns_instantiate_internal_vld,
379                     },
380                 },
381                 "required": ["member-vnf-index"],
382                 "minProperties": 2,
383                 "additionalProperties": False,
384             },
385         },
386         "vld": {
387             "type": "array",
388             "minItems": 1,
389             "items": {
390                 "type": "object",
391                 "properties": {
392                     "name": string_schema,
393                     "vim-network-name": {"oneOf": [string_schema, object_schema]},
394                     "vim-network-id": {"oneOf": [string_schema, object_schema]},
395                     "ns-net": object_schema,
396                     "wimAccountId": {"oneOf": [id_schema, bool_schema, null_schema]},
397                     "ip-profile": object_schema,
398                     "provider-network": provider_network_schema,
399                     "vnfd-connection-point-ref": {
400                         "type": "array",
401                         "minItems": 1,
402                         "items": {
403                             "type": "object",
404                             "properties": {
405                                 "member-vnf-index-ref": name_schema,
406                                 "vnfd-connection-point-ref": name_schema,
407                                 "ip-address": {"oneOf": [ip_schema, ipv6_schema]},
408                                 # "mac-address": mac_schema,
409                             },
410                             "required": [
411                                 "member-vnf-index-ref",
412                                 "vnfd-connection-point-ref",
413                             ],
414                             "minProperties": 3,
415                             "additionalProperties": False,
416                         },
417                     },
418                 },
419                 "required": ["name"],
420                 "additionalProperties": False,
421             },
422         },
423     },
424     "required": ["nsName", "nsdId", "vimAccountId"],
425     "additionalProperties": False,
426 }
427
428 1 ns_terminate = {
429     "title": "ns terminate input schema",
430     "$schema": "http://json-schema.org/draft-04/schema#",
431     "type": "object",
432     "properties": {
433         "lcmOperationType": string_schema,
434         "nsInstanceId": id_schema,
435         "autoremove": bool_schema,
436         "timeout_ns_terminate": integer1_schema,
437         "skip_terminate_primitives": bool_schema,
438         "netsliceInstanceId": id_schema,
439     },
440     "additionalProperties": False,
441 }
442
443 1 ns_update = {
444     "title": "ns update input schema",
445     "$schema": "http://json-schema.org/draft-04/schema#",
446     "type": "object",
447     "properties": {
448         "lcmOperationType": string_schema,
449         "nsInstanceId": id_schema,
450         "timeout_ns_update": integer1_schema,
451         "updateType": {
452             "enum": ["CHANGE_VNFPKG", "REMOVE_VNF", "MODIFY_VNF_INFORMATION", "OPERATE_VNF"]
453         },
454         "modifyVnfInfoData": {
455             "type": "object",
456             "properties": {
457                 "vnfInstanceId": id_schema,
458                 "vnfdId": id_schema,
459             },
460             "required": ["vnfInstanceId", "vnfdId"],
461         },
462         "removeVnfInstanceId": id_schema,
463         "changeVnfPackageData": {
464             "type": "object",
465             "properties": {
466                 "vnfInstanceId": id_schema,
467                 "vnfdId": id_schema,
468             },
469             "required": ["vnfInstanceId", "vnfdId"],
470         },
471         "operateVnfData": {
472             "type": "object",
473             "properties": {
474                 "vnfInstanceId": id_schema,
475                 "changeStateTo": name_schema,
476                 "additionalParam": {
477                     "type": "object",
478                     "properties": {
479                         "run-day1": bool_schema,
480                         "vdu_id": name_schema,
481                         "count-index": integer0_schema,
482                     },
483                     "required": ["vdu_id", "count-index"],
484                     "additionalProperties": False,
485                 }
486             },
487             "required": ["vnfInstanceId", "changeStateTo"],
488         }
489     },
490     "required": ["updateType"],
491     "additionalProperties": False,
492 }
493
494 1 ns_action = {  # TODO for the moment it is only contemplated the vnfd primitive execution
495     "title": "ns action input schema",
496     "$schema": "http://json-schema.org/draft-04/schema#",
497     "type": "object",
498     "properties": {
499         "lcmOperationType": string_schema,
500         "nsInstanceId": id_schema,
501         "member_vnf_index": name_schema,
502         "vnf_member_index": name_schema,  # TODO for backward compatibility. To remove in future
503         "vdu_id": name_schema,
504         "vdu_count_index": integer0_schema,
505         "kdu_name": name_schema,
506         "primitive": name_schema,
507         "timeout_ns_action": integer1_schema,
508         "primitive_params": {"type": "object"},
509     },
510     "required": ["primitive", "primitive_params"],  # TODO add member_vnf_index
511     "additionalProperties": False,
512 }
513
514 1 ns_scale = {  # TODO for the moment it is only VDU-scaling
515     "title": "ns scale input schema",
516     "$schema": "http://json-schema.org/draft-04/schema#",
517     "type": "object",
518     "properties": {
519         "lcmOperationType": string_schema,
520         "nsInstanceId": id_schema,
521         "scaleType": {"enum": ["SCALE_VNF"]},
522         "timeout_ns_scale": integer1_schema,
523         "scaleVnfData": {
524             "type": "object",
525             "properties": {
526                 "vnfInstanceId": name_schema,
527                 "scaleVnfType": {"enum": ["SCALE_OUT", "SCALE_IN"]},
528                 "scaleByStepData": {
529                     "type": "object",
530                     "properties": {
531                         "scaling-group-descriptor": name_schema,
532                         "member-vnf-index": name_schema,
533                         "scaling-policy": name_schema,
534                     },
535                     "required": ["scaling-group-descriptor", "member-vnf-index"],
536                     "additionalProperties": False,
537                 },
538             },
539             "required": ["scaleVnfType", "scaleByStepData"],  # vnfInstanceId
540             "additionalProperties": False,
541         },
542         "scaleTime": time_schema,
543     },
544     "required": ["scaleType", "scaleVnfData"],
545     "additionalProperties": False,
546 }
547
548 1 ns_migrate = {
549     "title": "ns migrate input schema",
550     "$schema": "http://json-schema.org/draft-04/schema#",
551     "type": "object",
552     "properties": {
553         "lcmOperationType": string_schema,
554         "nsInstanceId": id_schema,
555         "vnfInstanceId": id_schema,
556         "migrateToHost": string_schema,
557         "vdu": {
558             "type": "object",
559                 "properties": {
560                     "vduId": name_schema,
561                     "vduCountIndex": integer0_schema,
562                 },
563                 "required": ["vduId"],
564                 "additionalProperties": False,
565         },
566     },
567     "required": ["vnfInstanceId"],
568     "additionalProperties": False
569 }
570
571 1 ns_heal = {
572     "title": "ns heal input schema",
573     "$schema": "http://json-schema.org/draft-04/schema#",
574     "type": "object",
575     "properties": {
576         "lcmOperationType": string_schema,
577         "nsInstanceId": id_schema,
578         "timeout_ns_heal": integer1_schema,
579         "healVnfData": {
580             "type": "array",
581             "items": {
582                 "type": "object",
583                 "properties": {
584                     "vnfInstanceId": id_schema,
585                     "cause": description_schema,
586                     "additionalParams": {
587                         "type": "object",
588                         "properties": {
589                             "run-day1": bool_schema,
590                             "vdu": {
591                                 "type": "array",
592                                 "items": {
593                                     "type": "object",
594                                     "properties": {
595                                         "run-day1": bool_schema,
596                                         "vdu-id": name_schema,
597                                         "count-index": integer0_schema,
598                                     },
599                                     "required": ["vdu-id"],
600                                     "additionalProperties": False,
601                                 },
602                             },
603                         },
604                         "additionalProperties": False,
605                     },
606                 },
607                 "required": ["vnfInstanceId"],
608                 "additionalProperties": False,
609             },
610         },
611     },
612     "required": ["healVnfData"],
613     "additionalProperties": False,
614 }
615
616 1 ns_verticalscale = {
617     "title": "vertial scale input schema",
618     "$schema": "http://json-schema.org/draft-04/schema#",
619     "type": "object",
620     "properties": {
621         "lcmOperationType": string_schema,
622         "verticalScale": string_schema,
623         "nsInstanceId": id_schema,
624         "changeVnfFlavorData": {
625             "type": "object",
626             "properties": {
627                 "vnfInstanceId": id_schema,
628                 "additionalParams": {
629                     "type": "object",
630                     "properties": {
631                         "vduid": string_schema,
632                         "vduCountIndex": integer0_schema,
633                         "virtualMemory": integer1_schema,
634                         "sizeOfStorage": integer0_schema,
635                         "numVirtualCpu": integer1_schema,
636                         },
637                     }
638                 },
639             "required": ["vnfInstanceId", "additionalParams"],
640             "additionalProperties": False,
641             }
642         },
643     "required": ["lcmOperationType", "verticalScale", "nsInstanceId"],
644     "additionalProperties": False,
645 }
646
647 1 schema_version = {"type": "string", "enum": ["1.0"]}
648 1 schema_type = {"type": "string"}
649 1 vim_type = shortname_schema  # {"enum": ["openstack", "openvim", "vmware", "opennebula", "aws", "azure", "fos"]}
650
651 1 vim_account_edit_schema = {
652     "title": "vim_account edit input schema",
653     "$schema": "http://json-schema.org/draft-04/schema#",
654     "type": "object",
655     "properties": {
656         "name": name_schema,
657         "description": description_schema,
658         "vim": name_schema,
659         "datacenter": name_schema,
660         "vim_type": vim_type,
661         "vim_url": description_schema,
662         # "vim_url_admin": description_schema,
663         # "vim_tenant": name_schema,
664         "vim_tenant_name": name_schema,
665         "vim_user": string_schema,
666         "vim_password": passwd_schema,
667         "vca": id_schema,
668         "config": {"type": "object"},
669         "prometheus-config": {"type": "object"},
670     },
671     "additionalProperties": False,
672 }
673
674 1 vim_account_new_schema = {
675     "title": "vim_account creation input schema",
676     "$schema": "http://json-schema.org/draft-04/schema#",
677     "type": "object",
678     "properties": {
679         "schema_version": schema_version,
680         "schema_type": schema_type,
681         "name": name_schema,
682         "description": description_schema,
683         "vim": name_schema,
684         "datacenter": name_schema,
685         "vim_type": vim_type,
686         "vim_url": description_schema,
687         # "vim_url_admin": description_schema,
688         # "vim_tenant": name_schema,
689         "vim_tenant_name": name_schema,
690         "vim_user": string_schema,
691         "vim_password": passwd_schema,
692         "vca": id_schema,
693         "config": {"type": "object"},
694         "prometheus-config": {"type": "object"},
695     },
696     "required": [
697         "name",
698         "vim_url",
699         "vim_type",
700         "vim_user",
701         "vim_password",
702         "vim_tenant_name",
703     ],
704     "additionalProperties": False,
705 }
706
707 1 wim_type = shortname_schema  # {"enum": ["ietfl2vpn", "onos", "odl", "dynpac", "fake"]}
708
709 1 wim_account_edit_schema = {
710     "title": "wim_account edit input schema",
711     "$schema": "http://json-schema.org/draft-04/schema#",
712     "type": "object",
713     "properties": {
714         "name": name_schema,
715         "description": description_schema,
716         "wim": name_schema,
717         "wim_type": wim_type,
718         "wim_url": description_schema,
719         "user": string_schema,
720         "password": passwd_schema,
721         "config": {"type": "object"},
722     },
723     "additionalProperties": False,
724 }
725
726 1 wim_account_new_schema = {
727     "title": "wim_account creation input schema",
728     "$schema": "http://json-schema.org/draft-04/schema#",
729     "type": "object",
730     "properties": {
731         "schema_version": schema_version,
732         "schema_type": schema_type,
733         "name": name_schema,
734         "description": description_schema,
735         "wim": name_schema,
736         "wim_type": wim_type,
737         "wim_url": description_schema,
738         "user": string_schema,
739         "password": passwd_schema,
740         "config": {
741             "type": "object",
742             "patternProperties": {".": {"not": {"type": "null"}}},
743         },
744     },
745     "required": ["name", "wim_url", "wim_type"],
746     "additionalProperties": False,
747 }
748
749 1 sdn_properties = {
750     "name": name_schema,
751     "type": {"type": "string"},
752     "url": {"type": "string"},
753     "user": string_schema,
754     "password": passwd_schema,
755     "config": {"type": "object"},
756     "description": description_schema,
757     # The folowing are deprecated. Maintanied for backward compatibility
758     "dpid": dpid_Schema,
759     "ip": ip_schema,
760     "port": port_schema,
761     "version": {"type": "string", "minLength": 1, "maxLength": 12},
762 }
763 1 sdn_new_schema = {
764     "title": "sdn controller information schema",
765     "$schema": "http://json-schema.org/draft-04/schema#",
766     "type": "object",
767     "properties": sdn_properties,
768     "required": ["name", "type"],
769     "additionalProperties": False,
770 }
771 1 sdn_edit_schema = {
772     "title": "sdn controller update information schema",
773     "$schema": "http://json-schema.org/draft-04/schema#",
774     "type": "object",
775     "properties": sdn_properties,
776     # "required": ["name", "port", 'ip', 'dpid', 'type'],
777     "additionalProperties": False,
778 }
779 1 sdn_port_mapping_schema = {
780     "$schema": "http://json-schema.org/draft-04/schema#",
781     "title": "sdn port mapping information schema",
782     "type": "array",
783     "items": {
784         "type": "object",
785         "properties": {
786             "compute_node": shortname_schema,
787             "ports": {
788                 "type": "array",
789                 "items": {
790                     "type": "object",
791                     "properties": {
792                         "pci": pci_extended_schema,
793                         "switch_port": shortname_schema,
794                         "switch_mac": mac_schema,
795                     },
796                     "required": ["pci"],
797                 },
798             },
799         },
800         "required": ["compute_node", "ports"],
801     },
802 }
803 1 sdn_external_port_schema = {
804     "$schema": "http://json-schema.org/draft-04/schema#",
805     "title": "External port information",
806     "type": "object",
807     "properties": {
808         "port": {"type": "string", "minLength": 1, "maxLength": 60},
809         "vlan": vlan_schema,
810         "mac": mac_schema,
811     },
812     "required": ["port"],
813 }
814
815 # K8s Clusters
816 1 k8scluster_deploy_method_schema = {
817     "$schema": "http://json-schema.org/draft-04/schema#",
818     "title": "Deployment methods for K8s cluster",
819     "type": "object",
820     "properties": {
821         "helm-chart": {"type": "boolean"},
822         "juju-bundle": {"type": "boolean"},
823         "helm-chart-v3": {"type": "boolean"},
824     },
825     "additionalProperties": False,
826     "minProperties": 3,
827 }
828 1 k8scluster_nets_schema = {
829     "title": "k8scluster nets input schema",
830     "$schema": "http://json-schema.org/draft-04/schema#",
831     "type": "object",
832     "patternProperties": {".": {"oneOf": [name_schema, null_schema]}},
833     "minProperties": 1,
834     "additionalProperties": False,
835 }
836 1 k8scluster_new_schema = {
837     "title": "k8scluster creation input schema",
838     "$schema": "http://json-schema.org/draft-04/schema#",
839     "type": "object",
840     "properties": {
841         "schema_version": schema_version,
842         "schema_type": schema_type,
843         "name": name_schema,
844         "description": description_schema,
845         "credentials": object_schema,
846         "vim_account": id_schema,
847         "vca_id": id_schema,
848         "k8s_version": string_schema,
849         "nets": k8scluster_nets_schema,
850         "deployment_methods": k8scluster_deploy_method_schema,
851         "namespace": name_schema,
852         "cni": nameshort_list_schema,
853     },
854     "required": ["name", "credentials", "vim_account", "k8s_version", "nets"],
855     "additionalProperties": False,
856 }
857 1 k8scluster_edit_schema = {
858     "title": "vim_account edit input schema",
859     "$schema": "http://json-schema.org/draft-04/schema#",
860     "type": "object",
861     "properties": {
862         "name": name_schema,
863         "description": description_schema,
864         "credentials": object_schema,
865         "vim_account": id_schema,
866         "vca_id": id_schema,
867         "k8s_version": string_schema,
868         "nets": k8scluster_nets_schema,
869         "namespace": name_schema,
870         "cni": nameshort_list_schema,
871     },
872     "additionalProperties": False,
873 }
874
875 # VCA
876 1 vca_new_schema = {
877     "title": "vca creation input schema",
878     "$schema": "http://json-schema.org/draft-04/schema#",
879     "type": "object",
880     "properties": {
881         "schema_version": schema_version,
882         "schema_type": schema_type,
883         "name": name_schema,
884         "description": description_schema,
885         "endpoints": description_list_schema,
886         "user": string_schema,
887         "secret": passwd_schema,
888         "cacert": long_description_schema,
889         "lxd-cloud": shortname_schema,
890         "lxd-credentials": shortname_schema,
891         "k8s-cloud": shortname_schema,
892         "k8s-credentials": shortname_schema,
893         "model-config": object_schema,
894     },
895     "required": [
896         "name",
897         "endpoints",
898         "user",
899         "secret",
900         "cacert",
901         "lxd-cloud",
902         "lxd-credentials",
903         "k8s-cloud",
904         "k8s-credentials",
905     ],
906     "additionalProperties": False,
907 }
908 1 vca_edit_schema = {
909     "title": "vca creation input schema",
910     "$schema": "http://json-schema.org/draft-04/schema#",
911     "type": "object",
912     "properties": {
913         "name": name_schema,
914         "description": description_schema,
915         "endpoints": description_list_schema,
916         "port": integer1_schema,
917         "user": string_schema,
918         "secret": passwd_schema,
919         "cacert": long_description_schema,
920         "lxd-cloud": shortname_schema,
921         "lxd-credentials": shortname_schema,
922         "k8s-cloud": shortname_schema,
923         "k8s-credentials": shortname_schema,
924         "model-config": object_schema,
925     },
926     "additionalProperties": False,
927 }
928
929 # K8s Repos
930 1 k8srepo_types = {"enum": ["helm-chart", "juju-bundle"]}
931 1 k8srepo_properties = {
932     "name": name_schema,
933     "description": description_schema,
934     "type": k8srepo_types,
935     "url": description_schema,
936 }
937 1 k8srepo_new_schema = {
938     "title": "k8scluster creation input schema",
939     "$schema": "http://json-schema.org/draft-04/schema#",
940     "type": "object",
941     "properties": k8srepo_properties,
942     "required": ["name", "type", "url"],
943     "additionalProperties": False,
944 }
945 1 k8srepo_edit_schema = {
946     "title": "vim_account edit input schema",
947     "$schema": "http://json-schema.org/draft-04/schema#",
948     "type": "object",
949     "properties": k8srepo_properties,
950     "additionalProperties": False,
951 }
952
953 # OSM Repos
954 1 osmrepo_types = {"enum": ["osm"]}
955 1 osmrepo_properties = {
956     "name": name_schema,
957     "description": description_schema,
958     "type": osmrepo_types,
959     "url": description_schema
960     # "user": string_schema,
961     # "password": passwd_schema
962 }
963 1 osmrepo_new_schema = {
964     "title": "osm repo creation input schema",
965     "$schema": "http://json-schema.org/draft-04/schema#",
966     "type": "object",
967     "properties": osmrepo_properties,
968     "required": ["name", "type", "url"],
969     "additionalProperties": False,
970 }
971 1 osmrepo_edit_schema = {
972     "title": "osm repo edit input schema",
973     "$schema": "http://json-schema.org/draft-04/schema#",
974     "type": "object",
975     "properties": osmrepo_properties,
976     "additionalProperties": False,
977 }
978
979 # PDUs
980 1 pdu_interface = {
981     "type": "object",
982     "properties": {
983         "name": shortname_schema,
984         "mgmt": bool_schema,
985         "type": {"enum": ["overlay", "underlay"]},
986         "ip-address": {"oneOf": [ip_schema, ipv6_schema]},
987         # TODO, add user, password, ssh-key
988         "mac-address": mac_schema,
989         "vim-network-name": shortname_schema,  # interface is connected to one vim network, or switch port
990         "vim-network-id": shortname_schema,
991         # # provide this in case SDN assist must deal with this interface
992         # "switch-dpid": dpid_Schema,
993         # "switch-port": shortname_schema,
994         # "switch-mac": shortname_schema,
995         # "switch-vlan": vlan_schema,
996     },
997     "required": ["name", "mgmt", "ip-address"],
998     "additionalProperties": False,
999 }
1000 1 pdu_new_schema = {
1001     "title": "pdu creation input schema",
1002     "$schema": "http://json-schema.org/draft-04/schema#",
1003     "type": "object",
1004     "properties": {
1005         "name": shortname_schema,
1006         "type": shortname_schema,
1007         "description": description_schema,
1008         "shared": bool_schema,
1009         "vims": nameshort_list_schema,
1010         "vim_accounts": nameshort_list_schema,
1011         "interfaces": {"type": "array", "items": pdu_interface, "minItems": 1},
1012     },
1013     "required": ["name", "type", "interfaces"],
1014     "additionalProperties": False,
1015 }
1016 1 pdu_edit_schema = {
1017     "title": "pdu edit input schema",
1018     "$schema": "http://json-schema.org/draft-04/schema#",
1019     "type": "object",
1020     "properties": {
1021         "name": shortname_schema,
1022         "type": shortname_schema,
1023         "description": description_schema,
1024         "shared": bool_schema,
1025         "vims": {"oneOf": [array_edition_schema, nameshort_list_schema]},
1026         "vim_accounts": {"oneOf": [array_edition_schema, nameshort_list_schema]},
1027         "interfaces": {
1028             "oneOf": [
1029                 array_edition_schema,
1030                 {"type": "array", "items": pdu_interface, "minItems": 1},
1031             ]
1032         },
1033     },
1034     "additionalProperties": False,
1035     "minProperties": 1,
1036 }
1037
1038 # VNF PKG OPERATIONS
1039 1 vnfpkgop_new_schema = {
1040     "title": "VNF PKG operation creation input schema",
1041     "$schema": "http://json-schema.org/draft-04/schema#",
1042     "type": "object",
1043     "properties": {
1044         "lcmOperationType": string_schema,
1045         "vnfPkgId": id_schema,
1046         "kdu_name": name_schema,
1047         "primitive": name_schema,
1048         "primitive_params": {"type": "object"},
1049     },
1050     "required": [
1051         "lcmOperationType",
1052         "vnfPkgId",
1053         "kdu_name",
1054         "primitive",
1055         "primitive_params",
1056     ],
1057     "additionalProperties": False,
1058 }
1059
1060 # USERS
1061 1 project_role_mappings = {
1062     "title": "list pf projects/roles",
1063     "$schema": "http://json-schema.org/draft-04/schema#",
1064     "type": "array",
1065     "items": {
1066         "type": "object",
1067         "properties": {"project": shortname_schema, "role": shortname_schema},
1068         "required": ["project", "role"],
1069         "additionalProperties": False,
1070     },
1071     "minItems": 1,
1072 }
1073 1 project_role_mappings_optional = {
1074     "title": "list of projects/roles or projects only",
1075     "$schema": "http://json-schema.org/draft-04/schema#",
1076     "type": "array",
1077     "items": {
1078         "type": "object",
1079         "properties": {"project": shortname_schema, "role": shortname_schema},
1080         "required": ["project"],
1081         "additionalProperties": False,
1082     },
1083     "minItems": 1,
1084 }
1085 1 user_new_schema = {
1086     "$schema": "http://json-schema.org/draft-04/schema#",
1087     "title": "New user schema",
1088     "type": "object",
1089     "properties": {
1090         "username": string_schema,
1091         "domain_name": shortname_schema,
1092         "password": passwd_schema,
1093         "projects": nameshort_list_schema,
1094         "project_role_mappings": project_role_mappings,
1095     },
1096     "required": ["username", "password"],
1097     "additionalProperties": False,
1098 }
1099 1 user_edit_schema = {
1100     "$schema": "http://json-schema.org/draft-04/schema#",
1101     "title": "User edit schema for administrators",
1102     "type": "object",
1103     "properties": {
1104         "password": passwd_schema,
1105         "old_password": passwd_schema,
1106         "username": string_schema,  # To allow User Name modification
1107         "projects": {"oneOf": [nameshort_list_schema, array_edition_schema]},
1108         "project_role_mappings": project_role_mappings,
1109         "add_project_role_mappings": project_role_mappings,
1110         "remove_project_role_mappings": project_role_mappings_optional,
1111     },
1112     "minProperties": 1,
1113     "additionalProperties": False,
1114 }
1115
1116 # PROJECTS
1117 1 topics_with_quota = [
1118     "vnfds",
1119     "nsds",
1120     "slice_templates",
1121     "pduds",
1122     "ns_instances",
1123     "slice_instances",
1124     "vim_accounts",
1125     "wim_accounts",
1126     "sdn_controllers",
1127     "k8sclusters",
1128     "vca",
1129     "k8srepos",
1130     "osmrepos",
1131     "ns_subscriptions",
1132 ]
1133 1 project_new_schema = {
1134     "$schema": "http://json-schema.org/draft-04/schema#",
1135     "title": "New project schema for administrators",
1136     "type": "object",
1137     "properties": {
1138         "name": shortname_schema,
1139         "admin": bool_schema,
1140         "domain_name": shortname_schema,
1141         "quotas": {
1142             "type": "object",
1143             "properties": {topic: integer0_schema for topic in topics_with_quota},
1144             "additionalProperties": False,
1145         },
1146     },
1147     "required": ["name"],
1148     "additionalProperties": False,
1149 }
1150 1 project_edit_schema = {
1151     "$schema": "http://json-schema.org/draft-04/schema#",
1152     "title": "Project edit schema for administrators",
1153     "type": "object",
1154     "properties": {
1155         "admin": bool_schema,
1156         "name": shortname_schema,  # To allow Project Name modification
1157         "quotas": {
1158             "type": "object",
1159             "properties": {
1160                 topic: {"oneOf": [integer0_schema, null_schema]}
1161                 for topic in topics_with_quota
1162             },
1163             "additionalProperties": False,
1164         },
1165     },
1166     "additionalProperties": False,
1167     "minProperties": 1,
1168 }
1169
1170 # ROLES
1171 1 roles_new_schema = {
1172     "$schema": "http://json-schema.org/draft-04/schema#",
1173     "title": "New role schema for administrators",
1174     "type": "object",
1175     "properties": {
1176         "name": shortname_schema,
1177         "permissions": {
1178             "type": "object",
1179             "patternProperties": {
1180                 ".": bool_schema,
1181             },
1182             # "minProperties": 1,
1183         },
1184     },
1185     "required": ["name"],
1186     "additionalProperties": False,
1187 }
1188 1 roles_edit_schema = {
1189     "$schema": "http://json-schema.org/draft-04/schema#",
1190     "title": "Roles edit schema for administrators",
1191     "type": "object",
1192     "properties": {
1193         "name": shortname_schema,
1194         "permissions": {
1195             "type": "object",
1196             "patternProperties": {".": {"oneOf": [bool_schema, null_schema]}},
1197             # "minProperties": 1,
1198         },
1199     },
1200     "additionalProperties": False,
1201     "minProperties": 1,
1202 }
1203
1204 # GLOBAL SCHEMAS
1205
1206 1 nbi_new_input_schemas = {
1207     "users": user_new_schema,
1208     "projects": project_new_schema,
1209     "vim_accounts": vim_account_new_schema,
1210     "sdns": sdn_new_schema,
1211     "ns_instantiate": ns_instantiate,
1212     "ns_action": ns_action,
1213     "ns_scale": ns_scale,
1214     "ns_update": ns_update,
1215     "ns_heal": ns_heal,
1216     "pdus": pdu_new_schema,
1217 }
1218
1219 1 nbi_edit_input_schemas = {
1220     "users": user_edit_schema,
1221     "projects": project_edit_schema,
1222     "vim_accounts": vim_account_edit_schema,
1223     "sdns": sdn_edit_schema,
1224     "pdus": pdu_edit_schema,
1225 }
1226
1227 # NETSLICE SCHEMAS
1228 1 nsi_subnet_instantiate = deepcopy(ns_instantiate)
1229 1 nsi_subnet_instantiate["title"] = "netslice subnet instantiation params input schema"
1230 1 nsi_subnet_instantiate["properties"]["id"] = name_schema
1231 1 del nsi_subnet_instantiate["required"]
1232
1233 1 nsi_vld_instantiate = {
1234     "title": "netslice vld instantiation params input schema",
1235     "$schema": "http://json-schema.org/draft-04/schema#",
1236     "type": "object",
1237     "properties": {
1238         "name": string_schema,
1239         "vim-network-name": {"oneOf": [string_schema, object_schema]},
1240         "vim-network-id": {"oneOf": [string_schema, object_schema]},
1241         "ip-profile": object_schema,
1242     },
1243     "required": ["name"],
1244     "additionalProperties": False,
1245 }
1246
1247 1 nsi_instantiate = {
1248     "title": "netslice action instantiate input schema",
1249     "$schema": "http://json-schema.org/draft-04/schema#",
1250     "type": "object",
1251     "properties": {
1252         "lcmOperationType": string_schema,
1253         "netsliceInstanceId": id_schema,
1254         "nsiName": name_schema,
1255         "nsiDescription": {"oneOf": [description_schema, null_schema]},
1256         "nstId": string_schema,
1257         "vimAccountId": id_schema,
1258         "timeout_nsi_deploy": integer1_schema,
1259         "ssh_keys": {"type": "array", "items": {"type": "string"}},
1260         "nsi_id": id_schema,
1261         "additionalParamsForNsi": object_schema,
1262         "netslice-subnet": {
1263             "type": "array",
1264             "minItems": 1,
1265             "items": nsi_subnet_instantiate,
1266         },
1267         "netslice-vld": {"type": "array", "minItems": 1, "items": nsi_vld_instantiate},
1268     },
1269     "required": ["nsiName", "nstId", "vimAccountId"],
1270     "additionalProperties": False,
1271 }
1272
1273 1 nsi_action = {}
1274
1275 1 nsi_terminate = {}
1276
1277 1 nsinstancesubscriptionfilter_schema = {
1278     "title": "instance identifier schema",
1279     "$schema": "http://json-schema.org/draft-07/schema#",
1280     "type": "object",
1281     "properties": {
1282         "nsdIds": {"type": "array"},
1283         "vnfdIds": {"type": "array"},
1284         "pnfdIds": {"type": "array"},
1285         "nsInstanceIds": {"type": "array"},
1286         "nsInstanceNames": {"type": "array"},
1287     },
1288 }
1289
1290 1 nslcmsub_schema = {
1291     "title": "nslcmsubscription input schema",
1292     "$schema": "http://json-schema.org/draft-07/schema#",
1293     "type": "object",
1294     "properties": {
1295         "nsInstanceSubscriptionFilter": nsinstancesubscriptionfilter_schema,
1296         "notificationTypes": {
1297             "type": "array",
1298             "items": {
1299                 "enum": [
1300                     "NsLcmOperationOccurrenceNotification",
1301                     "NsChangeNotification",
1302                     "NsIdentifierCreationNotification",
1303                     "NsIdentifierDeletionNotification",
1304                 ]
1305             },
1306         },
1307         "operationTypes": {
1308             "type": "array",
1309             "items": {"enum": ["INSTANTIATE", "SCALE", "TERMINATE", "UPDATE", "HEAL"]},
1310         },
1311         "operationStates": {
1312             "type": "array",
1313             "items": {
1314                 "enum": [
1315                     "PROCESSING",
1316                     "COMPLETED",
1317                     "PARTIALLY_COMPLETED",
1318                     "FAILED",
1319                     "FAILED_TEMP",
1320                     "ROLLING_BACK",
1321                     "ROLLED_BACK",
1322                 ]
1323             },
1324         },
1325         "nsComponentTypes": {"type": "array", "items": {"enum": ["VNF", "NS", "PNF"]}},
1326         "lcmOpNameImpactingNsComponent": {
1327             "type": "array",
1328             "items": {
1329                 "enum": [
1330                     "VNF_INSTANTIATE",
1331                     "VNF_SCALE",
1332                     "VNF_SCALE_TO_LEVEL",
1333                     "VNF_CHANGE_FLAVOUR",
1334                     "VNF_TERMINATE",
1335                     "VNF_HEAL",
1336                     "VNF_OPERATE",
1337                     "VNF_CHANGE_EXT_CONN",
1338                     "VNF_MODIFY_INFO",
1339                     "NS_INSTANTIATE",
1340                     "NS_SCALE",
1341                     "NS_UPDATE",
1342                     "NS_TERMINATE",
1343                     "NS_HEAL",
1344                 ]
1345             },
1346         },
1347         "lcmOpOccStatusImpactingNsComponent": {
1348             "type": "array",
1349             "items": {
1350                 "enum": [
1351                     "START",
1352                     "COMPLETED",
1353                     "PARTIALLY_COMPLETED",
1354                     "FAILED",
1355                     "ROLLED_BACK",
1356                 ]
1357             },
1358         },
1359     },
1360     "allOf": [
1361         {
1362             "if": {
1363                 "properties": {
1364                     "notificationTypes": {
1365                         "contains": {"const": "NsLcmOperationOccurrenceNotification"}
1366                     }
1367                 },
1368             },
1369             "then": {
1370                 "anyOf": [
1371                     {"required": ["operationTypes"]},
1372                     {"required": ["operationStates"]},
1373                 ]
1374             },
1375         },
1376         {
1377             "if": {
1378                 "properties": {
1379                     "notificationTypes": {"contains": {"const": "NsChangeNotification"}}
1380                 },
1381             },
1382             "then": {
1383                 "anyOf": [
1384                     {"required": ["nsComponentTypes"]},
1385                     {"required": ["lcmOpNameImpactingNsComponent"]},
1386                     {"required": ["lcmOpOccStatusImpactingNsComponent"]},
1387                 ]
1388             },
1389         },
1390     ],
1391 }
1392
1393 1 authentication_schema = {
1394     "title": "authentication schema for subscription",
1395     "$schema": "http://json-schema.org/draft-07/schema#",
1396     "type": "object",
1397     "properties": {
1398         "authType": {"enum": ["basic"]},
1399         "paramsBasic": {
1400             "type": "object",
1401             "properties": {
1402                 "userName": string_schema,
1403                 "password": passwd_schema,
1404             },
1405         },
1406     },
1407 }
1408
1409 1 subscription = {
1410     "title": "subscription input schema",
1411     "$schema": "http://json-schema.org/draft-07/schema#",
1412     "type": "object",
1413     "properties": {
1414         "filter": nslcmsub_schema,
1415         "CallbackUri": description_schema,
1416         "authentication": authentication_schema,
1417     },
1418     "required": ["CallbackUri"],
1419 }
1420
1421 1 vnflcmsub_schema = {
1422     "title": "vnflcmsubscription input schema",
1423     "$schema": "http://json-schema.org/draft-07/schema#",
1424     "type": "object",
1425     "properties": {
1426         "VnfInstanceSubscriptionFilter": {
1427             "type": "object",
1428             "properties": {
1429                 "vnfdIds": {"type": "array"},
1430                 "vnfInstanceIds": {"type": "array"},
1431             },
1432         },
1433         "notificationTypes": {
1434             "type": "array",
1435             "items": {
1436                 "enum": [
1437                     "VnfIdentifierCreationNotification",
1438                     "VnfLcmOperationOccurrenceNotification",
1439                     "VnfIdentifierDeletionNotification"
1440                     ]
1441             }
1442         },
1443         "operationTypes": {
1444             "type": "array",
1445             "items": {
1446                 "enum": [
1447                     "INSTANTIATE", "SCALE", "SCALE_TO_LEVEL", "CHANGE_FLAVOUR", "TERMINATE",
1448                     "HEAL", "OPERATE", "CHANGE_EXT_CONN", "MODIFY_INFO", "CREATE_SNAPSHOT",
1449                     "REVERT_TO_SNAPSHOT", "CHANGE_VNFPKG"
1450                     ]
1451             }
1452         },
1453         "operationStates": {
1454             "type": "array",
1455             "items": {
1456                 "enum": [
1457                     "STARTING", "PROCESSING", "COMPLETED", "FAILED_TEMP", "FAILED",
1458                     "ROLLING_BACK", "ROLLED_BACK"
1459                     ]
1460             }
1461         }
1462     },
1463     "required": ["VnfInstanceSubscriptionFilter", "notificationTypes"]
1464  }
1465
1466 1 vnf_subscription = {
1467     "title": "vnf subscription input schema",
1468     "$schema": "http://json-schema.org/draft-07/schema#",
1469     "type": "object",
1470     "properties": {
1471         "filter": vnflcmsub_schema,
1472         "CallbackUri": description_schema,
1473         "authentication": authentication_schema
1474     },
1475     "required": ["filter", "CallbackUri"]
1476 }
1477
1478
1479 1 class ValidationError(Exception):
1480 1     def __init__(self, message, http_code=HTTPStatus.UNPROCESSABLE_ENTITY):
1481 1         self.http_code = http_code
1482 1         Exception.__init__(self, message)
1483
1484
1485 1 def validate_input(indata, schema_to_use):
1486     """
1487     Validates input data against json schema
1488     :param indata: user input data. Should be a dictionary
1489     :param schema_to_use: jsonschema to test
1490     :return: None if ok, raises ValidationError exception on error
1491     """
1492 1     try:
1493 1         if schema_to_use:
1494 1             js_v(indata, schema_to_use)
1495 1         return None
1496 1     except js_e.ValidationError as e:
1497 1         if e.path:
1498 1             error_pos = "at '" + ":".join(map(str, e.path)) + "'"
1499         else:
1500 1             error_pos = ""
1501 1         raise ValidationError("Format error {} '{}' ".format(error_pos, e.message))
1502 0     except js_e.SchemaError:
1503 0         raise ValidationError(
1504             "Bad json schema {}".format(schema_to_use),
1505             http_code=HTTPStatus.INTERNAL_SERVER_ERROR,
1506         )
1507
1508
1509 1 def is_valid_uuid(x):
1510     """
1511     Test for a valid UUID
1512     :param x: string to test
1513     :return: True if x is a valid uuid, False otherwise
1514     """
1515 1     try:
1516 1         if UUID(x):
1517 1             return True
1518 1     except (TypeError, ValueError, AttributeError):
1519 1         return False