Move *_swift_info functions into a new registry module
The *_swift_info functions use in module global dicts to provide a registry mechanism for registering and getting swift info. This is an abnormal pattern and doesn't quite fit into utils. Further we looking at following this pattern for sensitive info to trim in the future. So this patch does some house cleaning and moves this registry to a new module swift.common.registry. And updates all the references to it. For backwards compat we still import the *_swift_info methods into utils for any 3rd party tools or middleware. Change-Id: I71fd7f50d1aafc001d6905438f42de4e58af8421
This commit is contained in:
parent
8ac63b7609
commit
589ac355f3
@ -54,7 +54,7 @@ account size has been updated.
|
|||||||
|
|
||||||
from swift.common.swob import HTTPForbidden, HTTPBadRequest, \
|
from swift.common.swob import HTTPForbidden, HTTPBadRequest, \
|
||||||
HTTPRequestEntityTooLarge, wsgify
|
HTTPRequestEntityTooLarge, wsgify
|
||||||
from swift.common.utils import register_swift_info
|
from swift.common.registry import register_swift_info
|
||||||
from swift.proxy.controllers.base import get_account_info
|
from swift.proxy.controllers.base import get_account_info
|
||||||
|
|
||||||
|
|
||||||
|
@ -206,8 +206,8 @@ from swift.common.swob import Request, HTTPBadGateway, \
|
|||||||
HTTPPreconditionFailed, HTTPRequestEntityTooLarge, HTTPNotAcceptable, \
|
HTTPPreconditionFailed, HTTPRequestEntityTooLarge, HTTPNotAcceptable, \
|
||||||
HTTPLengthRequired, HTTPException, HTTPServerError, wsgify, \
|
HTTPLengthRequired, HTTPException, HTTPServerError, wsgify, \
|
||||||
bytes_to_wsgi, str_to_wsgi, wsgi_unquote, wsgi_quote, wsgi_to_str
|
bytes_to_wsgi, str_to_wsgi, wsgi_unquote, wsgi_quote, wsgi_to_str
|
||||||
from swift.common.utils import get_logger, register_swift_info, \
|
from swift.common.utils import get_logger, StreamingPile
|
||||||
StreamingPile
|
from swift.common.registry import register_swift_info
|
||||||
from swift.common import constraints
|
from swift.common import constraints
|
||||||
from swift.common.http import HTTP_UNAUTHORIZED, HTTP_NOT_FOUND, HTTP_CONFLICT
|
from swift.common.http import HTTP_UNAUTHORIZED, HTTP_NOT_FOUND, HTTP_CONFLICT
|
||||||
from swift.common.request_helpers import is_user_meta
|
from swift.common.request_helpers import is_user_meta
|
||||||
|
@ -44,7 +44,8 @@ from swift.common.middleware import RewriteContext
|
|||||||
from swift.common.swob import Request, HTTPBadRequest, \
|
from swift.common.swob import Request, HTTPBadRequest, \
|
||||||
str_to_wsgi, wsgi_to_str
|
str_to_wsgi, wsgi_to_str
|
||||||
from swift.common.utils import cache_from_env, get_logger, is_valid_ip, \
|
from swift.common.utils import cache_from_env, get_logger, is_valid_ip, \
|
||||||
list_from_csv, parse_socket_string, register_swift_info
|
list_from_csv, parse_socket_string
|
||||||
|
from swift.common.registry import register_swift_info
|
||||||
|
|
||||||
|
|
||||||
def lookup_cname(domain, resolver): # pragma: no cover
|
def lookup_cname(domain, resolver): # pragma: no cover
|
||||||
|
@ -54,7 +54,7 @@ For example::
|
|||||||
from swift.common.http import is_success
|
from swift.common.http import is_success
|
||||||
from swift.common.swob import HTTPRequestEntityTooLarge, HTTPBadRequest, \
|
from swift.common.swob import HTTPRequestEntityTooLarge, HTTPBadRequest, \
|
||||||
wsgify
|
wsgify
|
||||||
from swift.common.utils import register_swift_info
|
from swift.common.registry import register_swift_info
|
||||||
from swift.proxy.controllers.base import get_container_info
|
from swift.proxy.controllers.base import get_container_info
|
||||||
|
|
||||||
|
|
||||||
|
@ -19,8 +19,9 @@ from swift.common.constraints import valid_api_version
|
|||||||
from swift.common.container_sync_realms import ContainerSyncRealms
|
from swift.common.container_sync_realms import ContainerSyncRealms
|
||||||
from swift.common.swob import HTTPBadRequest, HTTPUnauthorized, wsgify
|
from swift.common.swob import HTTPBadRequest, HTTPUnauthorized, wsgify
|
||||||
from swift.common.utils import (
|
from swift.common.utils import (
|
||||||
config_true_value, get_logger, register_swift_info, streq_const_time)
|
config_true_value, get_logger, streq_const_time)
|
||||||
from swift.proxy.controllers.base import get_container_info
|
from swift.proxy.controllers.base import get_container_info
|
||||||
|
from swift.common.registry import register_swift_info
|
||||||
|
|
||||||
|
|
||||||
class ContainerSync(object):
|
class ContainerSync(object):
|
||||||
|
@ -14,7 +14,7 @@
|
|||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
|
|
||||||
from swift.common.swob import Request, Response
|
from swift.common.swob import Request, Response
|
||||||
from swift.common.utils import register_swift_info
|
from swift.common.registry import register_swift_info
|
||||||
|
|
||||||
|
|
||||||
class CrossDomainMiddleware(object):
|
class CrossDomainMiddleware(object):
|
||||||
|
@ -20,7 +20,8 @@ instance of an :class:`~swift.common.middleware.crypto.encrypter.Encrypter`.
|
|||||||
from swift.common.middleware.crypto.decrypter import Decrypter
|
from swift.common.middleware.crypto.decrypter import Decrypter
|
||||||
from swift.common.middleware.crypto.encrypter import Encrypter
|
from swift.common.middleware.crypto.encrypter import Encrypter
|
||||||
|
|
||||||
from swift.common.utils import config_true_value, register_swift_info
|
from swift.common.utils import config_true_value
|
||||||
|
from swift.common.registry import register_swift_info
|
||||||
|
|
||||||
|
|
||||||
def filter_factory(global_conf, **local_conf):
|
def filter_factory(global_conf, **local_conf):
|
||||||
|
@ -100,8 +100,8 @@ storage end points as sync destinations.
|
|||||||
|
|
||||||
from swift.common.middleware import RewriteContext
|
from swift.common.middleware import RewriteContext
|
||||||
from swift.common.swob import Request, HTTPBadRequest, wsgi_quote
|
from swift.common.swob import Request, HTTPBadRequest, wsgi_quote
|
||||||
from swift.common.utils import config_true_value, list_from_csv, \
|
from swift.common.utils import config_true_value, list_from_csv
|
||||||
register_swift_info
|
from swift.common.registry import register_swift_info
|
||||||
|
|
||||||
|
|
||||||
class _DomainRemapContext(RewriteContext):
|
class _DomainRemapContext(RewriteContext):
|
||||||
|
@ -42,7 +42,8 @@ useful if some subset of applications expect Etags to be bare MD5s.
|
|||||||
from swift.common.constraints import valid_api_version
|
from swift.common.constraints import valid_api_version
|
||||||
from swift.common.http import is_success
|
from swift.common.http import is_success
|
||||||
from swift.common.swob import Request
|
from swift.common.swob import Request
|
||||||
from swift.common.utils import config_true_value, register_swift_info
|
from swift.common.utils import config_true_value
|
||||||
|
from swift.common.registry import register_swift_info
|
||||||
from swift.proxy.controllers.base import get_account_info, get_container_info
|
from swift.proxy.controllers.base import get_account_info, get_container_info
|
||||||
|
|
||||||
|
|
||||||
|
@ -132,9 +132,10 @@ from six.moves.urllib.parse import quote
|
|||||||
from swift.common.constraints import valid_api_version
|
from swift.common.constraints import valid_api_version
|
||||||
from swift.common.exceptions import MimeInvalid
|
from swift.common.exceptions import MimeInvalid
|
||||||
from swift.common.middleware.tempurl import get_tempurl_keys_from_metadata
|
from swift.common.middleware.tempurl import get_tempurl_keys_from_metadata
|
||||||
from swift.common.utils import streq_const_time, register_swift_info, \
|
from swift.common.utils import streq_const_time, parse_content_disposition, \
|
||||||
parse_content_disposition, parse_mime_headers, \
|
parse_mime_headers, iter_multipart_mime_documents, reiterate, \
|
||||||
iter_multipart_mime_documents, reiterate, close_if_possible
|
close_if_possible
|
||||||
|
from swift.common.registry import register_swift_info
|
||||||
from swift.common.wsgi import make_pre_authed_env
|
from swift.common.wsgi import make_pre_authed_env
|
||||||
from swift.common.swob import HTTPUnauthorized, wsgi_to_str, str_to_wsgi
|
from swift.common.swob import HTTPUnauthorized, wsgi_to_str, str_to_wsgi
|
||||||
from swift.proxy.controllers.base import get_account_info, get_container_info
|
from swift.proxy.controllers.base import get_account_info, get_container_info
|
||||||
|
@ -41,7 +41,8 @@ The filter returns HTTPBadRequest if path is invalid.
|
|||||||
'''
|
'''
|
||||||
|
|
||||||
import re
|
import re
|
||||||
from swift.common.utils import get_logger, register_swift_info
|
from swift.common.utils import get_logger
|
||||||
|
from swift.common.registry import register_swift_info
|
||||||
|
|
||||||
from swift.common.swob import Request, HTTPBadRequest
|
from swift.common.swob import Request, HTTPBadRequest
|
||||||
|
|
||||||
|
@ -17,7 +17,8 @@ from swift import gettext_ as _
|
|||||||
|
|
||||||
import eventlet
|
import eventlet
|
||||||
|
|
||||||
from swift.common.utils import cache_from_env, get_logger, register_swift_info
|
from swift.common.utils import cache_from_env, get_logger
|
||||||
|
from swift.common.registry import register_swift_info
|
||||||
from swift.proxy.controllers.base import get_account_info, get_container_info
|
from swift.proxy.controllers.base import get_account_info, get_container_info
|
||||||
from swift.common.constraints import valid_api_version
|
from swift.common.constraints import valid_api_version
|
||||||
from swift.common.memcached import MemcacheConnectionError
|
from swift.common.memcached import MemcacheConnectionError
|
||||||
|
@ -14,8 +14,8 @@
|
|||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
from swift.common.constraints import check_account_format
|
from swift.common.constraints import check_account_format
|
||||||
from swift.common.swob import HTTPMethodNotAllowed, Request
|
from swift.common.swob import HTTPMethodNotAllowed, Request
|
||||||
from swift.common.utils import get_logger, config_true_value, \
|
from swift.common.utils import get_logger, config_true_value
|
||||||
register_swift_info
|
from swift.common.registry import register_swift_info
|
||||||
from swift.proxy.controllers.base import get_info
|
from swift.proxy.controllers.base import get_info
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
@ -23,8 +23,8 @@ from swift.common import swob
|
|||||||
from swift.common.http import HTTP_OK
|
from swift.common.http import HTTP_OK
|
||||||
from swift.common.middleware.versioned_writes.object_versioning import \
|
from swift.common.middleware.versioned_writes.object_versioning import \
|
||||||
DELETE_MARKER_CONTENT_TYPE
|
DELETE_MARKER_CONTENT_TYPE
|
||||||
from swift.common.utils import json, public, config_true_value, Timestamp, \
|
from swift.common.utils import json, public, config_true_value, Timestamp
|
||||||
get_swift_info
|
from swift.common.registry import get_swift_info
|
||||||
|
|
||||||
from swift.common.middleware.s3api.controllers.base import Controller
|
from swift.common.middleware.s3api.controllers.base import Controller
|
||||||
from swift.common.middleware.s3api.etree import Element, SubElement, \
|
from swift.common.middleware.s3api.etree import Element, SubElement, \
|
||||||
|
@ -18,7 +18,8 @@ import json
|
|||||||
|
|
||||||
from swift.common.constraints import MAX_OBJECT_NAME_LENGTH
|
from swift.common.constraints import MAX_OBJECT_NAME_LENGTH
|
||||||
from swift.common.http import HTTP_NO_CONTENT
|
from swift.common.http import HTTP_NO_CONTENT
|
||||||
from swift.common.utils import public, StreamingPile, get_swift_info
|
from swift.common.utils import public, StreamingPile
|
||||||
|
from swift.common.registry import get_swift_info
|
||||||
|
|
||||||
from swift.common.middleware.s3api.controllers.base import Controller, \
|
from swift.common.middleware.s3api.controllers.base import Controller, \
|
||||||
bucket_operation
|
bucket_operation
|
||||||
|
@ -20,7 +20,8 @@ from swift.common.http import HTTP_OK, HTTP_PARTIAL_CONTENT, HTTP_NO_CONTENT
|
|||||||
from swift.common.request_helpers import update_etag_is_at_header
|
from swift.common.request_helpers import update_etag_is_at_header
|
||||||
from swift.common.swob import Range, content_range_header_value, \
|
from swift.common.swob import Range, content_range_header_value, \
|
||||||
normalize_etag
|
normalize_etag
|
||||||
from swift.common.utils import public, list_from_csv, get_swift_info
|
from swift.common.utils import public, list_from_csv
|
||||||
|
from swift.common.registry import get_swift_info
|
||||||
|
|
||||||
from swift.common.middleware.versioned_writes.object_versioning import \
|
from swift.common.middleware.versioned_writes.object_versioning import \
|
||||||
DELETE_MARKER_CONTENT_TYPE
|
DELETE_MARKER_CONTENT_TYPE
|
||||||
|
@ -13,7 +13,8 @@
|
|||||||
# See the License for the specific language governing permissions and
|
# See the License for the specific language governing permissions and
|
||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
|
|
||||||
from swift.common.utils import public, get_swift_info, config_true_value
|
from swift.common.utils import public, config_true_value
|
||||||
|
from swift.common.registry import get_swift_info
|
||||||
|
|
||||||
from swift.common.middleware.s3api.controllers.base import Controller, \
|
from swift.common.middleware.s3api.controllers.base import Controller, \
|
||||||
bucket_operation
|
bucket_operation
|
||||||
|
@ -156,11 +156,11 @@ from swift.common.middleware.s3api.exception import NotS3Request, \
|
|||||||
from swift.common.middleware.s3api.s3request import get_request_class
|
from swift.common.middleware.s3api.s3request import get_request_class
|
||||||
from swift.common.middleware.s3api.s3response import ErrorResponse, \
|
from swift.common.middleware.s3api.s3response import ErrorResponse, \
|
||||||
InternalError, MethodNotAllowed, S3ResponseBase, S3NotImplemented
|
InternalError, MethodNotAllowed, S3ResponseBase, S3NotImplemented
|
||||||
from swift.common.utils import get_logger, register_swift_info, \
|
from swift.common.utils import get_logger, config_true_value, \
|
||||||
config_true_value, config_positive_int_value, split_path, \
|
config_positive_int_value, split_path, closing_if_possible, list_from_csv
|
||||||
closing_if_possible, list_from_csv
|
|
||||||
from swift.common.middleware.s3api.utils import Config
|
from swift.common.middleware.s3api.utils import Config
|
||||||
from swift.common.middleware.s3api.acl_handlers import get_acl_handler
|
from swift.common.middleware.s3api.acl_handlers import get_acl_handler
|
||||||
|
from swift.common.registry import register_swift_info
|
||||||
|
|
||||||
|
|
||||||
class ListingEtagMiddleware(object):
|
class ListingEtagMiddleware(object):
|
||||||
|
@ -25,8 +25,8 @@ import six
|
|||||||
from six.moves.urllib.parse import quote, unquote, parse_qsl
|
from six.moves.urllib.parse import quote, unquote, parse_qsl
|
||||||
import string
|
import string
|
||||||
|
|
||||||
from swift.common.utils import split_path, json, get_swift_info, \
|
from swift.common.utils import split_path, json, close_if_possible, md5
|
||||||
close_if_possible, md5
|
from swift.common.registry import get_swift_info
|
||||||
from swift.common import swob
|
from swift.common import swob
|
||||||
from swift.common.http import HTTP_OK, HTTP_CREATED, HTTP_ACCEPTED, \
|
from swift.common.http import HTTP_OK, HTTP_CREATED, HTTP_ACCEPTED, \
|
||||||
HTTP_NO_CONTENT, HTTP_UNAUTHORIZED, HTTP_FORBIDDEN, HTTP_NOT_FOUND, \
|
HTTP_NO_CONTENT, HTTP_UNAUTHORIZED, HTTP_FORBIDDEN, HTTP_NOT_FOUND, \
|
||||||
|
@ -345,9 +345,10 @@ from swift.common.swob import Request, HTTPBadRequest, HTTPServerError, \
|
|||||||
RESPONSE_REASONS, str_to_wsgi, bytes_to_wsgi, wsgi_to_str, wsgi_quote
|
RESPONSE_REASONS, str_to_wsgi, bytes_to_wsgi, wsgi_to_str, wsgi_quote
|
||||||
from swift.common.utils import get_logger, config_true_value, \
|
from swift.common.utils import get_logger, config_true_value, \
|
||||||
get_valid_utf8_str, override_bytes_from_content_type, split_path, \
|
get_valid_utf8_str, override_bytes_from_content_type, split_path, \
|
||||||
register_swift_info, RateLimitedIterator, quote, close_if_possible, \
|
RateLimitedIterator, quote, close_if_possible, closing_if_possible, \
|
||||||
closing_if_possible, LRUCache, StreamingPile, strict_b64decode, \
|
LRUCache, StreamingPile, strict_b64decode, Timestamp, drain_and_close, \
|
||||||
Timestamp, drain_and_close, get_expirer_container, md5
|
get_expirer_container, md5
|
||||||
|
from swift.common.registry import register_swift_info
|
||||||
from swift.common.request_helpers import SegmentedIterable, \
|
from swift.common.request_helpers import SegmentedIterable, \
|
||||||
get_sys_meta_prefix, update_etag_is_at_header, resolve_etag_is_at_header, \
|
get_sys_meta_prefix, update_etag_is_at_header, resolve_etag_is_at_header, \
|
||||||
get_container_update_override_key, update_ignore_range_header
|
get_container_update_override_key, update_ignore_range_header
|
||||||
|
@ -131,7 +131,8 @@ from six.moves.urllib.parse import urlparse
|
|||||||
|
|
||||||
from swift.common.request_helpers import html_escape
|
from swift.common.request_helpers import html_escape
|
||||||
from swift.common.utils import human_readable, split_path, config_true_value, \
|
from swift.common.utils import human_readable, split_path, config_true_value, \
|
||||||
quote, register_swift_info, get_logger
|
quote, get_logger
|
||||||
|
from swift.common.registry import register_swift_info
|
||||||
from swift.common.wsgi import make_env, WSGIContext
|
from swift.common.wsgi import make_env, WSGIContext
|
||||||
from swift.common.http import is_success, is_redirection, HTTP_NOT_FOUND
|
from swift.common.http import is_success, is_redirection, HTTP_NOT_FOUND
|
||||||
from swift.common.swob import Response, HTTPMovedPermanently, HTTPNotFound, \
|
from swift.common.swob import Response, HTTPMovedPermanently, HTTPNotFound, \
|
||||||
|
@ -201,9 +201,10 @@ import json
|
|||||||
import os
|
import os
|
||||||
from cgi import parse_header
|
from cgi import parse_header
|
||||||
|
|
||||||
from swift.common.utils import get_logger, register_swift_info, split_path, \
|
from swift.common.utils import get_logger, split_path, \
|
||||||
MD5_OF_EMPTY_STRING, close_if_possible, closing_if_possible, \
|
MD5_OF_EMPTY_STRING, close_if_possible, closing_if_possible, \
|
||||||
config_true_value, drain_and_close
|
config_true_value, drain_and_close
|
||||||
|
from swift.common.registry import register_swift_info
|
||||||
from swift.common.constraints import check_account_format
|
from swift.common.constraints import check_account_format
|
||||||
from swift.common.wsgi import WSGIContext, make_subrequest, \
|
from swift.common.wsgi import WSGIContext, make_subrequest, \
|
||||||
make_pre_authed_request
|
make_pre_authed_request
|
||||||
|
@ -191,7 +191,8 @@ from swift.common.request_helpers import get_sys_meta_prefix
|
|||||||
from swift.common.middleware.acl import (
|
from swift.common.middleware.acl import (
|
||||||
clean_acl, parse_acl, referrer_allowed, acls_from_account_info)
|
clean_acl, parse_acl, referrer_allowed, acls_from_account_info)
|
||||||
from swift.common.utils import cache_from_env, get_logger, \
|
from swift.common.utils import cache_from_env, get_logger, \
|
||||||
split_path, config_true_value, register_swift_info
|
split_path, config_true_value
|
||||||
|
from swift.common.registry import register_swift_info
|
||||||
from swift.common.utils import config_read_reseller_options, quote
|
from swift.common.utils import config_read_reseller_options, quote
|
||||||
from swift.proxy.controllers.base import get_account_info
|
from swift.proxy.controllers.base import get_account_info
|
||||||
|
|
||||||
|
@ -314,8 +314,8 @@ from swift.common.header_key_dict import HeaderKeyDict
|
|||||||
from swift.common.swob import header_to_environ_key, HTTPUnauthorized, \
|
from swift.common.swob import header_to_environ_key, HTTPUnauthorized, \
|
||||||
HTTPBadRequest, wsgi_to_str
|
HTTPBadRequest, wsgi_to_str
|
||||||
from swift.common.utils import split_path, get_valid_utf8_str, \
|
from swift.common.utils import split_path, get_valid_utf8_str, \
|
||||||
register_swift_info, get_hmac, streq_const_time, quote, get_logger, \
|
get_hmac, streq_const_time, quote, get_logger, strict_b64decode
|
||||||
strict_b64decode
|
from swift.common.registry import register_swift_info
|
||||||
|
|
||||||
|
|
||||||
DISALLOWED_INCOMING_HEADERS = 'x-object-manifest x-symlink-target'
|
DISALLOWED_INCOMING_HEADERS = 'x-object-manifest x-symlink-target'
|
||||||
@ -498,7 +498,7 @@ class TempURL(object):
|
|||||||
if env['REQUEST_METHOD'] == 'OPTIONS':
|
if env['REQUEST_METHOD'] == 'OPTIONS':
|
||||||
return self.app(env, start_response)
|
return self.app(env, start_response)
|
||||||
info = self._get_temp_url_info(env)
|
info = self._get_temp_url_info(env)
|
||||||
temp_url_sig, temp_url_expires, temp_url_prefix, filename,\
|
temp_url_sig, temp_url_expires, temp_url_prefix, filename, \
|
||||||
inline_disposition, temp_url_ip_range = info
|
inline_disposition, temp_url_ip_range = info
|
||||||
if temp_url_sig is None and temp_url_expires is None:
|
if temp_url_sig is None and temp_url_expires is None:
|
||||||
return self.app(env, start_response)
|
return self.app(env, start_response)
|
||||||
|
@ -25,8 +25,8 @@ from swift.common.middleware.versioned_writes. \
|
|||||||
from swift.common.middleware.versioned_writes. \
|
from swift.common.middleware.versioned_writes. \
|
||||||
object_versioning import ObjectVersioningMiddleware
|
object_versioning import ObjectVersioningMiddleware
|
||||||
|
|
||||||
from swift.common.utils import config_true_value, register_swift_info, \
|
from swift.common.utils import config_true_value
|
||||||
get_swift_info
|
from swift.common.registry import register_swift_info, get_swift_info
|
||||||
|
|
||||||
|
|
||||||
def filter_factory(global_conf, **local_conf):
|
def filter_factory(global_conf, **local_conf):
|
||||||
|
86
swift/common/registry.py
Normal file
86
swift/common/registry.py
Normal file
@ -0,0 +1,86 @@
|
|||||||
|
# Copyright (c) 2022 NVIDIA
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
|
||||||
|
# Used by get_swift_info and register_swift_info to store information about
|
||||||
|
# the swift cluster.
|
||||||
|
from copy import deepcopy
|
||||||
|
|
||||||
|
_swift_info = {}
|
||||||
|
_swift_admin_info = {}
|
||||||
|
|
||||||
|
|
||||||
|
def get_swift_info(admin=False, disallowed_sections=None):
|
||||||
|
"""
|
||||||
|
Returns information about the swift cluster that has been previously
|
||||||
|
registered with the register_swift_info call.
|
||||||
|
|
||||||
|
:param admin: boolean value, if True will additionally return an 'admin'
|
||||||
|
section with information previously registered as admin
|
||||||
|
info.
|
||||||
|
:param disallowed_sections: list of section names to be withheld from the
|
||||||
|
information returned.
|
||||||
|
:returns: dictionary of information about the swift cluster.
|
||||||
|
"""
|
||||||
|
disallowed_sections = disallowed_sections or []
|
||||||
|
info = deepcopy(_swift_info)
|
||||||
|
for section in disallowed_sections:
|
||||||
|
key_to_pop = None
|
||||||
|
sub_section_dict = info
|
||||||
|
for sub_section in section.split('.'):
|
||||||
|
if key_to_pop:
|
||||||
|
sub_section_dict = sub_section_dict.get(key_to_pop, {})
|
||||||
|
if not isinstance(sub_section_dict, dict):
|
||||||
|
sub_section_dict = {}
|
||||||
|
break
|
||||||
|
key_to_pop = sub_section
|
||||||
|
sub_section_dict.pop(key_to_pop, None)
|
||||||
|
|
||||||
|
if admin:
|
||||||
|
info['admin'] = dict(_swift_admin_info)
|
||||||
|
info['admin']['disallowed_sections'] = list(disallowed_sections)
|
||||||
|
return info
|
||||||
|
|
||||||
|
|
||||||
|
def register_swift_info(name='swift', admin=False, **kwargs):
|
||||||
|
"""
|
||||||
|
Registers information about the swift cluster to be retrieved with calls
|
||||||
|
to get_swift_info.
|
||||||
|
|
||||||
|
NOTE: Do not use "." in the param: name or any keys in kwargs. "." is used
|
||||||
|
in the disallowed_sections to remove unwanted keys from /info.
|
||||||
|
|
||||||
|
:param name: string, the section name to place the information under.
|
||||||
|
:param admin: boolean, if True, information will be registered to an
|
||||||
|
admin section which can optionally be withheld when
|
||||||
|
requesting the information.
|
||||||
|
:param kwargs: key value arguments representing the information to be
|
||||||
|
added.
|
||||||
|
:raises ValueError: if name or any of the keys in kwargs has "." in it
|
||||||
|
"""
|
||||||
|
if name == 'admin' or name == 'disallowed_sections':
|
||||||
|
raise ValueError('\'{0}\' is reserved name.'.format(name))
|
||||||
|
|
||||||
|
if admin:
|
||||||
|
dict_to_use = _swift_admin_info
|
||||||
|
else:
|
||||||
|
dict_to_use = _swift_info
|
||||||
|
if name not in dict_to_use:
|
||||||
|
if "." in name:
|
||||||
|
raise ValueError('Cannot use "." in a swift_info key: %s' % name)
|
||||||
|
dict_to_use[name] = {}
|
||||||
|
for key, val in kwargs.items():
|
||||||
|
if "." in key:
|
||||||
|
raise ValueError('Cannot use "." in a swift_info key: %s' % key)
|
||||||
|
dict_to_use[name][key] = val
|
@ -45,7 +45,6 @@ from random import random, shuffle
|
|||||||
from contextlib import contextmanager, closing
|
from contextlib import contextmanager, closing
|
||||||
import ctypes
|
import ctypes
|
||||||
import ctypes.util
|
import ctypes.util
|
||||||
from copy import deepcopy
|
|
||||||
from optparse import OptionParser
|
from optparse import OptionParser
|
||||||
import traceback
|
import traceback
|
||||||
import warnings
|
import warnings
|
||||||
@ -90,6 +89,9 @@ from swift.common.http import is_server_error
|
|||||||
from swift.common.header_key_dict import HeaderKeyDict
|
from swift.common.header_key_dict import HeaderKeyDict
|
||||||
from swift.common.linkat import linkat
|
from swift.common.linkat import linkat
|
||||||
|
|
||||||
|
# For backwards compatability with 3rd party middlewares
|
||||||
|
from swift.common.registry import register_swift_info, get_swift_info # noqa
|
||||||
|
|
||||||
# logging doesn't import patched as cleanly as one would like
|
# logging doesn't import patched as cleanly as one would like
|
||||||
from logging.handlers import SysLogHandler
|
from logging.handlers import SysLogHandler
|
||||||
import logging
|
import logging
|
||||||
@ -318,77 +320,6 @@ def get_hmac(request_method, path, expires, key, digest=sha1,
|
|||||||
return hmac.new(key, message, digest).hexdigest()
|
return hmac.new(key, message, digest).hexdigest()
|
||||||
|
|
||||||
|
|
||||||
# Used by get_swift_info and register_swift_info to store information about
|
|
||||||
# the swift cluster.
|
|
||||||
_swift_info = {}
|
|
||||||
_swift_admin_info = {}
|
|
||||||
|
|
||||||
|
|
||||||
def get_swift_info(admin=False, disallowed_sections=None):
|
|
||||||
"""
|
|
||||||
Returns information about the swift cluster that has been previously
|
|
||||||
registered with the register_swift_info call.
|
|
||||||
|
|
||||||
:param admin: boolean value, if True will additionally return an 'admin'
|
|
||||||
section with information previously registered as admin
|
|
||||||
info.
|
|
||||||
:param disallowed_sections: list of section names to be withheld from the
|
|
||||||
information returned.
|
|
||||||
:returns: dictionary of information about the swift cluster.
|
|
||||||
"""
|
|
||||||
disallowed_sections = disallowed_sections or []
|
|
||||||
info = deepcopy(_swift_info)
|
|
||||||
for section in disallowed_sections:
|
|
||||||
key_to_pop = None
|
|
||||||
sub_section_dict = info
|
|
||||||
for sub_section in section.split('.'):
|
|
||||||
if key_to_pop:
|
|
||||||
sub_section_dict = sub_section_dict.get(key_to_pop, {})
|
|
||||||
if not isinstance(sub_section_dict, dict):
|
|
||||||
sub_section_dict = {}
|
|
||||||
break
|
|
||||||
key_to_pop = sub_section
|
|
||||||
sub_section_dict.pop(key_to_pop, None)
|
|
||||||
|
|
||||||
if admin:
|
|
||||||
info['admin'] = dict(_swift_admin_info)
|
|
||||||
info['admin']['disallowed_sections'] = list(disallowed_sections)
|
|
||||||
return info
|
|
||||||
|
|
||||||
|
|
||||||
def register_swift_info(name='swift', admin=False, **kwargs):
|
|
||||||
"""
|
|
||||||
Registers information about the swift cluster to be retrieved with calls
|
|
||||||
to get_swift_info.
|
|
||||||
|
|
||||||
NOTE: Do not use "." in the param: name or any keys in kwargs. "." is used
|
|
||||||
in the disallowed_sections to remove unwanted keys from /info.
|
|
||||||
|
|
||||||
:param name: string, the section name to place the information under.
|
|
||||||
:param admin: boolean, if True, information will be registered to an
|
|
||||||
admin section which can optionally be withheld when
|
|
||||||
requesting the information.
|
|
||||||
:param kwargs: key value arguments representing the information to be
|
|
||||||
added.
|
|
||||||
:raises ValueError: if name or any of the keys in kwargs has "." in it
|
|
||||||
"""
|
|
||||||
if name == 'admin' or name == 'disallowed_sections':
|
|
||||||
raise ValueError('\'{0}\' is reserved name.'.format(name))
|
|
||||||
|
|
||||||
if admin:
|
|
||||||
dict_to_use = _swift_admin_info
|
|
||||||
else:
|
|
||||||
dict_to_use = _swift_info
|
|
||||||
if name not in dict_to_use:
|
|
||||||
if "." in name:
|
|
||||||
raise ValueError('Cannot use "." in a swift_info key: %s' % name)
|
|
||||||
dict_to_use[name] = {}
|
|
||||||
for key, val in kwargs.items():
|
|
||||||
if "." in key:
|
|
||||||
raise ValueError('Cannot use "." in a swift_info key: %s' % key)
|
|
||||||
dict_to_use[name][key] = val
|
|
||||||
|
|
||||||
|
|
||||||
def backward(f, blocksize=4096):
|
def backward(f, blocksize=4096):
|
||||||
"""
|
"""
|
||||||
A generator returning lines from a file starting with the last line,
|
A generator returning lines from a file starting with the last line,
|
||||||
|
@ -16,8 +16,8 @@
|
|||||||
import json
|
import json
|
||||||
from time import time
|
from time import time
|
||||||
|
|
||||||
from swift.common.utils import public, get_hmac, get_swift_info, \
|
from swift.common.utils import public, get_hmac, streq_const_time
|
||||||
streq_const_time
|
from swift.common.registry import get_swift_info
|
||||||
from swift.proxy.controllers.base import Controller, delay_denial
|
from swift.proxy.controllers.base import Controller, delay_denial
|
||||||
from swift.common.swob import HTTPOk, HTTPForbidden, HTTPUnauthorized
|
from swift.common.swob import HTTPOk, HTTPForbidden, HTTPUnauthorized
|
||||||
|
|
||||||
|
@ -34,8 +34,9 @@ from swift.common.ring import Ring
|
|||||||
from swift.common.utils import Watchdog, get_logger, \
|
from swift.common.utils import Watchdog, get_logger, \
|
||||||
get_remote_client, split_path, config_true_value, generate_trans_id, \
|
get_remote_client, split_path, config_true_value, generate_trans_id, \
|
||||||
affinity_key_function, affinity_locality_predicate, list_from_csv, \
|
affinity_key_function, affinity_locality_predicate, list_from_csv, \
|
||||||
register_swift_info, parse_prefixed_conf, config_auto_int_value, \
|
parse_prefixed_conf, config_auto_int_value, \
|
||||||
config_request_node_count_value, config_percent_value
|
config_request_node_count_value, config_percent_value
|
||||||
|
from swift.common.registry import register_swift_info
|
||||||
from swift.common.constraints import check_utf8, valid_api_version
|
from swift.common.constraints import check_utf8, valid_api_version
|
||||||
from swift.proxy.controllers import AccountController, ContainerController, \
|
from swift.proxy.controllers import AccountController, ContainerController, \
|
||||||
ObjectControllerRouter, InfoController
|
ObjectControllerRouter, InfoController
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
import unittest
|
import unittest
|
||||||
import mock
|
import mock
|
||||||
|
|
||||||
from swift.common import utils
|
from swift.common import registry
|
||||||
from swift.common.middleware import crypto
|
from swift.common.middleware import crypto
|
||||||
|
|
||||||
|
|
||||||
@ -24,36 +24,38 @@ class TestCrypto(unittest.TestCase):
|
|||||||
def do_test(conf, expect_enabled):
|
def do_test(conf, expect_enabled):
|
||||||
fake_app = object()
|
fake_app = object()
|
||||||
|
|
||||||
with mock.patch.dict('swift.common.utils._swift_admin_info',
|
with mock.patch.dict('swift.common.registry._swift_admin_info',
|
||||||
clear=True):
|
clear=True):
|
||||||
# we're not expecting utils._swift_info to be modified but mock
|
# we're not expecting utils._swift_info to be modified but mock
|
||||||
# it anyway just in case it is
|
# it anyway just in case it is
|
||||||
with mock.patch.dict('swift.common.utils._swift_info',
|
with mock.patch.dict('swift.common.registry._swift_info',
|
||||||
clear=True):
|
clear=True):
|
||||||
# Sanity checks...
|
# Sanity checks...
|
||||||
self.assertNotIn('encryption', utils._swift_admin_info)
|
self.assertNotIn('encryption', registry._swift_admin_info)
|
||||||
self.assertNotIn('encryption',
|
self.assertNotIn('encryption',
|
||||||
utils.get_swift_info(admin=True))
|
registry.get_swift_info(admin=True))
|
||||||
self.assertNotIn('encryption',
|
self.assertNotIn(
|
||||||
utils.get_swift_info(admin=True)['admin'])
|
'encryption',
|
||||||
|
registry.get_swift_info(admin=True)['admin'])
|
||||||
|
|
||||||
factory = crypto.filter_factory(conf)
|
factory = crypto.filter_factory(conf)
|
||||||
self.assertTrue(callable(factory))
|
self.assertTrue(callable(factory))
|
||||||
filtered_app = factory(fake_app)
|
filtered_app = factory(fake_app)
|
||||||
|
|
||||||
self.assertNotIn('encryption', utils._swift_info)
|
self.assertNotIn('encryption', registry._swift_info)
|
||||||
self.assertNotIn('encryption', utils.get_swift_info())
|
self.assertNotIn('encryption', registry.get_swift_info())
|
||||||
self.assertNotIn('encryption',
|
self.assertNotIn('encryption',
|
||||||
utils.get_swift_info(admin=True))
|
registry.get_swift_info(admin=True))
|
||||||
|
|
||||||
self.assertIn('encryption', utils._swift_admin_info)
|
self.assertIn('encryption', registry._swift_admin_info)
|
||||||
self.assertDictEqual({'enabled': expect_enabled},
|
|
||||||
utils._swift_admin_info['encryption'])
|
|
||||||
self.assertIn('encryption',
|
|
||||||
utils.get_swift_info(admin=True)['admin'])
|
|
||||||
self.assertDictEqual(
|
self.assertDictEqual(
|
||||||
{'enabled': expect_enabled},
|
{'enabled': expect_enabled},
|
||||||
utils.get_swift_info(
|
registry._swift_admin_info['encryption'])
|
||||||
|
self.assertIn('encryption',
|
||||||
|
registry.get_swift_info(admin=True)['admin'])
|
||||||
|
self.assertDictEqual(
|
||||||
|
{'enabled': expect_enabled},
|
||||||
|
registry.get_swift_info(
|
||||||
admin=True)['admin']['encryption'])
|
admin=True)['admin']['encryption'])
|
||||||
|
|
||||||
self.assertIsInstance(filtered_app, crypto.decrypter.Decrypter)
|
self.assertIsInstance(filtered_app, crypto.decrypter.Decrypter)
|
||||||
|
@ -28,7 +28,7 @@ from six.moves.urllib.parse import unquote, quote
|
|||||||
import swift.common.middleware.s3api
|
import swift.common.middleware.s3api
|
||||||
from swift.common.middleware.s3api.utils import Config
|
from swift.common.middleware.s3api.utils import Config
|
||||||
from swift.common.middleware.keystoneauth import KeystoneAuth
|
from swift.common.middleware.keystoneauth import KeystoneAuth
|
||||||
from swift.common import swob, utils
|
from swift.common import swob, registry
|
||||||
from swift.common.swob import Request
|
from swift.common.swob import Request
|
||||||
from swift.common.utils import md5
|
from swift.common.utils import md5
|
||||||
|
|
||||||
@ -759,15 +759,15 @@ class TestS3ApiMiddleware(S3ApiTestCase):
|
|||||||
def test_mfa(self):
|
def test_mfa(self):
|
||||||
self._test_unsupported_header('x-amz-mfa')
|
self._test_unsupported_header('x-amz-mfa')
|
||||||
|
|
||||||
@mock.patch.object(utils, '_swift_admin_info', new_callable=dict)
|
@mock.patch.object(registry, '_swift_admin_info', new_callable=dict)
|
||||||
def test_server_side_encryption(self, mock_info):
|
def test_server_side_encryption(self, mock_info):
|
||||||
sse_header = 'x-amz-server-side-encryption'
|
sse_header = 'x-amz-server-side-encryption'
|
||||||
self._test_unsupported_header(sse_header, 'AES256')
|
self._test_unsupported_header(sse_header, 'AES256')
|
||||||
self._test_unsupported_header(sse_header, 'aws:kms')
|
self._test_unsupported_header(sse_header, 'aws:kms')
|
||||||
utils.register_swift_info('encryption', admin=True, enabled=False)
|
registry.register_swift_info('encryption', admin=True, enabled=False)
|
||||||
self._test_unsupported_header(sse_header, 'AES256')
|
self._test_unsupported_header(sse_header, 'AES256')
|
||||||
self._test_unsupported_header(sse_header, 'aws:kms')
|
self._test_unsupported_header(sse_header, 'aws:kms')
|
||||||
utils.register_swift_info('encryption', admin=True, enabled=True)
|
registry.register_swift_info('encryption', admin=True, enabled=True)
|
||||||
# AES256 now works
|
# AES256 now works
|
||||||
self.swift.register('PUT', '/v1/AUTH_X/bucket/object',
|
self.swift.register('PUT', '/v1/AUTH_X/bucket/object',
|
||||||
swob.HTTPCreated, {}, None)
|
swob.HTTPCreated, {}, None)
|
||||||
@ -870,7 +870,7 @@ class TestS3ApiMiddleware(S3ApiTestCase):
|
|||||||
def test_registered_defaults(self):
|
def test_registered_defaults(self):
|
||||||
conf_from_file = {k: str(v) for k, v in self.conf.items()}
|
conf_from_file = {k: str(v) for k, v in self.conf.items()}
|
||||||
filter_factory(conf_from_file)
|
filter_factory(conf_from_file)
|
||||||
swift_info = utils.get_swift_info()
|
swift_info = registry.get_swift_info()
|
||||||
self.assertTrue('s3api' in swift_info)
|
self.assertTrue('s3api' in swift_info)
|
||||||
self.assertEqual(swift_info['s3api'].get('max_bucket_listing'),
|
self.assertEqual(swift_info['s3api'].get('max_bucket_listing'),
|
||||||
self.conf['max_bucket_listing'])
|
self.conf['max_bucket_listing'])
|
||||||
|
@ -29,7 +29,7 @@ from eventlet import sleep
|
|||||||
from mock import patch, call
|
from mock import patch, call
|
||||||
from test.debug_logger import debug_logger
|
from test.debug_logger import debug_logger
|
||||||
from test.unit.common.middleware.helpers import FakeSwift
|
from test.unit.common.middleware.helpers import FakeSwift
|
||||||
from swift.common import utils, constraints
|
from swift.common import utils, constraints, registry
|
||||||
from swift.common.header_key_dict import HeaderKeyDict
|
from swift.common.header_key_dict import HeaderKeyDict
|
||||||
from swift.common.middleware import bulk
|
from swift.common.middleware import bulk
|
||||||
from swift.common.swob import Request, Response, HTTPException, \
|
from swift.common.swob import Request, Response, HTTPException, \
|
||||||
@ -1035,12 +1035,12 @@ class TestConfig(unittest.TestCase):
|
|||||||
|
|
||||||
class TestSwiftInfo(unittest.TestCase):
|
class TestSwiftInfo(unittest.TestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
utils._swift_info = {}
|
registry._swift_info = {}
|
||||||
utils._swift_admin_info = {}
|
registry._swift_admin_info = {}
|
||||||
|
|
||||||
def test_registered_defaults(self):
|
def test_registered_defaults(self):
|
||||||
bulk.filter_factory({})
|
bulk.filter_factory({})
|
||||||
swift_info = utils.get_swift_info()
|
swift_info = registry.get_swift_info()
|
||||||
self.assertTrue('bulk_upload' in swift_info)
|
self.assertTrue('bulk_upload' in swift_info)
|
||||||
self.assertTrue(isinstance(
|
self.assertTrue(isinstance(
|
||||||
swift_info['bulk_upload'].get('max_containers_per_extraction'),
|
swift_info['bulk_upload'].get('max_containers_per_extraction'),
|
||||||
|
@ -24,7 +24,7 @@ except ImportError:
|
|||||||
skip = True
|
skip = True
|
||||||
else: # executed if the try has no errors
|
else: # executed if the try has no errors
|
||||||
skip = False
|
skip = False
|
||||||
from swift.common import utils
|
from swift.common import registry
|
||||||
from swift.common.middleware import cname_lookup
|
from swift.common.middleware import cname_lookup
|
||||||
from swift.common.swob import Request, HTTPMovedPermanently
|
from swift.common.swob import Request, HTTPMovedPermanently
|
||||||
|
|
||||||
@ -437,17 +437,17 @@ class TestCNAMELookup(unittest.TestCase):
|
|||||||
|
|
||||||
class TestSwiftInfo(unittest.TestCase):
|
class TestSwiftInfo(unittest.TestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
utils._swift_info = {}
|
registry._swift_info = {}
|
||||||
utils._swift_admin_info = {}
|
registry._swift_admin_info = {}
|
||||||
|
|
||||||
def test_registered_defaults(self):
|
def test_registered_defaults(self):
|
||||||
cname_lookup.filter_factory({})
|
cname_lookup.filter_factory({})
|
||||||
swift_info = utils.get_swift_info()
|
swift_info = registry.get_swift_info()
|
||||||
self.assertIn('cname_lookup', swift_info)
|
self.assertIn('cname_lookup', swift_info)
|
||||||
self.assertEqual(swift_info['cname_lookup'].get('lookup_depth'), 1)
|
self.assertEqual(swift_info['cname_lookup'].get('lookup_depth'), 1)
|
||||||
|
|
||||||
def test_registered_nondefaults(self):
|
def test_registered_nondefaults(self):
|
||||||
cname_lookup.filter_factory({'lookup_depth': '2'})
|
cname_lookup.filter_factory({'lookup_depth': '2'})
|
||||||
swift_info = utils.get_swift_info()
|
swift_info = registry.get_swift_info()
|
||||||
self.assertIn('cname_lookup', swift_info)
|
self.assertIn('cname_lookup', swift_info)
|
||||||
self.assertEqual(swift_info['cname_lookup'].get('lookup_depth'), 2)
|
self.assertEqual(swift_info['cname_lookup'].get('lookup_depth'), 2)
|
||||||
|
@ -18,7 +18,7 @@ import unittest
|
|||||||
|
|
||||||
from swift.common.swob import Request, HTTPMovedPermanently
|
from swift.common.swob import Request, HTTPMovedPermanently
|
||||||
from swift.common.middleware import domain_remap
|
from swift.common.middleware import domain_remap
|
||||||
from swift.common import utils
|
from swift.common import registry
|
||||||
|
|
||||||
|
|
||||||
class FakeApp(object):
|
class FakeApp(object):
|
||||||
@ -321,12 +321,12 @@ class TestDomainRemapClientMangling(unittest.TestCase):
|
|||||||
|
|
||||||
class TestSwiftInfo(unittest.TestCase):
|
class TestSwiftInfo(unittest.TestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
utils._swift_info = {}
|
registry._swift_info = {}
|
||||||
utils._swift_admin_info = {}
|
registry._swift_admin_info = {}
|
||||||
|
|
||||||
def test_registered_defaults(self):
|
def test_registered_defaults(self):
|
||||||
domain_remap.filter_factory({})
|
domain_remap.filter_factory({})
|
||||||
swift_info = utils.get_swift_info()
|
swift_info = registry.get_swift_info()
|
||||||
self.assertIn('domain_remap', swift_info)
|
self.assertIn('domain_remap', swift_info)
|
||||||
self.assertEqual(swift_info['domain_remap'], {
|
self.assertEqual(swift_info['domain_remap'], {
|
||||||
'default_reseller_prefix': None})
|
'default_reseller_prefix': None})
|
||||||
@ -334,7 +334,7 @@ class TestSwiftInfo(unittest.TestCase):
|
|||||||
def test_registered_nondefaults(self):
|
def test_registered_nondefaults(self):
|
||||||
domain_remap.filter_factory({'default_reseller_prefix': 'cupcake',
|
domain_remap.filter_factory({'default_reseller_prefix': 'cupcake',
|
||||||
'mangle_client_paths': 'yes'})
|
'mangle_client_paths': 'yes'})
|
||||||
swift_info = utils.get_swift_info()
|
swift_info = registry.get_swift_info()
|
||||||
self.assertIn('domain_remap', swift_info)
|
self.assertIn('domain_remap', swift_info)
|
||||||
self.assertEqual(swift_info['domain_remap'], {
|
self.assertEqual(swift_info['domain_remap'], {
|
||||||
'default_reseller_prefix': 'cupcake'})
|
'default_reseller_prefix': 'cupcake'})
|
||||||
|
@ -26,7 +26,7 @@ import unittest
|
|||||||
|
|
||||||
from swift.common.swob import Request, Response
|
from swift.common.swob import Request, Response
|
||||||
from swift.common.middleware import name_check
|
from swift.common.middleware import name_check
|
||||||
from swift.common import utils
|
from swift.common import registry
|
||||||
|
|
||||||
MAX_LENGTH = 255
|
MAX_LENGTH = 255
|
||||||
FORBIDDEN_CHARS = '\'\"<>`'
|
FORBIDDEN_CHARS = '\'\"<>`'
|
||||||
@ -117,12 +117,12 @@ class TestNameCheckMiddleware(unittest.TestCase):
|
|||||||
|
|
||||||
class TestSwiftInfo(unittest.TestCase):
|
class TestSwiftInfo(unittest.TestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
utils._swift_info = {}
|
registry._swift_info = {}
|
||||||
utils._swift_admin_info = {}
|
registry._swift_admin_info = {}
|
||||||
|
|
||||||
def test_registered_defaults(self):
|
def test_registered_defaults(self):
|
||||||
name_check.filter_factory({})(FakeApp())
|
name_check.filter_factory({})(FakeApp())
|
||||||
swift_info = utils.get_swift_info()
|
swift_info = registry.get_swift_info()
|
||||||
self.assertTrue('name_check' in swift_info)
|
self.assertTrue('name_check' in swift_info)
|
||||||
self.assertTrue(isinstance(
|
self.assertTrue(isinstance(
|
||||||
swift_info['name_check'].get('maximum_length'),
|
swift_info['name_check'].get('maximum_length'),
|
||||||
@ -139,7 +139,7 @@ class TestSwiftInfo(unittest.TestCase):
|
|||||||
'forbidden_chars': '\'\"`',
|
'forbidden_chars': '\'\"`',
|
||||||
'forbidden_regexp': r"/\./|/\.\./|/\.$"}
|
'forbidden_regexp': r"/\./|/\.\./|/\.$"}
|
||||||
name_check.filter_factory(conf)(FakeApp())
|
name_check.filter_factory(conf)(FakeApp())
|
||||||
swift_info = utils.get_swift_info()
|
swift_info = registry.get_swift_info()
|
||||||
self.assertTrue('name_check' in swift_info)
|
self.assertTrue('name_check' in swift_info)
|
||||||
self.assertEqual(swift_info['name_check'].get('maximum_length'), 512)
|
self.assertEqual(swift_info['name_check'].get('maximum_length'), 512)
|
||||||
self.assertEqual(set(swift_info['name_check'].get('forbidden_chars')),
|
self.assertEqual(set(swift_info['name_check'].get('forbidden_chars')),
|
||||||
|
@ -24,7 +24,7 @@ from swift.common.middleware import ratelimit
|
|||||||
from swift.proxy.controllers.base import get_cache_key, \
|
from swift.proxy.controllers.base import get_cache_key, \
|
||||||
headers_to_container_info
|
headers_to_container_info
|
||||||
from swift.common.swob import Request
|
from swift.common.swob import Request
|
||||||
from swift.common import utils
|
from swift.common import registry
|
||||||
|
|
||||||
threading = eventlet.patcher.original('threading')
|
threading = eventlet.patcher.original('threading')
|
||||||
|
|
||||||
@ -546,8 +546,8 @@ class TestRateLimit(unittest.TestCase):
|
|||||||
|
|
||||||
class TestSwiftInfo(unittest.TestCase):
|
class TestSwiftInfo(unittest.TestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
utils._swift_info = {}
|
registry._swift_info = {}
|
||||||
utils._swift_admin_info = {}
|
registry._swift_admin_info = {}
|
||||||
|
|
||||||
def test_registered_defaults(self):
|
def test_registered_defaults(self):
|
||||||
|
|
||||||
@ -568,7 +568,7 @@ class TestSwiftInfo(unittest.TestCase):
|
|||||||
'container_listing_ratelimit_50': 50}
|
'container_listing_ratelimit_50': 50}
|
||||||
|
|
||||||
ratelimit.filter_factory(test_limits)('have to pass in an app')
|
ratelimit.filter_factory(test_limits)('have to pass in an app')
|
||||||
swift_info = utils.get_swift_info()
|
swift_info = registry.get_swift_info()
|
||||||
self.assertIn('ratelimit', swift_info)
|
self.assertIn('ratelimit', swift_info)
|
||||||
self.assertEqual(swift_info['ratelimit']
|
self.assertEqual(swift_info['ratelimit']
|
||||||
['account_ratelimit'], 1.0)
|
['account_ratelimit'], 1.0)
|
||||||
|
@ -24,7 +24,7 @@ from mock import patch
|
|||||||
import six
|
import six
|
||||||
from io import BytesIO
|
from io import BytesIO
|
||||||
|
|
||||||
from swift.common import swob, utils
|
from swift.common import swob, registry
|
||||||
from swift.common.header_key_dict import HeaderKeyDict
|
from swift.common.header_key_dict import HeaderKeyDict
|
||||||
from swift.common.middleware import slo
|
from swift.common.middleware import slo
|
||||||
from swift.common.swob import Request, HTTPException, str_to_wsgi, \
|
from swift.common.swob import Request, HTTPException, str_to_wsgi, \
|
||||||
@ -4534,12 +4534,12 @@ class TestSloBulkDeleter(unittest.TestCase):
|
|||||||
|
|
||||||
class TestSwiftInfo(unittest.TestCase):
|
class TestSwiftInfo(unittest.TestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
utils._swift_info = {}
|
registry._swift_info = {}
|
||||||
utils._swift_admin_info = {}
|
registry._swift_admin_info = {}
|
||||||
|
|
||||||
def test_registered_defaults(self):
|
def test_registered_defaults(self):
|
||||||
mware = slo.filter_factory({})('have to pass in an app')
|
mware = slo.filter_factory({})('have to pass in an app')
|
||||||
swift_info = utils.get_swift_info()
|
swift_info = registry.get_swift_info()
|
||||||
self.assertTrue('slo' in swift_info)
|
self.assertTrue('slo' in swift_info)
|
||||||
self.assertEqual(swift_info['slo'].get('max_manifest_segments'),
|
self.assertEqual(swift_info['slo'].get('max_manifest_segments'),
|
||||||
mware.max_manifest_segments)
|
mware.max_manifest_segments)
|
||||||
@ -4564,7 +4564,7 @@ class TestSwiftInfo(unittest.TestCase):
|
|||||||
rate_limit_segments_per_sec=2, yield_frequency=5, concurrency=1,
|
rate_limit_segments_per_sec=2, yield_frequency=5, concurrency=1,
|
||||||
delete_concurrency=3, allow_async_delete='y')
|
delete_concurrency=3, allow_async_delete='y')
|
||||||
mware = slo.filter_factory(conf)('have to pass in an app')
|
mware = slo.filter_factory(conf)('have to pass in an app')
|
||||||
swift_info = utils.get_swift_info()
|
swift_info = registry.get_swift_info()
|
||||||
self.assertTrue('slo' in swift_info)
|
self.assertTrue('slo' in swift_info)
|
||||||
self.assertEqual(swift_info['slo'].get('max_manifest_segments'), 500)
|
self.assertEqual(swift_info['slo'].get('max_manifest_segments'), 500)
|
||||||
self.assertEqual(swift_info['slo'].get('min_segment_size'), 1)
|
self.assertEqual(swift_info['slo'].get('min_segment_size'), 1)
|
||||||
|
@ -25,7 +25,8 @@ from swift.common.middleware import symlink, copy, versioned_writes, \
|
|||||||
listing_formats
|
listing_formats
|
||||||
from swift.common.swob import Request
|
from swift.common.swob import Request
|
||||||
from swift.common.request_helpers import get_reserved_name
|
from swift.common.request_helpers import get_reserved_name
|
||||||
from swift.common.utils import MD5_OF_EMPTY_STRING, get_swift_info
|
from swift.common.utils import MD5_OF_EMPTY_STRING
|
||||||
|
from swift.common.registry import get_swift_info
|
||||||
from test.unit.common.middleware.helpers import FakeSwift
|
from test.unit.common.middleware.helpers import FakeSwift
|
||||||
from test.unit.common.middleware.test_versioned_writes import FakeCache
|
from test.unit.common.middleware.test_versioned_writes import FakeCache
|
||||||
|
|
||||||
|
@ -41,7 +41,7 @@ from time import time, strftime, gmtime
|
|||||||
from swift.common.middleware import tempauth, tempurl
|
from swift.common.middleware import tempauth, tempurl
|
||||||
from swift.common.header_key_dict import HeaderKeyDict
|
from swift.common.header_key_dict import HeaderKeyDict
|
||||||
from swift.common.swob import Request, Response
|
from swift.common.swob import Request, Response
|
||||||
from swift.common import utils
|
from swift.common import utils, registry
|
||||||
|
|
||||||
|
|
||||||
class FakeApp(object):
|
class FakeApp(object):
|
||||||
@ -1571,12 +1571,12 @@ class TestTempURL(unittest.TestCase):
|
|||||||
|
|
||||||
class TestSwiftInfo(unittest.TestCase):
|
class TestSwiftInfo(unittest.TestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
utils._swift_info = {}
|
registry._swift_info = {}
|
||||||
utils._swift_admin_info = {}
|
registry._swift_admin_info = {}
|
||||||
|
|
||||||
def test_registered_defaults(self):
|
def test_registered_defaults(self):
|
||||||
tempurl.filter_factory({})
|
tempurl.filter_factory({})
|
||||||
swift_info = utils.get_swift_info()
|
swift_info = registry.get_swift_info()
|
||||||
self.assertIn('tempurl', swift_info)
|
self.assertIn('tempurl', swift_info)
|
||||||
info = swift_info['tempurl']
|
info = swift_info['tempurl']
|
||||||
self.assertEqual(set(info['methods']),
|
self.assertEqual(set(info['methods']),
|
||||||
@ -1599,7 +1599,7 @@ class TestSwiftInfo(unittest.TestCase):
|
|||||||
'outgoing_allow_headers': 'x-object-meta-* content-type',
|
'outgoing_allow_headers': 'x-object-meta-* content-type',
|
||||||
'allowed_digests': 'sha512 md5 not-a-valid-digest',
|
'allowed_digests': 'sha512 md5 not-a-valid-digest',
|
||||||
})
|
})
|
||||||
swift_info = utils.get_swift_info()
|
swift_info = registry.get_swift_info()
|
||||||
self.assertIn('tempurl', swift_info)
|
self.assertIn('tempurl', swift_info)
|
||||||
info = swift_info['tempurl']
|
info = swift_info['tempurl']
|
||||||
self.assertEqual(set(info['methods']),
|
self.assertEqual(set(info['methods']),
|
||||||
|
@ -19,7 +19,7 @@ import os
|
|||||||
import time
|
import time
|
||||||
import mock
|
import mock
|
||||||
import unittest
|
import unittest
|
||||||
from swift.common import swob, utils
|
from swift.common import swob, utils, registry
|
||||||
from swift.common.middleware import versioned_writes, copy
|
from swift.common.middleware import versioned_writes, copy
|
||||||
from swift.common.swob import Request
|
from swift.common.swob import Request
|
||||||
from test.unit.common.middleware import helpers
|
from test.unit.common.middleware import helpers
|
||||||
@ -1515,19 +1515,19 @@ class VersionedWritesCopyingTestCase(VersionedWritesBaseTestCase):
|
|||||||
|
|
||||||
class TestSwiftInfo(unittest.TestCase):
|
class TestSwiftInfo(unittest.TestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
utils._swift_info = {}
|
registry._swift_info = {}
|
||||||
utils._swift_admin_info = {}
|
registry._swift_admin_info = {}
|
||||||
|
|
||||||
def test_registered_defaults(self):
|
def test_registered_defaults(self):
|
||||||
versioned_writes.filter_factory({})('have to pass in an app')
|
versioned_writes.filter_factory({})('have to pass in an app')
|
||||||
swift_info = utils.get_swift_info()
|
swift_info = registry.get_swift_info()
|
||||||
# in default, versioned_writes is not in swift_info
|
# in default, versioned_writes is not in swift_info
|
||||||
self.assertNotIn('versioned_writes', swift_info)
|
self.assertNotIn('versioned_writes', swift_info)
|
||||||
|
|
||||||
def test_registered_explicitly_set(self):
|
def test_registered_explicitly_set(self):
|
||||||
versioned_writes.filter_factory(
|
versioned_writes.filter_factory(
|
||||||
{'allow_versioned_writes': 'true'})('have to pass in an app')
|
{'allow_versioned_writes': 'true'})('have to pass in an app')
|
||||||
swift_info = utils.get_swift_info()
|
swift_info = registry.get_swift_info()
|
||||||
self.assertIn('versioned_writes', swift_info)
|
self.assertIn('versioned_writes', swift_info)
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
swift_info['versioned_writes'].get('allowed_flags'),
|
swift_info['versioned_writes'].get('allowed_flags'),
|
||||||
|
213
test/unit/common/test_registry.py
Normal file
213
test/unit/common/test_registry.py
Normal file
@ -0,0 +1,213 @@
|
|||||||
|
# Copyright (c) 2022 NVIDIA
|
||||||
|
#
|
||||||
|
# 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 swift.common import registry, utils
|
||||||
|
|
||||||
|
import unittest
|
||||||
|
|
||||||
|
|
||||||
|
class TestSwiftInfo(unittest.TestCase):
|
||||||
|
|
||||||
|
def tearDown(self):
|
||||||
|
registry._swift_info = {}
|
||||||
|
registry._swift_admin_info = {}
|
||||||
|
|
||||||
|
def test_register_swift_info(self):
|
||||||
|
registry.register_swift_info(foo='bar')
|
||||||
|
registry.register_swift_info(lorem='ipsum')
|
||||||
|
registry.register_swift_info('cap1', cap1_foo='cap1_bar')
|
||||||
|
registry.register_swift_info('cap1', cap1_lorem='cap1_ipsum')
|
||||||
|
|
||||||
|
self.assertTrue('swift' in registry._swift_info)
|
||||||
|
self.assertTrue('foo' in registry._swift_info['swift'])
|
||||||
|
self.assertEqual(registry._swift_info['swift']['foo'], 'bar')
|
||||||
|
self.assertTrue('lorem' in registry._swift_info['swift'])
|
||||||
|
self.assertEqual(registry._swift_info['swift']['lorem'], 'ipsum')
|
||||||
|
|
||||||
|
self.assertTrue('cap1' in registry._swift_info)
|
||||||
|
self.assertTrue('cap1_foo' in registry._swift_info['cap1'])
|
||||||
|
self.assertEqual(registry._swift_info['cap1']['cap1_foo'], 'cap1_bar')
|
||||||
|
self.assertTrue('cap1_lorem' in registry._swift_info['cap1'])
|
||||||
|
self.assertEqual(registry._swift_info['cap1']['cap1_lorem'],
|
||||||
|
'cap1_ipsum')
|
||||||
|
|
||||||
|
self.assertRaises(ValueError,
|
||||||
|
registry.register_swift_info, 'admin', foo='bar')
|
||||||
|
|
||||||
|
self.assertRaises(ValueError,
|
||||||
|
registry.register_swift_info, 'disallowed_sections',
|
||||||
|
disallowed_sections=None)
|
||||||
|
|
||||||
|
registry.register_swift_info('goodkey', foo='5.6')
|
||||||
|
self.assertRaises(ValueError,
|
||||||
|
registry.register_swift_info, 'bad.key', foo='5.6')
|
||||||
|
data = {'bad.key': '5.6'}
|
||||||
|
self.assertRaises(ValueError,
|
||||||
|
registry.register_swift_info, 'goodkey', **data)
|
||||||
|
|
||||||
|
def test_get_swift_info(self):
|
||||||
|
registry._swift_info = {'swift': {'foo': 'bar'},
|
||||||
|
'cap1': {'cap1_foo': 'cap1_bar'}}
|
||||||
|
registry._swift_admin_info = {'admin_cap1': {'ac1_foo': 'ac1_bar'}}
|
||||||
|
|
||||||
|
info = registry.get_swift_info()
|
||||||
|
|
||||||
|
self.assertNotIn('admin', info)
|
||||||
|
|
||||||
|
self.assertIn('swift', info)
|
||||||
|
self.assertIn('foo', info['swift'])
|
||||||
|
self.assertEqual(registry._swift_info['swift']['foo'], 'bar')
|
||||||
|
|
||||||
|
self.assertIn('cap1', info)
|
||||||
|
self.assertIn('cap1_foo', info['cap1'])
|
||||||
|
self.assertEqual(registry._swift_info['cap1']['cap1_foo'], 'cap1_bar')
|
||||||
|
|
||||||
|
def test_get_swift_info_with_disallowed_sections(self):
|
||||||
|
registry._swift_info = {'swift': {'foo': 'bar'},
|
||||||
|
'cap1': {'cap1_foo': 'cap1_bar'},
|
||||||
|
'cap2': {'cap2_foo': 'cap2_bar'},
|
||||||
|
'cap3': {'cap3_foo': 'cap3_bar'}}
|
||||||
|
registry._swift_admin_info = {'admin_cap1': {'ac1_foo': 'ac1_bar'}}
|
||||||
|
|
||||||
|
info = registry.get_swift_info(disallowed_sections=['cap1', 'cap3'])
|
||||||
|
|
||||||
|
self.assertNotIn('admin', info)
|
||||||
|
|
||||||
|
self.assertIn('swift', info)
|
||||||
|
self.assertIn('foo', info['swift'])
|
||||||
|
self.assertEqual(info['swift']['foo'], 'bar')
|
||||||
|
|
||||||
|
self.assertNotIn('cap1', info)
|
||||||
|
|
||||||
|
self.assertIn('cap2', info)
|
||||||
|
self.assertIn('cap2_foo', info['cap2'])
|
||||||
|
self.assertEqual(info['cap2']['cap2_foo'], 'cap2_bar')
|
||||||
|
|
||||||
|
self.assertNotIn('cap3', info)
|
||||||
|
|
||||||
|
def test_register_swift_admin_info(self):
|
||||||
|
registry.register_swift_info(admin=True, admin_foo='admin_bar')
|
||||||
|
registry.register_swift_info(admin=True, admin_lorem='admin_ipsum')
|
||||||
|
registry.register_swift_info('cap1', admin=True, ac1_foo='ac1_bar')
|
||||||
|
registry.register_swift_info('cap1', admin=True, ac1_lorem='ac1_ipsum')
|
||||||
|
|
||||||
|
self.assertIn('swift', registry._swift_admin_info)
|
||||||
|
self.assertIn('admin_foo', registry._swift_admin_info['swift'])
|
||||||
|
self.assertEqual(
|
||||||
|
registry._swift_admin_info['swift']['admin_foo'], 'admin_bar')
|
||||||
|
self.assertIn('admin_lorem', registry._swift_admin_info['swift'])
|
||||||
|
self.assertEqual(
|
||||||
|
registry._swift_admin_info['swift']['admin_lorem'], 'admin_ipsum')
|
||||||
|
|
||||||
|
self.assertIn('cap1', registry._swift_admin_info)
|
||||||
|
self.assertIn('ac1_foo', registry._swift_admin_info['cap1'])
|
||||||
|
self.assertEqual(
|
||||||
|
registry._swift_admin_info['cap1']['ac1_foo'], 'ac1_bar')
|
||||||
|
self.assertIn('ac1_lorem', registry._swift_admin_info['cap1'])
|
||||||
|
self.assertEqual(
|
||||||
|
registry._swift_admin_info['cap1']['ac1_lorem'], 'ac1_ipsum')
|
||||||
|
|
||||||
|
self.assertNotIn('swift', registry._swift_info)
|
||||||
|
self.assertNotIn('cap1', registry._swift_info)
|
||||||
|
|
||||||
|
def test_get_swift_admin_info(self):
|
||||||
|
registry._swift_info = {'swift': {'foo': 'bar'},
|
||||||
|
'cap1': {'cap1_foo': 'cap1_bar'}}
|
||||||
|
registry._swift_admin_info = {'admin_cap1': {'ac1_foo': 'ac1_bar'}}
|
||||||
|
|
||||||
|
info = registry.get_swift_info(admin=True)
|
||||||
|
|
||||||
|
self.assertIn('admin', info)
|
||||||
|
self.assertIn('admin_cap1', info['admin'])
|
||||||
|
self.assertIn('ac1_foo', info['admin']['admin_cap1'])
|
||||||
|
self.assertEqual(info['admin']['admin_cap1']['ac1_foo'], 'ac1_bar')
|
||||||
|
|
||||||
|
self.assertIn('swift', info)
|
||||||
|
self.assertIn('foo', info['swift'])
|
||||||
|
self.assertEqual(registry._swift_info['swift']['foo'], 'bar')
|
||||||
|
|
||||||
|
self.assertIn('cap1', info)
|
||||||
|
self.assertIn('cap1_foo', info['cap1'])
|
||||||
|
self.assertEqual(registry._swift_info['cap1']['cap1_foo'], 'cap1_bar')
|
||||||
|
|
||||||
|
def test_get_swift_admin_info_with_disallowed_sections(self):
|
||||||
|
registry._swift_info = {'swift': {'foo': 'bar'},
|
||||||
|
'cap1': {'cap1_foo': 'cap1_bar'},
|
||||||
|
'cap2': {'cap2_foo': 'cap2_bar'},
|
||||||
|
'cap3': {'cap3_foo': 'cap3_bar'}}
|
||||||
|
registry._swift_admin_info = {'admin_cap1': {'ac1_foo': 'ac1_bar'}}
|
||||||
|
|
||||||
|
info = registry.get_swift_info(
|
||||||
|
admin=True, disallowed_sections=['cap1', 'cap3'])
|
||||||
|
|
||||||
|
self.assertIn('admin', info)
|
||||||
|
self.assertIn('admin_cap1', info['admin'])
|
||||||
|
self.assertIn('ac1_foo', info['admin']['admin_cap1'])
|
||||||
|
self.assertEqual(info['admin']['admin_cap1']['ac1_foo'], 'ac1_bar')
|
||||||
|
self.assertIn('disallowed_sections', info['admin'])
|
||||||
|
self.assertIn('cap1', info['admin']['disallowed_sections'])
|
||||||
|
self.assertNotIn('cap2', info['admin']['disallowed_sections'])
|
||||||
|
self.assertIn('cap3', info['admin']['disallowed_sections'])
|
||||||
|
|
||||||
|
self.assertIn('swift', info)
|
||||||
|
self.assertIn('foo', info['swift'])
|
||||||
|
self.assertEqual(info['swift']['foo'], 'bar')
|
||||||
|
|
||||||
|
self.assertNotIn('cap1', info)
|
||||||
|
|
||||||
|
self.assertIn('cap2', info)
|
||||||
|
self.assertIn('cap2_foo', info['cap2'])
|
||||||
|
self.assertEqual(info['cap2']['cap2_foo'], 'cap2_bar')
|
||||||
|
|
||||||
|
self.assertNotIn('cap3', info)
|
||||||
|
|
||||||
|
def test_get_swift_admin_info_with_disallowed_sub_sections(self):
|
||||||
|
registry._swift_info = {'swift': {'foo': 'bar'},
|
||||||
|
'cap1': {'cap1_foo': 'cap1_bar',
|
||||||
|
'cap1_moo': 'cap1_baa'},
|
||||||
|
'cap2': {'cap2_foo': 'cap2_bar'},
|
||||||
|
'cap3': {'cap2_foo': 'cap2_bar'},
|
||||||
|
'cap4': {'a': {'b': {'c': 'c'},
|
||||||
|
'b.c': 'b.c'}}}
|
||||||
|
registry._swift_admin_info = {'admin_cap1': {'ac1_foo': 'ac1_bar'}}
|
||||||
|
|
||||||
|
info = registry.get_swift_info(
|
||||||
|
admin=True, disallowed_sections=['cap1.cap1_foo', 'cap3',
|
||||||
|
'cap4.a.b.c'])
|
||||||
|
self.assertNotIn('cap3', info)
|
||||||
|
self.assertEqual(info['cap1']['cap1_moo'], 'cap1_baa')
|
||||||
|
self.assertNotIn('cap1_foo', info['cap1'])
|
||||||
|
self.assertNotIn('c', info['cap4']['a']['b'])
|
||||||
|
self.assertEqual(info['cap4']['a']['b.c'], 'b.c')
|
||||||
|
|
||||||
|
def test_get_swift_info_with_unmatched_disallowed_sections(self):
|
||||||
|
cap1 = {'cap1_foo': 'cap1_bar',
|
||||||
|
'cap1_moo': 'cap1_baa'}
|
||||||
|
registry._swift_info = {'swift': {'foo': 'bar'},
|
||||||
|
'cap1': cap1}
|
||||||
|
# expect no exceptions
|
||||||
|
info = registry.get_swift_info(
|
||||||
|
disallowed_sections=['cap2.cap1_foo', 'cap1.no_match',
|
||||||
|
'cap1.cap1_foo.no_match.no_match'])
|
||||||
|
self.assertEqual(info['cap1'], cap1)
|
||||||
|
|
||||||
|
def test_register_swift_info_import_from_utils(self):
|
||||||
|
# verify that the functions are available to import from utils
|
||||||
|
utils.register_swift_info(foo='bar')
|
||||||
|
self.assertTrue('swift' in registry._swift_info)
|
||||||
|
self.assertTrue('foo' in registry._swift_info['swift'])
|
||||||
|
self.assertEqual(registry._swift_info['swift']['foo'], 'bar')
|
||||||
|
self.assertEqual(registry.get_swift_info(admin=True),
|
||||||
|
utils.get_swift_info(admin=True))
|
@ -5152,191 +5152,6 @@ class TestUnlinkOlder(unittest.TestCase):
|
|||||||
utils.unlink_paths_older_than([path], next(self.ts))
|
utils.unlink_paths_older_than([path], next(self.ts))
|
||||||
|
|
||||||
|
|
||||||
class TestSwiftInfo(unittest.TestCase):
|
|
||||||
|
|
||||||
def tearDown(self):
|
|
||||||
utils._swift_info = {}
|
|
||||||
utils._swift_admin_info = {}
|
|
||||||
|
|
||||||
def test_register_swift_info(self):
|
|
||||||
utils.register_swift_info(foo='bar')
|
|
||||||
utils.register_swift_info(lorem='ipsum')
|
|
||||||
utils.register_swift_info('cap1', cap1_foo='cap1_bar')
|
|
||||||
utils.register_swift_info('cap1', cap1_lorem='cap1_ipsum')
|
|
||||||
|
|
||||||
self.assertTrue('swift' in utils._swift_info)
|
|
||||||
self.assertTrue('foo' in utils._swift_info['swift'])
|
|
||||||
self.assertEqual(utils._swift_info['swift']['foo'], 'bar')
|
|
||||||
self.assertTrue('lorem' in utils._swift_info['swift'])
|
|
||||||
self.assertEqual(utils._swift_info['swift']['lorem'], 'ipsum')
|
|
||||||
|
|
||||||
self.assertTrue('cap1' in utils._swift_info)
|
|
||||||
self.assertTrue('cap1_foo' in utils._swift_info['cap1'])
|
|
||||||
self.assertEqual(utils._swift_info['cap1']['cap1_foo'], 'cap1_bar')
|
|
||||||
self.assertTrue('cap1_lorem' in utils._swift_info['cap1'])
|
|
||||||
self.assertEqual(utils._swift_info['cap1']['cap1_lorem'], 'cap1_ipsum')
|
|
||||||
|
|
||||||
self.assertRaises(ValueError,
|
|
||||||
utils.register_swift_info, 'admin', foo='bar')
|
|
||||||
|
|
||||||
self.assertRaises(ValueError,
|
|
||||||
utils.register_swift_info, 'disallowed_sections',
|
|
||||||
disallowed_sections=None)
|
|
||||||
|
|
||||||
utils.register_swift_info('goodkey', foo='5.6')
|
|
||||||
self.assertRaises(ValueError,
|
|
||||||
utils.register_swift_info, 'bad.key', foo='5.6')
|
|
||||||
data = {'bad.key': '5.6'}
|
|
||||||
self.assertRaises(ValueError,
|
|
||||||
utils.register_swift_info, 'goodkey', **data)
|
|
||||||
|
|
||||||
def test_get_swift_info(self):
|
|
||||||
utils._swift_info = {'swift': {'foo': 'bar'},
|
|
||||||
'cap1': {'cap1_foo': 'cap1_bar'}}
|
|
||||||
utils._swift_admin_info = {'admin_cap1': {'ac1_foo': 'ac1_bar'}}
|
|
||||||
|
|
||||||
info = utils.get_swift_info()
|
|
||||||
|
|
||||||
self.assertNotIn('admin', info)
|
|
||||||
|
|
||||||
self.assertIn('swift', info)
|
|
||||||
self.assertIn('foo', info['swift'])
|
|
||||||
self.assertEqual(utils._swift_info['swift']['foo'], 'bar')
|
|
||||||
|
|
||||||
self.assertIn('cap1', info)
|
|
||||||
self.assertIn('cap1_foo', info['cap1'])
|
|
||||||
self.assertEqual(utils._swift_info['cap1']['cap1_foo'], 'cap1_bar')
|
|
||||||
|
|
||||||
def test_get_swift_info_with_disallowed_sections(self):
|
|
||||||
utils._swift_info = {'swift': {'foo': 'bar'},
|
|
||||||
'cap1': {'cap1_foo': 'cap1_bar'},
|
|
||||||
'cap2': {'cap2_foo': 'cap2_bar'},
|
|
||||||
'cap3': {'cap3_foo': 'cap3_bar'}}
|
|
||||||
utils._swift_admin_info = {'admin_cap1': {'ac1_foo': 'ac1_bar'}}
|
|
||||||
|
|
||||||
info = utils.get_swift_info(disallowed_sections=['cap1', 'cap3'])
|
|
||||||
|
|
||||||
self.assertNotIn('admin', info)
|
|
||||||
|
|
||||||
self.assertIn('swift', info)
|
|
||||||
self.assertIn('foo', info['swift'])
|
|
||||||
self.assertEqual(info['swift']['foo'], 'bar')
|
|
||||||
|
|
||||||
self.assertNotIn('cap1', info)
|
|
||||||
|
|
||||||
self.assertIn('cap2', info)
|
|
||||||
self.assertIn('cap2_foo', info['cap2'])
|
|
||||||
self.assertEqual(info['cap2']['cap2_foo'], 'cap2_bar')
|
|
||||||
|
|
||||||
self.assertNotIn('cap3', info)
|
|
||||||
|
|
||||||
def test_register_swift_admin_info(self):
|
|
||||||
utils.register_swift_info(admin=True, admin_foo='admin_bar')
|
|
||||||
utils.register_swift_info(admin=True, admin_lorem='admin_ipsum')
|
|
||||||
utils.register_swift_info('cap1', admin=True, ac1_foo='ac1_bar')
|
|
||||||
utils.register_swift_info('cap1', admin=True, ac1_lorem='ac1_ipsum')
|
|
||||||
|
|
||||||
self.assertIn('swift', utils._swift_admin_info)
|
|
||||||
self.assertIn('admin_foo', utils._swift_admin_info['swift'])
|
|
||||||
self.assertEqual(
|
|
||||||
utils._swift_admin_info['swift']['admin_foo'], 'admin_bar')
|
|
||||||
self.assertIn('admin_lorem', utils._swift_admin_info['swift'])
|
|
||||||
self.assertEqual(
|
|
||||||
utils._swift_admin_info['swift']['admin_lorem'], 'admin_ipsum')
|
|
||||||
|
|
||||||
self.assertIn('cap1', utils._swift_admin_info)
|
|
||||||
self.assertIn('ac1_foo', utils._swift_admin_info['cap1'])
|
|
||||||
self.assertEqual(
|
|
||||||
utils._swift_admin_info['cap1']['ac1_foo'], 'ac1_bar')
|
|
||||||
self.assertIn('ac1_lorem', utils._swift_admin_info['cap1'])
|
|
||||||
self.assertEqual(
|
|
||||||
utils._swift_admin_info['cap1']['ac1_lorem'], 'ac1_ipsum')
|
|
||||||
|
|
||||||
self.assertNotIn('swift', utils._swift_info)
|
|
||||||
self.assertNotIn('cap1', utils._swift_info)
|
|
||||||
|
|
||||||
def test_get_swift_admin_info(self):
|
|
||||||
utils._swift_info = {'swift': {'foo': 'bar'},
|
|
||||||
'cap1': {'cap1_foo': 'cap1_bar'}}
|
|
||||||
utils._swift_admin_info = {'admin_cap1': {'ac1_foo': 'ac1_bar'}}
|
|
||||||
|
|
||||||
info = utils.get_swift_info(admin=True)
|
|
||||||
|
|
||||||
self.assertIn('admin', info)
|
|
||||||
self.assertIn('admin_cap1', info['admin'])
|
|
||||||
self.assertIn('ac1_foo', info['admin']['admin_cap1'])
|
|
||||||
self.assertEqual(info['admin']['admin_cap1']['ac1_foo'], 'ac1_bar')
|
|
||||||
|
|
||||||
self.assertIn('swift', info)
|
|
||||||
self.assertIn('foo', info['swift'])
|
|
||||||
self.assertEqual(utils._swift_info['swift']['foo'], 'bar')
|
|
||||||
|
|
||||||
self.assertIn('cap1', info)
|
|
||||||
self.assertIn('cap1_foo', info['cap1'])
|
|
||||||
self.assertEqual(utils._swift_info['cap1']['cap1_foo'], 'cap1_bar')
|
|
||||||
|
|
||||||
def test_get_swift_admin_info_with_disallowed_sections(self):
|
|
||||||
utils._swift_info = {'swift': {'foo': 'bar'},
|
|
||||||
'cap1': {'cap1_foo': 'cap1_bar'},
|
|
||||||
'cap2': {'cap2_foo': 'cap2_bar'},
|
|
||||||
'cap3': {'cap3_foo': 'cap3_bar'}}
|
|
||||||
utils._swift_admin_info = {'admin_cap1': {'ac1_foo': 'ac1_bar'}}
|
|
||||||
|
|
||||||
info = utils.get_swift_info(
|
|
||||||
admin=True, disallowed_sections=['cap1', 'cap3'])
|
|
||||||
|
|
||||||
self.assertIn('admin', info)
|
|
||||||
self.assertIn('admin_cap1', info['admin'])
|
|
||||||
self.assertIn('ac1_foo', info['admin']['admin_cap1'])
|
|
||||||
self.assertEqual(info['admin']['admin_cap1']['ac1_foo'], 'ac1_bar')
|
|
||||||
self.assertIn('disallowed_sections', info['admin'])
|
|
||||||
self.assertIn('cap1', info['admin']['disallowed_sections'])
|
|
||||||
self.assertNotIn('cap2', info['admin']['disallowed_sections'])
|
|
||||||
self.assertIn('cap3', info['admin']['disallowed_sections'])
|
|
||||||
|
|
||||||
self.assertIn('swift', info)
|
|
||||||
self.assertIn('foo', info['swift'])
|
|
||||||
self.assertEqual(info['swift']['foo'], 'bar')
|
|
||||||
|
|
||||||
self.assertNotIn('cap1', info)
|
|
||||||
|
|
||||||
self.assertIn('cap2', info)
|
|
||||||
self.assertIn('cap2_foo', info['cap2'])
|
|
||||||
self.assertEqual(info['cap2']['cap2_foo'], 'cap2_bar')
|
|
||||||
|
|
||||||
self.assertNotIn('cap3', info)
|
|
||||||
|
|
||||||
def test_get_swift_admin_info_with_disallowed_sub_sections(self):
|
|
||||||
utils._swift_info = {'swift': {'foo': 'bar'},
|
|
||||||
'cap1': {'cap1_foo': 'cap1_bar',
|
|
||||||
'cap1_moo': 'cap1_baa'},
|
|
||||||
'cap2': {'cap2_foo': 'cap2_bar'},
|
|
||||||
'cap3': {'cap2_foo': 'cap2_bar'},
|
|
||||||
'cap4': {'a': {'b': {'c': 'c'},
|
|
||||||
'b.c': 'b.c'}}}
|
|
||||||
utils._swift_admin_info = {'admin_cap1': {'ac1_foo': 'ac1_bar'}}
|
|
||||||
|
|
||||||
info = utils.get_swift_info(
|
|
||||||
admin=True, disallowed_sections=['cap1.cap1_foo', 'cap3',
|
|
||||||
'cap4.a.b.c'])
|
|
||||||
self.assertNotIn('cap3', info)
|
|
||||||
self.assertEqual(info['cap1']['cap1_moo'], 'cap1_baa')
|
|
||||||
self.assertNotIn('cap1_foo', info['cap1'])
|
|
||||||
self.assertNotIn('c', info['cap4']['a']['b'])
|
|
||||||
self.assertEqual(info['cap4']['a']['b.c'], 'b.c')
|
|
||||||
|
|
||||||
def test_get_swift_info_with_unmatched_disallowed_sections(self):
|
|
||||||
cap1 = {'cap1_foo': 'cap1_bar',
|
|
||||||
'cap1_moo': 'cap1_baa'}
|
|
||||||
utils._swift_info = {'swift': {'foo': 'bar'},
|
|
||||||
'cap1': cap1}
|
|
||||||
# expect no exceptions
|
|
||||||
info = utils.get_swift_info(
|
|
||||||
disallowed_sections=['cap2.cap1_foo', 'cap1.no_match',
|
|
||||||
'cap1.cap1_foo.no_match.no_match'])
|
|
||||||
self.assertEqual(info['cap1'], cap1)
|
|
||||||
|
|
||||||
|
|
||||||
class TestFileLikeIter(unittest.TestCase):
|
class TestFileLikeIter(unittest.TestCase):
|
||||||
|
|
||||||
def test_iter_file_iter(self):
|
def test_iter_file_iter(self):
|
||||||
|
@ -20,15 +20,15 @@ from mock import Mock
|
|||||||
|
|
||||||
from swift.proxy.controllers import InfoController
|
from swift.proxy.controllers import InfoController
|
||||||
from swift.proxy.server import Application as ProxyApp
|
from swift.proxy.server import Application as ProxyApp
|
||||||
from swift.common import utils
|
from swift.common import utils, registry
|
||||||
from swift.common.swob import Request, HTTPException
|
from swift.common.swob import Request, HTTPException
|
||||||
|
|
||||||
|
|
||||||
class TestInfoController(unittest.TestCase):
|
class TestInfoController(unittest.TestCase):
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
utils._swift_info = {}
|
registry._swift_info = {}
|
||||||
utils._swift_admin_info = {}
|
registry._swift_admin_info = {}
|
||||||
|
|
||||||
def get_controller(self, expose_info=None, disallowed_sections=None,
|
def get_controller(self, expose_info=None, disallowed_sections=None,
|
||||||
admin_key=None):
|
admin_key=None):
|
||||||
@ -54,8 +54,8 @@ class TestInfoController(unittest.TestCase):
|
|||||||
|
|
||||||
def test_get_info(self):
|
def test_get_info(self):
|
||||||
controller = self.get_controller(expose_info=True)
|
controller = self.get_controller(expose_info=True)
|
||||||
utils._swift_info = {'foo': {'bar': 'baz'}}
|
registry._swift_info = {'foo': {'bar': 'baz'}}
|
||||||
utils._swift_admin_info = {'qux': {'quux': 'corge'}}
|
registry._swift_admin_info = {'qux': {'quux': 'corge'}}
|
||||||
|
|
||||||
req = Request.blank(
|
req = Request.blank(
|
||||||
'/info', environ={'REQUEST_METHOD': 'GET'})
|
'/info', environ={'REQUEST_METHOD': 'GET'})
|
||||||
@ -80,8 +80,8 @@ class TestInfoController(unittest.TestCase):
|
|||||||
|
|
||||||
def test_get_info_cors(self):
|
def test_get_info_cors(self):
|
||||||
controller = self.get_controller(expose_info=True)
|
controller = self.get_controller(expose_info=True)
|
||||||
utils._swift_info = {'foo': {'bar': 'baz'}}
|
registry._swift_info = {'foo': {'bar': 'baz'}}
|
||||||
utils._swift_admin_info = {'qux': {'quux': 'corge'}}
|
registry._swift_admin_info = {'qux': {'quux': 'corge'}}
|
||||||
|
|
||||||
req = Request.blank(
|
req = Request.blank(
|
||||||
'/info', environ={'REQUEST_METHOD': 'GET'},
|
'/info', environ={'REQUEST_METHOD': 'GET'},
|
||||||
@ -99,8 +99,8 @@ class TestInfoController(unittest.TestCase):
|
|||||||
|
|
||||||
def test_head_info(self):
|
def test_head_info(self):
|
||||||
controller = self.get_controller(expose_info=True)
|
controller = self.get_controller(expose_info=True)
|
||||||
utils._swift_info = {'foo': {'bar': 'baz'}}
|
registry._swift_info = {'foo': {'bar': 'baz'}}
|
||||||
utils._swift_admin_info = {'qux': {'quux': 'corge'}}
|
registry._swift_admin_info = {'qux': {'quux': 'corge'}}
|
||||||
|
|
||||||
req = Request.blank(
|
req = Request.blank(
|
||||||
'/info', environ={'REQUEST_METHOD': 'HEAD'})
|
'/info', environ={'REQUEST_METHOD': 'HEAD'})
|
||||||
@ -111,9 +111,9 @@ class TestInfoController(unittest.TestCase):
|
|||||||
def test_disallow_info(self):
|
def test_disallow_info(self):
|
||||||
controller = self.get_controller(expose_info=True,
|
controller = self.get_controller(expose_info=True,
|
||||||
disallowed_sections=['foo2'])
|
disallowed_sections=['foo2'])
|
||||||
utils._swift_info = {'foo': {'bar': 'baz'},
|
registry._swift_info = {'foo': {'bar': 'baz'},
|
||||||
'foo2': {'bar2': 'baz2'}}
|
'foo2': {'bar2': 'baz2'}}
|
||||||
utils._swift_admin_info = {'qux': {'quux': 'corge'}}
|
registry._swift_admin_info = {'qux': {'quux': 'corge'}}
|
||||||
|
|
||||||
req = Request.blank(
|
req = Request.blank(
|
||||||
'/info', environ={'REQUEST_METHOD': 'GET'})
|
'/info', environ={'REQUEST_METHOD': 'GET'})
|
||||||
@ -128,8 +128,8 @@ class TestInfoController(unittest.TestCase):
|
|||||||
|
|
||||||
def test_disabled_admin_info(self):
|
def test_disabled_admin_info(self):
|
||||||
controller = self.get_controller(expose_info=True, admin_key='')
|
controller = self.get_controller(expose_info=True, admin_key='')
|
||||||
utils._swift_info = {'foo': {'bar': 'baz'}}
|
registry._swift_info = {'foo': {'bar': 'baz'}}
|
||||||
utils._swift_admin_info = {'qux': {'quux': 'corge'}}
|
registry._swift_admin_info = {'qux': {'quux': 'corge'}}
|
||||||
|
|
||||||
expires = int(time.time() + 86400)
|
expires = int(time.time() + 86400)
|
||||||
sig = utils.get_hmac('GET', '/info', expires, '')
|
sig = utils.get_hmac('GET', '/info', expires, '')
|
||||||
@ -144,8 +144,8 @@ class TestInfoController(unittest.TestCase):
|
|||||||
def test_get_admin_info(self):
|
def test_get_admin_info(self):
|
||||||
controller = self.get_controller(expose_info=True,
|
controller = self.get_controller(expose_info=True,
|
||||||
admin_key='secret-admin-key')
|
admin_key='secret-admin-key')
|
||||||
utils._swift_info = {'foo': {'bar': 'baz'}}
|
registry._swift_info = {'foo': {'bar': 'baz'}}
|
||||||
utils._swift_admin_info = {'qux': {'quux': 'corge'}}
|
registry._swift_admin_info = {'qux': {'quux': 'corge'}}
|
||||||
|
|
||||||
expires = int(time.time() + 86400)
|
expires = int(time.time() + 86400)
|
||||||
sig = utils.get_hmac('GET', '/info', expires, 'secret-admin-key')
|
sig = utils.get_hmac('GET', '/info', expires, 'secret-admin-key')
|
||||||
@ -165,8 +165,8 @@ class TestInfoController(unittest.TestCase):
|
|||||||
def test_head_admin_info(self):
|
def test_head_admin_info(self):
|
||||||
controller = self.get_controller(expose_info=True,
|
controller = self.get_controller(expose_info=True,
|
||||||
admin_key='secret-admin-key')
|
admin_key='secret-admin-key')
|
||||||
utils._swift_info = {'foo': {'bar': 'baz'}}
|
registry._swift_info = {'foo': {'bar': 'baz'}}
|
||||||
utils._swift_admin_info = {'qux': {'quux': 'corge'}}
|
registry._swift_admin_info = {'qux': {'quux': 'corge'}}
|
||||||
|
|
||||||
expires = int(time.time() + 86400)
|
expires = int(time.time() + 86400)
|
||||||
sig = utils.get_hmac('GET', '/info', expires, 'secret-admin-key')
|
sig = utils.get_hmac('GET', '/info', expires, 'secret-admin-key')
|
||||||
@ -191,8 +191,8 @@ class TestInfoController(unittest.TestCase):
|
|||||||
def test_get_admin_info_invalid_method(self):
|
def test_get_admin_info_invalid_method(self):
|
||||||
controller = self.get_controller(expose_info=True,
|
controller = self.get_controller(expose_info=True,
|
||||||
admin_key='secret-admin-key')
|
admin_key='secret-admin-key')
|
||||||
utils._swift_info = {'foo': {'bar': 'baz'}}
|
registry._swift_info = {'foo': {'bar': 'baz'}}
|
||||||
utils._swift_admin_info = {'qux': {'quux': 'corge'}}
|
registry._swift_admin_info = {'qux': {'quux': 'corge'}}
|
||||||
|
|
||||||
expires = int(time.time() + 86400)
|
expires = int(time.time() + 86400)
|
||||||
sig = utils.get_hmac('HEAD', '/info', expires, 'secret-admin-key')
|
sig = utils.get_hmac('HEAD', '/info', expires, 'secret-admin-key')
|
||||||
@ -207,8 +207,8 @@ class TestInfoController(unittest.TestCase):
|
|||||||
def test_get_admin_info_invalid_expires(self):
|
def test_get_admin_info_invalid_expires(self):
|
||||||
controller = self.get_controller(expose_info=True,
|
controller = self.get_controller(expose_info=True,
|
||||||
admin_key='secret-admin-key')
|
admin_key='secret-admin-key')
|
||||||
utils._swift_info = {'foo': {'bar': 'baz'}}
|
registry._swift_info = {'foo': {'bar': 'baz'}}
|
||||||
utils._swift_admin_info = {'qux': {'quux': 'corge'}}
|
registry._swift_admin_info = {'qux': {'quux': 'corge'}}
|
||||||
|
|
||||||
expires = 1
|
expires = 1
|
||||||
sig = utils.get_hmac('GET', '/info', expires, 'secret-admin-key')
|
sig = utils.get_hmac('GET', '/info', expires, 'secret-admin-key')
|
||||||
@ -233,8 +233,8 @@ class TestInfoController(unittest.TestCase):
|
|||||||
def test_get_admin_info_invalid_path(self):
|
def test_get_admin_info_invalid_path(self):
|
||||||
controller = self.get_controller(expose_info=True,
|
controller = self.get_controller(expose_info=True,
|
||||||
admin_key='secret-admin-key')
|
admin_key='secret-admin-key')
|
||||||
utils._swift_info = {'foo': {'bar': 'baz'}}
|
registry._swift_info = {'foo': {'bar': 'baz'}}
|
||||||
utils._swift_admin_info = {'qux': {'quux': 'corge'}}
|
registry._swift_admin_info = {'qux': {'quux': 'corge'}}
|
||||||
|
|
||||||
expires = int(time.time() + 86400)
|
expires = int(time.time() + 86400)
|
||||||
sig = utils.get_hmac('GET', '/foo', expires, 'secret-admin-key')
|
sig = utils.get_hmac('GET', '/foo', expires, 'secret-admin-key')
|
||||||
@ -249,8 +249,8 @@ class TestInfoController(unittest.TestCase):
|
|||||||
def test_get_admin_info_invalid_key(self):
|
def test_get_admin_info_invalid_key(self):
|
||||||
controller = self.get_controller(expose_info=True,
|
controller = self.get_controller(expose_info=True,
|
||||||
admin_key='secret-admin-key')
|
admin_key='secret-admin-key')
|
||||||
utils._swift_info = {'foo': {'bar': 'baz'}}
|
registry._swift_info = {'foo': {'bar': 'baz'}}
|
||||||
utils._swift_admin_info = {'qux': {'quux': 'corge'}}
|
registry._swift_admin_info = {'qux': {'quux': 'corge'}}
|
||||||
|
|
||||||
expires = int(time.time() + 86400)
|
expires = int(time.time() + 86400)
|
||||||
sig = utils.get_hmac('GET', '/foo', expires, 'invalid-admin-key')
|
sig = utils.get_hmac('GET', '/foo', expires, 'invalid-admin-key')
|
||||||
@ -266,9 +266,9 @@ class TestInfoController(unittest.TestCase):
|
|||||||
controller = self.get_controller(expose_info=True,
|
controller = self.get_controller(expose_info=True,
|
||||||
disallowed_sections=['foo2'],
|
disallowed_sections=['foo2'],
|
||||||
admin_key='secret-admin-key')
|
admin_key='secret-admin-key')
|
||||||
utils._swift_info = {'foo': {'bar': 'baz'},
|
registry._swift_info = {'foo': {'bar': 'baz'},
|
||||||
'foo2': {'bar2': 'baz2'}}
|
'foo2': {'bar2': 'baz2'}}
|
||||||
utils._swift_admin_info = {'qux': {'quux': 'corge'}}
|
registry._swift_admin_info = {'qux': {'quux': 'corge'}}
|
||||||
|
|
||||||
expires = int(time.time() + 86400)
|
expires = int(time.time() + 86400)
|
||||||
sig = utils.get_hmac('GET', '/info', expires, 'secret-admin-key')
|
sig = utils.get_hmac('GET', '/info', expires, 'secret-admin-key')
|
||||||
|
@ -67,7 +67,7 @@ from swift.common.middleware import proxy_logging, versioned_writes, \
|
|||||||
from swift.common.middleware.acl import parse_acl, format_acl
|
from swift.common.middleware.acl import parse_acl, format_acl
|
||||||
from swift.common.exceptions import ChunkReadTimeout, DiskFileNotExist, \
|
from swift.common.exceptions import ChunkReadTimeout, DiskFileNotExist, \
|
||||||
APIVersionError, ChunkReadError
|
APIVersionError, ChunkReadError
|
||||||
from swift.common import utils, constraints
|
from swift.common import utils, constraints, registry
|
||||||
from swift.common.utils import hash_path, storage_directory, \
|
from swift.common.utils import hash_path, storage_directory, \
|
||||||
parse_content_type, parse_mime_headers, \
|
parse_content_type, parse_mime_headers, \
|
||||||
iter_multipart_mime_documents, public, mkdirs, NullLogger, md5
|
iter_multipart_mime_documents, public, mkdirs, NullLogger, md5
|
||||||
@ -11274,8 +11274,8 @@ class TestProxyObjectPerformance(unittest.TestCase):
|
|||||||
StoragePolicy(3, 'bert', object_ring=FakeRing())])
|
StoragePolicy(3, 'bert', object_ring=FakeRing())])
|
||||||
class TestSwiftInfo(unittest.TestCase):
|
class TestSwiftInfo(unittest.TestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
utils._swift_info = {}
|
registry._swift_info = {}
|
||||||
utils._swift_admin_info = {}
|
registry._swift_admin_info = {}
|
||||||
|
|
||||||
def test_registered_defaults(self):
|
def test_registered_defaults(self):
|
||||||
app = proxy_server.Application({},
|
app = proxy_server.Application({},
|
||||||
@ -11312,7 +11312,7 @@ class TestSwiftInfo(unittest.TestCase):
|
|||||||
# other items are added to swift info
|
# other items are added to swift info
|
||||||
self.assertEqual(len(si), 17)
|
self.assertEqual(len(si), 17)
|
||||||
|
|
||||||
si = utils.get_swift_info()['swift']
|
si = registry.get_swift_info()['swift']
|
||||||
# Tehse settings is by default excluded by disallowed_sections
|
# Tehse settings is by default excluded by disallowed_sections
|
||||||
self.assertEqual(si['valid_api_versions'],
|
self.assertEqual(si['valid_api_versions'],
|
||||||
constraints.VALID_API_VERSIONS)
|
constraints.VALID_API_VERSIONS)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user