From acf010f463cb583d073113f17d88864c94ef7503 Mon Sep 17 00:00:00 2001 From: Monty Taylor Date: Fri, 12 Aug 2016 07:02:11 -0500 Subject: [PATCH] Don't supplement floating ip list on clouds without Some clouds don't have floating ips at all. We know who they are. Don't try to supplement them. Change-Id: Ib4965ab53f4142811313481cb4e7a70aeeea5b48 --- shade/meta.py | 16 ++++++++--- shade/openstackcloud.py | 6 ++++ shade/tests/unit/test_meta.py | 53 +++++++++++++++++++++++++++++++++++ 3 files changed, 71 insertions(+), 4 deletions(-) diff --git a/shade/meta.py b/shade/meta.py index 158750bb2..a0abaada3 100644 --- a/shade/meta.py +++ b/shade/meta.py @@ -296,10 +296,18 @@ def _get_suplemental_addresses(cloud, server): # We have a floating IP that nova knows about, do nothing return server['addresses'] fixed_ip_mapping[address['addr']] = name - for fip in cloud.list_floating_ips(): - if fip['fixed_ip_address'] in fixed_ip_mapping: - fixed_net = fixed_ip_mapping[fip['fixed_ip_address']] - server['addresses'][fixed_net].append(_make_address_dict(fip)) + try: + if cloud._has_floating_ips(): + for fip in cloud.list_floating_ips(): + if fip['fixed_ip_address'] in fixed_ip_mapping: + fixed_net = fixed_ip_mapping[fip['fixed_ip_address']] + server['addresses'][fixed_net].append( + _make_address_dict(fip)) + except exc.OpenStackCloudException: + # If something goes wrong with a cloud call, that's cool - this is + # an attempt to provide additional data and should not block forward + # progress + pass return server['addresses'] diff --git a/shade/openstackcloud.py b/shade/openstackcloud.py index 8d82a2e6f..9051c3b65 100644 --- a/shade/openstackcloud.py +++ b/shade/openstackcloud.py @@ -1772,6 +1772,12 @@ class OpenStackCloud(object): self._find_interesting_networks() return self._internal_networks + def _has_floating_ips(self): + if not self._floating_ip_source: + return False + else: + return self._floating_ip_source.lower() in ('nova', 'neutron') + def _use_neutron_floating(self): return (self.has_service('network') and self._floating_ip_source == 'neutron') diff --git a/shade/tests/unit/test_meta.py b/shade/tests/unit/test_meta.py index 406903bf5..6082b6337 100644 --- a/shade/tests/unit/test_meta.py +++ b/shade/tests/unit/test_meta.py @@ -235,6 +235,59 @@ class TestMeta(base.TestCase): mock_list_networks.assert_called_once_with() mock_list_floating_ips.assert_called_once_with() + @mock.patch.object(shade.OpenStackCloud, 'list_floating_ips') + @mock.patch.object(shade.OpenStackCloud, 'list_subnets') + @mock.patch.object(shade.OpenStackCloud, 'list_server_security_groups') + @mock.patch.object(shade.OpenStackCloud, 'get_volumes') + @mock.patch.object(shade.OpenStackCloud, 'get_image_name') + @mock.patch.object(shade.OpenStackCloud, 'get_flavor_name') + @mock.patch.object(shade.OpenStackCloud, 'has_service') + @mock.patch.object(shade.OpenStackCloud, 'list_networks') + def test_get_server_private_ip_no_fip( + self, mock_list_networks, mock_has_service, + mock_get_flavor_name, mock_get_image_name, + mock_get_volumes, + mock_list_server_security_groups, + mock_list_subnets, + mock_list_floating_ips): + self.cloud._floating_ip_source = 'none' + mock_get_image_name.return_value = 'cirros-0.3.4-x86_64-uec' + mock_get_flavor_name.return_value = 'm1.tiny' + mock_has_service.return_value = True + mock_get_volumes.return_value = [] + mock_list_subnets.return_value = SUBNETS_WITH_NAT + mock_list_networks.return_value = [ + { + 'id': 'test_pnztt_net', + 'name': 'test_pnztt_net', + 'router:external': False, + }, + { + 'id': 'private', + 'name': 'private', + }, + ] + + srv = self.cloud.get_openstack_vars(meta.obj_to_dict(fakes.FakeServer( + id='test-id', name='test-name', status='ACTIVE', + flavor={u'id': u'1'}, + image={ + 'name': u'cirros-0.3.4-x86_64-uec', + u'id': u'f93d000b-7c29-4489-b375-3641a1758fe1'}, + addresses={u'test_pnztt_net': [{ + u'OS-EXT-IPS:type': u'fixed', + u'addr': PRIVATE_V4, + u'version': 4, + u'OS-EXT-IPS-MAC:mac_addr': + u'fa:16:3e:ae:7d:42' + }]} + ))) + + self.assertEqual(PRIVATE_V4, srv['private_v4']) + mock_has_service.assert_called_with('volume') + mock_list_networks.assert_called_once_with() + mock_list_floating_ips.assert_not_called() + @mock.patch.object(shade.OpenStackCloud, 'has_service') @mock.patch.object(shade.OpenStackCloud, 'list_subnets') @mock.patch.object(shade.OpenStackCloud, 'list_networks')