
Add the ability to use tox for unit tests, since it helps us solve the problem of supporting multiple branches that require different versions of dependencies, and allows us to possibly support multiple versions of python in the future. Also fix the code to work with pre-grizzly environments, by not requiring the constraints backport. Also fixed the xattr support to work with both pyxattr and xattr modules. And fixed the ring tests to also work without a live /etc/swift directory. BUG: 948657 (https://bugzilla.redhat.com/show_bug.cgi?id=948657) Change-Id: I2be79c8ef8916bb6552ef957094f9186a963a068 Signed-off-by: Peter Portante <peter.portante@redhat.com> Reviewed-on: http://review.gluster.org/4781 Reviewed-by: Alex Wheeler <wheelear@gmail.com> Tested-by: Alex Wheeler <wheelear@gmail.com> Reviewed-by: Anand Avati <avati@redhat.com>
95 lines
3.4 KiB
Python
95 lines
3.4 KiB
Python
# Copyright (c) 2012 Red Hat, Inc.
|
|
#
|
|
# 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.
|
|
|
|
try:
|
|
from webob.exc import HTTPBadRequest
|
|
except ImportError:
|
|
from swift.common.swob import HTTPBadRequest
|
|
import swift.common.constraints
|
|
import swift.common.ring as _ring
|
|
from gluster.swift.common import Glusterfs, ring
|
|
|
|
if hasattr(swift.common.constraints, 'constraints_conf_int'):
|
|
MAX_OBJECT_NAME_COMPONENT_LENGTH = \
|
|
swift.common.constraints.constraints_conf_int(
|
|
'max_object_name_component_length', 255)
|
|
else:
|
|
MAX_OBJECT_NAME_COMPONENT_LENGTH = 255
|
|
|
|
def validate_obj_name_component(obj):
|
|
if len(obj) > MAX_OBJECT_NAME_COMPONENT_LENGTH:
|
|
return 'too long (%d)' % len(obj)
|
|
if obj == '.' or obj == '..':
|
|
return 'cannot be . or ..'
|
|
return ''
|
|
|
|
# Save the original check object creation
|
|
__check_object_creation = swift.common.constraints.check_object_creation
|
|
|
|
# Define our new one which invokes the original
|
|
def gluster_check_object_creation(req, object_name):
|
|
"""
|
|
Check to ensure that everything is alright about an object to be created.
|
|
Monkey patches swift.common.constraints.check_object_creation, invoking
|
|
the original, and then adding an additional check for individual object
|
|
name components.
|
|
|
|
:param req: HTTP request object
|
|
:param object_name: name of object to be created
|
|
:raises HTTPRequestEntityTooLarge: the object is too large
|
|
:raises HTTPLengthRequered: missing content-length header and not
|
|
a chunked request
|
|
:raises HTTPBadRequest: missing or bad content-type header, or
|
|
bad metadata
|
|
"""
|
|
ret = __check_object_creation(req, object_name)
|
|
|
|
if ret is None:
|
|
for obj in object_name.split('/'):
|
|
reason = validate_obj_name_component(obj)
|
|
if reason:
|
|
bdy = 'Invalid object name "%s", component "%s" %s' \
|
|
% (object_name, obj, reason)
|
|
ret = HTTPBadRequest(body=bdy,
|
|
request=req,
|
|
content_type='text/plain')
|
|
|
|
return ret
|
|
|
|
# Replace the original check object creation with ours
|
|
swift.common.constraints.check_object_creation = gluster_check_object_creation
|
|
|
|
# Save the original check mount
|
|
__check_mount = swift.common.constraints.check_mount
|
|
|
|
# Define our new one which invokes the original
|
|
def gluster_check_mount(root, drive):
|
|
# FIXME: Potential performance optimization here to not call the original
|
|
# check mount which makes two stat calls. We could do what they do with
|
|
# just one.
|
|
if __check_mount(root, drive):
|
|
return True
|
|
|
|
return Glusterfs.mount(root, drive)
|
|
|
|
# Replace the original check mount with ours
|
|
swift.common.constraints.check_mount = gluster_check_mount
|
|
|
|
# Save the original Ring class
|
|
__Ring = _ring.Ring
|
|
|
|
# Replace the original Ring class
|
|
_ring.Ring = ring.Ring
|