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 _test_build_deploy_ramdisk_options(self, mock_alnum, api_url, expected_root_device=None, expected_boot_option='netboot', expected_boot_mode='bios'): fake_key = '0123456789ABCDEFGHIJKLMNOPQRSTUV' fake_disk = 'fake-disk' self.config(disk_devices=fake_disk, group='pxe') mock_alnum.return_value = fake_key expected_opts = { 'iscsi_target_iqn': 'iqn-%s' % self.node.uuid, 'deployment_id': self.node.uuid, 'deployment_key': fake_key, 'disk': fake_disk, 'ironic_api_url': api_url, 'boot_option': expected_boot_option, 'boot_mode': expected_boot_mode, 'coreos.configdrive': 0, } if expected_root_device: expected_opts['root_device'] = expected_root_device opts = iscsi_deploy.build_deploy_ramdisk_options(self.node) self.assertEqual(expected_opts, opts) mock_alnum.assert_called_once_with(32) # assert deploy_key was injected in the node self.assertIn('deploy_key', self.node.instance_info)
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 prepare_cleaning(self, task): deploy_utils.agent_add_clean_params(task) ramdisk_opts = deploy_utils.build_agent_options(task.node) ramdisk_opts.update( iscsi_deploy.build_deploy_ramdisk_options(task.node)) task.driver.boot.prepare_ramdisk(task, ramdisk_opts) manager_utils.node_power_action(task, states.REBOOT) return states.CLEANWAIT
def _build_pxe_config_options(node, pxe_info, ctx): """Build the PXE config options for a node This method builds the PXE boot options for a node, given all the required parameters. The options should then be passed to pxe_utils.create_pxe_config to create the actual config files. :param node: a single Node. :param pxe_info: a dict of values to set on the configuration file :param ctx: security context :returns: A dictionary of pxe options to be used in the pxe bootfile template. """ is_whole_disk_image = node.driver_internal_info.get('is_whole_disk_image') if is_whole_disk_image: # These are dummy values to satisfy elilo. # image and initrd fields in elilo config cannot be blank. kernel = 'no_kernel' ramdisk = 'no_ramdisk' if CONF.pxe.ipxe_enabled: deploy_kernel = '/'.join([CONF.deploy.http_url, node.uuid, 'deploy_kernel']) deploy_ramdisk = '/'.join([CONF.deploy.http_url, node.uuid, 'deploy_ramdisk']) if not is_whole_disk_image: kernel = '/'.join([CONF.deploy.http_url, node.uuid, 'kernel']) ramdisk = '/'.join([CONF.deploy.http_url, node.uuid, 'ramdisk']) else: deploy_kernel = pxe_info['deploy_kernel'][1] deploy_ramdisk = pxe_info['deploy_ramdisk'][1] if not is_whole_disk_image: kernel = pxe_info['kernel'][1] ramdisk = pxe_info['ramdisk'][1] pxe_options = { 'deployment_aki_path': deploy_kernel, 'deployment_ari_path': deploy_ramdisk, 'pxe_append_params': CONF.pxe.pxe_append_params, 'tftp_server': CONF.pxe.tftp_server, 'aki_path': kernel, 'ari_path': ramdisk } deploy_ramdisk_options = iscsi_deploy.build_deploy_ramdisk_options(node) pxe_options.update(deploy_ramdisk_options) # NOTE(lucasagomes): We are going to extend the normal PXE config # to also contain the agent options so it could be used for both the # DIB ramdisk and the IPA ramdisk agent_opts = agent.build_agent_options(node) pxe_options.update(agent_opts) return pxe_options
def _build_pxe_config_options(node, pxe_info, ctx): """Build the PXE config options for a node This method builds the PXE boot options for a node, given all the required parameters. The options should then be passed to pxe_utils.create_pxe_config to create the actual config files. :param node: a single Node. :param pxe_info: a dict of values to set on the configuration file :param ctx: security context :returns: A dictionary of pxe options to be used in the pxe bootfile template. """ is_whole_disk_image = node.driver_internal_info.get('is_whole_disk_image') if is_whole_disk_image: # These are dummy values to satisfy elilo. # image and initrd fields in elilo config cannot be blank. kernel = 'no_kernel' ramdisk = 'no_ramdisk' if CONF.pxe.ipxe_enabled: deploy_kernel = '/'.join( [CONF.pxe.http_url, node.uuid, 'deploy_kernel']) deploy_ramdisk = '/'.join( [CONF.pxe.http_url, node.uuid, 'deploy_ramdisk']) if not is_whole_disk_image: kernel = '/'.join([CONF.pxe.http_url, node.uuid, 'kernel']) ramdisk = '/'.join([CONF.pxe.http_url, node.uuid, 'ramdisk']) else: deploy_kernel = pxe_info['deploy_kernel'][1] deploy_ramdisk = pxe_info['deploy_ramdisk'][1] if not is_whole_disk_image: kernel = pxe_info['kernel'][1] ramdisk = pxe_info['ramdisk'][1] pxe_options = { 'deployment_aki_path': deploy_kernel, 'deployment_ari_path': deploy_ramdisk, 'pxe_append_params': CONF.pxe.pxe_append_params, 'tftp_server': CONF.pxe.tftp_server, 'aki_path': kernel, 'ari_path': ramdisk } deploy_ramdisk_options = iscsi_deploy.build_deploy_ramdisk_options(node) pxe_options.update(deploy_ramdisk_options) # NOTE(lucasagomes): We are going to extend the normal PXE config # to also contain the agent options so it could be used for both the # DIB ramdisk and the IPA ramdisk agent_opts = agent.build_agent_options(node) pxe_options.update(agent_opts) return pxe_options
def prepare_inband_cleaning(task, manage_boot=True): """Prepares the node to boot into agent for in-band cleaning. This method does the following: 1. Prepares the cleaning ports for the bare metal node and updates the clean parameters in node's driver_internal_info. 2. If 'manage_boot' parameter is set to true, it also calls the 'prepare_ramdisk' method of boot interface to boot the agent ramdisk. 3. Reboots the bare metal node. :param task: a TaskManager object containing the node :param manage_boot: If this is set to True, this method calls the 'prepare_ramdisk' method of boot interface to boot the agent ramdisk. If False, it skips preparing the boot agent ramdisk using boot interface, and assumes that the environment is setup to automatically boot agent ramdisk every time bare metal node is rebooted. :returns: states.CLEANWAIT to signify an asynchronous prepare. :raises NodeCleaningFailure: if the previous cleaning ports cannot be removed or if new cleaning ports cannot be created """ prepare_cleaning_ports(task) # Append required config parameters to node's driver_internal_info # to pass to IPA. agent_add_clean_params(task) if manage_boot: ramdisk_opts = build_agent_options(task.node) # TODO(rameshg87): Below code is to make sure that bash ramdisk # invokes pass_deploy_info vendor passthru when it is booted # for cleaning. Remove the below code once we stop supporting # bash ramdisk in Ironic. Do a late import to avoid circular # import. from ironic.drivers.modules import iscsi_deploy ramdisk_opts.update( iscsi_deploy.build_deploy_ramdisk_options(task.node)) task.driver.boot.prepare_ramdisk(task, ramdisk_opts) manager_utils.node_power_action(task, states.REBOOT) # Tell the conductor we are waiting for the agent to boot. return states.CLEANWAIT
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 _test_build_deploy_ramdisk_options(self, mock_alnum, api_url): fake_key = '0123456789ABCDEFGHIJKLMNOPQRSTUV' fake_disk = 'fake-disk' self.config(disk_devices=fake_disk, group='pxe') mock_alnum.return_value = fake_key expected_opts = {'iscsi_target_iqn': 'iqn-%s' % self.node.uuid, 'deployment_id': self.node.uuid, 'deployment_key': fake_key, 'disk': fake_disk, 'ironic_api_url': api_url} opts = iscsi_deploy.build_deploy_ramdisk_options(self.node) self.assertEqual(expected_opts, opts) mock_alnum.assert_called_once_with(32) # assert deploy_key was injected in the node self.assertIn('deploy_key', self.node.instance_info)
def _build_pxe_config_options(node, pxe_info, ctx): """Build the PXE config options for a node This method builds the PXE boot options for a node, given all the required parameters. The options should then be passed to pxe_utils.create_pxe_config to create the actual config files. :param node: a single Node. :param pxe_info: a dict of values to set on the configuration file :param ctx: security context :returns: A dictionary of pxe options to be used in the pxe bootfile template. """ if CONF.pxe.ipxe_enabled: deploy_kernel = '/'.join([CONF.pxe.http_url, node.uuid, 'deploy_kernel']) deploy_ramdisk = '/'.join([CONF.pxe.http_url, node.uuid, 'deploy_ramdisk']) kernel = '/'.join([CONF.pxe.http_url, node.uuid, 'kernel']) ramdisk = '/'.join([CONF.pxe.http_url, node.uuid, 'ramdisk']) else: deploy_kernel = pxe_info['deploy_kernel'][1] deploy_ramdisk = pxe_info['deploy_ramdisk'][1] kernel = pxe_info['kernel'][1] ramdisk = pxe_info['ramdisk'][1] pxe_options = { 'deployment_aki_path': deploy_kernel, 'deployment_ari_path': deploy_ramdisk, 'aki_path': kernel, 'ari_path': ramdisk, 'pxe_append_params': CONF.pxe.pxe_append_params, 'tftp_server': CONF.pxe.tftp_server } deploy_ramdisk_options = iscsi_deploy.build_deploy_ramdisk_options(node, ctx) pxe_options.update(deploy_ramdisk_options) return pxe_options
def _test_build_deploy_ramdisk_options(self, mock_alnum, api_url): fake_key = '0123456789ABCDEFGHIJKLMNOPQRSTUV' fake_disk = 'fake-disk' self.config(disk_devices=fake_disk, group='pxe') mock_alnum.return_value = fake_key expected_opts = { 'iscsi_target_iqn': 'iqn-%s' % self.node.uuid, 'deployment_id': self.node.uuid, 'deployment_key': fake_key, 'disk': fake_disk, 'ironic_api_url': api_url } opts = iscsi_deploy.build_deploy_ramdisk_options(self.node) self.assertEqual(expected_opts, opts) mock_alnum.assert_called_once_with(32) # assert deploy_key was injected in the node self.assertIn('deploy_key', self.node.instance_info)