Replace first_public_address/first_private_address

OS::Nova::Server attributes first_public_address and first_private_address
will not work with neutron, which allows any network name to be assigned
not just 'public' and 'private'.

This change replaces these attributes with a 'first_address'
attribute which uses the same nova_utils.server_to_ipaddress method
that AWS::EC2::Instance uses to populate all of its IP address
attributes.

This needs to be fixed before the Havana release to avoid these
broken attributes needing to be supported.

Change-Id: I0b4dc009d665e4d7b4cbc32d484a2efc6068320a
Closes-Bug: #1228929
This commit is contained in:
Steve Baker
2013-09-23 12:11:25 +12:00
parent b21ce20427
commit 00b89cba93
2 changed files with 14 additions and 28 deletions

View File

@@ -149,14 +149,12 @@ class Server(resource.Resource):
'the API'),
'networks': _('A dict of assigned network addresses of the form: '
'{"public": [ip1, ip2...], "private": [ip3, ip4]}'),
'first_private_address': _('Convenience attribute to fetch the first '
'assigned private network address, or an '
'empty string if nothing has been assigned '
'at this time'),
'first_public_address': _('Convenience attribute to fetch the first '
'assigned public network address, or an '
'empty string if nothing has been assigned '
'at this time'),
'first_address': _('Convenience attribute to fetch the first '
'assigned network address, or an '
'empty string if nothing has been assigned '
'at this time. Result may not be predictable '
'if the server has addresses from more than one '
'network.'),
'instance_name': _('AWS compatible instance name'),
'accessIPv4': _('The manually assigned alternative public IPv4 '
'address of the server'),
@@ -293,21 +291,14 @@ class Server(resource.Resource):
return nics
def _resolve_attribute(self, name):
if name == 'first_address':
return nova_utils.server_to_ipaddress(
self.nova(), self.resource_id) or ''
server = self.nova().servers.get(self.resource_id)
if name == 'addresses':
return server.addresses
if name == 'networks':
return server.networks
if name == 'first_private_address':
private = server.networks.get('private', [])
if len(private) > 0:
return private[0]
return ''
if name == 'first_public_address':
public = server.networks.get('public', [])
if len(public) > 0:
return public[0]
return ''
if name == 'instance_name':
return server._info.get('OS-EXT-SRV-ATTR:instance_name')
if name == 'accessIPv4':

View File

@@ -121,16 +121,14 @@ class ServersTest(HeatTestCase):
server.FnGetAtt('addresses')['public'][0]['addr'], public_ip)
self.assertEqual(
server.FnGetAtt('networks')['public'][0], public_ip)
self.assertEqual(
server.FnGetAtt('first_public_address'), public_ip)
private_ip = return_server.networks['private'][0]
self.assertEqual(
server.FnGetAtt('addresses')['private'][0]['addr'], private_ip)
self.assertEqual(
server.FnGetAtt('networks')['private'][0], private_ip)
self.assertEqual(
server.FnGetAtt('first_private_address'), private_ip)
self.assertIn(
server.FnGetAtt('first_address'), (private_ip, public_ip))
self.assertEqual(return_server._info, server.FnGetAtt('show'))
self.assertEqual('sample-server2', server.FnGetAtt('instance_name'))
@@ -157,16 +155,14 @@ class ServersTest(HeatTestCase):
server.FnGetAtt('addresses')['public'][0]['addr'], public_ip)
self.assertEqual(
server.FnGetAtt('networks')['public'][0], public_ip)
self.assertEqual(
server.FnGetAtt('first_public_address'), public_ip)
private_ip = return_server.networks['private'][0]
self.assertEqual(
server.FnGetAtt('addresses')['private'][0]['addr'], private_ip)
self.assertEqual(
server.FnGetAtt('networks')['private'][0], private_ip)
self.assertEqual(
server.FnGetAtt('first_private_address'), private_ip)
self.assertIn(
server.FnGetAtt('first_address'), (private_ip, public_ip))
self.m.VerifyAll()
@@ -767,8 +763,7 @@ class ServersTest(HeatTestCase):
self.assertEqual(server.FnGetAtt('addresses'), {'empty_net': []})
self.assertEqual(server.FnGetAtt('networks'), {'empty_net': []})
self.assertEqual(server.FnGetAtt('first_private_address'), '')
self.assertEqual(server.FnGetAtt('first_public_address'), '')
self.assertEqual(server.FnGetAtt('first_address'), '')
def test_build_block_device_mapping(self):
self.assertEqual(