fix SDN chaining bug regarding cookies + add extra unittest SDN chaining multi service
authorstevenvanrossem <steven.vanrossem@intec.ugent.be>
Wed, 11 May 2016 23:34:15 +0000 (01:34 +0200)
committerstevenvanrossem <steven.vanrossem@intec.ugent.be>
Wed, 11 May 2016 23:34:15 +0000 (01:34 +0200)
src/emuvim/dcemulator/net.py
src/emuvim/test/unittests/test_emulator.py

index 115b9e5..3556535 100755 (executable)
@@ -366,7 +366,6 @@ class DCNetwork(Containernet):
 
         flow = {}
         flow['dpid'] = int(node.dpid, 16)
-        logging.info('node name:{0}'.format(node.name))
 
         if cookie:
             flow['cookie'] = int(cookie)
@@ -401,14 +400,14 @@ class DCNetwork(Containernet):
             action['type'] = 'OUTPUT'
             action['port'] = switch_outport_nr
             flow['actions'].append(action)
-            #flow['match'] = self._parse_match(match)
+
         elif cmd == 'del-flows':
-            #del(flow['actions'])
             prefix = 'stats/flowentry/delete'
+
+            # if cookie is given, only delete flows by cookie
+            # do not specify other match -> also other cookies can be matched
             if cookie:
-                flow['cookie_mask'] = cookie
-            #if cookie is None:
-            #    flow['match'] = self._parse_match(match)
+                flow['cookie_mask'] = int('0xffffffffffffffff', 16)  # need full mask to match complete cookie
 
             action = {}
             action['type'] = 'OUTPUT'
@@ -480,6 +479,7 @@ class DCNetwork(Containernet):
             self.ryu_process.kill()
 
     def ryu_REST(self, prefix, dpid=None, data=None):
+        if data: logging.info('log POST: {0}'.format(str(data)))
         try:
             if dpid:
                 url = self.ryu_REST_api + '/' + str(prefix) + '/' + str(dpid)
index ad9896a..80ac1d1 100755 (executable)
@@ -137,6 +137,64 @@ class testEmulatorNetworking( SimpleTestTopology ):
         # stop Mininet network
         self.stopNet()
 
+    def testSDNChainingMultiService(self):
+        """
+        Create a two data centers and interconnect them with additional
+        switches between them.
+        Uses Ryu SDN controller.
+        Setup 2 services and setup isolated paths between them
+        Delete only the first service, and check that other one still works
+        """
+        # create network
+        self.createNet(
+            nswitches=3, ndatacenter=2, nhosts=0, ndockers=0,
+            autolinkswitches=True,
+            controller=RemoteController,
+            enable_learning=False)
+        # setup links
+        self.net.addLink(self.dc[0], self.s[0])
+        self.net.addLink(self.s[2], self.dc[1])
+        # start Mininet network
+        self.startNet()
+
+        ## First Service
+        # add compute resources
+        vnf1 = self.dc[0].startCompute("vnf1", network=[{'id': 'intf1', 'ip': '10.0.10.1/24'}])
+        vnf2 = self.dc[1].startCompute("vnf2", network=[{'id': 'intf2', 'ip': '10.0.10.2/24'}])
+        # setup links
+        self.net.setChain('vnf1', 'vnf2', 'intf1', 'intf2', bidirectional=True, cmd='add-flow', cookie=1)
+        # check connectivity by using ping
+        self.assertTrue(self.net.ping([vnf1, vnf2]) <= 0.0)
+
+        ## Second Service
+        # add compute resources
+        vnf11 = self.dc[0].startCompute("vnf11", network=[{'id': 'intf1', 'ip': '10.0.20.1/24'}])
+        vnf22 = self.dc[1].startCompute("vnf22", network=[{'id': 'intf2', 'ip': '10.0.20.2/24'}])
+
+        # check number of running nodes
+        self.assertTrue(len(self.getContainernetContainers()) == 4)
+        self.assertTrue(len(self.net.hosts) == 4)
+        self.assertTrue(len(self.net.switches) == 5)
+
+        # setup links
+        self.net.setChain('vnf11', 'vnf22', 'intf1', 'intf2', bidirectional=True, cmd='add-flow', cookie=2)
+        # check connectivity by using ping
+        self.assertTrue(self.net.ping([vnf11, vnf22]) <= 0.0)
+        # check first service cannot ping second service
+        self.assertTrue(self.net.ping([vnf1, vnf22]) > 0.0)
+        self.assertTrue(self.net.ping([vnf2, vnf11]) > 0.0)
+
+        # delete the first service chain
+        self.net.setChain('vnf1', 'vnf2', 'intf1', 'intf2', bidirectional=True, cmd='del-flows', cookie=1)
+        # check connectivity of first service is down
+        self.assertTrue(self.net.ping([vnf1, vnf2]) > 0.0)
+        #time.sleep(100)
+        # check connectivity of second service is still up
+        self.assertTrue(self.net.ping([vnf11, vnf22]) <= 0.0)
+
+        # stop Mininet network
+        self.stopNet()
+
 #@unittest.skip("disabled compute tests for development")
 class testEmulatorCompute( SimpleTestTopology ):
     """