X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=osm_lcm%2Fns.py;h=8470086716f7206066b202a6f040c6d269ebc8c4;hb=055a7ea2e17bb27691210a73a6ab15d90d89c5f0;hp=763d2390acf8fbae9b780dd06a7b4882ce53db20;hpb=3149f26911d1c239f674d5918f67ae802b0e671c;p=osm%2FLCM.git diff --git a/osm_lcm/ns.py b/osm_lcm/ns.py index 763d239..8470086 100644 --- a/osm_lcm/ns.py +++ b/osm_lcm/ns.py @@ -26,11 +26,13 @@ from jinja2 import Environment, Template, meta, TemplateError, TemplateNotFound, from osm_lcm import ROclient from osm_lcm.lcm_utils import LcmException, LcmExceptionNoMgmtIP, LcmBase, deep_get from n2vc.k8s_helm_conn import K8sHelmConnector +from n2vc.k8s_juju_conn import K8sJujuConnector from osm_common.dbbase import DbException from osm_common.fsbase import FsException from n2vc.n2vc_juju_conn import N2VCJujuConnector +from n2vc.exceptions import N2VCException from copy import copy, deepcopy from http import HTTPStatus @@ -125,6 +127,15 @@ class NsLcm(LcmBase): on_update_db=None, ) + self.k8sclusterjuju = 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, + ) + # create RO client self.RO = ROclient.ROClient(self.loop, **self.ro_config) @@ -979,7 +990,7 @@ class NsLcm(LcmBase): namespace += ".{}-{}".format(vdu_id, vdu_index or 0) # Get artifact path - artifact_path = "/{}/{}/charms/{}".format( + artifact_path = "{}/{}/charms/{}".format( base_folder["folder"], base_folder["pkg-dir"], config_descriptor["juju"]["charm"] @@ -1145,6 +1156,7 @@ class NsLcm(LcmBase): db_vnfrs = {} # vnf's info indexed by member-index # n2vc_info = {} task_instantiation_list = [] + task_instantiation_info = {} # from task to info text exc = None try: # wait for any previous tasks in process @@ -1227,6 +1239,7 @@ class NsLcm(LcmBase): ) ) self.lcm_tasks.register("ns", nsr_id, nslcmop_id, "instantiate_KDUs", task_kdu) + task_instantiation_info[task_kdu] = "Deploy KDUs" task_instantiation_list.append(task_kdu) # n2vc_redesign STEP 1 Get VCA public ssh-key # feature 1429. Add n2vc public key to needed VMs @@ -1249,6 +1262,7 @@ class NsLcm(LcmBase): ) ) self.lcm_tasks.register("ns", nsr_id, nslcmop_id, "instantiate_RO", task_ro) + task_instantiation_info[task_ro] = "Deploy at VIM" task_instantiation_list.append(task_ro) # n2vc_redesign STEP 3 to 6 Deploy N2VC @@ -1291,7 +1305,8 @@ class NsLcm(LcmBase): deploy_params=deploy_params, descriptor_config=descriptor_config, base_folder=base_folder, - task_instantiation_list=task_instantiation_list + task_instantiation_list=task_instantiation_list, + task_instantiation_info=task_instantiation_info ) # Deploy charms for each VDU that supports one. @@ -1332,7 +1347,8 @@ class NsLcm(LcmBase): deploy_params=deploy_params_vdu, descriptor_config=descriptor_config, base_folder=base_folder, - task_instantiation_list=task_instantiation_list + task_instantiation_list=task_instantiation_list, + task_instantiation_info=task_instantiation_info ) for kdud in get_iterable(vnfd, 'kdu'): kdu_name = kdud["name"] @@ -1367,7 +1383,8 @@ class NsLcm(LcmBase): deploy_params=deploy_params, descriptor_config=descriptor_config, base_folder=base_folder, - task_instantiation_list=task_instantiation_list + task_instantiation_list=task_instantiation_list, + task_instantiation_info=task_instantiation_info ) # Check if this NS has a charm configuration @@ -1402,33 +1419,35 @@ class NsLcm(LcmBase): deploy_params=deploy_params, descriptor_config=descriptor_config, base_folder=base_folder, - task_instantiation_list=task_instantiation_list + task_instantiation_list=task_instantiation_list, + task_instantiation_info=task_instantiation_info ) # Wait until all tasks of "task_instantiation_list" have been finished # while time() <= start_deploy + self.total_deploy_timeout: - error_text = None + error_text_list = [] timeout = 3600 # time() - start_deploy - task_instantiation_set = set(task_instantiation_list) # build a set with tasks - done = None - pending = None - if len(task_instantiation_set) > 0: - done, pending = await asyncio.wait(task_instantiation_set, timeout=timeout) - if pending: - error_text = "timeout" - for task in done: - if task.cancelled(): - if not error_text: - error_text = "cancelled" - elif task.done(): - exc = task.exception() - if exc: - error_text = str(exc) + if task_instantiation_list: + done, pending = await asyncio.wait(task_instantiation_list, timeout=timeout) + if pending: + for task in pending: + error_text_list.append(task_instantiation_info[task] + ": Timeout") + for task in done: + if task.cancelled(): + error_text_list.append(task_instantiation_info[task] + ": Cancelled") + elif task.done(): + exc = task.exception() + if exc: + if isinstance(exc, (N2VCException, ROclient.ROClientException)): + error_text_list.append(task_instantiation_info[task] + ": {}".format(exc)) + else: + error_text_list.append(task_instantiation_info[task] + ": " + "". + join(traceback.format_exception(None, exc, exc.__traceback__))) - if error_text: + if error_text_list: + error_text = "\n".join(error_text_list) db_nsr_update["config-status"] = "failed" - error_text = "fail configuring " + error_text db_nsr_update["detailed-status"] = error_text db_nslcmop_update["operationState"] = nslcmop_operation_state = "FAILED_TEMP" db_nslcmop_update["detailed-status"] = error_text @@ -1551,8 +1570,10 @@ class NsLcm(LcmBase): params=desc_params, db_dict=db_dict, timeout=3600) ) else: - # TODO juju-bundle connector in place - pass + task = self.k8sclusterjuju.install(cluster_uuid=cluster_uuid, kdu_model=kdumodel, + atomic=True, params=desc_params, + db_dict=db_dict, timeout=600) + pending_tasks[task] = "_admin.deployed.K8s.{}.".format(index) index += 1 if not pending_tasks: @@ -1583,7 +1604,7 @@ class NsLcm(LcmBase): def _deploy_n2vc(self, logging_text, db_nsr, db_vnfr, nslcmop_id, nsr_id, nsi_id, vnfd_id, vdu_id, kdu_name, member_vnf_index, vdu_index, vdu_name, deploy_params, descriptor_config, - base_folder, task_instantiation_list): + base_folder, task_instantiation_list, task_instantiation_info): # launch instantiate_N2VC in a asyncio task and register task object # Look where information of this charm is at database ._admin.deployed.VCA # if not found, create one entry and update database @@ -1632,6 +1653,7 @@ class NsLcm(LcmBase): ) ) self.lcm_tasks.register("ns", nsr_id, nslcmop_id, "instantiate_N2VC-{}".format(vca_index), task_n2vc) + task_instantiation_info[task_n2vc] = "Deploy VCA {}.{}".format(member_vnf_index or "", vdu_id or "") task_instantiation_list.append(task_n2vc) # Check if this VNFD has a configured terminate action @@ -1995,8 +2017,9 @@ class NsLcm(LcmBase): self.k8sclusterhelm.uninstall(cluster_uuid=kdu.get("k8scluster-uuid"), kdu_instance=kdu_instance)) elif kdu.get("k8scluster-type") == "juju": - # TODO Juju connector needed - continue + task_delete_kdu_instance = asyncio.ensure_future( + self.k8sclusterjuju.uninstall(cluster_uuid=kdu.get("k8scluster-uuid"), + kdu_instance=kdu_instance)) else: self.error(logging_text + "Unknown k8s deployment type {}". format(kdu.get("k8scluster-type"))) @@ -2377,8 +2400,12 @@ class NsLcm(LcmBase): params=desc_params, db_dict=db_dict, timeout=300) elif kdu.get("k8scluster-type") == "juju": - # TODO Juju connector needed - pass + output = await self.k8sclusterjuju.upgrade(cluster_uuid=kdu.get("k8scluster-uuid"), + kdu_instance=kdu.get("kdu-instance"), + atomic=True, kdu_model=kdu_model, + params=desc_params, db_dict=db_dict, + timeout=300) + else: msg = "k8scluster-type not defined" raise LcmException(msg) @@ -2391,8 +2418,9 @@ class NsLcm(LcmBase): kdu_instance=kdu.get("kdu-instance"), db_dict=db_dict) elif kdu.get("k8scluster-type") == "juju": - # TODO Juju connector needed - pass + output = await self.k8sclusterjuju.rollback(cluster_uuid=kdu.get("k8scluster-uuid"), + kdu_instance=kdu.get("kdu-instance"), + db_dict=db_dict) else: msg = "k8scluster-type not defined" raise LcmException(msg) @@ -2402,8 +2430,8 @@ class NsLcm(LcmBase): output = await self.k8sclusterhelm.status_kdu(cluster_uuid=kdu.get("k8scluster-uuid"), kdu_instance=kdu.get("kdu-instance")) elif kdu.get("k8scluster-type") == "juju": - # TODO Juju connector needed - pass + output = await self.k8sclusterjuju.status_kdu(cluster_uuid=kdu.get("k8scluster-uuid"), + kdu_instance=kdu.get("kdu-instance")) else: msg = "k8scluster-type not defined" raise LcmException(msg)