From 432e24027053b485335f1262aa6d150ee4176faa Mon Sep 17 00:00:00 2001 From: Dmitriy Uvarenkov Date: Tue, 2 Aug 2016 16:53:40 +0300 Subject: [PATCH] Fix iteration in floatingip's add dependencies method port.Port.FIXED_IPS can be None and we can't iterate by None. Closes bug: #1608973 Change-Id: I273c6383ab77adfbc5c51b94a2f3b2fa7cdbafc0 --- .../resources/openstack/neutron/floatingip.py | 6 ++-- .../neutron/test_neutron_floating_ip.py | 32 +++++++++++++++++++ 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/heat/engine/resources/openstack/neutron/floatingip.py b/heat/engine/resources/openstack/neutron/floatingip.py index 723783ccaf..908af5d0a7 100644 --- a/heat/engine/resources/openstack/neutron/floatingip.py +++ b/heat/engine/resources/openstack/neutron/floatingip.py @@ -330,9 +330,9 @@ class FloatingIPAssociation(neutron.NeutronResource): def port_on_subnet(resource, subnet): if not resource.has_interface('OS::Neutron::Port'): return False - for fixed_ip in resource.properties.get( - port.Port.FIXED_IPS): - + fixed_ips = resource.properties.get( + port.Port.FIXED_IPS) or [] + for fixed_ip in fixed_ips: port_subnet = ( fixed_ip.get(port.Port.FIXED_IP_SUBNET) or fixed_ip.get(port.Port.FIXED_IP_SUBNET_ID)) diff --git a/heat/tests/openstack/neutron/test_neutron_floating_ip.py b/heat/tests/openstack/neutron/test_neutron_floating_ip.py index d865768309..8d63e1e1ce 100644 --- a/heat/tests/openstack/neutron/test_neutron_floating_ip.py +++ b/heat/tests/openstack/neutron/test_neutron_floating_ip.py @@ -730,3 +730,35 @@ class NeutronFloatingIPTest(common.HeatTestCase): scheduler.TaskRunner(p.delete)() self.m.VerifyAll() + + def test_add_dependencies(self): + t = template_format.parse(neutron_floating_template) + stack = utils.parse_stack(t) + fipa = stack['floating_ip_assoc'] + port = stack['port_floating'] + r_int = stack['router_interface'] + deps = mock.MagicMock() + dep_list = [] + + def iadd(obj): + dep_list.append(obj[1]) + deps.__iadd__.side_effect = iadd + deps.graph.return_value = {fipa: [port]} + fipa.add_dependencies(deps) + self.assertEqual([r_int], dep_list) + + def test_add_dependencies_without_fixed_ips_in_port(self): + t = template_format.parse(neutron_floating_template) + del t['resources']['port_floating']['properties']['fixed_ips'] + stack = utils.parse_stack(t) + fipa = stack['floating_ip_assoc'] + port = stack['port_floating'] + deps = mock.MagicMock() + dep_list = [] + + def iadd(obj): + dep_list.append(obj[1]) + deps.__iadd__.side_effect = iadd + deps.graph.return_value = {fipa: [port]} + fipa.add_dependencies(deps) + self.assertEqual([], dep_list)