self.set_vnfr_at_error(db_vnfrs, str(e))
raise
+ async def wait_kdu_up(self, logging_text, nsr_id, vnfr_id, kdu_name):
+ """
+ Wait for kdu to be up, get ip address
+ :param logging_text: prefix use for logging
+ :param nsr_id:
+ :param vnfr_id:
+ :param kdu_name:
+ :return: IP address
+ """
+
+ # self.logger.debug(logging_text + "Starting wait_kdu_up")
+ nb_tries = 0
+
+ while nb_tries < 360:
+ db_vnfr = self.db.get_one("vnfrs", {"_id": vnfr_id})
+ kdur = next((x for x in get_iterable(db_vnfr, "kdur") if x.get("name") == kdu_name), None)
+ if not kdur:
+ raise LcmException("Not found vnfr_id={}, kdu_name={}".format(vnfr_id, kdu_name))
+ if kdur.get("status"):
+ if kdur["status"] in ("READY", "ENABLED"):
+ return kdur.get("ip-address")
+ else:
+ raise LcmException("target KDU={} is in error state".format(kdu_name))
+
+ await asyncio.sleep(10, loop=self.loop)
+ nb_tries += 1
+ raise LcmException("Timeout waiting KDU={} instantiated".format(kdu_name))
+
async def wait_vm_up_insert_key_ro(self, logging_text, nsr_id, vnfr_id, vdu_id, vdu_index, pub_key=None, user=None):
"""
Wait for ip addres at RO, and optionally, insert public key in virtual machine
# n2vc_redesign STEP 5.1
# wait for RO (ip-address) Insert pub_key into VM
if vnfr_id:
- rw_mgmt_ip = await self.wait_vm_up_insert_key_ro(logging_text, nsr_id, vnfr_id, vdu_id, vdu_index,
- user=user, pub_key=pub_key)
+ if kdu_name:
+ rw_mgmt_ip = await self.wait_kdu_up(logging_text, nsr_id, vnfr_id, kdu_name)
+ else:
+ rw_mgmt_ip = await self.wait_vm_up_insert_key_ro(logging_text, nsr_id, vnfr_id, vdu_id,
+ vdu_index, user=user, pub_key=pub_key)
else:
rw_mgmt_ip = None # This is for a NS configuration
db_nsr = self.db.get_one("nsrs", {"_id": nsr_id})
# for each defined NS relation, find the VCA's related
- for r in ns_relations:
+ for r in ns_relations.copy():
from_vca_ee_id = None
to_vca_ee_id = None
from_vca_endpoint = None
pass
# for each defined VNF relation, find the VCA's related
- for r in vnf_relations:
+ for r in vnf_relations.copy():
from_vca_ee_id = None
to_vca_ee_id = None
from_vca_endpoint = None
self.logger.warn(logging_text + ' ERROR adding relations: {}'.format(e))
return False
- async def _install_kdu(self, nsr_id: str, nsr_db_path: str, vnfr_data: dict, kdu_index: int, kdur: dict, kdud: dict,
+ async def _install_kdu(self, nsr_id: str, nsr_db_path: str, vnfr_data: dict, kdu_index: int, kdud: dict,
vnfd: dict, k8s_instance_info: dict, k8params: dict = None, timeout: int = 600):
try:
namespace=k8s_instance_info["namespace"])
# Obtain management service info (if exists)
+ vnfr_update_dict = {}
if services:
- vnfr_update_dict = {"kdur.{}.services".format(kdu_index): services}
+ vnfr_update_dict["kdur.{}.services".format(kdu_index)] = services
mgmt_services = [service for service in kdud.get("service", []) if service.get("mgmt-service")]
for mgmt_service in mgmt_services:
for service in services:
else:
self.logger.warn("Mgmt service name: {} not found".format(mgmt_service["name"]))
- self.update_db_2("vnfrs", vnfr_data.get("_id"), vnfr_update_dict)
+ vnfr_update_dict["kdur.{}.status".format(kdu_index)] = "READY"
+ self.update_db_2("vnfrs", vnfr_data.get("_id"), vnfr_update_dict)
kdu_config = kdud.get("kdu-configuration")
if kdu_config and kdu_config.get("initial-config-primitive") and kdu_config.get("juju") is None:
# Prepare update db with error and raise exception
try:
self.update_db_2("nsrs", nsr_id, {nsr_db_path + ".detailed-status": str(e)})
+ self.update_db_2("vnfrs", vnfr_data.get("_id"), {"kdur.{}.status".format(kdu_index): "ERROR"})
except Exception:
# ignore to keep original exception
pass
self.update_db_2("nsrs", nsr_id, db_nsr_update)
task = asyncio.ensure_future(
- self._install_kdu(nsr_id, db_path, vnfr_data, kdu_index, kdur, kdud, db_vnfds[vnfd_id],
+ self._install_kdu(nsr_id, db_path, vnfr_data, kdu_index, kdud, db_vnfds[vnfd_id],
k8s_instance_info, k8params=desc_params, timeout=600))
self.lcm_tasks.register("ns", nsr_id, nslcmop_id, "instantiate_KDU-{}".format(index), task)
task_instantiation_info[task] = "Deploying KDU {}".format(kdur["kdu-name"])
self.logger.debug(logging_text + stage[1])
# self.logger.debug("nsr_deployed: {}".format(nsr_deployed))
for vca_index, vca in enumerate(get_iterable(nsr_deployed, "VCA")):
- self.logger.debug("vca_index: {}, vca: {}".format(vca_index, vca))
config_descriptor = None
if not vca or not vca.get("ee_id"):
continue
vca.get("needed_terminate"))
# For helm we must destroy_ee. Also for native_charm, as juju_model cannot be deleted if there are
# pending native charms
- destroy_ee = "True" if vca_type in ("helm", "native_charm") else "False"
+ destroy_ee = True if vca_type in ("helm", "native_charm") else False
+ # self.logger.debug(logging_text + "vca_index: {}, ee_id: {}, vca_type: {} destroy_ee: {}".format(
+ # vca_index, vca.get("ee_id"), vca_type, destroy_ee))
task = asyncio.ensure_future(
self.destroy_N2VC(logging_text, db_nslcmop, vca, config_descriptor, vca_index,
destroy_ee, exec_terminate_primitives))
# wait for pending tasks of terminate primitives
if tasks_dict_info:
- self.logger.debug(logging_text + 'Waiting for terminate primitive pending tasks...')
+ self.logger.debug(logging_text + 'Waiting for tasks {}'.format(list(tasks_dict_info.keys())))
error_list = await self._wait_for_tasks(logging_text, tasks_dict_info,
min(self.timeout_charm_delete, timeout_ns_terminate),
stage, nslcmop_id)
+ tasks_dict_info.clear()
if error_list:
return # raise LcmException("; ".join(error_list))
- tasks_dict_info.clear()
# remove All execution environments at once
stage[0] = "Stage 3/3 delete all."