1 # -*- coding: utf-8 -*-
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
7 # http://www.apache.org/licenses/LICENSE-2.0
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
13 # See the License for the specific language governing permissions and
14 # limitations under the License.
16 from jsonschema
import validate
as js_v
, exceptions
as js_e
17 from http
import HTTPStatus
19 __author__
= "Alfonso Tierno <alfonso.tiernosepulveda@telefonica.com>"
21 version_date
= "Jun 2020"
24 Validator of input data using JSON schemas
28 name_schema
= {"type": "string", "minLength": 1, "maxLength": 255, "pattern": "^[^,;()'\"]+$"}
29 string_schema
= {"type": "string", "minLength": 1, "maxLength": 255}
30 ssh_key_schema
= {"type": "string", "minLength": 1}
31 id_schema
= {"type": "string", "pattern": "^[a-fA-F0-9]{8}(-[a-fA-F0-9]{4}){3}-[a-fA-F0-9]{12}$"}
32 bool_schema
= {"type": "boolean"}
33 null_schema
= {"type": "null"}
36 "title": "image input validation",
37 "$schema": "http://json-schema.org/draft-04/schema#",
43 "title": "image input validation",
44 "$schema": "http://json-schema.org/draft-04/schema#",
50 "title": "image input validation",
51 "$schema": "http://json-schema.org/draft-04/schema#",
57 "title": "deploy input validation",
58 "$schema": "http://json-schema.org/draft-04/schema#",
61 "action_id": string_schema
,
63 "action": {"enum" ["inject_ssh_key"]},
64 "key": ssh_key_schema
,
66 "password": string_schema
,
74 "additionalProperties": True,
84 "items": flavor_schema
90 "additionalProperties": False
94 class ValidationError(Exception):
95 def __init__(self
, message
, http_code
=HTTPStatus
.UNPROCESSABLE_ENTITY
):
96 self
.http_code
= http_code
97 Exception.__init
__(self
, message
)
100 def validate_input(indata
, schema_to_use
):
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
109 js_v(indata
, schema_to_use
)
111 except js_e
.ValidationError
as e
:
113 error_pos
= "at '" + ":".join(map(str, e
.path
)) + "'"
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
)