Commit a51ec2f1 authored by Yonghong Song's avatar Yonghong Song

add required parameter ifc_name for additional ifc adding to ns

    o make some long lines in python codes shorter
    o use python style unused variable name "_"
Signed-off-by: default avatarYonghong Song <yhs@plumgrid.com>
parent 485af951
...@@ -15,8 +15,12 @@ class Simulation(object): ...@@ -15,8 +15,12 @@ class Simulation(object):
self.released = False self.released = False
# helper function to add additional ifc to namespace # helper function to add additional ifc to namespace
def _ns_add_ifc(self, name, ns_ifc, in_ifc=None, out_ifc=None, ipaddr=None, # if called directly outside Simulation class, "ifc_base_name" should be
macaddr=None, fn=None, cmd=None, action="ok", disable_ipv6=False): # different from "name", the "ifc_base_name" and "name" are the same for
# the first ifc created by namespace
def _ns_add_ifc(self, name, ns_ifc, ifc_base_name, in_ifc=None, out_ifc=None,
ipaddr=None, macaddr=None, fn=None, cmd=None, action="ok",
disable_ipv6=False):
if name in self.ipdbs: if name in self.ipdbs:
ns_ipdb = self.ipdbs[name] ns_ipdb = self.ipdbs[name]
else: else:
...@@ -24,8 +28,8 @@ class Simulation(object): ...@@ -24,8 +28,8 @@ class Simulation(object):
if in_ifc: if in_ifc:
in_ifname = in_ifc.ifname in_ifname = in_ifc.ifname
else: else:
out_ifc = self.ipdb.create(ifname="%s%sa" % (name, ns_ifc), kind="veth", out_ifc = self.ipdb.create(ifname="%sa" % ifc_base_name, kind="veth",
peer="%s%sb" % (name, ns_ifc)).commit() peer="%sb" % ifc_base_name).commit()
in_ifc = self.ipdb.interfaces[out_ifc.peer] in_ifc = self.ipdb.interfaces[out_ifc.peer]
in_ifname = in_ifc.ifname in_ifname = in_ifc.ifname
with in_ifc as v: with in_ifc as v:
...@@ -40,8 +44,10 @@ class Simulation(object): ...@@ -40,8 +44,10 @@ class Simulation(object):
v.up() v.up()
# if required, disable ipv6 before attaching the filter # if required, disable ipv6 before attaching the filter
if disable_ipv6: if disable_ipv6:
subprocess.call(["sysctl", "-q", "-w", "net.ipv6.conf." + out_ifc.ifname+ ".disable_ipv6=1"]) subprocess.call(["sysctl", "-q", "-w",
nsp = NSPopen(ns_ipdb.nl.netns, ["sysctl", "-q", "-w", "net.ipv6.conf." + ns_ifc + ".disable_ipv6=1"]) "net.ipv6.conf." + out_ifc.ifname+ ".disable_ipv6=1"])
nsp = NSPopen(ns_ipdb.nl.netns,
["sysctl", "-q", "-w", "net.ipv6.conf." + ns_ifc + ".disable_ipv6=1"])
nsp.wait(); nsp.release() nsp.wait(); nsp.release()
if fn and out_ifc: if fn and out_ifc:
self.ipdb.nl.tc("add", "ingress", out_ifc["index"], "ffff:") self.ipdb.nl.tc("add", "ingress", out_ifc["index"], "ffff:")
...@@ -55,8 +61,9 @@ class Simulation(object): ...@@ -55,8 +61,9 @@ class Simulation(object):
# helper function to create a namespace and a veth connecting it # helper function to create a namespace and a veth connecting it
def _create_ns(self, name, in_ifc=None, out_ifc=None, ipaddr=None, def _create_ns(self, name, in_ifc=None, out_ifc=None, ipaddr=None,
macaddr=None, fn=None, cmd=None, action="ok", disable_ipv6=False): macaddr=None, fn=None, cmd=None, action="ok", disable_ipv6=False):
(ns_ipdb, out_ifc, in_ifc) = self._ns_add_ifc(name, "eth0", in_ifc, out_ifc, ipaddr, (ns_ipdb, out_ifc, in_ifc) = self._ns_add_ifc(name, "eth0", name, in_ifc, out_ifc,
macaddr, fn, cmd, action, disable_ipv6) ipaddr, macaddr, fn, cmd, action,
disable_ipv6)
self.ipdbs[ns_ipdb.nl.netns] = ns_ipdb self.ipdbs[ns_ipdb.nl.netns] = ns_ipdb
self.namespaces.append(ns_ipdb.nl) self.namespaces.append(ns_ipdb.nl)
return (ns_ipdb, out_ifc, in_ifc) return (ns_ipdb, out_ifc, in_ifc)
......
...@@ -91,7 +91,7 @@ class VlanSimulation(Simulation): ...@@ -91,7 +91,7 @@ class VlanSimulation(Simulation):
((i >> 16) & 0xff, (i >> 8) & 0xff, i & 0xff)) ((i >> 16) & 0xff, (i >> 8) & 0xff, i & 0xff))
# assign this client to the given worker # assign this client to the given worker
idx = self.ipdb.interfaces["worker%deth0a" % i]["index"] idx = self.ipdb.interfaces["worker%da" % i]["index"]
mac = int(macaddr.replace(":", ""), 16) mac = int(macaddr.replace(":", ""), 16)
ingress[ingress.Key(mac)] = ingress.Leaf(idx, 0, 0) ingress[ingress.Key(mac)] = ingress.Leaf(idx, 0, 0)
......
...@@ -156,31 +156,42 @@ class TestBPFSocket(TestCase): ...@@ -156,31 +156,42 @@ class TestBPFSocket(TestCase):
# set up the topology # set up the topology
self.set_default_const() self.set_default_const()
(ns1_ipdb, self.ns1_eth_out, unused) = sim._create_ns(self.ns1, ipaddr=self.vm1_ip+'/24', fn=self.pem_fn, action='drop', (ns1_ipdb, self.ns1_eth_out, _) = sim._create_ns(self.ns1, ipaddr=self.vm1_ip+'/24',
disable_ipv6=True) fn=self.pem_fn, action='drop',
(ns2_ipdb, self.ns2_eth_out, unused) = sim._create_ns(self.ns2, ipaddr=self.vm2_ip+'/24', fn=self.pem_fn, action='drop', disable_ipv6=True)
disable_ipv6=True) (ns2_ipdb, self.ns2_eth_out, _) = sim._create_ns(self.ns2, ipaddr=self.vm2_ip+'/24',
fn=self.pem_fn, action='drop',
disable_ipv6=True)
ns1_ipdb.routes.add({'dst': self.vm2_rtr_mask, 'gateway': self.vm1_rtr_ip}).commit() ns1_ipdb.routes.add({'dst': self.vm2_rtr_mask, 'gateway': self.vm1_rtr_ip}).commit()
ns2_ipdb.routes.add({'dst': self.vm1_rtr_mask, 'gateway': self.vm2_rtr_ip}).commit() ns2_ipdb.routes.add({'dst': self.vm1_rtr_mask, 'gateway': self.vm2_rtr_ip}).commit()
self.vm1_mac = ns1_ipdb.interfaces['eth0'].address self.vm1_mac = ns1_ipdb.interfaces['eth0'].address
self.vm2_mac = ns2_ipdb.interfaces['eth0'].address self.vm2_mac = ns2_ipdb.interfaces['eth0'].address
(rt_ipdb, self.nsrtr_eth0_out, unused) = sim._create_ns(self.ns_router, ipaddr=self.vm1_rtr_ip+'/24', fn=self.br1_fn, (_, self.nsrtr_eth0_out, _) = sim._create_ns(self.ns_router, ipaddr=self.vm1_rtr_ip+'/24',
action='drop', disable_ipv6=True) fn=self.br1_fn, action='drop',
(rt_ipdb, self.nsrtr_eth1_out, unused) = sim._ns_add_ifc(self.ns_router, "eth1", ipaddr=self.vm2_rtr_ip+'/24', disable_ipv6=True)
fn=self.br2_fn, action='drop', disable_ipv6=True) (rt_ipdb, self.nsrtr_eth1_out, _) = sim._ns_add_ifc(self.ns_router, "eth1", "ns_router2",
nsp = NSPopen(rt_ipdb.nl.netns, ["sysctl", "-w", "net.ipv4.ip_forward=1"]); nsp.wait(); nsp.release() ipaddr=self.vm2_rtr_ip+'/24',
fn=self.br2_fn, action='drop',
disable_ipv6=True)
nsp = NSPopen(rt_ipdb.nl.netns, ["sysctl", "-w", "net.ipv4.ip_forward=1"])
nsp.wait(); nsp.release()
# configure maps # configure maps
self.config_maps() self.config_maps()
# our bridge is not smart enough, so send arping for router learning to prevent router # our bridge is not smart enough, so send arping for router learning to prevent router
# from sending out arp request # from sending out arp request
nsp = NSPopen(ns1_ipdb.nl.netns, ["arping", "-w", "1", "-c", "1", "-I", "eth0", self.vm1_rtr_ip]); nsp.wait(); nsp.release() nsp = NSPopen(ns1_ipdb.nl.netns,
nsp = NSPopen(ns2_ipdb.nl.netns, ["arping", "-w", "1", "-c", "1", "-I", "eth0", self.vm2_rtr_ip]); nsp.wait(); nsp.release() ["arping", "-w", "1", "-c", "1", "-I", "eth0", self.vm1_rtr_ip])
nsp.wait(); nsp.release()
nsp = NSPopen(ns2_ipdb.nl.netns,
["arping", "-w", "1", "-c", "1", "-I", "eth0", self.vm2_rtr_ip])
nsp.wait(); nsp.release()
# ping # ping
nsp = NSPopen(ns1_ipdb.nl.netns, ["ping", self.vm2_ip, "-c", "2"]); nsp.wait(); nsp.release() nsp = NSPopen(ns1_ipdb.nl.netns, ["ping", self.vm2_ip, "-c", "2"])
nsp.wait(); nsp.release()
# pem_stats only counts pem->bridge traffic, each VM has 4: arping/arp request/2 icmp request # pem_stats only counts pem->bridge traffic, each VM has 4: arping/arp request/2 icmp request
# total 8 packets should be counted # total 8 packets should be counted
self.assertEqual(self.pem_stats[c_uint(0)].value, 8) self.assertEqual(self.pem_stats[c_uint(0)].value, 8)
...@@ -188,23 +199,26 @@ class TestBPFSocket(TestCase): ...@@ -188,23 +199,26 @@ class TestBPFSocket(TestCase):
# iperf, run server on the background # iperf, run server on the background
nsp_server = NSPopen(ns2_ipdb.nl.netns, ["iperf", "-s", "-xSCD"]) nsp_server = NSPopen(ns2_ipdb.nl.netns, ["iperf", "-s", "-xSCD"])
sleep(1) sleep(1)
nsp = NSPopen(ns1_ipdb.nl.netns, ["iperf", "-c", self.vm2_ip, "-t", "1", "-xSC"]); nsp.wait(); nsp.release() nsp = NSPopen(ns1_ipdb.nl.netns, ["iperf", "-c", self.vm2_ip, "-t", "1", "-xSC"])
nsp.wait(); nsp.release()
nsp_server.kill(); nsp_server.wait(); nsp.release() nsp_server.kill(); nsp_server.wait(); nsp.release()
# netperf, run server on the background # netperf, run server on the background
nsp_server = NSPopen(ns2_ipdb.nl.netns, ["netserver"]) nsp_server = NSPopen(ns2_ipdb.nl.netns, ["netserver"])
sleep(1) sleep(1)
nsp = NSPopen(ns1_ipdb.nl.netns, ["netperf", "-l", "1", "-H", self.vm2_ip, "--", "-m", "65160"]); nsp.wait(); nsp.release() nsp = NSPopen(ns1_ipdb.nl.netns, ["netperf", "-l", "1", "-H", self.vm2_ip, "--", "-m", "65160"])
nsp = NSPopen(ns1_ipdb.nl.netns, ["netperf", "-l", "1", "-H", self.vm2_ip, "-t", "TCP_RR"]); nsp.wait(); nsp.release() nsp.wait(); nsp.release()
nsp = NSPopen(ns1_ipdb.nl.netns, ["netperf", "-l", "1", "-H", self.vm2_ip, "-t", "TCP_RR"])
nsp.wait(); nsp.release()
nsp_server.kill(); nsp_server.wait(); nsp.release() nsp_server.kill(); nsp_server.wait(); nsp.release()
finally: finally:
# this is a little bit hacker, but we want to be sure to remove all created interfaces # this is a little bit hacker, but we want to be sure to remove all created interfaces
# ns1_eth_out, ns2_eth_out, nsrtr_eth0_out, nsrtr_eth1_out # ns1_eth_out, ns2_eth_out, nsrtr_eth0_out, nsrtr_eth1_out
if "ns1eth0a" in ipdb.interfaces: ipdb.interfaces.ns1eth0a.remove().commit() if "ns1a" in ipdb.interfaces: ipdb.interfaces.ns1a.remove().commit()
if "ns2eth0a" in ipdb.interfaces: ipdb.interfaces.ns2eth0a.remove().commit() if "ns2a" in ipdb.interfaces: ipdb.interfaces.ns2a.remove().commit()
if "ns_routereth0a" in ipdb.interfaces: ipdb.interfaces.ns_routereth0a.remove().commit() if "ns_routera" in ipdb.interfaces: ipdb.interfaces.ns_routera.remove().commit()
if "ns_routereth1a" in ipdb.interfaces: ipdb.interfaces.ns_routereth1a.remove().commit() if "ns_router2a" in ipdb.interfaces: ipdb.interfaces.ns_router2a.remove().commit()
sim.release() sim.release()
ipdb.release() ipdb.release()
......
...@@ -134,19 +134,23 @@ class TestBPFSocket(TestCase): ...@@ -134,19 +134,23 @@ class TestBPFSocket(TestCase):
# set up the topology # set up the topology
self.set_default_const() self.set_default_const()
(ns1_ipdb, self.ns1_eth_out, unused) = sim._create_ns(self.ns1, ipaddr=self.vm1_ip+'/24', fn=self.pem_fn, (ns1_ipdb, self.ns1_eth_out, _) = sim._create_ns(self.ns1, ipaddr=self.vm1_ip+'/24',
action='drop', disable_ipv6=True) fn=self.pem_fn, action='drop',
(ns2_ipdb, self.ns2_eth_out, unused) = sim._create_ns(self.ns2, ipaddr=self.vm2_ip+'/24', fn=self.pem_fn, disable_ipv6=True)
action='drop', disable_ipv6=True) (ns2_ipdb, self.ns2_eth_out, _) = sim._create_ns(self.ns2, ipaddr=self.vm2_ip+'/24',
fn=self.pem_fn, action='drop',
disable_ipv6=True)
ns1_ipdb.routes.add({'dst': self.vm2_rtr_mask, 'gateway': self.vm1_rtr_ip}).commit() ns1_ipdb.routes.add({'dst': self.vm2_rtr_mask, 'gateway': self.vm1_rtr_ip}).commit()
ns2_ipdb.routes.add({'dst': self.vm1_rtr_mask, 'gateway': self.vm2_rtr_ip}).commit() ns2_ipdb.routes.add({'dst': self.vm1_rtr_mask, 'gateway': self.vm2_rtr_ip}).commit()
(rt_ipdb, self.nsrtr_eth0_out, unused) = sim._create_ns(self.ns_router, ipaddr=self.vm1_rtr_ip+'/24', (_, self.nsrtr_eth0_out, _) = sim._create_ns(self.ns_router, ipaddr=self.vm1_rtr_ip+'/24',
disable_ipv6=True) disable_ipv6=True)
(rt_ipdb, self.nsrtr_eth1_out, unused) = sim._ns_add_ifc(self.ns_router, "eth1", ipaddr=self.vm2_rtr_ip+'/24', (rt_ipdb, self.nsrtr_eth1_out, _) = sim._ns_add_ifc(self.ns_router, "eth1", "ns_router2",
disable_ipv6=True) ipaddr=self.vm2_rtr_ip+'/24',
disable_ipv6=True)
# enable ip forwarding in router ns # enable ip forwarding in router ns
nsp = NSPopen(rt_ipdb.nl.netns, ["sysctl", "-w", "net.ipv4.ip_forward=1"]); nsp.wait(); nsp.release() nsp = NSPopen(rt_ipdb.nl.netns, ["sysctl", "-w", "net.ipv4.ip_forward=1"])
nsp.wait(); nsp.release()
# for each VM connecting to pem, there will be a corresponding veth connecting to the bridge # for each VM connecting to pem, there will be a corresponding veth connecting to the bridge
self.setup_br(self.br1, self.nsrtr_eth0_out.ifname, self.veth_pem_2_br1, self.veth_br1_2_pem) self.setup_br(self.br1, self.nsrtr_eth0_out.ifname, self.veth_pem_2_br1, self.veth_br1_2_pem)
...@@ -163,23 +167,26 @@ class TestBPFSocket(TestCase): ...@@ -163,23 +167,26 @@ class TestBPFSocket(TestCase):
# iperf, run server on the background # iperf, run server on the background
nsp_server = NSPopen(ns2_ipdb.nl.netns, ["iperf", "-s", "-xSCD"]) nsp_server = NSPopen(ns2_ipdb.nl.netns, ["iperf", "-s", "-xSCD"])
sleep(1) sleep(1)
nsp = NSPopen(ns1_ipdb.nl.netns, ["iperf", "-c", self.vm2_ip, "-t", "1", "-xSC"]); nsp.wait(); nsp.release() nsp = NSPopen(ns1_ipdb.nl.netns, ["iperf", "-c", self.vm2_ip, "-t", "1", "-xSC"])
nsp.wait(); nsp.release()
nsp_server.kill(); nsp_server.wait(); nsp.release() nsp_server.kill(); nsp_server.wait(); nsp.release()
# netperf, run server on the background # netperf, run server on the background
nsp_server = NSPopen(ns2_ipdb.nl.netns, ["netserver"]) nsp_server = NSPopen(ns2_ipdb.nl.netns, ["netserver"])
sleep(1) sleep(1)
nsp = NSPopen(ns1_ipdb.nl.netns, ["netperf", "-l", "1", "-H", self.vm2_ip, "--", "-m", "65160"]); nsp.wait(); nsp.release() nsp = NSPopen(ns1_ipdb.nl.netns, ["netperf", "-l", "1", "-H", self.vm2_ip, "--", "-m", "65160"])
nsp = NSPopen(ns1_ipdb.nl.netns, ["netperf", "-l", "1", "-H", self.vm2_ip, "-t", "TCP_RR"]); nsp.wait(); nsp.release() nsp.wait(); nsp.release()
nsp = NSPopen(ns1_ipdb.nl.netns, ["netperf", "-l", "1", "-H", self.vm2_ip, "-t", "TCP_RR"])
nsp.wait(); nsp.release()
nsp_server.kill(); nsp_server.wait(); nsp.release() nsp_server.kill(); nsp_server.wait(); nsp.release()
finally: finally:
# this is a little bit hacker, but we want to be sure to remove all created interfaces # this is a little bit hacker, but we want to be sure to remove all created interfaces
# ns1_eth_out, ns2_eth_out, nsrtr_eth0_out, nsrtr_eth1_out # ns1_eth_out, ns2_eth_out, nsrtr_eth0_out, nsrtr_eth1_out
if "ns1eth0a" in ipdb.interfaces: ipdb.interfaces.ns1eth0a.remove().commit() if "ns1a" in ipdb.interfaces: ipdb.interfaces.ns1a.remove().commit()
if "ns2eth0a" in ipdb.interfaces: ipdb.interfaces.ns2eth0a.remove().commit() if "ns2a" in ipdb.interfaces: ipdb.interfaces.ns2a.remove().commit()
if "ns_routereth0a" in ipdb.interfaces: ipdb.interfaces.ns_routereth0a.remove().commit() if "ns_routera" in ipdb.interfaces: ipdb.interfaces.ns_routera.remove().commit()
if "ns_routereth1a" in ipdb.interfaces: ipdb.interfaces.ns_routereth1a.remove().commit() if "ns_router2a" in ipdb.interfaces: ipdb.interfaces.ns_router2a.remove().commit()
if self.br1 in ipdb.interfaces: ipdb.interfaces[self.br1].remove().commit() if self.br1 in ipdb.interfaces: ipdb.interfaces[self.br1].remove().commit()
if self.br2 in ipdb.interfaces: ipdb.interfaces[self.br2].remove().commit() if self.br2 in ipdb.interfaces: ipdb.interfaces[self.br2].remove().commit()
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment