import json
import logging
import time
-import datetime
import sys
import errno
from io import StringIO
-from queue import Queue
import boto.exception
import boto.s3.connection
usage_acc_validate_s3select_fields(r, x, x2, "summary: s3select totals for user" + s['user'])
return r
-def ignore_this_entry(cat, bucket, user, out, b_in, err):
- pass
-class requestlog_queue():
- def __init__(self, add):
- self.q = Queue(1000)
- self.adder = add
- def handle_request_data(self, request, response, error=False):
- now = datetime.datetime.now()
- if error:
- pass
- elif response.status < 200 or response.status >= 400:
- error = True
- self.q.put({'t': now, 'o': request, 'i': response, 'e': error})
- def clear(self):
- with self.q.mutex:
- self.q.queue.clear()
- def log_and_clear(self, cat, bucket, user, add_entry = None):
- while not self.q.empty():
- j = self.q.get()
- bytes_out = 0
- if 'Content-Length' in j['o'].headers:
- bytes_out = int(j['o'].headers['Content-Length'])
- bytes_in = 0
- msg = j['i'].msg
- if 'content-length'in msg:
- bytes_in = int(msg['content-length'])
- log.info('RL: %s %s %s bytes_out=%d bytes_in=%d failed=%r'
- % (cat, bucket, user, bytes_out, bytes_in, j['e']))
- if add_entry == None:
- add_entry = self.adder
- add_entry(cat, bucket, user, bytes_out, bytes_in, j['e'])
-
def create_presigned_url(conn, method, bucket_name, key_name, expiration):
return conn.generate_url(expires_in=expiration,
method=method,
connection3.auth_region_name='us-east-1'
acc = usage_acc()
- rl = requestlog_queue(acc.generate_make_entry())
- connection.set_request_hook(rl)
- connection2.set_request_hook(rl)
- connection3.set_request_hook(rl)
# legend (test cases can be easily grep-ed out)
# TESTCASE 'testname','object','method','operation','assertion'
# create a first bucket
bucket = connection.create_bucket(bucket_name)
- rl.log_and_clear("create_bucket", bucket_name, user1)
-
# TESTCASE 'bucket-list','bucket','list','one bucket','succeeds, expected list'
(err, out) = rgwadmin(ctx, client, ['bucket', 'list', '--uid', user1], check_status=True)
assert len(out) == 1
assert len(bucket_list) == 1
assert bucket_list[0].name == bucket_name
- rl.log_and_clear("list_buckets", '', user1)
-
# TESTCASE 'bucket-list-all','bucket','list','all buckets','succeeds, expected list'
(err, out) = rgwadmin(ctx, client, ['bucket', 'list'], check_status=True)
assert len(out) >= 1
# TESTCASE 'max-bucket-limit,'bucket','create','4 buckets','5th bucket fails due to max buckets == 4'
bucket2 = connection.create_bucket(bucket_name + '2')
- rl.log_and_clear("create_bucket", bucket_name + '2', user1)
bucket3 = connection.create_bucket(bucket_name + '3')
- rl.log_and_clear("create_bucket", bucket_name + '3', user1)
bucket4 = connection.create_bucket(bucket_name + '4')
- rl.log_and_clear("create_bucket", bucket_name + '4', user1)
# the 5th should fail.
failed = False
try:
except Exception:
failed = True
assert failed
- rl.log_and_clear("create_bucket", bucket_name + '5', user1)
# delete the buckets
bucket2.delete()
- rl.log_and_clear("delete_bucket", bucket_name + '2', user1)
bucket3.delete()
- rl.log_and_clear("delete_bucket", bucket_name + '3', user1)
bucket4.delete()
- rl.log_and_clear("delete_bucket", bucket_name + '4', user1)
# TESTCASE 'bucket-stats3','bucket','stats','new empty bucket','succeeds, empty list'
(err, out) = rgwadmin(ctx, client, [
# use some space
key = boto.s3.key.Key(bucket)
key.set_contents_from_string('one')
- rl.log_and_clear("put_obj", bucket_name, user1)
# TESTCASE 'bucket-stats5','bucket','stats','after creating key','succeeds, lists one non-empty object'
(err, out) = rgwadmin(ctx, client, [
# reclaim it
key.delete()
- rl.log_and_clear("delete_obj", bucket_name, user1)
# TESTCASE 'bucket unlink', 'bucket', 'unlink', 'unlink bucket from user', 'fails', 'access denied error'
(err, out) = rgwadmin(ctx, client,
denied = True
assert not denied
- rl.log_and_clear("put_obj", bucket_name, user1)
# delete the object
key.delete()
- rl.log_and_clear("delete_obj", bucket_name, user1)
# link the bucket to another user
(err, out) = rgwadmin(ctx, client, ['metadata', 'get', 'bucket:{n}'.format(n=bucket_name)],
object_name = 'four'
key = boto.s3.key.Key(bucket, object_name)
key.set_contents_from_string(object_name)
- rl.log_and_clear("put_obj", bucket_name, user1)
# fetch it too (for usage stats presently)
s = key.get_contents_as_string(encoding='ascii')
- rl.log_and_clear("get_obj", bucket_name, user1)
assert s == object_name
# list bucket too (for usage stats presently)
keys = list(bucket.list())
- rl.log_and_clear("list_bucket", bucket_name, user1)
assert len(keys) == 1
assert keys[0].name == object_name
assert e.status == 403
assert denied
- rl.log_and_clear("put_obj", bucket_name, user1)
# TESTCASE 'user-renable2','user','enable','suspended user','succeeds'
(err, out) = rgwadmin(ctx, client, ['user', 'enable', '--uid', user1],
# TESTCASE 'user-renable3','user','enable','reenabled user','can write objects'
key = boto.s3.key.Key(bucket)
key.set_contents_from_string('six')
- rl.log_and_clear("put_obj", bucket_name, user1)
# TESTCASE 'gc-list', 'gc', 'list', 'get list of objects ready for garbage collection'
big_key = boto.s3.key.Key(bucket)
big_key.set_contents_from_string(test_string)
- rl.log_and_clear("put_obj", bucket_name, user1)
# now delete the head
big_key.delete()
- rl.log_and_clear("delete_obj", bucket_name, user1)
# wait a bit to give the garbage collector time to cycle
time.sleep(15)
bucket.delete()
except boto.exception.S3ResponseError as e:
assert e.status == 409
- rl.log_and_clear("delete_bucket", bucket_name, user1)
key.delete()
- rl.log_and_clear("delete_obj", bucket_name, user1)
bucket.delete()
- rl.log_and_clear("delete_bucket", bucket_name, user1)
# TESTCASE 'rm-bucket', 'bucket', 'rm', 'bucket with objects', 'succeeds'
bucket = connection.create_bucket(bucket_name)
- rl.log_and_clear("create_bucket", bucket_name, user1)
key_name = ['eight', 'nine', 'ten', 'eleven']
for i in range(4):
key = boto.s3.key.Key(bucket)
key.set_contents_from_string(key_name[i])
- rl.log_and_clear("put_obj", bucket_name, user1)
(err, out) = rgwadmin(ctx, client,
['bucket', 'rm', '--bucket', bucket_name, '--purge-objects'],
# TESTCASE 'rm-user','user','rm','existing user','fails, still has buckets'
bucket = connection.create_bucket(bucket_name)
- rl.log_and_clear("create_bucket", bucket_name, user1)
key = boto.s3.key.Key(bucket)
(err, out) = rgwadmin(ctx, client, ['user', 'rm', '--uid', user1])
# TESTCASE 'rm-user2', 'user', 'rm', 'user with data', 'succeeds'
bucket = connection.create_bucket(bucket_name)
- rl.log_and_clear("create_bucket", bucket_name, user1)
key = boto.s3.key.Key(bucket)
key.set_contents_from_string('twelve')
- rl.log_and_clear("put_obj", bucket_name, user1)
time.sleep(35)
# create a bucket
bucket = connection3.create_bucket(bucket_name + '6')
- rl.log_and_clear("create_bucket", bucket_name + '6', user3)
-
# create object
object_name1 = 'thirteen'
key1 = boto.s3.key.Key(bucket, object_name1)
key1.set_contents_from_string(object_name1)
- rl.log_and_clear("put_obj", bucket_name + '6', user3)
# rename user3
(err, out) = rgwadmin(ctx, client, ['user', 'rename', '--uid', user3, '--new-uid', user4], check_status=True)
# get bucket and object to test if user keys are preserved
bucket = connection3.get_bucket(bucket_name + '6')
s = key1.get_contents_as_string(encoding='ascii')
- rl.log_and_clear("get_obj", bucket_name + '6', user4)
assert s == object_name1
# TESTCASE 'user-rename', 'user', 'rename', 'existing user', 'another existing user', 'fails'
# create a bucket
bucket = connection2.create_bucket(bucket_name + '7')
- rl.log_and_clear("create_bucket", bucket_name + '7', user2)
-
# create object
object_name2 = 'fourteen'
key2 = boto.s3.key.Key(bucket, object_name2)
key2.set_contents_from_string(object_name2)
- rl.log_and_clear("put_obj", bucket_name + '7', user2)
(err, out) = rgwadmin(ctx, client, ['user', 'rename', '--uid', user4, '--new-uid', user2])
assert err
# test if user 2 and user4 can still access their bucket and objects after rename fails
bucket = connection3.get_bucket(bucket_name + '6')
s = key1.get_contents_as_string(encoding='ascii')
- rl.log_and_clear("get_obj", bucket_name + '6', user4)
assert s == object_name1
bucket = connection2.get_bucket(bucket_name + '7')
s = key2.get_contents_as_string(encoding='ascii')
- rl.log_and_clear("get_obj", bucket_name + '7', user2)
assert s == object_name2
(err, out) = rgwadmin(ctx, client,
# should be all through with connection. (anything using connection
# should be BEFORE the usage stuff above.)
- rl.log_and_clear("(before-close)", '-', '-', ignore_this_entry)
connection.close()
connection = None