From: stevenvanrossem Date: Wed, 11 May 2016 23:34:15 +0000 (+0200) Subject: fix SDN chaining bug regarding cookies + add extra unittest SDN chaining multi service X-Git-Tag: v3.1~127^2 X-Git-Url: https://osm.etsi.org/gitweb/?a=commitdiff_plain;ds=inline;h=7fce49bc94c4ca2c6d478c6a662397a5d0c72ce5;p=osm%2Fvim-emu.git fix SDN chaining bug regarding cookies + add extra unittest SDN chaining multi service --- diff --git a/src/emuvim/dcemulator/net.py b/src/emuvim/dcemulator/net.py index 115b9e5..3556535 100755 --- a/src/emuvim/dcemulator/net.py +++ b/src/emuvim/dcemulator/net.py @@ -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) diff --git a/src/emuvim/test/unittests/test_emulator.py b/src/emuvim/test/unittests/test_emulator.py index ad9896a..80ac1d1 100755 --- a/src/emuvim/test/unittests/test_emulator.py +++ b/src/emuvim/test/unittests/test_emulator.py @@ -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 ): """