import threading
import zerorpc
+import paramiko
+import ipaddress
+import time
+import gevent
+
logging.basicConfig(level=logging.INFO)
def __init__(self, dcs):
self.dcs = dcs
- def compute_action_start(self, dc_label, compute_name, image, command, network):
+ def compute_action_start(self, dc_label, compute_name, image, network, command):
"""
- Start a new compute instance: A docker container
+ Start a new compute instance: A docker container (note: zerorpc does not support keyword arguments)
:param dc_label: name of the DC
:param compute_name: compute container name
:param image: image name
:param command: command to execute
- :param network:
- :return: networks list({"ip": "10.0.0.254/8"}, {"ip": "11.0.0.254/24"})
+ :param network: list of all interface of the vnf, with their parameters (id=id1,ip=x.x.x.x/x),...
+ :return: networks list({"id":"input","ip": "10.0.0.254/8"}, {"id":"output","ip": "11.0.0.254/24"})
"""
# TODO what to return UUID / given name / internal name ?
logging.debug("RPC CALL: compute start")
try:
c = self.dcs.get(dc_label).startCompute(
compute_name, image=image, command=command, network=network)
- return str(c.name)
+ #return str(c.name)
+ # return docker inspect dict
+ return c.getStatus()
except Exception as ex:
logging.exception("RPC error.")
return ex.message
logging.exception("RPC error.")
return ex.message
+ @zerorpc.stream
+ def compute_profile(self, dc_label, compute_name, kwargs):
+ # note: zerorpc does not support keyword arguments
+
+ ## VIM/dummy gatekeeper's tasks:
+ # start vnf
+ vnf_status = self.compute_action_start( dc_label, compute_name,
+ kwargs.get('image'),
+ kwargs.get('network'),
+ kwargs.get('command'))
+ # start traffic source (with fixed ip addres, no use for now...)
+ psrc_status = self.compute_action_start( dc_label, 'psrc', 'profile_source', [{'id':'output'}], None)
+ # start traffic sink (with fixed ip addres)
+ psink_status = self.compute_action_start(dc_label, 'psink', 'profile_sink', [{'id': 'input'}], None)
+ # link vnf to traffic source
+ DCNetwork = self.dcs.get(dc_label).net
+ DCNetwork.setChain('psrc', compute_name,
+ vnf_src_interface='output',
+ vnf_dst_interface=kwargs.get('input'),
+ cmd='add-flow', weight=None, bidirectional=True)
+ DCNetwork.setChain('psrc', compute_name,
+ vnf_src_interface='output',
+ vnf_dst_interface=kwargs.get('input'),
+ cmd='add-flow', weight=None,
+ match='dl_type=0x0800,nw_proto=17,udp_dst=5001',
+ cookie=10)
+ DCNetwork.setChain( compute_name, 'psink',
+ vnf_src_interface='output',
+ vnf_dst_interface=kwargs.get('input'),
+ cmd='add-flow', weight=None, bidirectional=True)
+ DCNetwork.setChain(compute_name, 'psink',
+ vnf_src_interface='output',
+ vnf_dst_interface=kwargs.get('input'),
+ cmd='add-flow', weight=None,
+ match='dl_type=0x0800,nw_proto=17,udp_dst=5001',
+ cookie=11)
+
+ ## SSM/SP tasks:
+ # start traffic generation
+ '''
+ for nw in psrc_status.get('network'):
+ if nw.get('intf_name') == 'output':
+ psrc_output_ip = unicode(nw['ip'])
+ break
+ dummy_iperf_server_ip = ipaddress.IPv4Address(psrc_output_ip) + 1
+ '''
+ for nw in psink_status.get('network'):
+ if nw.get('intf_name') == 'input':
+ psink_input_ip = nw['ip']
+ break
+
+
+ # get monitor data and analyze
+ vnf_uuid = vnf_status['id']
+ psrc_mgmt_ip = psrc_status['docker_network']
+
+ # query rate
+
+ #need to wait a bit before containers are fully up?
+ time.sleep(2)
+
+ def generate():
+ for rate in [0, 1, 2, 3]:
+ #logging.info('query:{0}'.format(query_cpu))
+
+ output_line = DCNetwork.monitor_agent.profile(psrc_mgmt_ip, rate, psink_input_ip, vnf_uuid)
+ gevent.sleep(0)
+ yield output_line
+
+ # query loss
+
+
+ # create table
+
+ ## VIM/dummy gatekeeper's tasks:
+ # remove vnfs and chain
+ DCNetwork.setChain('psrc', compute_name,
+ vnf_src_interface='output',
+ vnf_dst_interface=kwargs.get('input'),
+ cmd='del-flows', weight=None, bidirectional=True)
+ DCNetwork.setChain('psrc', compute_name,
+ vnf_src_interface='output',
+ vnf_dst_interface=kwargs.get('input'),
+ cmd='del-flows', weight=None,
+ match='dl_type=0x0800,nw_proto=17,udp_dst=5001',
+ cookie=10)
+ DCNetwork.setChain(compute_name, 'psink',
+ vnf_src_interface='output',
+ vnf_dst_interface=kwargs.get('input'),
+ cmd='del-flows', weight=None, bidirectional=True)
+ DCNetwork.setChain(compute_name, 'psink',
+ vnf_src_interface='output',
+ vnf_dst_interface=kwargs.get('input'),
+ cmd='del-flows', weight=None,
+ match='dl_type=0x0800,nw_proto=17,udp_dst=5001',
+ cookie=11)
+ self.compute_action_stop(dc_label, compute_name)
+ self.compute_action_stop(dc_label, 'psink')
+ self.compute_action_stop(dc_label, 'psrc')
+
+ return generate()
+
def datacenter_list(self):
logging.debug("RPC CALL: datacenter list")
try:
except Exception as ex:
logging.exception("RPC error.")
return ex.message
+
+