Support SO restart for projects

Change-Id: I632151fa0194f80ab8d827f7bae3e96e6bc3748c
Signed-off-by: Philip Joseph <philip.joseph@riftio.com>
diff --git a/common/python/rift/mano/dts/subscriber/core.py b/common/python/rift/mano/dts/subscriber/core.py
index a2181e8..63cb321 100644
--- a/common/python/rift/mano/dts/subscriber/core.py
+++ b/common/python/rift/mano/dts/subscriber/core.py
@@ -163,8 +163,16 @@
 
         def on_apply(dts, acg, xact, action, scratch):
             """Apply the  configuration"""
-            is_recovery = xact.xact is None and action == rwdts.AppconfAction.INSTALL
-
+            if xact.xact is None:
+                if action == rwdts.AppconfAction.INSTALL:
+                    try:
+                        for cfg in self.reg.elements:
+                            if self.callback:
+                                self.callback(cfg, rwdts.QueryAction.CREATE)
+                    except Exception as e:
+                        self._log.exception("Adding config {} during restart failed: {}".
+                                            format(cfg, e))
+                return
 
             add_cfgs, delete_cfgs, update_cfgs = get_add_delete_update_cfgs(
                     dts_member_reg=self.reg,
diff --git a/common/python/rift/mano/utils/project.py b/common/python/rift/mano/utils/project.py
index 96d1de5..9d607ff 100644
--- a/common/python/rift/mano/utils/project.py
+++ b/common/python/rift/mano/utils/project.py
@@ -422,13 +422,13 @@
         return self._dts
 
     def add_project(self, name):
-        self.log.info("Adding project: {}".format(name))
+        self._log.info("Adding project: {}".format(name))
 
         if name not in self.projects:
             self._callbacks.on_add_apply(name)
             self.projects.append(name)
         else:
-            self.log.error("Project already present: {}".
+            self._log.error("Project already present: {}".
                            format(name))
 
     def delete_project(self, name):
@@ -437,7 +437,7 @@
             self._callbacks.on_delete_apply(name)
             self.projects.remove(name)
         else:
-            self.log.error("Unrecognized project: {}".
+            self._log.error("Unrecognized project: {}".
                            format(name))
 
     def update_project(self, name):
@@ -474,12 +474,11 @@
                 if action == rwdts.AppconfAction.INSTALL:
                     curr_cfg = self._reg.elements
                     for cfg in curr_cfg:
-                        self._log.debug("Project being re-added after restart.")
-                        self.add_project(cfg.name_ref)
+                        self._log.error("NOT IMPLEMENTED: Project being re-added after restart: {}".
+                                        format(cfg))
+                        # self.add_project(cfg.name)
+                        raise NotImplementedError("Tasklet restart not supported")
                 else:
-                    # When RIFT first comes up, an INSTALL is called with the current config
-                    # Since confd doesn't actally persist data this never has any data so
-                    # skip this for now.
                     self._log.debug("No xact handle.  Skipping apply config")
 
                 return
@@ -636,6 +635,18 @@
                                 format(name, self._get_tasklet_name(), e))
 
     def on_project_added(self, name):
+        if name not in self._tasklet.projects:
+            # Restart case, directly calling apply
+            try:
+                self._tasklet.projects[name] = \
+                                self._class(name, self._tasklet, **(self._kw))
+                self._loop.create_task(self._get_project(name).register())
+
+            except Exception as e:
+                self._log.exception("Project {} create for {} failed: {}".
+                                    format(name, self._get_tasklet_name(), e))
+                raise e
+
         self._log.debug("Project {} added to tasklet {}".
                         format(name, self._get_tasklet_name()))
         self._get_project(name)._apply = True