Create folder structure in backend for onboarded descriptor - RIFT 15317 23/1223/1
authorsinhan <nandan.sinha@riftio.com>
Thu, 2 Mar 2017 19:33:34 +0000 (19:33 +0000)
committersinhan <nandan.sinha@riftio.com>
Thu, 2 Mar 2017 19:34:44 +0000 (19:34 +0000)
Signed-off-by: sinhan <nandan.sinha@riftio.com>
rwlaunchpad/plugins/rwlaunchpadtasklet/rift/package/store.py
rwlaunchpad/plugins/rwpkgmgr/rift/tasklets/rwpkgmgr/rwpkgmgr.py
rwlaunchpad/plugins/rwpkgmgr/rift/tasklets/rwpkgmgr/subscriber/__init__.py
rwlaunchpad/plugins/rwpkgmgr/rift/tasklets/rwpkgmgr/subscriber/download_status.py
rwlaunchpad/plugins/rwpkgmgr/test/utest_subscriber_dts.py
rwlaunchpad/plugins/yang/rw-pkg-mgmt.yang

index 34fff1c..9ebd03c 100644 (file)
@@ -110,6 +110,8 @@ class PackageFilesystemStore(object):
         Raises:
             PackageStoreError- The package could not be retrieved
         """
+        self.refresh()
+
         if package_id not in self._package_dirs:
             msg = "Package %s not found in %s" % (package_id, self._root_dir)
             raise PackageNotFoundError(msg)
index d4e5736..b302b46 100644 (file)
@@ -30,14 +30,14 @@ gi.require_version('RwPkgMgmtYang', '1.0')
 
 from gi.repository import (
         RwDts as rwdts,
-        RwPkgMgmtYang)
+        RwPkgMgmtYang) 
 import rift.tasklets
 
 
 from . import rpc
 from .proxy import filesystem
 from . import publisher as pkg_publisher
-
+from . import subscriber 
 
 class PackageManagerTasklet(rift.tasklets.Tasklet):
     def __init__(self, *args, **kwargs):
@@ -66,6 +66,10 @@ class PackageManagerTasklet(rift.tasklets.Tasklet):
         args = [self.log, self.dts, self.loop]
         self.job_handler = pkg_publisher.DownloadStatusPublisher(*args)
 
+        # create catalog subscribers 
+        self.vnfd_catalog_sub = subscriber.VnfdStatusSubscriber(*args)
+        self.nsd_catalog_sub = subscriber.NsdStatusSubscriber(*args)
+
         args.append(proxy)
         self.endpoint_rpc = rpc.EndpointDiscoveryRpcHandler(*args)
         self.schema_rpc = rpc.SchemaRpcHandler(*args)
@@ -87,6 +91,8 @@ class PackageManagerTasklet(rift.tasklets.Tasklet):
         yield from self.pkg_op.register()
         yield from self.job_handler.register()
         yield from self.delete_rpc.register()
+        yield from self.vnfd_catalog_sub.register()
+        yield from self.nsd_catalog_sub.register()
 
     @asyncio.coroutine
     def run(self):
index f305f2f..14c3dc1 100644 (file)
@@ -13,4 +13,4 @@
 #   See the License for the specific language governing permissions and
 #   limitations under the License.
 #
-from .download_status import DownloadStatusSubscriber
+from .download_status import DownloadStatusSubscriber, VnfdStatusSubscriber, NsdStatusSubscriber
index c4a5a53..8fd041e 100644 (file)
 # Creation Date: 09/25/2016
 # 
 
+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
 
+from gi.repository import (
+    RwYang,
+    NsdYang,
+    RwNsdYang,
+    VnfdYang,
+    RwVnfdYang,
+    RwDts
+)
 
 class DownloadStatusSubscriber(mano_dts.AbstractOpdataSubscriber):
-    def __init__(self, log, dts, loop, callback=None):
-        super().__init__(log, dts, loop, callback)
 
-    def get_xpath(self):
+    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")
+
+class VnfdStatusSubscriber(DownloadStatusSubscriber): 
+    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)
+
+    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)
+
+        elif action == RwDts.QueryAction.DELETE:
+            actionDelete(self, msg)
+
+    def get_xpath(self): 
+        return self.subscriber.get_xpath() 
+
+
+class NsdStatusSubscriber(DownloadStatusSubscriber): 
+    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)
+
+    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)
+
+        elif action == RwDts.QueryAction.DELETE:
+            actionDelete(self, msg)
+
+    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  
+    Serialize the Vnfd/Nsd object to yaml and store yaml file in the created folder.
+    '''
+
+    download_dir = os.path.join(descriptor.DOWNLOAD_DIR, msg.id, msg.name)
+
+    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))
+
+def actionDelete(descriptor, msg): 
+    ''' Delete folder structure created above.
+    '''
+
+    download_dir = os.path.join(descriptor.DOWNLOAD_DIR, msg.id)
+    if os.path.exists(download_dir):
+        descriptor.log.debug("Removing directory {}".format(download_dir))
+        shutil.rmtree(download_dir)
+
index 4281e11..3b377c7 100755 (executable)
@@ -135,4 +135,4 @@ def main(argv=sys.argv[1:]):
             )
 
 if __name__ == '__main__':
-    main()
\ No newline at end of file
+    main()
index 8370c1b..de56e55 100644 (file)
@@ -53,6 +53,13 @@ module rw-pkg-mgmt
     prefix "manotypes";
   }
 
+  import rw-vnfd {
+    prefix "rwvnfd";
+  }
+  import rw-nsd {
+    prefix "rwnsd";
+  }
+
   revision 2016-06-01 {
     description
       "Initial revision.";
@@ -340,4 +347,4 @@ module rw-pkg-mgmt
     }
   }
 
-}
\ No newline at end of file
+}