appoxy-aws 1.11.16 → 1.11.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/sdb/active_sdb.rb +9 -2
- data/lib/sqs/right_sqs.rb +92 -194
- data/lib/sqs/right_sqs_interface.rb +150 -302
- metadata +2 -4
- data/lib/sqs/right_sqs_gen2.rb +0 -286
- data/lib/sqs/right_sqs_gen2_interface.rb +0 -444
data/lib/sdb/active_sdb.rb
CHANGED
@@ -777,9 +777,16 @@ module RightAws
|
|
777
777
|
# sandy.reload #=> {"name"=>["Sandy"], "id"=>"b2832ce2-e461-11dc-b13c-001bfc466dd7", "toys"=>["kids"]}
|
778
778
|
#
|
779
779
|
# compare to +put+ method
|
780
|
-
def save
|
780
|
+
def save(*params)
|
781
781
|
pre_save2
|
782
|
-
|
782
|
+
atts_to_save = @attributes.dup
|
783
|
+
options = params.first.is_a?(Hash) ? params.pop : {}
|
784
|
+
if options[:except]
|
785
|
+
options[:except].each do |e|
|
786
|
+
atts_to_save.delete(e).inspect
|
787
|
+
end
|
788
|
+
end
|
789
|
+
connection.put_attributes(domain, id, atts_to_save, :replace)
|
783
790
|
apres_save2
|
784
791
|
@attributes
|
785
792
|
end
|
data/lib/sqs/right_sqs.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
#
|
2
|
-
# Copyright (c)
|
2
|
+
# Copyright (c) 2008 RightScale Inc
|
3
3
|
#
|
4
4
|
# Permission is hereby granted, free of charge, to any person obtaining
|
5
5
|
# a copy of this software and associated documentation files (the
|
@@ -24,13 +24,18 @@
|
|
24
24
|
module RightAws
|
25
25
|
|
26
26
|
#
|
27
|
-
#
|
28
|
-
#
|
27
|
+
# RightAws::Sqs -- RightScale's Amazon SQS interface, API version
|
28
|
+
# 2008-01-01 and later.
|
29
|
+
# The RightAws::Sqs class provides a complete interface to the second generation of Amazon's Simple
|
29
30
|
# Queue Service.
|
30
31
|
# For explanations of the semantics
|
31
32
|
# of each call, please refer to Amazon's documentation at
|
32
33
|
# http://developer.amazonwebservices.com/connect/kbcategory.jspa?categoryID=31
|
33
34
|
#
|
35
|
+
#
|
36
|
+
# RightAws::Sqs is built atop RightAws::SqsInterface, a lower-level
|
37
|
+
# procedural API that may be appropriate for certain programs.
|
38
|
+
#
|
34
39
|
# Error handling: all operations raise an RightAws::AwsError in case
|
35
40
|
# of problems. Note that transient errors are automatically retried.
|
36
41
|
#
|
@@ -48,13 +53,9 @@ module RightAws
|
|
48
53
|
# queue2.send_message('Ola-la!')
|
49
54
|
# message2 = queue2.pop
|
50
55
|
# ...
|
51
|
-
#
|
52
|
-
#
|
53
|
-
#
|
54
|
-
# ...
|
55
|
-
# grantee2 = queue.grantees('another_cool_guy@email.address')
|
56
|
-
# grantee2.revoke('SENDMESSAGE')
|
57
|
-
#
|
56
|
+
#
|
57
|
+
# NB: Second-generation SQS has eliminated the entire access grant mechanism present in Gen 1.
|
58
|
+
#
|
58
59
|
# Params is a hash:
|
59
60
|
#
|
60
61
|
# {:server => 'queue.amazonaws.com' # Amazon service host: 'queue.amazonaws.com' (default)
|
@@ -62,15 +63,14 @@ module RightAws
|
|
62
63
|
# :multi_thread => true|false # Multi-threaded (connection per each thread): true or false (default)
|
63
64
|
# :signature_version => '0' # The signature version : '0' or '1'(default)
|
64
65
|
# :logger => Logger Object} # Logger instance: logs to STDOUT if omitted }
|
65
|
-
#
|
66
66
|
class Sqs
|
67
67
|
attr_reader :interface
|
68
|
-
|
68
|
+
|
69
69
|
def initialize(aws_access_key_id=nil, aws_secret_access_key=nil, params={})
|
70
70
|
@interface = SqsInterface.new(aws_access_key_id, aws_secret_access_key, params)
|
71
71
|
end
|
72
|
-
|
73
|
-
# Retrieves a list of queues.
|
72
|
+
|
73
|
+
# Retrieves a list of queues.
|
74
74
|
# Returns an +array+ of +Queue+ instances.
|
75
75
|
#
|
76
76
|
# RightAws::Sqs.queues #=> array of queues
|
@@ -80,8 +80,8 @@ module RightAws
|
|
80
80
|
Queue.new(self, url)
|
81
81
|
end
|
82
82
|
end
|
83
|
-
|
84
|
-
# Returns Queue instance by queue name.
|
83
|
+
|
84
|
+
# Returns Queue instance by queue name.
|
85
85
|
# If the queue does not exist at Amazon SQS and +create+ is true, the method creates it.
|
86
86
|
#
|
87
87
|
# RightAws::Sqs.queue('my_awesome_queue') #=> #<RightAws::Sqs::Queue:0xb7b626e4 ... >
|
@@ -91,12 +91,12 @@ module RightAws
|
|
91
91
|
url = (create ? @interface.create_queue(queue_name, visibility) : nil) unless url
|
92
92
|
url ? Queue.new(self, url) : nil
|
93
93
|
end
|
94
|
-
|
95
|
-
|
94
|
+
|
95
|
+
|
96
96
|
class Queue
|
97
97
|
attr_reader :name, :url, :sqs
|
98
|
-
|
99
|
-
# Returns Queue instance by queue name.
|
98
|
+
|
99
|
+
# Returns Queue instance by queue name.
|
100
100
|
# If the queue does not exist at Amazon SQS and +create+ is true, the method creates it.
|
101
101
|
#
|
102
102
|
# RightAws::Sqs::Queue.create(sqs, 'my_awesome_queue') #=> #<RightAws::Sqs::Queue:0xb7b626e4 ... >
|
@@ -104,8 +104,8 @@ module RightAws
|
|
104
104
|
def self.create(sqs, url_or_name, create=true, visibility=nil)
|
105
105
|
sqs.queue(url_or_name, create, visibility)
|
106
106
|
end
|
107
|
-
|
108
|
-
# Creates new Queue instance.
|
107
|
+
|
108
|
+
# Creates new Queue instance.
|
109
109
|
# Does not create a queue at Amazon.
|
110
110
|
#
|
111
111
|
# queue = RightAws::Sqs::Queue.new(sqs, 'my_awesome_queue')
|
@@ -115,7 +115,7 @@ module RightAws
|
|
115
115
|
@url = @sqs.interface.queue_url_by_name(url_or_name)
|
116
116
|
@name = @sqs.interface.queue_name_by_url(@url)
|
117
117
|
end
|
118
|
-
|
118
|
+
|
119
119
|
# Retrieves queue size.
|
120
120
|
#
|
121
121
|
# queue.size #=> 1
|
@@ -123,64 +123,62 @@ module RightAws
|
|
123
123
|
def size
|
124
124
|
@sqs.interface.get_queue_length(@url)
|
125
125
|
end
|
126
|
-
|
127
|
-
# Clears queue.
|
128
|
-
#
|
129
|
-
#
|
130
|
-
# queue.clear(true) #=> true
|
126
|
+
|
127
|
+
# Clears queue, deleting only the visible messages. Any message within its visibility
|
128
|
+
# timeout will not be deleted, and will re-appear in the queue in the
|
129
|
+
# future when the timeout expires.
|
131
130
|
#
|
132
|
-
#
|
133
|
-
#
|
134
|
-
#
|
135
|
-
#
|
136
|
-
# Otherwise, it's better to use <tt>queue.clear(false)</tt>.
|
131
|
+
# To delete all messages in a queue and eliminate the chance of any
|
132
|
+
# messages re-appearing in the future, it's best to delete the queue and
|
133
|
+
# re-create it as a new queue. Note that doing this will take at least 60
|
134
|
+
# s since SQS does not allow re-creation of a queue within this interval.
|
137
135
|
#
|
138
|
-
#
|
139
|
-
# queue deletion and creation. Hence this method will fail with an exception.
|
136
|
+
# queue.clear() #=> true
|
140
137
|
#
|
141
|
-
def clear(
|
142
|
-
## if force
|
143
|
-
## @sqs.interface.force_clear_queue(@url)
|
144
|
-
## else
|
138
|
+
def clear()
|
145
139
|
@sqs.interface.clear_queue(@url)
|
146
|
-
## end
|
147
140
|
end
|
148
|
-
|
149
|
-
# Deletes queue.
|
150
|
-
#
|
151
|
-
# Returns +true+.
|
141
|
+
|
142
|
+
# Deletes queue. Any messages in the queue will be permanently lost.
|
143
|
+
# Returns +true+.
|
152
144
|
#
|
153
|
-
#
|
145
|
+
# NB: Use with caution; severe data loss is possible!
|
146
|
+
#
|
147
|
+
# queue.delete(true) #=> true
|
154
148
|
#
|
155
149
|
def delete(force=false)
|
156
|
-
@sqs.interface.delete_queue(@url
|
150
|
+
@sqs.interface.delete_queue(@url)
|
157
151
|
end
|
158
152
|
|
159
|
-
# Sends new message to queue.
|
153
|
+
# Sends new message to queue.
|
160
154
|
# Returns new Message instance that has been sent to queue.
|
161
155
|
def send_message(message)
|
162
156
|
message = message.to_s
|
163
|
-
|
157
|
+
res = @sqs.interface.send_message(@url, message)
|
158
|
+
msg = Message.new(self, res['MessageId'], nil, message)
|
159
|
+
msg.send_checksum = res['MD5OfMessageBody']
|
164
160
|
msg.sent_at = Time.now
|
165
161
|
msg
|
166
162
|
end
|
167
163
|
alias_method :push, :send_message
|
168
164
|
|
169
|
-
# Retrieves several messages from queue.
|
170
|
-
# Returns an array of Message instances.
|
165
|
+
# Retrieves several messages from queue.
|
166
|
+
# Returns an array of Message instances.
|
171
167
|
#
|
172
168
|
# queue.receive_messages(2,10) #=> array of messages
|
173
169
|
#
|
174
170
|
def receive_messages(number_of_messages=1, visibility=nil)
|
175
|
-
list = @sqs.interface.
|
171
|
+
list = @sqs.interface.receive_message(@url, number_of_messages, visibility)
|
176
172
|
list.map! do |entry|
|
177
|
-
msg
|
178
|
-
|
173
|
+
msg = Message.new(self, entry['MessageId'], entry['ReceiptHandle'],
|
174
|
+
entry['Body'], visibility)
|
175
|
+
msg.received_at = Time.now
|
176
|
+
msg.receive_checksum = entry['MD5OfBody']
|
179
177
|
msg
|
180
178
|
end
|
181
179
|
end
|
182
|
-
|
183
|
-
# Retrieves first accessible message from queue.
|
180
|
+
|
181
|
+
# Retrieves first accessible message from queue.
|
184
182
|
# Returns Message instance or +nil+ it the queue is empty.
|
185
183
|
#
|
186
184
|
# queue.receive #=> #<RightAws::Sqs::Message:0xb7bf0884 ... >
|
@@ -190,52 +188,49 @@ module RightAws
|
|
190
188
|
list.empty? ? nil : list[0]
|
191
189
|
end
|
192
190
|
|
193
|
-
#
|
194
|
-
#
|
195
|
-
# queue.peek #=> #<RightAws::Sqs::Message:0xb7bf0884 ... >
|
196
|
-
#
|
197
|
-
def peek(message_id)
|
198
|
-
entry = @sqs.interface.peek_message(@url, message_id)
|
199
|
-
msg = Message.new(self, entry[:id], entry[:body])
|
200
|
-
msg.received_at = Time.now
|
201
|
-
msg
|
202
|
-
end
|
203
|
-
|
204
|
-
# Pops (and deletes) first accessible message from queue.
|
205
|
-
# Returns Message instance or +nil+ it the queue is empty.
|
191
|
+
# Pops (and deletes) first accessible message from queue.
|
192
|
+
# Returns Message instance or +nil+ if the queue is empty.
|
206
193
|
#
|
207
194
|
# queue.pop #=> #<RightAws::Sqs::Message:0xb7bf0884 ... >
|
208
195
|
#
|
209
196
|
def pop
|
210
|
-
|
211
|
-
|
197
|
+
list = @sqs.interface.pop_messages(@url, 1)
|
198
|
+
return nil if list.empty?
|
199
|
+
entry = list[0]
|
200
|
+
msg = Message.new(self, entry['MessageId'], entry['ReceiptHandle'],
|
201
|
+
entry['Body'], visibility)
|
202
|
+
msg.received_at = Time.now
|
203
|
+
msg.receive_checksum = entry['MD5OfBody']
|
212
204
|
msg
|
213
205
|
end
|
214
206
|
|
215
|
-
# Retrieves +VisibilityTimeout+ value for the queue.
|
207
|
+
# Retrieves +VisibilityTimeout+ value for the queue.
|
216
208
|
# Returns new timeout value.
|
217
209
|
#
|
218
210
|
# queue.visibility #=> 30
|
219
211
|
#
|
220
212
|
def visibility
|
221
|
-
@sqs.interface.
|
213
|
+
@sqs.interface.get_queue_attributes(@url, 'VisibilityTimeout')['VisibilityTimeout']
|
222
214
|
end
|
223
|
-
|
224
|
-
# Sets new +VisibilityTimeout+ for the queue.
|
225
|
-
# Returns new timeout value.
|
215
|
+
|
216
|
+
# Sets new +VisibilityTimeout+ for the queue.
|
217
|
+
# Returns new timeout value.
|
226
218
|
#
|
227
219
|
# queue.visibility #=> 30
|
228
220
|
# queue.visibility = 33
|
229
221
|
# queue.visibility #=> 33
|
230
222
|
#
|
231
223
|
def visibility=(visibility_timeout)
|
232
|
-
@sqs.interface.
|
224
|
+
@sqs.interface.set_queue_attributes(@url, 'VisibilityTimeout', visibility_timeout)
|
233
225
|
visibility_timeout
|
234
226
|
end
|
235
|
-
|
236
|
-
# Sets new queue attribute value.
|
237
|
-
# Not all attributes may be changed: +ApproximateNumberOfMessages+ (for example) is a read only attribute.
|
238
|
-
# Returns a value to be assigned to attribute.
|
227
|
+
|
228
|
+
# Sets new queue attribute value.
|
229
|
+
# Not all attributes may be changed: +ApproximateNumberOfMessages+ (for example) is a read only attribute.
|
230
|
+
# Returns a value to be assigned to attribute.
|
231
|
+
# Currently, 'VisibilityTimeout' is the only settable queue attribute.
|
232
|
+
# Attempting to set non-existent attributes generates an indignant
|
233
|
+
# exception.
|
239
234
|
#
|
240
235
|
# queue.set_attribute('VisibilityTimeout', '100') #=> '100'
|
241
236
|
# queue.get_attribute('VisibilityTimeout') #=> '100'
|
@@ -244,145 +239,48 @@ module RightAws
|
|
244
239
|
@sqs.interface.set_queue_attributes(@url, attribute, value)
|
245
240
|
value
|
246
241
|
end
|
247
|
-
|
248
|
-
# Retrieves queue attributes.
|
249
|
-
# At this moment Amazon supports +VisibilityTimeout+ and +ApproximateNumberOfMessages+ only.
|
242
|
+
|
243
|
+
# Retrieves queue attributes.
|
244
|
+
# At this moment Amazon supports +VisibilityTimeout+ and +ApproximateNumberOfMessages+ only.
|
250
245
|
# If the name of attribute is set, returns its value. Otherwise, returns a hash of attributes.
|
251
246
|
#
|
252
|
-
# queue.get_attribute('VisibilityTimeout') #=>
|
247
|
+
# queue.get_attribute('VisibilityTimeout') #=> {"VisibilityTimeout"=>"45"}
|
253
248
|
#
|
254
249
|
def get_attribute(attribute='All')
|
255
250
|
attributes = @sqs.interface.get_queue_attributes(@url, attribute)
|
256
251
|
attribute=='All' ? attributes : attributes[attribute]
|
257
252
|
end
|
258
|
-
|
259
|
-
# Retrieves a list of grantees.
|
260
|
-
# Returns an +array+ of Grantee instances if the +grantee_email_address+ is unset.
|
261
|
-
# Otherwise returns a Grantee instance that points to +grantee_email_address+ or +nil+.
|
262
|
-
#
|
263
|
-
# grantees = queue.grantees #=> [#<RightAws::Sqs::Grantee:0xb7bf0888 ... >, ...]
|
264
|
-
# ...
|
265
|
-
# grantee = queue.grantees('cool_guy@email.address') #=> nil | #<RightAws::Sqs::Grantee:0xb7bf0888 ... >
|
266
|
-
#
|
267
|
-
def grantees(grantee_email_address=nil, permission = nil)
|
268
|
-
hash = @sqs.interface.list_grants(@url, grantee_email_address, permission)
|
269
|
-
grantees = []
|
270
|
-
hash.each do |key, value|
|
271
|
-
grantees << Grantee.new(self, grantee_email_address, key, value[:name], value[:perms])
|
272
|
-
end
|
273
|
-
if grantee_email_address
|
274
|
-
grantees.blank? ? nil : grantees.shift
|
275
|
-
else
|
276
|
-
grantees
|
277
|
-
end
|
278
|
-
end
|
279
253
|
end
|
280
|
-
|
281
|
-
|
254
|
+
|
282
255
|
class Message
|
283
|
-
attr_reader :queue, :id, :body, :visibility
|
284
|
-
attr_accessor :sent_at, :received_at
|
285
|
-
|
286
|
-
def initialize(queue, id=nil, body=nil, visibility=nil)
|
256
|
+
attr_reader :queue, :id, :body, :visibility, :receipt_handle
|
257
|
+
attr_accessor :sent_at, :received_at, :send_checksum, :receive_checksum
|
258
|
+
|
259
|
+
def initialize(queue, id=nil, rh = nil, body=nil, visibility=nil)
|
287
260
|
@queue = queue
|
288
261
|
@id = id
|
262
|
+
@receipt_handle = rh
|
289
263
|
@body = body
|
290
264
|
@visibility = visibility
|
291
265
|
@sent_at = nil
|
292
266
|
@received_at = nil
|
267
|
+
@send_checksum = nil
|
268
|
+
@receive_checksum = nil
|
293
269
|
end
|
294
|
-
|
270
|
+
|
295
271
|
# Returns +Message+ instance body.
|
296
272
|
def to_s
|
297
273
|
@body
|
298
274
|
end
|
299
|
-
|
300
|
-
#
|
301
|
-
# Returns new +VisibilityTimeout+ value.
|
302
|
-
def visibility=(visibility_timeout)
|
303
|
-
@queue.sqs.interface.change_message_visibility(@queue.url, @id, visibility_timeout)
|
304
|
-
@visibility = visibility_timeout
|
305
|
-
end
|
306
|
-
|
307
|
-
# Removes message from queue.
|
275
|
+
|
276
|
+
# Removes message from queue.
|
308
277
|
# Returns +true+.
|
309
278
|
def delete
|
310
|
-
@queue.sqs.interface.delete_message(@queue.url, @
|
279
|
+
@queue.sqs.interface.delete_message(@queue.url, @receipt_handle) if @receipt_handle
|
311
280
|
end
|
312
|
-
end
|
313
281
|
|
314
|
-
|
315
|
-
class Grantee
|
316
|
-
attr_accessor :queue, :id, :name, :perms, :email
|
317
|
-
|
318
|
-
# Creates new Grantee instance.
|
319
|
-
# To create new grantee for queue use:
|
320
|
-
#
|
321
|
-
# grantee = Grantee.new(queue, grantee@email.address)
|
322
|
-
# grantee.grant('FULLCONTROL')
|
323
|
-
#
|
324
|
-
def initialize(queue, email=nil, id=nil, name=nil, perms=[])
|
325
|
-
@queue = queue
|
326
|
-
@id = id
|
327
|
-
@name = name
|
328
|
-
@perms = perms
|
329
|
-
@email = email
|
330
|
-
retrieve unless id
|
331
|
-
end
|
332
|
-
|
333
|
-
# Retrieves security information for grantee identified by email.
|
334
|
-
# Returns +nil+ if the named user has no privileges on this queue, or
|
335
|
-
# +true+ if perms updated successfully.
|
336
|
-
def retrieve # :nodoc:
|
337
|
-
@id = nil
|
338
|
-
@name = nil
|
339
|
-
@perms = []
|
340
|
-
|
341
|
-
hash = @queue.sqs.interface.list_grants(@queue.url, @email)
|
342
|
-
return nil if hash.empty?
|
343
|
-
|
344
|
-
grantee = hash.shift
|
345
|
-
@id = grantee[0]
|
346
|
-
@name = grantee[1][:name]
|
347
|
-
@perms = grantee[1][:perms]
|
348
|
-
true
|
349
|
-
end
|
350
|
-
|
351
|
-
# Adds permissions for grantee.
|
352
|
-
# Permission: 'FULLCONTROL' | 'RECEIVEMESSAGE' | 'SENDMESSAGE'.
|
353
|
-
# The caller must have set the email instance variable.
|
354
|
-
def grant(permission=nil)
|
355
|
-
raise "You can't grant permission without defining a grantee email address!" unless @email
|
356
|
-
@queue.sqs.interface.add_grant(@queue.url, @email, permission)
|
357
|
-
retrieve
|
358
|
-
end
|
359
|
-
|
360
|
-
# Revokes permissions for grantee.
|
361
|
-
# Permission: 'FULLCONTROL' | 'RECEIVEMESSAGE' | 'SENDMESSAGE'.
|
362
|
-
# Default value is 'FULLCONTROL'.
|
363
|
-
# User must have +@email+ or +@id+ set.
|
364
|
-
# Returns +true+.
|
365
|
-
def revoke(permission='FULLCONTROL')
|
366
|
-
@queue.sqs.interface.remove_grant(@queue.url, @email || @id, permission)
|
367
|
-
unless @email # if email is unknown - just remove permission from local perms list...
|
368
|
-
@perms.delete(permission)
|
369
|
-
else # ... else retrieve updated information from Amazon
|
370
|
-
retrieve
|
371
|
-
end
|
372
|
-
true
|
373
|
-
end
|
374
|
-
|
375
|
-
# Revokes all permissions for this grantee.
|
376
|
-
# Returns +true+
|
377
|
-
def drop
|
378
|
-
@perms.each do |permission|
|
379
|
-
@queue.sqs.interface.remove_grant(@queue.url, @email || @id, permission)
|
380
|
-
end
|
381
|
-
retrieve
|
382
|
-
true
|
383
|
-
end
|
384
|
-
|
385
282
|
end
|
386
283
|
|
284
|
+
|
387
285
|
end
|
388
286
|
end
|