From 6ba1916e31e24d5b28503f527e0a2789c0d617ad Mon Sep 17 00:00:00 2001 From: Simon Pasquier Date: Tue, 4 Jun 2013 16:42:50 +0200 Subject: [PATCH] Fix instance creation when a network with no subnet is used It is possible with OpenStack Networking to create a network with no subnet attached to it. When creating an instance associated to such a network, the engine would raise a 'list index out of range' exception because the instance has no IP address on the network. The issue would also happen with a loadbalancer referencing the same type of instance. Change-Id: I6122efb90877d8020added44aee8802eb8a80297 Fixes: bug #1187023 --- heat/engine/resources/instance.py | 5 +++-- heat/engine/resources/loadbalancer.py | 3 ++- heat/tests/test_instance.py | 7 +++++++ heat/tests/v1_1/fakes.py | 19 ++++++++++++++++++- 4 files changed, 30 insertions(+), 4 deletions(-) diff --git a/heat/engine/resources/instance.py b/heat/engine/resources/instance.py index 31ba372c..9da22dfd 100644 --- a/heat/engine/resources/instance.py +++ b/heat/engine/resources/instance.py @@ -134,8 +134,9 @@ class Instance(resource.Resource): ''' # Just record the first ipaddress for n in networks: - self.ipaddress = networks[n][0] - break + if len(networks[n]) > 0: + self.ipaddress = networks[n][0] + break def _ipaddress(self): ''' diff --git a/heat/engine/resources/loadbalancer.py b/heat/engine/resources/loadbalancer.py index 4e8fd180..0cd1c055 100644 --- a/heat/engine/resources/loadbalancer.py +++ b/heat/engine/resources/loadbalancer.py @@ -253,7 +253,8 @@ class LoadBalancer(stack_resource.StackResource): logger.warn('Instance (%s) not found: %s' % (inst, str(ex))) else: for n in server.networks: - return server.networks[n][0] + if len(server.networks[n]) > 0: + return server.networks[n][0] return '0.0.0.0' diff --git a/heat/tests/test_instance.py b/heat/tests/test_instance.py index c9aacecb..94896295 100644 --- a/heat/tests/test_instance.py +++ b/heat/tests/test_instance.py @@ -264,3 +264,10 @@ class instancesTest(HeatTestCase): 'id4', 'id5' ])) + + def test_instance_without_ip_address(self): + return_server = self.fc.servers.list()[3] + instance = self._create_test_instance(return_server, + 'test_without_ip_address') + + self.assertEqual(instance.FnGetAtt('PrivateIp'), '0.0.0.0') diff --git a/heat/tests/v1_1/fakes.py b/heat/tests/v1_1/fakes.py index 1f3af004..1046bcd5 100644 --- a/heat/tests/v1_1/fakes.py +++ b/heat/tests/v1_1/fakes.py @@ -114,6 +114,7 @@ class FakeHTTPClient(base_client.HTTPClient): {'id': 1234, 'name': 'sample-server'}, {'id': 5678, 'name': 'sample-server2'}, {'id': 9101, 'name': 'hard-reboot'}, + {'id': 9102, 'name': 'server-with-no-ip'}, {'id': 9999, 'name': 'sample-server3'} ]}) @@ -174,6 +175,18 @@ class FakeHTTPClient(base_client.HTTPClient): "private": [{"version": 4, "addr": "10.13.12.13"}]}, "metadata": {"Server Label": "DB 1"}}, + {"id": 9102, + "name": "server-with-no-ip", + "image": {"id": 2, + "name": "sample image"}, + "flavor": {"id": 1, + "name": "256 MB Server"}, + "hostId": + "c1365ba78c624df9b2ff446515a682f5", + "status": "ACTIVE", + "addresses": { + "empty_net": []}, + "metadata": {"Server Label": "DB 1"}}, {"id": 9999, "name": "sample-server3", "image": {"id": 3, @@ -215,7 +228,7 @@ class FakeHTTPClient(base_client.HTTPClient): return (200, r) def get_servers_WikiServerOne2(self, **kw): - r = {'server': self.get_servers_detail()[1]['servers'][0]} + r = {'server': self.get_servers_detail()[1]['servers'][3]} return (200, r) def get_servers_5678(self, **kw): @@ -278,6 +291,10 @@ class FakeHTTPClient(base_client.HTTPClient): def get_servers_9999_diagnostics(self, **kw): return (200, 'Fake diagnostics') + def get_servers_9102(self, **kw): + r = {'server': self.get_servers_detail()[1]['servers'][3]} + return (200, r) + def get_servers_1234_actions(self, **kw): return (200, {'actions': [{'action': 'rebuild', 'error': None, -- 2.45.2