From b27b299e1a1b7a7d594c89fceaa77f61fe59a2d2 Mon Sep 17 00:00:00 2001 From: Michael Still Date: Wed, 14 Nov 2012 18:37:04 +1100 Subject: [PATCH] Detect shared storage; handle base cleanup better. If base image storage is shared, we need to care about remote instances when we clean up. This patch "learns" which storage is shared, and then decides what base images are in use anywhere on the set of compute nodes which share that base storage. This is complicated because shared instance storage doesn't have to be per-cluster. It could for example be per rack. We need to handle that properly. This should resolve bug 1078594. Change-Id: I36d0d6e965b114bb68c8f7b7fd43f8e96b2dd8f5 --- nova/tests/test_imagecache.py | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/nova/tests/test_imagecache.py b/nova/tests/test_imagecache.py index 78b7248b..09570204 100644 --- a/nova/tests/test_imagecache.py +++ b/nova/tests/test_imagecache.py @@ -627,22 +627,22 @@ class ImageCacheManagerTestCase(test.TestCase): self.assertEquals(image_cache_manager.corrupt_base_files, []) def test_handle_base_image_used_remotely(self): + self.stubs.Set(virtutils, 'chown', lambda x, y: None) img = '123' with self._make_base_file() as fname: os.utime(fname, (-1, time.time() - 3601)) image_cache_manager = imagecache.ImageCacheManager() + image_cache_manager.unexplained_images = [fname] image_cache_manager.used_images = {'123': (0, 1, ['banana-42'])} - image_cache_manager._handle_base_image(img, None) + image_cache_manager._handle_base_image(img, fname) self.assertEquals(image_cache_manager.unexplained_images, []) self.assertEquals(image_cache_manager.removable_base_files, []) self.assertEquals(image_cache_manager.corrupt_base_files, []) def test_handle_base_image_absent(self): - """Ensure we warn for use of a missing base image.""" - img = '123' with self._intercept_log_messages() as stream: @@ -942,7 +942,10 @@ class ImageCacheManagerTestCase(test.TestCase): 'vm_state': '', 'task_state': ''}] - self.stubs.Set(db, 'instance_get_all', fake_get_all) - compute = importutils.import_object(CONF.compute_manager) - compute._run_image_cache_manager_pass(None) - self.assertTrue(was['called']) + with utils.tempdir() as tmpdir: + self.flags(instances_path=tmpdir) + + self.stubs.Set(db, 'instance_get_all', fake_get_all) + compute = importutils.import_object(CONF.compute_manager) + compute._run_image_cache_manager_pass(None) + self.assertTrue(was['called'])