]> git.proxmox.com Git - ceph.git/blame - ceph/qa/workunits/rgw/test_rgw_versioning.py
update ceph source to reef 18.2.0
[ceph.git] / ceph / qa / workunits / rgw / test_rgw_versioning.py
CommitLineData
05a536ef
TL
1#!/usr/bin/env python3
2
3import logging as log
4import json
5import uuid
6import botocore
7import time
8from common import exec_cmd, create_user, boto_connect
9from botocore.config import Config
10
11"""
12Tests 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 """
22USER = 'versioning-tester'
23DISPLAY_NAME = 'Versioning Testing'
24ACCESS_KEY = 'LTA662PVVDTDWX6M2AB0'
25SECRET_KEY = 'pvtchqajgzqx5581t6qbddbkj0bgf3a69qdkjcea'
26BUCKET_NAME = 'versioning-bucket'
27DATA_POOL = 'default.rgw.buckets.data'
28
29def 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
109main()
110log.info("Completed bucket versioning tests")