def _clean_up_caches(directory, amount): """Explicitly cleanup caches based on their priority (if required). :param directory: the directory (of the cache) to be freed up. :param amount: amount of space to reclaim. :raises: InsufficientDiskSpace exception, if we cannot free up enough space after trying all the caches. """ free = _free_disk_space_for(directory) if amount < free: return # NOTE(dtantsur): filter caches, whose directory is on the same device st_dev = os.stat(directory).st_dev caches_to_clean = [x[1]() for x in _cache_cleanup_list] caches = (c for c in caches_to_clean if os.stat(c.master_dir).st_dev == st_dev) for cache_to_clean in caches: cache_to_clean.clean_up(amount=(amount - free)) free = _free_disk_space_for(directory) if amount < free: break else: raise exception.InsufficientDiskSpace( path=directory, required=amount / 1024 / 1024, actual=free / 1024 / 1024, )
def test_fetch_images_fail(self, mock_clean_up_caches): exc = exception.InsufficientDiskSpace(path='a', required=2, actual=1) mock_cache = mock.MagicMock(master_dir='master_dir') mock_clean_up_caches.side_effect = [exc] self.assertRaises(exception.InstanceDeployFailure, utils.fetch_images, None, mock_cache, [('uuid', 'path')]) mock_clean_up_caches.assert_called_once_with(None, 'master_dir', [('uuid', 'path')])
def _check_dir_free_space(chk_dir, required_space=1): """Check that directory has some free space. :param chk_dir: Directory to check :param required_space: amount of space to check for in MiB. :raises InsufficientDiskSpace: if free space is < required space """ # check that we have some free space stat = os.statvfs(chk_dir) # get dir free space in MiB. free_space = float(stat.f_bsize * stat.f_bavail) / 1024 / 1024 # check for at least required_space MiB free if free_space < required_space: raise exception.InsufficientDiskSpace(path=chk_dir, required=required_space, actual=free_space)
def test__fetch_estimate_fallback( self, mock_clean, mock_will_convert, mock_raw, mock_fetch, mock_size): mock_size.side_effect = [100, 10] mock_clean.side_effect = [exception.InsufficientDiskSpace(), None] image_cache._fetch('fake', 'fake-uuid', '/foo/bar', force_raw=True) mock_fetch.assert_called_once_with('fake', 'fake-uuid', '/foo/bar.part', force_raw=False) mock_size.assert_has_calls([ mock.call('/foo/bar.part', estimate=False), mock.call('/foo/bar.part', estimate=True), ]) mock_clean.assert_has_calls([ mock.call('/foo', 100), mock.call('/foo', 10), ]) mock_raw.assert_called_once_with('fake-uuid', '/foo/bar', '/foo/bar.part') mock_will_convert.assert_called_once_with('fake-uuid', '/foo/bar.part')