fix unit test and start Ryu from DCNetwork init
authorstevenvanrossem <steven.vanrossem@intec.ugent.be>
Mon, 22 Feb 2016 09:13:05 +0000 (10:13 +0100)
committerstevenvanrossem <steven.vanrossem@intec.ugent.be>
Mon, 22 Feb 2016 09:13:05 +0000 (10:13 +0100)
emuvim/api/zerorpcapi_DCNetwork.py
emuvim/dcemulator/net.py
emuvim/example_topology.py

index b60093d..27527aa 100755 (executable)
@@ -6,8 +6,7 @@ Distributed Cloud Emulator (dcemulator)
 import logging\r
 import threading\r
 import zerorpc\r
-import site\r
-from subprocess import Popen\r
+\r
 \r
 logging.basicConfig(level=logging.INFO)\r
 \r
@@ -30,17 +29,6 @@ class ZeroRpcApiEndpointDCNetwork(object):
         logging.debug("Created monitoring API endpoint %s(%s:%d)" % (\r
             self.__class__.__name__, self.ip, self.port))\r
 \r
-        # start Ryu controller with rest-API\r
-        python_install_path = site.getsitepackages()[0]\r
-        ryu_path = python_install_path + '/ryu/app/simple_switch_13.py'\r
-        ryu_path2 =  python_install_path + '/ryu/app/ofctl_rest.py'\r
-        # change the default Openflow controller port to 6653 (official IANA-assigned port number), as used by Mininet\r
-        # Ryu still uses 6633 as default\r
-        ryu_option = '--ofp-tcp-listen-port'\r
-        ryu_of_port = '6653'\r
-        ryu_cmd =  'ryu-manager'\r
-        self.ryu_process = Popen([ryu_cmd, ryu_path, ryu_path2, ryu_option, ryu_of_port])\r
-\r
     def connectDCNetwork(self, net):\r
         self.net = net\r
         logging.info("Connected DCNetwork to API endpoint %s(%s:%d)" % (\r
@@ -59,17 +47,17 @@ class ZeroRpcApiEndpointDCNetwork(object):
         s.run()\r
 \r
     def stop(self):\r
-        # stop ryu controller\r
         logging.info("Stop the monitoring API endpoint")\r
-        self.ryu_process.terminate()\r
-        #self.ryu_process.kill()\r
         return\r
 \r
 \r
 class DCNetworkApi(object):\r
     """\r
+        The networking and monitoring commands need the scope of the\r
+        whole DC network to find the requested vnf. So this API is intended\r
+        to work with a DCNetwork.\r
         Just pass through the corresponding request to the\r
-        selected data center. Do not implement provisioning\r
+        selected data center network. Do not implement provisioning\r
         logic here because will will have multiple API\r
         endpoint implementations at the end.\r
     """\r
index 324c4d3..20ab33a 100755 (executable)
@@ -4,6 +4,10 @@ Distributed Cloud Emulator (dcemulator)
 """
 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
@@ -39,6 +43,9 @@ class DCNetwork(Dockernet):
         # monitoring agent
         self.monitor_agent = DCNetworkMonitor(self)
 
+        # start Ryu controller
+        self.startRyu()
+
 
     def addDatacenter(self, label, metadata={}):
         """
@@ -133,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):
@@ -179,4 +189,18 @@ class DCNetwork(Dockernet):
 
             current_hop = next_hop
 
-        return "destination node: {0} not reached".format(vnf_dst_name)
\ 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
index 2342fd1..5c459ce 100755 (executable)
@@ -110,7 +110,7 @@ def create_topology1():
     net.CLI()
     # when the user types exit in the CLI, we stop the emulator
     # we need to explicitly stop the monitoring api, so the Ryu controller is also terminated
-    mon_api.stop()
+    #mon_api.stop()
     net.stop()