From afe2e48522de2d17d99ea653f3de83aad154448e Mon Sep 17 00:00:00 2001 From: Edward Hope-Morley Date: Mon, 28 Sep 2015 12:18:48 +0100 Subject: [PATCH] [hopem,r=] Sync charmhelpers to get fix for LP 1500386 --- .../charmhelpers/contrib/openstack/context.py | 6 +++--- .../charmhelpers/contrib/openstack/neutron.py | 6 +++--- hooks/neutron_utils.py | 7 ++++--- unit_tests/test_neutron_utils.py | 20 +++++++++++++++++-- 4 files changed, 28 insertions(+), 11 deletions(-) diff --git a/hooks/charmhelpers/contrib/openstack/context.py b/hooks/charmhelpers/contrib/openstack/context.py index 34c26fa9..4e4c7a8b 100644 --- a/hooks/charmhelpers/contrib/openstack/context.py +++ b/hooks/charmhelpers/contrib/openstack/context.py @@ -1364,7 +1364,7 @@ class DataPortContext(NeutronPortContext): normalized.update({port: port for port in resolved if port in ports}) if resolved: - return {bridge: normalized[port] for port, bridge in + return {normalized[port]: bridge for port, bridge in six.iteritems(portmap) if port in normalized.keys()} return None @@ -1375,8 +1375,8 @@ class PhyNICMTUContext(DataPortContext): def __call__(self): ctxt = {} mappings = super(PhyNICMTUContext, self).__call__() - if mappings and mappings.values(): - ports = mappings.values() + if mappings and mappings.keys(): + ports = mappings.keys() napi_settings = NeutronAPIContext()() mtu = napi_settings.get('network_device_mtu') all_ports = set() diff --git a/hooks/charmhelpers/contrib/openstack/neutron.py b/hooks/charmhelpers/contrib/openstack/neutron.py index 55b2037f..2a59d86b 100644 --- a/hooks/charmhelpers/contrib/openstack/neutron.py +++ b/hooks/charmhelpers/contrib/openstack/neutron.py @@ -310,10 +310,10 @@ def parse_bridge_mappings(mappings): def parse_data_port_mappings(mappings, default_bridge='br-data'): """Parse data port mappings. - Mappings must be a space-delimited list of port:bridge mappings. + Mappings must be a space-delimited list of bridge:port. - Returns dict of the form {port:bridge} where port may be an mac address or - interface name. + Returns dict of the form {port:bridge} where ports may be mac addresses or + interface names. """ # NOTE(dosaboy): we use rvalue for key to allow multiple values to be diff --git a/hooks/neutron_utils.py b/hooks/neutron_utils.py index 78ee253b..8cf2514c 100644 --- a/hooks/neutron_utils.py +++ b/hooks/neutron_utils.py @@ -751,11 +751,12 @@ def configure_ovs(): bridgemaps = parse_bridge_mappings(config('bridge-mappings')) for provider, br in bridgemaps.iteritems(): add_bridge(br) - - if not portmaps or br not in portmaps: + if not portmaps: continue - add_bridge_port(br, portmaps[br], promisc=True) + for port, _br in portmaps.iteritems(): + if _br == br: + add_bridge_port(br, port, promisc=True) # Ensure this runs so that mtu is applied to data-port interfaces if # provided. diff --git a/unit_tests/test_neutron_utils.py b/unit_tests/test_neutron_utils.py index 60986941..d33bee05 100644 --- a/unit_tests/test_neutron_utils.py +++ b/unit_tests/test_neutron_utils.py @@ -221,9 +221,10 @@ class TestQuantumUtils(CharmTestCase): call('br-ex'), call('br-data') ]) - self.assertTrue(self.add_bridge_port.called) + calls = [call('br-data', 'eth0', promisc=True)] + self.add_bridge_port.assert_has_calls(calls) - # Now test with bridge:port format + # Now test with bridge:port format and bogus bridge self.test_config.set('data-port', 'br-foo:eth0') self.add_bridge.reset_mock() self.add_bridge_port.reset_mock() @@ -236,6 +237,21 @@ class TestQuantumUtils(CharmTestCase): # Not called since we have a bogus bridge in data-ports self.assertFalse(self.add_bridge_port.called) + # Now test with bridge:port format + self.test_config.set('bridge-mappings', 'net1:br1') + self.test_config.set('data-port', 'br1:eth0.100 br1:eth0.200') + self.add_bridge.reset_mock() + self.add_bridge_port.reset_mock() + neutron_utils.configure_ovs() + self.add_bridge.assert_has_calls([ + call('br-int'), + call('br-ex'), + call('br1') + ]) + calls = [call('br1', 'eth0.100', promisc=True), + call('br1', 'eth0.200', promisc=True)] + self.add_bridge_port.assert_has_calls(calls) + @patch.object(neutron_utils, 'git_install_requested') def test_do_openstack_upgrade(self, git_requested): git_requested.return_value = False