]> review.fuel-infra Code Review - openstack-build/heat-build.git/commitdiff
Fix instance creation when a network with no subnet is used
authorSimon Pasquier <pasquier.simon@gmail.com>
Tue, 4 Jun 2013 14:42:50 +0000 (16:42 +0200)
committerSimon Pasquier <pasquier.simon@gmail.com>
Tue, 4 Jun 2013 14:59:37 +0000 (16:59 +0200)
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
heat/engine/resources/loadbalancer.py
heat/tests/test_instance.py
heat/tests/v1_1/fakes.py

index 31ba372c0e7d5a6a1ba027f19ee4cc145968fcf8..9da22dfddae2fd42ba45d12243f624cc4c927871 100644 (file)
@@ -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):
         '''
index 4e8fd180f06dbfaa5ac2ef563653fe1643948f88..0cd1c055d595aa08f6a67693f6114271aaf488fa 100644 (file)
@@ -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'
 
index c9aacecbca00a43aa79f8a0475d0ba53389f3f15..94896295cef6d79cea5a92ef96f55f9990e60c25 100644 (file)
@@ -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')
index 1f3af004680657f3aa456534276a9b627c46bde4..1046bcd5c8336acc485f3b650c510ac4854f21cb 100644 (file)
@@ -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,