Skip to content
This repository has been archived by the owner on Feb 29, 2024. It is now read-only.

Commit

Permalink
Add ovs_fail_mode option for OVS bridges
Browse files Browse the repository at this point in the history
This patch adds an option "ovs_fail_mode" with a default value of
'standalone'. This is written to the interface configuration data as
part of the ovs_extra options.

Closes-Bug: #1640812

Change-Id: I2f30e56ff9fbda7beac21d95d15dbde0b01ba451
  • Loading branch information
beagles committed Nov 15, 2016
1 parent 38a4ffb commit e479535
Show file tree
Hide file tree
Showing 4 changed files with 80 additions and 9 deletions.
25 changes: 19 additions & 6 deletions os_net_config/objects.py
Expand Up @@ -25,6 +25,8 @@

_MAPPED_NICS = None

DEFAULT_OVS_BRIDGE_FAIL_MODE = 'standalone'


class InvalidConfigException(ValueError):
pass
Expand Down Expand Up @@ -397,7 +399,8 @@ class OvsBridge(_BaseOpts):
def __init__(self, name, use_dhcp=False, use_dhcpv6=False, addresses=None,
routes=None, mtu=None, members=None, ovs_options=None,
ovs_extra=None, nic_mapping=None, persist_mapping=False,
defroute=True, dhclient_args=None, dns_servers=None):
defroute=True, dhclient_args=None, dns_servers=None,
fail_mode=None):
addresses = addresses or []
routes = routes or []
members = members or []
Expand All @@ -408,6 +411,9 @@ def __init__(self, name, use_dhcp=False, use_dhcpv6=False, addresses=None,
dhclient_args, dns_servers)
self.members = members
self.ovs_options = ovs_options
ovs_extra = ovs_extra or []
if fail_mode:
ovs_extra.append('set bridge {name} fail_mode=%s' % fail_mode)
self.ovs_extra = format_ovs_extra(self, ovs_extra)
for member in self.members:
member.bridge_name = name
Expand All @@ -430,7 +436,8 @@ def from_json(json):
dhclient_args, dns_servers) = _BaseOpts.base_opts_from_json(
json, include_primary=False)
ovs_options = json.get('ovs_options')
ovs_extra = json.get('ovs_extra', [])
ovs_extra = json.get('ovs_extra')
fail_mode = json.get('ovs_fail_mode', DEFAULT_OVS_BRIDGE_FAIL_MODE)
members = []

# members
Expand All @@ -448,7 +455,8 @@ def from_json(json):
members=members, ovs_options=ovs_options,
ovs_extra=ovs_extra, nic_mapping=nic_mapping,
persist_mapping=persist_mapping, defroute=defroute,
dhclient_args=dhclient_args, dns_servers=dns_servers)
dhclient_args=dhclient_args, dns_servers=dns_servers,
fail_mode=fail_mode)


class OvsUserBridge(_BaseOpts):
Expand All @@ -457,14 +465,18 @@ class OvsUserBridge(_BaseOpts):
def __init__(self, name, use_dhcp=False, use_dhcpv6=False, addresses=None,
routes=None, mtu=None, members=None, ovs_options=None,
ovs_extra=None, nic_mapping=None, persist_mapping=False,
defroute=True, dhclient_args=None, dns_servers=None):
defroute=True, dhclient_args=None, dns_servers=None,
fail_mode=None):
super(OvsUserBridge, self).__init__(name, use_dhcp, use_dhcpv6,
addresses, routes, mtu, False,
nic_mapping, persist_mapping,
defroute, dhclient_args,
dns_servers)
self.members = members or []
self.ovs_options = ovs_options
ovs_extra = ovs_extra or []
if fail_mode:
ovs_extra.append('set bridge {name} fail_mode=%s' % fail_mode)
self.ovs_extra = format_ovs_extra(self, ovs_extra)
for member in self.members:
member.bridge_name = name
Expand All @@ -489,7 +501,8 @@ def from_json(json):
dhclient_args, dns_servers) = _BaseOpts.base_opts_from_json(
json, include_primary=False)
ovs_options = json.get('ovs_options')
ovs_extra = json.get('ovs_extra', [])
ovs_extra = json.get('ovs_extra')
fail_mode = json.get('ovs_fail_mode', DEFAULT_OVS_BRIDGE_FAIL_MODE)
members = []

# members
Expand All @@ -508,7 +521,7 @@ def from_json(json):
ovs_extra=ovs_extra, nic_mapping=nic_mapping,
persist_mapping=persist_mapping,
defroute=defroute, dhclient_args=dhclient_args,
dns_servers=dns_servers)
dns_servers=dns_servers, fail_mode=fail_mode)


class LinuxBridge(_BaseOpts):
Expand Down
29 changes: 28 additions & 1 deletion os_net_config/tests/test_impl_eni.py
Expand Up @@ -66,10 +66,15 @@
pre-up ip addr flush dev eth0
"""

_OVS_BRIDGE_DHCP_STANDALONE = _OVS_BRIDGE_DHCP + \
" ovs_extra set bridge br0 fail_mode=standalone\n"

_OVS_BRIDGE_DHCP_SECURE = _OVS_BRIDGE_DHCP + \
" ovs_extra set bridge br0 fail_mode=secure\n"

_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 br0 bridge-id br0\n"
Expand Down Expand Up @@ -188,6 +193,28 @@ def test_network_ovs_bridge_with_dhcp(self):
self.assertEqual(_OVS_PORT_IFACE, self.get_interface_config())
self.assertEqual(_OVS_BRIDGE_DHCP, self.provider.bridges['br0'])

def test_network_ovs_bridge_with_standalone_fail_mode(self):
interface = self._default_interface()
bridge = objects.OvsBridge('br0', use_dhcp=True,
members=[interface],
fail_mode='standalone')
self.provider.add_bridge(bridge)
self.provider.add_interface(interface)
self.assertEqual(_OVS_PORT_IFACE, self.get_interface_config())
self.assertEqual(_OVS_BRIDGE_DHCP_STANDALONE,
self.provider.bridges['br0'])

def test_network_ovs_bridge_with_secure_fail_mode(self):
interface = self._default_interface()
bridge = objects.OvsBridge('br0', use_dhcp=True,
members=[interface],
fail_mode='secure')
self.provider.add_bridge(bridge)
self.provider.add_interface(interface)
self.assertEqual(_OVS_PORT_IFACE, self.get_interface_config())
self.assertEqual(_OVS_BRIDGE_DHCP_SECURE,
self.provider.bridges['br0'])

def test_network_ovs_bridge_with_dhcp_and_primary_interface(self):

def test_interface_mac(name):
Expand Down
29 changes: 29 additions & 0 deletions os_net_config/tests/test_impl_ifcfg.py
Expand Up @@ -143,6 +143,13 @@
OVSDHCPINTERFACES="em1"
"""

_OVS_BRIDGE_DHCP_STANDALONE = _OVS_BRIDGE_DHCP + \
"OVS_EXTRA=\"set bridge br-ctlplane fail_mode=standalone\"\n"

_OVS_BRIDGE_DHCP_SECURE = _OVS_BRIDGE_DHCP + \
"OVS_EXTRA=\"set bridge br-ctlplane fail_mode=secure\"\n"


_LINUX_BRIDGE_DHCP = """# This file is autogenerated by os-net-config
DEVICE=br-ctlplane
ONBOOT=yes
Expand Down Expand Up @@ -499,6 +506,28 @@ def test_network_ovs_bridge_with_dhcp(self):
self.assertEqual(_OVS_BRIDGE_DHCP,
self.provider.bridge_data['br-ctlplane'])

def test_network_ovs_bridge_with_standalone_fail_mode(self):
interface = objects.Interface('em1')
bridge = objects.OvsBridge('br-ctlplane', use_dhcp=True,
members=[interface],
fail_mode='standalone')
self.provider.add_interface(interface)
self.provider.add_bridge(bridge)
self.assertEqual(_OVS_INTERFACE, self.get_interface_config())
self.assertEqual(_OVS_BRIDGE_DHCP_STANDALONE,
self.provider.bridge_data['br-ctlplane'])

def test_network_ovs_bridge_with_secure_fail_mode(self):
interface = objects.Interface('em1')
bridge = objects.OvsBridge('br-ctlplane', use_dhcp=True,
members=[interface],
fail_mode='secure')
self.provider.add_interface(interface)
self.provider.add_bridge(bridge)
self.assertEqual(_OVS_INTERFACE, self.get_interface_config())
self.assertEqual(_OVS_BRIDGE_DHCP_SECURE,
self.provider.bridge_data['br-ctlplane'])

def test_network_linux_bridge_with_dhcp(self):
interface = objects.Interface('em1')
bridge = objects.LinuxBridge('br-ctlplane', use_dhcp=True,
Expand Down
6 changes: 4 additions & 2 deletions os_net_config/tests/test_objects.py
Expand Up @@ -651,7 +651,7 @@ def test_ovs_extra_formatting(self):
"type": "ovs_bridge",
"name": "br-foo",
"ovs_extra": [
"set {name} fail_mode=standalone"
"set bridge {name} something"
],
"members": [{
"type": "ovs_tunnel",
Expand All @@ -669,7 +669,9 @@ def test_ovs_extra_formatting(self):
"""
bridge = objects.object_from_json(json.loads(data))
self.assertEqual("br-foo", bridge.name)
self.assertEqual(["set br-foo fail_mode=standalone"], bridge.ovs_extra)
self.assertEqual(["set bridge br-foo something",
"set bridge br-foo fail_mode=standalone"],
bridge.ovs_extra)
tun0 = bridge.members[0]
self.assertEqual("tun0", tun0.name)
self.assertFalse(tun0.ovs_port)
Expand Down

0 comments on commit e479535

Please sign in to comment.