Feature 10929: LCM saga, Milestone 1.
[osm/LCM.git] / osm_lcm / ns.py
index 968e1f3..ced0ec0 100644 (file)
@@ -34,6 +34,7 @@ from jinja2 import (
 )
 
 from osm_lcm import ROclient
+from osm_lcm.data_utils.lcm_config import LcmCfg
 from osm_lcm.data_utils.nsr import (
     get_deployed_kdu,
     get_deployed_vca,
@@ -128,29 +129,12 @@ __author__ = "Alfonso Tierno <alfonso.tiernosepulveda@telefonica.com>"
 
 
 class NsLcm(LcmBase):
-    timeout_scale_on_error = (
-        5 * 60
-    )  # Time for charm from first time at blocked,error status to mark as failed
-    timeout_scale_on_error_outer_factor = 1.05  # Factor in relation to timeout_scale_on_error related to the timeout to be applied within the asyncio.wait_for coroutine
-    timeout_ns_deploy = 2 * 3600  # default global timeout for deployment a ns
-    timeout_ns_terminate = 1800  # default global timeout for un deployment a ns
-    timeout_ns_heal = 1800  # default global timeout for un deployment a ns
-    timeout_charm_delete = 10 * 60
-    timeout_primitive = 30 * 60  # Timeout for primitive execution
-    timeout_primitive_outer_factor = 1.05  # Factor in relation to timeout_primitive related to the timeout to be applied within the asyncio.wait_for coroutine
-    timeout_ns_update = 30 * 60  # timeout for ns update
-    timeout_progress_primitive = (
-        10 * 60
-    )  # timeout for some progress in a primitive execution
-    timeout_migrate = 1800  # default global timeout for migrating vnfs
-    timeout_operate = 1800  # default global timeout for migrating vnfs
-    timeout_verticalscale = 1800  # default global timeout for Vertical Sclaing
     SUBOPERATION_STATUS_NOT_FOUND = -1
     SUBOPERATION_STATUS_NEW = -2
     SUBOPERATION_STATUS_SKIP = -3
     task_name_deploy_vca = "Deploying VCA"
 
-    def __init__(self, msg, lcm_tasks, config, loop):
+    def __init__(self, msg, lcm_tasks, config: LcmCfg, loop):
         """
         Init, Connect to database, filesystem storage, and messaging
         :param config: two level dictionary with configuration. Top level should contain 'database', 'storage',
@@ -162,10 +146,9 @@ class NsLcm(LcmBase):
         self.fs = Filesystem().instance.fs
         self.loop = loop
         self.lcm_tasks = lcm_tasks
-        self.timeout = config["timeout"]
-        self.ro_config = config["ro_config"]
-        self.ng_ro = config["ro_config"].get("ng")
-        self.vca_config = config["VCA"].copy()
+        self.timeout = config.timeout
+        self.ro_config = config.RO
+        self.vca_config = config.VCA
 
         # create N2VC connector
         self.n2vc = N2VCJujuConnector(
@@ -184,8 +167,8 @@ class NsLcm(LcmBase):
         )
 
         self.k8sclusterhelm2 = K8sHelmConnector(
-            kubectl_command=self.vca_config.get("kubectlpath"),
-            helm_command=self.vca_config.get("helmpath"),
+            kubectl_command=self.vca_config.kubectlpath,
+            helm_command=self.vca_config.helmpath,
             log=self.logger,
             on_update_db=None,
             fs=self.fs,
@@ -193,8 +176,8 @@ class NsLcm(LcmBase):
         )
 
         self.k8sclusterhelm3 = K8sHelm3Connector(
-            kubectl_command=self.vca_config.get("kubectlpath"),
-            helm_command=self.vca_config.get("helm3path"),
+            kubectl_command=self.vca_config.kubectlpath,
+            helm_command=self.vca_config.helm3path,
             fs=self.fs,
             log=self.logger,
             db=self.db,
@@ -202,8 +185,8 @@ class NsLcm(LcmBase):
         )
 
         self.k8sclusterjuju = K8sJujuConnector(
-            kubectl_command=self.vca_config.get("kubectlpath"),
-            juju_command=self.vca_config.get("jujupath"),
+            kubectl_command=self.vca_config.kubectlpath,
+            juju_command=self.vca_config.jujupath,
             log=self.logger,
             loop=self.loop,
             on_update_db=self._on_update_k8s_db,
@@ -228,7 +211,7 @@ class NsLcm(LcmBase):
         }
 
         # create RO client
-        self.RO = NgRoClient(self.loop, **self.ro_config)
+        self.RO = NgRoClient(self.loop, **self.ro_config.to_dict())
 
         self.op_status_map = {
             "instantiation": self.RO.status,
@@ -1482,9 +1465,7 @@ class NsLcm(LcmBase):
             if ns_params and ns_params.get("timeout_ns_deploy"):
                 timeout_ns_deploy = ns_params["timeout_ns_deploy"]
             else:
-                timeout_ns_deploy = self.timeout.get(
-                    "ns_deploy", self.timeout_ns_deploy
-                )
+                timeout_ns_deploy = self.timeout.ns_deploy
 
             # Check for and optionally request placement optimization. Database will be updated if placement activated
             stage[2] = "Waiting for Placement."
@@ -1674,7 +1655,7 @@ class NsLcm(LcmBase):
                     ro_vm_id = "{}-{}".format(
                         db_vnfr["member-vnf-index-ref"], target_vdu_id
                     )  # TODO add vdu_index
-                    if self.ng_ro:
+                    if self.ro_config.ng:
                         target = {
                             "action": {
                                 "action": "inject_ssh_key",
@@ -2512,9 +2493,7 @@ class NsLcm(LcmBase):
             if ns_params and ns_params.get("timeout_ns_deploy"):
                 timeout_ns_deploy = ns_params["timeout_ns_deploy"]
             else:
-                timeout_ns_deploy = self.timeout.get(
-                    "ns_deploy", self.timeout_ns_deploy
-                )
+                timeout_ns_deploy = self.timeout.ns_deploy
 
             # read from db: ns
             stage[1] = "Getting nsr={} from db.".format(nsr_id)
@@ -2615,8 +2594,8 @@ class NsLcm(LcmBase):
             # feature 1429. Add n2vc public key to needed VMs
             n2vc_key = self.n2vc.get_public_key()
             n2vc_key_list = [n2vc_key]
-            if self.vca_config.get("public_key"):
-                n2vc_key_list.append(self.vca_config["public_key"])
+            if self.vca_config.public_key:
+                n2vc_key_list.append(self.vca_config.public_key)
 
             stage[1] = "Deploying NS at VIM."
             task_ro = asyncio.ensure_future(
@@ -4275,7 +4254,7 @@ class NsLcm(LcmBase):
         try:
             await self.n2vc.delete_namespace(
                 namespace=namespace,
-                total_timeout=self.timeout_charm_delete,
+                total_timeout=self.timeout.charm_delete,
                 vca_id=vca_id,
             )
         except N2VCNotFound:  # already deleted. Skip
@@ -4490,7 +4469,7 @@ class NsLcm(LcmBase):
 
         logging_text = "Task ns={} terminate={} ".format(nsr_id, nslcmop_id)
         self.logger.debug(logging_text + "Enter")
-        timeout_ns_terminate = self.timeout_ns_terminate
+        timeout_ns_terminate = self.timeout.ns_terminate
         db_nsr = None
         db_nslcmop = None
         operation_params = None
@@ -4616,7 +4595,7 @@ class NsLcm(LcmBase):
                 error_list = await self._wait_for_tasks(
                     logging_text,
                     tasks_dict_info,
-                    min(self.timeout_charm_delete, timeout_ns_terminate),
+                    min(self.timeout.charm_delete, timeout_ns_terminate),
                     stage,
                     nslcmop_id,
                 )
@@ -4634,7 +4613,7 @@ class NsLcm(LcmBase):
                 task_delete_ee = asyncio.ensure_future(
                     asyncio.wait_for(
                         self._delete_all_N2VC(db_nsr=db_nsr, vca_id=vca_id),
-                        timeout=self.timeout_charm_delete,
+                        timeout=self.timeout.charm_delete,
                     )
                 )
                 # task_delete_ee = asyncio.ensure_future(self.n2vc.delete_namespace(namespace="." + nsr_id))
@@ -4680,7 +4659,7 @@ class NsLcm(LcmBase):
 
             # remove from RO
             stage[1] = "Deleting ns from VIM."
-            if self.ng_ro:
+            if self.ro_config.ng:
                 task_delete_ro = asyncio.ensure_future(
                     self._terminate_ng_ro(
                         logging_text, nsr_deployed, nsr_id, nslcmop_id, stage
@@ -5043,13 +5022,13 @@ class NsLcm(LcmBase):
                             ee_id=ee_id,
                             primitive_name=primitive,
                             params_dict=primitive_params,
-                            progress_timeout=self.timeout_progress_primitive,
-                            total_timeout=self.timeout_primitive,
+                            progress_timeout=self.timeout.progress_primitive,
+                            total_timeout=self.timeout.primitive,
                             db_dict=db_dict,
                             vca_id=vca_id,
                             vca_type=vca_type,
                         ),
-                        timeout=timeout or self.timeout_primitive,
+                        timeout=timeout or self.timeout.primitive,
                     )
                     # execution was OK
                     break
@@ -5157,7 +5136,7 @@ class NsLcm(LcmBase):
             primitive = db_nslcmop["operationParams"]["primitive"]
             primitive_params = db_nslcmop["operationParams"]["primitive_params"]
             timeout_ns_action = db_nslcmop["operationParams"].get(
-                "timeout_ns_action", self.timeout_primitive
+                "timeout_ns_action", self.timeout.primitive
             )
 
             if vnf_index:
@@ -5532,7 +5511,7 @@ class NsLcm(LcmBase):
             stage[2] = "Terminating VDUs"
             if scaling_info.get("vdu-delete"):
                 # scale_process = "RO"
-                if self.ro_config.get("ng"):
+                if self.ro_config.ng:
                     await self._scale_ng_ro(
                         logging_text,
                         db_nsr,
@@ -5710,7 +5689,7 @@ class NsLcm(LcmBase):
                         }
                     )
                 scaling_info["vdu-create"][vdud["id"]] = count_index
-            if self.ro_config.get("ng"):
+            if self.ro_config.ng:
                 self.logger.debug(
                     "New Resources to be deployed: {}".format(scaling_info)
                 )
@@ -5756,7 +5735,7 @@ class NsLcm(LcmBase):
                 path=path,
                 charm_id=charm_id,
                 charm_type=charm_type,
-                timeout=timeout or self.timeout_ns_update,
+                timeout=timeout or self.timeout.ns_update,
             )
 
             if output:
@@ -6949,7 +6928,7 @@ class NsLcm(LcmBase):
                                             scaling_in=True,
                                             vca_id=vca_id,
                                         ),
-                                        timeout=self.timeout_charm_delete,
+                                        timeout=self.timeout.charm_delete,
                                     )
                                 )
                                 tasks_dict_info[task] = "Terminating VCA {}".format(
@@ -6969,7 +6948,7 @@ class NsLcm(LcmBase):
                                 logging_text,
                                 tasks_dict_info,
                                 min(
-                                    self.timeout_charm_delete, self.timeout_ns_terminate
+                                    self.timeout.charm_delete, self.timeout.ns_terminate
                                 ),
                                 stage,
                                 nslcmop_id,
@@ -6991,7 +6970,7 @@ class NsLcm(LcmBase):
             # SCALE RO - BEGIN
             if scaling_info.get("vdu-create") or scaling_info.get("vdu-delete"):
                 scale_process = "RO"
-                if self.ro_config.get("ng"):
+                if self.ro_config.ng:
                     await self._scale_ng_ro(
                         logging_text, db_nsr, db_nslcmop, db_vnfr, scaling_info, stage
                     )
@@ -7286,7 +7265,7 @@ class NsLcm(LcmBase):
                 exc = await self._wait_for_tasks(
                     logging_text,
                     tasks_dict_info,
-                    self.timeout_ns_deploy,
+                    self.timeout.ns_deploy,
                     stage,
                     nslcmop_id,
                     nsr_id=nsr_id,
@@ -7401,11 +7380,11 @@ class NsLcm(LcmBase):
                                     primitive_name=terminate_config_primitive["name"],
                                     params=primitive_params_,
                                     db_dict=db_dict,
-                                    total_timeout=self.timeout_primitive,
+                                    total_timeout=self.timeout.primitive,
                                     vca_id=vca_id,
                                 ),
-                                timeout=self.timeout_primitive
-                                * self.timeout_primitive_outer_factor,
+                                timeout=self.timeout.primitive
+                                * self.timeout.primitive_outer_factor,
                             )
 
                 await asyncio.wait_for(
@@ -7413,15 +7392,15 @@ class NsLcm(LcmBase):
                         kdu_instance=kdu_instance,
                         scale=scale,
                         resource_name=kdu_scaling_info["resource-name"],
-                        total_timeout=self.timeout_scale_on_error,
+                        total_timeout=self.timeout.scale_on_error,
                         vca_id=vca_id,
                         cluster_uuid=cluster_uuid,
                         kdu_model=kdu_model,
                         atomic=True,
                         db_dict=db_dict,
                     ),
-                    timeout=self.timeout_scale_on_error
-                    * self.timeout_scale_on_error_outer_factor,
+                    timeout=self.timeout.scale_on_error
+                    * self.timeout.scale_on_error_outer_factor,
                 )
 
                 if kdu_scaling_info["type"] == "create":
@@ -7496,7 +7475,7 @@ class NsLcm(LcmBase):
             n2vc_key_list,
             stage=stage,
             start_deploy=time(),
-            timeout_ns_deploy=self.timeout_ns_deploy,
+            timeout_ns_deploy=self.timeout.ns_deploy,
         )
         if vdu_scaling_info.get("vdu-delete"):
             self.scale_vnfr(
@@ -7613,7 +7592,7 @@ class NsLcm(LcmBase):
                 action_id,
                 nslcmop_id,
                 start_deploy,
-                self.timeout_operate,
+                self.timeout.operate,
                 None,
                 "start_stop_rebuild",
             )
@@ -7705,7 +7684,7 @@ class NsLcm(LcmBase):
                 action_id,
                 nslcmop_id,
                 start_deploy,
-                self.timeout_migrate,
+                self.timeout.migrate,
                 operation="migrate",
             )
         except (ROclient.ROClientException, DbException, LcmException) as e:
@@ -7979,7 +7958,7 @@ class NsLcm(LcmBase):
                 exc = await self._wait_for_tasks(
                     logging_text,
                     tasks_dict_info,
-                    self.timeout_ns_deploy,
+                    self.timeout.ns_deploy,
                     stage,
                     nslcmop_id,
                     nsr_id=nsr_id,
@@ -8072,7 +8051,7 @@ class NsLcm(LcmBase):
             if ns_params and ns_params.get("timeout_ns_heal"):
                 timeout_ns_heal = ns_params["timeout_ns_heal"]
             else:
-                timeout_ns_heal = self.timeout.get("ns_heal", self.timeout_ns_heal)
+                timeout_ns_heal = self.timeout.ns_heal
 
             db_vims = {}
 
@@ -8559,7 +8538,7 @@ class NsLcm(LcmBase):
                 # n2vc_redesign STEP 5.1
                 # wait for RO (ip-address) Insert pub_key into VM
                 # IMPORTANT: We need do wait for RO to complete healing operation.
-                await self._wait_heal_ro(nsr_id, self.timeout_ns_heal)
+                await self._wait_heal_ro(nsr_id, self.timeout.ns_heal)
                 if vnfr_id:
                     if kdu_name:
                         rw_mgmt_ip = await self.wait_kdu_up(
@@ -8771,7 +8750,7 @@ class NsLcm(LcmBase):
                 action_id,
                 nslcmop_id,
                 start_deploy,
-                self.timeout_verticalscale,
+                self.timeout.verticalscale,
                 operation="verticalscale",
             )
         except (ROclient.ROClientException, DbException, LcmException) as e: