Ensure we mark baremetal links as phy links

In the Ironic multi-tenant case, the neutron ports will remain unbound
until later in the deploy process. Nova generates the network_data.json
file with all the links marked as unbound, which we need to correct as
these links will be bound after the config drive is generated and
written to the node. This patch updates the Ironic virt driver to
correct the network metadata.

Change-Id: I1881f4a9bca6a6d6a3b4e0e89a82b0765ae09eee
Closes-Bug: #1656854
This commit is contained in:
Sam Betts 2017-01-17 12:45:21 +00:00 committed by Matt Riedemann
parent 0fb3f4fa19
commit b34809dfae
2 changed files with 51 additions and 4 deletions

View File

@ -1748,11 +1748,15 @@ class IronicDriverGenerateConfigDriveTestCase(test.NoDBTestCase):
mock_instance_meta.return_value = 'fake-instance'
mock_make_drive = mock.MagicMock(make_drive=lambda *_: None)
mock_cd_builder.return_value.__enter__.return_value = mock_make_drive
network_metadata_mock = mock.Mock()
self.driver._get_network_metadata = network_metadata_mock
self.driver._generate_configdrive(None, self.instance,
self.node, self.network_info)
mock_cd_builder.assert_called_once_with(instance_md='fake-instance')
mock_instance_meta.assert_called_once_with(self.instance,
network_info=self.network_info, extra_md={}, content=None,
mock_instance_meta.assert_called_once_with(
self.instance, content=None, extra_md={},
network_info=self.network_info,
network_metadata=network_metadata_mock.return_value,
request_context=None)
def test_generate_configdrive_fail(self, mock_cd_builder,
@ -1762,16 +1766,36 @@ class IronicDriverGenerateConfigDriveTestCase(test.NoDBTestCase):
mock_instance_meta.return_value = 'fake-instance'
mock_make_drive = mock.MagicMock(make_drive=lambda *_: None)
mock_cd_builder.return_value.__enter__.return_value = mock_make_drive
network_metadata_mock = mock.Mock()
self.driver._get_network_metadata = network_metadata_mock
self.assertRaises(exception.ConfigDriveMountFailed,
self.driver._generate_configdrive, None,
self.instance, self.node, self.network_info)
mock_cd_builder.assert_called_once_with(instance_md='fake-instance')
mock_instance_meta.assert_called_once_with(self.instance,
network_info=self.network_info, extra_md={}, content=None,
mock_instance_meta.assert_called_once_with(
self.instance, content=None, extra_md={},
network_info=self.network_info,
network_metadata=network_metadata_mock.return_value,
request_context=None)
@mock.patch.object(FAKE_CLIENT.node, 'list_ports')
def test_generate_network_metadata_ports_only(
self, mock_ports, mock_cd_builder, mock_instance_meta):
address = self.network_info[0]['address']
port = ironic_utils.get_test_port(
node_uuid=self.node.uuid, address=address,
internal_info={'tenant_vif_port_id': utils.FAKE_VIF_UUID})
mock_ports.return_value = [port]
metadata = self.driver._get_network_metadata(self.node,
self.network_info)
self.assertEqual(port.address,
metadata['links'][0]['ethernet_mac_address'])
self.assertEqual('phy', metadata['links'][0]['type'])
class HashRingTestCase(test.NoDBTestCase):

View File

@ -56,6 +56,7 @@ from nova.virt import hardware
from nova.virt.ironic import client_wrapper
from nova.virt.ironic import ironic_states
from nova.virt.ironic import patcher
from nova.virt import netutils
ironic = None
@ -700,6 +701,27 @@ class IronicDriver(virt_driver.ComputeDriver):
ports = self.ironicclient.call("node.list_ports", node.uuid)
return set([p.address for p in ports])
def _get_network_metadata(self, node, network_info):
"""Gets a more complete representation of the instance network info.
This data is exposed as network_data.json in the metadata service and
the config drive.
:param node: The node object.
:param network_info: Instance network information.
"""
base_metadata = netutils.get_network_metadata(network_info)
ports = self.ironicclient.call("node.list_ports",
node.uuid, detail=True)
for port in ports:
for link in base_metadata['links']:
if link['ethernet_mac_address'] == port.address:
link['type'] = 'phy'
return base_metadata
def _generate_configdrive(self, context, instance, node, network_info,
extra_md=None, files=None):
"""Generate a config drive.
@ -718,6 +740,7 @@ class IronicDriver(virt_driver.ComputeDriver):
i_meta = instance_metadata.InstanceMetadata(instance,
content=files, extra_md=extra_md, network_info=network_info,
network_metadata=self._get_network_metadata(node, network_info),
request_context=context)
with tempfile.NamedTemporaryFile() as uncompressed: