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 """
+ # Make sure the values match with NetworkServiceRecordState
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
+ RUNNING = 106
+ SCALING_OUT = 107
+ SCALING_IN = 108
+ TERMINATE = 109
+ TERMINATE_RCVD = 110
+ TERMINATED = 114
+ FAILED = 115
+ VL_INSTANTIATE = 116
+ VL_TERMINATE = 117
class OpenmanoNsr(object):
@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)
+ yield from self._publisher.unpublish_vlr(None, vlr.vlr_msg)
+ yield from asyncio.sleep(1, loop=self._loop)
+
+ @asyncio.coroutine
+ def delete_vlr(self, vlr):
if vlr in self._vlrs:
self._vlrs.remove(vlr)
if not vlr.vld_msg.vim_network_name:
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
yield from self._publisher.publish_vnfr(None, vnfr_msg)
return
+ 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
+
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
# 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._cli_api = None
self._http_api = None
self._openmano_nsrs = {}
+ self._vnfr_uptime_tasks = {}
self._set_ro_account(ro_account)
ro_account.openmano.tenant_id,
)
+ def set_state(self, nsr_id, state):
+ # Currently we update only during terminate to
+ # decide how to handle VL terminate
+ if state.value == OpenmanoNSRecordState.TERMINATE.value:
+ self._openmano_nsrs[nsr_id]._state = \
+ [member.value for name, member in \
+ OpenmanoNSRecordState.__members__.items() \
+ if member.value == state.value]
+
def create_nsr(self, nsr_config_msg, nsd_msg, key_pairs=None):
"""
Create Network service record
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):
openmano_nsr = self._openmano_nsrs[nsr.id]
if openmano_nsr._state == OpenmanoNSRecordState.RUNNING:
yield from openmano_nsr.create_vlr(vlr)
+ yield from self._publisher.publish_vlr(None, vlr.vlr_msg)
else:
yield from openmano_nsr.add_vlr(vlr)
"""
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):
"""
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)
-
-
+ if openmano_nsr._state == OpenmanoNSRecordState.RUNNING:
+ yield from openmano_nsr.delete_vlr(vlr)
+ else:
+ yield from openmano_nsr.remove_vlr(vlr)