Reformat files according to new black validation
[osm/LCM.git] / osm_lcm / vim_sdn.py
index d95df94..ea25c2b 100644 (file)
@@ -61,7 +61,6 @@ class VimLcm(LcmBase):
         super().__init__(msg, self.logger)
 
     async def create(self, vim_content, order_id):
-
         # HA tasks and backward compatibility:
         # If 'vim_content' does not include 'op_id', we a running a legacy NBI version.
         # In such a case, HA is not supported by NBI, 'op_id' is None, and lock_HA() will do nothing.
@@ -214,7 +213,6 @@ class VimLcm(LcmBase):
             self.lcm_tasks.remove("vim_account", vim_id, order_id)
 
     async def edit(self, vim_content, order_id):
-
         # HA tasks and backward compatibility:
         # If 'vim_content' does not include 'op_id', we a running a legacy NBI version.
         # In such a case, HA is not supported by NBI, and the HA check always returns True
@@ -370,7 +368,6 @@ class VimLcm(LcmBase):
             self.lcm_tasks.remove("vim_account", vim_id, order_id)
 
     async def delete(self, vim_content, order_id):
-
         # HA tasks and backward compatibility:
         # If 'vim_content' does not include 'op_id', we a running a legacy NBI version.
         # In such a case, HA is not supported by NBI, and the HA check always returns True
@@ -483,7 +480,6 @@ class WimLcm(LcmBase):
         super().__init__(msg, self.logger)
 
     async def create(self, wim_content, order_id):
-
         # HA tasks and backward compatibility:
         # If 'wim_content' does not include 'op_id', we a running a legacy NBI version.
         # In such a case, HA is not supported by NBI, 'op_id' is None, and lock_HA() will do nothing.
@@ -600,7 +596,6 @@ class WimLcm(LcmBase):
             self.lcm_tasks.remove("wim_account", wim_id, order_id)
 
     async def edit(self, wim_content, order_id):
-
         # HA tasks and backward compatibility:
         # If 'wim_content' does not include 'op_id', we a running a legacy NBI version.
         # In such a case, HA is not supported by NBI, and the HA check always returns True
@@ -628,7 +623,6 @@ class WimLcm(LcmBase):
                 and db_wim["_admin"].get("deployed")
                 and db_wim["_admin"]["deployed"].get("RO")
             ):
-
                 RO_wim_id = db_wim["_admin"]["deployed"]["RO"]
                 step = "Editing wim at RO"
                 RO = ROclient.ROClient(self.loop, **self.ro_config)
@@ -721,7 +715,6 @@ class WimLcm(LcmBase):
             self.lcm_tasks.remove("wim_account", wim_id, order_id)
 
     async def delete(self, wim_content, order_id):
-
         # HA tasks and backward compatibility:
         # If 'vim_content' does not include 'op_id', we a running a legacy NBI version.
         # In such a case, HA is not supported by NBI, and the HA check always returns True
@@ -831,7 +824,6 @@ class SdnLcm(LcmBase):
         super().__init__(msg, self.logger)
 
     async def create(self, sdn_content, order_id):
-
         # HA tasks and backward compatibility:
         # If 'sdn_content' does not include 'op_id', we a running a legacy NBI version.
         # In such a case, HA is not supported by NBI, 'op_id' is None, and lock_HA() will do nothing.
@@ -912,7 +904,6 @@ class SdnLcm(LcmBase):
             self.lcm_tasks.remove("sdn", sdn_id, order_id)
 
     async def edit(self, sdn_content, order_id):
-
         # HA tasks and backward compatibility:
         # If 'sdn_content' does not include 'op_id', we a running a legacy NBI version.
         # In such a case, HA is not supported by NBI, and the HA check always returns True
@@ -994,7 +985,6 @@ class SdnLcm(LcmBase):
             self.lcm_tasks.remove("sdn", sdn_id, order_id)
 
     async def delete(self, sdn_content, order_id):
-
         # HA tasks and backward compatibility:
         # If 'vim_content' does not include 'op_id', we a running a legacy NBI version.
         # In such a case, HA is not supported by NBI, and the HA check always returns True
@@ -1127,7 +1117,6 @@ class K8sClusterLcm(LcmBase):
         }
 
     async def create(self, k8scluster_content, order_id):
-
         op_id = k8scluster_content.pop("op_id", None)
         if not self.lcm_tasks.lock_HA("k8scluster", "create", op_id):
             return
@@ -1299,8 +1288,33 @@ class K8sClusterLcm(LcmBase):
                 self.logger.error(logging_text + "Cannot update database: {}".format(e))
             self.lcm_tasks.remove("k8scluster", k8scluster_id, order_id)
 
-    async def delete(self, k8scluster_content, order_id):
+    async def edit(self, k8scluster_content, order_id):
+        op_id = k8scluster_content.pop("op_id", None)
+        if not self.lcm_tasks.lock_HA("k8scluster", "edit", op_id):
+            return
+
+        k8scluster_id = k8scluster_content["_id"]
+
+        logging_text = "Task k8scluster_edit={} ".format(k8scluster_id)
+        self.logger.debug(logging_text + "Enter")
+
+        # TODO the implementation is pending and will be part of a new feature
+        # It will support rotation of certificates, update of credentials and K8S API endpoint
+        # At the moment the operation is set as completed
+
+        operation_state = "COMPLETED"
+        operation_details = "Not implemented"
+
+        self.lcm_tasks.unlock_HA(
+            "k8scluster",
+            "edit",
+            op_id,
+            operationState=operation_state,
+            detailed_status=operation_details,
+        )
+        self.lcm_tasks.remove("k8scluster", k8scluster_id, order_id)
 
+    async def delete(self, k8scluster_content, order_id):
         # HA tasks and backward compatibility:
         # If 'vim_content' does not include 'op_id', we a running a legacy NBI version.
         # In such a case, HA is not supported by NBI, 'op_id' is None, and lock_HA() will do nothing.
@@ -1466,6 +1480,33 @@ class VcaLcm(LcmBase):
         )
         return db_vca
 
+    async def _validate_vca(self, db_vca_id: str) -> None:
+        task = asyncio.ensure_future(
+            asyncio.wait_for(
+                self.n2vc.validate_vca(db_vca_id),
+                timeout=self.timeout_create,
+            )
+        )
+        await asyncio.wait([task], return_when=asyncio.FIRST_COMPLETED)
+        if task.exception():
+            raise task.exception()
+
+    def _is_vca_config_update(self, update_options) -> bool:
+        return any(
+            word in update_options.keys()
+            for word in [
+                "cacert",
+                "endpoints",
+                "lxd-cloud",
+                "lxd-credentials",
+                "k8s-cloud",
+                "k8s-credentials",
+                "model-config",
+                "user",
+                "secret",
+            ]
+        )
+
     async def create(self, vca_content, order_id):
         op_id = vca_content.pop("op_id", None)
         if not self.lcm_tasks.lock_HA("vca", "create", op_id):
@@ -1484,16 +1525,7 @@ class VcaLcm(LcmBase):
             )
             db_vca = self._get_vca_by_id(vca_id)
 
-            task = asyncio.ensure_future(
-                asyncio.wait_for(
-                    self.n2vc.validate_vca(db_vca["_id"]),
-                    timeout=self.timeout_create,
-                )
-            )
-
-            await asyncio.wait([task], return_when=asyncio.FIRST_COMPLETED)
-            if task.exception():
-                raise task.exception()
+            await self._validate_vca(db_vca["_id"])
             self.logger.debug(
                 "Task vca_create={} {}".format(
                     vca_id, "vca registered and validated successfully"
@@ -1536,8 +1568,71 @@ class VcaLcm(LcmBase):
                 )
             self.lcm_tasks.remove("vca", vca_id, order_id)
 
-    async def delete(self, vca_content, order_id):
+    async def edit(self, vca_content, order_id):
+        op_id = vca_content.pop("op_id", None)
+        if not self.lcm_tasks.lock_HA("vca", "edit", op_id):
+            return
+
+        vca_id = vca_content["_id"]
+        self.logger.debug("Task vca_edit={} {}".format(vca_id, "Enter"))
+
+        db_vca = None
+        db_vca_update = {}
+
+        operation_state = "FAILED"
+        operation_details = ""
+        try:
+            self.logger.debug(
+                "Task vca_edit={} {}".format(vca_id, "Getting vca from db")
+            )
+            db_vca = self._get_vca_by_id(vca_id)
+            if self._is_vca_config_update(vca_content):
+                await self._validate_vca(db_vca["_id"])
+                self.logger.debug(
+                    "Task vca_edit={} {}".format(
+                        vca_id, "vca registered and validated successfully"
+                    )
+                )
+                db_vca_update["_admin.operationalState"] = "ENABLED"
+                db_vca_update["_admin.detailed-status"] = "Connectivity: ok"
+
+            operation_details = "Edited"
+            operation_state = "COMPLETED"
+
+            self.logger.debug(
+                "Task vca_edit={} {}".format(
+                    vca_id, "Done. Result: {}".format(operation_state)
+                )
+            )
+
+        except Exception as e:
+            error_msg = "Failed with exception: {}".format(e)
+            self.logger.error("Task vca_edit={} {}".format(vca_id, error_msg))
+            db_vca_update["_admin.operationalState"] = "ERROR"
+            db_vca_update["_admin.detailed-status"] = error_msg
+            operation_state = "FAILED"
+            operation_details = error_msg
+        finally:
+            try:
+                self.update_db_2("vca", vca_id, db_vca_update)
+
+                # Register the operation and unlock
+                self.lcm_tasks.unlock_HA(
+                    "vca",
+                    "edit",
+                    op_id,
+                    operationState=operation_state,
+                    detailed_status=operation_details,
+                )
+            except DbException as e:
+                self.logger.error(
+                    "Task vca_edit={} {}".format(
+                        vca_id, "Cannot update database: {}".format(e)
+                    )
+                )
+            self.lcm_tasks.remove("vca", vca_id, order_id)
 
+    async def delete(self, vca_content, order_id):
         # HA tasks and backward compatibility:
         # If "vim_content" does not include "op_id", we a running a legacy NBI version.
         # In such a case, HA is not supported by NBI, "op_id" is None, and lock_HA() will do nothing.
@@ -1616,7 +1711,6 @@ class K8sRepoLcm(LcmBase):
         )
 
     async def create(self, k8srepo_content, order_id):
-
         # HA tasks and backward compatibility:
         # If 'vim_content' does not include 'op_id', we a running a legacy NBI version.
         # In such a case, HA is not supported by NBI, 'op_id' is None, and lock_HA() will do nothing.
@@ -1681,7 +1775,6 @@ class K8sRepoLcm(LcmBase):
             self.lcm_tasks.remove("k8srepo", k8srepo_id, order_id)
 
     async def delete(self, k8srepo_content, order_id):
-
         # HA tasks and backward compatibility:
         # If 'vim_content' does not include 'op_id', we a running a legacy NBI version.
         # In such a case, HA is not supported by NBI, 'op_id' is None, and lock_HA() will do nothing.