X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=rwlaunchpad%2Fplugins%2Frwnsm%2Frift%2Ftasklets%2Frwnsmtasklet%2Fopenmano_nsm.py;h=ddc4c9baeb7922ffbdfdb2c2b10a3d1f7d2f35b7;hb=6a6b7900b9569ac6dc40a7c8beeff067c2d8ae89;hp=5bf86dec6eaaf6eaf40c66a7f2e0d575226cb18b;hpb=4cde4083705f4b370ed54cfa05813630fd651945;p=osm%2FSO.git diff --git a/rwlaunchpad/plugins/rwnsm/rift/tasklets/rwnsmtasklet/openmano_nsm.py b/rwlaunchpad/plugins/rwnsm/rift/tasklets/rwnsmtasklet/openmano_nsm.py index 5bf86dec..ddc4c9ba 100644 --- a/rwlaunchpad/plugins/rwnsm/rift/tasklets/rwnsmtasklet/openmano_nsm.py +++ b/rwlaunchpad/plugins/rwnsm/rift/tasklets/rwnsmtasklet/openmano_nsm.py @@ -1,5 +1,5 @@ -# +# # Copyright 2016 RIFT.IO Inc # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -32,6 +32,8 @@ from gi.repository import ( import rift.openmano.rift2openmano as rift2openmano import rift.openmano.openmano_client as openmano_client from . import rwnsmplugin +from enum import Enum + import rift.tasklets @@ -129,7 +131,7 @@ class VnfrConsoleOperdataDtsHandler(object): vdur_console = RwVnfrYang.YangData_RwVnfr_VnfrConsole_Vnfr_Vdur() vdur_console.id = self._vdur_id vdur_console.console_url = 'none' - + xact_info.respond_xpath(rsp_code=rwdts.XactRspCode.ACK, xpath=self.vnfr_vdu_console_xpath, msg=vdur_console) @@ -137,7 +139,7 @@ class VnfrConsoleOperdataDtsHandler(object): #raise VnfRecordError("Not supported operation %s" % action) self._log.error("Not supported operation %s" % action) xact_info.respond_xpath(rsp_code=rwdts.XactRspCode.ACK) - return + return self._log.debug("Registering for VNFR VDU using xpath: %s", self.vnfr_vdu_console_xpath) @@ -238,8 +240,23 @@ class OpenmanoVnfr(object): ) +class OpenmanoNSRecordState(Enum): + """ Network Service Record State """ + INIT = 101 + INSTANTIATION_PENDING = 102 + RUNNING = 103 + SCALING_OUT = 104 + SCALING_IN = 105 + TERMINATE = 106 + TERMINATE_RCVD = 107 + TERMINATED = 108 + FAILED = 109 + VL_INSTANTIATE = 110 + VL_TERMINATE = 111 + + class OpenmanoNsr(object): - TIMEOUT_SECS = 120 + TIMEOUT_SECS = 300 def __init__(self, dts, log, loop, publisher, cli_api, http_api, nsd_msg, nsr_config_msg,key_pairs): self._dts = dts @@ -265,6 +282,7 @@ class OpenmanoNsr(object): self._created = False self._monitor_task = None + self._state = OpenmanoNSRecordState.INIT @property def nsd(self): @@ -300,23 +318,24 @@ class OpenmanoNsr(object): self._log.debug("Key pair NSD is %s",authorized_key) key_pairs.append(authorized_key.key) - if key_pairs: - cloud_config["key-pairs"] = key_pairs - + if key_pairs: + cloud_config["key-pairs"] = key_pairs + users = list() for user_entry in self._nsr_config_msg.user: self._log.debug("User present is %s",user_entry) user = {} - user["name"] = user_entry.name + user["name"] = user_entry.name user["key-pairs"] = list() - for ssh_key in user_entry.key_pair: - user["key-pairs"].append(ssh_key.key) + for ssh_key in user_entry.ssh_authorized_key: + if ssh_key.key_pair_ref in self._key_pairs: + user["key-pairs"].append(self._key_pairs[ssh_key.key_pair_ref].key) users.append(user) for user_entry in self._nsd_msg.user: self._log.debug("User present in NSD is %s",user_entry) user = {} - user["name"] = user_entry.name + user["name"] = user_entry.name user["key-pairs"] = list() for ssh_key in user_entry.key_pair: user["key-pairs"].append(ssh_key.key) @@ -327,7 +346,7 @@ class OpenmanoNsr(object): self._log.debug("Cloud config formed is %s",cloud_config) return cloud_config - + @property def openmano_instance_create_yaml(self): @@ -346,7 +365,7 @@ class OpenmanoNsr(object): for vnfr in self._vnfrs: if "om_datacenter" in vnfr.vnfr.vnfr_msg: vnfr_name = vnfr.vnfr.vnfd.name + "__" + str(vnfr.vnfr.vnfr_msg.member_vnf_index_ref) - openmano_instance_create["vnfs"][vnfr_name] = {"datacenter": vnfr.vnfr.vnfr_msg.om_datacenter} + openmano_instance_create["vnfs"][vnfr_name] = {"datacenter": vnfr.vnfr.vnfr_msg.om_datacenter} openmano_instance_create["networks"] = {} for vld_msg in self._nsd_msg.vld: openmano_instance_create["networks"][vld_msg.name] = {} @@ -371,7 +390,7 @@ class OpenmanoNsr(object): if ip_profile_params.has_field('gateway_address'): ip_profile['gateway-address'] = ip_profile_params.gateway_address if ip_profile_params.has_field('dns_server') and len(ip_profile_params.dns_server) > 0: - ip_profile['dns-address'] = ip_profile_params.dns_server[0] + ip_profile['dns-address'] = ip_profile_params.dns_server[0].address if ip_profile_params.has_field('dhcp_params'): ip_profile['dhcp'] = {} ip_profile['dhcp']['enabled'] = ip_profile_params.dhcp_params.enabled @@ -386,18 +405,29 @@ class OpenmanoNsr(object): elif "datacenter" in openmano_instance_create: network["datacenter"] = openmano_instance_create["datacenter"] if network: - openmano_instance_create["networks"][vld_msg.name]["sites"].append(network) + openmano_instance_create["networks"][vld_msg.name]["sites"].append(network) if ip_profile: - openmano_instance_create["networks"][vld_msg.name]['ip-profile'] = ip_profile - - - return yaml.safe_dump(openmano_instance_create, default_flow_style=False) + openmano_instance_create["networks"][vld_msg.name]['ip-profile'] = ip_profile + + return yaml.safe_dump(openmano_instance_create, default_flow_style=False,width=1000) @asyncio.coroutine def add_vlr(self, vlr): self._vlrs.append(vlr) yield from asyncio.sleep(1, loop=self._loop) + @asyncio.coroutine + def remove_vlr(self, vlr): + if vlr in self._vlrs: + self._vlrs.remove(vlr) + if not vlr.vld_msg.vim_network_name: + yield from self._loop.run_in_executor( + None, + self._cli_api.ns_vim_network_delete, + vlr.name, + vlr.om_datacenter_name) + yield from asyncio.sleep(1, loop=self._loop) + @asyncio.coroutine def add_vnfr(self, vnfr): vnfr = OpenmanoVnfr(self._log, self._loop, self._cli_api, vnfr) @@ -566,6 +596,7 @@ class OpenmanoNsr(object): self._log.debug("Found VNF status: %s", vnf_status) if vnf_status is None: self._log.error("Could not find VNF status from openmano") + self._state = OpenmanoNSRecordState.FAILED vnfr_msg.operational_status = "failed" yield from self._publisher.publish_vnfr(None, vnfr_msg) return @@ -573,6 +604,7 @@ class OpenmanoNsr(object): # If there was a VNF that has a errored VM, then just fail the VNF and stop monitoring. if any_vms_error(vnf_status): self._log.debug("VM was found to be in error state. Marking as failed.") + self._state = OpenmanoNSRecordState.FAILED vnfr_msg.operational_status = "failed" yield from self._publisher.publish_vnfr(None, vnfr_msg) return @@ -596,11 +628,11 @@ class OpenmanoNsr(object): for vm in vnf_status["vms"]: if vm["uuid"] not in self._vdur_console_handler: - vdur_console_handler = VnfrConsoleOperdataDtsHandler(self._dts, self._log, self._loop, + vdur_console_handler = VnfrConsoleOperdataDtsHandler(self._dts, self._log, self._loop, self, vnfr_msg.id,vm["uuid"],vm["name"]) yield from vdur_console_handler.register() self._vdur_console_handler[vm["uuid"]] = vdur_console_handler - + vdur_msg = vnfr_msg.vdur.add() vdur_msg.vim_id = vm["vim_vm_id"] vdur_msg.id = vm["uuid"] @@ -618,17 +650,20 @@ class OpenmanoNsr(object): if (time.time() - start_time) > OpenmanoNsr.TIMEOUT_SECS: self._log.error("NSR timed out before reaching running state") + self._state = OpenmanoNSRecordState.FAILED vnfr_msg.operational_status = "failed" yield from self._publisher.publish_vnfr(None, vnfr_msg) return except Exception as e: vnfr_msg.operational_status = "failed" + self._state = OpenmanoNSRecordState.FAILED yield from self._publisher.publish_vnfr(None, vnfr_msg) self._log.exception("Caught exception publishing vnfr info: %s", str(e)) return if len(active_vnfs) == len(self._vnfrs): + self._state = OpenmanoNSRecordState.RUNNING self._log.info("All VNF's are active. Exiting NSR monitoring task") return @@ -660,6 +695,7 @@ class OpenmanoNsr(object): self._cli_api.ns_instance_scenario_create, self.openmano_instance_create_yaml) + self._state = OpenmanoNSRecordState.INSTANTIATION_PENDING self._monitor_task = asyncio.ensure_future( self.instance_monitor_task(), loop=self._loop @@ -670,7 +706,7 @@ class OpenmanoNsr(object): for _,handler in self._vdur_console_handler.items(): handler._regh.deregister() - + if self._nsr_uuid is None: self._log.warning("Cannot terminate an un-instantiated nsr") return @@ -686,6 +722,50 @@ class OpenmanoNsr(object): self._nsr_uuid, ) + @asyncio.coroutine + def create_vlr(self,vlr): + self._log.debug("Creating openmano vim network VLR name %s, VLR DC: %s",vlr.vld_msg.name, + vlr.om_datacenter_name) + net_create = {} + net = {} + net['name'] = vlr.name + net['shared'] = True + net['type'] = 'bridge' + self._log.debug("Received ip profile is %s",vlr._ip_profile) + if vlr._ip_profile and vlr._ip_profile.has_field("ip_profile_params"): + ip_profile_params = vlr._ip_profile.ip_profile_params + ip_profile = {} + if ip_profile_params.ip_version == "ipv6": + ip_profile['ip_version'] = "IPv6" + else: + ip_profile['ip_version'] = "IPv4" + if ip_profile_params.has_field('subnet_address'): + ip_profile['subnet_address'] = ip_profile_params.subnet_address + if ip_profile_params.has_field('gateway_address'): + ip_profile['gateway_address'] = ip_profile_params.gateway_address + if ip_profile_params.has_field('dns_server') and len(ip_profile_params.dns_server) > 0: + ip_profile['dns_address'] = ip_profile_params.dns_server[0].address + if ip_profile_params.has_field('dhcp_params'): + ip_profile['dhcp_enabled'] = ip_profile_params.dhcp_params.enabled + ip_profile['dhcp_start_address'] = ip_profile_params.dhcp_params.start_address + ip_profile['dhcp_count'] = ip_profile_params.dhcp_params.count + net['ip_profile'] = ip_profile + net_create["network"]= net + + net_create_msg = yaml.safe_dump(net_create,default_flow_style=False) + fpath = dump_openmano_descriptor( + "{}_vim_net_create_{}".format(self._nsr_config_msg.name,vlr.name), + net_create_msg) + self._log.debug("Dumped Openmano VIM Net create to: %s", fpath) + + vim_network_uuid = yield from self._loop.run_in_executor( + None, + self._cli_api.ns_vim_network_create, + net_create_msg, + vlr.om_datacenter_name) + self._vlrs.append(vlr) + + class OpenmanoNsPlugin(rwnsmplugin.NsmPluginBase): """ @@ -774,7 +854,10 @@ class OpenmanoNsPlugin(rwnsmplugin.NsmPluginBase): """ self._log.debug("Received instantiate VL for NSR {}; VLR {}".format(nsr.id,vlr)) openmano_nsr = self._openmano_nsrs[nsr.id] - yield from openmano_nsr.add_vlr(vlr) + if openmano_nsr._state == OpenmanoNSRecordState.RUNNING: + yield from openmano_nsr.create_vlr(vlr) + else: + yield from openmano_nsr.add_vlr(vlr) @asyncio.coroutine def terminate_ns(self, nsr): @@ -805,5 +888,8 @@ class OpenmanoNsPlugin(rwnsmplugin.NsmPluginBase): """ Terminate the virtual link """ - pass + self._log.debug("Received terminate VL for VLR {}".format(vlr)) + openmano_nsr = self._openmano_nsrs[vlr._nsr_id] + yield from openmano_nsr.remove_vlr(vlr) +