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

Commit

Permalink
Add support for name replacement in OVS_EXTRA
Browse files Browse the repository at this point in the history
While primarily to work around a heat issue that prevents intrinsic
functions from being used for parameters being passed to NetworkConfig
resources, this could be generally useful in other ways.

Partial-Bug: #1640812
Change-Id: Ie9001f1d41f514666a44c8d9295b78a13e2108dc
  • Loading branch information
beagles committed Nov 15, 2016
1 parent 3199064 commit 38a4ffb
Show file tree
Hide file tree
Showing 4 changed files with 102 additions and 13 deletions.
24 changes: 13 additions & 11 deletions os_net_config/objects.py
Expand Up @@ -131,6 +131,12 @@ def _mapped_nics(nic_mapping=None):
return _MAPPED_NICS


def format_ovs_extra(obj, templates):
"""Map OVS object properties into a string to be used for ovs_extra."""

return [t.format(name=obj.name) for t in templates or []]


class Route(object):
"""Base class for network routes."""

Expand Down Expand Up @@ -395,15 +401,14 @@ def __init__(self, name, use_dhcp=False, use_dhcpv6=False, addresses=None,
addresses = addresses or []
routes = routes or []
members = members or []
ovs_extra = ovs_extra or []
dns_servers = dns_servers or []
super(OvsBridge, self).__init__(name, use_dhcp, use_dhcpv6, addresses,
routes, mtu, False, nic_mapping,
persist_mapping, defroute,
dhclient_args, dns_servers)
self.members = members
self.ovs_options = ovs_options
self.ovs_extra = ovs_extra
self.ovs_extra = format_ovs_extra(self, ovs_extra)
for member in self.members:
member.bridge_name = name
if not isinstance(member, OvsTunnel):
Expand Down Expand Up @@ -460,7 +465,7 @@ def __init__(self, name, use_dhcp=False, use_dhcpv6=False, addresses=None,
dns_servers)
self.members = members or []
self.ovs_options = ovs_options
self.ovs_extra = ovs_extra or []
self.ovs_extra = format_ovs_extra(self, ovs_extra)
for member in self.members:
member.bridge_name = name
if not isinstance(member, OvsTunnel) and \
Expand Down Expand Up @@ -808,15 +813,14 @@ def __init__(self, name, use_dhcp=False, use_dhcpv6=False, addresses=None,
addresses = addresses or []
routes = routes or []
members = members or []
ovs_extra = ovs_extra or []
dns_servers = dns_servers or []
super(OvsBond, self).__init__(name, use_dhcp, use_dhcpv6, addresses,
routes, mtu, primary, nic_mapping,
persist_mapping, defroute, dhclient_args,
dns_servers)
self.members = members
self.ovs_options = ovs_options
self.ovs_extra = ovs_extra
self.ovs_extra = format_ovs_extra(self, ovs_extra)
for member in self.members:
if member.primary:
if self.primary_interface_name:
Expand Down Expand Up @@ -870,15 +874,14 @@ def __init__(self, name, use_dhcp=False, use_dhcpv6=False, addresses=None,
ovs_extra=None):
addresses = addresses or []
routes = routes or []
ovs_extra = ovs_extra or []
dns_servers = dns_servers or []
super(OvsTunnel, self).__init__(name, use_dhcp, use_dhcpv6, addresses,
routes, mtu, primary, nic_mapping,
persist_mapping, defroute,
dhclient_args, dns_servers)
self.tunnel_type = tunnel_type
self.ovs_options = ovs_options or []
self.ovs_extra = ovs_extra or []
self.ovs_extra = format_ovs_extra(self, ovs_extra)

@staticmethod
def from_json(json):
Expand All @@ -902,7 +905,6 @@ def __init__(self, name, use_dhcp=False, use_dhcpv6=False, addresses=None,
ovs_options=None, ovs_extra=None):
addresses = addresses or []
routes = routes or []
ovs_extra = ovs_extra or []
dns_servers = dns_servers or []
super(OvsPatchPort, self).__init__(name, use_dhcp, use_dhcpv6,
addresses, routes, mtu, primary,
Expand All @@ -912,7 +914,7 @@ def __init__(self, name, use_dhcp=False, use_dhcpv6=False, addresses=None,
self.bridge_name = bridge_name
self.peer = peer
self.ovs_options = ovs_options or []
self.ovs_extra = ovs_extra or []
self.ovs_extra = format_ovs_extra(self, ovs_extra)

@staticmethod
def from_json(json):
Expand Down Expand Up @@ -967,7 +969,7 @@ def __init__(self, name, use_dhcp=False, use_dhcpv6=False, addresses=None,
dns_servers)
self.members = members or []
self.ovs_options = ovs_options or []
self.ovs_extra = ovs_extra or []
self.ovs_extra = format_ovs_extra(self, ovs_extra)
self.driver = driver

@staticmethod
Expand Down Expand Up @@ -1024,7 +1026,7 @@ def __init__(self, name, use_dhcp=False, use_dhcpv6=False, addresses=None,
defroute, dhclient_args, dns_servers)
self.members = members or []
self.ovs_options = ovs_options
self.ovs_extra = ovs_extra or []
self.ovs_extra = format_ovs_extra(self, ovs_extra)

for member in self.members:
if member.primary:
Expand Down
21 changes: 19 additions & 2 deletions os_net_config/tests/test_impl_eni.py
Expand Up @@ -72,7 +72,7 @@

_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"
" -- br-set-external-id br0 bridge-id br0\n"


_VLAN_NO_IP = """auto vlan5
Expand Down Expand Up @@ -210,7 +210,24 @@ def test_interface_mac(name):
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"
ovs_extra = "br-set-external-id br0 bridge-id br0"
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_network_ovs_bridge_with_dhcp_and_primary_with_ovs_format(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 {name} bridge-id {name}"
bridge = objects.OvsBridge('br0', use_dhcp=True,
members=[interface],
ovs_extra=[ovs_extra])
Expand Down
16 changes: 16 additions & 0 deletions os_net_config/tests/test_impl_ifcfg.py
Expand Up @@ -577,6 +577,22 @@ def test_interface_mac(name):
self.assertEqual(_OVS_BRIDGE_DHCP_OVS_EXTRA,
self.provider.bridge_data['br-ctlplane'])

def test_network_ovs_bridge_with_dhcp_primary_interface_with_format(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 {name} bridge-id {name}"
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.bridge_data['br-ctlplane'])

def test_network_ivs_with_uplink_and_interface(self):
interface = objects.Interface('em1')
v4_addr = objects.Address('172.16.2.7/24')
Expand Down
54 changes: 54 additions & 0 deletions os_net_config/tests/test_objects.py
Expand Up @@ -646,6 +646,42 @@ def test_from_json(self):
["ovs extra"],
tun0.ovs_extra)

def test_ovs_extra_formatting(self):
data = """{
"type": "ovs_bridge",
"name": "br-foo",
"ovs_extra": [
"set {name} fail_mode=standalone"
],
"members": [{
"type": "ovs_tunnel",
"name": "tun0",
"tunnel_type": "gre",
"ovs_options": [
"remote_ip=192.168.1.1"
],
"ovs_extra": [
"ovs extra",
"ovs {name} extra"
]
}]
}
"""
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)
tun0 = bridge.members[0]
self.assertEqual("tun0", tun0.name)
self.assertFalse(tun0.ovs_port)
self.assertEqual("br-foo", tun0.bridge_name)
self.assertEqual("gre", tun0.tunnel_type)
self.assertEqual(
["options:remote_ip=192.168.1.1"],
tun0.ovs_options)
self.assertEqual(
["ovs extra", "ovs tun0 extra"],
tun0.ovs_extra)


class TestOvsPatchPort(base.TestCase):

Expand All @@ -662,6 +698,24 @@ def test_from_json(self):
self.assertEqual("br-ex", patch_port.bridge_name)
self.assertEqual("br-ex-patch", patch_port.peer)

def test_from_json_with_extra(self):
data = """{
"type": "ovs_patch_port",
"name": "br-pub-patch",
"bridge_name": "br-ex",
"peer": "br-ex-patch",
"ovs_extra": [
"ovs {name} extra"
]
}
"""
patch_port = objects.object_from_json(json.loads(data))
self.assertEqual(["ovs br-pub-patch extra"],
patch_port.ovs_extra)
self.assertEqual("br-pub-patch", patch_port.name)
self.assertEqual("br-ex", patch_port.bridge_name)
self.assertEqual("br-ex-patch", patch_port.peer)


class TestIbInterface(base.TestCase):

Expand Down

0 comments on commit 38a4ffb

Please sign in to comment.