From: Ondrej Lichtner <olichtne(a)redhat.com>
The OvS bridge configuration class now supports internal ports, tunnels
and flow entries.
Signed-off-by: Ondrej Lichtner <olichtne(a)redhat.com>
---
lnst/Slave/NetConfigDevice.py | 103 ++++++++++++++++++++++++++++++++++++++++--
1 file changed, 100 insertions(+), 3 deletions(-)
diff --git a/lnst/Slave/NetConfigDevice.py b/lnst/Slave/NetConfigDevice.py
index 6ef3f1c..f6ccd92 100644
--- a/lnst/Slave/NetConfigDevice.py
+++ b/lnst/Slave/NetConfigDevice.py
@@ -14,7 +14,8 @@ jpirko(a)redhat.com (Jiri Pirko)
import logging
import re
from lnst.Common.ExecCmd import exec_cmd
-from lnst.Slave.NetConfigCommon import get_slaves, get_option, get_slave_option,
parse_netem
+from lnst.Slave.NetConfigCommon import get_slaves, get_option, get_slave_option
+from lnst.Slave.NetConfigCommon import parse_netem, get_slave_options
from lnst.Common.Utils import bool_it
from lnst.Slave.NmConfigDevice import type_class_mapping as nm_type_class_mapping
from lnst.Slave.NmConfigDevice import is_nm_managed
@@ -421,6 +422,28 @@ class NetConfigDeviceOvsBridge(NetConfigDeviceGeneric):
_modulename = "openvswitch"
_moduleload = True
+ def up(self):
+ super(NetConfigDeviceOvsBridge, self).up()
+
+ int_ports = self._dev_config["ovs_conf"]["internals"]
+ br_name = self._dev_config["name"]
+ for iport in int_ports:
+ if "addresses" in iport:
+ for address in iport["addresses"]:
+ exec_cmd("ip addr add %s dev %s" % (address,
iport["name"]))
+ exec_cmd("ip link set %s up" % iport["name"])
+
+ def down(self):
+ int_ports = self._dev_config["ovs_conf"]["internals"]
+ br_name = self._dev_config["name"]
+ for iport in int_ports:
+ if "addresses" in iport:
+ for address in iport["addresses"]:
+ exec_cmd("ip addr del %s dev %s" % (address,
iport["name"]))
+ exec_cmd("ip link set %s down" % iport["name"])
+
+ super(NetConfigDeviceOvsBridge, self).down()
+
@classmethod
def type_init(self):
super(NetConfigDeviceOvsBridge, self).type_init()
@@ -447,6 +470,10 @@ class NetConfigDeviceOvsBridge(NetConfigDeviceGeneric):
slave_dev = self._if_manager.get_mapped_device(slave_id)
slave_name = slave_dev.get_name()
+ options = ""
+ for opt in get_slave_options(self._dev_config, slave_id):
+ options += " %s=%s" % (opt[0], opt[1])
+
vlan_tags = []
for tag, vlan in vlans.iteritems():
if slave_id in vlan["slaves"]:
@@ -459,6 +486,9 @@ class NetConfigDeviceOvsBridge(NetConfigDeviceGeneric):
tags = " trunks=" + ",".join(vlan_tags)
exec_cmd("ovs-vsctl add-port %s %s%s" % (br_name, slave_name,
tags))
+ if options != "":
+ exec_cmd("ovs-vsctl set Interface %s%s" % (slave_name,
options))
+
def _del_ports(self):
slaves = self._dev_config["slaves"]
@@ -477,6 +507,56 @@ class NetConfigDeviceOvsBridge(NetConfigDeviceGeneric):
exec_cmd("ovs-vsctl del-port %s %s" % (br_name, slave_name))
+ def _add_internal_ports(self):
+ int_ports = self._dev_config["ovs_conf"]["internals"]
+ br_name = self._dev_config["name"]
+
+ for i in int_ports:
+ i["name"] =
self._if_manager.assign_name_generic(prefix="int")
+
+ options = ""
+ for opt in i["options"]:
+ options += " %s=%s" % (opt["name"],
opt["value"])
+
+ if opt["name"] == "name":
+ i["name"] = opt["value"]
+
+ exec_cmd("ovs-vsctl add-port %s %s -- set Interface %s "\
+ "type=internal %s" % (br_name, i["name"],
+ i["name"], options))
+
+ def _del_internal_ports(self):
+ int_ports = self._dev_config["ovs_conf"]["internals"]
+ br_name = self._dev_config["name"]
+
+ for i in int_ports:
+ exec_cmd("ovs-vsctl del-port %s %s" % (br_name,
i["name"]))
+
+ def _add_tunnels(self):
+ tunnels = self._dev_config["ovs_conf"]["tunnels"]
+ br_name = self._dev_config["name"]
+
+ for i in tunnels:
+ i["name"] =
self._if_manager.assign_name_generic(prefix=i["type"])
+
+ options = ""
+ for opt in i["options"]:
+ options += " %s=%s" % (opt["name"],
opt["value"])
+
+ if opt["name"] == "name":
+ i["name"] = opt["value"]
+
+ exec_cmd("ovs-vsctl add-port %s %s -- set Interface %s "\
+ "type=%s %s" % (br_name, i["name"],
i["name"],
+ i["type"], options))
+
+ def _del_tunnels(self):
+ tunnels = self._dev_config["ovs_conf"]["tunnels"]
+ br_name = self._dev_config["name"]
+
+ for i in tunnels:
+ exec_cmd("ovs-vsctl del-port %s %s" % (br_name,
i["name"]))
+
def _add_bonds(self):
br_name = self._dev_config["name"]
@@ -500,24 +580,41 @@ class NetConfigDeviceOvsBridge(NetConfigDeviceGeneric):
for bond_id, bond in bonds.iteritems():
exec_cmd("ovs-vsctl del-port %s %s" % (br_name, bond_id))
+ def _add_flow_entries(self):
+ br_name = self._dev_config["name"]
+ entries = self._dev_config["ovs_conf"]["flow_entries"]
+
+ for entry in entries:
+ exec_cmd("ovs-ofctl add-flow %s '%s'" % (br_name, entry))
+
+ def _del_flow_entries(self):
+ br_name = self._dev_config["name"]
+ exec_cmd("ovs-ofctl del-flows %s" % (br_name))
+
def create(self):
dev_cfg = self._dev_config
br_name = dev_cfg["name"]
exec_cmd("ovs-vsctl add-br %s" % br_name)
+ self._add_internal_ports()
+ self._add_tunnels()
+
def destroy(self):
+ self._del_tunnels()
+ self._del_internal_ports()
+
dev_cfg = self._dev_config
br_name = dev_cfg["name"]
exec_cmd("ovs-vsctl del-br %s" % br_name)
def configure(self):
self._add_ports()
-
self._add_bonds()
+ self._add_flow_entries()
def deconfigure(self):
+ self._del_flow_entries()
self._del_bonds()
-
self._del_ports()
class NetConfigDeviceVEth(NetConfigDeviceGeneric):
--
2.8.2