167 lines
6.8 KiB
Python
167 lines
6.8 KiB
Python
# Copyright 2013 OpenStack Foundation
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
# not use this file except in compliance with the License. You may obtain
|
|
# a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
# License for the specific language governing permissions and limitations
|
|
# under the License.
|
|
|
|
import mock
|
|
|
|
from nova import block_device
|
|
from nova.compute import vm_states
|
|
import nova.conf
|
|
from nova import context
|
|
from nova import objects
|
|
from nova.objects import block_device as block_device_obj
|
|
from nova import test
|
|
from nova.tests.unit import fake_instance
|
|
from nova.tests import uuidsentinel as uuids
|
|
from nova.virt import imagecache
|
|
|
|
CONF = nova.conf.CONF
|
|
|
|
swap_bdm_128 = [block_device.BlockDeviceDict(
|
|
{'id': 1, 'instance_uuid': uuids.instance,
|
|
'device_name': '/dev/sdb1',
|
|
'source_type': 'blank',
|
|
'destination_type': 'local',
|
|
'delete_on_termination': True,
|
|
'guest_format': 'swap',
|
|
'disk_bus': 'scsi',
|
|
'volume_size': 128,
|
|
'boot_index': -1})]
|
|
|
|
swap_bdm_256 = [block_device.BlockDeviceDict(
|
|
{'id': 1, 'instance_uuid': uuids.instance,
|
|
'device_name': '/dev/sdb1',
|
|
'source_type': 'blank',
|
|
'destination_type': 'local',
|
|
'delete_on_termination': True,
|
|
'guest_format': 'swap',
|
|
'disk_bus': 'scsi',
|
|
'volume_size': 256,
|
|
'boot_index': -1})]
|
|
|
|
|
|
class ImageCacheManagerTests(test.NoDBTestCase):
|
|
|
|
def test_configurationi_defaults(self):
|
|
self.assertEqual(2400, CONF.image_cache_manager_interval)
|
|
self.assertEqual('_base', CONF.image_cache_subdirectory_name)
|
|
self.assertTrue(CONF.remove_unused_base_images)
|
|
self.assertEqual(24 * 3600,
|
|
CONF.remove_unused_original_minimum_age_seconds)
|
|
|
|
def test_cache_manager(self):
|
|
cache_manager = imagecache.ImageCacheManager()
|
|
self.assertTrue(cache_manager.remove_unused_base_images)
|
|
self.assertRaises(NotImplementedError,
|
|
cache_manager.update, None, [])
|
|
self.assertRaises(NotImplementedError,
|
|
cache_manager._get_base)
|
|
self.assertRaises(NotImplementedError,
|
|
cache_manager._scan_base_images, None)
|
|
self.assertRaises(NotImplementedError,
|
|
cache_manager._age_and_verify_cached_images,
|
|
None, [], None)
|
|
|
|
@mock.patch.object(objects.BlockDeviceMappingList,
|
|
'bdms_by_instance_uuid')
|
|
def test_list_running_instances(self, mock_bdms_by_uuid):
|
|
instances = [{'image_ref': '1',
|
|
'host': CONF.host,
|
|
'id': '1',
|
|
'uuid': uuids.instance_1,
|
|
'vm_state': '',
|
|
'task_state': ''},
|
|
{'image_ref': '2',
|
|
'host': CONF.host,
|
|
'id': '2',
|
|
'uuid': uuids.instance_2,
|
|
'vm_state': '',
|
|
'task_state': ''},
|
|
{'image_ref': '2',
|
|
'kernel_id': '21',
|
|
'ramdisk_id': '22',
|
|
'host': 'remotehost',
|
|
'id': '3',
|
|
'uuid': uuids.instance_3,
|
|
'vm_state': '',
|
|
'task_state': ''}]
|
|
|
|
all_instances = [fake_instance.fake_instance_obj(None, **instance)
|
|
for instance in instances]
|
|
|
|
image_cache_manager = imagecache.ImageCacheManager()
|
|
|
|
ctxt = context.get_admin_context()
|
|
swap_bdm_256_list = block_device_obj.block_device_make_list_from_dicts(
|
|
ctxt, swap_bdm_256)
|
|
swap_bdm_128_list = block_device_obj.block_device_make_list_from_dicts(
|
|
ctxt, swap_bdm_128)
|
|
mock_bdms_by_uuid.return_value = {uuids.instance_1: swap_bdm_256_list,
|
|
uuids.instance_2: swap_bdm_128_list,
|
|
uuids.instance_3: swap_bdm_128_list}
|
|
# The argument here should be a context, but it's mocked out
|
|
running = image_cache_manager._list_running_instances(ctxt,
|
|
all_instances)
|
|
|
|
mock_bdms_by_uuid.assert_called_once_with(ctxt,
|
|
[uuids.instance_1, uuids.instance_2, uuids.instance_3])
|
|
self.assertEqual(4, len(running['used_images']))
|
|
self.assertEqual((1, 0, ['instance-00000001']),
|
|
running['used_images']['1'])
|
|
self.assertEqual((1, 1, ['instance-00000002',
|
|
'instance-00000003']),
|
|
running['used_images']['2'])
|
|
self.assertEqual((0, 1, ['instance-00000003']),
|
|
running['used_images']['21'])
|
|
self.assertEqual((0, 1, ['instance-00000003']),
|
|
running['used_images']['22'])
|
|
|
|
self.assertIn('instance-00000001', running['instance_names'])
|
|
self.assertIn(uuids.instance_1, running['instance_names'])
|
|
|
|
self.assertEqual(len(running['used_swap_images']), 2)
|
|
self.assertIn('swap_128', running['used_swap_images'])
|
|
self.assertIn('swap_256', running['used_swap_images'])
|
|
|
|
@mock.patch.object(objects.BlockDeviceMappingList,
|
|
'bdms_by_instance_uuid')
|
|
def test_list_resizing_instances(self, mock_bdms_by_uuid):
|
|
instances = [{'image_ref': '1',
|
|
'host': CONF.host,
|
|
'id': '1',
|
|
'uuid': uuids.instance,
|
|
'vm_state': vm_states.RESIZED,
|
|
'task_state': None}]
|
|
|
|
all_instances = [fake_instance.fake_instance_obj(None, **instance)
|
|
for instance in instances]
|
|
|
|
image_cache_manager = imagecache.ImageCacheManager()
|
|
|
|
ctxt = context.get_admin_context()
|
|
bdms = block_device_obj.block_device_make_list_from_dicts(
|
|
ctxt, swap_bdm_256)
|
|
mock_bdms_by_uuid.return_value = {uuids.instance: bdms}
|
|
|
|
running = image_cache_manager._list_running_instances(ctxt,
|
|
all_instances)
|
|
|
|
mock_bdms_by_uuid.assert_called_once_with(ctxt, [uuids.instance])
|
|
self.assertEqual(1, len(running['used_images']))
|
|
self.assertEqual((1, 0, ['instance-00000001']),
|
|
running['used_images']['1'])
|
|
self.assertEqual(set(['instance-00000001', uuids.instance,
|
|
'instance-00000001_resize',
|
|
'%s_resize' % uuids.instance]),
|
|
running['instance_names'])
|