diff options
author | Sergey Kraynev <skraynev@mirantis.com> | 2014-03-12 11:31:37 -0400 |
---|---|---|
committer | Steve Baker <sbaker@redhat.com> | 2014-04-09 07:35:36 +1200 |
commit | e5a2c5f22012a48b5d26ff60094116f848c58b9c (patch) | |
tree | 81a843fa6e7f89518a280678c65e3e85f3add6e1 | |
parent | 79d8191c75e3dc5578686fdb68158cae36760641 (diff) | |
download | heat-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.py | 20 | ||||
-rw-r--r-- | heat/tests/test_server.py | 56 | ||||
-rw-r--r-- | heat/tests/v1_1/fakes.py | 12 |
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", |