Feature 9952: Distributed Proxy Charms
[osm/LCM.git] / osm_lcm / vim_sdn.py
index afdabc2..7c774d2 100644 (file)
@@ -23,6 +23,7 @@ import logging.handlers
 from osm_lcm import ROclient
 from osm_lcm.lcm_utils import LcmException, LcmBase, deep_get
 from n2vc.k8s_helm_conn import K8sHelmConnector
+from n2vc.k8s_helm3_conn import K8sHelm3Connector
 from n2vc.k8s_juju_conn import K8sJujuConnector
 from n2vc.exceptions import K8sException, N2VCException
 from osm_common.dbbase import DbException
@@ -145,7 +146,7 @@ class VimLcm(LcmBase):
             self.logger.debug(logging_text + "Exit Ok VIM account created at RO_vim_account_id={}".format(desc["uuid"]))
             return
 
-        except (ROclient.ROClientException, DbException) as e:
+        except (ROclient.ROClientException, DbException, asyncio.CancelledError) as e:
             self.logger.error(logging_text + "Exit Exception {}".format(e))
             exc = e
         except Exception as e:
@@ -272,7 +273,7 @@ class VimLcm(LcmBase):
             self.logger.debug(logging_text + "Exit Ok RO_vim_id={}".format(RO_vim_id))
             return
 
-        except (ROclient.ROClientException, DbException) as e:
+        except (ROclient.ROClientException, DbException, asyncio.CancelledError) as e:
             self.logger.error(logging_text + "Exit Exception {}".format(e))
             exc = e
         except Exception as e:
@@ -348,7 +349,7 @@ class VimLcm(LcmBase):
             self.logger.debug(logging_text + "Exit Ok")
             return
 
-        except (ROclient.ROClientException, DbException) as e:
+        except (ROclient.ROClientException, DbException, asyncio.CancelledError) as e:
             self.logger.error(logging_text + "Exit Exception {}".format(e))
             exc = e
         except Exception as e:
@@ -465,7 +466,7 @@ class WimLcm(LcmBase):
             self.logger.debug(logging_text + "Exit Ok WIM account created at RO_wim_account_id={}".format(desc["uuid"]))
             return
 
-        except (ROclient.ROClientException, DbException) as e:
+        except (ROclient.ROClientException, DbException, asyncio.CancelledError) as e:
             self.logger.error(logging_text + "Exit Exception {}".format(e))
             exc = e
         except Exception as e:
@@ -570,7 +571,7 @@ class WimLcm(LcmBase):
             self.logger.debug(logging_text + "Exit Ok RO_wim_id={}".format(RO_wim_id))
             return
 
-        except (ROclient.ROClientException, DbException) as e:
+        except (ROclient.ROClientException, DbException, asyncio.CancelledError) as e:
             self.logger.error(logging_text + "Exit Exception {}".format(e))
             exc = e
         except Exception as e:
@@ -645,7 +646,7 @@ class WimLcm(LcmBase):
             self.logger.debug(logging_text + "Exit Ok")
             return
 
-        except (ROclient.ROClientException, DbException) as e:
+        except (ROclient.ROClientException, DbException, asyncio.CancelledError) as e:
             self.logger.error(logging_text + "Exit Exception {}".format(e))
             exc = e
         except Exception as e:
@@ -734,7 +735,7 @@ class SdnLcm(LcmBase):
             operation_details = 'Done'
             return
 
-        except (ROclient.ROClientException, DbException) as e:
+        except (ROclient.ROClientException, DbException, asyncio.CancelledError) as e:
             self.logger.error(logging_text + "Exit Exception {}".format(e))
             exc = e
         except Exception as e:
@@ -804,7 +805,7 @@ class SdnLcm(LcmBase):
             self.logger.debug(logging_text + "Exit Ok RO_sdn_id={}".format(RO_sdn_id))
             return
 
-        except (ROclient.ROClientException, DbException) as e:
+        except (ROclient.ROClientException, DbException, asyncio.CancelledError) as e:
             self.logger.error(logging_text + "Exit Exception {}".format(e))
             exc = e
         except Exception as e:
@@ -870,7 +871,7 @@ class SdnLcm(LcmBase):
             self.logger.debug("sdn_delete task sdn_id={} Exit Ok".format(sdn_id))
             return
 
-        except (ROclient.ROClientException, DbException) as e:
+        except (ROclient.ROClientException, DbException, asyncio.CancelledError) as e:
             self.logger.error(logging_text + "Exit Exception {}".format(e))
             exc = e
         except Exception as e:
@@ -897,7 +898,7 @@ class SdnLcm(LcmBase):
 
 
 class K8sClusterLcm(LcmBase):
-    timeout_create = 600
+    timeout_create = 300
 
     def __init__(self, db, msg, fs, lcm_tasks, config, loop):
         """
@@ -913,7 +914,7 @@ class K8sClusterLcm(LcmBase):
         self.fs = fs
         self.db = db
 
-        self.helm_k8scluster = K8sHelmConnector(
+        self.helm2_k8scluster = K8sHelmConnector(
             kubectl_command=self.vca_config.get("kubectlpath"),
             helm_command=self.vca_config.get("helmpath"),
             fs=self.fs,
@@ -922,16 +923,28 @@ class K8sClusterLcm(LcmBase):
             on_update_db=None
         )
 
+        self.helm3_k8scluster = K8sHelm3Connector(
+            kubectl_command=self.vca_config.get("kubectlpath"),
+            helm_command=self.vca_config.get("helm3path"),
+            fs=self.fs,
+            log=self.logger,
+            db=self.db,
+            on_update_db=None
+        )
+
         self.juju_k8scluster = K8sJujuConnector(
             kubectl_command=self.vca_config.get("kubectlpath"),
             juju_command=self.vca_config.get("jujupath"),
             fs=self.fs,
             log=self.logger,
             db=self.db,
-            on_update_db=None
+            loop=self.loop,
+            on_update_db=None,
+            vca_config=self.vca_config,
         )
         self.k8s_map = {
-            "helm-chart": self.helm_k8scluster,
+            "helm-chart": self.helm2_k8scluster,
+            "helm-chart-v3": self.helm3_k8scluster,
             "juju-bundle": self.juju_k8scluster,
         }
 
@@ -961,7 +974,7 @@ class K8sClusterLcm(LcmBase):
             task2name = {}
             init_target = deep_get(db_k8scluster, ("_admin", "init"))
             step = "Launching k8scluster init tasks"
-            for task_name in ("helm-chart", "juju-bundle"):
+            for task_name in ("helm-chart", "juju-bundle", "helm-chart-v3"):
                 if init_target and task_name not in init_target:
                     continue
                 task = asyncio.ensure_future(self.k8s_map[task_name].init_env(k8s_credentials,
@@ -997,6 +1010,7 @@ class K8sClusterLcm(LcmBase):
                         error_text_list.append("Failing init {}: {}".format(task_name, exc))
                         db_k8scluster_update["_admin.{}.error_msg".format(task_name)] = str(exc)
                         db_k8scluster_update["_admin.{}.id".format(task_name)] = None
+                        db_k8scluster_update["_admin.{}.operationalState".format(task_name)] = "ERROR"
                         self.logger.error(logging_text + "{} init fail: {}".format(task_name, exc),
                                           exc_info=not isinstance(exc, (N2VCException, str)))
                     else:
@@ -1007,22 +1021,28 @@ class K8sClusterLcm(LcmBase):
                         db_k8scluster_update["_admin.{}.error_msg".format(task_name)] = None
                         db_k8scluster_update["_admin.{}.id".format(task_name)] = k8s_id
                         db_k8scluster_update["_admin.{}.created".format(task_name)] = uninstall_sw
-                        db_k8scluster_update["_admin.operationalState"] = "ENABLED"
+                        db_k8scluster_update["_admin.{}.operationalState".format(task_name)] = "ENABLED"
                 # update database
                 step = "Updating database for " + task_name
                 self.update_db_2("k8sclusters", k8scluster_id, db_k8scluster_update)
-            if not tasks_name_ok:
+            if tasks_name_ok:
+                operation_details = "ready for " + ", ".join(tasks_name_ok)
+                operation_state = "COMPLETED"
+                db_k8scluster_update["_admin.operationalState"] = "ENABLED" if not error_text_list else "DEGRADED"
+                operation_details += "; " + ";".join(error_text_list)
+            else:
                 db_k8scluster_update["_admin.operationalState"] = "ERROR"
                 operation_state = "FAILED"
-            else:
-                db_k8scluster_update["_admin.detailed-status"] = "ready for " + ", ;".join(tasks_name_ok)
-                operation_state = "COMPLETED"
-            operation_details = db_k8scluster_update["_admin.detailed-status"] = ";".join(error_text_list)
+                operation_details = ";".join(error_text_list)
+            db_k8scluster_update["_admin.detailed-status"] = operation_details
             self.logger.debug(logging_text + "Done. Result: " + operation_state)
             exc = None
 
         except Exception as e:
-            self.logger.critical(logging_text + "Exit Exception {}".format(e), exc_info=True)
+            if isinstance(e, (LcmException, DbException, K8sException, N2VCException, asyncio.CancelledError)):
+                self.logger.error(logging_text + "Exit Exception {}".format(e))
+            else:
+                self.logger.critical(logging_text + "Exit Exception {}".format(e), exc_info=True)
             exc = e
         finally:
             if exc and db_k8scluster:
@@ -1064,6 +1084,7 @@ class K8sClusterLcm(LcmBase):
             self.logger.debug(logging_text + step)
             db_k8scluster = self.db.get_one("k8sclusters", {"_id": k8scluster_id})
             k8s_hc_id = deep_get(db_k8scluster, ("_admin", "helm-chart", "id"))
+            k8s_h3c_id = deep_get(db_k8scluster, ("_admin", "helm-chart-v3", "id"))
             k8s_jb_id = deep_get(db_k8scluster, ("_admin", "juju-bundle", "id"))
 
             cluster_removed = True
@@ -1072,12 +1093,21 @@ class K8sClusterLcm(LcmBase):
                 uninstall_sw = deep_get(db_k8scluster, ("_admin", "juju-bundle", "created")) or False
                 cluster_removed = await self.juju_k8scluster.reset(cluster_uuid=k8s_jb_id, uninstall_sw=uninstall_sw)
                 db_k8scluster_update["_admin.juju-bundle.id"] = None
+                db_k8scluster_update["_admin.juju-bundle.operationalState"] = "DISABLED"
 
             if k8s_hc_id:
                 step = "Removing helm-chart '{}'".format(k8s_hc_id)
                 uninstall_sw = deep_get(db_k8scluster, ("_admin", "helm-chart", "created")) or False
-                cluster_removed = await self.helm_k8scluster.reset(cluster_uuid=k8s_hc_id, uninstall_sw=uninstall_sw)
+                cluster_removed = await self.helm2_k8scluster.reset(cluster_uuid=k8s_hc_id, uninstall_sw=uninstall_sw)
                 db_k8scluster_update["_admin.helm-chart.id"] = None
+                db_k8scluster_update["_admin.helm-chart.operationalState"] = "DISABLED"
+
+            if k8s_h3c_id:
+                step = "Removing helm-chart-v3 '{}'".format(k8s_hc_id)
+                uninstall_sw = deep_get(db_k8scluster, ("_admin", "helm-chart-v3", "created")) or False
+                cluster_removed = await self.helm3_k8scluster.reset(cluster_uuid=k8s_hc_id, uninstall_sw=uninstall_sw)
+                db_k8scluster_update["_admin.helm-chart-v3.id"] = None
+                db_k8scluster_update["_admin.helm-chart-v3.operationalState"] = "DISABLED"
 
             # Try to remove from cluster_inserted to clean old versions
             if k8s_hc_id and cluster_removed:
@@ -1096,7 +1126,7 @@ class K8sClusterLcm(LcmBase):
             self.logger.debug(logging_text + "Done")
 
         except Exception as e:
-            if isinstance(e, (LcmException, DbException, K8sException, N2VCException)):
+            if isinstance(e, (LcmException, DbException, K8sException, N2VCException, asyncio.CancelledError)):
                 self.logger.error(logging_text + "Exit Exception {}".format(e))
             else:
                 self.logger.critical(logging_text + "Exit Exception {}".format(e), exc_info=True)
@@ -1141,15 +1171,6 @@ class K8sRepoLcm(LcmBase):
         self.fs = fs
         self.db = db
 
-        self.k8srepo = K8sHelmConnector(
-            kubectl_command=self.vca_config.get("kubectlpath"),
-            helm_command=self.vca_config.get("helmpath"),
-            fs=self.fs,
-            log=self.logger,
-            db=self.db,
-            on_update_db=None
-        )
-
         super().__init__(db, msg, fs, self.logger)
 
     async def create(self, k8srepo_content, order_id):
@@ -1178,7 +1199,9 @@ class K8sRepoLcm(LcmBase):
             db_k8srepo = self.db.get_one("k8srepos", {"_id": k8srepo_id})
             db_k8srepo_update["_admin.operationalState"] = "ENABLED"
         except Exception as e:
-            self.logger.critical(logging_text + "Exit Exception {}".format(e), exc_info=True)
+            self.logger.error(logging_text + "Exit Exception {}".format(e),
+                              exc_info=not isinstance(e, (LcmException, DbException, K8sException, N2VCException,
+                                                          asyncio.CancelledError)))
             exc = e
         finally:
             if exc and db_k8srepo:
@@ -1225,7 +1248,9 @@ class K8sRepoLcm(LcmBase):
             db_k8srepo = self.db.get_one("k8srepos", {"_id": k8srepo_id})
 
         except Exception as e:
-            self.logger.critical(logging_text + "Exit Exception {}".format(e), exc_info=True)
+            self.logger.error(logging_text + "Exit Exception {}".format(e),
+                              exc_info=not isinstance(e, (LcmException, DbException, K8sException, N2VCException,
+                                                          asyncio.CancelledError)))
             exc = e
         finally:
             if exc and db_k8srepo: