summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Kraynev <skraynev@mirantis.com>2014-03-12 11:31:37 -0400
committerSteve Baker <sbaker@redhat.com>2014-04-09 07:35:36 +1200
commite5a2c5f22012a48b5d26ff60094116f848c58b9c (patch)
tree81a843fa6e7f89518a280678c65e3e85f3add6e1
parent79d8191c75e3dc5578686fdb68158cae36760641 (diff)
downloadheat-e5a2c5f22012a48b5d26ff60094116f848c58b9c.tar.gz
Insertion port id in address attribute of server
Dictionary returned by server's attribute addresses does not contain port id value. Current patch adds field port in this dictionary. Change-Id: Ie458e67d976af0dd394c3fa4a6d77bce78161bef Closes-bug: #1285899
-rw-r--r--heat/engine/resources/server.py20
-rw-r--r--heat/tests/test_server.py56
-rw-r--r--heat/tests/v1_1/fakes.py12
3 files changed, 82 insertions, 6 deletions
diff --git a/heat/engine/resources/server.py b/heat/engine/resources/server.py
index 37cb9c8cf..6e808d645 100644
--- a/heat/engine/resources/server.py
+++ b/heat/engine/resources/server.py
@@ -12,6 +12,8 @@
# License for the specific language governing permissions and limitations
# under the License.
+import copy
+
from oslo.config import cfg
import uuid
@@ -299,8 +301,8 @@ class Server(stack_user.StackUser):
attributes_schema = {
'show': _('A dict of all server details as returned by the API.'),
- 'addresses': _('A dict of all network addresses as returned by '
- 'the API.'),
+ 'addresses': _('A dict of all network addresses with corresponding'
+ 'port_id.'),
'networks': _('A dict of assigned network addresses of the form: '
'{"public": [ip1, ip2...], "private": [ip3, ip4]}.'),
'first_address': _('Convenience attribute to fetch the first '
@@ -615,6 +617,18 @@ class Server(stack_user.StackUser):
nics.append(nic_info)
return nics
+ def _add_port_for_address(self, server):
+ nets = copy.deepcopy(server.addresses)
+ ifaces = server.interface_list()
+ ip_mac_mapping_on_port_id = dict(((iface.fixed_ips[0]['ip_address'],
+ iface.mac_addr), iface.port_id)
+ for iface in ifaces)
+ for net_name in nets:
+ for addr in nets[net_name]:
+ addr['port'] = ip_mac_mapping_on_port_id.get(
+ (addr['addr'], addr['OS-EXT-IPS-MAC:mac_addr']))
+ return nets
+
def _resolve_attribute(self, name):
if name == 'first_address':
return nova_utils.server_to_ipaddress(
@@ -626,7 +640,7 @@ class Server(stack_user.StackUser):
'server': self.resource_id, 'ex': str(ex)})
return ''
if name == 'addresses':
- return server.addresses
+ return self._add_port_for_address(server)
if name == 'networks':
return server.networks
if name == 'instance_name':
diff --git a/heat/tests/test_server.py b/heat/tests/test_server.py
index 7f9fbd751..c54de3031 100644
--- a/heat/tests/test_server.py
+++ b/heat/tests/test_server.py
@@ -145,20 +145,49 @@ class ServersTest(HeatTestCase):
scheduler.TaskRunner(server.create)()
return server
+ def _create_fake_iface(self, port, mac, ip):
+ class fake_interface():
+ def __init__(self, port_id, mac_addr, fixed_ip):
+ self.port_id = port_id
+ self.mac_addr = mac_addr
+ self.fixed_ips = [{'ip_address': fixed_ip}]
+
+ return fake_interface(port, mac, ip)
+
def test_server_create(self):
return_server = self.fc.servers.list()[1]
+ return_server.id = 5678
server = self._create_test_server(return_server,
'test_server_create')
# this makes sure the auto increment worked on server creation
self.assertTrue(server.id > 0)
+ interfaces = [
+ self._create_fake_iface('1234', 'fa:16:3e:8c:22:aa', '4.5.6.7'),
+ self._create_fake_iface('5678', 'fa:16:3e:8c:33:bb', '5.6.9.8'),
+ self._create_fake_iface(
+ '1013', 'fa:16:3e:8c:44:cc', '10.13.12.13')]
+
+ self.m.StubOutWithMock(self.fc.servers, 'get')
+ self.fc.servers.get(5678).MultipleTimes().AndReturn(return_server)
+
+ self.m.StubOutWithMock(return_server, 'interface_list')
+ return_server.interface_list().MultipleTimes().AndReturn(interfaces)
+ self.m.ReplayAll()
+
public_ip = return_server.networks['public'][0]
+ self.assertEqual('1234',
+ server.FnGetAtt('addresses')['public'][0]['port'])
+ self.assertEqual('5678',
+ server.FnGetAtt('addresses')['public'][1]['port'])
self.assertEqual(public_ip,
server.FnGetAtt('addresses')['public'][0]['addr'])
self.assertEqual(public_ip,
server.FnGetAtt('networks')['public'][0])
private_ip = return_server.networks['private'][0]
+ self.assertEqual('1013',
+ server.FnGetAtt('addresses')['private'][0]['port'])
self.assertEqual(private_ip,
server.FnGetAtt('addresses')['private'][0]['addr'])
self.assertEqual(private_ip,
@@ -205,6 +234,7 @@ class ServersTest(HeatTestCase):
def test_server_create_with_image_id(self):
return_server = self.fc.servers.list()[1]
+ return_server.id = 5678
server = self._setup_test_server(return_server,
'test_server_create_image_id',
image_id='1',
@@ -212,6 +242,17 @@ class ServersTest(HeatTestCase):
self.m.StubOutWithMock(uuidutils, "is_uuid_like")
uuidutils.is_uuid_like('1').MultipleTimes().AndReturn(True)
+ interfaces = [
+ self._create_fake_iface('1234', 'fa:16:3e:8c:22:aa', '4.5.6.7'),
+ self._create_fake_iface('5678', 'fa:16:3e:8c:33:bb', '5.6.9.8'),
+ self._create_fake_iface(
+ '1013', 'fa:16:3e:8c:44:cc', '10.13.12.13')]
+
+ self.m.StubOutWithMock(self.fc.servers, 'get')
+ self.fc.servers.get(5678).MultipleTimes().AndReturn(return_server)
+
+ self.m.StubOutWithMock(return_server, 'interface_list')
+ return_server.interface_list().MultipleTimes().AndReturn(interfaces)
self.m.ReplayAll()
scheduler.TaskRunner(server.create)()
@@ -219,12 +260,18 @@ class ServersTest(HeatTestCase):
self.assertTrue(server.id > 0)
public_ip = return_server.networks['public'][0]
+ self.assertEqual('1234',
+ server.FnGetAtt('addresses')['public'][0]['port'])
+ self.assertEqual('5678',
+ server.FnGetAtt('addresses')['public'][1]['port'])
self.assertEqual(
server.FnGetAtt('addresses')['public'][0]['addr'], public_ip)
self.assertEqual(
server.FnGetAtt('networks')['public'][0], public_ip)
private_ip = return_server.networks['private'][0]
+ self.assertEqual('1013',
+ server.FnGetAtt('addresses')['private'][0]['port'])
self.assertEqual(
server.FnGetAtt('addresses')['private'][0]['addr'], private_ip)
self.assertEqual(
@@ -1557,12 +1604,21 @@ class ServersTest(HeatTestCase):
def test_server_without_ip_address(self):
return_server = self.fc.servers.list()[3]
+ return_server.id = 9102
server = self._create_test_server(return_server,
'wo_ipaddr')
+ self.m.StubOutWithMock(self.fc.servers, 'get')
+ self.fc.servers.get(9102).MultipleTimes().AndReturn(return_server)
+
+ self.m.StubOutWithMock(return_server, 'interface_list')
+ return_server.interface_list().MultipleTimes().AndReturn([])
+ self.m.ReplayAll()
+
self.assertEqual({'empty_net': []}, server.FnGetAtt('addresses'))
self.assertEqual({'empty_net': []}, server.FnGetAtt('networks'))
self.assertEqual('', server.FnGetAtt('first_address'))
+ self.m.VerifyAll()
def test_build_block_device_mapping(self):
self.assertIsNone(servers.Server._build_block_device_mapping([]))
diff --git a/heat/tests/v1_1/fakes.py b/heat/tests/v1_1/fakes.py
index 4d73aeb03..cd20a4d10 100644
--- a/heat/tests/v1_1/fakes.py
+++ b/heat/tests/v1_1/fakes.py
@@ -104,11 +104,17 @@ class FakeHTTPClient(base_client.HTTPClient):
"accessIPv4": "192.0.2.0",
"accessIPv6": "::babe:4317:0A83",
"addresses": {"public": [{"version": 4,
- "addr": "4.5.6.7"},
+ "addr": "4.5.6.7",
+ "OS-EXT-IPS-MAC:mac_addr":
+ "fa:16:3e:8c:22:aa"},
{"version": 4,
- "addr": "5.6.9.8"}],
+ "addr": "5.6.9.8",
+ "OS-EXT-IPS-MAC:mac_addr":
+ "fa:16:3e:8c:33:bb"}],
"private": [{"version": 4,
- "addr": "10.13.12.13"}]},
+ "addr": "10.13.12.13",
+ "OS-EXT-IPS-MAC:mac_addr":
+ "fa:16:3e:8c:44:cc"}]},
"metadata": {}},
{"id": 9101,
"name": "hard-reboot",