forked from TrueCloudLab/s3-tests
s3tests: object version removal and delete marker test
Signed-off-by: Yehuda Sadeh <yehuda@inktank.com>
This commit is contained in:
parent
5d67c7f5df
commit
a3ce6be105
1 changed files with 66 additions and 8 deletions
|
@ -5202,19 +5202,33 @@ def test_versioning_bucket_create_suspend():
|
||||||
bucket.configure_versioning(False)
|
bucket.configure_versioning(False)
|
||||||
check_versioning(bucket, "Suspended")
|
check_versioning(bucket, "Suspended")
|
||||||
|
|
||||||
def test_obj_versions(bucket, objname, contents):
|
|
||||||
|
def check_head_obj_content(key, content):
|
||||||
|
if content is not None:
|
||||||
|
eq(key.get_contents_as_string(), content)
|
||||||
|
else:
|
||||||
|
print 'check head', key
|
||||||
|
eq(key, None)
|
||||||
|
|
||||||
|
def check_obj_content(key, content):
|
||||||
|
if content is not None:
|
||||||
|
eq(key.get_contents_as_string(), content)
|
||||||
|
else:
|
||||||
|
eq(isinstance(key, boto.s3.deletemarker.DeleteMarker), True)
|
||||||
|
|
||||||
|
|
||||||
|
def check_obj_versions(bucket, objname, contents):
|
||||||
# check to see if object is pointing at correct version
|
# check to see if object is pointing at correct version
|
||||||
key = bucket.get_key(objname)
|
key = bucket.get_key(objname)
|
||||||
|
|
||||||
if len(contents) > 0:
|
if len(contents) > 0:
|
||||||
print contents[-1]
|
|
||||||
print 'testing obj head', objname
|
print 'testing obj head', objname
|
||||||
eq(key.get_contents_as_string(), contents[-1])
|
check_head_obj_content(key, contents[-1])
|
||||||
i = len(contents)
|
i = len(contents)
|
||||||
for key in bucket.list_versions():
|
for key in bucket.list_versions():
|
||||||
i -= 1
|
i -= 1
|
||||||
print 'testing obj version-id=', key.version_id
|
print 'testing obj version-id=', key.version_id
|
||||||
eq(key.get_contents_as_string(), contents[i])
|
check_obj_content(key, contents[i])
|
||||||
else:
|
else:
|
||||||
eq(key, None)
|
eq(key, None)
|
||||||
|
|
||||||
|
@ -5247,27 +5261,59 @@ def remove_obj_version(bucket, k, c, i):
|
||||||
# check by versioned key
|
# check by versioned key
|
||||||
i = i % len(k)
|
i = i % len(k)
|
||||||
rmkey = k.pop(i)
|
rmkey = k.pop(i)
|
||||||
eq(rmkey.get_contents_as_string(), c.pop(i))
|
content = c.pop(i)
|
||||||
|
if (not rmkey.delete_marker):
|
||||||
|
eq(rmkey.get_contents_as_string(), content)
|
||||||
|
|
||||||
# remove version
|
# remove version
|
||||||
print 'removing version_id=', rmkey.version_id
|
print 'removing version_id=', rmkey.version_id
|
||||||
bucket.delete_key(rmkey.name, version_id = rmkey.version_id)
|
bucket.delete_key(rmkey.name, version_id = rmkey.version_id)
|
||||||
|
|
||||||
|
def remove_obj_head(bucket, objname, k, c):
|
||||||
|
print 'removing obj=', objname
|
||||||
|
key = bucket.delete_key(objname)
|
||||||
|
|
||||||
|
k.append(key)
|
||||||
|
c.append(None)
|
||||||
|
|
||||||
|
eq(key.delete_marker, True)
|
||||||
|
|
||||||
|
check_obj_versions(bucket, objname, c)
|
||||||
|
|
||||||
def do_test_create_remove_versions(bucket, objname, num_versions, remove_start_idx, idx_inc):
|
def do_test_create_remove_versions(bucket, objname, num_versions, remove_start_idx, idx_inc):
|
||||||
(k, c) = create_multiple_versions(bucket, objname, num_versions)
|
(k, c) = create_multiple_versions(bucket, objname, num_versions)
|
||||||
|
|
||||||
test_obj_versions(bucket, objname, c)
|
check_obj_versions(bucket, objname, c)
|
||||||
|
|
||||||
idx = remove_start_idx
|
idx = remove_start_idx
|
||||||
|
|
||||||
for j in xrange(num_versions):
|
for j in xrange(num_versions):
|
||||||
remove_obj_version(bucket, k, c, idx)
|
remove_obj_version(bucket, k, c, idx)
|
||||||
idx += idx_inc
|
idx += idx_inc
|
||||||
test_obj_versions(bucket, objname, c)
|
check_obj_versions(bucket, objname, c)
|
||||||
|
|
||||||
|
def do_test_create_remove_versions_and_head(bucket, objname, num_versions, num_ops, remove_start_idx, idx_inc, head_rm_ratio):
|
||||||
|
(k, c) = create_multiple_versions(bucket, objname, num_versions)
|
||||||
|
|
||||||
|
check_obj_versions(bucket, objname, c)
|
||||||
|
|
||||||
|
idx = remove_start_idx
|
||||||
|
|
||||||
|
r = 0
|
||||||
|
|
||||||
|
for j in xrange(num_ops):
|
||||||
|
r += head_rm_ratio
|
||||||
|
if r >= 1:
|
||||||
|
r %= 1
|
||||||
|
remove_obj_head(bucket, objname, k, c)
|
||||||
|
else:
|
||||||
|
remove_obj_version(bucket, k, c, idx)
|
||||||
|
idx += idx_inc
|
||||||
|
check_obj_versions(bucket, objname, c)
|
||||||
|
|
||||||
@attr(resource='object')
|
@attr(resource='object')
|
||||||
@attr(method='create')
|
@attr(method='create')
|
||||||
@attr(operation='create versioned object')
|
@attr(operation='create and remove versioned object')
|
||||||
@attr(assertion='can create access and remove appropriate versions')
|
@attr(assertion='can create access and remove appropriate versions')
|
||||||
@attr('versioning')
|
@attr('versioning')
|
||||||
def test_versioning_obj_create_read_remove():
|
def test_versioning_obj_create_read_remove():
|
||||||
|
@ -5282,3 +5328,15 @@ def test_versioning_obj_create_read_remove():
|
||||||
do_test_create_remove_versions(bucket, objname, num_vers, 4, -1)
|
do_test_create_remove_versions(bucket, objname, num_vers, 4, -1)
|
||||||
do_test_create_remove_versions(bucket, objname, num_vers, 3, 3)
|
do_test_create_remove_versions(bucket, objname, num_vers, 3, 3)
|
||||||
|
|
||||||
|
@attr(resource='object')
|
||||||
|
@attr(method='create')
|
||||||
|
@attr(operation='create and remove versioned object and head')
|
||||||
|
@attr(assertion='can create access and remove appropriate versions')
|
||||||
|
@attr('versioning')
|
||||||
|
def test_versioning_obj_create_read_remove_head():
|
||||||
|
bucket = get_new_bucket()
|
||||||
|
objname = 'testobj'
|
||||||
|
num_vers = 5
|
||||||
|
|
||||||
|
do_test_create_remove_versions_and_head(bucket, objname, num_vers, num_vers * 2, -1, 0, 0.5)
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue