summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--nova/tests/test_imagecache.py42
-rw-r--r--nova/virt/libvirt/imagecache.py43
2 files changed, 63 insertions, 22 deletions
diff --git a/nova/tests/test_imagecache.py b/nova/tests/test_imagecache.py
index bf08a7ea3..4b1b5dac4 100644
--- a/nova/tests/test_imagecache.py
+++ b/nova/tests/test_imagecache.py
@@ -26,6 +26,7 @@ import time
from nova import test
+from nova.compute import task_states
from nova import db
from nova import flags
from nova import log
@@ -148,15 +149,18 @@ class ImageCacheManagerTestCase(test.TestCase):
lambda x: [{'image_ref': '1',
'host': FLAGS.host,
'name': 'inst-1',
- 'uuid': '123'},
+ 'uuid': '123',
+ 'task_state': ''},
{'image_ref': '2',
'host': FLAGS.host,
'name': 'inst-2',
- 'uuid': '456'},
+ 'uuid': '456',
+ 'task_state': ''},
{'image_ref': '2',
'host': 'remotehost',
'name': 'inst-3',
- 'uuid': '789'}])
+ 'uuid': '789',
+ 'task_state': ''}])
image_cache_manager = imagecache.ImageCacheManager()
@@ -173,6 +177,26 @@ class ImageCacheManagerTestCase(test.TestCase):
self.assertEqual(image_cache_manager.image_popularity['1'], 1)
self.assertEqual(image_cache_manager.image_popularity['2'], 2)
+ def test_list_resizing_instances(self):
+ self.stubs.Set(db, 'instance_get_all',
+ lambda x: [{'image_ref': '1',
+ 'host': FLAGS.host,
+ 'name': 'inst-1',
+ 'uuid': '123',
+ 'task_state': task_states.RESIZE_VERIFY}])
+
+ image_cache_manager = imagecache.ImageCacheManager()
+ image_cache_manager._list_running_instances(None)
+
+ self.assertEqual(len(image_cache_manager.used_images), 1)
+ self.assertTrue(image_cache_manager.used_images['1'] ==
+ (1, 0, ['inst-1']))
+ self.assertTrue(image_cache_manager.instance_names ==
+ set(['inst-1', 'inst-1_resize']))
+
+ self.assertEqual(len(image_cache_manager.image_popularity), 1)
+ self.assertEqual(image_cache_manager.image_popularity['1'], 1)
+
def test_list_backing_images_small(self):
self.stubs.Set(os, 'listdir',
lambda x: ['_base', 'instance-00000001',
@@ -741,11 +765,13 @@ class ImageCacheManagerTestCase(test.TestCase):
lambda x: [{'image_ref': '1',
'host': FLAGS.host,
'name': 'instance-1',
- 'uuid': '123'},
+ 'uuid': '123',
+ 'task_state': ''},
{'image_ref': '1',
'host': FLAGS.host,
'name': 'instance-2',
- 'uuid': '456'}])
+ 'uuid': '456',
+ 'task_state': ''}])
image_cache_manager = imagecache.ImageCacheManager()
@@ -838,11 +864,13 @@ class ImageCacheManagerTestCase(test.TestCase):
lambda x: [{'image_ref': '1',
'host': FLAGS.host,
'name': 'instance-1',
- 'uuid': '123'},
+ 'uuid': '123',
+ 'task_state': ''},
{'image_ref': '1',
'host': FLAGS.host,
'name': 'instance-2',
- 'uuid': '456'}])
+ 'uuid': '456',
+ 'task_state': ''}])
def touch(filename):
f = open(filename, 'w')
diff --git a/nova/virt/libvirt/imagecache.py b/nova/virt/libvirt/imagecache.py
index e65d61067..e8536bb46 100644
--- a/nova/virt/libvirt/imagecache.py
+++ b/nova/virt/libvirt/imagecache.py
@@ -28,6 +28,7 @@ import os
import re
import time
+from nova.compute import task_states
from nova import db
from nova import flags
from nova import log as logging
@@ -130,11 +131,21 @@ class ImageCacheManager(object):
"""List running instances (on all compute nodes)."""
self.used_images = {}
self.image_popularity = {}
- self.instance_names = {}
+ self.instance_names = set()
instances = db.instance_get_all(context)
for instance in instances:
- self.instance_names[instance['name']] = instance['uuid']
+ self.instance_names.add(instance['name'])
+
+ resize_states = [task_states.RESIZE_PREP,
+ task_states.RESIZE_MIGRATING,
+ task_states.RESIZE_MIGRATED,
+ task_states.RESIZE_FINISH,
+ task_states.RESIZE_REVERTING,
+ task_states.RESIZE_CONFIRMING,
+ task_states.RESIZE_VERIFY]
+ if instance['task_state'] in resize_states:
+ self.instance_names.add(instance['name'] + '_resize')
image_ref_str = str(instance['image_ref'])
local, remote, insts = self.used_images.get(image_ref_str,
@@ -164,19 +175,21 @@ class ImageCacheManager(object):
{'instance': ent,
'backing': backing_file})
- backing_path = os.path.join(FLAGS.instances_path,
- FLAGS.base_dir_name,
- backing_file)
- if not backing_path in inuse_images:
- inuse_images.append(backing_path)
-
- if backing_path in self.unexplained_images:
- LOG.warning(_('Instance %(instance)s is using a '
- 'backing file %(backing)s which does '
- 'not appear in the image service'),
- {'instance': ent,
- 'backing': backing_file})
- self.unexplained_images.remove(backing_path)
+ if backing_file:
+ backing_path = os.path.join(FLAGS.instances_path,
+ FLAGS.base_dir_name,
+ backing_file)
+ if not backing_path in inuse_images:
+ inuse_images.append(backing_path)
+
+ if backing_path in self.unexplained_images:
+ LOG.warning(_('Instance %(instance)s is using a '
+ 'backing file %(backing)s which '
+ 'does not appear in the image '
+ 'service'),
+ {'instance': ent,
+ 'backing': backing_file})
+ self.unexplained_images.remove(backing_path)
return inuse_images