From 64cbd7c51a5a82b965dab53eccfaecba45be9c27 Mon Sep 17 00:00:00 2001 From: Michael Still Date: Thu, 28 Jul 2016 02:39:25 +1000 Subject: [PATCH] Add support for vd2 user context to other drivers This patch adds support for passing the user context through to vendordata2 to all the other drivers. libvirt got this in the original patch, so this is a catch up for the others. Change-Id: I1e1f0aa1a41626970ae3291caaf8d1d1661f68e6 Blueprint: vendordata-reboot --- nova/tests/unit/virt/hyperv/test_vmops.py | 18 ++++++++++------ nova/tests/unit/virt/ironic/test_driver.py | 15 +++++++------ .../unit/virt/vmwareapi/test_configdrive.py | 21 ++++++++++--------- nova/tests/unit/virt/vmwareapi/test_vmops.py | 14 +++++++------ nova/tests/unit/virt/xenapi/test_vm_utils.py | 9 ++++---- nova/tests/unit/virt/xenapi/test_vmops.py | 13 ++++++------ nova/tests/unit/virt/xenapi/test_xenapi.py | 10 +++++---- nova/virt/hyperv/vmops.py | 15 ++++++------- nova/virt/ironic/driver.py | 7 ++++--- nova/virt/vmwareapi/vmops.py | 19 ++++++++++------- nova/virt/xenapi/vm_utils.py | 4 ++-- nova/virt/xenapi/vmops.py | 12 ++++++----- 12 files changed, 90 insertions(+), 67 deletions(-) diff --git a/nova/tests/unit/virt/hyperv/test_vmops.py b/nova/tests/unit/virt/hyperv/test_vmops.py index d8b85e2578..83a3351767 100644 --- a/nova/tests/unit/virt/hyperv/test_vmops.py +++ b/nova/tests/unit/virt/hyperv/test_vmops.py @@ -444,7 +444,7 @@ class VMOpsTestCase(test_base.HyperVBaseTestCase): mock_configdrive_required.assert_called_once_with(mock_instance) if configdrive_required: mock_create_config_drive.assert_called_once_with( - mock_instance, [mock.sentinel.FILE], + self.context, mock_instance, [mock.sentinel.FILE], mock.sentinel.PASSWORD, mock.sentinel.INFO) mock_attach_config_drive.assert_called_once_with( @@ -687,19 +687,24 @@ class VMOpsTestCase(test_base.HyperVBaseTestCase): if config_drive_format != self.ISO9660: self.assertRaises(exception.ConfigDriveUnsupportedFormat, self._vmops._create_config_drive, - mock_instance, [mock.sentinel.FILE], + self.context, + mock_instance, + [mock.sentinel.FILE], mock.sentinel.PASSWORD, mock.sentinel.NET_INFO, rescue) elif side_effect is processutils.ProcessExecutionError: self.assertRaises(processutils.ProcessExecutionError, self._vmops._create_config_drive, - mock_instance, [mock.sentinel.FILE], + self.context, + mock_instance, + [mock.sentinel.FILE], mock.sentinel.PASSWORD, mock.sentinel.NET_INFO, rescue) else: - path = self._vmops._create_config_drive(mock_instance, + path = self._vmops._create_config_drive(self.context, + mock_instance, [mock.sentinel.FILE], mock.sentinel.PASSWORD, mock.sentinel.NET_INFO, @@ -707,7 +712,8 @@ class VMOpsTestCase(test_base.HyperVBaseTestCase): mock_InstanceMetadata.assert_called_once_with( mock_instance, content=[mock.sentinel.FILE], extra_md={'admin_pass': mock.sentinel.PASSWORD}, - network_info=mock.sentinel.NET_INFO) + network_info=mock.sentinel.NET_INFO, + request_context=self.context) mock_get_configdrive_path.assert_has_calls( expected_get_configdrive_path_calls) mock_ConfigDriveBuilder.assert_called_with( @@ -1330,7 +1336,7 @@ class VMOpsTestCase(test_base.HyperVBaseTestCase): drive_type=constants.DISK) mock_detach_config_drive.assert_called_once_with(mock_instance.name) mock_create_config_drive.assert_called_once_with( - mock_instance, + self.context, mock_instance, injected_files=None, admin_password=mock.sentinel.rescue_password, network_info=mock.sentinel.network_info, diff --git a/nova/tests/unit/virt/ironic/test_driver.py b/nova/tests/unit/virt/ironic/test_driver.py index e7a2cffae8..6ec7d76a5e 100644 --- a/nova/tests/unit/virt/ironic/test_driver.py +++ b/nova/tests/unit/virt/ironic/test_driver.py @@ -891,7 +891,8 @@ class IronicDriverTestCase(test.NoDBTestCase): self._test_spawn() # assert configdrive was generated mock_configdrive.assert_called_once_with(mock.ANY, mock.ANY, mock.ANY, - extra_md={}, files=[]) + mock.ANY, extra_md={}, + files=[]) @mock.patch.object(configdrive, 'required_by') @mock.patch.object(loopingcall, 'FixedIntervalLoopingCall') @@ -1698,11 +1699,12 @@ 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 - self.driver._generate_configdrive(self.instance, self.node, - self.network_info) + 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) + network_info=self.network_info, extra_md={}, content=None, + request_context=None) def test_generate_configdrive_fail(self, mock_cd_builder, mock_instance_meta): @@ -1713,12 +1715,13 @@ class IronicDriverGenerateConfigDriveTestCase(test.NoDBTestCase): mock_cd_builder.return_value.__enter__.return_value = mock_make_drive self.assertRaises(exception.ConfigDriveMountFailed, - self.driver._generate_configdrive, + 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) + network_info=self.network_info, extra_md={}, content=None, + request_context=None) class HashRingTestCase(test.NoDBTestCase): diff --git a/nova/tests/unit/virt/vmwareapi/test_configdrive.py b/nova/tests/unit/virt/vmwareapi/test_configdrive.py index 04b6bc6fcc..ad36c77408 100644 --- a/nova/tests/unit/virt/vmwareapi/test_configdrive.py +++ b/nova/tests/unit/virt/vmwareapi/test_configdrive.py @@ -97,7 +97,7 @@ class ConfigDriveTestCase(test.NoDBTestCase): class FakeInstanceMetadata(object): def __init__(self, instance, content=None, extra_md=None, - network_info=None): + network_info=None, request_context=None): pass def metadata_for_config_drive(self): @@ -141,15 +141,16 @@ class ConfigDriveTestCase(test.NoDBTestCase): self.test_instance.config_drive = 'True' self.mox.StubOutWithMock(vmops.VMwareVMOps, '_create_config_drive') self.mox.StubOutWithMock(vmops.VMwareVMOps, '_attach_cdrom_to_vm') - self.conn._vmops._create_config_drive(self.test_instance, - mox.IgnoreArg(), - mox.IgnoreArg(), - mox.IgnoreArg(), - mox.IgnoreArg(), - mox.IgnoreArg(), - mox.IgnoreArg(), - mox.IgnoreArg() - ).AndReturn('[ds1] fake.iso') + self.conn._vmops._create_config_drive(mox.IgnoreArg(), + self.test_instance, + mox.IgnoreArg(), + mox.IgnoreArg(), + mox.IgnoreArg(), + mox.IgnoreArg(), + mox.IgnoreArg(), + mox.IgnoreArg(), + mox.IgnoreArg() + ).AndReturn('[ds1] fake.iso') self.conn._vmops._attach_cdrom_to_vm(mox.IgnoreArg(), mox.IgnoreArg(), mox.IgnoreArg(), diff --git a/nova/tests/unit/virt/vmwareapi/test_vmops.py b/nova/tests/unit/virt/vmwareapi/test_vmops.py index 5e815a1539..bcaf65a776 100644 --- a/nova/tests/unit/virt/vmwareapi/test_vmops.py +++ b/nova/tests/unit/virt/vmwareapi/test_vmops.py @@ -925,15 +925,16 @@ class VMwareVMOpsTestCase(test.NoDBTestCase): vm_ref = mock.Mock() mock_create_config_drive.return_value = "fake_iso_path" self._vmops._configure_config_drive( - self._instance, vm_ref, self._dc_info, self._ds, + self._context, self._instance, vm_ref, self._dc_info, self._ds, injected_files, admin_password, network_info) upload_iso_path = self._ds.build_path("fake_iso_path") mock_get_inventory_path.assert_called_once_with(self._session.vim, self._dc_info.ref) - mock_create_config_drive.assert_called_once_with(self._instance, - injected_files, admin_password, network_info, self._ds.name, - 'fake_path', self._instance.uuid, "Fake-CookieJar") + mock_create_config_drive.assert_called_once_with( + self._context, self._instance, injected_files, admin_password, + network_info, self._ds.name, 'fake_path', self._instance.uuid, + "Fake-CookieJar") mock_attach_cdrom_to_vm.assert_called_once_with( vm_ref, self._instance, self._ds.ref, str(upload_iso_path)) @@ -1550,8 +1551,9 @@ class VMwareVMOpsTestCase(test.NoDBTestCase): if config_drive: mock_configure_config_drive.assert_called_once_with( - self._instance, 'fake_vm_ref', self._dc_info, - self._ds, 'fake_files', 'password', network_info) + self._context, self._instance, 'fake_vm_ref', + self._dc_info, self._ds, 'fake_files', 'password', + network_info) mock_update_vnic_index.assert_called_once_with( self._context, self._instance, network_info) diff --git a/nova/tests/unit/virt/xenapi/test_vm_utils.py b/nova/tests/unit/virt/xenapi/test_vm_utils.py index d07b6ea992..1fab8de844 100644 --- a/nova/tests/unit/virt/xenapi/test_vm_utils.py +++ b/nova/tests/unit/virt/xenapi/test_vm_utils.py @@ -158,8 +158,9 @@ class GenerateConfigDriveTestCase(VMUtilsTestBase): with mock.patch.object(six.moves.builtins, 'open') as mock_open: mock_open.return_value.__enter__.return_value = 'open_fd' - vm_utils.generate_configdrive('session', 'instance', 'vm_ref', - 'userdevice', 'network_info') + vm_utils.generate_configdrive('session', 'context', 'instance', + 'vm_ref', 'userdevice', + 'network_info') mock_size.assert_called_with('/mock/configdrive.vhd') mock_open.assert_called_with('/mock/configdrive.vhd') @@ -168,7 +169,7 @@ class GenerateConfigDriveTestCase(VMUtilsTestBase): '/mock/configdrive.vhd') mock_instance_metadata.assert_called_with( 'instance', content=None, extra_md={}, - network_info='network_info') + network_info='network_info', request_context='context') mock_stream.assert_called_with('session', 'instance', 'vhd', 'open_fd', 100, 'vdi_ref') @@ -180,7 +181,7 @@ class GenerateConfigDriveTestCase(VMUtilsTestBase): def test_vdi_cleaned_up(self, mock_instance_metadata, mock_create, mock_find_sr, mock_destroy): self.assertRaises(test.TestingException, vm_utils.generate_configdrive, - 'session', None, None, None, None) + 'session', None, None, None, None, None) mock_destroy.assert_called_once_with('session', 'vdi_ref') diff --git a/nova/tests/unit/virt/xenapi/test_vmops.py b/nova/tests/unit/virt/xenapi/test_vmops.py index 3fa2dce872..a3375f351d 100644 --- a/nova/tests/unit/virt/xenapi/test_vmops.py +++ b/nova/tests/unit/virt/xenapi/test_vmops.py @@ -208,7 +208,7 @@ class VMOpsTestCase(VMOpsTestBase): {'properties': {'auto_disk_config': 'false'}}) vdis = {'root': {'ref': 'fake-ref'}} self.assertRaises(test.TestingException, self._vmops._attach_disks, - instance, image_meta=image_meta, vm_ref=None, + ctxt, instance, image_meta=image_meta, vm_ref=None, name_label=None, vdis=vdis, disk_image_type='fake', network_info=[], rescue=True) self.assertFalse(try_auto_config.called) @@ -224,7 +224,7 @@ class VMOpsTestCase(VMOpsTestBase): {'properties': {'auto_disk_config': 'true'}}) vdis = {'root': {'ref': 'fake-ref'}} self.assertRaises(test.TestingException, self._vmops._attach_disks, - instance, image_meta=image_meta, vm_ref=None, + ctxt, instance, image_meta=image_meta, vm_ref=None, name_label=None, vdis=vdis, disk_image_type='fake', network_info=[], rescue=True) try_auto_config.assert_called_once_with(self._vmops._session, @@ -397,8 +397,8 @@ class SpawnTestCase(VMOpsTestBase): step += 1 self.vmops._update_instance_progress(context, instance, step, steps) - self.vmops._attach_disks(instance, image_meta, vm_ref, name_label, - vdis, di_type, network_info, rescue, + self.vmops._attach_disks(context, instance, image_meta, vm_ref, + name_label, vdis, di_type, network_info, rescue, admin_password, injected_files) if attach_pci_dev: fake_dev = { @@ -579,8 +579,9 @@ class SpawnTestCase(VMOpsTestBase): if resize_instance: self.vmops._resize_up_vdis(instance, vdis) - self.vmops._attach_disks(instance, image_meta, vm_ref, name_label, - vdis, di_type, network_info, False, None, None) + self.vmops._attach_disks(context, instance, image_meta, vm_ref, + name_label, vdis, di_type, network_info, False, + None, None) self.vmops._attach_mapped_block_devices(instance, block_device_info) pci_manager.get_instance_pci_devs(instance).AndReturn([]) diff --git a/nova/tests/unit/virt/xenapi/test_xenapi.py b/nova/tests/unit/virt/xenapi/test_xenapi.py index 41f9768988..97e0042237 100644 --- a/nova/tests/unit/virt/xenapi/test_xenapi.py +++ b/nova/tests/unit/virt/xenapi/test_xenapi.py @@ -2356,8 +2356,9 @@ class XenAPIAutoDiskConfigTestCase(stubs.XenAPITestBase): 'properties': {'vm_mode': 'xen'}}) self.mox.ReplayAll() - self.conn._vmops._attach_disks(instance, image_meta, vm_ref, - instance['name'], vdis, disk_image_type, "fake_nw_inf") + self.conn._vmops._attach_disks(self.context, instance, image_meta, + vm_ref, instance['name'], vdis, disk_image_type, + "fake_nw_inf") self.assertEqual(marker["partition_called"], called) @@ -2477,8 +2478,9 @@ class XenAPIGenerateLocal(stubs.XenAPITestBase): {'id': uuids.image_id, 'disk_format': 'vhd', 'properties': {'vm_mode': 'xen'}}) - self.conn._vmops._attach_disks(instance, image_meta, vm_ref, - instance['name'], vdis, disk_image_type, "fake_nw_inf") + self.conn._vmops._attach_disks(self.context, instance, image_meta, + vm_ref, instance['name'], vdis, disk_image_type, + "fake_nw_inf") self.assertTrue(self.called) def test_generate_swap(self): diff --git a/nova/virt/hyperv/vmops.py b/nova/virt/hyperv/vmops.py index 342cb57842..6502738121 100644 --- a/nova/virt/hyperv/vmops.py +++ b/nova/virt/hyperv/vmops.py @@ -295,7 +295,8 @@ class VMOps(object): self._save_device_metadata(context, instance, block_device_info) if configdrive.required_by(instance): - configdrive_path = self._create_config_drive(instance, + configdrive_path = self._create_config_drive(context, + instance, injected_files, admin_password, network_info) @@ -440,8 +441,8 @@ class VMOps(object): raise exception.InstanceUnacceptable(instance_id=instance_id, reason=reason) - def _create_config_drive(self, instance, injected_files, admin_password, - network_info, rescue=False): + def _create_config_drive(self, context, instance, injected_files, + admin_password, network_info, rescue=False): if CONF.config_drive_format != 'iso9660': raise exception.ConfigDriveUnsupportedFormat( format=CONF.config_drive_format) @@ -452,10 +453,9 @@ class VMOps(object): if admin_password and CONF.hyperv.config_drive_inject_password: extra_md['admin_pass'] = admin_password - inst_md = instance_metadata.InstanceMetadata(instance, - content=injected_files, - extra_md=extra_md, - network_info=network_info) + inst_md = instance_metadata.InstanceMetadata( + instance, content=injected_files, extra_md=extra_md, + network_info=network_info, request_context=context) configdrive_path_iso = self._pathutils.get_configdrive_path( instance.name, constants.DVD_FORMAT, rescue=rescue) @@ -822,6 +822,7 @@ class VMOps(object): if configdrive.required_by(instance): self._detach_config_drive(instance.name) rescue_configdrive_path = self._create_config_drive( + context, instance, injected_files=None, admin_password=rescue_password, diff --git a/nova/virt/ironic/driver.py b/nova/virt/ironic/driver.py index 4c903496aa..519602e37c 100644 --- a/nova/virt/ironic/driver.py +++ b/nova/virt/ironic/driver.py @@ -671,7 +671,7 @@ class IronicDriver(virt_driver.ComputeDriver): ports = self.ironicclient.call("node.list_ports", node.uuid) return set([p.address for p in ports]) - def _generate_configdrive(self, instance, node, network_info, + def _generate_configdrive(self, context, instance, node, network_info, extra_md=None, files=None): """Generate a config drive. @@ -688,7 +688,8 @@ class IronicDriver(virt_driver.ComputeDriver): extra_md = {} i_meta = instance_metadata.InstanceMetadata(instance, - content=files, extra_md=extra_md, network_info=network_info) + content=files, extra_md=extra_md, network_info=network_info, + request_context=context) with tempfile.NamedTemporaryFile() as uncompressed: with configdrive.ConfigDriveBuilder(instance_md=i_meta) as cdb: @@ -775,7 +776,7 @@ class IronicDriver(virt_driver.ComputeDriver): try: configdrive_value = self._generate_configdrive( - instance, node, network_info, extra_md=extra_md, + context, instance, node, network_info, extra_md=extra_md, files=injected_files) except Exception as e: with excutils.save_and_reraise_exception(): diff --git a/nova/virt/vmwareapi/vmops.py b/nova/virt/vmwareapi/vmops.py index 82ef9e321d..e67b7dcba6 100644 --- a/nova/virt/vmwareapi/vmops.py +++ b/nova/virt/vmwareapi/vmops.py @@ -211,12 +211,14 @@ class VMwareVMOps(object): self._extend_virtual_disk(instance, size_in_kb, root_vmdk_path, dc_info.ref) - def _configure_config_drive(self, instance, vm_ref, dc_info, datastore, - injected_files, admin_password, network_info): + def _configure_config_drive(self, context, instance, vm_ref, dc_info, + datastore, injected_files, admin_password, + network_info): session_vim = self._session.vim cookies = session_vim.client.options.transport.cookiejar dc_path = vutil.get_inventory_path(session_vim, dc_info.ref) - uploaded_iso_path = self._create_config_drive(instance, + uploaded_iso_path = self._create_config_drive(context, + instance, injected_files, admin_password, network_info, @@ -803,7 +805,7 @@ class VMwareVMOps(object): if configdrive.required_by(instance): self._configure_config_drive( - instance, vm_ref, vi.dc_info, vi.datastore, + context, instance, vm_ref, vi.dc_info, vi.datastore, injected_files, admin_password, network_info) # Rename the VM. This is done after the spec is created to ensure @@ -827,9 +829,9 @@ class VMwareVMOps(object): raise exception.UnsupportedHardware(model=adapter_type, virt="vmware") - def _create_config_drive(self, instance, injected_files, admin_password, - network_info, data_store_name, dc_name, - upload_folder, cookies): + def _create_config_drive(self, context, instance, injected_files, + admin_password, network_info, data_store_name, + dc_name, upload_folder, cookies): if CONF.config_drive_format != 'iso9660': reason = (_('Invalid config_drive_format "%s"') % CONF.config_drive_format) @@ -843,7 +845,8 @@ class VMwareVMOps(object): inst_md = instance_metadata.InstanceMetadata(instance, content=injected_files, extra_md=extra_md, - network_info=network_info) + network_info=network_info, + request_context=context) try: with configdrive.ConfigDriveBuilder(instance_md=inst_md) as cdb: with utils.tempdir() as tmp_path: diff --git a/nova/virt/xenapi/vm_utils.py b/nova/virt/xenapi/vm_utils.py index a4ea28a757..483522e491 100644 --- a/nova/virt/xenapi/vm_utils.py +++ b/nova/virt/xenapi/vm_utils.py @@ -1107,7 +1107,7 @@ def generate_iso_blank_root_disk(session, instance, vm_ref, userdevice, 'user', size_gb * 1024, CONF.default_ephemeral_format) -def generate_configdrive(session, instance, vm_ref, userdevice, +def generate_configdrive(session, context, instance, vm_ref, userdevice, network_info, admin_password=None, files=None): sr_ref = safe_find_sr(session) vdi_ref = create_vdi(session, sr_ref, instance, 'config-2', @@ -1118,7 +1118,7 @@ def generate_configdrive(session, instance, vm_ref, userdevice, extra_md['admin_pass'] = admin_password inst_md = instance_metadata.InstanceMetadata( instance, content=files, extra_md=extra_md, - network_info=network_info) + network_info=network_info, request_context=context) with configdrive.ConfigDriveBuilder(instance_md=inst_md) as cdb: with utils.tempdir() as tmp_path: tmp_file = os.path.join(tmp_path, 'configdrive') diff --git a/nova/virt/xenapi/vmops.py b/nova/virt/xenapi/vmops.py index 20378dff02..1cbb2e466a 100644 --- a/nova/virt/xenapi/vmops.py +++ b/nova/virt/xenapi/vmops.py @@ -456,8 +456,9 @@ class VMOps(object): if resize: self._resize_up_vdis(instance, vdis) - self._attach_disks(instance, image_meta, vm_ref, name_label, vdis, - disk_image_type, network_info, rescue, + self._attach_disks(context, instance, image_meta, vm_ref, + name_label, vdis, disk_image_type, + network_info, rescue, admin_password, injected_files) if not first_boot: self._attach_mapped_block_devices(instance, @@ -718,8 +719,8 @@ class VMOps(object): use_pv_kernel, device_id) return vm_ref - def _attach_disks(self, instance, image_meta, vm_ref, name_label, vdis, - disk_image_type, network_info, rescue=False, + def _attach_disks(self, context, instance, image_meta, vm_ref, name_label, + vdis, disk_image_type, network_info, rescue=False, admin_password=None, files=None): flavor = instance.get_flavor() @@ -801,7 +802,8 @@ class VMOps(object): # Attach (optional) configdrive v2 disk if configdrive.required_by(instance): - vm_utils.generate_configdrive(self._session, instance, vm_ref, + vm_utils.generate_configdrive(self._session, context, + instance, vm_ref, DEVICE_CONFIGDRIVE, network_info, admin_password=admin_password,