Merge "Remove registry related functional and unit tests"
This commit is contained in:
commit
40ee49b217
@ -60,7 +60,6 @@ else:
|
||||
|
||||
|
||||
CONF = cfg.CONF
|
||||
CONF.import_opt('registry_host', 'glance.registry')
|
||||
|
||||
|
||||
@six.add_metaclass(abc.ABCMeta)
|
||||
@ -90,7 +89,6 @@ class BaseServer(object):
|
||||
self.show_multiple_locations = False
|
||||
self.property_protection_file = ''
|
||||
self.enable_v2_api = True
|
||||
self.enable_v2_registry = True
|
||||
self.needs_database = False
|
||||
self.log_file = None
|
||||
self.sock = sock
|
||||
@ -378,7 +376,6 @@ class ApiServer(Server):
|
||||
self.server_module = 'glance.cmd.%s' % self.server_name
|
||||
self.default_store = kwargs.get("default_store", "file")
|
||||
self.bind_host = "127.0.0.1"
|
||||
self.registry_host = "127.0.0.1"
|
||||
self.metadata_encryption_key = "012345678901234567890123456789ab"
|
||||
self.image_dir = os.path.join(self.test_dir, "images")
|
||||
self.pid_file = pid_file or os.path.join(self.test_dir, "api.pid")
|
||||
@ -420,8 +417,6 @@ default_log_levels = eventlet.wsgi.server=DEBUG
|
||||
bind_host = %(bind_host)s
|
||||
bind_port = %(bind_port)s
|
||||
metadata_encryption_key = %(metadata_encryption_key)s
|
||||
registry_host = %(registry_host)s
|
||||
registry_port = %(registry_port)s
|
||||
use_user_token = %(use_user_token)s
|
||||
send_identity_credentials = %(send_identity_credentials)s
|
||||
log_file = %(log_file)s
|
||||
@ -555,7 +550,6 @@ class ApiServerForMultipleBackend(Server):
|
||||
self.server_module = 'glance.cmd.%s' % self.server_name
|
||||
self.default_backend = kwargs.get("default_backend", "file1")
|
||||
self.bind_host = "127.0.0.1"
|
||||
self.registry_host = "127.0.0.1"
|
||||
self.metadata_encryption_key = "012345678901234567890123456789ab"
|
||||
self.image_dir_backend_1 = os.path.join(self.test_dir, "images_1")
|
||||
self.image_dir_backend_2 = os.path.join(self.test_dir, "images_2")
|
||||
@ -600,8 +594,6 @@ default_log_levels = eventlet.wsgi.server=DEBUG
|
||||
bind_host = %(bind_host)s
|
||||
bind_port = %(bind_port)s
|
||||
metadata_encryption_key = %(metadata_encryption_key)s
|
||||
registry_host = %(registry_host)s
|
||||
registry_port = %(registry_port)s
|
||||
use_user_token = %(use_user_token)s
|
||||
send_identity_credentials = %(send_identity_credentials)s
|
||||
log_file = %(log_file)s
|
||||
@ -727,88 +719,6 @@ allowed_origin=http://valid.example.com
|
||||
"""
|
||||
|
||||
|
||||
class RegistryServer(Server):
|
||||
|
||||
"""
|
||||
Server object that starts/stops/manages the Registry server
|
||||
"""
|
||||
|
||||
def __init__(self, test_dir, port, policy_file, sock=None):
|
||||
super(RegistryServer, self).__init__(test_dir, port, sock=sock)
|
||||
self.server_name = 'registry'
|
||||
self.server_module = 'glance.cmd.%s' % self.server_name
|
||||
|
||||
self.needs_database = True
|
||||
default_sql_connection = SQLITE_CONN_TEMPLATE % self.test_dir
|
||||
self.sql_connection = os.environ.get('GLANCE_TEST_SQL_CONNECTION',
|
||||
default_sql_connection)
|
||||
|
||||
self.bind_host = "127.0.0.1"
|
||||
self.pid_file = os.path.join(self.test_dir, "registry.pid")
|
||||
self.log_file = os.path.join(self.test_dir, "registry.log")
|
||||
self.owner_is_tenant = True
|
||||
self.workers = 0
|
||||
self.api_version = 1
|
||||
self.user_storage_quota = '0'
|
||||
self.metadata_encryption_key = "012345678901234567890123456789ab"
|
||||
self.policy_file = policy_file
|
||||
self.policy_default_rule = 'default'
|
||||
self.disable_path = None
|
||||
self.image_cache_dir = os.path.join(self.test_dir,
|
||||
'cache')
|
||||
self.image_cache_driver = 'sqlite'
|
||||
|
||||
self.conf_base = """[DEFAULT]
|
||||
debug = %(debug)s
|
||||
image_cache_dir = %(image_cache_dir)s
|
||||
image_cache_driver = %(image_cache_driver)s
|
||||
bind_host = %(bind_host)s
|
||||
bind_port = %(bind_port)s
|
||||
log_file = %(log_file)s
|
||||
sql_connection = %(sql_connection)s
|
||||
sql_idle_timeout = 3600
|
||||
api_limit_max = 1000
|
||||
limit_param_default = 25
|
||||
owner_is_tenant = %(owner_is_tenant)s
|
||||
enable_v2_registry = %(enable_v2_registry)s
|
||||
workers = %(workers)s
|
||||
user_storage_quota = %(user_storage_quota)s
|
||||
metadata_encryption_key = %(metadata_encryption_key)s
|
||||
[oslo_policy]
|
||||
policy_file = %(policy_file)s
|
||||
policy_default_rule = %(policy_default_rule)s
|
||||
[paste_deploy]
|
||||
flavor = %(deployment_flavor)s
|
||||
"""
|
||||
self.paste_conf_base = """[pipeline:glance-registry]
|
||||
pipeline = healthcheck unauthenticated-context registryapp
|
||||
|
||||
[pipeline:glance-registry-fakeauth]
|
||||
pipeline = healthcheck fakeauth context registryapp
|
||||
|
||||
[pipeline:glance-registry-trusted-auth]
|
||||
pipeline = healthcheck context registryapp
|
||||
|
||||
[app:registryapp]
|
||||
paste.app_factory = glance.registry.api:API.factory
|
||||
|
||||
[filter:healthcheck]
|
||||
paste.filter_factory = oslo_middleware:Healthcheck.factory
|
||||
backends = disable_by_file
|
||||
disable_by_file_path = %(disable_path)s
|
||||
|
||||
[filter:context]
|
||||
paste.filter_factory = glance.api.middleware.context:ContextMiddleware.factory
|
||||
|
||||
[filter:unauthenticated-context]
|
||||
paste.filter_factory =
|
||||
glance.api.middleware.context:UnauthenticatedContextMiddleware.factory
|
||||
|
||||
[filter:fakeauth]
|
||||
paste.filter_factory = glance.tests.utils:FakeAuthMiddleware.factory
|
||||
"""
|
||||
|
||||
|
||||
class ScrubberDaemon(Server):
|
||||
"""
|
||||
Server object that starts/stops/manages the Scrubber server
|
||||
@ -821,8 +731,6 @@ class ScrubberDaemon(Server):
|
||||
self.server_module = 'glance.cmd.%s' % self.server_name
|
||||
self.daemon = daemon
|
||||
|
||||
self.registry_host = "127.0.0.1"
|
||||
|
||||
self.image_dir = os.path.join(self.test_dir, "images")
|
||||
self.scrub_time = 5
|
||||
self.pid_file = os.path.join(self.test_dir, "scrubber.pid")
|
||||
@ -882,7 +790,6 @@ class FunctionalTest(test_utils.BaseTestCase):
|
||||
|
||||
self.api_protocol = 'http'
|
||||
self.api_port, api_sock = test_utils.get_unused_port_and_socket()
|
||||
self.registry_port, reg_sock = test_utils.get_unused_port_and_socket()
|
||||
# NOTE: Scrubber is enabled by default for the functional tests.
|
||||
# Please disbale it by explicitly setting 'self.include_scrubber' to
|
||||
# False in the test SetUps that do not require Scrubber to run.
|
||||
@ -890,8 +797,7 @@ class FunctionalTest(test_utils.BaseTestCase):
|
||||
|
||||
# The clients will try to connect to this address. Let's make sure
|
||||
# we're not using the default '0.0.0.0'
|
||||
self.config(bind_host='127.0.0.1',
|
||||
registry_host='127.0.0.1')
|
||||
self.config(bind_host='127.0.0.1')
|
||||
|
||||
self.tracecmd = tracecmd_osmap.get(platform.system())
|
||||
|
||||
@ -913,15 +819,9 @@ class FunctionalTest(test_utils.BaseTestCase):
|
||||
self.policy_file,
|
||||
sock=api_sock)
|
||||
|
||||
self.registry_server = RegistryServer(self.test_dir,
|
||||
self.registry_port,
|
||||
self.policy_file,
|
||||
sock=reg_sock)
|
||||
|
||||
self.scrubber_daemon = ScrubberDaemon(self.test_dir, self.policy_file)
|
||||
|
||||
self.pid_files = [self.api_server.pid_file,
|
||||
self.registry_server.pid_file,
|
||||
self.scrubber_daemon.pid_file]
|
||||
self.files_to_destroy = []
|
||||
self.launched_servers = []
|
||||
@ -933,12 +833,9 @@ class FunctionalTest(test_utils.BaseTestCase):
|
||||
# We destroy the test data store between each test case,
|
||||
# and recreate it, which ensures that we have no side-effects
|
||||
# from the tests
|
||||
self.addCleanup(
|
||||
self._reset_database, self.registry_server.sql_connection)
|
||||
self.addCleanup(
|
||||
self._reset_database, self.api_server.sql_connection)
|
||||
self.addCleanup(self.cleanup)
|
||||
self._reset_database(self.registry_server.sql_connection)
|
||||
self._reset_database(self.api_server.sql_connection)
|
||||
|
||||
def set_policy_rules(self, rules):
|
||||
@ -987,7 +884,6 @@ class FunctionalTest(test_utils.BaseTestCase):
|
||||
# between a child process listening on a port actually dying
|
||||
# and a new process being started
|
||||
servers = [self.api_server,
|
||||
self.registry_server,
|
||||
self.scrubber_daemon]
|
||||
for s in servers:
|
||||
try:
|
||||
@ -1070,7 +966,7 @@ class FunctionalTest(test_utils.BaseTestCase):
|
||||
def start_servers(self, **kwargs):
|
||||
"""
|
||||
Starts the API and Registry servers (glance-control api start
|
||||
& glance-control registry start) on unused ports. glance-control
|
||||
) on unused ports. glance-control
|
||||
should be installed into the python path
|
||||
|
||||
Any kwargs passed to this method will override the configuration
|
||||
@ -1078,14 +974,7 @@ class FunctionalTest(test_utils.BaseTestCase):
|
||||
"""
|
||||
self.cleanup()
|
||||
|
||||
# Start up the API and default registry server
|
||||
|
||||
# We start the registry server first, as the API server config
|
||||
# depends on the registry port - this ordering allows for
|
||||
# retrying the launch on a port clash
|
||||
self.start_with_retry(self.registry_server, 'registry_port', 3,
|
||||
**kwargs)
|
||||
kwargs['registry_port'] = self.registry_server.bind_port
|
||||
# Start up the API server
|
||||
|
||||
self.start_with_retry(self.api_server, 'api_port', 3, **kwargs)
|
||||
|
||||
@ -1206,14 +1095,11 @@ class FunctionalTest(test_utils.BaseTestCase):
|
||||
is meant to be called during a normal test case sequence.
|
||||
"""
|
||||
|
||||
# Spin down the API and default registry server
|
||||
# Spin down the API server
|
||||
self.stop_server(self.api_server)
|
||||
self.stop_server(self.registry_server)
|
||||
if self.include_scrubber:
|
||||
self.stop_server(self.scrubber_daemon)
|
||||
|
||||
self._reset_database(self.registry_server.sql_connection)
|
||||
|
||||
def run_sql_cmd(self, sql):
|
||||
"""
|
||||
Provides a crude mechanism to run manual SQL commands for backend
|
||||
@ -1257,7 +1143,6 @@ class MultipleBackendFunctionalTest(test_utils.BaseTestCase):
|
||||
|
||||
self.api_protocol = 'http'
|
||||
self.api_port, api_sock = test_utils.get_unused_port_and_socket()
|
||||
self.registry_port, reg_sock = test_utils.get_unused_port_and_socket()
|
||||
# NOTE: Scrubber is enabled by default for the functional tests.
|
||||
# Please disbale it by explicitly setting 'self.include_scrubber' to
|
||||
# False in the test SetUps that do not require Scrubber to run.
|
||||
@ -1281,15 +1166,9 @@ class MultipleBackendFunctionalTest(test_utils.BaseTestCase):
|
||||
self.api_server_multiple_backend = ApiServerForMultipleBackend(
|
||||
self.test_dir, self.api_port, self.policy_file, sock=api_sock)
|
||||
|
||||
self.registry_server = RegistryServer(self.test_dir,
|
||||
self.registry_port,
|
||||
self.policy_file,
|
||||
sock=reg_sock)
|
||||
|
||||
self.scrubber_daemon = ScrubberDaemon(self.test_dir, self.policy_file)
|
||||
|
||||
self.pid_files = [self.api_server_multiple_backend.pid_file,
|
||||
self.registry_server.pid_file,
|
||||
self.scrubber_daemon.pid_file]
|
||||
self.files_to_destroy = []
|
||||
self.launched_servers = []
|
||||
@ -1301,13 +1180,10 @@ class MultipleBackendFunctionalTest(test_utils.BaseTestCase):
|
||||
# We destroy the test data store between each test case,
|
||||
# and recreate it, which ensures that we have no side-effects
|
||||
# from the tests
|
||||
self.addCleanup(
|
||||
self._reset_database, self.registry_server.sql_connection)
|
||||
self.addCleanup(
|
||||
self._reset_database,
|
||||
self.api_server_multiple_backend.sql_connection)
|
||||
self.addCleanup(self.cleanup)
|
||||
self._reset_database(self.registry_server.sql_connection)
|
||||
self._reset_database(
|
||||
self.api_server_multiple_backend.sql_connection)
|
||||
|
||||
@ -1357,7 +1233,6 @@ class MultipleBackendFunctionalTest(test_utils.BaseTestCase):
|
||||
# between a child process listening on a port actually dying
|
||||
# and a new process being started
|
||||
servers = [self.api_server_multiple_backend,
|
||||
self.registry_server,
|
||||
self.scrubber_daemon]
|
||||
for s in servers:
|
||||
try:
|
||||
@ -1440,7 +1315,7 @@ class MultipleBackendFunctionalTest(test_utils.BaseTestCase):
|
||||
def start_servers(self, **kwargs):
|
||||
"""
|
||||
Starts the API and Registry servers (glance-control api start
|
||||
& glance-control registry start) on unused ports. glance-control
|
||||
) on unused ports. glance-control
|
||||
should be installed into the python path
|
||||
|
||||
Any kwargs passed to this method will override the configuration
|
||||
@ -1448,14 +1323,7 @@ class MultipleBackendFunctionalTest(test_utils.BaseTestCase):
|
||||
"""
|
||||
self.cleanup()
|
||||
|
||||
# Start up the API and default registry server
|
||||
|
||||
# We start the registry server first, as the API server config
|
||||
# depends on the registry port - this ordering allows for
|
||||
# retrying the launch on a port clash
|
||||
self.start_with_retry(self.registry_server, 'registry_port', 3,
|
||||
**kwargs)
|
||||
kwargs['registry_port'] = self.registry_server.bind_port
|
||||
# Start up the API server
|
||||
|
||||
self.start_with_retry(self.api_server_multiple_backend,
|
||||
'api_port', 3, **kwargs)
|
||||
@ -1577,14 +1445,11 @@ class MultipleBackendFunctionalTest(test_utils.BaseTestCase):
|
||||
is meant to be called during a normal test case sequence.
|
||||
"""
|
||||
|
||||
# Spin down the API and default registry server
|
||||
# Spin down the API
|
||||
self.stop_server(self.api_server_multiple_backend)
|
||||
self.stop_server(self.registry_server)
|
||||
if self.include_scrubber:
|
||||
self.stop_server(self.scrubber_daemon)
|
||||
|
||||
self._reset_database(self.registry_server.sql_connection)
|
||||
|
||||
def run_sql_cmd(self, sql):
|
||||
"""
|
||||
Provides a crude mechanism to run manual SQL commands for backend
|
||||
|
@ -1,115 +0,0 @@
|
||||
# Copyright 2013 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 oslo_config import cfg
|
||||
from oslo_db import options
|
||||
|
||||
import glance.db
|
||||
# NOTE(smcginnis) Need to make sure registry opts are registered
|
||||
from glance import registry # noqa
|
||||
from glance.registry import client # noqa
|
||||
import glance.tests.functional.db as db_tests
|
||||
from glance.tests.functional.db import base
|
||||
from glance.tests.functional.db import base_metadef
|
||||
|
||||
CONF = cfg.CONF
|
||||
|
||||
|
||||
def get_db(config):
|
||||
options.set_defaults(CONF, connection='sqlite://')
|
||||
config(data_api='glance.db.registry.api')
|
||||
return glance.db.get_api()
|
||||
|
||||
|
||||
def reset_db(db_api):
|
||||
pass
|
||||
|
||||
|
||||
class FunctionalInitWrapper(base.FunctionalInitWrapper):
|
||||
|
||||
def setUp(self):
|
||||
# NOTE(flaper87): We need to start the
|
||||
# registry service *before* TestDriver's
|
||||
# setup goes on, since it'll create some
|
||||
# images that will be later used in tests.
|
||||
#
|
||||
# Python's request is way too magical and
|
||||
# it will make the TestDriver's super call
|
||||
# FunctionalTest's without letting us start
|
||||
# the server.
|
||||
#
|
||||
# This setUp will be called by TestDriver
|
||||
# and will be used to call FunctionalTest
|
||||
# setUp method *and* start the registry
|
||||
# service right after it.
|
||||
super(FunctionalInitWrapper, self).setUp()
|
||||
self.registry_server.deployment_flavor = 'fakeauth'
|
||||
self.start_with_retry(self.registry_server,
|
||||
'registry_port', 3,
|
||||
api_version=2)
|
||||
|
||||
self.config(registry_port=self.registry_server.bind_port,
|
||||
use_user_token=True)
|
||||
|
||||
|
||||
class TestRegistryDriver(base.TestDriver,
|
||||
base.DriverTests,
|
||||
FunctionalInitWrapper):
|
||||
|
||||
def setUp(self):
|
||||
db_tests.load(get_db, reset_db)
|
||||
super(TestRegistryDriver, self).setUp()
|
||||
self.addCleanup(db_tests.reset)
|
||||
|
||||
def tearDown(self):
|
||||
self.registry_server.stop()
|
||||
super(TestRegistryDriver, self).tearDown()
|
||||
|
||||
|
||||
class TestRegistryQuota(base.DriverQuotaTests, FunctionalInitWrapper):
|
||||
|
||||
def setUp(self):
|
||||
db_tests.load(get_db, reset_db)
|
||||
super(TestRegistryQuota, self).setUp()
|
||||
self.addCleanup(db_tests.reset)
|
||||
|
||||
def tearDown(self):
|
||||
self.registry_server.stop()
|
||||
super(TestRegistryQuota, self).tearDown()
|
||||
|
||||
|
||||
class TestRegistryMetadefDriver(base_metadef.TestMetadefDriver,
|
||||
base_metadef.MetadefDriverTests,
|
||||
FunctionalInitWrapper):
|
||||
|
||||
def setUp(self):
|
||||
db_tests.load(get_db, reset_db)
|
||||
super(TestRegistryMetadefDriver, self).setUp()
|
||||
self.addCleanup(db_tests.reset)
|
||||
|
||||
def tearDown(self):
|
||||
self.registry_server.stop()
|
||||
super(TestRegistryMetadefDriver, self).tearDown()
|
||||
|
||||
|
||||
class TestTasksDriver(base.TaskTests, FunctionalInitWrapper):
|
||||
def setUp(self):
|
||||
db_tests.load(get_db, reset_db)
|
||||
super(TestTasksDriver, self).setUp()
|
||||
self.addCleanup(db_tests.reset)
|
||||
|
||||
def tearDown(self):
|
||||
self.registry_server.stop()
|
||||
super(TestTasksDriver, self).tearDown()
|
@ -1,56 +0,0 @@
|
||||
# Copyright 2014 Hewlett-Packard Development Company, L.P.
|
||||
# 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 oslo_serialization import jsonutils
|
||||
import requests
|
||||
from six.moves import http_client as http
|
||||
|
||||
from glance.tests import functional
|
||||
|
||||
|
||||
class TestRegistryURLVisibility(functional.FunctionalTest):
|
||||
|
||||
def setUp(self):
|
||||
super(TestRegistryURLVisibility, self).setUp()
|
||||
self.cleanup()
|
||||
self.registry_server.deployment_flavor = ''
|
||||
self.req_body = jsonutils.dumps([{"command": "image_get_all"}])
|
||||
|
||||
def _url(self, path):
|
||||
return 'http://127.0.0.1:%d%s' % (self.registry_port, path)
|
||||
|
||||
def _headers(self, custom_headers=None):
|
||||
base_headers = {
|
||||
}
|
||||
base_headers.update(custom_headers or {})
|
||||
return base_headers
|
||||
|
||||
def test_v2_not_enabled(self):
|
||||
self.registry_server.enable_v2_registry = False
|
||||
self.start_servers(**self.__dict__.copy())
|
||||
path = self._url('/rpc')
|
||||
response = requests.post(path, headers=self._headers(),
|
||||
data=self.req_body)
|
||||
self.assertEqual(http.NOT_FOUND, response.status_code)
|
||||
self.stop_servers()
|
||||
|
||||
def test_v2_enabled(self):
|
||||
self.registry_server.enable_v2_registry = True
|
||||
self.start_servers(**self.__dict__.copy())
|
||||
path = self._url('/rpc')
|
||||
response = requests.post(path, headers=self._headers(),
|
||||
data=self.req_body)
|
||||
self.assertEqual(http.OK, response.status_code)
|
||||
self.stop_servers()
|
@ -36,7 +36,7 @@ class TestLogging(functional.FunctionalTest):
|
||||
self.start_servers()
|
||||
|
||||
# The default functional test case has both debug on. Let's verify
|
||||
# that debug statements appear in both the API and registry logs.
|
||||
# that debug statements appear in the API logs.
|
||||
|
||||
self.assertTrue(os.path.exists(self.api_server.log_file))
|
||||
|
||||
@ -45,13 +45,6 @@ class TestLogging(functional.FunctionalTest):
|
||||
|
||||
self.assertIn('DEBUG glance', api_log_out)
|
||||
|
||||
self.assertTrue(os.path.exists(self.registry_server.log_file))
|
||||
|
||||
with open(self.registry_server.log_file, 'r') as freg:
|
||||
registry_log_out = freg.read()
|
||||
|
||||
self.assertIn('DEBUG glance', registry_log_out)
|
||||
|
||||
self.stop_servers()
|
||||
|
||||
def test_no_debug(self):
|
||||
@ -67,14 +60,6 @@ class TestLogging(functional.FunctionalTest):
|
||||
api_log_out = f.read()
|
||||
|
||||
self.assertNotIn('DEBUG glance', api_log_out)
|
||||
|
||||
self.assertTrue(os.path.exists(self.registry_server.log_file))
|
||||
|
||||
with open(self.registry_server.log_file, 'r') as freg:
|
||||
registry_log_out = freg.read()
|
||||
|
||||
self.assertNotIn('DEBUG glance', registry_log_out)
|
||||
|
||||
self.stop_servers()
|
||||
|
||||
def assertNotEmptyFile(self, path):
|
||||
|
@ -96,8 +96,6 @@ class TestReload(functional.FunctionalTest):
|
||||
def _get_parent(self, server):
|
||||
if server == 'api':
|
||||
return self.api_server.process_pid
|
||||
elif server == 'registry':
|
||||
return self.registry_server.process_pid
|
||||
|
||||
def _conffile(self, service):
|
||||
conf_dir = os.path.join(self.test_dir, 'etc')
|
||||
@ -122,7 +120,6 @@ class TestReload(functional.FunctionalTest):
|
||||
return True
|
||||
return False
|
||||
self.api_server.fork_socket = False
|
||||
self.registry_server.fork_socket = False
|
||||
self.start_servers(fork_socket=False, **vars(self))
|
||||
|
||||
pre_pids = {}
|
||||
@ -139,25 +136,19 @@ class TestReload(functional.FunctionalTest):
|
||||
# This recycles the existing socket
|
||||
msg = 'Start timeout'
|
||||
for _ in self.ticker(msg):
|
||||
for server in ('api', 'registry'):
|
||||
pre_pids[server] = self._get_children(server)
|
||||
pre_pids['api'] = self._get_children('api')
|
||||
if check_pids(pre_pids['api'], workers=1):
|
||||
if check_pids(pre_pids['registry'], workers=1):
|
||||
break
|
||||
break
|
||||
|
||||
for server in ('api', 'registry'):
|
||||
# Labour costs have fallen
|
||||
set_config_value(self._conffile(server), 'workers', '2')
|
||||
cmd = "kill -HUP %s" % self._get_parent(server)
|
||||
execute(cmd, raise_error=True)
|
||||
set_config_value(self._conffile('api'), 'workers', '2')
|
||||
cmd = "kill -HUP %s" % self._get_parent('api')
|
||||
execute(cmd, raise_error=True)
|
||||
|
||||
msg = 'Worker change timeout'
|
||||
for _ in self.ticker(msg):
|
||||
for server in ('api', 'registry'):
|
||||
post_pids[server] = self._get_children(server)
|
||||
if check_pids(pre_pids['registry'], post_pids['registry']):
|
||||
if check_pids(pre_pids['api'], post_pids['api']):
|
||||
break
|
||||
post_pids['api'] = self._get_children('api')
|
||||
if check_pids(pre_pids['api'], post_pids['api']):
|
||||
break
|
||||
|
||||
# Test changing the http bind_host
|
||||
# This requires a new socket
|
||||
|
@ -1,52 +0,0 @@
|
||||
# Copyright 2014 Hewlett-Packard Development Company, L.P.
|
||||
# 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 glance.db.registry.api import * # noqa
|
||||
from glance.common.rpc import RPCClient
|
||||
from glance.registry.client.v2 import api
|
||||
from glance.registry.client.v2 import client
|
||||
|
||||
|
||||
def patched_bulk_request(self, commands):
|
||||
# We add some auth headers which are typically
|
||||
# added by keystone. This is required when testing
|
||||
# without keystone, otherwise the tests fail.
|
||||
# We use the 'trusted-auth' deployment flavour
|
||||
# for testing so that these headers are interpreted
|
||||
# as expected (ie the same way as if keystone was
|
||||
# present)
|
||||
body = self._serializer.to_json(commands)
|
||||
headers = {"X-Identity-Status": "Confirmed", 'X-Roles': 'member'}
|
||||
if self.context.user_id is not None:
|
||||
headers['X-User-Id'] = self.context.user_id
|
||||
if self.context.project_id is not None:
|
||||
headers['X-Tenant-Id'] = self.context.project_id
|
||||
response = super(RPCClient, self).do_request('POST',
|
||||
self.base_path,
|
||||
body,
|
||||
headers=headers)
|
||||
return self._deserializer.from_json(response.read())
|
||||
|
||||
|
||||
def client_wrapper(func):
|
||||
def call(context):
|
||||
reg_client = func(context)
|
||||
reg_client.context = context
|
||||
return reg_client
|
||||
return call
|
||||
|
||||
client.RegistryClient.bulk_request = patched_bulk_request
|
||||
|
||||
api.get_registry_client = client_wrapper(api.get_registry_client)
|
@ -74,40 +74,6 @@ class TestImages(functional.FunctionalTest):
|
||||
base_headers.update(custom_headers or {})
|
||||
return base_headers
|
||||
|
||||
def test_not_authenticated_in_registry_on_ops(self):
|
||||
# https://bugs.launchpad.net/glance/+bug/1451850
|
||||
# this configuration guarantees that authentication succeeds in
|
||||
# glance-api and fails in glance-registry if no token is passed
|
||||
self.api_server.deployment_flavor = ''
|
||||
# make sure that request will reach registry
|
||||
self.api_server.data_api = 'glance.db.registry.api'
|
||||
self.registry_server.deployment_flavor = 'fakeauth'
|
||||
self.start_servers(**self.__dict__.copy())
|
||||
headers = {'content-type': 'application/json'}
|
||||
image = {'name': 'image', 'type': 'kernel', 'disk_format': 'qcow2',
|
||||
'container_format': 'bare'}
|
||||
# image create should return 401
|
||||
response = requests.post(self._url('/v2/images'), headers=headers,
|
||||
data=jsonutils.dumps(image))
|
||||
self.assertEqual(http.UNAUTHORIZED, response.status_code)
|
||||
# image list should return 401
|
||||
response = requests.get(self._url('/v2/images'))
|
||||
self.assertEqual(http.UNAUTHORIZED, response.status_code)
|
||||
# image show should return 401
|
||||
response = requests.get(self._url('/v2/images/someimageid'))
|
||||
self.assertEqual(http.UNAUTHORIZED, response.status_code)
|
||||
# image update should return 401
|
||||
ops = [{'op': 'replace', 'path': '/protected', 'value': False}]
|
||||
media_type = 'application/openstack-images-v2.1-json-patch'
|
||||
response = requests.patch(self._url('/v2/images/someimageid'),
|
||||
headers={'content-type': media_type},
|
||||
data=jsonutils.dumps(ops))
|
||||
self.assertEqual(http.UNAUTHORIZED, response.status_code)
|
||||
# image delete should return 401
|
||||
response = requests.delete(self._url('/v2/images/someimageid'))
|
||||
self.assertEqual(http.UNAUTHORIZED, response.status_code)
|
||||
self.stop_servers()
|
||||
|
||||
def test_image_import_using_glance_direct(self):
|
||||
self.start_servers(**self.__dict__.copy())
|
||||
|
||||
@ -3372,7 +3338,6 @@ class TestImages(functional.FunctionalTest):
|
||||
def test_image_visibility_to_different_users(self):
|
||||
self.cleanup()
|
||||
self.api_server.deployment_flavor = 'fakeauth'
|
||||
self.registry_server.deployment_flavor = 'fakeauth'
|
||||
|
||||
kwargs = self.__dict__.copy()
|
||||
kwargs['use_user_token'] = True
|
||||
@ -3596,15 +3561,6 @@ class TestImages(functional.FunctionalTest):
|
||||
self.assertEqual(http.BAD_REQUEST, response.status_code, response.text)
|
||||
|
||||
|
||||
class TestImagesWithRegistry(TestImages):
|
||||
def setUp(self):
|
||||
super(TestImagesWithRegistry, self).setUp()
|
||||
self.api_server.data_api = (
|
||||
'glance.tests.functional.v2.registry_data_api')
|
||||
self.registry_server.deployment_flavor = 'trusted-auth'
|
||||
self.api_server.use_user_token = True
|
||||
|
||||
|
||||
class TestImagesIPv6(functional.FunctionalTest):
|
||||
"""Verify that API and REG servers running IPv6 can communicate"""
|
||||
|
||||
@ -3652,18 +3608,6 @@ class TestImagesIPv6(functional.FunctionalTest):
|
||||
|
||||
def test_image_list_ipv6(self):
|
||||
# Image list should be empty
|
||||
self.api_server.data_api = (
|
||||
'glance.tests.functional.v2.registry_data_api')
|
||||
self.registry_server.deployment_flavor = 'trusted-auth'
|
||||
|
||||
# Setting up configuration parameters properly
|
||||
# (bind_host is not needed since it is replaced by monkey patches,
|
||||
# but it would be reflected in the configuration file, which is
|
||||
# at least improving consistency)
|
||||
self.registry_server.bind_host = "::1"
|
||||
self.api_server.bind_host = "::1"
|
||||
self.api_server.registry_host = "::1"
|
||||
self.scrubber_daemon.registry_host = "::1"
|
||||
|
||||
self.start_servers(**self.__dict__.copy())
|
||||
|
||||
@ -3878,14 +3822,6 @@ class TestImageDirectURLVisibility(functional.FunctionalTest):
|
||||
self.stop_servers()
|
||||
|
||||
|
||||
class TestImageDirectURLVisibilityWithRegistry(TestImageDirectURLVisibility):
|
||||
def setUp(self):
|
||||
super(TestImageDirectURLVisibilityWithRegistry, self).setUp()
|
||||
self.api_server.data_api = (
|
||||
'glance.tests.functional.v2.registry_data_api')
|
||||
self.registry_server.deployment_flavor = 'trusted-auth'
|
||||
|
||||
|
||||
class TestImageLocationSelectionStrategy(functional.FunctionalTest):
|
||||
|
||||
def setUp(self):
|
||||
@ -3982,15 +3918,6 @@ class TestImageLocationSelectionStrategy(functional.FunctionalTest):
|
||||
self.stop_servers()
|
||||
|
||||
|
||||
class TestImageLocationSelectionStrategyWithRegistry(
|
||||
TestImageLocationSelectionStrategy):
|
||||
def setUp(self):
|
||||
super(TestImageLocationSelectionStrategyWithRegistry, self).setUp()
|
||||
self.api_server.data_api = (
|
||||
'glance.tests.functional.v2.registry_data_api')
|
||||
self.registry_server.deployment_flavor = 'trusted-auth'
|
||||
|
||||
|
||||
class TestImageMembers(functional.FunctionalTest):
|
||||
|
||||
def setUp(self):
|
||||
@ -3998,7 +3925,6 @@ class TestImageMembers(functional.FunctionalTest):
|
||||
self.cleanup()
|
||||
self.include_scrubber = False
|
||||
self.api_server.deployment_flavor = 'fakeauth'
|
||||
self.registry_server.deployment_flavor = 'fakeauth'
|
||||
self.start_servers(**self.__dict__.copy())
|
||||
|
||||
def _url(self, path):
|
||||
@ -4350,14 +4276,6 @@ class TestImageMembers(functional.FunctionalTest):
|
||||
self.stop_servers()
|
||||
|
||||
|
||||
class TestImageMembersWithRegistry(TestImageMembers):
|
||||
def setUp(self):
|
||||
super(TestImageMembersWithRegistry, self).setUp()
|
||||
self.api_server.data_api = (
|
||||
'glance.tests.functional.v2.registry_data_api')
|
||||
self.registry_server.deployment_flavor = 'trusted-auth'
|
||||
|
||||
|
||||
class TestQuotas(functional.FunctionalTest):
|
||||
|
||||
def setUp(self):
|
||||
@ -4365,7 +4283,6 @@ class TestQuotas(functional.FunctionalTest):
|
||||
self.cleanup()
|
||||
self.include_scrubber = False
|
||||
self.api_server.deployment_flavor = 'noauth'
|
||||
self.registry_server.deployment_flavor = 'trusted-auth'
|
||||
self.user_storage_quota = 100
|
||||
self.start_servers(**self.__dict__.copy())
|
||||
|
||||
@ -4436,14 +4353,6 @@ class TestQuotas(functional.FunctionalTest):
|
||||
self._upload_image_test(data_gen(), http.REQUEST_ENTITY_TOO_LARGE)
|
||||
|
||||
|
||||
class TestQuotasWithRegistry(TestQuotas):
|
||||
def setUp(self):
|
||||
super(TestQuotasWithRegistry, self).setUp()
|
||||
self.api_server.data_api = (
|
||||
'glance.tests.functional.v2.registry_data_api')
|
||||
self.registry_server.deployment_flavor = 'trusted-auth'
|
||||
|
||||
|
||||
class TestImagesMultipleBackend(functional.MultipleBackendFunctionalTest):
|
||||
|
||||
def setUp(self):
|
||||
|
@ -135,12 +135,3 @@ class TestTasks(functional.FunctionalTest):
|
||||
self.assertEqual('GET', response.headers.get('Allow'))
|
||||
|
||||
self.stop_servers()
|
||||
|
||||
|
||||
class TestTasksWithRegistry(TestTasks):
|
||||
def setUp(self):
|
||||
super(TestTasksWithRegistry, self).setUp()
|
||||
self.api_server.data_api = (
|
||||
'glance.tests.functional.v2.registry_data_api')
|
||||
self.registry_server.deployment_flavor = 'trusted-auth'
|
||||
self.include_scrubber = False
|
||||
|
@ -90,7 +90,6 @@ class IsolatedUnitTest(StoreClearingUnitTest):
|
||||
Unit test case that establishes a mock environment within
|
||||
a testing directory (in isolation)
|
||||
"""
|
||||
registry = None
|
||||
|
||||
def setUp(self):
|
||||
super(IsolatedUnitTest, self).setUp()
|
||||
@ -106,13 +105,10 @@ class IsolatedUnitTest(StoreClearingUnitTest):
|
||||
store.create_stores()
|
||||
|
||||
def fake_get_conection_type(client):
|
||||
DEFAULT_REGISTRY_PORT = 9191
|
||||
DEFAULT_API_PORT = 9292
|
||||
|
||||
if client.port == DEFAULT_API_PORT:
|
||||
return stubs.FakeGlanceConnection
|
||||
elif client.port == DEFAULT_REGISTRY_PORT:
|
||||
return stubs.FakeRegistryConnection(registry=self.registry)
|
||||
|
||||
self.patcher = mock.patch(
|
||||
'glance.common.client.BaseClient.get_connection_type',
|
||||
@ -132,7 +128,6 @@ class MultiIsolatedUnitTest(MultiStoreClearingUnitTest):
|
||||
Unit test case that establishes a mock environment within
|
||||
a testing directory (in isolation)
|
||||
"""
|
||||
registry = None
|
||||
|
||||
def setUp(self):
|
||||
super(MultiIsolatedUnitTest, self).setUp()
|
||||
@ -140,9 +135,6 @@ class MultiIsolatedUnitTest(MultiStoreClearingUnitTest):
|
||||
lockutils.set_defaults(os.path.join(self.test_dir))
|
||||
|
||||
self.config(debug=False)
|
||||
stubs.stub_out_registry_and_store_server(self,
|
||||
self.test_dir,
|
||||
registry=self.registry)
|
||||
|
||||
def set_policy_rules(self, rules):
|
||||
fap = open(CONF.oslo_policy.policy_file, 'w')
|
||||
|
@ -61,15 +61,15 @@ class TestPasteApp(test_utils.BaseTestCase):
|
||||
paste_to = temp_file.replace('.conf', '-paste.ini')
|
||||
if not paste_config_file and make_paste_file:
|
||||
paste_from = os.path.join(os.getcwd(),
|
||||
'etc/glance-registry-paste.ini')
|
||||
'etc/glance-api-paste.ini')
|
||||
_appendto(paste_from, paste_to, paste_append)
|
||||
|
||||
app = config.load_paste_app('glance-registry')
|
||||
app = config.load_paste_app('glance-api')
|
||||
|
||||
self.assertIsInstance(app, expected_app_type)
|
||||
|
||||
def test_load_paste_app(self):
|
||||
expected_middleware = oslo_middleware.Healthcheck
|
||||
expected_middleware = oslo_middleware.CORS
|
||||
self._do_test_load_paste_app(expected_middleware)
|
||||
|
||||
def test_load_paste_app_paste_config_not_found(self):
|
||||
@ -78,8 +78,8 @@ class TestPasteApp(test_utils.BaseTestCase):
|
||||
expected_middleware, make_paste_file=False)
|
||||
|
||||
def test_load_paste_app_with_paste_flavor(self):
|
||||
pipeline = ('[pipeline:glance-registry-incomplete]\n'
|
||||
'pipeline = context registryapp')
|
||||
pipeline = ('[pipeline:glance-api-incomplete]\n'
|
||||
'pipeline = context rootapp')
|
||||
expected_middleware = context.ContextMiddleware
|
||||
self._do_test_load_paste_app(expected_middleware,
|
||||
paste_flavor='incomplete',
|
||||
@ -87,13 +87,13 @@ class TestPasteApp(test_utils.BaseTestCase):
|
||||
|
||||
def test_load_paste_app_with_paste_config_file(self):
|
||||
paste_config_file = os.path.join(os.getcwd(),
|
||||
'etc/glance-registry-paste.ini')
|
||||
expected_middleware = oslo_middleware.Healthcheck
|
||||
'etc/glance-api-paste.ini')
|
||||
expected_middleware = oslo_middleware.CORS
|
||||
self._do_test_load_paste_app(expected_middleware,
|
||||
paste_config_file=paste_config_file)
|
||||
|
||||
def test_load_paste_app_with_paste_config_file_but_not_exist(self):
|
||||
paste_config_file = os.path.abspath("glance-registry-paste.ini")
|
||||
paste_config_file = os.path.abspath("glance-api-paste.ini")
|
||||
expected_middleware = oslo_middleware.Healthcheck
|
||||
self.assertRaises(RuntimeError, self._do_test_load_paste_app,
|
||||
expected_middleware,
|
||||
|
@ -29,8 +29,6 @@ from six.moves import range
|
||||
|
||||
from glance.common import exception
|
||||
from glance import image_cache
|
||||
# NOTE(bcwaldon): This is imported to load the registry config options
|
||||
import glance.registry # noqa
|
||||
from glance.tests import utils as test_utils
|
||||
from glance.tests.utils import skip_if_disabled
|
||||
from glance.tests.utils import xattr_writes_supported
|
||||
|
@ -372,59 +372,6 @@ class TestImagesController(base.StoreClearingUnitTest):
|
||||
self.controller.upload,
|
||||
request, unit_test_utils.UUID2, 'YY', 2)
|
||||
|
||||
@mock.patch("glance.common.trust_auth.TokenRefresher")
|
||||
def test_upload_with_trusts(self, mock_refresher):
|
||||
"""Test that uploading with registry correctly uses trusts"""
|
||||
# initialize trust environment
|
||||
self.config(data_api='glance.db.registry.api')
|
||||
refresher = mock.MagicMock()
|
||||
mock_refresher.return_value = refresher
|
||||
refresher.refresh_token.return_value = "fake_token"
|
||||
# request an image upload
|
||||
request = unit_test_utils.get_fake_request()
|
||||
request.environ['keystone.token_auth'] = mock.MagicMock()
|
||||
request.environ['keystone.token_info'] = {
|
||||
'token': {
|
||||
'roles': [{'name': 'FakeRole', 'id': 'FakeID'}]
|
||||
}
|
||||
}
|
||||
image = FakeImage('abcd')
|
||||
self.image_repo.result = image
|
||||
mock_fake_save = mock.Mock()
|
||||
mock_fake_save.side_effect = [None, exception.NotAuthenticated, None]
|
||||
temp_save = FakeImageRepo.save
|
||||
# mocking save to raise NotAuthenticated on the second call
|
||||
FakeImageRepo.save = mock_fake_save
|
||||
self.controller.upload(request, unit_test_utils.UUID2, 'YYYY', 4)
|
||||
# check image data
|
||||
self.assertEqual('YYYY', image.data)
|
||||
self.assertEqual(4, image.size)
|
||||
FakeImageRepo.save = temp_save
|
||||
# check that token has been correctly acquired and deleted
|
||||
mock_refresher.assert_called_once_with(
|
||||
request.environ['keystone.token_auth'],
|
||||
request.context.project_id, ['FakeRole'])
|
||||
refresher.refresh_token.assert_called_once_with()
|
||||
refresher.release_resources.assert_called_once_with()
|
||||
self.assertEqual("fake_token", request.context.auth_token)
|
||||
|
||||
@mock.patch("glance.common.trust_auth.TokenRefresher")
|
||||
def test_upload_with_trusts_fails(self, mock_refresher):
|
||||
"""Test upload with registry if trust was not successfully created"""
|
||||
# initialize trust environment
|
||||
self.config(data_api='glance.db.registry.api')
|
||||
mock_refresher().side_effect = Exception()
|
||||
# request an image upload
|
||||
request = unit_test_utils.get_fake_request()
|
||||
image = FakeImage('abcd')
|
||||
self.image_repo.result = image
|
||||
self.controller.upload(request, unit_test_utils.UUID2, 'YYYY', 4)
|
||||
# check image data
|
||||
self.assertEqual('YYYY', image.data)
|
||||
self.assertEqual(4, image.size)
|
||||
# check that the token has not been updated
|
||||
self.assertEqual(0, mock_refresher().refresh_token.call_count)
|
||||
|
||||
def _test_upload_download_prepare_notification(self):
|
||||
request = unit_test_utils.get_fake_request()
|
||||
self.controller.upload(request, unit_test_utils.UUID2, 'YYYY', 4)
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,779 +0,0 @@
|
||||
# Copyright 2013 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.
|
||||
"""
|
||||
Tests for Glance Registry's client.
|
||||
|
||||
This tests are temporary and will be removed once
|
||||
the registry's driver tests will be added.
|
||||
"""
|
||||
|
||||
import copy
|
||||
import datetime
|
||||
import os
|
||||
import uuid
|
||||
|
||||
from mock import patch
|
||||
from six.moves import reload_module
|
||||
|
||||
from glance.common import config
|
||||
from glance.common import exception
|
||||
from glance.common import timeutils
|
||||
from glance import context
|
||||
from glance.db.sqlalchemy import api as db_api
|
||||
from glance.i18n import _
|
||||
from glance.registry.api import v2 as rserver
|
||||
import glance.registry.client.v2.api as rapi
|
||||
from glance.registry.client.v2.api import client as rclient
|
||||
from glance.tests.unit import base
|
||||
from glance.tests import utils as test_utils
|
||||
|
||||
_gen_uuid = lambda: str(uuid.uuid4())
|
||||
|
||||
UUID1 = str(uuid.uuid4())
|
||||
UUID2 = str(uuid.uuid4())
|
||||
|
||||
# NOTE(bcwaldon): needed to init config_dir cli opt
|
||||
config.parse_args(args=[])
|
||||
|
||||
|
||||
class TestRegistryV2Client(base.IsolatedUnitTest,
|
||||
test_utils.RegistryAPIMixIn):
|
||||
"""Test proper actions made against a registry service.
|
||||
|
||||
Test for both valid and invalid requests.
|
||||
"""
|
||||
|
||||
# Registry server to user
|
||||
# in the stub.
|
||||
registry = rserver
|
||||
|
||||
def setUp(self):
|
||||
"""Establish a clean test environment"""
|
||||
super(TestRegistryV2Client, self).setUp()
|
||||
db_api.get_engine()
|
||||
self.context = context.RequestContext(is_admin=True)
|
||||
uuid1_time = timeutils.utcnow()
|
||||
uuid2_time = uuid1_time + datetime.timedelta(seconds=5)
|
||||
self.FIXTURES = [
|
||||
self.get_extra_fixture(
|
||||
id=UUID1, name='fake image #1', visibility='shared',
|
||||
disk_format='ami', container_format='ami', size=13,
|
||||
virtual_size=26, properties={'type': 'kernel'},
|
||||
location="swift://user:passwd@acct/container/obj.tar.0",
|
||||
created_at=uuid1_time),
|
||||
self.get_extra_fixture(id=UUID2, name='fake image #2',
|
||||
properties={}, size=19, virtual_size=38,
|
||||
location="file:///tmp/glance-tests/2",
|
||||
created_at=uuid2_time)]
|
||||
self.destroy_fixtures()
|
||||
self.create_fixtures()
|
||||
self.client = rclient.RegistryClient("127.0.0.1")
|
||||
|
||||
def tearDown(self):
|
||||
"""Clear the test environment"""
|
||||
super(TestRegistryV2Client, self).tearDown()
|
||||
self.destroy_fixtures()
|
||||
|
||||
def test_image_get_index(self):
|
||||
"""Test correct set of public image returned"""
|
||||
images = self.client.image_get_all()
|
||||
self.assertEqual(2, len(images))
|
||||
|
||||
def test_create_image_with_null_min_disk_min_ram(self):
|
||||
UUID3 = _gen_uuid()
|
||||
extra_fixture = self.get_fixture(id=UUID3, name='asdf', min_disk=None,
|
||||
min_ram=None)
|
||||
db_api.image_create(self.context, extra_fixture)
|
||||
image = self.client.image_get(image_id=UUID3)
|
||||
self.assertEqual(0, image["min_ram"])
|
||||
self.assertEqual(0, image["min_disk"])
|
||||
|
||||
def test_get_index_sort_name_asc(self):
|
||||
"""Tests that the registry API returns list of public images.
|
||||
|
||||
Must be sorted alphabetically by name in ascending order.
|
||||
"""
|
||||
UUID3 = _gen_uuid()
|
||||
extra_fixture = self.get_fixture(id=UUID3, name='asdf')
|
||||
|
||||
db_api.image_create(self.context, extra_fixture)
|
||||
|
||||
UUID4 = _gen_uuid()
|
||||
extra_fixture = self.get_fixture(id=UUID4, name='xyz')
|
||||
|
||||
db_api.image_create(self.context, extra_fixture)
|
||||
|
||||
images = self.client.image_get_all(sort_key=['name'],
|
||||
sort_dir=['asc'])
|
||||
|
||||
self.assertEqualImages(images, (UUID3, UUID1, UUID2, UUID4),
|
||||
unjsonify=False)
|
||||
|
||||
def test_get_index_sort_status_desc(self):
|
||||
"""Tests that the registry API returns list of public images.
|
||||
|
||||
Must be sorted alphabetically by status in descending order.
|
||||
"""
|
||||
uuid4_time = timeutils.utcnow() + datetime.timedelta(seconds=10)
|
||||
|
||||
UUID3 = _gen_uuid()
|
||||
extra_fixture = self.get_fixture(id=UUID3, name='asdf',
|
||||
status='queued')
|
||||
|
||||
db_api.image_create(self.context, extra_fixture)
|
||||
|
||||
UUID4 = _gen_uuid()
|
||||
extra_fixture = self.get_fixture(id=UUID4, name='xyz',
|
||||
created_at=uuid4_time)
|
||||
|
||||
db_api.image_create(self.context, extra_fixture)
|
||||
|
||||
images = self.client.image_get_all(sort_key=['status'],
|
||||
sort_dir=['desc'])
|
||||
|
||||
self.assertEqualImages(images, (UUID3, UUID4, UUID2, UUID1),
|
||||
unjsonify=False)
|
||||
|
||||
def test_get_index_sort_disk_format_asc(self):
|
||||
"""Tests that the registry API returns list of public images.
|
||||
|
||||
Must besorted alphabetically by disk_format in ascending order.
|
||||
"""
|
||||
UUID3 = _gen_uuid()
|
||||
extra_fixture = self.get_fixture(id=UUID3, name='asdf',
|
||||
disk_format='ami',
|
||||
container_format='ami')
|
||||
|
||||
db_api.image_create(self.context, extra_fixture)
|
||||
|
||||
UUID4 = _gen_uuid()
|
||||
extra_fixture = self.get_fixture(id=UUID4, name='xyz',
|
||||
disk_format='vdi')
|
||||
|
||||
db_api.image_create(self.context, extra_fixture)
|
||||
|
||||
images = self.client.image_get_all(sort_key=['disk_format'],
|
||||
sort_dir=['asc'])
|
||||
|
||||
self.assertEqualImages(images, (UUID1, UUID3, UUID4, UUID2),
|
||||
unjsonify=False)
|
||||
|
||||
def test_get_index_sort_container_format_desc(self):
|
||||
"""Tests that the registry API returns list of public images.
|
||||
|
||||
Must be sorted alphabetically by container_format in descending order.
|
||||
"""
|
||||
UUID3 = _gen_uuid()
|
||||
extra_fixture = self.get_fixture(id=UUID3, name='asdf',
|
||||
disk_format='ami',
|
||||
container_format='ami')
|
||||
|
||||
db_api.image_create(self.context, extra_fixture)
|
||||
|
||||
UUID4 = _gen_uuid()
|
||||
extra_fixture = self.get_fixture(id=UUID4, name='xyz',
|
||||
disk_format='iso',
|
||||
container_format='bare')
|
||||
|
||||
db_api.image_create(self.context, extra_fixture)
|
||||
|
||||
images = self.client.image_get_all(sort_key=['container_format'],
|
||||
sort_dir=['desc'])
|
||||
|
||||
self.assertEqualImages(images, (UUID2, UUID4, UUID3, UUID1),
|
||||
unjsonify=False)
|
||||
|
||||
def test_get_index_sort_size_asc(self):
|
||||
"""Tests that the registry API returns list of public images.
|
||||
|
||||
Must be sorted by size in ascending order.
|
||||
"""
|
||||
UUID3 = _gen_uuid()
|
||||
extra_fixture = self.get_fixture(id=UUID3, name='asdf',
|
||||
disk_format='ami',
|
||||
container_format='ami',
|
||||
size=100, virtual_size=200)
|
||||
|
||||
db_api.image_create(self.context, extra_fixture)
|
||||
|
||||
UUID4 = _gen_uuid()
|
||||
extra_fixture = self.get_fixture(id=UUID4, name='asdf',
|
||||
disk_format='iso',
|
||||
container_format='bare',
|
||||
size=2, virtual_size=4)
|
||||
|
||||
db_api.image_create(self.context, extra_fixture)
|
||||
|
||||
images = self.client.image_get_all(sort_key=['size'], sort_dir=['asc'])
|
||||
|
||||
self.assertEqualImages(images, (UUID4, UUID1, UUID2, UUID3),
|
||||
unjsonify=False)
|
||||
|
||||
def test_get_index_sort_created_at_asc(self):
|
||||
"""Tests that the registry API returns list of public images.
|
||||
|
||||
Must be sorted by created_at in ascending order.
|
||||
"""
|
||||
uuid4_time = timeutils.utcnow() + datetime.timedelta(seconds=10)
|
||||
uuid3_time = uuid4_time + datetime.timedelta(seconds=5)
|
||||
|
||||
UUID3 = _gen_uuid()
|
||||
extra_fixture = self.get_fixture(id=UUID3, created_at=uuid3_time)
|
||||
|
||||
db_api.image_create(self.context, extra_fixture)
|
||||
|
||||
UUID4 = _gen_uuid()
|
||||
extra_fixture = self.get_fixture(id=UUID4, created_at=uuid4_time)
|
||||
|
||||
db_api.image_create(self.context, extra_fixture)
|
||||
|
||||
images = self.client.image_get_all(sort_key=['created_at'],
|
||||
sort_dir=['asc'])
|
||||
|
||||
self.assertEqualImages(images, (UUID1, UUID2, UUID4, UUID3),
|
||||
unjsonify=False)
|
||||
|
||||
def test_get_index_sort_updated_at_desc(self):
|
||||
"""Tests that the registry API returns list of public images.
|
||||
|
||||
Must be sorted by updated_at in descending order.
|
||||
"""
|
||||
uuid4_time = timeutils.utcnow() + datetime.timedelta(seconds=10)
|
||||
uuid3_time = uuid4_time + datetime.timedelta(seconds=5)
|
||||
|
||||
UUID3 = _gen_uuid()
|
||||
extra_fixture = self.get_fixture(id=UUID3, created_at=None,
|
||||
updated_at=uuid3_time)
|
||||
|
||||
db_api.image_create(self.context, extra_fixture)
|
||||
|
||||
UUID4 = _gen_uuid()
|
||||
extra_fixture = self.get_fixture(id=UUID4, created_at=None,
|
||||
updated_at=uuid4_time)
|
||||
|
||||
db_api.image_create(self.context, extra_fixture)
|
||||
|
||||
images = self.client.image_get_all(sort_key=['updated_at'],
|
||||
sort_dir=['desc'])
|
||||
|
||||
self.assertEqualImages(images, (UUID3, UUID4, UUID2, UUID1),
|
||||
unjsonify=False)
|
||||
|
||||
def test_get_image_details_sort_multiple_keys(self):
|
||||
"""
|
||||
Tests that a detailed call returns list of
|
||||
public images sorted by name-size and
|
||||
size-name in ascending order.
|
||||
"""
|
||||
UUID3 = _gen_uuid()
|
||||
extra_fixture = self.get_fixture(id=UUID3, name='asdf',
|
||||
size=19)
|
||||
|
||||
db_api.image_create(self.context, extra_fixture)
|
||||
|
||||
UUID4 = _gen_uuid()
|
||||
extra_fixture = self.get_fixture(id=UUID4, name=u'xyz',
|
||||
size=20)
|
||||
|
||||
db_api.image_create(self.context, extra_fixture)
|
||||
|
||||
UUID5 = _gen_uuid()
|
||||
extra_fixture = self.get_fixture(id=UUID5, name=u'asdf',
|
||||
size=20)
|
||||
|
||||
db_api.image_create(self.context, extra_fixture)
|
||||
|
||||
images = self.client.image_get_all(sort_key=['name', 'size'],
|
||||
sort_dir=['asc'])
|
||||
|
||||
self.assertEqualImages(images, (UUID3, UUID5, UUID1, UUID2, UUID4),
|
||||
unjsonify=False)
|
||||
|
||||
images = self.client.image_get_all(sort_key=['size', 'name'],
|
||||
sort_dir=['asc'])
|
||||
|
||||
self.assertEqualImages(images, (UUID1, UUID3, UUID2, UUID5, UUID4),
|
||||
unjsonify=False)
|
||||
|
||||
def test_get_image_details_sort_multiple_dirs(self):
|
||||
"""
|
||||
Tests that a detailed call returns list of
|
||||
public images sorted by name-size and
|
||||
size-name in ascending and descending orders.
|
||||
"""
|
||||
UUID3 = _gen_uuid()
|
||||
extra_fixture = self.get_fixture(id=UUID3, name='asdf',
|
||||
size=19)
|
||||
|
||||
db_api.image_create(self.context, extra_fixture)
|
||||
|
||||
UUID4 = _gen_uuid()
|
||||
extra_fixture = self.get_fixture(id=UUID4, name='xyz',
|
||||
size=20)
|
||||
|
||||
db_api.image_create(self.context, extra_fixture)
|
||||
|
||||
UUID5 = _gen_uuid()
|
||||
extra_fixture = self.get_fixture(id=UUID5, name='asdf',
|
||||
size=20)
|
||||
|
||||
db_api.image_create(self.context, extra_fixture)
|
||||
|
||||
images = self.client.image_get_all(sort_key=['name', 'size'],
|
||||
sort_dir=['asc', 'desc'])
|
||||
|
||||
self.assertEqualImages(images, (UUID5, UUID3, UUID1, UUID2, UUID4),
|
||||
unjsonify=False)
|
||||
|
||||
images = self.client.image_get_all(sort_key=['name', 'size'],
|
||||
sort_dir=['desc', 'asc'])
|
||||
|
||||
self.assertEqualImages(images, (UUID4, UUID2, UUID1, UUID3, UUID5),
|
||||
unjsonify=False)
|
||||
|
||||
images = self.client.image_get_all(sort_key=['size', 'name'],
|
||||
sort_dir=['asc', 'desc'])
|
||||
|
||||
self.assertEqualImages(images, (UUID1, UUID2, UUID3, UUID4, UUID5),
|
||||
unjsonify=False)
|
||||
|
||||
images = self.client.image_get_all(sort_key=['size', 'name'],
|
||||
sort_dir=['desc', 'asc'])
|
||||
|
||||
self.assertEqualImages(images, (UUID5, UUID4, UUID3, UUID2, UUID1),
|
||||
unjsonify=False)
|
||||
|
||||
def test_image_get_index_marker(self):
|
||||
"""Test correct set of images returned with marker param."""
|
||||
uuid4_time = timeutils.utcnow() + datetime.timedelta(seconds=10)
|
||||
uuid3_time = uuid4_time + datetime.timedelta(seconds=5)
|
||||
|
||||
UUID3 = _gen_uuid()
|
||||
extra_fixture = self.get_fixture(id=UUID3, name='new name! #123',
|
||||
status='saving',
|
||||
created_at=uuid3_time)
|
||||
|
||||
db_api.image_create(self.context, extra_fixture)
|
||||
|
||||
UUID4 = _gen_uuid()
|
||||
extra_fixture = self.get_fixture(id=UUID4, name='new name! #125',
|
||||
status='saving',
|
||||
created_at=uuid4_time)
|
||||
|
||||
db_api.image_create(self.context, extra_fixture)
|
||||
|
||||
images = self.client.image_get_all(marker=UUID3)
|
||||
|
||||
self.assertEqualImages(images, (UUID4, UUID2, UUID1), unjsonify=False)
|
||||
|
||||
def test_image_get_index_limit(self):
|
||||
"""Test correct number of images returned with limit param."""
|
||||
extra_fixture = self.get_fixture(id=_gen_uuid(),
|
||||
name='new name! #123',
|
||||
status='saving')
|
||||
|
||||
db_api.image_create(self.context, extra_fixture)
|
||||
|
||||
extra_fixture = self.get_fixture(id=_gen_uuid(),
|
||||
name='new name! #125',
|
||||
status='saving')
|
||||
|
||||
db_api.image_create(self.context, extra_fixture)
|
||||
|
||||
images = self.client.image_get_all(limit=2)
|
||||
self.assertEqual(2, len(images))
|
||||
|
||||
def test_image_get_index_marker_limit(self):
|
||||
"""Test correct set of images returned with marker/limit params."""
|
||||
uuid4_time = timeutils.utcnow() + datetime.timedelta(seconds=10)
|
||||
uuid3_time = uuid4_time + datetime.timedelta(seconds=5)
|
||||
|
||||
UUID3 = _gen_uuid()
|
||||
extra_fixture = self.get_fixture(id=UUID3, name='new name! #123',
|
||||
status='saving',
|
||||
created_at=uuid3_time)
|
||||
|
||||
db_api.image_create(self.context, extra_fixture)
|
||||
|
||||
UUID4 = _gen_uuid()
|
||||
extra_fixture = self.get_fixture(id=UUID4, name='new name! #125',
|
||||
status='saving',
|
||||
created_at=uuid4_time)
|
||||
|
||||
db_api.image_create(self.context, extra_fixture)
|
||||
|
||||
images = self.client.image_get_all(marker=UUID4, limit=1)
|
||||
|
||||
self.assertEqualImages(images, (UUID2,), unjsonify=False)
|
||||
|
||||
def test_image_get_index_limit_None(self):
|
||||
"""Test correct set of images returned with limit param == None."""
|
||||
extra_fixture = self.get_fixture(id=_gen_uuid(),
|
||||
name='new name! #123',
|
||||
status='saving')
|
||||
|
||||
db_api.image_create(self.context, extra_fixture)
|
||||
|
||||
extra_fixture = self.get_fixture(id=_gen_uuid(),
|
||||
name='new name! #125',
|
||||
status='saving')
|
||||
|
||||
db_api.image_create(self.context, extra_fixture)
|
||||
|
||||
images = self.client.image_get_all(limit=None)
|
||||
self.assertEqual(4, len(images))
|
||||
|
||||
def test_image_get_index_by_name(self):
|
||||
"""Test correct set of public, name-filtered image returned.
|
||||
|
||||
This is just a sanity check, we test the details call more in-depth.
|
||||
"""
|
||||
extra_fixture = self.get_fixture(id=_gen_uuid(),
|
||||
name='new name! #123')
|
||||
|
||||
db_api.image_create(self.context, extra_fixture)
|
||||
|
||||
images = self.client.image_get_all(filters={'name': 'new name! #123'})
|
||||
self.assertEqual(1, len(images))
|
||||
|
||||
for image in images:
|
||||
self.assertEqual('new name! #123', image['name'])
|
||||
|
||||
def test_image_get_is_public_v2(self):
|
||||
"""Tests that a detailed call can be filtered by a property"""
|
||||
extra_fixture = self.get_fixture(id=_gen_uuid(), status='saving',
|
||||
properties={'is_public': 'avalue'})
|
||||
|
||||
context = copy.copy(self.context)
|
||||
db_api.image_create(context, extra_fixture)
|
||||
|
||||
filters = {'is_public': 'avalue'}
|
||||
images = self.client.image_get_all(filters=filters)
|
||||
self.assertEqual(1, len(images))
|
||||
|
||||
for image in images:
|
||||
self.assertEqual('avalue', image['properties'][0]['value'])
|
||||
|
||||
def test_image_get(self):
|
||||
"""Tests that the detailed info about an image returned"""
|
||||
fixture = self.get_fixture(id=UUID1, name='fake image #1',
|
||||
visibility='shared',
|
||||
size=13, virtual_size=26,
|
||||
disk_format='ami', container_format='ami')
|
||||
|
||||
data = self.client.image_get(image_id=UUID1)
|
||||
|
||||
for k, v in fixture.items():
|
||||
el = data[k]
|
||||
self.assertEqual(v, data[k],
|
||||
"Failed v != data[k] where v = %(v)s and "
|
||||
"k = %(k)s and data[k] = %(el)s" %
|
||||
dict(v=v, k=k, el=el))
|
||||
|
||||
def test_image_get_non_existing(self):
|
||||
"""Tests that NotFound is raised when getting a non-existing image"""
|
||||
self.assertRaises(exception.NotFound,
|
||||
self.client.image_get,
|
||||
image_id=_gen_uuid())
|
||||
|
||||
def test_image_create_basic(self):
|
||||
"""Tests that we can add image metadata and returns the new id"""
|
||||
fixture = self.get_fixture()
|
||||
|
||||
new_image = self.client.image_create(values=fixture)
|
||||
|
||||
# Test all other attributes set
|
||||
data = self.client.image_get(image_id=new_image['id'])
|
||||
|
||||
for k, v in fixture.items():
|
||||
self.assertEqual(v, data[k])
|
||||
|
||||
# Test status was updated properly
|
||||
self.assertIn('status', data)
|
||||
self.assertEqual('active', data['status'])
|
||||
|
||||
def test_image_create_with_properties(self):
|
||||
"""Tests that we can add image metadata with properties"""
|
||||
fixture = self.get_fixture(location="file:///tmp/glance-tests/2",
|
||||
properties={'distro': 'Ubuntu 10.04 LTS'})
|
||||
|
||||
new_image = self.client.image_create(values=fixture)
|
||||
|
||||
self.assertIn('properties', new_image)
|
||||
self.assertEqual(new_image['properties'][0]['value'],
|
||||
fixture['properties']['distro'])
|
||||
|
||||
del fixture['location']
|
||||
del fixture['properties']
|
||||
|
||||
for k, v in fixture.items():
|
||||
self.assertEqual(v, new_image[k])
|
||||
|
||||
# Test status was updated properly
|
||||
self.assertIn('status', new_image.keys())
|
||||
self.assertEqual('active', new_image['status'])
|
||||
|
||||
def test_image_create_already_exists(self):
|
||||
"""Tests proper exception is raised if image with ID already exists"""
|
||||
fixture = self.get_fixture(id=UUID2,
|
||||
location="file:///tmp/glance-tests/2")
|
||||
|
||||
self.assertRaises(exception.Duplicate,
|
||||
self.client.image_create,
|
||||
values=fixture)
|
||||
|
||||
def test_image_create_with_bad_status(self):
|
||||
"""Tests proper exception is raised if a bad status is set"""
|
||||
fixture = self.get_fixture(status='bad status',
|
||||
location="file:///tmp/glance-tests/2")
|
||||
|
||||
self.assertRaises(exception.Invalid,
|
||||
self.client.image_create,
|
||||
values=fixture)
|
||||
|
||||
def test_image_update(self):
|
||||
"""Tests that the registry API updates the image"""
|
||||
fixture = {'name': 'fake public image #2',
|
||||
'disk_format': 'vmdk',
|
||||
'status': 'saving'}
|
||||
|
||||
self.assertTrue(self.client.image_update(image_id=UUID2,
|
||||
values=fixture))
|
||||
|
||||
# Test all other attributes set
|
||||
data = self.client.image_get(image_id=UUID2)
|
||||
|
||||
for k, v in fixture.items():
|
||||
self.assertEqual(v, data[k])
|
||||
|
||||
def test_image_update_conflict(self):
|
||||
"""Tests that the registry API updates the image"""
|
||||
next_state = 'saving'
|
||||
fixture = {'name': 'fake public image #2',
|
||||
'disk_format': 'vmdk',
|
||||
'status': next_state}
|
||||
|
||||
image = self.client.image_get(image_id=UUID2)
|
||||
current = image['status']
|
||||
self.assertEqual('active', current)
|
||||
|
||||
# image is in 'active' state so this should cause a failure.
|
||||
from_state = 'saving'
|
||||
|
||||
self.assertRaises(exception.Conflict, self.client.image_update,
|
||||
image_id=UUID2, values=fixture,
|
||||
from_state=from_state)
|
||||
|
||||
try:
|
||||
self.client.image_update(image_id=UUID2, values=fixture,
|
||||
from_state=from_state)
|
||||
except exception.Conflict as exc:
|
||||
msg = (_('cannot transition from %(current)s to '
|
||||
'%(next)s in update (wanted '
|
||||
'from_state=%(from)s)') %
|
||||
{'current': current, 'next': next_state,
|
||||
'from': from_state})
|
||||
self.assertEqual(str(exc), msg)
|
||||
|
||||
def test_image_update_with_invalid_min_disk(self):
|
||||
"""Tests that the registry API updates the image"""
|
||||
next_state = 'saving'
|
||||
fixture = {'name': 'fake image',
|
||||
'disk_format': 'vmdk',
|
||||
'min_disk': 2 ** 31 + 1,
|
||||
'status': next_state}
|
||||
|
||||
image = self.client.image_get(image_id=UUID2)
|
||||
current = image['status']
|
||||
self.assertEqual('active', current)
|
||||
|
||||
# image is in 'active' state so this should cause a failure.
|
||||
from_state = 'saving'
|
||||
|
||||
self.assertRaises(exception.Invalid, self.client.image_update,
|
||||
image_id=UUID2, values=fixture,
|
||||
from_state=from_state)
|
||||
|
||||
def test_image_update_with_invalid_min_ram(self):
|
||||
"""Tests that the registry API updates the image"""
|
||||
next_state = 'saving'
|
||||
fixture = {'name': 'fake image',
|
||||
'disk_format': 'vmdk',
|
||||
'min_ram': 2 ** 31 + 1,
|
||||
'status': next_state}
|
||||
|
||||
image = self.client.image_get(image_id=UUID2)
|
||||
current = image['status']
|
||||
self.assertEqual('active', current)
|
||||
|
||||
# image is in 'active' state so this should cause a failure.
|
||||
from_state = 'saving'
|
||||
|
||||
self.assertRaises(exception.Invalid, self.client.image_update,
|
||||
image_id=UUID2, values=fixture,
|
||||
from_state=from_state)
|
||||
|
||||
def _test_image_update_not_existing(self):
|
||||
"""Tests non existing image update doesn't work"""
|
||||
fixture = self.get_fixture(status='bad status')
|
||||
|
||||
self.assertRaises(exception.NotFound,
|
||||
self.client.image_update,
|
||||
image_id=_gen_uuid(),
|
||||
values=fixture)
|
||||
|
||||
def test_image_destroy(self):
|
||||
"""Tests that image metadata is deleted properly"""
|
||||
# Grab the original number of images
|
||||
orig_num_images = len(self.client.image_get_all())
|
||||
|
||||
# Delete image #2
|
||||
image = self.FIXTURES[1]
|
||||
deleted_image = self.client.image_destroy(image_id=image['id'])
|
||||
self.assertTrue(deleted_image)
|
||||
self.assertEqual(image['id'], deleted_image['id'])
|
||||
self.assertTrue(deleted_image['deleted'])
|
||||
self.assertTrue(deleted_image['deleted_at'])
|
||||
|
||||
# Verify one less image
|
||||
filters = {'deleted': False}
|
||||
new_num_images = len(self.client.image_get_all(filters=filters))
|
||||
|
||||
self.assertEqual(new_num_images, orig_num_images - 1)
|
||||
|
||||
def test_image_destroy_not_existing(self):
|
||||
"""Tests cannot delete non-existing image"""
|
||||
self.assertRaises(exception.NotFound,
|
||||
self.client.image_destroy,
|
||||
image_id=_gen_uuid())
|
||||
|
||||
def test_image_get_members(self):
|
||||
"""Tests getting image members"""
|
||||
memb_list = self.client.image_member_find(image_id=UUID2)
|
||||
num_members = len(memb_list)
|
||||
self.assertEqual(0, num_members)
|
||||
|
||||
def test_image_get_members_not_existing(self):
|
||||
"""Tests getting non-existent image members"""
|
||||
self.assertRaises(exception.NotFound,
|
||||
self.client.image_get_members,
|
||||
image_id=_gen_uuid())
|
||||
|
||||
def test_image_member_find(self):
|
||||
"""Tests getting member images"""
|
||||
memb_list = self.client.image_member_find(member='pattieblack')
|
||||
num_members = len(memb_list)
|
||||
self.assertEqual(0, num_members)
|
||||
|
||||
def test_image_member_find_include_deleted(self):
|
||||
"""Tests getting image members including the deleted member"""
|
||||
values = dict(image_id=UUID2, member='pattieblack')
|
||||
# create a member
|
||||
member = self.client.image_member_create(values=values)
|
||||
memb_list = self.client.image_member_find(member='pattieblack')
|
||||
memb_list2 = self.client.image_member_find(member='pattieblack',
|
||||
include_deleted=True)
|
||||
self.assertEqual(1, len(memb_list))
|
||||
self.assertEqual(1, len(memb_list2))
|
||||
# delete the member
|
||||
self.client.image_member_delete(memb_id=member['id'])
|
||||
memb_list = self.client.image_member_find(member='pattieblack')
|
||||
memb_list2 = self.client.image_member_find(member='pattieblack',
|
||||
include_deleted=True)
|
||||
self.assertEqual(0, len(memb_list))
|
||||
self.assertEqual(1, len(memb_list2))
|
||||
# create it again
|
||||
member = self.client.image_member_create(values=values)
|
||||
memb_list = self.client.image_member_find(member='pattieblack')
|
||||
memb_list2 = self.client.image_member_find(member='pattieblack',
|
||||
include_deleted=True)
|
||||
self.assertEqual(1, len(memb_list))
|
||||
self.assertEqual(2, len(memb_list2))
|
||||
|
||||
def test_add_update_members(self):
|
||||
"""Tests updating image members"""
|
||||
values = dict(image_id=UUID2, member='pattieblack')
|
||||
member = self.client.image_member_create(values=values)
|
||||
self.assertTrue(member)
|
||||
|
||||
values['member'] = 'pattieblack2'
|
||||
self.assertTrue(self.client.image_member_update(memb_id=member['id'],
|
||||
values=values))
|
||||
|
||||
def test_add_delete_member(self):
|
||||
"""Tests deleting image members"""
|
||||
values = dict(image_id=UUID2, member='pattieblack')
|
||||
member = self.client.image_member_create(values=values)
|
||||
|
||||
self.client.image_member_delete(memb_id=member['id'])
|
||||
memb_list = self.client.image_member_find(member='pattieblack')
|
||||
self.assertEqual(0, len(memb_list))
|
||||
|
||||
|
||||
class TestRegistryV2ClientApi(base.IsolatedUnitTest):
|
||||
"""Test proper actions made against a registry service.
|
||||
|
||||
Test for both valid and invalid requests.
|
||||
"""
|
||||
|
||||
def setUp(self):
|
||||
"""Establish a clean test environment"""
|
||||
super(TestRegistryV2ClientApi, self).setUp()
|
||||
reload_module(rapi)
|
||||
|
||||
def test_configure_registry_client_not_using_use_user_token(self):
|
||||
self.config(use_user_token=False)
|
||||
with patch.object(rapi,
|
||||
'configure_registry_admin_creds') as mock_rapi:
|
||||
rapi.configure_registry_client()
|
||||
mock_rapi.assert_called_once_with()
|
||||
|
||||
def _get_fake_config_creds(self, auth_url='auth_url', strategy='keystone'):
|
||||
return {
|
||||
'user': 'user',
|
||||
'password': 'password',
|
||||
'username': 'user',
|
||||
'tenant': 'tenant',
|
||||
'auth_url': auth_url,
|
||||
'strategy': strategy,
|
||||
'region': 'region'
|
||||
}
|
||||
|
||||
def test_configure_registry_admin_creds(self):
|
||||
expected = self._get_fake_config_creds(auth_url=None,
|
||||
strategy='configured_strategy')
|
||||
self.config(admin_user=expected['user'])
|
||||
self.config(admin_password=expected['password'])
|
||||
self.config(admin_tenant_name=expected['tenant'])
|
||||
self.config(auth_strategy=expected['strategy'])
|
||||
self.config(auth_region=expected['region'])
|
||||
self.mock_object(os, 'getenv', lambda x: None)
|
||||
|
||||
self.assertIsNone(rapi._CLIENT_CREDS)
|
||||
rapi.configure_registry_admin_creds()
|
||||
self.assertEqual(expected, rapi._CLIENT_CREDS)
|
||||
|
||||
def test_configure_registry_admin_creds_with_auth_url(self):
|
||||
expected = self._get_fake_config_creds()
|
||||
self.config(admin_user=expected['user'])
|
||||
self.config(admin_password=expected['password'])
|
||||
self.config(admin_tenant_name=expected['tenant'])
|
||||
self.config(auth_url=expected['auth_url'])
|
||||
self.config(auth_strategy='test_strategy')
|
||||
self.config(auth_region=expected['region'])
|
||||
|
||||
self.assertIsNone(rapi._CLIENT_CREDS)
|
||||
rapi.configure_registry_admin_creds()
|
||||
self.assertEqual(expected, rapi._CLIENT_CREDS)
|
@ -336,6 +336,7 @@ class TestTasksController(test_utils.BaseTestCase):
|
||||
@mock.patch('glance.common.scripts.utils.validate_location_uri')
|
||||
def test_create_with_live_time(self, mock_validate_location_uri,
|
||||
mock_get_image_data_iter):
|
||||
self.skipTest("Something wrong, this test touches registry")
|
||||
request = unit_test_utils.get_fake_request()
|
||||
task = {
|
||||
"type": "import",
|
||||
|
@ -32,7 +32,6 @@ from oslo_config import cfg
|
||||
from oslo_config import fixture as cfg_fixture
|
||||
from oslo_log.fixture import logging_error as log_fixture
|
||||
from oslo_log import log
|
||||
from oslo_serialization import jsonutils
|
||||
import six
|
||||
from six.moves import BaseHTTPServer
|
||||
from six.moves import http_client as http
|
||||
@ -42,13 +41,11 @@ import webob
|
||||
from glance.common import config
|
||||
from glance.common import exception
|
||||
from glance.common import property_utils
|
||||
from glance.common import timeutils
|
||||
from glance.common import utils
|
||||
from glance.common import wsgi
|
||||
from glance import context
|
||||
from glance.db.sqlalchemy import alembic_migrations
|
||||
from glance.db.sqlalchemy import api as db_api
|
||||
from glance.db.sqlalchemy import models as db_models
|
||||
from glance.tests.unit import fixtures as glance_fixtures
|
||||
|
||||
CONF = cfg.CONF
|
||||
@ -547,79 +544,6 @@ def start_http_server(image_id, image_data):
|
||||
return thread, httpd, port
|
||||
|
||||
|
||||
class RegistryAPIMixIn(object):
|
||||
|
||||
def create_fixtures(self):
|
||||
for fixture in self.FIXTURES:
|
||||
db_api.image_create(self.context, fixture)
|
||||
with open(os.path.join(self.test_dir, fixture['id']),
|
||||
'wb') as image:
|
||||
image.write(b"chunk00000remainder")
|
||||
|
||||
def destroy_fixtures(self):
|
||||
db_models.unregister_models(db_api.get_engine())
|
||||
db_models.register_models(db_api.get_engine())
|
||||
|
||||
def get_fixture(self, **kwargs):
|
||||
fixture = {'name': 'fake public image',
|
||||
'status': 'active',
|
||||
'disk_format': 'vhd',
|
||||
'container_format': 'ovf',
|
||||
'visibility': 'public',
|
||||
'size': 20,
|
||||
'checksum': None}
|
||||
if 'is_public' in kwargs:
|
||||
fixture.pop('visibility')
|
||||
fixture.update(kwargs)
|
||||
return fixture
|
||||
|
||||
def get_minimal_fixture(self, **kwargs):
|
||||
fixture = {'name': 'fake public image',
|
||||
'visibility': 'public',
|
||||
'disk_format': 'vhd',
|
||||
'container_format': 'ovf'}
|
||||
if 'is_public' in kwargs:
|
||||
fixture.pop('visibility')
|
||||
fixture.update(kwargs)
|
||||
return fixture
|
||||
|
||||
def get_extra_fixture(self, id, name, **kwargs):
|
||||
created_at = kwargs.pop('created_at', timeutils.utcnow())
|
||||
updated_at = kwargs.pop('updated_at', created_at)
|
||||
return self.get_fixture(
|
||||
id=id, name=name, deleted=False, deleted_at=None,
|
||||
created_at=created_at, updated_at=updated_at,
|
||||
**kwargs)
|
||||
|
||||
def get_api_response_ext(self, http_resp, url='/images', headers=None,
|
||||
body=None, method=None, api=None,
|
||||
content_type=None):
|
||||
if api is None:
|
||||
api = self.api
|
||||
if headers is None:
|
||||
headers = {}
|
||||
req = webob.Request.blank(url)
|
||||
for k, v in six.iteritems(headers):
|
||||
req.headers[k] = v
|
||||
if method:
|
||||
req.method = method
|
||||
if body:
|
||||
req.body = body
|
||||
if content_type == 'json':
|
||||
req.content_type = 'application/json'
|
||||
elif content_type == 'octet':
|
||||
req.content_type = 'application/octet-stream'
|
||||
res = req.get_response(api)
|
||||
self.assertEqual(res.status_int, http_resp)
|
||||
return res
|
||||
|
||||
def assertEqualImages(self, res, uuids, key='images', unjsonify=True):
|
||||
images = jsonutils.loads(res.body)[key] if unjsonify else res
|
||||
self.assertEqual(len(images), len(uuids))
|
||||
for i, value in enumerate(uuids):
|
||||
self.assertEqual(images[i]['id'], value)
|
||||
|
||||
|
||||
class FakeAuthMiddleware(wsgi.Middleware):
|
||||
|
||||
def __init__(self, app, is_admin=False):
|
||||
|
Loading…
Reference in New Issue
Block a user