]>
git.proxmox.com Git - ceph.git/blob - ceph/src/test/rgw/rgw_multi/zone_ps.py
7 from time
import gmtime
, strftime
8 from multisite
import Zone
10 log
= logging
.getLogger('rgw_multi.tests')
13 class PSZone(Zone
): # pylint: disable=too-many-ancestors
14 """ PubSub zone class """
15 def is_read_only(self
):
21 def create(self
, cluster
, args
=None, **kwargs
):
24 args
+= ['--tier-type', self
.tier_type()]
25 return self
.json_command(cluster
, 'create', args
)
27 def has_buckets(self
):
34 def make_request(conn
, method
, resource
, parameters
=None):
35 """generic request sending to pubsub radogw
36 should cover: topics, notificatios and subscriptions
39 if parameters
is not None:
40 url_params
= urllib
.urlencode(parameters
)
41 # remove 'None' from keys with no values
42 url_params
= url_params
.replace('=None', '')
43 url_params
= '?' + url_params
44 string_date
= strftime("%a, %d %b %Y %H:%M:%S +0000", gmtime())
45 string_to_sign
= method
+ '\n\n\n' + string_date
+ '\n' + resource
46 signature
= base64
.b64encode(hmac
.new(conn
.aws_secret_access_key
,
47 string_to_sign
.encode('utf-8'),
48 hashlib
.sha1
).digest())
49 headers
= {'Authorization': 'AWS '+conn
.aws_access_key_id
+':'+signature
,
51 'Host': conn
.host
+':'+str(conn
.port
)}
52 http_conn
= httplib
.HTTPConnection(conn
.host
, conn
.port
)
53 if log
.getEffectiveLevel() <= 10:
54 http_conn
.set_debuglevel(5)
55 http_conn
.request(method
, resource
+url_params
, NO_HTTP_BODY
, headers
)
56 response
= http_conn
.getresponse()
57 data
= response
.read()
58 status
= response
.status
64 """class to set/get/delete a topic
65 PUT /topics/<topic name>
66 GET /topics/<topic name>
67 DELETE /topics/<topic name>
69 def __init__(self
, conn
, topic_name
):
71 assert topic_name
.strip()
72 self
.resource
= '/topics/'+topic_name
74 def send_request(self
, method
):
75 """send request to radosgw"""
76 return make_request(self
.conn
, method
, self
.resource
)
80 return self
.send_request('GET')
84 return self
.send_request('PUT')
88 return self
.send_request('DELETE')
92 """class to set/get/delete a notification
93 PUT /notifications/bucket/<bucket>?topic=<topic-name>[&events=<event>[,<event>]]
94 GET /notifications/bucket/<bucket>
95 DELETE /notifications/bucket/<bucket>?topic=<topic-name>
97 def __init__(self
, conn
, bucket_name
, topic_name
, events
=''):
99 assert bucket_name
.strip()
100 assert topic_name
.strip()
101 self
.resource
= '/notifications/bucket/'+bucket_name
103 self
.parameters
= {'topic': topic_name
, 'events': events
}
105 self
.parameters
= {'topic': topic_name
}
107 def send_request(self
, method
, parameters
=None):
108 """send request to radosgw"""
109 return make_request(self
.conn
, method
, self
.resource
, parameters
)
111 def get_config(self
):
112 """get notification info"""
113 return self
.send_request('GET')
115 def set_config(self
):
116 """setnotification"""
117 return self
.send_request('PUT', self
.parameters
)
119 def del_config(self
):
120 """delete notification"""
121 return self
.send_request('DELETE', self
.parameters
)
124 class PSSubscription
:
125 """class to set/get/delete a subscription:
126 PUT /subscriptions/<sub-name>?topic=<topic-name>
127 GET /subscriptions/<sub-name>
128 DELETE /subscriptions/<sub-name>
129 also to get list of events, and ack them:
130 GET /subscriptions/<sub-name>?events[&max-entries=<max-entries>][&marker=<marker>]
131 POST /subscriptions/<sub-name>?ack&event-id=<event-id>
133 def __init__(self
, conn
, sub_name
, topic_name
):
135 assert topic_name
.strip()
136 self
.resource
= '/subscriptions/'+sub_name
137 self
.parameters
= {'topic': topic_name
}
139 def send_request(self
, method
, parameters
=None):
140 """send request to radosgw"""
141 return make_request(self
.conn
, method
, self
.resource
, parameters
)
143 def get_config(self
):
144 """get subscription info"""
145 return self
.send_request('GET')
147 def set_config(self
):
148 """set subscription"""
149 return self
.send_request('PUT', self
.parameters
)
151 def del_config(self
):
152 """delete subscription"""
153 return self
.send_request('DELETE')
155 def get_events(self
, max_entries
=None, marker
=None):
156 """ get events from subscription """
157 parameters
= {'events': None}
158 if max_entries
is not None:
159 parameters
['max-entries'] = max_entries
160 if marker
is not None:
161 parameters
['marker'] = marker
162 return self
.send_request('GET', parameters
)
164 def ack_events(self
, event_id
):
165 """ ack events in a subscription """
166 parameters
= {'ack': None, 'event-id': event_id
}
167 return self
.send_request('POST', parameters
)