Пример #1
0
 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)
Пример #2
0
 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')
Пример #3
0
 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)
Пример #4
0
 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)
Пример #5
0
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
Пример #6
0
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
Пример #7
0
 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)
Пример #8
0
 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)
Пример #9
0
 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)
Пример #10
0
    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))
Пример #11
0
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
Пример #12
0
 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)
Пример #13
0
    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))
Пример #14
0
 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)
Пример #15
0
 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)