Add support for ovs_extra.

Adds support for ovs_extra to the OVS Bridge and
OVS bond objects.
This commit is contained in:
Dan Prince
2014-08-22 10:38:17 -04:00
parent 3b5e878987
commit 941cbfec49
5 changed files with 75 additions and 9 deletions

View File

@@ -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):

View File

@@ -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=[]):

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)