@@ -852,6 +852,7 @@ def _create_test_instance():
852
852
'vcpu_model': None,
853
853
'host': 'fake-host',
854
854
'task_state': None,
855
+ 'vm_state': None,
855
856
'trusted_certs': None
856
857
}
857
858
@@ -17096,8 +17097,8 @@ def fake_prepare(instance, name, tag):
17096
17097
prepare.side_effect = fake_prepare
17097
17098
drvr = libvirt_driver.LibvirtDriver(virtapi, False)
17098
17099
17099
- instance = objects.Instance(vm_state=vm_states.BUILDING,
17100
- **self.test_instance)
17100
+ instance = objects.Instance(**self.test_instance)
17101
+ instance.vm_state = vm_states.BUILDING
17101
17102
vifs = [{'id': uuids.vif_1, 'active': False},
17102
17103
{'id': uuids.vif_2, 'active': False}]
17103
17104
@@ -18866,6 +18867,7 @@ def _create_instance(self, params=None):
18866
18867
inst['system_metadata'] = {}
18867
18868
inst['metadata'] = {}
18868
18869
inst['task_state'] = None
18870
+ inst['vm_state'] = None
18869
18871
18870
18872
inst.update(params)
18871
18873
@@ -19849,6 +19851,54 @@ def test_is_booted_from_volume(self):
19849
19851
bdm.append({'boot_index': 0})
19850
19852
self.assertTrue(func(bdi))
19851
19853
19854
+ def test_unshelve_noop_flatten_fetch_image_cache(self):
19855
+ instance = self._create_instance(
19856
+ params={'vm_state': vm_states.SHELVED_OFFLOADED})
19857
+ drvr = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False)
19858
+ mock_imagebackend = mock.Mock(spec=imagebackend.Lvm)
19859
+ mock_imagebackend.flatten.side_effect = NotImplementedError()
19860
+
19861
+ # Assert that this doesn't raise NotImplementedError
19862
+ drvr._try_fetch_image_cache(mock_imagebackend, mock.sentinel.fetch,
19863
+ self.context, mock.sentinel.filename, uuids.image_id,
19864
+ instance, mock.sentinel.size)
19865
+
19866
+ # Assert that we cache and then flatten the image when an instance is
19867
+ # still SHELVED_OFFLOADED during _try_fetch_image_cache.
19868
+ mock_imagebackend.cache.assert_called_once_with(
19869
+ fetch_func=mock.sentinel.fetch, context=self.context,
19870
+ filename=mock.sentinel.filename, image_id=uuids.image_id,
19871
+ size=mock.sentinel.size, trusted_certs=instance.trusted_certs)
19872
+ mock_imagebackend.flatten.assert_called_once()
19873
+
19874
+ def test_unshelve_rbd_image_flatten_during_fetch_image_cache(self):
19875
+ instance = self._create_instance(
19876
+ params={'vm_state': vm_states.SHELVED_OFFLOADED})
19877
+ drvr = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False)
19878
+ mock_rbd_driver = mock.Mock(spec=rbd_utils.RBDDriver)
19879
+ mock_rbd_imagebackend = mock.Mock(spec=imagebackend.Rbd)
19880
+ mock_rbd_imagebackend.rbd_name = mock.sentinel.rbd_name
19881
+ mock_rbd_imagebackend.pool = mock.sentinel.rbd_pool
19882
+ # This is logged so we can't use a sentinel
19883
+ mock_rbd_imagebackend.path = 'rbd:pool/vol_disk'
19884
+ mock_rbd_imagebackend.driver = mock_rbd_driver
19885
+ mock_rbd_imagebackend.flatten.side_effect = \
19886
+ imagebackend.Rbd.flatten(mock_rbd_imagebackend)
19887
+
19888
+ drvr._try_fetch_image_cache(mock_rbd_imagebackend, mock.sentinel.fetch,
19889
+ self.context, mock.sentinel.filename, uuids.image_id,
19890
+ instance, mock.sentinel.size)
19891
+
19892
+ # Assert that we cache and then flatten the image when an instance is
19893
+ # still SHELVED_OFFLOADED during _try_fetch_image_cache.
19894
+ mock_rbd_imagebackend.cache.assert_called_once_with(
19895
+ fetch_func=mock.sentinel.fetch, context=self.context,
19896
+ filename=mock.sentinel.filename, image_id=uuids.image_id,
19897
+ size=mock.sentinel.size, trusted_certs=instance.trusted_certs)
19898
+ mock_rbd_imagebackend.flatten.assert_called_once()
19899
+ mock_rbd_driver.flatten.assert_called_once_with(
19900
+ mock.sentinel.rbd_name, pool=mock.sentinel.rbd_pool)
19901
+
19852
19902
@mock.patch('nova.virt.libvirt.driver.imagebackend')
19853
19903
@mock.patch('nova.virt.libvirt.driver.LibvirtDriver._inject_data')
19854
19904
@mock.patch('nova.virt.libvirt.driver.imagecache')
0 commit comments