Merged from trunk
This commit is contained in:
parent
17cb73dadb
commit
81c6ca0b2c
@ -56,15 +56,21 @@ class FakeMemcache(object):
|
||||
|
||||
class FakeApp(object):
|
||||
|
||||
def __init__(self, status_headers_body_iter=None):
|
||||
def __init__(self, status_headers_body_iter=None, acl=None, sync_key=None):
|
||||
self.calls = 0
|
||||
self.status_headers_body_iter = status_headers_body_iter
|
||||
if not self.status_headers_body_iter:
|
||||
self.status_headers_body_iter = iter([('404 Not Found', {}, '')])
|
||||
self.acl = acl
|
||||
self.sync_key = sync_key
|
||||
|
||||
def __call__(self, env, start_response):
|
||||
self.calls += 1
|
||||
self.request = Request.blank('', environ=env)
|
||||
if self.acl:
|
||||
self.request.acl = self.acl
|
||||
if self.sync_key:
|
||||
self.request.environ['swift_sync_key'] = self.sync_key
|
||||
if 'swift.authorize' in env:
|
||||
resp = env['swift.authorize'](self.request)
|
||||
if resp:
|
||||
@ -3216,6 +3222,173 @@ class TestAuth(unittest.TestCase):
|
||||
resp = self.test_auth.authorize(req)
|
||||
self.assertEquals(resp.status_int, 403)
|
||||
|
||||
def test_allowed_sync_hosts(self):
|
||||
a = auth.filter_factory({'super_admin_key': 'supertest'})(FakeApp())
|
||||
self.assertEquals(a.allowed_sync_hosts, ['127.0.0.1'])
|
||||
a = auth.filter_factory({'super_admin_key': 'supertest',
|
||||
'allowed_sync_hosts':
|
||||
'1.1.1.1,2.1.1.1, 3.1.1.1 , 4.1.1.1,, , 5.1.1.1'})(FakeApp())
|
||||
self.assertEquals(a.allowed_sync_hosts,
|
||||
['1.1.1.1', '2.1.1.1', '3.1.1.1', '4.1.1.1', '5.1.1.1'])
|
||||
|
||||
def test_reseller_admin_is_owner(self):
|
||||
orig_authorize = self.test_auth.authorize
|
||||
owner_values = []
|
||||
|
||||
def mitm_authorize(req):
|
||||
rv = orig_authorize(req)
|
||||
owner_values.append(req.environ.get('swift_owner', False))
|
||||
return rv
|
||||
|
||||
self.test_auth.authorize = mitm_authorize
|
||||
|
||||
self.test_auth.app = FakeApp(iter([
|
||||
('200 Ok', {},
|
||||
json.dumps({'account': 'other', 'user': 'other:usr',
|
||||
'account_id': 'AUTH_other',
|
||||
'groups': [{'name': 'other:usr'}, {'name': 'other'},
|
||||
{'name': '.reseller_admin'}],
|
||||
'expires': time() + 60})),
|
||||
('204 No Content', {}, '')]))
|
||||
req = Request.blank('/v1/AUTH_cfa', headers={'X-Auth-Token': 'AUTH_t'})
|
||||
resp = req.get_response(self.test_auth)
|
||||
self.assertEquals(resp.status_int, 204)
|
||||
self.assertEquals(owner_values, [True])
|
||||
|
||||
def test_admin_is_owner(self):
|
||||
orig_authorize = self.test_auth.authorize
|
||||
owner_values = []
|
||||
|
||||
def mitm_authorize(req):
|
||||
rv = orig_authorize(req)
|
||||
owner_values.append(req.environ.get('swift_owner', False))
|
||||
return rv
|
||||
|
||||
self.test_auth.authorize = mitm_authorize
|
||||
|
||||
self.test_auth.app = FakeApp(iter([
|
||||
('200 Ok', {},
|
||||
json.dumps({'account': 'act', 'user': 'act:usr',
|
||||
'account_id': 'AUTH_cfa',
|
||||
'groups': [{'name': 'act:usr'}, {'name': 'act'},
|
||||
{'name': '.admin'}],
|
||||
'expires': time() + 60})),
|
||||
('204 No Content', {}, '')]))
|
||||
req = Request.blank('/v1/AUTH_cfa', headers={'X-Auth-Token': 'AUTH_t'})
|
||||
resp = req.get_response(self.test_auth)
|
||||
self.assertEquals(resp.status_int, 204)
|
||||
self.assertEquals(owner_values, [True])
|
||||
|
||||
def test_regular_is_not_owner(self):
|
||||
orig_authorize = self.test_auth.authorize
|
||||
owner_values = []
|
||||
|
||||
def mitm_authorize(req):
|
||||
rv = orig_authorize(req)
|
||||
owner_values.append(req.environ.get('swift_owner', False))
|
||||
return rv
|
||||
|
||||
self.test_auth.authorize = mitm_authorize
|
||||
|
||||
self.test_auth.app = FakeApp(iter([
|
||||
('200 Ok', {},
|
||||
json.dumps({'account': 'act', 'user': 'act:usr',
|
||||
'account_id': 'AUTH_cfa',
|
||||
'groups': [{'name': 'act:usr'}, {'name': 'act'}],
|
||||
'expires': time() + 60})),
|
||||
('204 No Content', {}, '')]), acl='act:usr')
|
||||
req = Request.blank('/v1/AUTH_cfa/c',
|
||||
headers={'X-Auth-Token': 'AUTH_t'})
|
||||
resp = req.get_response(self.test_auth)
|
||||
self.assertEquals(resp.status_int, 204)
|
||||
self.assertEquals(owner_values, [False])
|
||||
|
||||
def test_sync_request_success(self):
|
||||
self.test_auth.app = FakeApp(iter([('204 No Content', {}, '')]),
|
||||
sync_key='secret')
|
||||
req = Request.blank('/v1/AUTH_cfa/c/o',
|
||||
environ={'REQUEST_METHOD': 'DELETE'},
|
||||
headers={'x-container-sync-key': 'secret',
|
||||
'x-timestamp': '123.456'})
|
||||
req.remote_addr = '127.0.0.1'
|
||||
resp = req.get_response(self.test_auth)
|
||||
self.assertEquals(resp.status_int, 204)
|
||||
|
||||
def test_sync_request_fail_key(self):
|
||||
self.test_auth.app = FakeApp(iter([('204 No Content', {}, '')]),
|
||||
sync_key='secret')
|
||||
req = Request.blank('/v1/AUTH_cfa/c/o',
|
||||
environ={'REQUEST_METHOD': 'DELETE'},
|
||||
headers={'x-container-sync-key': 'wrongsecret',
|
||||
'x-timestamp': '123.456'})
|
||||
req.remote_addr = '127.0.0.1'
|
||||
resp = req.get_response(self.test_auth)
|
||||
self.assertEquals(resp.status_int, 401)
|
||||
|
||||
self.test_auth.app = FakeApp(iter([('204 No Content', {}, '')]),
|
||||
sync_key='othersecret')
|
||||
req = Request.blank('/v1/AUTH_cfa/c/o',
|
||||
environ={'REQUEST_METHOD': 'DELETE'},
|
||||
headers={'x-container-sync-key': 'secret',
|
||||
'x-timestamp': '123.456'})
|
||||
req.remote_addr = '127.0.0.1'
|
||||
resp = req.get_response(self.test_auth)
|
||||
self.assertEquals(resp.status_int, 401)
|
||||
|
||||
self.test_auth.app = FakeApp(iter([('204 No Content', {}, '')]),
|
||||
sync_key=None)
|
||||
req = Request.blank('/v1/AUTH_cfa/c/o',
|
||||
environ={'REQUEST_METHOD': 'DELETE'},
|
||||
headers={'x-container-sync-key': 'secret',
|
||||
'x-timestamp': '123.456'})
|
||||
req.remote_addr = '127.0.0.1'
|
||||
resp = req.get_response(self.test_auth)
|
||||
self.assertEquals(resp.status_int, 401)
|
||||
|
||||
def test_sync_request_fail_no_timestamp(self):
|
||||
self.test_auth.app = FakeApp(iter([('204 No Content', {}, '')]),
|
||||
sync_key='secret')
|
||||
req = Request.blank('/v1/AUTH_cfa/c/o',
|
||||
environ={'REQUEST_METHOD': 'DELETE'},
|
||||
headers={'x-container-sync-key': 'secret'})
|
||||
req.remote_addr = '127.0.0.1'
|
||||
resp = req.get_response(self.test_auth)
|
||||
self.assertEquals(resp.status_int, 401)
|
||||
|
||||
def test_sync_request_fail_sync_host(self):
|
||||
self.test_auth.app = FakeApp(iter([('204 No Content', {}, '')]),
|
||||
sync_key='secret')
|
||||
req = Request.blank('/v1/AUTH_cfa/c/o',
|
||||
environ={'REQUEST_METHOD': 'DELETE'},
|
||||
headers={'x-container-sync-key': 'secret',
|
||||
'x-timestamp': '123.456'})
|
||||
req.remote_addr = '127.0.0.2'
|
||||
resp = req.get_response(self.test_auth)
|
||||
self.assertEquals(resp.status_int, 401)
|
||||
|
||||
def test_sync_request_success_lb_sync_host(self):
|
||||
self.test_auth.app = FakeApp(iter([('204 No Content', {}, '')]),
|
||||
sync_key='secret')
|
||||
req = Request.blank('/v1/AUTH_cfa/c/o',
|
||||
environ={'REQUEST_METHOD': 'DELETE'},
|
||||
headers={'x-container-sync-key': 'secret',
|
||||
'x-timestamp': '123.456',
|
||||
'x-forwarded-for': '127.0.0.1'})
|
||||
req.remote_addr = '127.0.0.2'
|
||||
resp = req.get_response(self.test_auth)
|
||||
self.assertEquals(resp.status_int, 204)
|
||||
|
||||
self.test_auth.app = FakeApp(iter([('204 No Content', {}, '')]),
|
||||
sync_key='secret')
|
||||
req = Request.blank('/v1/AUTH_cfa/c/o',
|
||||
environ={'REQUEST_METHOD': 'DELETE'},
|
||||
headers={'x-container-sync-key': 'secret',
|
||||
'x-timestamp': '123.456',
|
||||
'x-cluster-client-ip': '127.0.0.1'})
|
||||
req.remote_addr = '127.0.0.2'
|
||||
resp = req.get_response(self.test_auth)
|
||||
self.assertEquals(resp.status_int, 204)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
@ -893,6 +893,23 @@ class TestContainerBroker(unittest.TestCase):
|
||||
self.assertEquals(info['object_count'], 0)
|
||||
self.assertEquals(info['bytes_used'], 0)
|
||||
|
||||
info = broker.get_info()
|
||||
self.assertEquals(info['x_container_sync_point1'], -1)
|
||||
self.assertEquals(info['x_container_sync_point2'], -1)
|
||||
|
||||
def test_set_x_syncs(self):
|
||||
broker = ContainerBroker(':memory:', account='test1', container='test2')
|
||||
broker.initialize(normalize_timestamp('1'))
|
||||
|
||||
info = broker.get_info()
|
||||
self.assertEquals(info['x_container_sync_point1'], -1)
|
||||
self.assertEquals(info['x_container_sync_point2'], -1)
|
||||
|
||||
broker.set_x_container_sync_points(1, 2)
|
||||
info = broker.get_info()
|
||||
self.assertEquals(info['x_container_sync_point1'], 1)
|
||||
self.assertEquals(info['x_container_sync_point2'], 2)
|
||||
|
||||
def test_get_report_info(self):
|
||||
broker = ContainerBroker(':memory:', account='test1', container='test2')
|
||||
broker.initialize(normalize_timestamp('1'))
|
||||
@ -1352,6 +1369,81 @@ class TestContainerBrokerBeforeMetadata(TestContainerBroker):
|
||||
conn.execute('SELECT metadata FROM container_stat')
|
||||
|
||||
|
||||
def prexsync_create_container_stat_table(self, conn, put_timestamp=None):
|
||||
"""
|
||||
Copied from swift.common.db.ContainerBroker before the
|
||||
x_container_sync_point[12] columns were added; used for testing with
|
||||
TestContainerBrokerBeforeXSync.
|
||||
|
||||
Create the container_stat table which is specifc to the container DB.
|
||||
|
||||
:param conn: DB connection object
|
||||
:param put_timestamp: put timestamp
|
||||
"""
|
||||
if put_timestamp is None:
|
||||
put_timestamp = normalize_timestamp(0)
|
||||
conn.executescript("""
|
||||
CREATE TABLE container_stat (
|
||||
account TEXT,
|
||||
container TEXT,
|
||||
created_at TEXT,
|
||||
put_timestamp TEXT DEFAULT '0',
|
||||
delete_timestamp TEXT DEFAULT '0',
|
||||
object_count INTEGER,
|
||||
bytes_used INTEGER,
|
||||
reported_put_timestamp TEXT DEFAULT '0',
|
||||
reported_delete_timestamp TEXT DEFAULT '0',
|
||||
reported_object_count INTEGER DEFAULT 0,
|
||||
reported_bytes_used INTEGER DEFAULT 0,
|
||||
hash TEXT default '00000000000000000000000000000000',
|
||||
id TEXT,
|
||||
status TEXT DEFAULT '',
|
||||
status_changed_at TEXT DEFAULT '0',
|
||||
metadata TEXT DEFAULT ''
|
||||
);
|
||||
|
||||
INSERT INTO container_stat (object_count, bytes_used)
|
||||
VALUES (0, 0);
|
||||
""")
|
||||
conn.execute('''
|
||||
UPDATE container_stat
|
||||
SET account = ?, container = ?, created_at = ?, id = ?,
|
||||
put_timestamp = ?
|
||||
''', (self.account, self.container, normalize_timestamp(time()),
|
||||
str(uuid4()), put_timestamp))
|
||||
|
||||
|
||||
class TestContainerBrokerBeforeXSync(TestContainerBroker):
|
||||
"""
|
||||
Tests for swift.common.db.ContainerBroker against databases created before
|
||||
the x_container_sync_point[12] columns were added.
|
||||
"""
|
||||
|
||||
def setUp(self):
|
||||
self._imported_create_container_stat_table = \
|
||||
ContainerBroker.create_container_stat_table
|
||||
ContainerBroker.create_container_stat_table = \
|
||||
prexsync_create_container_stat_table
|
||||
broker = ContainerBroker(':memory:', account='a', container='c')
|
||||
broker.initialize(normalize_timestamp('1'))
|
||||
exc = None
|
||||
with broker.get() as conn:
|
||||
try:
|
||||
conn.execute('''SELECT x_container_sync_point1
|
||||
FROM container_stat''')
|
||||
except BaseException, err:
|
||||
exc = err
|
||||
self.assert_('no such column: x_container_sync_point1' in str(exc))
|
||||
|
||||
def tearDown(self):
|
||||
ContainerBroker.create_container_stat_table = \
|
||||
self._imported_create_container_stat_table
|
||||
broker = ContainerBroker(':memory:', account='a', container='c')
|
||||
broker.initialize(normalize_timestamp('1'))
|
||||
with broker.get() as conn:
|
||||
conn.execute('SELECT x_container_sync_point1 FROM container_stat')
|
||||
|
||||
|
||||
class TestAccountBroker(unittest.TestCase):
|
||||
""" Tests for swift.common.db.AccountBroker """
|
||||
|
||||
|
@ -768,6 +768,26 @@ log_name = yarr'''
|
||||
self.assertEquals(utils.human_readable(1237940039285380274899124224),
|
||||
'1024Yi')
|
||||
|
||||
def test_validate_sync_to(self):
|
||||
for goodurl in ('http://1.1.1.1/v1/a/c/o',
|
||||
'http://1.1.1.1:8080/a/c/o',
|
||||
'http://2.2.2.2/a/c/o',
|
||||
'https://1.1.1.1/v1/a/c/o'):
|
||||
self.assertEquals(utils.validate_sync_to(goodurl,
|
||||
['1.1.1.1', '2.2.2.2']),
|
||||
None)
|
||||
for badurl in ('http://1.1.1.1',
|
||||
'httpq://1.1.1.1/v1/a/c/o',
|
||||
'http://1.1.1.1/v1/a/c/o?query',
|
||||
'http://1.1.1.1/v1/a/c/o#frag',
|
||||
'http://1.1.1.1/v1/a/c/o?query#frag',
|
||||
'http://1.1.1.1/v1/a/c/o?query=param',
|
||||
'http://1.1.1.1/v1/a/c/o?query=param#frag',
|
||||
'http://1.1.1.2/v1/a/c/o'):
|
||||
self.assertNotEquals(utils.validate_sync_to(badurl,
|
||||
['1.1.1.1', '2.2.2.2']),
|
||||
None)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
Loading…
x
Reference in New Issue
Block a user