diff --git a/charmhelpers/contrib/network/ovs/__init__.py b/charmhelpers/contrib/network/ovs/__init__.py index 3d03cb049..51e25f7b0 100644 --- a/charmhelpers/contrib/network/ovs/__init__.py +++ b/charmhelpers/contrib/network/ovs/__init__.py @@ -649,6 +649,11 @@ def patch_ports_on_bridge(bridge): interface['options']['peer'])), interface['options']['peer']) yield(Patch(this_end, other_end)) + # We expect one result and it is ok if it turns out to be a port + # for a different bridge. However we need a break here to satisfy + # the for/else check which is in place to detect interface refering + # to non-existent port. + break else: raise ValueError('Port for interface named "{}" does unexpectedly ' 'not exist.'.format(interface['name'])) diff --git a/tests/contrib/network/ovs/test_ovs.py b/tests/contrib/network/ovs/test_ovs.py index d653e126a..b964c992f 100644 --- a/tests/contrib/network/ovs/test_ovs.py +++ b/tests/contrib/network/ovs/test_ovs.py @@ -219,8 +219,15 @@ def test_bridge_for_port(self): def test_patch_ports_on_bridge(self): self.patch_object(ovs.ch_ovsdb, 'SimpleOVSDB') self.patch_object(ovs, 'bridge_for_port') + self.patch_object(ovs, 'uuid_for_port') ovsdb = mock.MagicMock() ovsdb.interface.find.return_value = [ + { + 'name': 'fake-interface-with-port-for-other-bridge', + 'options': { + 'peer': 'fake-peer' + }, + }, { 'name': 'fake-interface', 'options': { @@ -229,14 +236,18 @@ def test_patch_ports_on_bridge(self): }, ] port_uuid = uuid.UUID('0d43905b-f80e-4eaa-9feb-a9017da8c6bc') - ovsdb.port.find.return_value = [ - { + ovsdb.port.find.side_effect = [ + [{ + '_uuid': port_uuid, + 'name': 'port-on-other-bridge', + }], + [{ '_uuid': port_uuid, 'name': 'fake-port', - }, + }], ] self.SimpleOVSDB.return_value = ovsdb - self.bridge_for_port.side_effect = ['fake-bridge', 'fake-peer-bridge'] + self.bridge_for_port.side_effect = ['some-other-bridge', 'fake-bridge', 'fake-peer-bridge'] for patch in ovs.patch_ports_on_bridge('fake-bridge'): self.assertEquals( patch, @@ -251,6 +262,7 @@ def test_patch_ports_on_bridge(self): break else: assert 0, 'Expected generator to provide output' + ovsdb.port.find.side_effect = None ovsdb.port.find.return_value = [] with self.assertRaises(ValueError): for patch in ovs.patch_ports_on_bridge('fake-bridge'):