ironic: convert driver to use nova.objects.ImageMeta

Convert the ironic driver and related files to make use of
the nova.objects.ImageMeta object. Where an image_meta
dict is passed in via the virt API, it is converted to
object form before being used.

Change-Id: Icc1c6ab43fd6ac61a979c6c6676c1960c9cd0639
This commit is contained in:
Daniel P. Berrange 2015-06-08 14:20:35 +01:00
parent 3eea2a4492
commit 5a82d650bd
5 changed files with 28 additions and 12 deletions

View File

@ -799,11 +799,15 @@ class IronicDriverTestCase(test.NoDBTestCase):
fake_looping_call = FakeLoopingCall()
mock_looping.return_value = fake_looping_call
self.driver.spawn(self.ctx, instance, None, [], None)
image_meta = ironic_utils.get_test_image_meta()
self.driver.spawn(self.ctx, instance, image_meta, [], None)
mock_node.get.assert_called_once_with(node_uuid)
mock_node.validate.assert_called_once_with(node_uuid)
mock_adf.assert_called_once_with(node, instance, None, fake_flavor)
mock_adf.assert_called_once_with(node, instance,
test.MatchType(objects.ImageMeta),
fake_flavor)
mock_pvifs.assert_called_once_with(node, instance, None)
mock_sf.assert_called_once_with(instance, None)
mock_node.set_provision_state.assert_called_once_with(node_uuid,
@ -875,11 +879,11 @@ class IronicDriverTestCase(test.NoDBTestCase):
node = ironic_utils.get_test_node(driver='fake')
instance = fake_instance.fake_instance_obj(self.ctx,
node=node.uuid)
image_meta = ironic_utils.get_test_image_meta()
image_meta = ironic_utils.get_test_image_meta_object()
flavor = ironic_utils.get_test_flavor()
self.driver._add_driver_fields(node, instance, image_meta, flavor)
expected_patch = [{'path': '/instance_info/image_source', 'op': 'add',
'value': image_meta['id']},
'value': image_meta.id},
{'path': '/instance_info/root_gb', 'op': 'add',
'value': str(instance.root_gb)},
{'path': '/instance_info/swap_mb', 'op': 'add',
@ -902,7 +906,7 @@ class IronicDriverTestCase(test.NoDBTestCase):
node = ironic_utils.get_test_node(driver='fake')
instance = fake_instance.fake_instance_obj(self.ctx,
node=node.uuid)
image_meta = ironic_utils.get_test_image_meta()
image_meta = ironic_utils.get_test_image_meta_object()
flavor = ironic_utils.get_test_flavor()
self.assertRaises(exception.InstanceDeployFailure,
self.driver._add_driver_fields,
@ -1541,8 +1545,10 @@ class IronicDriverTestCase(test.NoDBTestCase):
mock_save.assert_called_once_with(
expected_task_state=[task_states.REBUILDING])
mock_driver_fields.assert_called_once_with(node, instance, image_meta,
flavor, preserve)
mock_driver_fields.assert_called_once_with(
node, instance,
test.MatchType(objects.ImageMeta),
flavor, preserve)
mock_set_pstate.assert_called_once_with(node_uuid,
ironic_states.REBUILD)
mock_looping.assert_called_once_with(mock_wait_active,

View File

@ -28,7 +28,7 @@ class IronicDriverFieldsTestCase(test.NoDBTestCase):
def setUp(self):
super(IronicDriverFieldsTestCase, self).setUp()
self.image_meta = ironic_utils.get_test_image_meta()
self.image_meta = ironic_utils.get_test_image_meta_object()
self.flavor = ironic_utils.get_test_flavor()
self.ctx = nova_context.get_admin_context()
self.instance = fake_instance.fake_instance_obj(self.ctx)
@ -36,7 +36,7 @@ class IronicDriverFieldsTestCase(test.NoDBTestCase):
# Generic expected patches
self._expected_deploy_patch = [
{'path': '/instance_info/image_source',
'value': self.image_meta['id'],
'value': self.image_meta.id,
'op': 'add'},
{'path': '/instance_info/root_gb',
'value': str(self.instance['root_gb']),

View File

@ -76,6 +76,11 @@ def get_test_image_meta(**kw):
return {'id': kw.get('id', 'cccccccc-cccc-cccc-cccc-cccccccccccc')}
def get_test_image_meta_object(**kw):
return objects.ImageMeta.from_dict(
get_test_image_meta(**kw))
class FakePortClient(object):
def get(self, port_uuid):

View File

@ -727,6 +727,9 @@ class IronicDriver(virt_driver.ComputeDriver):
information. Ignored by this driver.
"""
LOG.debug('Spawn called for instance', instance=instance)
image_meta = objects.ImageMeta.from_dict(image_meta)
# The compute manager is meant to know the node uuid, so missing uuid
# is a significant issue. It may mean we've been passed the wrong data.
node_uuid = instance.get('node')
@ -1165,6 +1168,9 @@ class IronicDriver(virt_driver.ComputeDriver):
"""
LOG.debug('Rebuild called for instance', instance=instance)
image_meta = objects.ImageMeta.from_dict(image_meta)
instance.task_state = task_states.REBUILD_SPAWNING
instance.save(expected_task_state=[task_states.REBUILDING])

View File

@ -47,8 +47,7 @@ class GenericDriverFields(object):
"""Build a patch to add the required fields to deploy a node.
:param instance: the instance object.
:param image_meta: the metadata associated with the instance
image.
:param image_meta: the nova.objects.ImageMeta object instance
:param flavor: the flavor object.
:param preserve_ephemeral: preserve_ephemeral status (bool) to be
specified during rebuild.
@ -57,7 +56,7 @@ class GenericDriverFields(object):
"""
patch = []
patch.append({'path': '/instance_info/image_source', 'op': 'add',
'value': image_meta['id']})
'value': image_meta.id})
patch.append({'path': '/instance_info/root_gb', 'op': 'add',
'value': str(instance.root_gb)})
patch.append({'path': '/instance_info/swap_mb', 'op': 'add',