def _attach_configdrive(self, task, managers): configdrive = manager_utils.get_configdrive_image(task.node) if not configdrive: return _eject_vmedia(task, managers, sushy.VIRTUAL_MEDIA_USBSTICK) cd_ref = image_utils.prepare_configdrive_image(task, configdrive) try: _insert_vmedia(task, managers, cd_ref, sushy.VIRTUAL_MEDIA_USBSTICK) except exception.InvalidParameterValue: raise exception.InstanceDeployFailure( _('Cannot attach configdrive for node %s: no suitable ' 'virtual USB slot has been found') % task.node.uuid)
def test_prepare_configdrive_image(self, mock_prepare): expected_url = 'https://a.b/c.f?e=f' encoded = 'H4sIAPJ8418C/0vOzytJzSsBAKkwxf4HAAAA' def _prepare(task, content, prefix): with open(content, 'rb') as fp: self.assertEqual(b'content', fp.read()) return expected_url mock_prepare.side_effect = _prepare with task_manager.acquire(self.context, self.node.uuid, shared=True) as task: result = image_utils.prepare_configdrive_image(task, encoded) self.assertEqual(expected_url, result)
def test_prepare_configdrive_image_url(self, mock_prepare, mock_fetch): content = 'https://swift/path' expected_url = 'https://a.b/c.f?e=f' encoded = b'H4sIAPJ8418C/0vOzytJzSsBAKkwxf4HAAAA' def _fetch(context, image_href, image_file): self.assertEqual(content, image_href) image_file.write(encoded) def _prepare(task, content, prefix): with open(content, 'rb') as fp: self.assertEqual(b'content', fp.read()) return expected_url mock_fetch.side_effect = _fetch mock_prepare.side_effect = _prepare with task_manager.acquire(self.context, self.node.uuid, shared=True) as task: result = image_utils.prepare_configdrive_image(task, content) self.assertEqual(expected_url, result)
def test_prepare_configdrive_image_binary_url(self, mock_prepare, mock_fetch, mock_execute): content = 'https://swift/path' expected_url = 'https://a.b/c.f?e=f' def _fetch(context, image_href, image_file): self.assertEqual(content, image_href) image_file.write(b'content') def _prepare(task, content, prefix): with open(content, 'rb') as fp: self.assertEqual(b'content', fp.read()) return expected_url mock_fetch.side_effect = _fetch mock_prepare.side_effect = _prepare mock_execute.return_value = 'application/octet-stream' with task_manager.acquire(self.context, self.node.uuid, shared=True) as task: result = image_utils.prepare_configdrive_image(task, content) self.assertEqual(expected_url, result)
def prepare_instance(self, task): """Prepares the boot of instance over virtual media. This method prepares the boot of the instance after reading relevant information from the node's instance_info. The internal logic is as follows: - If `boot_option` requested for this deploy is 'local', then set the node to boot from disk. - Unless `boot_option` requested for this deploy is 'ramdisk', pass root disk/partition ID to virtual media boot image - Otherwise build boot image, insert it into virtual media device and set node to boot from CD. :param task: a task from TaskManager. :returns: None :raises: InstanceDeployFailure, if its try to boot iSCSI volume in 'BIOS' boot mode. """ node = task.node boot_mode_utils.sync_boot_mode(task) boot_option = deploy_utils.get_boot_option(node) self.clean_up_instance(task) iwdi = node.driver_internal_info.get('is_whole_disk_image') if boot_option == "local" or iwdi: self._set_boot_device(task, boot_devices.DISK, persistent=True) LOG.debug( "Node %(node)s is set to permanently boot from local " "%(device)s", { 'node': task.node.uuid, 'device': boot_devices.DISK }) return params = {} if boot_option != 'ramdisk': root_uuid = node.driver_internal_info.get('root_uuid_or_disk_id') if not root_uuid and task.driver.storage.should_write_image(task): LOG.warning( "The UUID of the root partition could not be found for " "node %s. Booting instance from disk anyway.", node.uuid) self._set_boot_device(task, boot_devices.DISK, persistent=True) return params.update(root_uuid=root_uuid) managers = redfish_utils.get_system(task.node).managers deploy_info = _parse_deploy_info(node) configdrive = node.instance_info.get('configdrive') iso_ref = image_utils.prepare_boot_iso(task, deploy_info, **params) _eject_vmedia(task, managers, sushy.VIRTUAL_MEDIA_CD) _insert_vmedia(task, managers, iso_ref, sushy.VIRTUAL_MEDIA_CD) if configdrive and boot_option == 'ramdisk': _eject_vmedia(task, managers, sushy.VIRTUAL_MEDIA_USBSTICK) cd_ref = image_utils.prepare_configdrive_image(task, configdrive) try: _insert_vmedia(task, managers, cd_ref, sushy.VIRTUAL_MEDIA_USBSTICK) except exception.InvalidParameterValue: raise exception.InstanceDeployFailure( _('Cannot attach configdrive for node %s: no suitable ' 'virtual USB slot has been found') % node.uuid) del managers self._set_boot_device(task, boot_devices.CDROM, persistent=True) LOG.debug( "Node %(node)s is set to permanently boot from " "%(device)s", { 'node': task.node.uuid, 'device': boot_devices.CDROM })