Merge "Adds get_glance_image_properties"
This commit is contained in:
commit
0d26fa288e
@ -303,17 +303,24 @@ def converted_size(path):
|
||||
return data.virtual_size
|
||||
|
||||
|
||||
def get_glance_image_property(context, image_uuid, property):
|
||||
"""Returns the value of a glance image property.
|
||||
def get_glance_image_properties(context, image_uuid, properties="all"):
|
||||
"""Returns the values of several properties of a glance image
|
||||
|
||||
:param context: context
|
||||
:param image_uuid: the UUID of the image in glance
|
||||
:param property: the property whose value is required.
|
||||
:returns: the value of the property if it exists, otherwise None.
|
||||
:param properties: the properties whose values are required.
|
||||
This argument is optional, default value is "all", so if not specified
|
||||
all properties will be returned.
|
||||
:returns: a dict of the values of the properties. A property not on the
|
||||
glance metadata will have a value of None.
|
||||
"""
|
||||
glance_service = service.Service(version=1, context=context)
|
||||
iproperties = glance_service.show(image_uuid)['properties']
|
||||
return iproperties.get(property)
|
||||
|
||||
if properties == "all":
|
||||
return iproperties
|
||||
|
||||
return {p: iproperties.get(p) for p in properties}
|
||||
|
||||
|
||||
def get_temp_url_for_glance_image(context, image_uuid):
|
||||
|
@ -89,9 +89,16 @@ def _get_boot_iso(task, root_uuid):
|
||||
# Option 1 - Check if user has provided a boot_iso in Glance.
|
||||
LOG.debug("Trying to get a boot ISO to boot the baremetal node")
|
||||
deploy_info = _parse_deploy_info(task.node)
|
||||
|
||||
image_href = deploy_info['image_source']
|
||||
boot_iso_uuid = images.get_glance_image_property(task.context,
|
||||
image_href, 'boot_iso')
|
||||
glance_properties = (
|
||||
images.get_glance_image_properties(task.context,
|
||||
image_href, ['boot_iso', 'kernel_id', 'ramdisk_id']))
|
||||
|
||||
boot_iso_uuid = glance_properties.get('boot_iso')
|
||||
kernel_uuid = glance_properties.get('kernel_id')
|
||||
ramdisk_uuid = glance_properties.get('ramdisk_id')
|
||||
|
||||
if boot_iso_uuid:
|
||||
LOG.debug("Found boot_iso %s in Glance", boot_iso_uuid)
|
||||
return 'glance:%s' % boot_iso_uuid
|
||||
@ -104,10 +111,6 @@ def _get_boot_iso(task, root_uuid):
|
||||
{'node': task.node.uuid})
|
||||
return
|
||||
|
||||
kernel_uuid = images.get_glance_image_property(task.context,
|
||||
image_href, 'kernel_id')
|
||||
ramdisk_uuid = images.get_glance_image_property(task.context,
|
||||
image_href, 'ramdisk_id')
|
||||
if not kernel_uuid or not ramdisk_uuid:
|
||||
LOG.error(_LE("Unable to find 'kernel_id' and 'ramdisk_id' in Glance "
|
||||
"image %(image)s for generating boot ISO for %(node)s"),
|
||||
|
@ -61,37 +61,43 @@ class IloDeployPrivateMethodsTestCase(db_base.DbTestCase):
|
||||
boot_iso_expected = "boot-%s" % self.node.uuid
|
||||
self.assertEqual(boot_iso_expected, boot_iso_actual)
|
||||
|
||||
@mock.patch.object(images, 'get_glance_image_property')
|
||||
@mock.patch.object(images, 'get_glance_image_properties')
|
||||
@mock.patch.object(ilo_deploy, '_parse_deploy_info')
|
||||
def test__get_boot_iso_glance_image(self, deploy_info_mock,
|
||||
image_prop_mock):
|
||||
image_props_mock):
|
||||
deploy_info_mock.return_value = {'image_source': 'image-uuid'}
|
||||
image_prop_mock.return_value = 'boot-iso-uuid'
|
||||
image_props_mock.return_value = {'boot_iso': 'boot-iso-uuid',
|
||||
'kernel_id': None,
|
||||
'ramdisk_id': None}
|
||||
|
||||
with task_manager.acquire(self.context, self.node.uuid,
|
||||
shared=False) as task:
|
||||
boot_iso_actual = ilo_deploy._get_boot_iso(task, 'root-uuid')
|
||||
deploy_info_mock.assert_called_once_with(task.node)
|
||||
image_prop_mock.assert_called_once_with(task.context, 'image-uuid',
|
||||
'boot_iso')
|
||||
image_props_mock.assert_called_once_with(
|
||||
task.context, 'image-uuid',
|
||||
['boot_iso', 'kernel_id', 'ramdisk_id'])
|
||||
boot_iso_expected = 'glance:boot-iso-uuid'
|
||||
self.assertEqual(boot_iso_expected, boot_iso_actual)
|
||||
|
||||
@mock.patch.object(driver_utils, 'get_node_capability')
|
||||
@mock.patch.object(images, 'get_glance_image_property')
|
||||
@mock.patch.object(images, 'get_glance_image_properties')
|
||||
@mock.patch.object(ilo_deploy, '_parse_deploy_info')
|
||||
def test__get_boot_iso_uefi_no_glance_image(self, deploy_info_mock,
|
||||
image_prop_mock, get_node_cap_mock):
|
||||
image_props_mock, get_node_cap_mock):
|
||||
deploy_info_mock.return_value = {'image_source': 'image-uuid'}
|
||||
image_prop_mock.return_value = None
|
||||
image_props_mock.return_value = {'boot_iso': None,
|
||||
'kernel_id': None,
|
||||
'ramdisk_id': None}
|
||||
get_node_cap_mock.return_value = 'uefi'
|
||||
|
||||
with task_manager.acquire(self.context, self.node.uuid,
|
||||
shared=False) as task:
|
||||
boot_iso_result = ilo_deploy._get_boot_iso(task, 'root-uuid')
|
||||
deploy_info_mock.assert_called_once_with(task.node)
|
||||
image_prop_mock.assert_called_once_with(task.context, 'image-uuid',
|
||||
'boot_iso')
|
||||
image_props_mock.assert_called_once_with(
|
||||
task.context, 'image-uuid',
|
||||
['boot_iso', 'kernel_id', 'ramdisk_id'])
|
||||
get_node_cap_mock.assert_called_once_with(task.node, 'boot_mode')
|
||||
self.assertIsNone(boot_iso_result)
|
||||
|
||||
@ -99,9 +105,9 @@ class IloDeployPrivateMethodsTestCase(db_base.DbTestCase):
|
||||
@mock.patch.object(images, 'create_boot_iso')
|
||||
@mock.patch.object(swift, 'SwiftAPI')
|
||||
@mock.patch.object(ilo_deploy, '_get_boot_iso_object_name')
|
||||
@mock.patch.object(images, 'get_glance_image_property')
|
||||
@mock.patch.object(images, 'get_glance_image_properties')
|
||||
@mock.patch.object(ilo_deploy, '_parse_deploy_info')
|
||||
def test__get_boot_iso_create(self, deploy_info_mock, image_prop_mock,
|
||||
def test__get_boot_iso_create(self, deploy_info_mock, image_props_mock,
|
||||
boot_object_name_mock, swift_api_mock,
|
||||
create_boot_iso_mock, tempfile_mock):
|
||||
CONF.keystone_authtoken.auth_uri = 'http://authurl'
|
||||
@ -116,7 +122,9 @@ class IloDeployPrivateMethodsTestCase(db_base.DbTestCase):
|
||||
tempfile_mock.return_value = mock_file_handle
|
||||
|
||||
deploy_info_mock.return_value = {'image_source': 'image-uuid'}
|
||||
image_prop_mock.side_effect = [None, 'kernel-uuid', 'ramdisk-uuid']
|
||||
image_props_mock.return_value = {'boot_iso': None,
|
||||
'kernel_id': 'kernel_uuid',
|
||||
'ramdisk_id': 'ramdisk_uuid'}
|
||||
boot_object_name_mock.return_value = 'abcdef'
|
||||
create_boot_iso_mock.return_value = '/path/to/boot-iso'
|
||||
|
||||
@ -124,15 +132,11 @@ class IloDeployPrivateMethodsTestCase(db_base.DbTestCase):
|
||||
shared=False) as task:
|
||||
boot_iso_actual = ilo_deploy._get_boot_iso(task, 'root-uuid')
|
||||
deploy_info_mock.assert_called_once_with(task.node)
|
||||
image_prop_mock.assert_any_call(task.context, 'image-uuid',
|
||||
'boot_iso')
|
||||
image_prop_mock.assert_any_call(task.context, 'image-uuid',
|
||||
'kernel_id')
|
||||
image_prop_mock.assert_any_call(task.context, 'image-uuid',
|
||||
'ramdisk_id')
|
||||
image_props_mock.assert_any_call(task.context, 'image-uuid',
|
||||
['boot_iso', 'kernel_id', 'ramdisk_id'])
|
||||
boot_object_name_mock.assert_called_once_with(task.node)
|
||||
create_boot_iso_mock.assert_called_once_with(task.context,
|
||||
'tmpfile', 'kernel-uuid', 'ramdisk-uuid',
|
||||
'tmpfile', 'kernel_uuid', 'ramdisk_uuid',
|
||||
'root-uuid', 'kernel-params')
|
||||
swift_obj_mock.create_object.assert_called_once_with('ilo-cont',
|
||||
'abcdef',
|
||||
|
@ -440,20 +440,56 @@ class FsImageTestCase(base.TestCase):
|
||||
'tmpdir/kernel-uuid', 'tmpdir/ramdisk-uuid', params)
|
||||
|
||||
@mock.patch.object(image_service, 'Service')
|
||||
def test_get_glance_image_property(self, image_service_mock):
|
||||
def test_get_glance_image_properties_no_such_prop(
|
||||
self, image_service_mock):
|
||||
|
||||
prop_dict = {'properties': {'prop1': 'val1'}}
|
||||
prop_dict = {'properties': {'p1': 'v1',
|
||||
'p2': 'v2'}}
|
||||
|
||||
image_service_obj_mock = image_service_mock.return_value
|
||||
image_service_obj_mock.show.return_value = prop_dict
|
||||
|
||||
ret_val = images.get_glance_image_property('con', 'uuid', 'prop1')
|
||||
ret_val = images.get_glance_image_properties('con', 'uuid',
|
||||
['p1', 'p2', 'p3'])
|
||||
image_service_mock.assert_called_once_with(version=1, context='con')
|
||||
image_service_obj_mock.show.assert_called_once_with('uuid')
|
||||
self.assertEqual('val1', ret_val)
|
||||
self.assertEqual({'p1': 'v1',
|
||||
'p2': 'v2',
|
||||
'p3': None}, ret_val)
|
||||
|
||||
ret_val = images.get_glance_image_property('con', 'uuid', 'prop2')
|
||||
self.assertIsNone(ret_val)
|
||||
@mock.patch.object(image_service, 'Service')
|
||||
def test_get_glance_image_properties_default_all(
|
||||
self, image_service_mock):
|
||||
|
||||
prop_dict = {'properties': {'p1': 'v1',
|
||||
'p2': 'v2'}}
|
||||
|
||||
image_service_obj_mock = image_service_mock.return_value
|
||||
image_service_obj_mock.show.return_value = prop_dict
|
||||
|
||||
ret_val = images.get_glance_image_properties('con', 'uuid')
|
||||
image_service_mock.assert_called_once_with(version=1, context='con')
|
||||
image_service_obj_mock.show.assert_called_once_with('uuid')
|
||||
self.assertEqual({'p1': 'v1',
|
||||
'p2': 'v2'}, ret_val)
|
||||
|
||||
@mock.patch.object(image_service, 'Service')
|
||||
def test_get_glance_image_properties_with_prop_subset(
|
||||
self, image_service_mock):
|
||||
|
||||
prop_dict = {'properties': {'p1': 'v1',
|
||||
'p2': 'v2',
|
||||
'p3': 'v3'}}
|
||||
|
||||
image_service_obj_mock = image_service_mock.return_value
|
||||
image_service_obj_mock.show.return_value = prop_dict
|
||||
|
||||
ret_val = images.get_glance_image_properties('con', 'uuid',
|
||||
['p1', 'p3'])
|
||||
image_service_mock.assert_called_once_with(version=1, context='con')
|
||||
image_service_obj_mock.show.assert_called_once_with('uuid')
|
||||
self.assertEqual({'p1': 'v1',
|
||||
'p3': 'v3'}, ret_val)
|
||||
|
||||
@mock.patch.object(image_service, 'Service')
|
||||
def test_get_temp_url_for_glance_image(self, image_service_mock):
|
||||
|
Loading…
x
Reference in New Issue
Block a user