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=None, command=None):
"""
Start a new compute instance: A docker container
:param dc_label: name of the DC
def __init__(self, net):
self.net = net
- def network_action_start(self, vnf_src_name, vnf_dst_name, vnf_src_interface=None, vnf_dst_interface=None):
+ def network_action_start(self, vnf_src_name, vnf_dst_name, vnf_src_interface=None, vnf_dst_interface=None, weight=None):
# call DCNetwork method, not really datacenter specific API for now...
# provided dc name needs to be part of API endpoint
# no check if vnfs are really connected to this datacenter...
logging.debug("RPC CALL: network chain start")
try:
c = self.net.setChain(
- vnf_src_name, vnf_dst_name, vnf_src_interface, vnf_dst_interface)
+ vnf_src_name, vnf_dst_name, vnf_src_interface, vnf_dst_interface, weight=weight)
return str(c)
except Exception as ex:
logging.exception("RPC error.")
return ex.message
- def network_action_stop(self, vnf_src_name, vnf_dst_name, vnf_src_interface=None, vnf_dst_interface=None):
+ def network_action_stop(self, vnf_src_name, vnf_dst_name, vnf_src_interface=None, vnf_dst_interface=None, weight=None):
# call DCNetwork method, not really datacenter specific API for now...
# provided dc name needs to be part of API endpoint
# no check if vnfs are really connected to this datacenter...
logging.debug("RPC CALL: network chain stop")
try:
c = self.net.setChain(
- vnf_src_name, vnf_dst_name, vnf_src_interface, vnf_dst_interface, cmd='del-flows')
+ vnf_src_name, vnf_dst_name, vnf_src_interface, vnf_dst_interface, cmd='del-flows', weight=weight)
return c
except Exception as ex:
logging.exception("RPC error.")
args.get("datacenter"),
args.get("name"),
args.get("image"),
- args.get("docker_command"),
- nw_list)
+ network=nw_list,
+ command=args.get("docker_command")
+ )
pp.pprint(r)
def stop(self, args):
vnf_src_interface = self._parse_vnf_interface(args.get("source"))\r
vnf_dst_name = self._parse_vnf_name(args.get("destination"))\r
vnf_dst_interface = self._parse_vnf_interface(args.get("destination"))\r
+ weight = args.get("weight")\r
r = self.c.network_action_start(\r
#args.get("datacenter"),\r
vnf_src_name,\r
vnf_dst_name,\r
vnf_src_interface,\r
- vnf_dst_interface)\r
+ vnf_dst_interface,\r
+ weight=weight)\r
pp.pprint(r)\r
\r
def remove(self, args):\r
vnf_src_interface = self._parse_vnf_interface(args.get("source"))\r
vnf_dst_name = self._parse_vnf_name(args.get("destination"))\r
vnf_dst_interface = self._parse_vnf_interface(args.get("destination"))\r
+ weight = args.get("weight")\r
r = self.c.network_action_stop(\r
#args.get("datacenter"),\r
vnf_src_name,\r
vnf_dst_name,\r
vnf_src_interface,\r
- vnf_dst_interface)\r
+ vnf_dst_interface,\r
+ weight=weight)\r
pp.pprint(r)\r
\r
def _parse_vnf_name(self, vnf_name_str):\r
parser.add_argument(\r
"--destination", "-dst", dest="destination",\r
help="vnf name of the destination of the chain")\r
+parser.add_argument(\r
+ "--weight", "-w", dest="weight",\r
+ help="weight metric to calculate the path")\r
\r
def main(argv):\r
args = vars(parser.parse_args(argv))\r
import time
from subprocess import Popen
import os
+import re
+
+
from mininet.net import Dockernet
from mininet.node import Controller, DefaultController, OVSSwitch, OVSKernelSwitch, Docker, RemoteController
if "id" in params["params2"]:
node2_port_id = params["params2"]["id"]
+
+
# add edge and assigned port number to graph in both directions between node1 and node2
# port_id: id given in descriptor (if available, otherwise same as port)
# port: portnumber assigned by Dockernet
- self.DCNetwork_graph.add_edge(node1.name, node2.name,
- attr_dict={'src_port_id': node1_port_id, 'src_port': node1.ports[link.intf1],
- 'dst_port_id': node2_port_id, 'dst_port': node2.ports[link.intf2]})
- self.DCNetwork_graph.add_edge(node2.name, node1.name,
- attr_dict={'src_port_id': node2_port_id, 'src_port': node2.ports[link.intf2],
- 'dst_port_id': node1_port_id, 'dst_port': node1.ports[link.intf1]})
+ attr_dict = {}
+ # possible weight metrics allowed by TClink class:
+ weight_metrics = ['bw', 'delay', 'jitter', 'loss']
+ edge_attributes = [p for p in params if p in weight_metrics]
+ for attr in edge_attributes:
+ # if delay: strip ms (need number as weight in graph)
+ match = re.search('([0-9]*\.?[0-9]+)', params[attr])
+ if match:
+ attr_number = match.group(1)
+ else:
+ attr_number = None
+ attr_dict[attr] = attr_number
+
+
+ attr_dict2 = {'src_port_id': node1_port_id, 'src_port': node1.ports[link.intf1],
+ 'dst_port_id': node2_port_id, 'dst_port': node2.ports[link.intf2]}
+ attr_dict2.update(attr_dict)
+ self.DCNetwork_graph.add_edge(node1.name, node2.name, attr_dict=attr_dict2)
+
+ attr_dict2 = {'src_port_id': node2_port_id, 'src_port': node2.ports[link.intf2],
+ 'dst_port_id': node1_port_id, 'dst_port': node1.ports[link.intf1]}
+ attr_dict2.update(attr_dict)
+ self.DCNetwork_graph.add_edge(node2.name, node1.name, attr_dict=attr_dict2)
return link
CLI(self)
# to remove chain do setChain( src, dst, cmd='del-flows')
- def setChain(self, vnf_src_name, vnf_dst_name, vnf_src_interface=None, vnf_dst_interface=None, cmd='add-flow'):
+ def setChain(self, vnf_src_name, vnf_dst_name, vnf_src_interface=None, vnf_dst_interface=None, cmd='add-flow', weight=None):
#check if port is specified (vnf:port)
if vnf_src_interface is None:
# get shortest path
#path = nx.shortest_path(self.DCNetwork_graph, vnf_src_name, vnf_dst_name)
try:
- path = nx.shortest_path(self.DCNetwork_graph, src_sw, dst_sw)
+ path = nx.shortest_path(self.DCNetwork_graph, src_sw, dst_sw, weight=weight)
except:
logging.info("No path could be found between {0} and {1}".format(vnf_src_name, vnf_dst_name))
return "No path could be found between {0} and {1}".format(vnf_src_name, vnf_dst_name)
to define you topology.
These links can use Mininet's features to limit bw, add delay or jitter.
"""
- net.addLink(dc1, dc2)
- net.addLink("datacenter1", s1)
+ net.addLink(dc1, dc2, delay="10ms")
+ net.addLink("datacenter1", s1, delay="20ms")
net.addLink(s1, dc3)
net.addLink(s1, "datacenter4")