Separated tool to test descriptors format 73/5973/3
authorgcalvino <guillermo.calvinosanchez@altran.com>
Mon, 16 Apr 2018 07:24:24 +0000 (09:24 +0200)
committergcalvino <guillermo.calvinosanchez@altran.com>
Thu, 10 May 2018 14:36:53 +0000 (16:36 +0200)
Signed-off-by: gcalvino <guillermo.calvinosanchez@altran.com>
Change-Id: I6ed2f5c3f7abce73b5811d88d68b63f4e01544d9

descriptor-packages/tools/validate_descriptor.py [new file with mode: 0755]

diff --git a/descriptor-packages/tools/validate_descriptor.py b/descriptor-packages/tools/validate_descriptor.py
new file mode 100755 (executable)
index 0000000..36e7c8d
--- /dev/null
@@ -0,0 +1,125 @@
+#!/usr/bin/env python2
+# -*- coding: utf-8 -*-
+
+##
+# All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+#
+##
+from __future__ import print_function
+import json
+import yaml
+import sys
+import getopt
+
+"""
+Tests the format of OSM VNFD and NSD descriptors
+"""
+__author__ = "Alfonso Tierno, Guillermo Calvino"
+__date__ = "2018-04-16"
+__version__ = "0.0.1"
+version_date = "Apr 2018"
+
+
+class ArgumentParserError(Exception):
+    pass
+
+
+def usage():
+    print("Usage: {} [options] FILE".format(sys.argv[0]))
+    print(" EXPERIMENTAL: Validates vnfd, nsd descriptors format")
+    print(" FILE: a yaml or json vnfd-catalog or nsd-catalog descriptor")
+    print(" OPTIONS:")
+    print("      -v|--version: prints current version")
+    print("      -h|--help: shows this help")
+    print("      -i|--input FILE: (same as param FILE) descriptor file to be upgraded")
+    return
+
+if __name__=="__main__":
+    error_position = []
+    format_output_yaml = True
+    input_file_name = None
+    test_file = None
+    file_name = None
+    try:
+        # load parameters and configuration
+        opts, args = getopt.getopt(sys.argv[1:], "hvi:o:", ["input=", "help", "version",])
+
+        for o, a in opts:
+            if o in ("-v", "--version"):
+                print ("test descriptor version THREE " + __version__ + ' ' + version_date)
+                sys.exit()
+            elif o in ("-h", "--help"):
+                usage()
+                sys.exit()
+            elif o in ("-i", "--input"):
+                input_file_name = a
+            else:
+                assert False, "Unhandled option"
+        if not input_file_name:
+            if not args:
+                raise ArgumentParserError("missing DESCRIPTOR_FILE parameter. Type --help for more info")
+            input_file_name = args[0]
+
+        # Open files
+        file_name = input_file_name
+        with open(file_name, 'r') as f:
+            descriptor_str = f.read()
+        file_name = None
+
+        if input_file_name.endswith('.yaml') or input_file_name.endswith('.yml') or not \
+            (input_file_name.endswith('.json') or '\t' in descriptor_str):
+            data = yaml.load(descriptor_str)
+        else:   # json
+            data = json.loads(descriptor_str)
+            format_output_yaml = False
+
+        import osm_im.vnfd as vnfd_catalog
+        import osm_im.nsd as nsd_catalog
+        from pyangbind.lib.serialise import pybindJSONDecoder
+
+        if "vnfd:vnfd-catalog" in data or "vnfd-catalog" in data:
+            descriptor = "VNF"
+            myvnfd = vnfd_catalog.vnfd()
+            pybindJSONDecoder.load_ietf_json(data, None, None, obj=myvnfd)
+        elif "nsd:nsd-catalog" in data or "nsd-catalog" in data:
+            descriptor = "NS"
+            mynsd = nsd_catalog.nsd()
+            pybindJSONDecoder.load_ietf_json(data, None, None, obj=mynsd)
+        else:
+            descriptor = None
+            raise KeyError("This is not neither nsd-catalog nor vnfd-catalog descriptor")
+        exit(0)
+
+    except yaml.YAMLError as exc:
+        error_pos = ""
+        if hasattr(exc, 'problem_mark'):
+            mark = exc.problem_mark
+            error_pos = "at line:%s column:%s" % (mark.line + 1, mark.column + 1)
+        print("Error loading file '{}'. yaml format error {}".format(input_file_name, error_pos), file=sys.stderr)
+    except ArgumentParserError as e:
+        print(str(e), file=sys.stderr)
+    except IOError as e:
+            print("Error loading file '{}': {}".format(file_name, e), file=sys.stderr)
+    except ImportError as e:
+        print ("Package python-osm-im not installed: {}".format(e), file=sys.stderr)
+    except Exception as e:
+        if file_name:
+            print("Error loading file '{}': {}".format(file_name, str(e)), file=sys.stderr)
+        else:
+            if descriptor:
+                print("Error. Invalid {} descriptor format in '{}': {}".format(descriptor, input_file_name, str(e)), file=sys.stderr)
+            else:
+                print("Error. Invalid descriptor format in '{}': {}".format(input_file_name, str(e)), file=sys.stderr)
+    exit(1)