X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=emuvim%2Fdcemulator%2Fnet.py;h=20ab33a72b2d25fd49ad0d7c827ed67cb83f6230;hb=a38de012a7a59661484805036eb9cce3c5cddf16;hp=8379cd3841f248fb71cfc9b73ddcec8e14c698c5;hpb=c5a536a1796846be97e5ba6ce9c20d73b6fd0052;p=osm%2Fvim-emu.git diff --git a/emuvim/dcemulator/net.py b/emuvim/dcemulator/net.py index 8379cd3..20ab33a 100755 --- a/emuvim/dcemulator/net.py +++ b/emuvim/dcemulator/net.py @@ -4,10 +4,14 @@ Distributed Cloud Emulator (dcemulator) """ import logging +import site +from subprocess import Popen +import os + from mininet.net import Dockernet -from mininet.node import Controller, OVSKernelSwitch, Switch, Docker, Host +from mininet.node import Controller, OVSSwitch, OVSKernelSwitch, Switch, Docker, Host, RemoteController from mininet.cli import CLI -from mininet.log import setLogLevel, info +from mininet.log import setLogLevel, info, debug from mininet.link import TCLink, Link import networkx as nx from monitoring import DCNetworkMonitor @@ -27,9 +31,11 @@ class DCNetwork(Dockernet): self.dcs = {} # create a Mininet/Dockernet network # call original Docker.__init__ and setup default controller + #Dockernet.__init__( + # self, controller=RemoteController, switch=OVSKernelSwitch, **kwargs) Dockernet.__init__( self, controller=RemoteController, switch=OVSKernelSwitch, **kwargs) - #self.addController('c0') + self.addController('c0', controller=RemoteController) # graph of the complete DC network self.DCNetwork_graph=nx.DiGraph() @@ -37,6 +43,9 @@ class DCNetwork(Dockernet): # monitoring agent self.monitor_agent = DCNetworkMonitor(self) + # start Ryu controller + self.startRyu() + def addDatacenter(self, label, metadata={}): """ @@ -97,15 +106,15 @@ class DCNetwork(Dockernet): """ Wrapper for addDocker method to use custom container class. """ - self.DCNetwork_graph.add_node(name) - return Dockernet.addDocker(self, name, cls=EmulatorCompute, **params) + self.DCNetwork_graph.add_node(label) + return Dockernet.addDocker(self, label, cls=EmulatorCompute, **params) - def removeDocker( self, name, **params ): + def removeDocker( self, label, **params ): """ Wrapper for removeDocker method to update graph. """ - self.DCNetwork_graph.remove_node(name) - return Dockernet.removeDocker(self, name, **params) + self.DCNetwork_graph.remove_node(label) + return Dockernet.removeDocker(self, label, **params) def addSwitch( self, name, add_to_graph=True, **params ): """ @@ -131,6 +140,9 @@ class DCNetwork(Dockernet): Dockernet.start(self) def stop(self): + # stop Ryu controller + self.ryu_process.terminate() + #self.ryu_process.kill() Dockernet.stop(self) def CLI(self): @@ -148,10 +160,10 @@ class DCNetwork(Dockernet): next_node = self.getNodeByName(next_hop) if next_hop == vnf_dst_name: - return 0 + return "path added between {0} and {1}".format(vnf_src_name, vnf_dst_name) elif not isinstance( next_node, OVSSwitch ): - logging.info("Next node: {0} is not a switch".format(next_hop1)) - return 0 + logging.info("Next node: {0} is not a switch".format(next_hop)) + return "Next node: {0} is not a switch".format(next_hop) switch_inport = self.DCNetwork_graph[current_hop][next_hop]['dst_port'] @@ -177,4 +189,18 @@ class DCNetwork(Dockernet): current_hop = next_hop - return 1 \ No newline at end of file + return "destination node: {0} not reached".format(vnf_dst_name) + + # start Ryu Openflow controller as Remote Controller for the DCNetwork + def startRyu(self): + # start Ryu controller with rest-API + python_install_path = site.getsitepackages()[0] + ryu_path = python_install_path + '/ryu/app/simple_switch_13.py' + ryu_path2 = python_install_path + '/ryu/app/ofctl_rest.py' + # change the default Openflow controller port to 6653 (official IANA-assigned port number), as used by Mininet + # Ryu still uses 6633 as default + ryu_option = '--ofp-tcp-listen-port' + ryu_of_port = '6653' + ryu_cmd = 'ryu-manager' + FNULL = open(os.devnull, 'w') + self.ryu_process = Popen([ryu_cmd, ryu_path, ryu_path2, ryu_option, ryu_of_port], stdout=FNULL, stderr=FNULL) \ No newline at end of file