Implement PrivateIpAddress attribute

The PrivateIpAddress attribute maps to the private IP address of the
AWS::EC2::NetworkInterface resource.

Change-Id: I471e9ab9ea6fed8bc09a6339d11bcf1f1e4528f8
Closes-Bug: #1254675
This commit is contained in:
Simon Pasquier 2013-11-26 10:04:53 +01:00
parent 3f1f69bbd8
commit 15de8c8c91
2 changed files with 52 additions and 0 deletions

View File

@ -52,11 +52,18 @@ class NetworkInterface(resource.Resource):
'Description': _('List of tags associated with this interface.')}}
}
attributes_schema = {'PrivateIpAddress': _('Private IP address of the '
'network interface.')}
@staticmethod
def network_id_from_subnet_id(neutronclient, subnet_id):
subnet_info = neutronclient.show_subnet(subnet_id)
return subnet_info['subnet']['network_id']
def __init__(self, name, json_snippet, stack):
super(NetworkInterface, self).__init__(name, json_snippet, stack)
self.fixed_ip_address = None
def handle_create(self):
client = self.neutron()
@ -91,6 +98,25 @@ class NetworkInterface(resource.Resource):
if ex.status_code != 404:
raise ex
def _get_fixed_ip_address(self, ):
if self.fixed_ip_address is None:
from neutronclient.common.exceptions import NeutronClientException
client = self.neutron()
try:
port = client.show_port(self.resource_id)['port']
if port['fixed_ips'] and len(port['fixed_ips']) > 0:
self.fixed_ip_address = port['fixed_ips'][0]['ip_address']
except NeutronClientException as ex:
if ex.status_code != 404:
raise ex
return self.fixed_ip_address
def _resolve_attribute(self, name):
if name == 'PrivateIpAddress':
return self._get_fixed_ip_address()
def resource_mapping():
if clients.neutronclient is None:

View File

@ -53,6 +53,7 @@ class VPCTestBase(HeatTestCase):
self.m.StubOutWithMock(neutronclient.Client, 'remove_interface_router')
self.m.StubOutWithMock(neutronclient.Client, 'show_subnet')
self.m.StubOutWithMock(neutronclient.Client, 'show_network')
self.m.StubOutWithMock(neutronclient.Client, 'show_port')
self.m.StubOutWithMock(neutronclient.Client, 'show_router')
self.m.StubOutWithMock(neutronclient.Client, 'create_security_group')
self.m.StubOutWithMock(neutronclient.Client, 'show_security_group')
@ -563,6 +564,29 @@ Resources:
}
})
def mock_show_network_interface(self):
self.nic_name = utils.PhysName('test_stack', 'the_nic')
neutronclient.Client.show_port('dddd').AndReturn({
'port': {
'admin_state_up': True,
'device_id': '',
'device_owner': '',
'fixed_ips': [
{
'ip_address': '10.0.0.100',
'subnet_id': 'cccc'
}
],
'id': 'dddd',
'mac_address': 'fa:16:3e:25:32:5d',
'name': self.nic_name,
'network_id': 'aaaa',
'security_groups': ['0389f747-7785-4757-b7bb-2ab07e4b09c3'],
'status': 'ACTIVE',
'tenant_id': 'c1210485b2424d48804aad5d39c61b8f'
}
})
def mock_delete_network_interface(self):
neutronclient.Client.delete_port('dddd').AndReturn(None)
@ -573,6 +597,7 @@ Resources:
self.mock_create_subnet()
self.mock_show_subnet()
self.mock_create_network_interface()
self.mock_show_network_interface()
self.mock_delete_network_interface()
self.mock_delete_subnet()
self.mock_delete_network()
@ -585,6 +610,7 @@ Resources:
self.assertEqual((stack.CREATE, stack.COMPLETE), stack.state)
rsrc = stack['the_nic']
self.assertResourceState(rsrc, 'dddd')
self.assertEqual(rsrc.FnGetAtt('PrivateIpAddress'), '10.0.0.100')
self.assertRaises(resource.UpdateReplace,
rsrc.handle_update, {}, {}, {})