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
This commit is contained in:
Simon Pasquier 2013-06-04 16:42:50 +02:00
parent c981c55d32
commit 6ba1916e31
4 changed files with 30 additions and 4 deletions

View 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):
'''

View 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'

View 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')

View 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,