def prepare_ramdisk(self, task, ramdisk_params): """Prepares the deploy ramdisk using virtual media. Prepares the options for the deployment ramdisk, sets the node to boot from virtual media cdrom. :param task: a TaskManager instance containing the node to act on. :param ramdisk_params: the options to be passed to the deploy ramdisk. :raises: ImageRefValidationFailed if no image service can handle specified href. :raises: ImageCreationFailed, if it failed while creating the floppy image. :raises: InvalidParameterValue if the validation of the PowerInterface or ManagementInterface fails. :raises: IRMCOperationError, if some operation on iRMC fails. """ # NOTE(TheJulia): If this method is being called by something # aside from deployment and clean, such as conductor takeover, we # should treat this as a no-op and move on otherwise we would modify # the state of the node due to virtual media operations. if (task.node.provision_state != states.DEPLOYING and task.node.provision_state != states.CLEANING): return deploy_nic_mac = deploy_utils.get_single_nic_with_vif_port_id(task) ramdisk_params['BOOTIF'] = deploy_nic_mac _setup_deploy_iso(task, ramdisk_params)
def prepare_ramdisk(self, task, ramdisk_params): """Prepares the deploy ramdisk using virtual media. Prepares the options for the deployment ramdisk, sets the node to boot from virtual media cdrom. :param task: a TaskManager instance containing the node to act on. :param ramdisk_params: the options to be passed to the deploy ramdisk. :raises: ImageRefValidationFailed if no image service can handle specified href. :raises: ImageCreationFailed, if it failed while creating the floppy image. :raises: InvalidParameterValue if the validation of the PowerInterface or ManagementInterface fails. :raises: IRMCOperationError, if some operation on iRMC fails. """ # NOTE(TheJulia): If this method is being called by something # aside from deployment and clean, such as conductor takeover, we # should treat this as a no-op and move on otherwise we would modify # the state of the node due to virtual media operations. if (task.node.provision_state != states.DEPLOYING and task.node.provision_state != states.CLEANING): return # NOTE(tiendc): Before deploying, we need to backup BIOS config # as the data will be used later when cleaning. if task.node.provision_state == states.DEPLOYING: irmc_management.backup_bios_config(task) deploy_nic_mac = deploy_utils.get_single_nic_with_vif_port_id(task) ramdisk_params['BOOTIF'] = deploy_nic_mac _setup_deploy_iso(task, ramdisk_params)
def deploy(self, task): """Start deployment of the task's node. Fetches the instance image, prepares the options for the deployment ramdisk, sets the node to boot from virtual media cdrom, and reboots the given node. :param task: a TaskManager instance containing the node to act on. :returns: deploy state DEPLOYWAIT. :raises: InstanceDeployFailure, if image size if greater than root partition. :raises: ImageCreationFailed, if it failed while creating the floppy image. :raises: IloOperationError, if some operation on iLO fails. """ node = task.node manager_utils.node_power_action(task, states.POWER_OFF) iscsi_deploy.cache_instance_image(task.context, node) iscsi_deploy.check_image_size(task) deploy_ramdisk_opts = iscsi_deploy.build_deploy_ramdisk_options(node) deploy_nic_mac = deploy_utils.get_single_nic_with_vif_port_id(task) deploy_ramdisk_opts['BOOTIF'] = deploy_nic_mac deploy_iso_uuid = node.driver_info['ilo_deploy_iso'] deploy_iso = 'glance:' + deploy_iso_uuid _reboot_into(task, deploy_iso, deploy_ramdisk_opts) return states.DEPLOYWAIT
def deploy(self, task): """Start deployment of the task's node. Fetches the instance image, prepares the options for the deployment ramdisk, sets the node to boot from virtual media cdrom, and reboots the given node. :param task: a TaskManager instance containing the node to act on. :returns: deploy state DEPLOYWAIT. :raises: InstanceDeployFailure, if image size if greater than root partition. :raises: ImageCreationFailed, if it failed while creating the floppy image. :raises: IloOperationError, if some operation on iLO fails. """ node = task.node iscsi_deploy.cache_instance_image(task.context, node) iscsi_deploy.check_image_size(task) deploy_ramdisk_opts = iscsi_deploy.build_deploy_ramdisk_options(node) agent_opts = agent.build_agent_options(node) deploy_ramdisk_opts.update(agent_opts) deploy_nic_mac = deploy_utils.get_single_nic_with_vif_port_id(task) deploy_ramdisk_opts['BOOTIF'] = deploy_nic_mac deploy_iso = node.driver_info['ilo_deploy_iso'] _reboot_into(task, deploy_iso, deploy_ramdisk_opts) return states.DEPLOYWAIT
def prepare_ramdisk(self, task, ramdisk_params): """Prepares the boot of deploy ramdisk using virtual media. This method prepares the boot of the deploy or rescue ramdisk after reading relevant information from the node's driver_info and instance_info. :param task: a task from TaskManager. :param ramdisk_params: the parameters to be passed to the ramdisk. :returns: None :raises: MissingParameterValue, if some information is missing in node's driver_info or instance_info. :raises: InvalidParameterValue, if some information provided is invalid. :raises: IronicException, if some power or set boot boot device operation failed on the node. :raises: IloOperationError, if some operation on iLO failed. """ node = task.node # NOTE(TheJulia): If this method is being called by something # aside from deployment, clean and rescue, such as conductor takeover, # we should treat this as a no-op and move on otherwise we would # modify the state of the node due to virtual media operations. if node.provision_state not in (states.DEPLOYING, states.CLEANING, states.RESCUING, states.INSPECTING): return prepare_node_for_deploy(task) # Clear ilo_boot_iso if it's a glance image to force recreate # another one again (or use existing one in glance). # This is mainly for rebuild and rescue scenario. if service_utils.is_glance_image( node.instance_info.get('image_source')): instance_info = node.instance_info instance_info.pop('ilo_boot_iso', None) node.instance_info = instance_info node.save() # Eject all virtual media devices, as we are going to use them # during boot. ilo_common.eject_vmedia_devices(task) # NOTE(TheJulia): Since we're deploying, cleaning, or rescuing, # with virtual media boot, we should generate a token! manager_utils.add_secret_token(task.node, pregenerated=True) ramdisk_params['ipa-agent-token'] = \ task.node.driver_internal_info['agent_secret_token'] task.node.save() deploy_nic_mac = deploy_utils.get_single_nic_with_vif_port_id(task) ramdisk_params['BOOTIF'] = deploy_nic_mac if node.provision_state == states.RESCUING: iso = node.driver_info['ilo_rescue_iso'] else: iso = node.driver_info['ilo_deploy_iso'] ilo_common.setup_vmedia(task, iso, ramdisk_params)
def test_get_single_nic_with_vif_port_id(self): obj_utils.create_test_port(self.context, node_id=self.node.id, address='aa:bb:cc', uuid=common_utils.generate_uuid(), extra={'vif_port_id': 'test-vif-A'}, driver='iscsi_ilo') with task_manager.acquire(self.context, self.node.uuid, shared=False) as task: address = utils.get_single_nic_with_vif_port_id(task) self.assertEqual('aa:bb:cc', address)
def test_get_single_nic_with_vif_port_id(self): obj_utils.create_test_port(self.context, node_id=self.node.id, address='aa:bb:cc', uuid=uuidutils.generate_uuid(), extra={'vif_port_id': 'test-vif-A'}, driver='iscsi_ilo') with task_manager.acquire(self.context, self.node.uuid, shared=False) as task: address = utils.get_single_nic_with_vif_port_id(task) self.assertEqual('aa:bb:cc', address)
def prepare_ramdisk(self, task, ramdisk_params): """Prepares the boot of deploy ramdisk using virtual media. This method prepares the boot of the deploy ramdisk after reading relevant information from the node's driver_info and instance_info. :param task: a task from TaskManager. :param ramdisk_params: the parameters to be passed to the ramdisk. :returns: None :raises: MissingParameterValue, if some information is missing in node's driver_info or instance_info. :raises: InvalidParameterValue, if some information provided is invalid. :raises: IronicException, if some power or set boot boot device operation failed on the node. :raises: IloOperationError, if some operation on iLO failed. """ node = task.node # NOTE(TheJulia): If this method is being called by something # aside from deployment and clean, such as conductor takeover, we # should treat this as a no-op and move on otherwise we would modify # the state of the node due to virtual media operations. if (node.provision_state != states.DEPLOYING and node.provision_state != states.CLEANING): return # Powering off the Node before initiating boot for node cleaning. # If node is in system POST, setting boot device fails. manager_utils.node_power_action(task, states.POWER_OFF) if task.node.provision_state == states.DEPLOYING: prepare_node_for_deploy(task) # Clear ilo_boot_iso if it's a glance image to force recreate # another one again (or use existing one in glance). # This is mainly for rebuild scenario. if service_utils.is_glance_image( node.instance_info.get('image_source')): instance_info = node.instance_info instance_info.pop('ilo_boot_iso', None) node.instance_info = instance_info node.save() # Eject all virtual media devices, as we are going to use them # during boot. ilo_common.eject_vmedia_devices(task) deploy_nic_mac = deploy_utils.get_single_nic_with_vif_port_id(task) ramdisk_params['BOOTIF'] = deploy_nic_mac deploy_iso = node.driver_info['ilo_deploy_iso'] ilo_common.setup_vmedia(task, deploy_iso, ramdisk_params)
def prepare_ramdisk(self, task, ramdisk_params): """Prepares the deploy or rescue ramdisk using virtual media. Prepares the options for the deploy or rescue ramdisk, sets the node to boot from virtual media cdrom. :param task: a TaskManager instance containing the node to act on. :param ramdisk_params: the options to be passed to the ramdisk. :raises: ImageRefValidationFailed if no image service can handle specified href. :raises: ImageCreationFailed, if it failed while creating the floppy image. :raises: InvalidParameterValue if the validation of the PowerInterface or ManagementInterface fails. :raises: IRMCOperationError, if some operation on iRMC fails. """ # NOTE(TheJulia): If this method is being called by something # aside from deployment, clean and rescue, such as conductor takeover, # we should treat this as a no-op and move on otherwise we would # modify the state of the node due to virtual media operations. if task.node.provision_state not in (states.DEPLOYING, states.CLEANING, states.RESCUING): return # NOTE(tiendc): Before deploying, we need to backup BIOS config # as the data will be used later when cleaning. if task.node.provision_state == states.DEPLOYING: irmc_management.backup_bios_config(task) if not task.driver.storage.should_write_image(task): LOG.debug( 'Node %(node)s skips ramdisk preparation because of ' 'booting from a remote volume.', {'node': task.node.uuid}) return # NOTE(TheJulia): Since we're deploying, cleaning, or rescuing, # with virtual media boot, we should generate a token! manager_utils.add_secret_token(task.node, pregenerated=True) ramdisk_params['ipa-agent-token'] = \ task.node.driver_internal_info['agent_secret_token'] task.node.save() deploy_nic_mac = deploy_utils.get_single_nic_with_vif_port_id(task) if deploy_nic_mac is not None: ramdisk_params['BOOTIF'] = deploy_nic_mac if task.node.provision_state == states.RESCUING: mode = 'rescue' else: mode = 'deploy' _setup_vmedia(task, mode, ramdisk_params)
def prepare_ramdisk(self, task, ramdisk_params): """Prepares the deploy or rescue ramdisk using virtual media. Prepares the options for the deploy or rescue ramdisk, sets the node to boot from virtual media cdrom. :param task: a TaskManager instance containing the node to act on. :param ramdisk_params: the options to be passed to the ramdisk. :raises: ImageRefValidationFailed if no image service can handle specified href. :raises: ImageCreationFailed, if it failed while creating the floppy image. :raises: InvalidParameterValue if the validation of the PowerInterface or ManagementInterface fails. :raises: IRMCOperationError, if some operation on iRMC fails. """ # NOTE(TheJulia): If this method is being called by something # aside from deployment, clean and rescue, such as conductor takeover, # we should treat this as a no-op and move on otherwise we would # modify the state of the node due to virtual media operations. if task.node.provision_state not in (states.DEPLOYING, states.CLEANING, states.RESCUING): return # NOTE(tiendc): Before deploying, we need to backup BIOS config # as the data will be used later when cleaning. if task.node.provision_state == states.DEPLOYING: irmc_management.backup_bios_config(task) if not task.driver.storage.should_write_image(task): LOG.debug('Node %(node)s skips ramdisk preparation because of ' 'booting from a remote volume.', {'node': task.node.uuid}) return deploy_nic_mac = deploy_utils.get_single_nic_with_vif_port_id(task) ramdisk_params['BOOTIF'] = deploy_nic_mac if task.node.provision_state == states.RESCUING: mode = 'rescue' else: mode = 'deploy' _setup_vmedia(task, mode, ramdisk_params)
def deploy(self, task): """Start deployment of the task's node. Fetches the instance image, prepares the options for the deployment ramdisk, sets the node to boot from virtual media cdrom, and reboots the given node. :param task: a TaskManager instance containing the node to act on. :returns: deploy state DEPLOYWAIT. :raises: InstanceDeployFailure, if image size if greater than root partition. :raises: ImageCreationFailed, if it failed while creating the floppy image. :raises: IloOperationError, if some operation on iLO fails. """ node = task.node # Clear ilo_boot_iso if it's a glance image to force recreate # another one again (or use existing one in glance). # This is mainly for rebuild scenario. if service_utils.is_glance_image( node.instance_info.get('image_source')): instance_info = node.instance_info instance_info.pop('ilo_boot_iso', None) node.instance_info = instance_info node.save() # Eject all virtual media devices, as we are going to use them # during deploy. ilo_common.eject_vmedia_devices(task) iscsi_deploy.cache_instance_image(task.context, node) iscsi_deploy.check_image_size(task) deploy_ramdisk_opts = iscsi_deploy.build_deploy_ramdisk_options(node) agent_opts = agent.build_agent_options(node) deploy_ramdisk_opts.update(agent_opts) deploy_nic_mac = deploy_utils.get_single_nic_with_vif_port_id(task) deploy_ramdisk_opts['BOOTIF'] = deploy_nic_mac deploy_iso = node.driver_info['ilo_deploy_iso'] _reboot_into(task, deploy_iso, deploy_ramdisk_opts) return states.DEPLOYWAIT
def prepare_ramdisk(self, task, ramdisk_params): """Prepares the deploy ramdisk using virtual media. Prepares the options for the deployment ramdisk, sets the node to boot from virtual media cdrom. :param task: a TaskManager instance containing the node to act on. :param ramdisk_params: the options to be passed to the deploy ramdisk. :raises: ImageRefValidationFailed if no image service can handle specified href. :raises: ImageCreationFailed, if it failed while creating the floppy image. :raises: InvalidParameterValue if the validation of the PowerInterface or ManagementInterface fails. :raises: IRMCOperationError, if some operation on iRMC fails. """ deploy_nic_mac = deploy_utils.get_single_nic_with_vif_port_id(task) ramdisk_params["BOOTIF"] = deploy_nic_mac _setup_deploy_iso(task, ramdisk_params)
def prepare_ramdisk(self, task, ramdisk_params): """Prepares the deploy ramdisk using virtual media. Prepares the options for the deployment ramdisk, sets the node to boot from virtual media cdrom. :param task: a TaskManager instance containing the node to act on. :param ramdisk_params: the options to be passed to the deploy ramdisk. :raises: ImageRefValidationFailed if no image service can handle specified href. :raises: ImageCreationFailed, if it failed while creating the floppy image. :raises: InvalidParameterValue if the validation of the PowerInterface or ManagementInterface fails. :raises: IRMCOperationError, if some operation on iRMC fails. """ deploy_nic_mac = deploy_utils.get_single_nic_with_vif_port_id(task) ramdisk_params['BOOTIF'] = deploy_nic_mac _setup_deploy_iso(task, ramdisk_params)
def prepare_ramdisk(self, task, ramdisk_params): """Prepares the deploy ramdisk using virtual media. Prepares the options for the deployment ramdisk, sets the node to boot from virtual media cdrom. :param task: a TaskManager instance containing the node to act on. :param ramdisk_params: the options to be passed to the deploy ramdisk. :raises: ImageRefValidationFailed if no image service can handle specified href. :raises: ImageCreationFailed, if it failed while creating the floppy image. :raises: InvalidParameterValue if the validation of the PowerInterface or ManagementInterface fails. :raises: IRMCOperationError, if some operation on iRMC fails. """ # NOTE(TheJulia): If this method is being called by something # aside from deployment and clean, such as conductor takeover, we # should treat this as a no-op and move on otherwise we would modify # the state of the node due to virtual media operations. if (task.node.provision_state != states.DEPLOYING and task.node.provision_state != states.CLEANING): return # NOTE(tiendc): Before deploying, we need to backup BIOS config # as the data will be used later when cleaning. if task.node.provision_state == states.DEPLOYING: irmc_management.backup_bios_config(task) if not task.driver.storage.should_write_image(task): LOG.debug( 'Node %(node)s skips ramdisk preparation because of ' 'booting from a remote volume.', {'node': task.node.uuid}) return deploy_nic_mac = deploy_utils.get_single_nic_with_vif_port_id(task) ramdisk_params['BOOTIF'] = deploy_nic_mac _setup_deploy_iso(task, ramdisk_params)
def prepare_ramdisk(self, task, ramdisk_params): """Prepares the boot of deploy ramdisk using virtual media. This method prepares the boot of the deploy ramdisk after reading relevant information from the node's driver_info and instance_info. :param task: a task from TaskManager. :param ramdisk_params: the parameters to be passed to the ramdisk. :returns: None :raises: MissingParameterValue, if some information is missing in node's driver_info or instance_info. :raises: InvalidParameterValue, if some information provided is invalid. :raises: IronicException, if some power or set boot boot device operation failed on the node. :raises: IloOperationError, if some operation on iLO failed. """ node = task.node # Clear ilo_boot_iso if it's a glance image to force recreate # another one again (or use existing one in glance). # This is mainly for rebuild scenario. if service_utils.is_glance_image( node.instance_info.get('image_source')): instance_info = node.instance_info instance_info.pop('ilo_boot_iso', None) node.instance_info = instance_info node.save() # Eject all virtual media devices, as we are going to use them # during deploy. ilo_common.eject_vmedia_devices(task) deploy_nic_mac = deploy_utils.get_single_nic_with_vif_port_id(task) ramdisk_params['BOOTIF'] = deploy_nic_mac deploy_iso = node.driver_info['ilo_deploy_iso'] ilo_common.setup_vmedia(task, deploy_iso, ramdisk_params)
def prepare_ramdisk(self, task, ramdisk_params): """Prepares the boot of deploy or rescue ramdisk over virtual media. This method prepares the boot of the deploy or rescue ramdisk after reading relevant information from the node's driver_info and instance_info. :param task: A task from TaskManager. :param ramdisk_params: the parameters to be passed to the ramdisk. :returns: None :raises: MissingParameterValue, if some information is missing in node's driver_info or instance_info. :raises: InvalidParameterValue, if some information provided is invalid. :raises: IronicException, if some power or set boot boot device operation failed on the node. """ node = task.node # NOTE(TheJulia): If this method is being called by something # aside from deployment, clean and rescue, such as conductor takeover, # we should treat this as a no-op and move on otherwise we would # modify the state of the node due to virtual media operations. if node.provision_state not in (states.DEPLOYING, states.CLEANING, states.RESCUING, states.INSPECTING): return manager_utils.node_power_action(task, states.POWER_OFF) d_info = self._parse_driver_info(node) config_via_floppy = d_info.get('config_via_floppy') deploy_nic_mac = deploy_utils.get_single_nic_with_vif_port_id(task) ramdisk_params['BOOTIF'] = deploy_nic_mac if CONF.debug and 'ipa-debug' not in ramdisk_params: ramdisk_params['ipa-debug'] = '1' if config_via_floppy: if self._has_vmedia_device(task, sushy.VIRTUAL_MEDIA_FLOPPY): # NOTE (etingof): IPA will read the diskette only if # we tell it to ramdisk_params['boot_method'] = 'vmedia' floppy_ref = self._prepare_floppy_image(task, params=ramdisk_params) self._eject_vmedia(task, sushy.VIRTUAL_MEDIA_FLOPPY) self._insert_vmedia(task, floppy_ref, sushy.VIRTUAL_MEDIA_FLOPPY) LOG.debug( 'Inserted virtual floppy with configuration for ' 'node %(node)s', {'node': task.node.uuid}) else: LOG.warning( 'Config via floppy is requested, but ' 'Floppy drive is not available on node ' '%(node)s', {'node': task.node.uuid}) mode = deploy_utils.rescue_or_deploy_mode(node) iso_ref = self._prepare_deploy_iso(task, ramdisk_params, mode) self._eject_vmedia(task, sushy.VIRTUAL_MEDIA_CD) self._insert_vmedia(task, iso_ref, sushy.VIRTUAL_MEDIA_CD) boot_mode_utils.sync_boot_mode(task) self._set_boot_device(task, boot_devices.CDROM) LOG.debug("Node %(node)s is set to one time boot from " "%(device)s", { 'node': task.node.uuid, 'device': boot_devices.CDROM })
def prepare_ramdisk(self, task, ramdisk_params): """Prepares the boot of deploy or rescue ramdisk over virtual media. This method prepares the boot of the deploy or rescue ramdisk after reading relevant information from the node's driver_info and instance_info. :param task: A task from TaskManager. :param ramdisk_params: the parameters to be passed to the ramdisk. :returns: None :raises: MissingParameterValue, if some information is missing in node's driver_info or instance_info. :raises: InvalidParameterValue, if some information provided is invalid. :raises: IronicException, if some power or set boot boot device operation failed on the node. """ node = task.node # NOTE(TheJulia): If this method is being called by something # aside from deployment, clean and rescue, such as conductor takeover, # we should treat this as a no-op and move on otherwise we would # modify the state of the node due to virtual media operations. if node.provision_state not in (states.DEPLOYING, states.CLEANING, states.RESCUING, states.INSPECTING): return d_info = _parse_driver_info(node) managers = redfish_utils.get_system(task.node).managers if manager_utils.is_fast_track(task): if _has_vmedia_device(managers, sushy.VIRTUAL_MEDIA_CD, inserted=True): LOG.debug( 'Fast track operation for node %s, not inserting ' 'any devices', node.uuid) return else: LOG.warning( 'Fast track is possible for node %s, but no ISO ' 'is currently inserted! Proceeding with ' 'normal operation.', node.uuid) # NOTE(TheJulia): Since we're deploying, cleaning, or rescuing, # with virtual media boot, we should generate a token! # However, we don't have a way to inject it with a pre-built ISO # if a removable disk is not used. can_config = d_info.pop('can_provide_config', True) if can_config: manager_utils.add_secret_token(node, pregenerated=True) node.save() ramdisk_params['ipa-agent-token'] = \ node.driver_internal_info['agent_secret_token'] manager_utils.node_power_action(task, states.POWER_OFF) deploy_nic_mac = deploy_utils.get_single_nic_with_vif_port_id(task) if deploy_nic_mac is not None: ramdisk_params['BOOTIF'] = deploy_nic_mac if CONF.debug and 'ipa-debug' not in ramdisk_params: ramdisk_params['ipa-debug'] = '1' # NOTE(TheJulia): This is a mandatory setting for virtual media # based deployment operations. ramdisk_params['boot_method'] = 'vmedia' config_via_removable = d_info.get('config_via_removable') if config_via_removable: removable = _has_vmedia_device( managers, # Prefer USB devices since floppies are outdated [sushy.VIRTUAL_MEDIA_USBSTICK, sushy.VIRTUAL_MEDIA_FLOPPY]) if removable: floppy_ref = image_utils.prepare_floppy_image( task, params=ramdisk_params) _eject_vmedia(task, managers, removable) _insert_vmedia(task, managers, floppy_ref, removable) LOG.info( 'Inserted virtual %(type)s device with configuration' ' for node %(node)s', { 'node': task.node.uuid, 'type': removable }) else: LOG.warning( 'Config via a removable device is requested, but ' 'virtual USB and floppy devices are not ' 'available on node %(node)s', {'node': task.node.uuid}) mode = deploy_utils.rescue_or_deploy_mode(node) iso_ref = image_utils.prepare_deploy_iso(task, ramdisk_params, mode, d_info) _eject_vmedia(task, managers, sushy.VIRTUAL_MEDIA_CD) _insert_vmedia(task, managers, iso_ref, sushy.VIRTUAL_MEDIA_CD) del managers boot_mode_utils.sync_boot_mode(task) self._set_boot_device(task, boot_devices.CDROM) LOG.debug("Node %(node)s is set to one time boot from " "%(device)s", { 'node': task.node.uuid, 'device': boot_devices.CDROM })