RIFT OSM R1 Initial Submission
[osm/SO.git] / common / rw_gen_package.py
diff --git a/common/rw_gen_package.py b/common/rw_gen_package.py
new file mode 100755 (executable)
index 0000000..427e717
--- /dev/null
@@ -0,0 +1,102 @@
+#!/usr/bin/env python3
+
+# 
+#   Copyright 2016 RIFT.IO Inc
+#
+#   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.
+#
+
+import sys
+import os
+import subprocess
+import argparse
+import shutil
+import xml.etree.ElementTree as etree
+
+from gi.repository import (
+    RwYang,
+    NsdYang,
+    RwNsdYang,
+    VnfdYang,
+    RwVnfdYang,
+    VldYang,
+    RwVldYang
+)
+
+def read_from_file(module_list, infile, input_format, descr_type):
+      model = RwYang.Model.create_libncx()
+      for module in module_list:
+          model.load_module(module)
+
+      descr = None
+      if descr_type == "nsd":
+        descr = RwNsdYang.YangData_Nsd_NsdCatalog_Nsd()
+      else:
+        descr = VnfdYang.YangData_Vnfd_VnfdCatalog_Vnfd()
+
+      if input_format == 'json':
+          json_str = open(infile).read()
+          descr.from_json(model, json_str)
+
+      elif input_format.strip() == 'xml':
+          tree = etree.parse(infile)
+          root = tree.getroot()
+          xmlstr = etree.tostring(root, encoding="unicode")
+          descr.from_xml_v2(model, xmlstr)
+      else:
+          raise("Invalid input format for the descriptor")
+
+      return descr
+
+def write_to_file(name, outdir, infile, descr_type):
+      dirpath = os.path.join(outdir, name, descr_type)
+      if not os.path.exists(dirpath):
+          os.makedirs(dirpath)
+      shutil.copy(infile, dirpath)
+
+def main(argv=sys.argv[1:]):
+      global outdir, output_format
+      parser = argparse.ArgumentParser()
+      parser.add_argument('-i', '--infile', required=True,
+                          type=lambda x: os.path.isfile(x) and x or parser.error("INFILE does not exist"))
+      parser.add_argument('-o', '--outdir', default=".",
+                          type=lambda x: os.path.isdir(x) and x or parser.error("OUTDIR does not exist"))
+      parser.add_argument('-f', '--format', choices=['json', 'xml'], required=True)
+      parser.add_argument('-t', '--descriptor-type', choices=['nsd', 'vnfd'], required=True )
+
+      args = parser.parse_args()
+      infile = args.infile
+      input_format = args.format
+      outdir = args.outdir
+      dtype = args.descriptor_type
+
+      print('Reading file {} in format {}'.format(infile, input_format))
+      module_list = ['vld', 'rw-vld']
+      if dtype == 'nsd':
+          module_list.extend(['nsd', 'rw-nsd'])
+      else:
+          module_list.extend(['vnfd', 'rw-vnfd'])
+
+      descr = read_from_file(module_list, args.infile, args.format, dtype)
+
+      print("Creating %s descriptor for {}".format(dtype.upper(), descr.name))
+      write_to_file(descr.name, outdir, infile, dtype)
+      status = subprocess.call(os.path.join(os.environ["RIFT_INSTALL"],
+              "/usr/rift/toolchain/cmake/bin/generate_descriptor_pkg.sh %s %s" % (outdir, descr.name)), shell=True)
+      print("Status of %s descriptor package creation is: %s" % (dtype.upper(), status))
+
+
+if __name__ == "__main__":
+      main()
+
+