Update gitignore to ignore additional files and folders
[osm/IM.git] / osm_im / 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 import yaml
17 import importlib
18 from osm_im.vnfd import vnfd as vnfd_im
19 from osm_im.nsd import nsd as nsd_im
20 from osm_im.nst import nst as nst_im
21 from osm_im import etsi_nfv_vnfd, etsi_nfv_nsd
22 from pyangbind.lib.serialise import pybindJSONDecoder
23 import pyangbind.lib.pybindJSON as pybindJSON
24
25 class ValidationException(Exception):
26 pass
27
28 class Validation:
29
30 def pyangbind_validation(self, item, data, force=False):
31 '''
32 item: vnfd, nst, nsd
33 data: dict object loaded from the descriptor file
34 force: True to skip unknown fields in the descriptor
35 '''
36 if item == "vnfd":
37 myobj = vnfd_im()
38 elif item == "nsd":
39 myobj = nsd_im()
40 elif item == "nst":
41 myobj = nst_im()
42 elif item == "etsi_nfv_vnfd":
43 myobj = etsi_nfv_vnfd.etsi_nfv_vnfd()
44 elif item == "etsi_nfv_nsd":
45 myobj = etsi_nfv_nsd.etsi_nfv_nsd()
46 else:
47 raise ValidationException("Not possible to validate '{}' item".format(item))
48
49 try:
50 pybindJSONDecoder.load_ietf_json(data, None, None, obj=myobj,
51 path_helper=True, skip_unknown=force)
52 out = pybindJSON.dumps(myobj, mode="ietf")
53 desc_out = yaml.safe_load(out)
54 return desc_out
55 except Exception as e:
56 raise ValidationException("Error in pyangbind validation: {}".format(str(e)))
57
58 def yaml_validation(self, descriptor):
59 try:
60 data = yaml.safe_load(descriptor)
61 except Exception as e:
62 raise ValidationException("Error in YAML validation. Not a proper YAML file: {}".format(e))
63 if 'vnfd:vnfd-catalog' in data or 'vnfd-catalog' in data:
64 item = "vnfd"
65 elif 'nsd:nsd-catalog' in data or 'nsd-catalog' in data:
66 item = "nsd"
67 elif 'nst' in data:
68 item = "nst"
69 elif 'vnfd' in data:
70 item = "etsi_nfv_vnfd"
71 elif 'nsd' in data:
72 item = "etsi_nfv_nsd"
73 else:
74 raise ValidationException("Error in YAML validation. Not possible to determine the type of descriptor in the first line. Expected values: vnfd:vnfd-catalog, vnfd-catalog, nsd:nsd-catalog, nsd-catalog, nst")
75
76 return item, data
77
78 def descriptor_validation(self, descriptor):
79 item, data = self.yaml_validation(descriptor)
80 self.pyangbind_validation(item, data)
81