Coverage for NG-RO/osm_ng_ro/validation.py: 63%

35 statements  

« prev     ^ index     » next       coverage.py v7.6.12, created at 2025-04-14 12:04 +0000

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

2 

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

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

5# You may obtain a copy of the License at 

6# 

7# http://www.apache.org/licenses/LICENSE-2.0 

8# 

9# Unless required by applicable law or agreed to in writing, software 

10# distributed under the License is distributed on an "AS IS" BASIS, 

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

12# implied. 

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

14# limitations under the License. 

15 

16from http import HTTPStatus 

17 

18from jsonschema import exceptions as js_e, validate as js_v 

19 

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

21__version__ = "0.1" 

22version_date = "Jun 2020" 

23 

24""" 

25Validator of input data using JSON schemas 

26""" 

27 

28# Basis schemas 

29name_schema = { 

30 "type": "string", 

31 "minLength": 1, 

32 "maxLength": 255, 

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

34} 

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

36ssh_key_schema = {"type": "string", "minLength": 1} 

37id_schema = { 

38 "type": "string", 

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

40} 

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

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

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

44 

45deploy_item_schema = { 

46 "title": "deploy item validation. Each vld, vdu, flavor, image, ...", 

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

48 "type": "object", 

49 "properties": { 

50 "id": string_schema, 

51 "vim_info": object_schema, 

52 "common_id": string_schema, 

53 }, 

54 "additionalProperties": True, 

55} 

56 

57deploy_item_list = { 

58 "type": "array", 

59 "items": deploy_item_schema, 

60} 

61 

62deploy_vnf_schema = { 

63 "title": "deploy.vnf.item validation", 

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

65 "type": "object", 

66 "properties": { 

67 "_id": id_schema, 

68 "vdur": deploy_item_list, 

69 "vld": deploy_item_list, 

70 }, 

71 "additionalProperties": True, 

72 "required": ["_id"], 

73} 

74 

75deploy_action_schema = { 

76 "title": "deploy.action validation", 

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

78 "type": "object", 

79 "properties": { 

80 "action": {"enum": ["inject_ssh_key"]}, 

81 "key": ssh_key_schema, 

82 "user": string_schema, 

83 "password": string_schema, 

84 }, 

85 "additionalProperties": False, 

86 "required": ["action"], 

87} 

88 

89deploy_schema = { 

90 "title": "deploy input validation", 

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

92 "type": "object", 

93 "properties": { 

94 "action_id": string_schema, 

95 "cloud_init_content": object_schema, 

96 "name": string_schema, 

97 "action": deploy_action_schema, 

98 "vnf": { 

99 "type": "array", 

100 "items": deploy_vnf_schema, 

101 }, 

102 "image": deploy_item_list, 

103 "flavor": deploy_item_list, 

104 "shared-volumes": deploy_item_list, 

105 "ns": { 

106 "type": "object", 

107 "properties": { 

108 "vld": deploy_item_list, 

109 }, 

110 }, 

111 "affinity-or-anti-affinity-group": deploy_item_list, 

112 }, 

113 "additionalProperties": False, 

114} 

115 

116rebuild_schema = { 

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

118 "vm_rebuild": { 

119 "type": "array", 

120 "items": { 

121 "type": "object", 

122 "properties": { 

123 "vdu-id": id_schema, 

124 "vim_name": name_schema, 

125 "member-vnf-index": name_schema, 

126 }, 

127 }, 

128 "additionalProperties": True, 

129 }, 

130} 

131 

132 

133class ValidationError(Exception): 

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

135 self.http_code = http_code 

136 Exception.__init__(self, message) 

137 

138 

139def validate_input(indata, schema_to_use): 

140 """ 

141 Validates input data against json schema 

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

143 :param schema_to_use: jsonschema to test 

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

145 """ 

146 try: 

147 if schema_to_use: 

148 js_v(indata, schema_to_use) 

149 

150 return None 

151 except js_e.ValidationError as e: 

152 if e.path: 

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

154 else: 

155 error_pos = "" 

156 

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

158 except js_e.SchemaError: 

159 raise ValidationError( 

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

161 http_code=HTTPStatus.INTERNAL_SERVER_ERROR, 

162 )