update from RIFT as of 696b75d2fe9fb046261b08c616f1bcf6c0b54a9b second try
[osm/SO.git] / rwlaunchpad / plugins / rwpkgmgr / rift / tasklets / rwpkgmgr / subscriber / download_status.py
index 042efa6..50c8d7f 100644 (file)
@@ -1,5 +1,5 @@
-# 
-#   Copyright 2016 RIFT.IO Inc
+#
+#   Copyright 2016-2017 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.
 #
 # Author(s): Varun Prasad
 # Creation Date: 09/25/2016
-# 
+#
 
+import gi
 import os
-import io
-import shutil
 
 import rift.mano.dts as mano_dts
-import rift.package.package as package 
-import rift.package.store as store 
-import rift.package.convert as convert
+import rift.package.store as store
+from rift.package.convert import (
+    RwVnfdSerializer,
+    RwNsdSerializer,
+)
 
 from gi.repository import (
     RwYang,
-    NsdYang,
-    RwNsdYang,
-    VnfdYang,
-    RwVnfdYang,
     RwDts
 )
 
 class DownloadStatusSubscriber(mano_dts.AbstractOpdataSubscriber):
+    def __init__(self, log, dts, loop, project, callback):
+        super().__init__(log, dts, loop, project, callback)
 
-    def __init__(self, log, dts, loop, callback):
-        super().__init__(log, dts, loop, callback)
-    
-    def get_xpath(self): 
-        return ("D,/rw-pkg-mgmt:download-jobs/rw-pkg-mgmt:job")
+    def get_xpath(self):
+        return self._project.add_project(
+            "D,/rw-pkg-mgmt:download-jobs/rw-pkg-mgmt:job")
 
-class VnfdStatusSubscriber(DownloadStatusSubscriber): 
+
+class VnfdStatusSubscriber(mano_dts.VnfdCatalogSubscriber):
     DOWNLOAD_DIR = store.VnfdPackageFilesystemStore.DEFAULT_ROOT_DIR
-    MODULE_DESC = 'vnfd rw-vnfd'.split()
     DESC_TYPE = 'vnfd'
-    
-    def __init__(self, log, dts, loop):
-        super().__init__(log, dts, loop, self.on_change)
-        self.subscriber = mano_dts.VnfdCatalogSubscriber(log, dts, loop)
+    SERIALIZER = RwVnfdSerializer()
+
+    def __init__(self, log, dts, loop, project):
+        super().__init__(log, dts, loop, project, callback=self.on_change)
 
-    def on_change(self, msg, action): 
-        log_msg = "1. Vnfd called w/ msg attributes: {} id {} name {} action: {}".format(repr(msg), msg.id, msg.name, repr(action))
+    def on_change(self, msg, action):
+        log_msg = "1. Vnfd called w/ msg attributes: {} id {} name {} action: {}". \
+                  format(repr(msg), msg.id, msg.name, repr(action))
         self.log.debug(log_msg)
-        if action == RwDts.QueryAction.UPDATE:
-            actionCreate(self, msg)
+        if action == RwDts.QueryAction.UPDATE or action == RwDts.QueryAction.CREATE:
+            actionCreate(self, msg, self.project.name)
         else:
             self.log.debug("VnfdStatusSubscriber: No action for {}".format(repr(action)))
             pass
 
-    def get_xpath(self): 
-        return self.subscriber.get_xpath() 
-
 
-class NsdStatusSubscriber(DownloadStatusSubscriber): 
+class NsdStatusSubscriber(mano_dts.NsdCatalogSubscriber):
     DOWNLOAD_DIR = store.NsdPackageFilesystemStore.DEFAULT_ROOT_DIR
-    MODULE_DESC = 'nsd rw-nsd'.split()
     DESC_TYPE = 'nsd'
-    
-    def __init__(self, log, dts, loop):
-        super().__init__(log, dts, loop, self.on_change)
-        self.subscriber = mano_dts.NsdCatalogSubscriber(log, dts, loop)
+    SERIALIZER = RwNsdSerializer()
 
-    def on_change(self, msg, action): 
-        log_msg = "1. Nsd called w/ msg attributes: {} id {} name {} action: {}".format(repr(msg), msg.id, msg.name, repr(action))
+    def __init__(self, log, dts, loop, project):
+        super().__init__(log, dts, loop, project, callback=self.on_change)
+
+    def on_change(self, msg, action):
+        log_msg = "1. Nsd called w/ msg attributes: {} id {} name {} action: {}". \
+                  format(repr(msg), msg.id, msg.name, repr(action))
         self.log.debug(log_msg)
-        if action == RwDts.QueryAction.UPDATE:
-            actionCreate(self, msg)
+        if action == RwDts.QueryAction.UPDATE or action == RwDts.QueryAction.CREATE:
+            actionCreate(self, msg, self.project.name)
         else:
             self.log.debug("NsdStatusSubscriber: No action for {}".format(repr(action)))
             pass
 
-    def get_xpath(self): 
-        return self.subscriber.get_xpath() 
-
 
-def actionCreate(descriptor, msg): 
-    ''' Create folder structure if it doesn't exist: id/vnf name OR id/nsd name  
+def actionCreate(descriptor, msg, project_name=None):
+    ''' Create folder structure if it doesn't exist: id/vnf name OR id/nsd name
     Serialize the Vnfd/Nsd object to yaml and store yaml file in the created folder.
     '''
 
-    desc_name = msg.name if msg.name else ""
-    download_dir = os.path.join(descriptor.DOWNLOAD_DIR, msg.id)
+    download_dir = os.path.join(
+            descriptor.DOWNLOAD_DIR,
+            project_name if project_name else "",  
+            msg.id)
 
-    # If a download dir is present with contents, then we know it has been created in the 
-    # upload path. 
+    # If a download dir is present with contents, then we know it has been created in the
+    # upload path.
     if os.path.exists(download_dir) and os.listdir(download_dir):
         descriptor.log.debug("Skpping folder creation, {} already present".format(download_dir))
         return
-    else: 
+    else:
         # Folder structure is based on top-level package-id directory
         if not os.path.exists(download_dir):
             os.makedirs(download_dir)
             descriptor.log.debug("Created directory {}".format(download_dir))
-
-            model = RwYang.Model.create_libncx()
-            for module in descriptor.MODULE_DESC: model.load_module(module)
-
-            yaml_path = "{base}/{name}_{type}.yaml".format(base=download_dir, name=msg.name, type=descriptor.DESC_TYPE) 
-            with open(yaml_path,"w") as fh:
-                fh.write(msg.to_yaml(model))
-
+        yaml_path = "{base}/{name}_{type}.yaml". \
+                    format(base=download_dir, name=msg.name[0:50], type=descriptor.DESC_TYPE)
+        with open(yaml_path,"w") as fh:
+                fh.write(descriptor.SERIALIZER.to_yaml_string(msg))