def test_raise_exception_kernel(self): client = mock.MagicMock() client.images.find.side_effect = exceptions.NotFound message = "Kernel image not found in Glance, and no path specified." with testtools.ExpectedException(ValueError, message): glance.create_or_find_kernel_and_ramdisk(client, 'bm-kernel', None)
def test_raise_exception_ramdisk(self): client = mock.MagicMock() client.images.find.side_effect = (self.image('aaa'), exceptions.NotFound) message = "Ramdisk image not found in Glance, and no path specified." with testtools.ExpectedException(ValueError, message): glance.create_or_find_kernel_and_ramdisk(client, 'bm-kernel', 'bm-ramdisk')
def test_skip_missing_kernel_and_ramdisk(self): client = mock.MagicMock() client.images.find.side_effect = exceptions.NotFound expected = {'kernel': None, 'ramdisk': None} ids = glance.create_or_find_kernel_and_ramdisk( client, 'bm-kernel', 'bm-ramdisk', skip_missing=True) self.assertEqual(ids, expected)
def test_return_urls(self): client = mock.MagicMock() expected = {'kernel': 'http://kernel', 'ramdisk': 'http://ramdisk'} ids = glance.create_or_find_kernel_and_ramdisk(client, 'http://kernel', 'http://ramdisk') client.images.assert_not_called() self.assertEqual(expected, ids)
def register_all_nodes(nodes_list, client, remove=False, glance_client=None, kernel_name=None, ramdisk_name=None): """Register all nodes in nodes_list in the baremetal service. :param nodes_list: The list of nodes to register. :param client: An Ironic client object. :param remove: Should nodes not in the list be removed? :param glance_client: A Glance client object, for fetching ramdisk images. :param kernel_name: Glance ID of the kernel to use for the nodes. :param ramdisk_name: Glance ID of the ramdisk to use for the nodes. :return: list of node objects representing the new nodes. """ LOG.debug('Registering all nodes.') node_map = _populate_node_mapping(client) glance_ids = {'kernel': None, 'ramdisk': None} if kernel_name and ramdisk_name: glance_ids = glance.create_or_find_kernel_and_ramdisk( glance_client, kernel_name, ramdisk_name) seen = [] for node in nodes_list: if glance_ids['kernel'] and 'kernel_id' not in node: node['kernel_id'] = glance_ids['kernel'] if glance_ids['ramdisk'] and 'ramdisk_id' not in node: node['ramdisk_id'] = glance_ids['ramdisk'] node = _update_or_register_ironic_node(node, node_map, client=client) seen.append(node) _clean_up_extra_nodes(seen, client, remove=remove) return seen
def test_return_existing_kernel_and_ramdisk(self): client = mock.MagicMock() expected = {'kernel': 'aaa', 'ramdisk': 'zzz'} client.images.find.side_effect = (self.image('aaa'), self.image('zzz')) ids = glance.create_or_find_kernel_and_ramdisk(client, 'bm-kernel', 'bm-ramdisk') client.images.create.assert_not_called() self.assertEqual(expected, ids)
def test_skip_missing_kernel_and_ramdisk(self): client = mock.MagicMock() client.images.find.side_effect = exceptions.NotFound expected = {'kernel': None, 'ramdisk': None} ids = glance.create_or_find_kernel_and_ramdisk(client, 'bm-kernel', 'bm-ramdisk', skip_missing=True) self.assertEqual(ids, expected)
def run(self, context): baremetal_client = self.get_baremetal_client(context) image_client = self.get_image_client(context) try: image_ids = {'kernel': None, 'ramdisk': None} if self.kernel_name is not None and self.ramdisk_name is not None: image_ids = glance.create_or_find_kernel_and_ramdisk( image_client, self.kernel_name, self.ramdisk_name) node = baremetal_client.node.get(self.node_uuid) capabilities = node.properties.get('capabilities', {}) capabilities = nodes.capabilities_to_dict(capabilities) if self.instance_boot_option is not None: capabilities['boot_option'] = self.instance_boot_option else: # Add boot option capability if it didn't exist capabilities.setdefault('boot_option', self.instance_boot_option or 'local') capabilities = nodes.dict_to_capabilities(capabilities) baremetal_client.node.update(node.uuid, [ { 'op': 'add', 'path': '/properties/capabilities', 'value': capabilities, }, { 'op': 'add', 'path': '/driver_info/deploy_ramdisk', 'value': image_ids['ramdisk'], }, { 'op': 'add', 'path': '/driver_info/deploy_kernel', 'value': image_ids['kernel'], }, { 'op': 'add', 'path': '/driver_info/rescue_ramdisk', 'value': image_ids['ramdisk'], }, { 'op': 'add', 'path': '/driver_info/rescue_kernel', 'value': image_ids['kernel'], }, ]) LOG.debug("Configuring boot option for Node %s", self.node_uuid) except Exception as err: LOG.exception("Error configuring node boot options with Ironic.") return actions.Result(error=six.text_type(err))
def register_all_nodes(service_host, nodes_list, client=None, remove=False, blocking=True, keystone_client=None, glance_client=None, kernel_name=None, ramdisk_name=None, provide=True): """Register all nodes in nodes_list in the baremetal service. :param service_host: The host providing the baremetal API. :param nodes_list: The list of nodes to register. :param client: An Ironic client object. :param remove: Should nodes not in the list be removed? :param blocking: Ignored. :param keystone_client: Ignored. :param glance_client: A Glance client object, for fetching ramdisk images. :param kernel_name: Glance ID of the kernel to use for the nodes. :param ramdisk_name: Glance ID of the ramdisk to use for the nodes. :param provide: Should the node be transitioned to AVAILABLE state? :return: list of node objects representing the new nodes. """ LOG.debug('Registering all nodes.') node_map = _populate_node_mapping(client) glance_ids = {'kernel': None, 'ramdisk': None} if kernel_name and ramdisk_name: glance_ids = glance.create_or_find_kernel_and_ramdisk( glance_client, kernel_name, ramdisk_name) seen = [] for node in nodes_list: if glance_ids['kernel'] and 'kernel_id' not in node: node['kernel_id'] = glance_ids['kernel'] if glance_ids['ramdisk'] and 'ramdisk_id' not in node: node['ramdisk_id'] = glance_ids['ramdisk'] node = _update_or_register_ironic_node(service_host, node, node_map, client=client) seen.append(node) _clean_up_extra_nodes(seen, client, remove=remove) if provide: manageable_nodes = set_nodes_state( client, seen, "manage", "manageable", skipped_states={'manageable', 'available'} ) set_nodes_state( client, manageable_nodes, "provide", "available", skipped_states={'available'} ) return seen
def test_create_kernel_and_ramdisk(self): client = mock.MagicMock() client.images.find.side_effect = exceptions.NotFound client.images.create.side_effect = (self.image('aaa'), self.image('zzz')) expected = {'kernel': 'aaa', 'ramdisk': 'zzz'} with tempfile.NamedTemporaryFile() as imagefile: ids = glance.create_or_find_kernel_and_ramdisk( client, 'bm-kernel', 'bm-ramdisk', kernel_path=imagefile.name, ramdisk_path=imagefile.name) kernel_create = mock.call(name='bm-kernel', disk_format='aki', is_public=True, data=mock.ANY) ramdisk_create = mock.call(name='bm-ramdisk', disk_format='ari', is_public=True, data=mock.ANY) client.images.create.assert_has_calls([kernel_create, ramdisk_create]) self.assertEqual(expected, ids)
def run(self, context): baremetal_client = self.get_baremetal_client(context) image_client = self.get_image_client(context) try: image_ids = {'kernel': None, 'ramdisk': None} if self.kernel_name is not None and self.ramdisk_name is not None: image_ids = glance.create_or_find_kernel_and_ramdisk( image_client, self.kernel_name, self.ramdisk_name) node = baremetal_client.node.get(self.node_uuid) capabilities = node.properties.get('capabilities', {}) capabilities = nodes.capabilities_to_dict(capabilities) if self.instance_boot_option is not None: capabilities['boot_option'] = self.instance_boot_option else: # Add boot option capability if it didn't exist capabilities.setdefault( 'boot_option', self.instance_boot_option or 'local') capabilities = nodes.dict_to_capabilities(capabilities) baremetal_client.node.update(node.uuid, [ { 'op': 'add', 'path': '/properties/capabilities', 'value': capabilities, }, { 'op': 'add', 'path': '/driver_info/deploy_ramdisk', 'value': image_ids['ramdisk'], }, { 'op': 'add', 'path': '/driver_info/deploy_kernel', 'value': image_ids['kernel'], }, ]) LOG.debug("Configuring boot option for Node %s", self.node_uuid) except Exception as err: LOG.exception("Error configuring node boot options with Ironic.") return actions.Result(error=six.text_type(err))
def test_raise_exception_kernel(self): client = mock.MagicMock() client.images.find.side_effect = exceptions.NotFound message = "Kernel image bm-kernel not found in Glance" with testtools.ExpectedException(ValueError, message): glance.create_or_find_kernel_and_ramdisk(client, 'bm-kernel', None)