blob: 060a3ebbf4bd377b0401b4c9f8a27d7612fa9d68 [file] [log] [blame]
tierno1d213f42020-04-24 14:02:51 +00001# -*- coding: utf-8 -*-
2
3# Licensed under the Apache License, Version 2.0 (the "License");
4# you may not use this file except in compliance with the License.
5# You may obtain a copy of the License at
6#
7# http://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS,
11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
12# implied.
13# See the License for the specific language governing permissions and
14# limitations under the License.
15
16from jsonschema import validate as js_v, exceptions as js_e
17from http import HTTPStatus
18
19__author__ = "Alfonso Tierno <alfonso.tiernosepulveda@telefonica.com>"
20__version__ = "0.1"
21version_date = "Jun 2020"
22
23"""
24Validator of input data using JSON schemas
25"""
26
27# Basis schemas
28name_schema = {"type": "string", "minLength": 1, "maxLength": 255, "pattern": "^[^,;()'\"]+$"}
29string_schema = {"type": "string", "minLength": 1, "maxLength": 255}
30ssh_key_schema = {"type": "string", "minLength": 1}
31id_schema = {"type": "string", "pattern": "^[a-fA-F0-9]{8}(-[a-fA-F0-9]{4}){3}-[a-fA-F0-9]{12}$"}
32bool_schema = {"type": "boolean"}
33null_schema = {"type": "null"}
34
35image_schema = {
36 "title": "image input validation",
37 "$schema": "http://json-schema.org/draft-04/schema#",
38 "type": "object",
39 # TODO
40}
41
42flavor_schema = {
43 "title": "image input validation",
44 "$schema": "http://json-schema.org/draft-04/schema#",
45 "type": "object",
46 # TODO
47}
48
49ns_schema = {
50 "title": "image input validation",
51 "$schema": "http://json-schema.org/draft-04/schema#",
52 "type": "object",
53 # TODO
54}
55
56deploy_schema = {
57 "title": "deploy input validation",
58 "$schema": "http://json-schema.org/draft-04/schema#",
59 "type": "object",
60 "properties": {
61 "action_id": string_schema,
62 "name": name_schema,
63 "action": {"enum" ["inject_ssh_key"]},
64 "key": ssh_key_schema,
65 "user": name_schema,
66 "password": string_schema,
67 "vnf": {
68 "type": "object",
69 "properties": {
70 "_id": id_schema,
71 # TODO
72 },
73 "required": ["_id"],
74 "additionalProperties": True,
75 },
76 "image": {
77 "type": "array",
78 "minItems": 1,
79 "items": image_schema
80 },
81 "flavor": {
82 "type": "array",
83 "minItems": 1,
84 "items": flavor_schema
85 },
86 "ns": ns_schema,
87 },
88
89 "required": ["name"],
90 "additionalProperties": False
91}
92
93
94class ValidationError(Exception):
95 def __init__(self, message, http_code=HTTPStatus.UNPROCESSABLE_ENTITY):
96 self.http_code = http_code
97 Exception.__init__(self, message)
98
99
100def validate_input(indata, schema_to_use):
101 """
102 Validates input data against json schema
103 :param indata: user input data. Should be a dictionary
104 :param schema_to_use: jsonschema to test
105 :return: None if ok, raises ValidationError exception on error
106 """
107 try:
108 if schema_to_use:
109 js_v(indata, schema_to_use)
110 return None
111 except js_e.ValidationError as e:
112 if e.path:
113 error_pos = "at '" + ":".join(map(str, e.path)) + "'"
114 else:
115 error_pos = ""
116 raise ValidationError("Format error {} '{}' ".format(error_pos, e.message))
117 except js_e.SchemaError:
118 raise ValidationError("Bad json schema {}".format(schema_to_use), http_code=HTTPStatus.INTERNAL_SERVER_ERROR)