Consolidate [image_cache] conf options
Blueprint image-precache-support added a conf section called [image_cache], so it makes sense to move all the existing image cache-related conf options into it. Old: [DEFAULT]image_cache_manager_interval [DEFAULT]image_cache_subdirectory_name [DEFAULT]remove_unused_base_images [DEFAULT]remove_unused_original_minimum_age_seconds [libvirt]remove_unused_resized_minimum_age_seconds New: [image_cache]manager_interval [image_cache]subdirectory_name [image_cache]remove_unused_base_images [image_cache]remove_unused_original_minimum_age_seconds [image_cache]remove_unused_resized_minimum_age_seconds Change-Id: I3c49825ac0d70152b6c8ee4c8ca01546265f4b80 Partial-Bug: #1847302
This commit is contained in:
@@ -926,18 +926,11 @@ cached images are stored.
|
|||||||
have a shared file system.
|
have a shared file system.
|
||||||
|
|
||||||
You can automatically purge unused images after a specified period of time. To
|
You can automatically purge unused images after a specified period of time. To
|
||||||
configure this action, set these options in the ``DEFAULT`` section in the
|
configure this action, set these options in the :oslo.config:group`image_cache`
|
||||||
``nova.conf`` file:
|
section in the ``nova.conf`` file:
|
||||||
|
|
||||||
``remove_unused_base_images``
|
* :oslo.config:option:`image_cache.remove_unused_base_images`
|
||||||
Set this option to ``True`` to specify that unused images should be removed
|
* :oslo.config:option:`image_cache.remove_unused_original_minimum_age_seconds`
|
||||||
after the duration specified in the
|
|
||||||
``remove_unused_original_minimum_age_seconds`` option. The default is
|
|
||||||
``True``.
|
|
||||||
|
|
||||||
``remove_unused_original_minimum_age_seconds``
|
|
||||||
Specifies the duration in seconds after which an unused image is purged from
|
|
||||||
the cache. The default is ``86400`` (24 hours).
|
|
||||||
|
|
||||||
.. _vmware-networking:
|
.. _vmware-networking:
|
||||||
|
|
||||||
|
|||||||
@@ -38,13 +38,8 @@ default). Those unused images are deleted from the cache directory
|
|||||||
until they are needed again.
|
until they are needed again.
|
||||||
|
|
||||||
For more information about configuring image cache behavior, see the
|
For more information about configuring image cache behavior, see the
|
||||||
documentation for the following configuration options:
|
documentation for the configuration options in the
|
||||||
|
:oslo.config:group:`image_cache` group.
|
||||||
- :oslo.config:option:`image_cache_subdirectory_name`
|
|
||||||
- :oslo.config:option:`image_cache_manager_interval`
|
|
||||||
- :oslo.config:option:`remove_unused_base_images`
|
|
||||||
- :oslo.config:option:`remove_unused_original_minimum_age_seconds`
|
|
||||||
- :oslo.config:option:`image_cache.precache_concurrency`
|
|
||||||
|
|
||||||
.. note::
|
.. note::
|
||||||
|
|
||||||
|
|||||||
@@ -9698,7 +9698,7 @@ class ComputeManager(manager.Manager):
|
|||||||
else:
|
else:
|
||||||
self._process_instance_event(instance, event)
|
self._process_instance_event(instance, event)
|
||||||
|
|
||||||
@periodic_task.periodic_task(spacing=CONF.image_cache_manager_interval,
|
@periodic_task.periodic_task(spacing=CONF.image_cache.manager_interval,
|
||||||
external_process_ok=True)
|
external_process_ok=True)
|
||||||
def _run_image_cache_manager_pass(self, context):
|
def _run_image_cache_manager_pass(self, context):
|
||||||
"""Run a single pass of the image cache manager."""
|
"""Run a single pass of the image cache manager."""
|
||||||
|
|||||||
@@ -264,22 +264,6 @@ driver (for qcow and raw), or loop (for raw).
|
|||||||
default=10,
|
default=10,
|
||||||
min=0,
|
min=0,
|
||||||
help='Amount of time, in seconds, to wait for NBD device start up.'),
|
help='Amount of time, in seconds, to wait for NBD device start up.'),
|
||||||
cfg.StrOpt('image_cache_subdirectory_name',
|
|
||||||
default='_base',
|
|
||||||
help="""
|
|
||||||
Location of cached images.
|
|
||||||
|
|
||||||
This is NOT the full path - just a folder name relative to '$instances_path'.
|
|
||||||
For per-compute-host cached images, set to '_base_$my_ip'
|
|
||||||
"""),
|
|
||||||
cfg.BoolOpt('remove_unused_base_images',
|
|
||||||
default=True,
|
|
||||||
help='Should unused base images be removed?'),
|
|
||||||
cfg.IntOpt('remove_unused_original_minimum_age_seconds',
|
|
||||||
default=(24 * 3600),
|
|
||||||
help="""
|
|
||||||
Unused unresized base images younger than this will not be removed.
|
|
||||||
"""),
|
|
||||||
cfg.StrOpt('pointer_model',
|
cfg.StrOpt('pointer_model',
|
||||||
default='usbtablet',
|
default='usbtablet',
|
||||||
choices=[
|
choices=[
|
||||||
@@ -954,31 +938,6 @@ Possible values:
|
|||||||
]
|
]
|
||||||
|
|
||||||
interval_opts = [
|
interval_opts = [
|
||||||
cfg.IntOpt('image_cache_manager_interval',
|
|
||||||
default=2400,
|
|
||||||
min=-1,
|
|
||||||
help="""
|
|
||||||
Number of seconds to wait between runs of the image cache manager.
|
|
||||||
|
|
||||||
Note that when using shared storage for the ``[DEFAULT]/instances_path``
|
|
||||||
configuration option across multiple nova-compute services, this periodic
|
|
||||||
could process a large number of instances. Similarly, using a compute driver
|
|
||||||
that manages a cluster (like vmwareapi.VMwareVCDriver) could result in
|
|
||||||
processing a large number of instances. Therefore you may need to adjust the
|
|
||||||
time interval for the anticipated load, or only run on one nova-compute
|
|
||||||
service within a shared storage aggregate.
|
|
||||||
|
|
||||||
Possible values:
|
|
||||||
|
|
||||||
* 0: run at the default interval of 60 seconds (not recommended)
|
|
||||||
* -1: disable
|
|
||||||
* Any other value
|
|
||||||
|
|
||||||
Related options:
|
|
||||||
|
|
||||||
* ``[DEFAULT]/compute_driver``
|
|
||||||
* ``[DEFAULT]/instances_path``
|
|
||||||
"""),
|
|
||||||
cfg.IntOpt('bandwidth_poll_interval',
|
cfg.IntOpt('bandwidth_poll_interval',
|
||||||
default=600,
|
default=600,
|
||||||
help="""
|
help="""
|
||||||
|
|||||||
@@ -19,6 +19,59 @@ imagecache_group = cfg.OptGroup(
|
|||||||
A collection of options specific to image caching.
|
A collection of options specific to image caching.
|
||||||
""")
|
""")
|
||||||
imagecache_opts = [
|
imagecache_opts = [
|
||||||
|
cfg.IntOpt('manager_interval',
|
||||||
|
default=2400,
|
||||||
|
min=-1,
|
||||||
|
deprecated_name='image_cache_manager_interval',
|
||||||
|
deprecated_group='DEFAULT',
|
||||||
|
help="""
|
||||||
|
Number of seconds to wait between runs of the image cache manager.
|
||||||
|
|
||||||
|
Note that when using shared storage for the ``[DEFAULT]/instances_path``
|
||||||
|
configuration option across multiple nova-compute services, this periodic
|
||||||
|
could process a large number of instances. Similarly, using a compute driver
|
||||||
|
that manages a cluster (like vmwareapi.VMwareVCDriver) could result in
|
||||||
|
processing a large number of instances. Therefore you may need to adjust the
|
||||||
|
time interval for the anticipated load, or only run on one nova-compute
|
||||||
|
service within a shared storage aggregate.
|
||||||
|
|
||||||
|
Possible values:
|
||||||
|
|
||||||
|
* 0: run at the default interval of 60 seconds (not recommended)
|
||||||
|
* -1: disable
|
||||||
|
* Any other value
|
||||||
|
|
||||||
|
Related options:
|
||||||
|
|
||||||
|
* ``[DEFAULT]/compute_driver``
|
||||||
|
* ``[DEFAULT]/instances_path``
|
||||||
|
"""),
|
||||||
|
cfg.StrOpt('subdirectory_name',
|
||||||
|
default='_base',
|
||||||
|
deprecated_name='image_cache_subdirectory_name',
|
||||||
|
deprecated_group='DEFAULT',
|
||||||
|
help="""
|
||||||
|
Location of cached images.
|
||||||
|
|
||||||
|
This is NOT the full path - just a folder name relative to '$instances_path'.
|
||||||
|
For per-compute-host cached images, set to '_base_$my_ip'
|
||||||
|
"""),
|
||||||
|
cfg.BoolOpt('remove_unused_base_images',
|
||||||
|
default=True,
|
||||||
|
deprecated_group='DEFAULT',
|
||||||
|
help='Should unused base images be removed?'),
|
||||||
|
cfg.IntOpt('remove_unused_original_minimum_age_seconds',
|
||||||
|
default=(24 * 3600),
|
||||||
|
deprecated_group='DEFAULT',
|
||||||
|
help="""
|
||||||
|
Unused unresized base images younger than this will not be removed.
|
||||||
|
"""),
|
||||||
|
cfg.IntOpt('remove_unused_resized_minimum_age_seconds',
|
||||||
|
default=3600,
|
||||||
|
deprecated_group='libvirt',
|
||||||
|
help="""
|
||||||
|
Unused resized base images younger than this will not be removed.
|
||||||
|
"""),
|
||||||
cfg.IntOpt('precache_concurrency',
|
cfg.IntOpt('precache_concurrency',
|
||||||
default=1,
|
default=1,
|
||||||
min=1,
|
min=1,
|
||||||
|
|||||||
@@ -953,13 +953,6 @@ Requires:
|
|||||||
"""),
|
"""),
|
||||||
]
|
]
|
||||||
|
|
||||||
libvirt_imagecache_opts = [
|
|
||||||
cfg.IntOpt('remove_unused_resized_minimum_age_seconds',
|
|
||||||
default=3600,
|
|
||||||
help='Unused resized base images younger than this will not be '
|
|
||||||
'removed'),
|
|
||||||
]
|
|
||||||
|
|
||||||
libvirt_lvm_opts = [
|
libvirt_lvm_opts = [
|
||||||
cfg.StrOpt('volume_clear',
|
cfg.StrOpt('volume_clear',
|
||||||
default='zero',
|
default='zero',
|
||||||
@@ -1364,7 +1357,6 @@ For example::
|
|||||||
ALL_OPTS = list(itertools.chain(
|
ALL_OPTS = list(itertools.chain(
|
||||||
libvirt_general_opts,
|
libvirt_general_opts,
|
||||||
libvirt_imagebackend_opts,
|
libvirt_imagebackend_opts,
|
||||||
libvirt_imagecache_opts,
|
|
||||||
libvirt_lvm_opts,
|
libvirt_lvm_opts,
|
||||||
libvirt_utils_opts,
|
libvirt_utils_opts,
|
||||||
libvirt_vif_opts,
|
libvirt_vif_opts,
|
||||||
|
|||||||
@@ -188,7 +188,8 @@ class ImageCacheTestCase(test_base.HyperVBaseTestCase):
|
|||||||
|
|
||||||
@ddt.data(True, False)
|
@ddt.data(True, False)
|
||||||
def test_age_and_verify_cached_images(self, remove_unused_base_images):
|
def test_age_and_verify_cached_images(self, remove_unused_base_images):
|
||||||
self.flags(remove_unused_base_images=remove_unused_base_images)
|
self.flags(remove_unused_base_images=remove_unused_base_images,
|
||||||
|
group='image_cache')
|
||||||
|
|
||||||
fake_images = [mock.sentinel.FAKE_IMG1, mock.sentinel.FAKE_IMG2]
|
fake_images = [mock.sentinel.FAKE_IMG1, mock.sentinel.FAKE_IMG2]
|
||||||
fake_used_images = [mock.sentinel.FAKE_IMG1]
|
fake_used_images = [mock.sentinel.FAKE_IMG1]
|
||||||
|
|||||||
@@ -739,7 +739,7 @@ class CacheConcurrencyTestCase(test.NoDBTestCase):
|
|||||||
|
|
||||||
def fake_exists(fname):
|
def fake_exists(fname):
|
||||||
basedir = os.path.join(CONF.instances_path,
|
basedir = os.path.join(CONF.instances_path,
|
||||||
CONF.image_cache_subdirectory_name)
|
CONF.image_cache.subdirectory_name)
|
||||||
if fname == basedir or fname == self.lock_path:
|
if fname == basedir or fname == self.lock_path:
|
||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
@@ -12736,7 +12736,7 @@ class LibvirtConnTestCase(test.NoDBTestCase,
|
|||||||
conn = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False)
|
conn = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False)
|
||||||
|
|
||||||
base_dir = os.path.join(CONF.instances_path,
|
base_dir = os.path.join(CONF.instances_path,
|
||||||
CONF.image_cache_subdirectory_name)
|
CONF.image_cache.subdirectory_name)
|
||||||
trusted_certs = objects.TrustedCerts(
|
trusted_certs = objects.TrustedCerts(
|
||||||
ids=['0b5d2c72-12cc-4ba6-a8d7-3ff5cc1d8cb8',
|
ids=['0b5d2c72-12cc-4ba6-a8d7-3ff5cc1d8cb8',
|
||||||
'674736e3-f25c-405c-8362-bbf991e0ce0a'])
|
'674736e3-f25c-405c-8362-bbf991e0ce0a'])
|
||||||
@@ -12847,7 +12847,7 @@ class LibvirtConnTestCase(test.NoDBTestCase,
|
|||||||
drvr = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False)
|
drvr = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False)
|
||||||
|
|
||||||
base_dir = os.path.join(CONF.instances_path,
|
base_dir = os.path.join(CONF.instances_path,
|
||||||
CONF.image_cache_subdirectory_name)
|
CONF.image_cache.subdirectory_name)
|
||||||
instance = objects.Instance(**self.test_instance)
|
instance = objects.Instance(**self.test_instance)
|
||||||
disk_info_byname = fake_disk_info_byname(instance)
|
disk_info_byname = fake_disk_info_byname(instance)
|
||||||
|
|
||||||
@@ -23578,7 +23578,7 @@ class LibvirtDriverTestCase(test.NoDBTestCase, TraitsComparisonMixin):
|
|||||||
# are fully mocked out and are just testing string formatting in this
|
# are fully mocked out and are just testing string formatting in this
|
||||||
# test.
|
# test.
|
||||||
self.flags(instances_path='/nova/instances')
|
self.flags(instances_path='/nova/instances')
|
||||||
self.flags(image_cache_subdirectory_name='cache')
|
self.flags(subdirectory_name='cache', group='image_cache')
|
||||||
expected_fn = os.path.join('/nova/instances/cache',
|
expected_fn = os.path.join('/nova/instances/cache',
|
||||||
imagecache.get_cache_fname('an-image'))
|
imagecache.get_cache_fname('an-image'))
|
||||||
|
|
||||||
@@ -23612,7 +23612,7 @@ class LibvirtDriverTestCase(test.NoDBTestCase, TraitsComparisonMixin):
|
|||||||
# are fully mocked out and are just testing string formatting in this
|
# are fully mocked out and are just testing string formatting in this
|
||||||
# test.
|
# test.
|
||||||
self.flags(instances_path='/nova/instances')
|
self.flags(instances_path='/nova/instances')
|
||||||
self.flags(image_cache_subdirectory_name='cache')
|
self.flags(subdirectory_name='cache', group='image_cache')
|
||||||
expected_fn = os.path.join('/nova/instances/cache',
|
expected_fn = os.path.join('/nova/instances/cache',
|
||||||
imagecache.get_cache_fname('an-image'))
|
imagecache.get_cache_fname('an-image'))
|
||||||
|
|
||||||
|
|||||||
@@ -306,7 +306,7 @@ class FlatTestCase(_ImageTestCase, test.NoDBTestCase):
|
|||||||
# a non-existent backend.
|
# a non-existent backend.
|
||||||
|
|
||||||
base_dir = os.path.join(CONF.instances_path,
|
base_dir = os.path.join(CONF.instances_path,
|
||||||
CONF.image_cache_subdirectory_name)
|
CONF.image_cache.subdirectory_name)
|
||||||
|
|
||||||
# Lets assume the base image cache directory already exists
|
# Lets assume the base image cache directory already exists
|
||||||
existing = set([base_dir])
|
existing = set([base_dir])
|
||||||
|
|||||||
@@ -160,7 +160,7 @@ class ImageCacheManagerTestCase(test.NoDBTestCase):
|
|||||||
lambda x: 'e97222e91fc4241f49a7f520d1dcf446751129b3_sm')
|
lambda x: 'e97222e91fc4241f49a7f520d1dcf446751129b3_sm')
|
||||||
|
|
||||||
found = os.path.join(CONF.instances_path,
|
found = os.path.join(CONF.instances_path,
|
||||||
CONF.image_cache_subdirectory_name,
|
CONF.image_cache.subdirectory_name,
|
||||||
'e97222e91fc4241f49a7f520d1dcf446751129b3_sm')
|
'e97222e91fc4241f49a7f520d1dcf446751129b3_sm')
|
||||||
|
|
||||||
image_cache_manager = imagecache.ImageCacheManager()
|
image_cache_manager = imagecache.ImageCacheManager()
|
||||||
@@ -183,7 +183,7 @@ class ImageCacheManagerTestCase(test.NoDBTestCase):
|
|||||||
'10737418240'))
|
'10737418240'))
|
||||||
|
|
||||||
found = os.path.join(CONF.instances_path,
|
found = os.path.join(CONF.instances_path,
|
||||||
CONF.image_cache_subdirectory_name,
|
CONF.image_cache.subdirectory_name,
|
||||||
'e97222e91fc4241f49a7f520d1dcf446751129b3_'
|
'e97222e91fc4241f49a7f520d1dcf446751129b3_'
|
||||||
'10737418240')
|
'10737418240')
|
||||||
|
|
||||||
@@ -205,7 +205,7 @@ class ImageCacheManagerTestCase(test.NoDBTestCase):
|
|||||||
lambda x: 'e97222e91fc4241f49a7f520d1dcf446751129b3_sm')
|
lambda x: 'e97222e91fc4241f49a7f520d1dcf446751129b3_sm')
|
||||||
|
|
||||||
found = os.path.join(CONF.instances_path,
|
found = os.path.join(CONF.instances_path,
|
||||||
CONF.image_cache_subdirectory_name,
|
CONF.image_cache.subdirectory_name,
|
||||||
'e97222e91fc4241f49a7f520d1dcf446751129b3_sm')
|
'e97222e91fc4241f49a7f520d1dcf446751129b3_sm')
|
||||||
|
|
||||||
image_cache_manager = imagecache.ImageCacheManager()
|
image_cache_manager = imagecache.ImageCacheManager()
|
||||||
@@ -415,8 +415,8 @@ class ImageCacheManagerTestCase(test.NoDBTestCase):
|
|||||||
hashed_22 = '12c6fc06c99a462375eeb3f43dfd832b08ca9e17'
|
hashed_22 = '12c6fc06c99a462375eeb3f43dfd832b08ca9e17'
|
||||||
hashed_42 = '92cfceb39d57d914ed8b14d0e37643de0797ae56'
|
hashed_42 = '92cfceb39d57d914ed8b14d0e37643de0797ae56'
|
||||||
|
|
||||||
self.flags(instances_path='/instance_path',
|
self.flags(instances_path='/instance_path')
|
||||||
image_cache_subdirectory_name='_base')
|
self.flags(subdirectory_name='_base', group='image_cache')
|
||||||
|
|
||||||
base_file_list = ['00000001',
|
base_file_list = ['00000001',
|
||||||
'ephemeral_0_20_None',
|
'ephemeral_0_20_None',
|
||||||
|
|||||||
@@ -53,11 +53,12 @@ swap_bdm_256 = [block_device.BlockDeviceDict(
|
|||||||
class ImageCacheManagerTests(test.NoDBTestCase):
|
class ImageCacheManagerTests(test.NoDBTestCase):
|
||||||
|
|
||||||
def test_configurationi_defaults(self):
|
def test_configurationi_defaults(self):
|
||||||
self.assertEqual(2400, CONF.image_cache_manager_interval)
|
self.assertEqual(2400, CONF.image_cache.manager_interval)
|
||||||
self.assertEqual('_base', CONF.image_cache_subdirectory_name)
|
self.assertEqual('_base', CONF.image_cache.subdirectory_name)
|
||||||
self.assertTrue(CONF.remove_unused_base_images)
|
self.assertTrue(CONF.image_cache.remove_unused_base_images)
|
||||||
self.assertEqual(24 * 3600,
|
self.assertEqual(
|
||||||
CONF.remove_unused_original_minimum_age_seconds)
|
24 * 3600,
|
||||||
|
CONF.image_cache.remove_unused_original_minimum_age_seconds)
|
||||||
|
|
||||||
def test_cache_manager(self):
|
def test_cache_manager(self):
|
||||||
cache_manager = imagecache.ImageCacheManager()
|
cache_manager = imagecache.ImageCacheManager()
|
||||||
|
|||||||
@@ -213,8 +213,8 @@ class VMwareAPIVMTestCase(test.NoDBTestCase,
|
|||||||
api_retry_count=1,
|
api_retry_count=1,
|
||||||
use_linked_clone=False, group='vmware')
|
use_linked_clone=False, group='vmware')
|
||||||
self.flags(enabled=False, group='vnc')
|
self.flags(enabled=False, group='vnc')
|
||||||
self.flags(image_cache_subdirectory_name='vmware_base',
|
self.flags(subdirectory_name='vmware_base', group='image_cache')
|
||||||
my_ip='')
|
self.flags(my_ip='')
|
||||||
self.user_id = 'fake'
|
self.user_id = 'fake'
|
||||||
self.project_id = 'fake'
|
self.project_id = 'fake'
|
||||||
self.context = context.RequestContext(self.user_id, self.project_id)
|
self.context = context.RequestContext(self.user_id, self.project_id)
|
||||||
@@ -2021,7 +2021,7 @@ class VMwareAPIVMTestCase(test.NoDBTestCase,
|
|||||||
|
|
||||||
def test_image_aging_disabled(self):
|
def test_image_aging_disabled(self):
|
||||||
self._override_time()
|
self._override_time()
|
||||||
self.flags(remove_unused_base_images=False)
|
self.flags(remove_unused_base_images=False, group='image_cache')
|
||||||
self._create_vm()
|
self._create_vm()
|
||||||
self._cached_files_exist()
|
self._cached_files_exist()
|
||||||
all_instances = []
|
all_instances = []
|
||||||
@@ -2032,7 +2032,8 @@ class VMwareAPIVMTestCase(test.NoDBTestCase,
|
|||||||
def _image_aging_aged(self, aging_time=100):
|
def _image_aging_aged(self, aging_time=100):
|
||||||
self._override_time()
|
self._override_time()
|
||||||
cur_time = datetime.datetime(2012, 11, 22, 12, 00, 10)
|
cur_time = datetime.datetime(2012, 11, 22, 12, 00, 10)
|
||||||
self.flags(remove_unused_original_minimum_age_seconds=aging_time)
|
self.flags(remove_unused_original_minimum_age_seconds=aging_time,
|
||||||
|
group='image_cache')
|
||||||
self._image_aging_image_marked_for_deletion()
|
self._image_aging_image_marked_for_deletion()
|
||||||
all_instances = []
|
all_instances = []
|
||||||
self.useFixture(utils_fixture.TimeFixture(cur_time))
|
self.useFixture(utils_fixture.TimeFixture(cur_time))
|
||||||
|
|||||||
@@ -64,8 +64,8 @@ class VMwareVMOpsTestCase(test.NoDBTestCase):
|
|||||||
vmwareapi_fake.reset()
|
vmwareapi_fake.reset()
|
||||||
stubs.set_stubs(self)
|
stubs.set_stubs(self)
|
||||||
self.flags(enabled=True, group='vnc')
|
self.flags(enabled=True, group='vnc')
|
||||||
self.flags(image_cache_subdirectory_name='vmware_base',
|
self.flags(subdirectory_name='vmware_base', group='image_cache')
|
||||||
my_ip='',
|
self.flags(my_ip='',
|
||||||
flat_injected=True)
|
flat_injected=True)
|
||||||
self._context = context.RequestContext('fake_user', 'fake_project')
|
self._context = context.RequestContext('fake_user', 'fake_project')
|
||||||
self._session = driver.VMwareAPISession()
|
self._session = driver.VMwareAPISession()
|
||||||
@@ -2723,19 +2723,19 @@ class VMwareVMOpsTestCase(test.NoDBTestCase):
|
|||||||
self.assertEqual('flavor-policy', extra_specs.storage_policy)
|
self.assertEqual('flavor-policy', extra_specs.storage_policy)
|
||||||
|
|
||||||
def test_get_base_folder_not_set(self):
|
def test_get_base_folder_not_set(self):
|
||||||
self.flags(image_cache_subdirectory_name='vmware_base')
|
self.flags(subdirectory_name='vmware_base', group='image_cache')
|
||||||
base_folder = self._vmops._get_base_folder()
|
base_folder = self._vmops._get_base_folder()
|
||||||
self.assertEqual('vmware_base', base_folder)
|
self.assertEqual('vmware_base', base_folder)
|
||||||
|
|
||||||
def test_get_base_folder_host_ip(self):
|
def test_get_base_folder_host_ip(self):
|
||||||
self.flags(my_ip='7.7.7.7',
|
self.flags(my_ip='7.7.7.7')
|
||||||
image_cache_subdirectory_name='_base')
|
self.flags(subdirectory_name='_base', group='image_cache')
|
||||||
base_folder = self._vmops._get_base_folder()
|
base_folder = self._vmops._get_base_folder()
|
||||||
self.assertEqual('7.7.7.7_base', base_folder)
|
self.assertEqual('7.7.7.7_base', base_folder)
|
||||||
|
|
||||||
def test_get_base_folder_cache_prefix(self):
|
def test_get_base_folder_cache_prefix(self):
|
||||||
self.flags(cache_prefix='my_prefix', group='vmware')
|
self.flags(cache_prefix='my_prefix', group='vmware')
|
||||||
self.flags(image_cache_subdirectory_name='_base')
|
self.flags(subdirectory_name='_base', group='image_cache')
|
||||||
base_folder = self._vmops._get_base_folder()
|
base_folder = self._vmops._get_base_folder()
|
||||||
self.assertEqual('my_prefix_base', base_folder)
|
self.assertEqual('my_prefix_base', base_folder)
|
||||||
|
|
||||||
|
|||||||
@@ -171,7 +171,7 @@ class ImageCache(imagecache.ImageCacheManager):
|
|||||||
# change the timestamp on the image so as to reflect the last
|
# change the timestamp on the image so as to reflect the last
|
||||||
# time it was used
|
# time it was used
|
||||||
self._update_image_timestamp(img)
|
self._update_image_timestamp(img)
|
||||||
elif CONF.remove_unused_base_images:
|
elif CONF.image_cache.remove_unused_base_images:
|
||||||
self._remove_if_old_image(img)
|
self._remove_if_old_image(img)
|
||||||
|
|
||||||
def _update_image_timestamp(self, image):
|
def _update_image_timestamp(self, image):
|
||||||
@@ -196,7 +196,8 @@ class ImageCache(imagecache.ImageCacheManager):
|
|||||||
|
|
||||||
def _remove_if_old_image(self, image):
|
def _remove_if_old_image(self, image):
|
||||||
backing_files = self._get_image_backing_files(image)
|
backing_files = self._get_image_backing_files(image)
|
||||||
max_age_seconds = CONF.remove_unused_original_minimum_age_seconds
|
max_age_seconds = (
|
||||||
|
CONF.image_cache.remove_unused_original_minimum_age_seconds)
|
||||||
|
|
||||||
for img in backing_files:
|
for img in backing_files:
|
||||||
age_seconds = self._pathutils.get_age_of_file(img)
|
age_seconds = self._pathutils.get_age_of_file(img)
|
||||||
|
|||||||
@@ -29,7 +29,8 @@ class ImageCacheManager(object):
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.remove_unused_base_images = CONF.remove_unused_base_images
|
self.remove_unused_base_images = (
|
||||||
|
CONF.image_cache.remove_unused_base_images)
|
||||||
self.resize_states = [task_states.RESIZE_PREP,
|
self.resize_states = [task_states.RESIZE_PREP,
|
||||||
task_states.RESIZE_MIGRATING,
|
task_states.RESIZE_MIGRATING,
|
||||||
task_states.RESIZE_MIGRATED,
|
task_states.RESIZE_MIGRATED,
|
||||||
|
|||||||
@@ -9658,7 +9658,7 @@ class LibvirtDriver(driver.ComputeDriver):
|
|||||||
|
|
||||||
def cache_image(self, context, image_id):
|
def cache_image(self, context, image_id):
|
||||||
cache_dir = os.path.join(CONF.instances_path,
|
cache_dir = os.path.join(CONF.instances_path,
|
||||||
CONF.image_cache_subdirectory_name)
|
CONF.image_cache.subdirectory_name)
|
||||||
path = os.path.join(cache_dir,
|
path = os.path.join(cache_dir,
|
||||||
imagecache.get_cache_fname(image_id))
|
imagecache.get_cache_fname(image_id))
|
||||||
if os.path.exists(path):
|
if os.path.exists(path):
|
||||||
|
|||||||
@@ -249,7 +249,7 @@ class Image(object):
|
|||||||
:size: Size of created image in bytes (optional)
|
:size: Size of created image in bytes (optional)
|
||||||
"""
|
"""
|
||||||
base_dir = os.path.join(CONF.instances_path,
|
base_dir = os.path.join(CONF.instances_path,
|
||||||
CONF.image_cache_subdirectory_name)
|
CONF.image_cache.subdirectory_name)
|
||||||
if not os.path.exists(base_dir):
|
if not os.path.exists(base_dir):
|
||||||
fileutils.ensure_tree(base_dir)
|
fileutils.ensure_tree(base_dir)
|
||||||
base = os.path.join(base_dir, filename)
|
base = os.path.join(base_dir, filename)
|
||||||
|
|||||||
@@ -137,7 +137,7 @@ class ImageCacheManager(imagecache.ImageCacheManager):
|
|||||||
if backing_file:
|
if backing_file:
|
||||||
backing_path = os.path.join(
|
backing_path = os.path.join(
|
||||||
CONF.instances_path,
|
CONF.instances_path,
|
||||||
CONF.image_cache_subdirectory_name,
|
CONF.image_cache.subdirectory_name,
|
||||||
backing_file)
|
backing_file)
|
||||||
if backing_path not in inuse_images:
|
if backing_path not in inuse_images:
|
||||||
inuse_images.append(backing_path)
|
inuse_images.append(backing_path)
|
||||||
@@ -236,15 +236,16 @@ class ImageCacheManager(imagecache.ImageCacheManager):
|
|||||||
|
|
||||||
def _remove_swap_file(self, base_file):
|
def _remove_swap_file(self, base_file):
|
||||||
"""Remove a single swap base file if it is old enough."""
|
"""Remove a single swap base file if it is old enough."""
|
||||||
maxage = CONF.remove_unused_original_minimum_age_seconds
|
maxage = CONF.image_cache.remove_unused_original_minimum_age_seconds
|
||||||
|
|
||||||
self._remove_old_enough_file(base_file, maxage, remove_lock=False)
|
self._remove_old_enough_file(base_file, maxage, remove_lock=False)
|
||||||
|
|
||||||
def _remove_base_file(self, base_file):
|
def _remove_base_file(self, base_file):
|
||||||
"""Remove a single base file if it is old enough."""
|
"""Remove a single base file if it is old enough."""
|
||||||
maxage = CONF.libvirt.remove_unused_resized_minimum_age_seconds
|
maxage = CONF.image_cache.remove_unused_resized_minimum_age_seconds
|
||||||
if base_file in self.originals:
|
if base_file in self.originals:
|
||||||
maxage = CONF.remove_unused_original_minimum_age_seconds
|
maxage = (
|
||||||
|
CONF.image_cache.remove_unused_original_minimum_age_seconds)
|
||||||
|
|
||||||
self._remove_old_enough_file(base_file, maxage)
|
self._remove_old_enough_file(base_file, maxage)
|
||||||
|
|
||||||
@@ -330,7 +331,7 @@ class ImageCacheManager(imagecache.ImageCacheManager):
|
|||||||
# created, but may remain from previous versions.
|
# created, but may remain from previous versions.
|
||||||
|
|
||||||
base_dir = os.path.join(CONF.instances_path,
|
base_dir = os.path.join(CONF.instances_path,
|
||||||
CONF.image_cache_subdirectory_name)
|
CONF.image_cache.subdirectory_name)
|
||||||
if not os.path.exists(base_dir):
|
if not os.path.exists(base_dir):
|
||||||
LOG.debug('Skipping verification, no base directory at %s',
|
LOG.debug('Skipping verification, no base directory at %s',
|
||||||
base_dir)
|
base_dir)
|
||||||
|
|||||||
@@ -140,7 +140,8 @@ class ImageCacheManager(imagecache.ImageCacheManager):
|
|||||||
def _age_cached_images(self, context, datastore, dc_info,
|
def _age_cached_images(self, context, datastore, dc_info,
|
||||||
ds_path):
|
ds_path):
|
||||||
"""Ages cached images."""
|
"""Ages cached images."""
|
||||||
age_seconds = CONF.remove_unused_original_minimum_age_seconds
|
age_seconds = (
|
||||||
|
CONF.image_cache.remove_unused_original_minimum_age_seconds)
|
||||||
unused_images = self.originals - self.used_images
|
unused_images = self.originals - self.used_images
|
||||||
ds_browser = self._get_ds_browser(datastore.ref)
|
ds_browser = self._get_ds_browser(datastore.ref)
|
||||||
for image in unused_images:
|
for image in unused_images:
|
||||||
|
|||||||
@@ -152,14 +152,14 @@ class VMwareVMOps(object):
|
|||||||
# Enable more than one compute node to run on the same host
|
# Enable more than one compute node to run on the same host
|
||||||
if CONF.vmware.cache_prefix:
|
if CONF.vmware.cache_prefix:
|
||||||
base_folder = '%s%s' % (CONF.vmware.cache_prefix,
|
base_folder = '%s%s' % (CONF.vmware.cache_prefix,
|
||||||
CONF.image_cache_subdirectory_name)
|
CONF.image_cache.subdirectory_name)
|
||||||
# Ensure that the base folder is unique per compute node
|
# Ensure that the base folder is unique per compute node
|
||||||
elif CONF.remove_unused_base_images:
|
elif CONF.image_cache.remove_unused_base_images:
|
||||||
base_folder = '%s%s' % (CONF.my_ip,
|
base_folder = '%s%s' % (CONF.my_ip,
|
||||||
CONF.image_cache_subdirectory_name)
|
CONF.image_cache.subdirectory_name)
|
||||||
else:
|
else:
|
||||||
# Aging disable ensures backward compatibility
|
# Aging disable ensures backward compatibility
|
||||||
base_folder = CONF.image_cache_subdirectory_name
|
base_folder = CONF.image_cache.subdirectory_name
|
||||||
return base_folder
|
return base_folder
|
||||||
|
|
||||||
def _extend_virtual_disk(self, instance, requested_size, name, dc_ref):
|
def _extend_virtual_disk(self, instance, requested_size, name, dc_ref):
|
||||||
@@ -1855,7 +1855,7 @@ class VMwareVMOps(object):
|
|||||||
self._set_machine_id(client_factory, instance, network_info)
|
self._set_machine_id(client_factory, instance, network_info)
|
||||||
|
|
||||||
def manage_image_cache(self, context, instances):
|
def manage_image_cache(self, context, instances):
|
||||||
if not CONF.remove_unused_base_images:
|
if not CONF.image_cache.remove_unused_base_images:
|
||||||
LOG.debug("Image aging disabled. Aging will not be done.")
|
LOG.debug("Image aging disabled. Aging will not be done.")
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,22 @@
|
|||||||
|
---
|
||||||
|
deprecations:
|
||||||
|
- |
|
||||||
|
The following conf options have been moved to the ``[image_cache]`` group
|
||||||
|
and renamed accordingly. The old option paths are deprecated and will be
|
||||||
|
removed in a future release.
|
||||||
|
|
||||||
|
.. list-table::
|
||||||
|
:header-rows: 1
|
||||||
|
|
||||||
|
* - Deprecated Option
|
||||||
|
- New Option
|
||||||
|
* - ``[DEFAULT]image_cache_manager_interval``
|
||||||
|
- ``[image_cache]manager_interval``
|
||||||
|
* - ``[DEFAULT]image_cache_subdirectory_name``
|
||||||
|
- ``[image_cache]subdirectory_name``
|
||||||
|
* - ``[DEFAULT]remove_unused_base_images``
|
||||||
|
- ``[image_cache]remove_unused_base_images``
|
||||||
|
* - ``[DEFAULT]remove_unused_original_minimum_age_seconds``
|
||||||
|
- ``[image_cache]remove_unused_original_minimum_age_seconds``
|
||||||
|
* - ``[libvirt]remove_unused_resized_minimum_age_seconds``
|
||||||
|
- ``[image_cache]remove_unused_resized_minimum_age_seconds``
|
||||||
Reference in New Issue
Block a user