aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDan Prince <dprince@redhat.com>2014-08-22 10:38:17 -0400
committerDan Prince <dprince@redhat.com>2014-08-22 10:38:17 -0400
commit941cbfec49a3ee2d2ff6aa3fa054fb2559886ca4 (patch)
tree50b7273780a84fe7841bb78c08649d28782fb4e8
parent3b5e8789871e1722f8a5122236893730cf3d1751 (diff)
Add support for ovs_extra.
Adds support for ovs_extra to the OVS Bridge and OVS bond objects.
-rw-r--r--os_net_config/impl_eni.py11
-rw-r--r--os_net_config/impl_ifcfg.py11
-rw-r--r--os_net_config/objects.py15
-rw-r--r--os_net_config/tests/test_impl_eni.py23
-rw-r--r--os_net_config/tests/test_impl_ifcfg.py24
5 files changed, 75 insertions, 9 deletions
diff --git a/os_net_config/impl_eni.py b/os_net_config/impl_eni.py
index 944893e..3dea6c0 100644
--- a/os_net_config/impl_eni.py
+++ b/os_net_config/impl_eni.py
@@ -47,6 +47,7 @@ class ENINetConfig(os_net_config.NetConfig):
def _add_common(self, interface, static_addr=None):
+ ovs_extra = []
data = ""
address_data = ""
if static_addr:
@@ -94,9 +95,9 @@ class ENINetConfig(os_net_config.NetConfig):
data += " pre-up ip addr flush dev %s\n" % mem.name
if interface.primary_interface_name:
mac = utils.interface_mac(interface.primary_interface_name)
- data += (" ovs_extra set bridge %s "
- "other-config:hwaddr=%s\n"
- % (interface.name, mac))
+ ovs_extra.append ("set bridge %s other-config:hwaddr=%s" %
+ (interface.name, mac))
+ ovs_extra.extend(interface.ovs_extra)
elif interface.ovs_port:
if isinstance(interface, objects.Vlan):
data += "auto vlan%i\n" % interface.vlan_id
@@ -127,6 +128,10 @@ class ENINetConfig(os_net_config.NetConfig):
data += address_data
if interface.mtu != 1500:
data += " mtu %i\n" % interface.mtu
+
+ if ovs_extra:
+ data += " ovs_extra %s\n" % " -- ".join(ovs_extra)
+
return data
def add_interface(self, interface):
diff --git a/os_net_config/impl_ifcfg.py b/os_net_config/impl_ifcfg.py
index ab6bf4d..1089707 100644
--- a/os_net_config/impl_ifcfg.py
+++ b/os_net_config/impl_ifcfg.py
@@ -56,6 +56,9 @@ class IfcfgNetConfig(os_net_config.NetConfig):
logger.info('Ifcfg net config provider created.')
def _add_common(self, base_opt):
+
+ ovs_extra = []
+
data = "DEVICE=%s\n" % base_opt.name
data += "ONBOOT=yes\n"
data += "HOTPLUG=no\n"
@@ -83,10 +86,11 @@ class IfcfgNetConfig(os_net_config.NetConfig):
data += ("OVSDHCPINTERFACES=\"%s\"\n" % " ".join(members))
if base_opt.primary_interface_name:
mac = utils.interface_mac(base_opt.primary_interface_name)
- data += ("OVS_EXTRA=\"set bridge %s "
- "other-config:hwaddr=%s\"\n" % (base_opt.name, mac))
+ ovs_extra.append("set bridge %s other-config:hwaddr=%s" %
+ (base_opt.name, mac))
if base_opt.ovs_options:
data += "OVS_OPTIONS=\"%s\"\n" % base_opt.ovs_options
+ ovs_extra.extend(base_opt.ovs_extra)
elif isinstance(base_opt, objects.OvsBond):
data += "DEVICETYPE=ovs\n"
data += "TYPE=OVSBond\n"
@@ -97,6 +101,7 @@ class IfcfgNetConfig(os_net_config.NetConfig):
data += ("BOND_IFACES=\"%s\"\n" % " ".join(members))
if base_opt.ovs_options:
data += "OVS_OPTIONS=\"%s\"\n" % base_opt.ovs_options
+ ovs_extra.extend(base_opt.ovs_extra)
else:
if base_opt.use_dhcp:
data += "BOOTPROTO=dhcp\n"
@@ -124,6 +129,8 @@ class IfcfgNetConfig(os_net_config.NetConfig):
first_v6 = v6_addresses[0]
data += "IPV6_AUTOCONF=no\n"
data += "IPV6ADDR=%s\n" % first_v6.ip
+ if ovs_extra:
+ data += "OVS_EXTRA=\"%s\"\n" % " -- ".join(ovs_extra)
return data
def _add_routes(self, interface_name, routes=[]):
diff --git a/os_net_config/objects.py b/os_net_config/objects.py
index 12b1c99..4a43528 100644
--- a/os_net_config/objects.py
+++ b/os_net_config/objects.py
@@ -216,11 +216,13 @@ class OvsBridge(_BaseOpts):
"""Base class for OVS bridges."""
def __init__(self, name, use_dhcp=False, use_dhcpv6=False, addresses=[],
- routes=[], mtu=1500, members=[], ovs_options=None):
+ routes=[], mtu=1500, members=[], ovs_options=None,
+ ovs_extra=[]):
super(OvsBridge, self).__init__(name, use_dhcp, use_dhcpv6, addresses,
routes, mtu, False)
self.members = members
self.ovs_options = ovs_options
+ self.ovs_extra = ovs_extra
for member in self.members:
member.bridge_name = name
member.ovs_port = True
@@ -238,6 +240,7 @@ class OvsBridge(_BaseOpts):
name = _get_required_field(json, 'name', 'OvsBridge')
opts = _BaseOpts.base_opts_from_json(json, include_primary=False)
ovs_options = json.get('ovs_options')
+ ovs_extra = json.get('ovs_extra', [])
members = []
# members
@@ -250,7 +253,8 @@ class OvsBridge(_BaseOpts):
msg = 'Members must be a list.'
raise InvalidConfigException(msg)
- return OvsBridge(name, *opts, members=members, ovs_options=ovs_options)
+ return OvsBridge(name, *opts, members=members, ovs_options=ovs_options,
+ ovs_extra=ovs_extra)
class OvsBond(_BaseOpts):
@@ -258,11 +262,12 @@ class OvsBond(_BaseOpts):
def __init__(self, name, use_dhcp=False, use_dhcpv6=False, addresses=[],
routes=[], mtu=1500, primary=False, members=[],
- ovs_options=None):
+ ovs_options=None, ovs_extra=[]):
super(OvsBond, self).__init__(name, use_dhcp, use_dhcpv6, addresses,
routes, mtu, primary)
self.members = members
self.ovs_options = ovs_options
+ self.ovs_extra = ovs_extra
for member in self.members:
if member.primary:
if self.primary_interface_name:
@@ -278,6 +283,7 @@ class OvsBond(_BaseOpts):
name = _get_required_field(json, 'name', 'OvsBond')
opts = _BaseOpts.base_opts_from_json(json)
ovs_options = json.get('ovs_options')
+ ovs_extra = json.get('ovs_extra', [])
members = []
# members
@@ -290,4 +296,5 @@ class OvsBond(_BaseOpts):
msg = 'Members must be a list.'
raise InvalidConfigException(msg)
- return OvsBond(name, *opts, members=members, ovs_options=ovs_options)
+ return OvsBond(name, *opts, members=members, ovs_options=ovs_options,
+ ovs_extra=ovs_extra)
diff --git a/os_net_config/tests/test_impl_eni.py b/os_net_config/tests/test_impl_eni.py
index a7fba6f..701806f 100644
--- a/os_net_config/tests/test_impl_eni.py
+++ b/os_net_config/tests/test_impl_eni.py
@@ -56,6 +56,12 @@ iface br0 inet dhcp
_OVS_BRIDGE_DHCP_PRIMARY_INTERFACE = _OVS_BRIDGE_DHCP + \
" ovs_extra set bridge br0 other-config:hwaddr=a1:b2:c3:d4:e5\n"
+
+_OVS_BRIDGE_DHCP_OVS_EXTRA = _OVS_BRIDGE_DHCP + \
+ " ovs_extra set bridge br0 other-config:hwaddr=a1:b2:c3:d4:e5" + \
+ " -- br-set-external-id br-ctlplane bridge-id br-ctlplane\n"
+
+
_VLAN_NO_IP = """auto vlan5
iface vlan5 inet manual
vlan-raw-device eth0
@@ -164,6 +170,23 @@ class TestENINetConfig(base.TestCase):
self.assertEqual(_OVS_BRIDGE_DHCP_PRIMARY_INTERFACE,
self.provider.bridges['br0'])
+ def test_network_ovs_bridge_with_dhcp_and_primary_with_ovs_extra(self):
+
+ def test_interface_mac(name):
+ return "a1:b2:c3:d4:e5"
+ self.stubs.Set(utils, 'interface_mac', test_interface_mac)
+
+ interface = objects.Interface(self.if_name, primary=True)
+ ovs_extra = "br-set-external-id br-ctlplane bridge-id br-ctlplane"
+ bridge = objects.OvsBridge('br0', use_dhcp=True,
+ members=[interface],
+ ovs_extra=[ovs_extra])
+ self.provider.add_bridge(bridge)
+ self.provider.add_interface(interface)
+ self.assertEqual(_OVS_PORT_IFACE, self.get_interface_config())
+ self.assertEqual(_OVS_BRIDGE_DHCP_OVS_EXTRA,
+ self.provider.bridges['br0'])
+
def test_vlan(self):
vlan = objects.Vlan('eth0', 5)
self.provider.add_vlan(vlan)
diff --git a/os_net_config/tests/test_impl_ifcfg.py b/os_net_config/tests/test_impl_ifcfg.py
index 9038987..841260a 100644
--- a/os_net_config/tests/test_impl_ifcfg.py
+++ b/os_net_config/tests/test_impl_ifcfg.py
@@ -69,6 +69,12 @@ OVSDHCPINTERFACES="em1"
_OVS_BRIDGE_DHCP_PRIMARY_INTERFACE = _OVS_BRIDGE_DHCP + \
"OVS_EXTRA=\"set bridge br-ctlplane other-config:hwaddr=a1:b2:c3:d4:e5\"\n"
+
+_OVS_BRIDGE_DHCP_OVS_EXTRA = _OVS_BRIDGE_DHCP + \
+ "OVS_EXTRA=\"set bridge br-ctlplane other-config:hwaddr=a1:b2:c3:d4:e5" + \
+ " -- br-set-external-id br-ctlplane bridge-id br-ctlplane\"\n"
+
+
_BASE_VLAN = """DEVICE=vlan5
ONBOOT=yes
HOTPLUG=no
@@ -175,6 +181,24 @@ class TestIfcfgNetConfig(base.TestCase):
self.assertEqual(_OVS_BRIDGE_DHCP_PRIMARY_INTERFACE,
self.provider.bridges['br-ctlplane'])
+
+ def test_network_ovs_bridge_with_dhcp_primary_interface_with_extra(self):
+ def test_interface_mac(name):
+ return "a1:b2:c3:d4:e5"
+ self.stubs.Set(utils, 'interface_mac', test_interface_mac)
+
+ interface = objects.Interface('em1', primary=True)
+ ovs_extra = "br-set-external-id br-ctlplane bridge-id br-ctlplane"
+ bridge = objects.OvsBridge('br-ctlplane', use_dhcp=True,
+ members=[interface],
+ ovs_extra=[ovs_extra])
+ self.provider.add_interface(interface)
+ self.provider.add_bridge(bridge)
+ self.assertEqual(_OVS_INTERFACE, self.get_interface_config())
+ self.assertEqual(_OVS_BRIDGE_DHCP_OVS_EXTRA,
+ self.provider.bridges['br-ctlplane'])
+
+
def test_add_vlan(self):
vlan = objects.Vlan('em1', 5)
self.provider.add_vlan(vlan)