glance/glance/tests/functional/v2/test_cache_api_policy.py

243 lines
8.6 KiB
Python

# Copyright 2021 Red Hat, Inc.
# All Rights Reserved.
#
# 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.
from unittest import mock
import oslo_policy.policy
from glance.api import policy
from glance.image_cache import prefetcher
from glance.tests import functional
class TestCacheImagesPolicy(functional.SynchronousAPIBase):
def setUp(self):
super(TestCacheImagesPolicy, self).setUp()
self.policy = policy.Enforcer(suppress_deprecation_warnings=True)
def set_policy_rules(self, rules):
self.policy.set_rules(
oslo_policy.policy.Rules.from_dict(rules),
overwrite=True)
def start_server(self):
with mock.patch.object(policy, 'Enforcer') as mock_enf:
mock_enf.return_value = self.policy
super(TestCacheImagesPolicy, self).start_server(enable_cache=True)
def _create_upload_and_cache(self, cache_image=False,
expected_code=200):
image_id = self._create_and_upload()
# Queue image for caching
path = '/v2/queued_images/%s' % image_id
response = self.api_put(path)
self.assertEqual(expected_code, response.status_code)
if cache_image:
# NOTE(abhishekk): Here we are not running periodic job which
# caches queued images as precaching is not part of this
# patch, so to test all caching operations we are using this
# way to cache images for us
cache_prefetcher = prefetcher.Prefetcher()
cache_prefetcher.run()
return image_id
def test_queued_images(self):
self.start_server()
# Verify that you can queue image for caching
self._create_upload_and_cache(expected_code=200)
# Now disable manage_image_cache to ensure you will get
# 403 Forbidden error
self.set_policy_rules({
'manage_image_cache': '!',
'add_image': '',
'upload_image': ''
})
self._create_upload_and_cache(expected_code=403)
def test_get_queued_images(self):
self.start_server()
# Create image and queue it for caching
image_id = self._create_upload_and_cache()
# make sure you are able to get queued images
path = '/v2/queued_images'
response = self.api_get(path)
self.assertEqual(200, response.status_code)
output = response.json
self.assertIn(image_id, output['queued_images'])
# Now disable manage_image_cache to ensure you will get
# 403 Forbidden error
self.set_policy_rules({
'manage_image_cache': '!'
})
response = self.api_get(path)
self.assertEqual(403, response.status_code)
def test_delete_queued_image(self):
self.start_server()
# Create image and queue it for caching
image_id = self._create_upload_and_cache()
# Create another image while you can
second_image_id = self._create_upload_and_cache()
# make sure you are able to delete queued image
path = '/v2/queued_images/%s' % image_id
response = self.api_delete(path)
self.assertEqual(200, response.status_code)
# verify image is deleted from queue list
path = '/v2/queued_images'
response = self.api_get(path)
output = response.json
self.assertNotIn(image_id, output['queued_images'])
# Now disable manage_image_cache to ensure you will get
# 403 Forbidden error
self.set_policy_rules({
'manage_image_cache': '!'
})
path = '/v2/queued_images/%s' % second_image_id
response = self.api_delete(path)
self.assertEqual(403, response.status_code)
def test_delete_queued_images(self):
self.start_server()
# Create image and queue it for caching
self._create_upload_and_cache()
# Create another image while you can
self._create_upload_and_cache()
# make sure you are able to delete queued image
path = '/v2/queued_images'
response = self.api_delete(path)
self.assertEqual(200, response.status_code)
# verify images are deleted from queue list
path = '/v2/queued_images'
response = self.api_get(path)
output = response.json
self.assertEqual([], output['queued_images'])
# Create another image and queue it for caching
image_id = self._create_upload_and_cache()
# Now disable manage_image_cache to ensure you will get
# 403 Forbidden error
self.set_policy_rules({
'manage_image_cache': '!'
})
path = '/v2/queued_images'
response = self.api_delete(path)
self.assertEqual(403, response.status_code)
# Verify that image is still present in queue list
self.set_policy_rules({
'manage_image_cache': '',
})
path = '/v2/queued_images'
response = self.api_get(path)
output = response.json
self.assertIn(image_id, output['queued_images'])
def test_get_cached_images(self):
self.start_server()
# Create image and cache it
image_id = self._create_upload_and_cache(cache_image=True)
# make sure you are able to get cached images
path = '/v2/cached_images'
response = self.api_get(path)
self.assertEqual(200, response.status_code)
output = response.json
self.assertEqual(image_id, output['cached_images'][0]['image_id'])
# Now disable manage_image_cache to ensure you will get
# 403 Forbidden error
self.set_policy_rules({
'manage_image_cache': '!'
})
response = self.api_get(path)
self.assertEqual(403, response.status_code)
def test_delete_cached_image(self):
self.start_server()
# Create image and cache it
image_id = self._create_upload_and_cache(cache_image=True)
# Create another image while you can
second_image_id = self._create_upload_and_cache(cache_image=True)
# make sure you are able to delete cached image
path = '/v2/cached_images/%s' % image_id
response = self.api_delete(path)
self.assertEqual(200, response.status_code)
# verify image is deleted from cached list
path = '/v2/cached_images'
response = self.api_get(path)
output = response.json
self.assertEqual(1, len(output['cached_images']))
# Now disable manage_image_cache to ensure you will get
# 403 Forbidden error
self.set_policy_rules({
'manage_image_cache': '!'
})
path = '/v2/cached_images/%s' % second_image_id
response = self.api_delete(path)
self.assertEqual(403, response.status_code)
def test_delete_cached_images(self):
self.start_server()
# Create image and cache it
self._create_upload_and_cache(cache_image=True)
# Create another image while you can
self._create_upload_and_cache(cache_image=True)
# make sure you are able to delete cached image
path = '/v2/cached_images'
response = self.api_delete(path)
self.assertEqual(200, response.status_code)
# verify images are deleted from cached list
path = '/v2/cached_images'
response = self.api_get(path)
output = response.json
self.assertEqual(0, len(output['cached_images']))
# Create another image and cache it
self._create_upload_and_cache(cache_image=True)
# Now disable manage_image_cache to ensure you will get
# 403 Forbidden error
self.set_policy_rules({
'manage_image_cache': '!'
})
path = '/v2/cached_images'
response = self.api_delete(path)
self.assertEqual(403, response.status_code)
# Verify that image is still present in cache
self.set_policy_rules({
'manage_image_cache': '',
})
path = '/v2/cached_images'
response = self.api_get(path)
output = response.json
self.assertEqual(1, len(output['cached_images']))