]> git.proxmox.com Git - ceph.git/blame - ceph/src/test/rgw/rgw_multi/zone_rados.py
import ceph quincy 17.2.6
[ceph.git] / ceph / src / test / rgw / rgw_multi / zone_rados.py
CommitLineData
31f18b77 1import logging
a8e16298 2from boto.s3.deletemarker import DeleteMarker
31f18b77 3
f67539c2 4from itertools import zip_longest # type: ignore
31f18b77
FG
5
6from nose.tools import eq_ as eq
7
8from .multisite import *
9
10log = logging.getLogger(__name__)
11
12def check_object_eq(k1, k2, check_extra = True):
13 assert k1
14 assert k2
15 log.debug('comparing key name=%s', k1.name)
16 eq(k1.name, k2.name)
a8e16298
TL
17 eq(k1.version_id, k2.version_id)
18 eq(k1.is_latest, k2.is_latest)
19 eq(k1.last_modified, k2.last_modified)
20 if isinstance(k1, DeleteMarker):
21 assert isinstance(k2, DeleteMarker)
22 return
23
31f18b77
FG
24 eq(k1.get_contents_as_string(), k2.get_contents_as_string())
25 eq(k1.metadata, k2.metadata)
26 eq(k1.cache_control, k2.cache_control)
27 eq(k1.content_type, k2.content_type)
28 eq(k1.content_encoding, k2.content_encoding)
29 eq(k1.content_disposition, k2.content_disposition)
30 eq(k1.content_language, k2.content_language)
31 eq(k1.etag, k2.etag)
31f18b77
FG
32 if check_extra:
33 eq(k1.owner.id, k2.owner.id)
34 eq(k1.owner.display_name, k2.owner.display_name)
35 eq(k1.storage_class, k2.storage_class)
36 eq(k1.size, k2.size)
31f18b77
FG
37 eq(k1.encrypted, k2.encrypted)
38
31f18b77
FG
39class RadosZone(Zone):
40 def __init__(self, name, zonegroup = None, cluster = None, data = None, zone_id = None, gateways = None):
41 super(RadosZone, self).__init__(name, zonegroup, cluster, data, zone_id, gateways)
42
43 def tier_type(self):
44 return "rados"
45
46
47 class Conn(ZoneConn):
48 def __init__(self, zone, credentials):
49 super(RadosZone.Conn, self).__init__(zone, credentials)
50
51 def get_bucket(self, name):
52 return self.conn.get_bucket(name)
53
54 def create_bucket(self, name):
55 return self.conn.create_bucket(name)
56
11fdf7f2
TL
57 def delete_bucket(self, name):
58 return self.conn.delete_bucket(name)
59
31f18b77
FG
60 def check_bucket_eq(self, zone_conn, bucket_name):
61 log.info('comparing bucket=%s zones={%s, %s}', bucket_name, self.name, zone_conn.name)
62 b1 = self.get_bucket(bucket_name)
63 b2 = zone_conn.get_bucket(bucket_name)
64
a8e16298 65 b1_versions = b1.list_versions()
31f18b77 66 log.debug('bucket1 objects:')
a8e16298 67 for o in b1_versions:
31f18b77 68 log.debug('o=%s', o.name)
a8e16298
TL
69
70 b2_versions = b2.list_versions()
31f18b77 71 log.debug('bucket2 objects:')
a8e16298 72 for o in b2_versions:
31f18b77
FG
73 log.debug('o=%s', o.name)
74
a8e16298 75 for k1, k2 in zip_longest(b1_versions, b2_versions):
31f18b77
FG
76 if k1 is None:
77 log.critical('key=%s is missing from zone=%s', k2.name, self.name)
78 assert False
79 if k2 is None:
80 log.critical('key=%s is missing from zone=%s', k1.name, zone_conn.name)
81 assert False
82
83 check_object_eq(k1, k2)
84
a8e16298
TL
85 if isinstance(k1, DeleteMarker):
86 # verify that HEAD sees a delete marker
87 assert b1.get_key(k1.name) is None
88 assert b2.get_key(k2.name) is None
89 else:
90 # now get the keys through a HEAD operation, verify that the available data is the same
91 k1_head = b1.get_key(k1.name, version_id=k1.version_id)
92 k2_head = b2.get_key(k2.name, version_id=k2.version_id)
93 check_object_eq(k1_head, k2_head, False)
94
95 if k1.version_id:
96 # compare the olh to make sure they agree about the current version
97 k1_olh = b1.get_key(k1.name)
98 k2_olh = b2.get_key(k2.name)
99 # if there's a delete marker, HEAD will return None
100 if k1_olh or k2_olh:
101 check_object_eq(k1_olh, k2_olh, False)
31f18b77
FG
102
103 log.info('success, bucket identical: bucket=%s zones={%s, %s}', bucket_name, self.name, zone_conn.name)
104
105 return True
106
39ae355f
TL
107 def get_role(self, role_name):
108 return self.iam_conn.get_role(role_name)
109
110 def check_role_eq(self, zone_conn, role_name):
111 log.info('comparing role=%s zones={%s, %s}', role_name, self.name, zone_conn.name)
112 r1 = self.get_role(role_name)
113 r2 = zone_conn.get_role(role_name)
114
115 assert r1
116 assert r2
117 log.debug('comparing role name=%s', r1['get_role_response']['get_role_result']['role']['role_name'])
118 eq(r1['get_role_response']['get_role_result']['role']['role_name'], r2['get_role_response']['get_role_result']['role']['role_name'])
119 eq(r1['get_role_response']['get_role_result']['role']['role_id'], r2['get_role_response']['get_role_result']['role']['role_id'])
120 eq(r1['get_role_response']['get_role_result']['role']['path'], r2['get_role_response']['get_role_result']['role']['path'])
121 eq(r1['get_role_response']['get_role_result']['role']['arn'], r2['get_role_response']['get_role_result']['role']['arn'])
122 eq(r1['get_role_response']['get_role_result']['role']['max_session_duration'], r2['get_role_response']['get_role_result']['role']['max_session_duration'])
123 eq(r1['get_role_response']['get_role_result']['role']['assume_role_policy_document'], r2['get_role_response']['get_role_result']['role']['assume_role_policy_document'])
124
125 log.info('success, role identical: role=%s zones={%s, %s}', role_name, self.name, zone_conn.name)
126
127 return True
128
129 def create_role(self, path, rolename, policy_document, tag_list):
130 return self.iam_conn.create_role(rolename, policy_document, path)
131
31f18b77
FG
132 def get_conn(self, credentials):
133 return self.Conn(self, credentials)
134