]>
Commit | Line | Data |
---|---|---|
05a536ef TL |
1 | #!/usr/bin/env python3 |
2 | ||
3 | import logging as log | |
4 | import json | |
5 | import uuid | |
6 | import botocore | |
7 | import time | |
8 | from common import exec_cmd, create_user, boto_connect | |
9 | from botocore.config import Config | |
10 | ||
11 | """ | |
12 | Tests behavior of bucket versioning. | |
13 | """ | |
14 | # The test cases in this file have been annotated for inventory. | |
15 | # To extract the inventory (in csv format) use the command: | |
16 | # | |
17 | # grep '^ *# TESTCASE' | sed 's/^ *# TESTCASE //' | |
18 | # | |
19 | # | |
20 | ||
21 | """ Constants """ | |
22 | USER = 'versioning-tester' | |
23 | DISPLAY_NAME = 'Versioning Testing' | |
24 | ACCESS_KEY = 'LTA662PVVDTDWX6M2AB0' | |
25 | SECRET_KEY = 'pvtchqajgzqx5581t6qbddbkj0bgf3a69qdkjcea' | |
26 | BUCKET_NAME = 'versioning-bucket' | |
27 | DATA_POOL = 'default.rgw.buckets.data' | |
28 | ||
29 | def main(): | |
30 | """ | |
31 | execute versioning tests | |
32 | """ | |
33 | create_user(USER, DISPLAY_NAME, ACCESS_KEY, SECRET_KEY) | |
34 | ||
35 | connection = boto_connect(ACCESS_KEY, SECRET_KEY, Config(retries = { | |
36 | 'total_max_attempts': 1, | |
37 | })) | |
38 | ||
39 | # pre-test cleanup | |
40 | try: | |
41 | bucket = connection.Bucket(BUCKET_NAME) | |
42 | bucket.objects.all().delete() | |
43 | bucket.object_versions.all().delete() | |
44 | bucket.delete() | |
45 | except botocore.exceptions.ClientError as e: | |
46 | if not e.response['Error']['Code'] == 'NoSuchBucket': | |
47 | raise | |
48 | ||
49 | bucket = connection.create_bucket(Bucket=BUCKET_NAME) | |
50 | connection.BucketVersioning(BUCKET_NAME).enable() | |
51 | ||
52 | # reproducer for bug from https://tracker.ceph.com/issues/59663 | |
53 | # TESTCASE 'verify that index entries and OLH objects are cleaned up after redundant deletes' | |
54 | log.debug('TEST: verify that index entries and OLH objects are cleaned up after redundant deletes\n') | |
55 | key = str(uuid.uuid4()) | |
56 | resp = bucket.Object(key).delete() | |
57 | assert 'DeleteMarker' in resp, 'DeleteMarker key not present in response' | |
58 | assert resp['DeleteMarker'], 'DeleteMarker value not True in response' | |
59 | assert 'VersionId' in resp, 'VersionId key not present in response' | |
60 | version_id = resp['VersionId'] | |
61 | bucket.Object(key).delete() | |
62 | connection.ObjectVersion(bucket.name, key, version_id).delete() | |
63 | # bucket index should now be empty | |
64 | out = exec_cmd(f'radosgw-admin bi list --bucket {BUCKET_NAME}') | |
65 | json_out = json.loads(out.replace(b'\x80', b'0x80')) | |
66 | assert len(json_out) == 0, 'bucket index was not empty after all objects were deleted' | |
67 | ||
68 | (_out, ret) = exec_cmd(f'rados -p {DATA_POOL} ls | grep {key}', check_retcode=False) | |
69 | assert ret != 0, 'olh object was not cleaned up' | |
70 | ||
71 | # TESTCASE 'verify that index entries and OLH objects are cleaned up after index linking error' | |
72 | log.debug('TEST: verify that index entries and OLH objects are cleaned up after index linking error\n') | |
73 | key = str(uuid.uuid4()) | |
74 | try: | |
75 | exec_cmd('ceph config set client rgw_debug_inject_set_olh_err 2') | |
76 | time.sleep(1) | |
77 | bucket.Object(key).delete() | |
78 | finally: | |
79 | exec_cmd('ceph config rm client rgw_debug_inject_set_olh_err') | |
80 | out = exec_cmd(f'radosgw-admin bi list --bucket {BUCKET_NAME}') | |
81 | json_out = json.loads(out.replace(b'\x80', b'0x80')) | |
82 | assert len(json_out) == 0, 'bucket index was not empty after op failed' | |
83 | (_out, ret) = exec_cmd(f'rados -p {DATA_POOL} ls | grep {key}', check_retcode=False) | |
84 | assert ret != 0, 'olh object was not cleaned up' | |
85 | ||
86 | # TESTCASE 'verify that original null object version is intact after failed olh upgrade' | |
87 | log.debug('TEST: verify that original null object version is intact after failed olh upgrade\n') | |
88 | connection.BucketVersioning(BUCKET_NAME).suspend() | |
89 | key = str(uuid.uuid4()) | |
90 | put_resp = bucket.put_object(Key=key, Body=b"data") | |
91 | connection.BucketVersioning(BUCKET_NAME).enable() | |
92 | try: | |
93 | exec_cmd('ceph config set client rgw_debug_inject_set_olh_err 2') | |
94 | time.sleep(1) | |
95 | # expected to fail due to the above error injection | |
96 | bucket.put_object(Key=key, Body=b"new data") | |
97 | except Exception as e: | |
98 | log.debug(e) | |
99 | finally: | |
100 | exec_cmd('ceph config rm client rgw_debug_inject_set_olh_err') | |
101 | get_resp = bucket.Object(key).get() | |
102 | assert put_resp.e_tag == get_resp['ETag'], 'get did not return null version with correct etag' | |
103 | ||
104 | # Clean up | |
105 | log.debug("Deleting bucket {}".format(BUCKET_NAME)) | |
106 | bucket.object_versions.all().delete() | |
107 | bucket.delete() | |
108 | ||
109 | main() | |
110 | log.info("Completed bucket versioning tests") |