X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=lcm%2Fosm_lcm%2Flcm.py;h=ceabda5b80fef69b53699e4189a4e83f8b230a5a;hb=1cf93af988c854bc7ac566f6961acbedbb849a96;hp=b39efe80692d4948747caeb31f1d508f17580cac;hpb=a6eff0a68fb60108545b81215f9551097f4bfd40;p=osm%2FRO.git diff --git a/lcm/osm_lcm/lcm.py b/lcm/osm_lcm/lcm.py index b39efe80..ceabda5b 100644 --- a/lcm/osm_lcm/lcm.py +++ b/lcm/osm_lcm/lcm.py @@ -133,7 +133,7 @@ class Lcm: except DbException as e: self.logger.error("Updating nsr_id={}: {}".format(nsr_id, e)) - def n2vc_callback(self, nsd, vnfd, vnf_member_index, workload_status, *args): + def n2vc_callback(self, model_name, application_name, workload_status, db_nsr, vnf_member_index, task=None): """Update the lcm database with the status of the charm. Updates the VNF's operational status with the state of the charm: @@ -147,55 +147,59 @@ class Lcm: Updates the network service's config-status to reflect the state of all charms. """ - if workload_status and len(args) == 3: - # self.logger.debug("[n2vc_callback] Workload status \"{}\"".format(workload_status)) - try: - (db_nsr, vnf_index, task) = args - - nsr_id = db_nsr["_id"] - nsr_lcm = db_nsr["_admin"]["deploy"] - nsr_lcm["VCA"][vnf_index]['operational-status'] = workload_status - - if task: - if task.cancelled(): - return - - if task.done(): - exc = task.exception() - if exc: - nsr_lcm = db_nsr["_admin"]["deploy"] - nsr_lcm["VCA"][vnf_index]['operational-status'] = "failed" - db_nsr["detailed-status"] = "fail configuring vnf_index={} {}".format(vnf_index, exc) - db_nsr["config-status"] = "failed" - self.update_nsr_db(nsr_id, db_nsr) - else: - units = len(nsr_lcm["VCA"]) - active = 0 - statusmap = {} - for vnf_index in nsr_lcm["VCA"]: - if 'operational-status' in nsr_lcm["VCA"][vnf_index]: - - if nsr_lcm["VCA"][vnf_index]['operational-status'] not in statusmap: - # Initialize it - statusmap[nsr_lcm["VCA"][vnf_index]['operational-status']] = 0 - - statusmap[nsr_lcm["VCA"][vnf_index]['operational-status']] += 1 - - if nsr_lcm["VCA"][vnf_index]['operational-status'] == "active": - active += 1 - else: - self.logger.debug("No operational-status") - - cs = "" - for status in statusmap: - cs += "{} ({}) ".format(status, statusmap[status]) - db_nsr["config-status"] = cs - self.update_nsr_db(nsr_id, db_nsr) - except Exception as e: - # self.logger.critical("Task create_ns={} n2vc_callback Exception {}".format(nsr_id, e), exc_info=True) - self.logger.critical("Task create_ns n2vc_callback Exception {}".format(e), exc_info=True) - pass + if not workload_status and not task: + self.logger.error("Task create_ns={} n2vc_callback Enter with bad parameters") + return + + if not workload_status: + self.logger.error("Task create_ns={} n2vc_callback Enter with bad parameters, no workload_status") + return + + try: + self.logger.debug("[n2vc_callback] Workload status \"{}\"".format(workload_status)) + nsr_id = db_nsr["_id"] + nsr_lcm = db_nsr["_admin"]["deploy"] + nsr_lcm["VCA"][vnf_member_index]['operational-status'] = workload_status + + if task: + if task.cancelled(): + return + + if task.done(): + exc = task.exception() + if exc: + nsr_lcm = db_nsr["_admin"]["deploy"] + nsr_lcm["VCA"][vnf_member_index]['operational-status'] = "failed" + db_nsr["detailed-status"] = "fail configuring vnf_index={} {}".format(vnf_member_index, exc) + db_nsr["config-status"] = "failed" + self.update_nsr_db(nsr_id, db_nsr) + else: + vca_status = nsr_lcm["VCA"][vnf_member_index]['operational-status'] + + units = len(nsr_lcm["VCA"]) + active = 0 + statusmap = {} + for vnf_index in nsr_lcm["VCA"]: + if vca_status not in statusmap: + # Initialize it + statusmap[vca_status] = 0 + + statusmap[vca_status] += 1 + + if vca_status == "active": + active += 1 + + cs = "" + for status in statusmap: + cs += "{} ({}) ".format(status, statusmap[status]) + db_nsr["config-status"] = cs + self.update_nsr_db(nsr_id, db_nsr) + + except Exception as e: + # self.logger.critical("Task create_ns={} n2vc_callback Exception {}".format(nsr_id, e), exc_info=True) + self.logger.critical("Task create_ns n2vc_callback Exception {}".format(e), exc_info=True) + pass def vca_deploy_callback(self, db_nsr, vnf_index, status, task): # TODO study using this callback when VCA.DeployApplication success from VCAMonitor @@ -362,7 +366,6 @@ class Lcm: vnf_index = str(c_vnf["member-vnf-index"]) vnfd = needed_vnfd[vnfd_id] if vnfd.get("vnf-configuration") and vnfd["vnf-configuration"].get("juju"): - nsr_lcm["VCA"][vnf_index] = {} vnfd_to_config += 1 proxy_charm = vnfd["vnf-configuration"]["juju"]["charm"] @@ -376,13 +379,44 @@ class Lcm: proxy_charm ) + # Setup the runtime parameters for this VNF + params = { + 'rw_mgmt_ip': nsr_lcm['nsr_ip'][vnf_index], + } + + # ns_name will be ignored in the current version of N2VC + # but will be implemented for the next point release. + ns_name = 'default' + application_name = self.n2vc.FormatApplicationName( + 'default', + vnfd['name'], + vnf_index, + ) + + nsr_lcm["VCA"][vnf_index] = { + "model": ns_name, + "application": application_name, + "operational-status": "init", + "vnfd_id": vnfd_id, + } + self.logger.debug("Passing artifacts path '{}' for {}".format(charm_path, proxy_charm)) task = asyncio.ensure_future( - self.n2vc.DeployCharms(nsd, vnfd, vnf_index, charm_path, self.n2vc_callback, db_nsr, vnf_index, None) + self.n2vc.DeployCharms( + ns_name, # The network service name + application_name, # The application name + vnfd, # The vnf descriptor + charm_path, # Path to charm + params, # Runtime params, like mgmt ip + {}, # for native charms only + self.n2vc_callback, # Callback for status changes + db_nsr, # Callback parameter + vnf_index, # Callback parameter + None, # Callback parameter (task) + ) ) - task.add_done_callback(functools.partial(self.n2vc_callback, None, None, None, None, None, db_nsr, vnf_index)) + task.add_done_callback(functools.partial(self.n2vc_callback, None, None, None, None, db_nsr)) - # task.add_done_callback(functools.partial(self.vca_deploy_callback, db_nsr, vnf_index, None)) self.lcm_tasks[nsr_id][order_id]["create_charm:" + vnf_index] = task db_nsr["config-status"] = "configuring" if vnfd_to_config else "configured" db_nsr["detailed-status"] = "Configuring 1/{}".format(vnfd_to_config) if vnfd_to_config else "done" @@ -424,11 +458,20 @@ class Lcm: step = db_nsr["detailed-status"] = "Deleting charms" self.logger.debug(logging_text + step) for vnf_index, deploy_info in nsr_lcm["VCA"].items(): - if deploy_info and deploy_info.get("appliation"): + if deploy_info and deploy_info.get("application"): + # n2vc_callback(self, model_name, application_name, workload_status, db_nsr, vnf_member_index, task=None): + # self.n2vc.RemoveCharms(model_name, application_name, self.n2vc_callback, model_name, application_name) task = asyncio.ensure_future( - self.n2vc.RemoveCharms(nsd, vnfd, vnf_index, self.n2vc_callback, db_nsr, vnf_index, None) + self.n2vc.RemoveCharms( + deploy_info['model'], + deploy_info['application'], + self.n2vc_callback, + db_nsr, + vnf_index, + ) ) + self.lcm_tasks[nsr_id][order_id]["delete_charm:" + vnf_index] = task except Exception as e: self.logger.debug(logging_text + "Failed while deleting charms: {}".format(e))