diff options
author | Dan Prince <dprince@redhat.com> | 2014-08-22 10:38:17 -0400 |
---|---|---|
committer | Dan Prince <dprince@redhat.com> | 2014-08-22 10:38:17 -0400 |
commit | 941cbfec49a3ee2d2ff6aa3fa054fb2559886ca4 (patch) | |
tree | 50b7273780a84fe7841bb78c08649d28782fb4e8 | |
parent | 3b5e8789871e1722f8a5122236893730cf3d1751 (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.py | 11 | ||||
-rw-r--r-- | os_net_config/impl_ifcfg.py | 11 | ||||
-rw-r--r-- | os_net_config/objects.py | 15 | ||||
-rw-r--r-- | os_net_config/tests/test_impl_eni.py | 23 | ||||
-rw-r--r-- | os_net_config/tests/test_impl_ifcfg.py | 24 |
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) |