blob: 9cfd9a657f0324b00b6453f895a5a6f02cd2558e [file] [log] [blame]
tierno0f98af52018-03-19 10:28:22 +01001# -*- coding: utf-8 -*-
2
tiernod125caf2018-11-22 16:05:54 +00003# 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
tierno0f98af52018-03-19 10:28:22 +010016from jsonschema import validate as js_v, exceptions as js_e
tierno36ec8602018-11-02 17:27:11 +010017from http import HTTPStatus
garciadeblasdaf8cc52018-11-30 14:17:20 +010018from copy import deepcopy
delacruzramoc061f562019-04-05 11:00:02 +020019from uuid import UUID # To test for valid UUID
tierno0f98af52018-03-19 10:28:22 +010020
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 = "^[ -~]+$"
tiernofd160572019-01-21 10:41:37 +000031shortname_schema = {"type": "string", "minLength": 1, "maxLength": 60, "pattern": "^[^,;()\\.\\$'\"]+$"}
tierno0f98af52018-03-19 10:28:22 +010032passwd_schema = {"type": "string", "minLength": 1, "maxLength": 60}
tierno0f98af52018-03-19 10:28:22 +010033name_schema = {"type": "string", "minLength": 1, "maxLength": 255, "pattern": "^[^,;()'\"]+$"}
tierno0da52252018-06-27 15:47:22 +020034string_schema = {"type": "string", "minLength": 1, "maxLength": 255}
tierno0f98af52018-03-19 10:28:22 +010035xml_text_schema = {"type": "string", "minLength": 1, "maxLength": 1000, "pattern": "^[^']+$"}
36description_schema = {"type": ["string", "null"], "maxLength": 255, "pattern": "^[^'\"]+$"}
tierno441dbbf2018-07-10 12:52:48 +020037id_schema_fake = {"type": "string", "minLength": 2, "maxLength": 36}
38bool_schema = {"type": "boolean"}
39null_schema = {"type": "null"}
tierno2236d202018-05-16 19:05:16 +020040# "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}$"
tierno0f98af52018-03-19 10:28:22 +010041id_schema = {"type": "string", "pattern": "^[a-fA-F0-9]{8}(-[a-fA-F0-9]{4}){3}-[a-fA-F0-9]{12}$"}
tiernof759d822018-06-11 18:54:54 +020042time_schema = {"type": "string", "pattern": "^[0-9]{4}-[0-1][0-9]-[0-3][0-9]T[0-2][0-9]([0-5]:){2}"}
tierno87006042018-10-24 12:50:20 +020043pci_schema = {"type": "string", "pattern": "^[0-9a-fA-F]{4}(:[0-9a-fA-F]{2}){2}\\.[0-9a-fA-F]$"}
tierno42fce592018-11-02 09:23:43 +010044# allows [] for wildcards. For that reason huge length limit is set
45pci_extended_schema = {"type": "string", "pattern": "^[0-9a-fA-F.:-\\[\\]]{12,40}$"}
tierno0f98af52018-03-19 10:28:22 +010046http_schema = {"type": "string", "pattern": "^https?://[^'\"=]+$"}
47bandwidth_schema = {"type": "string", "pattern": "^[0-9]+ *([MG]bps)?$"}
48memory_schema = {"type": "string", "pattern": "^[0-9]+ *([MG]i?[Bb])?$"}
49integer0_schema = {"type": "integer", "minimum": 0}
50integer1_schema = {"type": "integer", "minimum": 1}
tierno87006042018-10-24 12:50:20 +020051path_schema = {"type": "string", "pattern": "^(\\.){0,2}(/[^/\"':{}\\(\\)]+)+$"}
tierno0f98af52018-03-19 10:28:22 +010052vlan_schema = {"type": "integer", "minimum": 1, "maximum": 4095}
53vlan1000_schema = {"type": "integer", "minimum": 1000, "maximum": 4095}
54mac_schema = {"type": "string",
55 "pattern": "^[0-9a-fA-F][02468aceACE](:[0-9a-fA-F]{2}){5}$"} # must be unicast: LSB bit of MSB byte ==0
tiernocb83c942018-09-24 17:28:13 +020056dpid_Schema = {"type": "string", "pattern": "^[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){7}$"}
tierno0f98af52018-03-19 10:28:22 +010057# mac_schema={"type":"string", "pattern":"^([0-9a-fA-F]{2}:){5}[0-9a-fA-F]{2}$"}
58ip_schema = {"type": "string",
tierno87006042018-10-24 12:50:20 +020059 "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]?)$"}
tierno0f98af52018-03-19 10:28:22 +010060ip_prefix_schema = {"type": "string",
tierno87006042018-10-24 12:50:20 +020061 "pattern": "^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}"
tierno2236d202018-05-16 19:05:16 +020062 "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)/(30|[12]?[0-9])$"}
tierno0f98af52018-03-19 10:28:22 +010063port_schema = {"type": "integer", "minimum": 1, "maximum": 65534}
64object_schema = {"type": "object"}
65schema_version_2 = {"type": "integer", "minimum": 2, "maximum": 2}
66# schema_version_string={"type":"string","enum": ["0.1", "2", "0.2", "3", "0.3"]}
67log_level_schema = {"type": "string", "enum": ["DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"]}
68checksum_schema = {"type": "string", "pattern": "^[0-9a-fA-F]{32}$"}
69size_schema = {"type": "integer", "minimum": 1, "maximum": 100}
tiernocd54a4a2018-09-12 16:40:35 +020070array_edition_schema = {
71 "type": "object",
72 "patternProperties": {
tiernofd160572019-01-21 10:41:37 +000073 "^\\$": {}
tiernocd54a4a2018-09-12 16:40:35 +020074 },
75 "additionalProperties": False,
76 "minProperties": 1,
77}
tiernocb83c942018-09-24 17:28:13 +020078nameshort_list_schema = {
79 "type": "array",
80 "minItems": 1,
tiernofd160572019-01-21 10:41:37 +000081 "items": shortname_schema,
tiernocb83c942018-09-24 17:28:13 +020082}
tiernocd54a4a2018-09-12 16:40:35 +020083
tierno0f98af52018-03-19 10:28:22 +010084
tierno441dbbf2018-07-10 12:52:48 +020085ns_instantiate_vdu = {
86 "title": "ns action instantiate input schema for vdu",
87 "$schema": "http://json-schema.org/draft-04/schema#",
88 "type": "object",
89 "properties": {
90 "id": name_schema,
91 "volume": {
92 "type": "array",
93 "minItems": 1,
94 "items": {
95 "type": "object",
96 "properties": {
97 "name": name_schema,
98 "vim-volume-id": name_schema,
99 },
100 "required": ["name", "vim-volume-id"],
101 "additionalProperties": False
102 }
103 },
104 "interface": {
105 "type": "array",
106 "minItems": 1,
107 "items": {
108 "type": "object",
109 "properties": {
110 "name": name_schema,
111 "ip-address": ip_schema,
112 "mac-address": mac_schema,
113 "floating-ip-required": bool_schema,
114 },
115 "required": ["name"],
116 "additionalProperties": False
117 }
118 }
119 },
120 "required": ["id"],
121 "additionalProperties": False
122}
123
124ip_profile_dns_schema = {
125 "type": "array",
126 "minItems": 1,
127 "items": {
128 "type": "object",
129 "properties": {
130 "address": ip_schema,
131 },
132 "required": ["address"],
133 "additionalProperties": False
134 }
135}
136
137ip_profile_dhcp_schema = {
138 "type": "object",
139 "properties": {
140 "enabled": {"type": "boolean"},
141 "count": integer1_schema,
142 "start-address": ip_schema
143 },
144 "additionalProperties": False,
145}
146
147ip_profile_schema = {
tierno2a929042020-03-10 16:34:25 +0000148 "title": "ip profile validation schema",
tierno441dbbf2018-07-10 12:52:48 +0200149 "$schema": "http://json-schema.org/draft-04/schema#",
150 "type": "object",
151 "properties": {
152 "ip-version": {"enum": ["ipv4", "ipv6"]},
153 "subnet-address": ip_prefix_schema,
154 "gateway-address": ip_schema,
155 "dns-server": ip_profile_dns_schema,
156 "dhcp-params": ip_profile_dhcp_schema,
157 }
158}
159
160ip_profile_update_schema = {
tierno2a929042020-03-10 16:34:25 +0000161 "title": "ip profile validation schema",
tierno441dbbf2018-07-10 12:52:48 +0200162 "$schema": "http://json-schema.org/draft-04/schema#",
163 "type": "object",
164 "properties": {
165 "ip-version": {"enum": ["ipv4", "ipv6"]},
166 "subnet-address": {"oneOf": [null_schema, ip_prefix_schema]},
167 "gateway-address": {"oneOf": [null_schema, ip_schema]},
168 "dns-server": {"oneOf": [null_schema, ip_profile_dns_schema]},
169
170 "dhcp-params": {"oneOf": [null_schema, ip_profile_dhcp_schema]},
171 },
172 "additionalProperties": False
173}
174
kbsub21f03f52019-10-17 16:26:56 +0000175provider_network_schema = {
tierno2a929042020-03-10 16:34:25 +0000176 "title": "provider network validation schema",
kbsub21f03f52019-10-17 16:26:56 +0000177 "$schema": "http://json-schema.org/draft-04/schema#",
178 "type": "object",
179 "properties": {
180 "physical-network": name_schema,
181 "segmentation-id": name_schema,
tierno2a929042020-03-10 16:34:25 +0000182 "sdn-ports": { # external ports to append to the SDN-assist network
183 "type": "array",
184 "items": {
185 "type": "object",
186 "properties": {
187 "switch_id": shortname_schema,
188 "switch_port": shortname_schema,
189 "mac_address": mac_schema,
190 "vlan": vlan_schema,
191 },
192 "additionalProperties": True
193 }
194 },
195 "network-type": shortname_schema,
kbsub21f03f52019-10-17 16:26:56 +0000196 },
tierno2a929042020-03-10 16:34:25 +0000197 "additionalProperties": True
kbsub21f03f52019-10-17 16:26:56 +0000198}
199
tierno441dbbf2018-07-10 12:52:48 +0200200ns_instantiate_internal_vld = {
201 "title": "ns action instantiate input schema for vdu",
202 "$schema": "http://json-schema.org/draft-04/schema#",
203 "type": "object",
204 "properties": {
205 "name": name_schema,
206 "vim-network-name": name_schema,
gcalvino17d5b732018-12-17 16:26:21 +0100207 "vim-network-id": name_schema,
tierno441dbbf2018-07-10 12:52:48 +0200208 "ip-profile": ip_profile_update_schema,
kbsub21f03f52019-10-17 16:26:56 +0000209 "provider-network": provider_network_schema,
tierno441dbbf2018-07-10 12:52:48 +0200210 "internal-connection-point": {
211 "type": "array",
212 "minItems": 1,
213 "items": {
214 "type": "object",
215 "properties": {
216 "id-ref": name_schema,
217 "ip-address": ip_schema,
tiernob7c6f2a2018-09-03 14:32:10 +0200218 # "mac-address": mac_schema,
tierno441dbbf2018-07-10 12:52:48 +0200219 },
tiernob7c6f2a2018-09-03 14:32:10 +0200220 "required": ["id-ref"],
221 "minProperties": 2,
tierno441dbbf2018-07-10 12:52:48 +0200222 "additionalProperties": False
223 },
224 }
225 },
226 "required": ["name"],
227 "minProperties": 2,
228 "additionalProperties": False
229}
tierno65acb4d2018-04-06 16:42:40 +0200230
tiernofd160572019-01-21 10:41:37 +0000231additional_params_for_vnf = {
232 "type": "array",
233 "items": {
234 "type": "object",
235 "properties": {
236 "member-vnf-index": name_schema,
237 "additionalParams": object_schema,
tierno714954e2019-11-29 13:43:26 +0000238 "additionalParamsForVdu": {
239 "type": "array",
240 "items": {
241 "type": "object",
242 "properties": {
243 "vdu_id": name_schema,
244 "additionalParams": object_schema,
245 },
246 "required": ["vdu_id", "additionalParams"],
247 "additionalProperties": False,
248 },
249 },
250 "additionalParamsForKdu": {
251 "type": "array",
252 "items": {
253 "type": "object",
254 "properties": {
255 "kdu_name": name_schema,
256 "additionalParams": object_schema,
257 },
258 "required": ["kdu_name", "additionalParams"],
259 "additionalProperties": False,
260 },
261 },
tiernofd160572019-01-21 10:41:37 +0000262 },
tierno714954e2019-11-29 13:43:26 +0000263 "required": ["member-vnf-index"],
264 "minProperties": 2,
tiernofd160572019-01-21 10:41:37 +0000265 "additionalProperties": False
266 }
tiernofd160572019-01-21 10:41:37 +0000267}
268
tierno65acb4d2018-04-06 16:42:40 +0200269ns_instantiate = {
270 "title": "ns action instantiate input schema",
271 "$schema": "http://json-schema.org/draft-04/schema#",
272 "type": "object",
tierno0da52252018-06-27 15:47:22 +0200273 "properties": {
tiernob24258a2018-10-04 18:39:49 +0200274 "lcmOperationType": string_schema,
275 "nsInstanceId": id_schema,
Felipe Vicens07f31722018-10-29 15:16:44 +0100276 "netsliceInstanceId": id_schema,
tierno0da52252018-06-27 15:47:22 +0200277 "nsName": name_schema,
tierno4f9d4ae2019-03-20 17:24:11 +0000278 "nsDescription": {"oneOf": [description_schema, null_schema]},
tierno0da52252018-06-27 15:47:22 +0200279 "nsdId": id_schema,
280 "vimAccountId": id_schema,
tierno4f9d4ae2019-03-20 17:24:11 +0000281 "wimAccountId": {"OneOf": [id_schema, bool_schema, null_schema]},
magnussonlf318b302020-01-20 18:38:18 +0100282 "placement-engine": string_schema,
283 "placement-constraints": object_schema,
tiernobee085c2018-12-12 17:03:04 +0000284 "additionalParamsForNs": object_schema,
tiernofd160572019-01-21 10:41:37 +0000285 "additionalParamsForVnf": additional_params_for_vnf,
tiernofc5089c2018-10-31 09:28:11 +0100286 "ssh_keys": {"type": "array", "items": {"type": "string"}},
tiernoa8186a52020-01-14 15:54:48 +0000287 "timeout_ns_deploy": integer1_schema,
tierno441dbbf2018-07-10 12:52:48 +0200288 "nsr_id": id_schema,
tiernocc103432018-10-19 14:10:35 +0200289 "vduImage": name_schema,
tierno0da52252018-06-27 15:47:22 +0200290 "vnf": {
291 "type": "array",
292 "minItems": 1,
293 "items": {
294 "type": "object",
295 "properties": {
296 "member-vnf-index": name_schema,
297 "vimAccountId": id_schema,
tierno441dbbf2018-07-10 12:52:48 +0200298 "vdu": {
299 "type": "array",
300 "minItems": 1,
301 "items": ns_instantiate_vdu,
302 },
303 "internal-vld": {
304 "type": "array",
305 "minItems": 1,
306 "items": ns_instantiate_internal_vld
307 }
tierno0da52252018-06-27 15:47:22 +0200308 },
tierno441dbbf2018-07-10 12:52:48 +0200309 "required": ["member-vnf-index"],
310 "minProperties": 2,
311 "additionalProperties": False
tierno0da52252018-06-27 15:47:22 +0200312 }
313 },
314 "vld": {
315 "type": "array",
316 "minItems": 1,
317 "items": {
318 "type": "object",
319 "properties": {
320 "name": string_schema,
321 "vim-network-name": {"OneOf": [string_schema, object_schema]},
gcalvino17d5b732018-12-17 16:26:21 +0100322 "vim-network-id": {"OneOf": [string_schema, object_schema]},
Felipe Vicens09e65422019-01-22 15:06:46 +0100323 "ns-net": object_schema,
tierno4f9d4ae2019-03-20 17:24:11 +0000324 "wimAccountId": {"OneOf": [id_schema, bool_schema, null_schema]},
tierno0da52252018-06-27 15:47:22 +0200325 "ip-profile": object_schema,
kbsub21f03f52019-10-17 16:26:56 +0000326 "provider-network": provider_network_schema,
tiernob7c6f2a2018-09-03 14:32:10 +0200327 "vnfd-connection-point-ref": {
328 "type": "array",
329 "minItems": 1,
330 "items": {
331 "type": "object",
332 "properties": {
333 "member-vnf-index-ref": name_schema,
334 "vnfd-connection-point-ref": name_schema,
335 "ip-address": ip_schema,
336 # "mac-address": mac_schema,
337 },
338 "required": ["member-vnf-index-ref", "vnfd-connection-point-ref"],
339 "minProperties": 3,
340 "additionalProperties": False
341 },
342 }
tierno0da52252018-06-27 15:47:22 +0200343 },
tierno441dbbf2018-07-10 12:52:48 +0200344 "required": ["name"],
345 "additionalProperties": False
tierno0da52252018-06-27 15:47:22 +0200346 }
347 },
348 },
tierno441dbbf2018-07-10 12:52:48 +0200349 "required": ["nsName", "nsdId", "vimAccountId"],
350 "additionalProperties": False
tierno65acb4d2018-04-06 16:42:40 +0200351}
tierno0da52252018-06-27 15:47:22 +0200352
tierno1c38f2f2020-03-24 11:51:39 +0000353ns_terminate = {
354 "title": "ns terminate input schema",
355 "$schema": "http://json-schema.org/draft-04/schema#",
356 "type": "object",
357 "properties": {
358 "lcmOperationType": string_schema,
359 "nsInstanceId": id_schema,
360 "autoremove": bool_schema,
361 "timeout_ns_terminate": integer1_schema,
362 "skip_terminate_primitives": bool_schema,
363 },
364 "additionalProperties": False
365}
366
tierno65acb4d2018-04-06 16:42:40 +0200367ns_action = { # TODO for the moment it is only contemplated the vnfd primitive execution
tiernof759d822018-06-11 18:54:54 +0200368 "title": "ns action input schema",
tierno65acb4d2018-04-06 16:42:40 +0200369 "$schema": "http://json-schema.org/draft-04/schema#",
370 "type": "object",
371 "properties": {
tiernob24258a2018-10-04 18:39:49 +0200372 "lcmOperationType": string_schema,
373 "nsInstanceId": id_schema,
tiernof5298be2018-05-16 14:43:57 +0200374 "member_vnf_index": name_schema,
375 "vnf_member_index": name_schema, # TODO for backward compatibility. To remove in future
tierno7ce1db92018-07-25 12:50:52 +0200376 "vdu_id": name_schema,
tiernof0637052019-03-07 16:26:47 +0000377 "vdu_count_index": integer0_schema,
tierno9cb7d672019-10-30 12:13:48 +0000378 "kdu_name": name_schema,
tierno65acb4d2018-04-06 16:42:40 +0200379 "primitive": name_schema,
380 "primitive_params": {"type": "object"},
381 },
tiernof5298be2018-05-16 14:43:57 +0200382 "required": ["primitive", "primitive_params"], # TODO add member_vnf_index
tierno65acb4d2018-04-06 16:42:40 +0200383 "additionalProperties": False
384}
tiernof759d822018-06-11 18:54:54 +0200385ns_scale = { # TODO for the moment it is only VDU-scaling
386 "title": "ns scale input schema",
387 "$schema": "http://json-schema.org/draft-04/schema#",
388 "type": "object",
389 "properties": {
tiernob24258a2018-10-04 18:39:49 +0200390 "lcmOperationType": string_schema,
391 "nsInstanceId": id_schema,
tiernof759d822018-06-11 18:54:54 +0200392 "scaleType": {"enum": ["SCALE_VNF"]},
393 "scaleVnfData": {
394 "type": "object",
395 "properties": {
396 "vnfInstanceId": name_schema,
397 "scaleVnfType": {"enum": ["SCALE_OUT", 'SCALE_IN']},
398 "scaleByStepData": {
399 "type": "object",
400 "properties": {
401 "scaling-group-descriptor": name_schema,
402 "member-vnf-index": name_schema,
403 "scaling-policy": name_schema,
404 },
405 "required": ["scaling-group-descriptor", "member-vnf-index"],
406 "additionalProperties": False
407 },
408 },
409 "required": ["scaleVnfType", "scaleByStepData"], # vnfInstanceId
410 "additionalProperties": False
411 },
412 "scaleTime": time_schema,
413 },
414 "required": ["scaleType", "scaleVnfData"],
415 "additionalProperties": False
416}
tierno65acb4d2018-04-06 16:42:40 +0200417
418
tierno0f98af52018-03-19 10:28:22 +0100419schema_version = {"type": "string", "enum": ["1.0"]}
tierno55ba2e62018-12-11 17:22:22 +0000420schema_type = {"type": "string"}
tiernob3d0a0e2019-11-13 15:57:51 +0000421vim_type = shortname_schema # {"enum": ["openstack", "openvim", "vmware", "opennebula", "aws", "azure", "fos"]}
delacruzramo3a144c92019-10-25 09:46:33 +0200422
tierno09c073e2018-04-26 13:36:48 +0200423vim_account_edit_schema = {
424 "title": "vim_account edit input schema",
425 "$schema": "http://json-schema.org/draft-04/schema#",
426 "type": "object",
427 "properties": {
428 "name": name_schema,
429 "description": description_schema,
tierno09c073e2018-04-26 13:36:48 +0200430 "vim": name_schema,
431 "datacenter": name_schema,
delacruzramo3a144c92019-10-25 09:46:33 +0200432 "vim_type": vim_type,
tierno09c073e2018-04-26 13:36:48 +0200433 "vim_url": description_schema,
delacruzramo3a144c92019-10-25 09:46:33 +0200434 # "vim_url_admin": description_schema,
435 # "vim_tenant": name_schema,
tierno09c073e2018-04-26 13:36:48 +0200436 "vim_tenant_name": name_schema,
delacruzramo3a144c92019-10-25 09:46:33 +0200437 "vim_user": shortname_schema,
tiernocd54a4a2018-09-12 16:40:35 +0200438 "vim_password": passwd_schema,
tierno09c073e2018-04-26 13:36:48 +0200439 "config": {"type": "object"}
440 },
441 "additionalProperties": False
442}
tierno0f98af52018-03-19 10:28:22 +0100443
tierno09c073e2018-04-26 13:36:48 +0200444vim_account_new_schema = {
445 "title": "vim_account creation input schema",
tierno0f98af52018-03-19 10:28:22 +0100446 "$schema": "http://json-schema.org/draft-04/schema#",
447 "type": "object",
448 "properties": {
449 "schema_version": schema_version,
450 "schema_type": schema_type,
451 "name": name_schema,
452 "description": description_schema,
tierno09c073e2018-04-26 13:36:48 +0200453 "vim": name_schema,
454 "datacenter": name_schema,
delacruzramo3a144c92019-10-25 09:46:33 +0200455 "vim_type": vim_type,
tierno0f98af52018-03-19 10:28:22 +0100456 "vim_url": description_schema,
457 # "vim_url_admin": description_schema,
458 # "vim_tenant": name_schema,
459 "vim_tenant_name": name_schema,
tiernofd160572019-01-21 10:41:37 +0000460 "vim_user": shortname_schema,
tiernocd54a4a2018-09-12 16:40:35 +0200461 "vim_password": passwd_schema,
tierno0f98af52018-03-19 10:28:22 +0100462 "config": {"type": "object"}
463 },
464 "required": ["name", "vim_url", "vim_type", "vim_user", "vim_password", "vim_tenant_name"],
465 "additionalProperties": False
466}
tierno0f98af52018-03-19 10:28:22 +0100467
tierno85807722019-12-20 14:11:35 +0000468wim_type = shortname_schema # {"enum": ["ietfl2vpn", "onos", "odl", "dynpac", "fake"]}
delacruzramo3a144c92019-10-25 09:46:33 +0200469
tierno55ba2e62018-12-11 17:22:22 +0000470wim_account_edit_schema = {
471 "title": "wim_account edit input schema",
472 "$schema": "http://json-schema.org/draft-04/schema#",
473 "type": "object",
474 "properties": {
475 "name": name_schema,
476 "description": description_schema,
tierno55ba2e62018-12-11 17:22:22 +0000477 "wim": name_schema,
delacruzramo3a144c92019-10-25 09:46:33 +0200478 "wim_type": wim_type,
tierno55ba2e62018-12-11 17:22:22 +0000479 "wim_url": description_schema,
tiernofd160572019-01-21 10:41:37 +0000480 "user": shortname_schema,
tierno55ba2e62018-12-11 17:22:22 +0000481 "password": passwd_schema,
482 "config": {"type": "object"}
483 },
484 "additionalProperties": False
485}
486
487wim_account_new_schema = {
488 "title": "wim_account creation input schema",
489 "$schema": "http://json-schema.org/draft-04/schema#",
490 "type": "object",
491 "properties": {
492 "schema_version": schema_version,
493 "schema_type": schema_type,
494 "name": name_schema,
495 "description": description_schema,
496 "wim": name_schema,
delacruzramo3a144c92019-10-25 09:46:33 +0200497 "wim_type": wim_type,
tierno55ba2e62018-12-11 17:22:22 +0000498 "wim_url": description_schema,
tiernofd160572019-01-21 10:41:37 +0000499 "user": shortname_schema,
tierno55ba2e62018-12-11 17:22:22 +0000500 "password": passwd_schema,
tiernof0637052019-03-07 16:26:47 +0000501 "config": {
502 "type": "object",
503 "patternProperties": {
504 ".": {"not": {"type": "null"}}
505 }
506 }
tierno55ba2e62018-12-11 17:22:22 +0000507 },
508 "required": ["name", "wim_url", "wim_type"],
509 "additionalProperties": False
510}
tierno0f98af52018-03-19 10:28:22 +0100511
512sdn_properties = {
513 "name": name_schema,
tierno7adaeb02019-12-17 16:46:12 +0000514 "type": {"type": "string"},
515 "url": {"type": "string"},
516 "user": shortname_schema,
517 "password": passwd_schema,
518 "config": {"type": "object"},
tiernocfb07c62018-05-10 18:30:51 +0200519 "description": description_schema,
tierno7adaeb02019-12-17 16:46:12 +0000520 # The folowing are deprecated. Maintanied for backward compatibility
tiernocb83c942018-09-24 17:28:13 +0200521 "dpid": dpid_Schema,
tierno0f98af52018-03-19 10:28:22 +0100522 "ip": ip_schema,
523 "port": port_schema,
tierno0f98af52018-03-19 10:28:22 +0100524 "version": {"type": "string", "minLength": 1, "maxLength": 12},
tierno0f98af52018-03-19 10:28:22 +0100525}
526sdn_new_schema = {
527 "title": "sdn controller information schema",
528 "$schema": "http://json-schema.org/draft-04/schema#",
529 "type": "object",
530 "properties": sdn_properties,
tierno7adaeb02019-12-17 16:46:12 +0000531 "required": ["name", 'type'],
tierno0f98af52018-03-19 10:28:22 +0100532 "additionalProperties": False
533}
534sdn_edit_schema = {
535 "title": "sdn controller update information schema",
536 "$schema": "http://json-schema.org/draft-04/schema#",
537 "type": "object",
538 "properties": sdn_properties,
tiernocfb07c62018-05-10 18:30:51 +0200539 # "required": ["name", "port", 'ip', 'dpid', 'type'],
tierno0f98af52018-03-19 10:28:22 +0100540 "additionalProperties": False
541}
542sdn_port_mapping_schema = {
543 "$schema": "http://json-schema.org/draft-04/schema#",
544 "title": "sdn port mapping information schema",
545 "type": "array",
546 "items": {
547 "type": "object",
548 "properties": {
tiernofd160572019-01-21 10:41:37 +0000549 "compute_node": shortname_schema,
tierno0f98af52018-03-19 10:28:22 +0100550 "ports": {
551 "type": "array",
552 "items": {
553 "type": "object",
554 "properties": {
tierno42fce592018-11-02 09:23:43 +0100555 "pci": pci_extended_schema,
tiernofd160572019-01-21 10:41:37 +0000556 "switch_port": shortname_schema,
tierno0f98af52018-03-19 10:28:22 +0100557 "switch_mac": mac_schema
558 },
559 "required": ["pci"]
560 }
561 }
562 },
563 "required": ["compute_node", "ports"]
564 }
565}
566sdn_external_port_schema = {
567 "$schema": "http://json-schema.org/draft-04/schema#",
tiernocd54a4a2018-09-12 16:40:35 +0200568 "title": "External port information",
tierno0f98af52018-03-19 10:28:22 +0100569 "type": "object",
570 "properties": {
571 "port": {"type": "string", "minLength": 1, "maxLength": 60},
572 "vlan": vlan_schema,
573 "mac": mac_schema
574 },
575 "required": ["port"]
576}
577
delacruzramofe598fe2019-10-23 18:25:11 +0200578# K8s Clusters
579k8scluster_nets_schema = {
580 "title": "k8scluster nets input schema",
581 "$schema": "http://json-schema.org/draft-04/schema#",
582 "type": "object",
tierno8c81ab02020-02-07 10:18:30 +0000583 "patternProperties": {".": {"oneOf": [name_schema, null_schema]}},
delacruzramofe598fe2019-10-23 18:25:11 +0200584 "minProperties": 1,
585 "additionalProperties": False
586}
587k8scluster_new_schema = {
588 "title": "k8scluster creation input schema",
589 "$schema": "http://json-schema.org/draft-04/schema#",
590 "type": "object",
591 "properties": {
592 "schema_version": schema_version,
593 "schema_type": schema_type,
594 "name": name_schema,
595 "description": description_schema,
596 "credentials": object_schema,
597 "vim_account": id_schema,
598 "k8s_version": string_schema,
599 "nets": k8scluster_nets_schema,
600 "namespace": name_schema,
601 "cni": nameshort_list_schema,
602 },
603 "required": ["name", "credentials", "vim_account", "k8s_version", "nets"],
604 "additionalProperties": False
605}
606k8scluster_edit_schema = {
607 "title": "vim_account edit input schema",
608 "$schema": "http://json-schema.org/draft-04/schema#",
609 "type": "object",
610 "properties": {
611 "name": name_schema,
612 "description": description_schema,
613 "credentials": object_schema,
614 "vim_account": id_schema,
615 "k8s_version": string_schema,
616 "nets": k8scluster_nets_schema,
617 "namespace": name_schema,
618 "cni": nameshort_list_schema,
619 },
620 "additionalProperties": False
621}
622
623# K8s Repos
tierno332e0802019-12-03 23:50:49 +0000624k8srepo_types = {"enum": ["helm-chart", "juju-bundle"]}
delacruzramofe598fe2019-10-23 18:25:11 +0200625k8srepo_properties = {
626 "name": name_schema,
627 "description": description_schema,
628 "type": k8srepo_types,
629 "url": description_schema,
630}
631k8srepo_new_schema = {
632 "title": "k8scluster creation input schema",
633 "$schema": "http://json-schema.org/draft-04/schema#",
634 "type": "object",
635 "properties": k8srepo_properties,
636 "required": ["name", "type", "url"],
637 "additionalProperties": False
638}
639k8srepo_edit_schema = {
640 "title": "vim_account edit input schema",
641 "$schema": "http://json-schema.org/draft-04/schema#",
642 "type": "object",
643 "properties": k8srepo_properties,
644 "additionalProperties": False
645}
646
tiernocb83c942018-09-24 17:28:13 +0200647# PDUs
648pdu_interface = {
649 "type": "object",
650 "properties": {
tiernofd160572019-01-21 10:41:37 +0000651 "name": shortname_schema,
tiernocb83c942018-09-24 17:28:13 +0200652 "mgmt": bool_schema,
653 "type": {"enum": ["overlay", 'underlay']},
tierno36ec8602018-11-02 17:27:11 +0100654 "ip-address": ip_schema,
tiernocb83c942018-09-24 17:28:13 +0200655 # TODO, add user, password, ssh-key
tierno36ec8602018-11-02 17:27:11 +0100656 "mac-address": mac_schema,
tiernofd160572019-01-21 10:41:37 +0000657 "vim-network-name": shortname_schema, # interface is connected to one vim network, or switch port
658 "vim-network-id": shortname_schema,
tierno36ec8602018-11-02 17:27:11 +0100659 # # provide this in case SDN assist must deal with this interface
660 # "switch-dpid": dpid_Schema,
tiernofd160572019-01-21 10:41:37 +0000661 # "switch-port": shortname_schema,
662 # "switch-mac": shortname_schema,
tierno36ec8602018-11-02 17:27:11 +0100663 # "switch-vlan": vlan_schema,
tiernocb83c942018-09-24 17:28:13 +0200664 },
tierno36ec8602018-11-02 17:27:11 +0100665 "required": ["name", "mgmt", "ip-address"],
tiernocb83c942018-09-24 17:28:13 +0200666 "additionalProperties": False
tiernocd54a4a2018-09-12 16:40:35 +0200667}
tiernocb83c942018-09-24 17:28:13 +0200668pdu_new_schema = {
669 "title": "pdu creation input schema",
670 "$schema": "http://json-schema.org/draft-04/schema#",
671 "type": "object",
672 "properties": {
tiernofd160572019-01-21 10:41:37 +0000673 "name": shortname_schema,
674 "type": shortname_schema,
tiernocb83c942018-09-24 17:28:13 +0200675 "description": description_schema,
676 "shared": bool_schema,
677 "vims": nameshort_list_schema,
678 "vim_accounts": nameshort_list_schema,
679 "interfaces": {
680 "type": "array",
tierno36ec8602018-11-02 17:27:11 +0100681 "items": pdu_interface,
tiernocb83c942018-09-24 17:28:13 +0200682 "minItems": 1
683 }
684 },
685 "required": ["name", "type", "interfaces"],
686 "additionalProperties": False
687}
tiernocb83c942018-09-24 17:28:13 +0200688pdu_edit_schema = {
689 "title": "pdu edit input schema",
690 "$schema": "http://json-schema.org/draft-04/schema#",
691 "type": "object",
692 "properties": {
tiernofd160572019-01-21 10:41:37 +0000693 "name": shortname_schema,
694 "type": shortname_schema,
tiernocb83c942018-09-24 17:28:13 +0200695 "description": description_schema,
696 "shared": bool_schema,
garciadeblas84bdd552018-11-30 22:59:45 +0100697 "vims": {"oneOf": [array_edition_schema, nameshort_list_schema]},
698 "vim_accounts": {"oneOf": [array_edition_schema, nameshort_list_schema]},
699 "interfaces": {"oneOf": [
tiernocb83c942018-09-24 17:28:13 +0200700 array_edition_schema,
701 {
702 "type": "array",
tierno36ec8602018-11-02 17:27:11 +0100703 "items": pdu_interface,
tiernocb83c942018-09-24 17:28:13 +0200704 "minItems": 1
705 }
706 ]}
707 },
708 "additionalProperties": False,
709 "minProperties": 1
710}
711
delacruzramo271d2002019-12-02 21:00:37 +0100712# VNF PKG OPERATIONS
713vnfpkgop_new_schema = {
714 "title": "VNF PKG operation creation input schema",
715 "$schema": "http://json-schema.org/draft-04/schema#",
716 "type": "object",
717 "properties": {
718 "lcmOperationType": string_schema,
719 "vnfPkgId": id_schema,
720 "kdu_name": name_schema,
721 "primitive": name_schema,
722 "primitive_params": {"type": "object"},
723 },
724 "required": ["lcmOperationType", "vnfPkgId", "kdu_name", "primitive", "primitive_params"],
725 "additionalProperties": False
726}
727
tiernocb83c942018-09-24 17:28:13 +0200728# USERS
tiernocf042d32019-06-13 09:06:40 +0000729project_role_mappings = {
730 "title": "list pf projects/roles",
Eduardo Sousa5c01e192019-05-08 02:35:47 +0100731 "$schema": "http://json-schema.org/draft-04/schema#",
tiernocf042d32019-06-13 09:06:40 +0000732 "type": "array",
733 "items": {
734 "type": "object",
735 "properties": {
736 "project": shortname_schema,
737 "role": shortname_schema
738 },
739 "required": ["project", "role"],
740 "additionalProperties": False
Eduardo Sousa5c01e192019-05-08 02:35:47 +0100741 },
tiernocf042d32019-06-13 09:06:40 +0000742 "minItems": 1
743}
744project_role_mappings_optional = {
745 "title": "list of projects/roles or projects only",
746 "$schema": "http://json-schema.org/draft-04/schema#",
747 "type": "array",
748 "items": {
749 "type": "object",
750 "properties": {
751 "project": shortname_schema,
752 "role": shortname_schema
753 },
754 "required": ["project"],
755 "additionalProperties": False
756 },
757 "minItems": 1
Eduardo Sousa5c01e192019-05-08 02:35:47 +0100758}
tiernocd54a4a2018-09-12 16:40:35 +0200759user_new_schema = {
760 "$schema": "http://json-schema.org/draft-04/schema#",
761 "title": "New user schema",
762 "type": "object",
763 "properties": {
tiernofd160572019-01-21 10:41:37 +0000764 "username": shortname_schema,
tiernoad6d5332020-02-19 14:29:49 +0000765 "domain_name": shortname_schema,
tiernocd54a4a2018-09-12 16:40:35 +0200766 "password": passwd_schema,
tiernocb83c942018-09-24 17:28:13 +0200767 "projects": nameshort_list_schema,
tiernocf042d32019-06-13 09:06:40 +0000768 "project_role_mappings": project_role_mappings,
tiernocd54a4a2018-09-12 16:40:35 +0200769 },
Eduardo Sousa5c01e192019-05-08 02:35:47 +0100770 "required": ["username", "password"],
tiernocd54a4a2018-09-12 16:40:35 +0200771 "additionalProperties": False
772}
773user_edit_schema = {
774 "$schema": "http://json-schema.org/draft-04/schema#",
775 "title": "User edit schema for administrators",
776 "type": "object",
777 "properties": {
778 "password": passwd_schema,
delacruzramoc061f562019-04-05 11:00:02 +0200779 "username": shortname_schema, # To allow User Name modification
tiernocd54a4a2018-09-12 16:40:35 +0200780 "projects": {
garciadeblas84bdd552018-11-30 22:59:45 +0100781 "oneOf": [
tiernocb83c942018-09-24 17:28:13 +0200782 nameshort_list_schema,
tiernocd54a4a2018-09-12 16:40:35 +0200783 array_edition_schema
784 ]
785 },
tiernocf042d32019-06-13 09:06:40 +0000786 "project_role_mappings": project_role_mappings,
787 "add_project_role_mappings": project_role_mappings,
788 "remove_project_role_mappings": project_role_mappings_optional,
tiernocb83c942018-09-24 17:28:13 +0200789 },
790 "minProperties": 1,
791 "additionalProperties": False
tiernocd54a4a2018-09-12 16:40:35 +0200792}
793
794# PROJECTS
delacruzramofe598fe2019-10-23 18:25:11 +0200795topics_with_quota = ["vnfds", "nsds", "nsts", "pdus", "nsrs", "nsis", "vim_accounts", "wim_accounts", "sdns",
796 "k8sclusters", "k8srepos"]
tiernocd54a4a2018-09-12 16:40:35 +0200797project_new_schema = {
798 "$schema": "http://json-schema.org/draft-04/schema#",
799 "title": "New project schema for administrators",
800 "type": "object",
801 "properties": {
tiernofd160572019-01-21 10:41:37 +0000802 "name": shortname_schema,
tiernocd54a4a2018-09-12 16:40:35 +0200803 "admin": bool_schema,
tiernoad6d5332020-02-19 14:29:49 +0000804 "domain_name": shortname_schema,
delacruzramo32bab472019-09-13 12:24:22 +0200805 "quotas": {
806 "type": "object",
807 "properties": {topic: integer0_schema for topic in topics_with_quota},
808 "additionalProperties": False
809 },
tiernocd54a4a2018-09-12 16:40:35 +0200810 },
811 "required": ["name"],
812 "additionalProperties": False
813}
814project_edit_schema = {
815 "$schema": "http://json-schema.org/draft-04/schema#",
816 "title": "Project edit schema for administrators",
817 "type": "object",
818 "properties": {
819 "admin": bool_schema,
delacruzramoc061f562019-04-05 11:00:02 +0200820 "name": shortname_schema, # To allow Project Name modification
delacruzramo32bab472019-09-13 12:24:22 +0200821 "quotas": {
822 "type": "object",
823 "properties": {topic: {"oneOf": [integer0_schema, null_schema]} for topic in topics_with_quota},
824 "additionalProperties": False
825 },
tiernocd54a4a2018-09-12 16:40:35 +0200826 },
827 "additionalProperties": False,
828 "minProperties": 1
829}
830
Eduardo Sousa5c01e192019-05-08 02:35:47 +0100831# ROLES
832roles_new_schema = {
833 "$schema": "http://json-schema.org/draft-04/schema#",
834 "title": "New role schema for administrators",
835 "type": "object",
836 "properties": {
837 "name": shortname_schema,
tierno1f029d82019-06-13 22:37:04 +0000838 "permissions": {
839 "type": "object",
840 "patternProperties": {
841 ".": bool_schema,
842 },
843 # "minProperties": 1,
844 }
Eduardo Sousa5c01e192019-05-08 02:35:47 +0100845 },
tierno1f029d82019-06-13 22:37:04 +0000846 "required": ["name"],
847 "additionalProperties": False
Eduardo Sousa5c01e192019-05-08 02:35:47 +0100848}
849roles_edit_schema = {
850 "$schema": "http://json-schema.org/draft-04/schema#",
851 "title": "Roles edit schema for administrators",
852 "type": "object",
853 "properties": {
tierno1f029d82019-06-13 22:37:04 +0000854 "name": shortname_schema,
855 "permissions": {
856 "type": "object",
857 "patternProperties": {
858 ".": {
859 "oneOf": [bool_schema, null_schema]
860 }
861 },
862 # "minProperties": 1,
863 }
Eduardo Sousa5c01e192019-05-08 02:35:47 +0100864 },
tierno1f029d82019-06-13 22:37:04 +0000865 "additionalProperties": False,
Eduardo Sousa5c01e192019-05-08 02:35:47 +0100866 "minProperties": 1
867}
868
tiernocd54a4a2018-09-12 16:40:35 +0200869# GLOBAL SCHEMAS
tierno0f98af52018-03-19 10:28:22 +0100870
871nbi_new_input_schemas = {
tiernocd54a4a2018-09-12 16:40:35 +0200872 "users": user_new_schema,
873 "projects": project_new_schema,
tierno09c073e2018-04-26 13:36:48 +0200874 "vim_accounts": vim_account_new_schema,
tierno65acb4d2018-04-06 16:42:40 +0200875 "sdns": sdn_new_schema,
876 "ns_instantiate": ns_instantiate,
877 "ns_action": ns_action,
tiernocb83c942018-09-24 17:28:13 +0200878 "ns_scale": ns_scale,
879 "pdus": pdu_new_schema,
tierno0f98af52018-03-19 10:28:22 +0100880}
881
882nbi_edit_input_schemas = {
tiernocd54a4a2018-09-12 16:40:35 +0200883 "users": user_edit_schema,
884 "projects": project_edit_schema,
tierno09c073e2018-04-26 13:36:48 +0200885 "vim_accounts": vim_account_edit_schema,
tiernocb83c942018-09-24 17:28:13 +0200886 "sdns": sdn_edit_schema,
887 "pdus": pdu_edit_schema,
tierno0f98af52018-03-19 10:28:22 +0100888}
889
Felipe Vicens07f31722018-10-29 15:16:44 +0100890# NETSLICE SCHEMAS
tierno032916c2019-03-22 13:27:12 +0000891nsi_subnet_instantiate = deepcopy(ns_instantiate)
892nsi_subnet_instantiate["title"] = "netslice subnet instantiation params input schema"
893nsi_subnet_instantiate["properties"]["id"] = name_schema
894del nsi_subnet_instantiate["required"]
garciadeblasdaf8cc52018-11-30 14:17:20 +0100895
896nsi_vld_instantiate = {
897 "title": "netslice vld instantiation params input schema",
898 "$schema": "http://json-schema.org/draft-04/schema#",
899 "type": "object",
900 "properties": {
901 "name": string_schema,
902 "vim-network-name": {"OneOf": [string_schema, object_schema]},
gcalvino17d5b732018-12-17 16:26:21 +0100903 "vim-network-id": {"OneOf": [string_schema, object_schema]},
garciadeblasdaf8cc52018-11-30 14:17:20 +0100904 "ip-profile": object_schema,
905 },
delacruzramoc061f562019-04-05 11:00:02 +0200906 "required": ["name"],
garciadeblasdaf8cc52018-11-30 14:17:20 +0100907 "additionalProperties": False
908}
909
Felipe Vicens07f31722018-10-29 15:16:44 +0100910nsi_instantiate = {
911 "title": "netslice action instantiate input schema",
912 "$schema": "http://json-schema.org/draft-04/schema#",
913 "type": "object",
914 "properties": {
915 "lcmOperationType": string_schema,
Felipe Vicens126af572019-06-05 19:13:04 +0200916 "netsliceInstanceId": id_schema,
Felipe Vicens07f31722018-10-29 15:16:44 +0100917 "nsiName": name_schema,
tierno4f9d4ae2019-03-20 17:24:11 +0000918 "nsiDescription": {"oneOf": [description_schema, null_schema]},
tierno9e5eea32018-11-29 09:42:09 +0000919 "nstId": string_schema,
Felipe Vicens07f31722018-10-29 15:16:44 +0100920 "vimAccountId": id_schema,
tiernoa8186a52020-01-14 15:54:48 +0000921 "timeout_nsi_deploy": integer1_schema,
Felipe Vicens07f31722018-10-29 15:16:44 +0100922 "ssh_keys": {"type": "string"},
923 "nsi_id": id_schema,
tierno032916c2019-03-22 13:27:12 +0000924 "additionalParamsForNsi": object_schema,
garciadeblasdaf8cc52018-11-30 14:17:20 +0100925 "netslice-subnet": {
Felipe Vicens07f31722018-10-29 15:16:44 +0100926 "type": "array",
927 "minItems": 1,
tierno032916c2019-03-22 13:27:12 +0000928 "items": nsi_subnet_instantiate
garciadeblasdaf8cc52018-11-30 14:17:20 +0100929 },
930 "netslice-vld": {
931 "type": "array",
932 "minItems": 1,
933 "items": nsi_vld_instantiate
Felipe Vicens07f31722018-10-29 15:16:44 +0100934 },
935 },
Felipe Vicensc8bbaaa2018-12-01 04:42:40 +0100936 "required": ["nsiName", "nstId", "vimAccountId"],
Felipe Vicens07f31722018-10-29 15:16:44 +0100937 "additionalProperties": False
938}
939
940nsi_action = {
941
942}
943
944nsi_terminate = {
delacruzramoc061f562019-04-05 11:00:02 +0200945
Felipe Vicens07f31722018-10-29 15:16:44 +0100946}
947
tierno0f98af52018-03-19 10:28:22 +0100948
949class ValidationError(Exception):
tierno36ec8602018-11-02 17:27:11 +0100950 def __init__(self, message, http_code=HTTPStatus.UNPROCESSABLE_ENTITY):
951 self.http_code = http_code
952 Exception.__init__(self, message)
tierno0f98af52018-03-19 10:28:22 +0100953
954
tiernob24258a2018-10-04 18:39:49 +0200955def validate_input(indata, schema_to_use):
tierno0f98af52018-03-19 10:28:22 +0100956 """
tiernocd54a4a2018-09-12 16:40:35 +0200957 Validates input data against json schema
tierno0f98af52018-03-19 10:28:22 +0100958 :param indata: user input data. Should be a dictionary
tiernob24258a2018-10-04 18:39:49 +0200959 :param schema_to_use: jsonschema to test
960 :return: None if ok, raises ValidationError exception on error
tierno0f98af52018-03-19 10:28:22 +0100961 """
962 try:
tierno0f98af52018-03-19 10:28:22 +0100963 if schema_to_use:
964 js_v(indata, schema_to_use)
965 return None
966 except js_e.ValidationError as e:
967 if e.path:
tierno0da52252018-06-27 15:47:22 +0200968 error_pos = "at '" + ":".join(map(str, e.path)) + "'"
tierno0f98af52018-03-19 10:28:22 +0100969 else:
970 error_pos = ""
tierno441dbbf2018-07-10 12:52:48 +0200971 raise ValidationError("Format error {} '{}' ".format(error_pos, e.message))
tierno36ec8602018-11-02 17:27:11 +0100972 except js_e.SchemaError:
973 raise ValidationError("Bad json schema {}".format(schema_to_use), http_code=HTTPStatus.INTERNAL_SERVER_ERROR)
delacruzramoc061f562019-04-05 11:00:02 +0200974
975
976def is_valid_uuid(x):
977 """
978 Test for a valid UUID
979 :param x: string to test
980 :return: True if x is a valid uuid, False otherwise
981 """
982 try:
983 if UUID(x):
984 return True
tiernobdebce92019-07-01 15:36:49 +0000985 except (TypeError, ValueError, AttributeError):
delacruzramoc061f562019-04-05 11:00:02 +0200986 return False