@@ -856,6 +856,7 @@ def _create_test_instance():
856
856
'vcpu_model': None,
857
857
'host': 'fake-host',
858
858
'task_state': None,
859
+ 'vm_state': None,
859
860
'trusted_certs': None
860
861
}
861
862
@@ -16910,8 +16911,8 @@ def fake_prepare(instance, name, tag):
16910
16911
prepare.side_effect = fake_prepare
16911
16912
drvr = libvirt_driver.LibvirtDriver(virtapi, False)
16912
16913
16913
- instance = objects.Instance(vm_state=vm_states.BUILDING,
16914
- **self.test_instance)
16914
+ instance = objects.Instance(**self.test_instance)
16915
+ instance.vm_state = vm_states.BUILDING
16915
16916
vifs = [{'id': uuids.vif_1, 'active': False},
16916
16917
{'id': uuids.vif_2, 'active': False}]
16917
16918
@@ -18306,6 +18307,7 @@ def _create_instance(self, params=None):
18306
18307
inst['system_metadata'] = {}
18307
18308
inst['metadata'] = {}
18308
18309
inst['task_state'] = None
18310
+ inst['vm_state'] = None
18309
18311
18310
18312
inst.update(params)
18311
18313
@@ -19289,6 +19291,54 @@ def test_is_booted_from_volume(self):
19289
19291
bdm.append({'boot_index': 0})
19290
19292
self.assertTrue(func(bdi))
19291
19293
19294
+ def test_unshelve_noop_flatten_fetch_image_cache(self):
19295
+ instance = self._create_instance(
19296
+ params={'vm_state': vm_states.SHELVED_OFFLOADED})
19297
+ drvr = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False)
19298
+ mock_imagebackend = mock.Mock(spec=imagebackend.Lvm)
19299
+ mock_imagebackend.flatten.side_effect = NotImplementedError()
19300
+
19301
+ # Assert that this doesn't raise NotImplementedError
19302
+ drvr._try_fetch_image_cache(mock_imagebackend, mock.sentinel.fetch,
19303
+ self.context, mock.sentinel.filename, uuids.image_id,
19304
+ instance, mock.sentinel.size)
19305
+
19306
+ # Assert that we cache and then flatten the image when an instance is
19307
+ # still SHELVED_OFFLOADED during _try_fetch_image_cache.
19308
+ mock_imagebackend.cache.assert_called_once_with(
19309
+ fetch_func=mock.sentinel.fetch, context=self.context,
19310
+ filename=mock.sentinel.filename, image_id=uuids.image_id,
19311
+ size=mock.sentinel.size, trusted_certs=instance.trusted_certs)
19312
+ mock_imagebackend.flatten.assert_called_once()
19313
+
19314
+ def test_unshelve_rbd_image_flatten_during_fetch_image_cache(self):
19315
+ instance = self._create_instance(
19316
+ params={'vm_state': vm_states.SHELVED_OFFLOADED})
19317
+ drvr = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False)
19318
+ mock_rbd_driver = mock.Mock(spec=rbd_utils.RBDDriver)
19319
+ mock_rbd_imagebackend = mock.Mock(spec=imagebackend.Rbd)
19320
+ mock_rbd_imagebackend.rbd_name = mock.sentinel.rbd_name
19321
+ mock_rbd_imagebackend.pool = mock.sentinel.rbd_pool
19322
+ # This is logged so we can't use a sentinel
19323
+ mock_rbd_imagebackend.path = 'rbd:pool/vol_disk'
19324
+ mock_rbd_imagebackend.driver = mock_rbd_driver
19325
+ mock_rbd_imagebackend.flatten.side_effect = \
19326
+ imagebackend.Rbd.flatten(mock_rbd_imagebackend)
19327
+
19328
+ drvr._try_fetch_image_cache(mock_rbd_imagebackend, mock.sentinel.fetch,
19329
+ self.context, mock.sentinel.filename, uuids.image_id,
19330
+ instance, mock.sentinel.size)
19331
+
19332
+ # Assert that we cache and then flatten the image when an instance is
19333
+ # still SHELVED_OFFLOADED during _try_fetch_image_cache.
19334
+ mock_rbd_imagebackend.cache.assert_called_once_with(
19335
+ fetch_func=mock.sentinel.fetch, context=self.context,
19336
+ filename=mock.sentinel.filename, image_id=uuids.image_id,
19337
+ size=mock.sentinel.size, trusted_certs=instance.trusted_certs)
19338
+ mock_rbd_imagebackend.flatten.assert_called_once()
19339
+ mock_rbd_driver.flatten.assert_called_once_with(
19340
+ mock.sentinel.rbd_name, pool=mock.sentinel.rbd_pool)
19341
+
19292
19342
@mock.patch('nova.virt.libvirt.driver.imagebackend')
19293
19343
@mock.patch('nova.virt.libvirt.driver.LibvirtDriver._inject_data')
19294
19344
@mock.patch('nova.virt.libvirt.driver.imagecache')
0 commit comments