Commit 485af951 authored by Yonghong Song's avatar Yonghong Song

rewrite test_brb/test_brb2 python binding with pyroute2

Signed-off-by: default avatarYonghong Song <yhs@plumgrid.com>
parent 3a898644
import atexit import subprocess
from pyroute2 import IPRoute, NetNS, IPDB, NSPopen from pyroute2 import IPRoute, NetNS, IPDB, NSPopen
class Simulation(object): class Simulation(object):
...@@ -14,15 +14,18 @@ class Simulation(object): ...@@ -14,15 +14,18 @@ class Simulation(object):
self.processes = [] self.processes = []
self.released = False self.released = False
# helper function to create a namespace and a veth connecting it # helper function to add additional ifc to namespace
def _create_ns(self, name, in_ifc=None, out_ifc=None, ipaddr=None, def _ns_add_ifc(self, name, ns_ifc, in_ifc=None, out_ifc=None, ipaddr=None,
macaddr=None, fn=None, cmd=None, action="ok"): macaddr=None, fn=None, cmd=None, action="ok", disable_ipv6=False):
ns_ipdb = IPDB(nl=NetNS(name)) if name in self.ipdbs:
ns_ipdb = self.ipdbs[name]
else:
ns_ipdb = IPDB(nl=NetNS(name))
if in_ifc: if in_ifc:
in_ifname = in_ifc.ifname in_ifname = in_ifc.ifname
else: else:
out_ifc = self.ipdb.create(ifname="%sa" % name, kind="veth", out_ifc = self.ipdb.create(ifname="%s%sa" % (name, ns_ifc), kind="veth",
peer="%sb" % name).commit() peer="%s%sb" % (name, ns_ifc)).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:
...@@ -31,21 +34,33 @@ class Simulation(object): ...@@ -31,21 +34,33 @@ class Simulation(object):
in_ifc = ns_ipdb.interfaces[in_ifname] in_ifc = ns_ipdb.interfaces[in_ifname]
if out_ifc: out_ifc.up().commit() if out_ifc: out_ifc.up().commit()
with in_ifc as v: with in_ifc as v:
v.ifname = "eth0" v.ifname = ns_ifc
if ipaddr: v.add_ip("%s" % ipaddr) if ipaddr: v.add_ip("%s" % ipaddr)
if macaddr: v.address = macaddr if macaddr: v.address = macaddr
v.up() v.up()
# if required, disable ipv6 before attaching the filter
if disable_ipv6:
subprocess.call(["sysctl", "-q", "-w", "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()
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:")
self.ipdb.nl.tc("add-filter", "bpf", out_ifc["index"], ":1", self.ipdb.nl.tc("add-filter", "bpf", out_ifc["index"], ":1",
fd=fn.fd, name=fn.name, parent="ffff:", fd=fn.fd, name=fn.name, parent="ffff:",
action=action, classid=1) action=action, classid=1)
self.ipdbs[ns_ipdb.nl.netns] = ns_ipdb
self.namespaces.append(ns_ipdb.nl)
if cmd: if cmd:
self.processes.append(NSPopen(ns_ipdb.nl.netns, cmd)) self.processes.append(NSPopen(ns_ipdb.nl.netns, cmd))
return (ns_ipdb, out_ifc, in_ifc) return (ns_ipdb, out_ifc, in_ifc)
# helper function to create a namespace and a veth connecting it
def _create_ns(self, name, in_ifc=None, out_ifc=None, ipaddr=None,
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,
macaddr, fn, cmd, action, disable_ipv6)
self.ipdbs[ns_ipdb.nl.netns] = ns_ipdb
self.namespaces.append(ns_ipdb.nl)
return (ns_ipdb, out_ifc, in_ifc)
def release(self): def release(self):
if self.released: return if self.released: return
self.released = True self.released = True
......
...@@ -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%da" % i]["index"] idx = self.ipdb.interfaces["worker%deth0a" % 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)
......
../../examples/simulation.py
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
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