-#
+#
# Copyright 2016 RIFT.IO Inc
#
# Licensed under the Apache License, Version 2.0 (the "License");
import rift.openmano.rift2openmano as rift2openmano
import rift.openmano.openmano_client as openmano_client
from . import rwnsmplugin
+from enum import Enum
+
import rift.tasklets
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)
#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)
class OpenmanoVnfr(object):
- def __init__(self, log, loop, cli_api, vnfr):
+ def __init__(self, log, loop, cli_api, vnfr, nsd):
self._log = log
self._loop = loop
self._cli_api = cli_api
self._created = False
+ self.nsd = nsd
+
@property
def vnfd(self):
return rift2openmano.RiftVNFD(self._vnfr.vnfd)
@property
def openmano_vnfd(self):
self._log.debug("Converting vnfd %s from rift to openmano", self.vnfd.id)
- openmano_vnfd = rift2openmano.rift2openmano_vnfd(self.vnfd)
+ openmano_vnfd = rift2openmano.rift2openmano_vnfd(self.vnfd, self.nsd)
return openmano_vnfd
@property
)
+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
self._created = False
self._monitor_task = None
+ self._state = OpenmanoNSRecordState.INIT
@property
def nsd(self):
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)
self._log.debug("Cloud config formed is %s",cloud_config)
return cloud_config
-
+
@property
def openmano_instance_create_yaml(self):
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] = {}
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
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 self._publisher.publish_vlr(None, vlr.vlr_msg)
+ 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 self._publisher.unpublish_vlr(None, vlr.vlr_msg)
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)
+ vnfr = OpenmanoVnfr(self._log, self._loop, self._cli_api, vnfr, nsd=self.nsd)
yield from vnfr.create()
self._vnfrs.append(vnfr)
return vnf["ip_address"].strip()
return None
+ def get_vnf_mac_address(vnf):
+ if "mac_address" in vnf:
+ return vnf["mac_address"].strip()
+ return None
+
def get_ext_cp_info(vnf):
cp_info_list = []
for vm in vnf["vms"]:
if ip_address is None:
ip_address = "0.0.0.0"
- cp_info_list.append((intf["external_name"], ip_address))
+ mac_address = intf["mac_address"]
+ if mac_address is None:
+ mac_address="00:00:00:00:00:00"
+
+ cp_info_list.append((intf["external_name"], ip_address, mac_address))
return cp_info_list
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
# 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
if all_vms_active(vnf_status):
vnf_ip_address = get_vnf_ip_address(vnf_status)
+ vnf_mac_address = get_vnf_mac_address(vnf_status)
if vnf_ip_address is None:
self._log.warning("No IP address obtained "
self._log.debug("All VMs in VNF are active. Marking as running.")
vnfr_msg.operational_status = "running"
- self._log.debug("Got VNF ip address: %s", vnf_ip_address)
+ self._log.debug("Got VNF ip address: %s, mac-address: %s", vnf_ip_address, vnf_mac_address)
vnfr_msg.mgmt_interface.ip_address = vnf_ip_address
vnfr_msg.vnf_configuration.config_access.mgmt_ip_address = vnf_ip_address
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"]
# Add connection point information for the config manager
cp_info_list = get_ext_cp_info(vnf_status)
- for (cp_name, cp_ip) in cp_info_list:
+ for (cp_name, cp_ip, cp_mac_addr) in cp_info_list:
cp = vnfr_msg.connection_point.add()
cp.name = cp_name
cp.short_name = cp_name
cp.ip_address = cp_ip
+ cp.mac_address = cp_mac_addr
yield from self._publisher.publish_vnfr(None, vnfr_msg)
active_vnfs.append(vnfr)
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
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
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
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):
"""
self._cli_api = None
self._http_api = None
self._openmano_nsrs = {}
+ self._vnfr_uptime_tasks = {}
self._set_ro_account(ro_account)
self._log.debug("Attempting to publish openmano vnf: %s", vnfr_msg)
with self._dts.transaction() as xact:
yield from self._publisher.publish_vnfr(xact, vnfr_msg)
+ self._log.debug("Creating a task to update uptime for vnfr: %s", vnfr.id)
+ self._vnfr_uptime_tasks[vnfr.id] = self._loop.create_task(self.vnfr_uptime_update(vnfr))
+
+ def vnfr_uptime_update(self, vnfr):
+ try:
+ vnfr_ = RwVnfrYang.YangData_Vnfr_VnfrCatalog_Vnfr.from_dict({'id': vnfr.id})
+ while True:
+ vnfr_.uptime = int(time.time()) - vnfr._create_time
+ yield from self._publisher.publish_vnfr(None, vnfr_)
+ yield from asyncio.sleep(2, loop=self._loop)
+ except asyncio.CancelledError:
+ self._log.debug("Received cancellation request for vnfr_uptime_update task")
@asyncio.coroutine
def instantiate_vl(self, nsr, vlr):
"""
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):
"""
nsr_id = nsr.id
openmano_nsr = self._openmano_nsrs[nsr_id]
+
yield from openmano_nsr.terminate()
yield from openmano_nsr.delete()
"""
Terminate the network service
"""
- pass
+ if vnfr.id in self._vnfr_uptime_tasks:
+ self._vnfr_uptime_tasks[vnfr.id].cancel()
@asyncio.coroutine
def terminate_vl(self, vlr):
"""
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)
+