flow = {}
flow['dpid'] = int(node.dpid, 16)
- logging.info('node name:{0}'.format(node.name))
if cookie:
flow['cookie'] = int(cookie)
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'
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)
# 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 ):
"""