Allow programmatic reloading of Swift hash path config
New util's function validate_hash_conf allows you to programmatically reload swift.conf and hash path global vars HASH_PATH_SUFFIX and HASH_PATH_PREFIX when they are invalid. When you load swift.common.utils before you have a swift.conf there's no good way to force a re-read of swift.conf and repopulate the hash path config options - short of restarting the process or reloading the module - both of which are hard to unittest. This should be no worse in general and in some cases easier. Change-Id: I1ff22c5647f127f65589762b3026f82c9f9401c1
This commit is contained in:
parent
cb59895b7c
commit
bad52f1121
@ -85,20 +85,44 @@ FALLOCATE_RESERVE = 0
|
||||
# Used by hash_path to offer a bit more security when generating hashes for
|
||||
# paths. It simply appends this value to all paths; guessing the hash a path
|
||||
# will end up with would also require knowing this suffix.
|
||||
hash_conf = ConfigParser()
|
||||
HASH_PATH_SUFFIX = ''
|
||||
HASH_PATH_PREFIX = ''
|
||||
if hash_conf.read('/etc/swift/swift.conf'):
|
||||
try:
|
||||
HASH_PATH_SUFFIX = hash_conf.get('swift-hash',
|
||||
'swift_hash_path_suffix')
|
||||
except (NoSectionError, NoOptionError):
|
||||
pass
|
||||
try:
|
||||
HASH_PATH_PREFIX = hash_conf.get('swift-hash',
|
||||
'swift_hash_path_prefix')
|
||||
except (NoSectionError, NoOptionError):
|
||||
pass
|
||||
|
||||
SWIFT_CONF_FILE = '/etc/swift/swift.conf'
|
||||
|
||||
|
||||
class InvalidHashPathConfigError(ValueError):
|
||||
|
||||
def __str__(self):
|
||||
return "[swift-hash]: both swift_hash_path_suffix and " \
|
||||
"swift_hash_path_prefix are missing from %s" % SWIFT_CONF_FILE
|
||||
|
||||
|
||||
def validate_hash_conf():
|
||||
global HASH_PATH_SUFFIX
|
||||
global HASH_PATH_PREFIX
|
||||
if not HASH_PATH_SUFFIX and not HASH_PATH_PREFIX:
|
||||
hash_conf = ConfigParser()
|
||||
if hash_conf.read(SWIFT_CONF_FILE):
|
||||
try:
|
||||
HASH_PATH_SUFFIX = hash_conf.get('swift-hash',
|
||||
'swift_hash_path_suffix')
|
||||
except (NoSectionError, NoOptionError):
|
||||
pass
|
||||
try:
|
||||
HASH_PATH_PREFIX = hash_conf.get('swift-hash',
|
||||
'swift_hash_path_prefix')
|
||||
except (NoSectionError, NoOptionError):
|
||||
pass
|
||||
if not HASH_PATH_SUFFIX and not HASH_PATH_PREFIX:
|
||||
raise InvalidHashPathConfigError()
|
||||
|
||||
|
||||
try:
|
||||
validate_hash_conf()
|
||||
except InvalidHashPathConfigError:
|
||||
# could get monkey patched or lazy loaded
|
||||
pass
|
||||
|
||||
|
||||
def get_hmac(request_method, path, expires, key):
|
||||
@ -239,10 +263,10 @@ def noop_libc_function(*args):
|
||||
|
||||
|
||||
def validate_configuration():
|
||||
if not HASH_PATH_SUFFIX and not HASH_PATH_PREFIX:
|
||||
sys.exit("Error: [swift-hash]: both swift_hash_path_suffix "
|
||||
"and swift_hash_path_prefix are missing "
|
||||
"from /etc/swift/swift.conf")
|
||||
try:
|
||||
validate_hash_conf()
|
||||
except InvalidHashPathConfigError as e:
|
||||
sys.exit("Error: %s" % e)
|
||||
|
||||
|
||||
def load_libc_function(func_name, log_error=True):
|
||||
|
@ -150,13 +150,16 @@ class TestRing(unittest.TestCase):
|
||||
# test invalid endcap
|
||||
_orig_hash_path_suffix = utils.HASH_PATH_SUFFIX
|
||||
_orig_hash_path_prefix = utils.HASH_PATH_PREFIX
|
||||
_orig_swift_conf_file = utils.SWIFT_CONF_FILE
|
||||
try:
|
||||
utils.HASH_PATH_SUFFIX = ''
|
||||
utils.HASH_PATH_PREFIX = ''
|
||||
utils.SWIFT_CONF_FILE = ''
|
||||
self.assertRaises(SystemExit, ring.Ring, self.testdir, 'whatever')
|
||||
finally:
|
||||
utils.HASH_PATH_SUFFIX = _orig_hash_path_suffix
|
||||
utils.HASH_PATH_PREFIX = _orig_hash_path_prefix
|
||||
utils.SWIFT_CONF_FILE = _orig_swift_conf_file
|
||||
|
||||
def test_has_changed(self):
|
||||
self.assertEquals(self.ring.has_changed(), False)
|
||||
|
Loading…
x
Reference in New Issue
Block a user