Merge pull request #30 from cgeoffroy/pr-fix_list_remove_dockernet_cont
[osm/vim-emu.git] / emuvim / dcemulator / net.py
index 4bf9224..20ab33a 100755 (executable)
@@ -4,6 +4,10 @@ Distributed Cloud Emulator (dcemulator)
 """
 import logging
 
 """
 import logging
 
+import site
+from subprocess import Popen
+import os
+
 from mininet.net import Dockernet
 from mininet.node import Controller, OVSSwitch, OVSKernelSwitch, Switch, Docker, Host, RemoteController
 from mininet.cli import CLI
 from mininet.net import Dockernet
 from mininet.node import Controller, OVSSwitch, OVSKernelSwitch, Switch, Docker, Host, RemoteController
 from mininet.cli import CLI
@@ -27,9 +31,11 @@ class DCNetwork(Dockernet):
         self.dcs = {}
         # create a Mininet/Dockernet network
         # call original Docker.__init__ and setup default controller
         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)
         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()
 
         # 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)
 
         # monitoring agent
         self.monitor_agent = DCNetworkMonitor(self)
 
+        # start Ryu controller
+        self.startRyu()
+
 
     def addDatacenter(self, label, metadata={}):
         """
 
     def addDatacenter(self, label, metadata={}):
         """
@@ -97,15 +106,15 @@ class DCNetwork(Dockernet):
         """
         Wrapper for addDocker method to use custom container class.
         """
         """
         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.
         """
         """
         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 ):
         """
 
     def addSwitch( self, name, add_to_graph=True, **params ):
         """
@@ -131,6 +140,9 @@ class DCNetwork(Dockernet):
         Dockernet.start(self)
 
     def stop(self):
         Dockernet.start(self)
 
     def stop(self):
+        # stop Ryu controller
+        self.ryu_process.terminate()
+        #self.ryu_process.kill()
         Dockernet.stop(self)
 
     def CLI(self):
         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:
             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 ):
             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']
 
 
             switch_inport = self.DCNetwork_graph[current_hop][next_hop]['dst_port']
@@ -177,4 +189,18 @@ class DCNetwork(Dockernet):
 
             current_hop = next_hop
 
 
             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