]>
Commit | Line | Data |
---|---|---|
31f18b77 | 1 | import logging |
a8e16298 | 2 | from boto.s3.deletemarker import DeleteMarker |
31f18b77 | 3 | |
f67539c2 | 4 | from itertools import zip_longest # type: ignore |
31f18b77 FG |
5 | |
6 | from nose.tools import eq_ as eq | |
7 | ||
8 | from .multisite import * | |
9 | ||
10 | log = logging.getLogger(__name__) | |
11 | ||
12 | def 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 |
39 | class 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 |