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.
@@ -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
- connection.put_attributes(domain, id, @attributes, :replace)
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
@@ -1,5 +1,5 @@
1
1
  #
2
- # Copyright (c) 2007-2008 RightScale Inc
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
- # = RightAws::Sqs -- RightScale's Amazon SQS interface
28
- # The RightAws::Sqs class provides a complete interface to Amazon's Simple
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
- # grantee1 = RightAws::Sqs::Grantee.create(queue2,'one_cool_guy@email.address')
52
- # grantee1.grant('FULLCONTROL')
53
- # grantee1.drop
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
- # Deletes only the visible messages unless +force+ is +true+.
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
- # P.S. when <tt>force==true</tt> the queue deletes then creates again. This is
133
- # the quickest method to clear a big queue or a queue with 'locked' messages. All queue
134
- # attributes are restored. But there is no way to restore grantees' permissions to
135
- # this queue. If you have no grantees except 'root' then you have no problems.
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
- # PS This function is no longer supported. Amazon has changed the SQS semantics to require at least 60 seconds between
139
- # queue deletion and creation. Hence this method will fail with an exception.
136
+ # queue.clear() #=> true
140
137
  #
141
- def clear(force=false)
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
- # Queue must be empty or +force+ must be set to +true+.
151
- # Returns +true+.
141
+
142
+ # Deletes queue. Any messages in the queue will be permanently lost.
143
+ # Returns +true+.
152
144
  #
153
- # queue.delete(true) #=> true
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, force)
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
- msg = Message.new(self, @sqs.interface.send_message(@url, message), message)
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.receive_messages(@url, number_of_messages, visibility)
171
+ list = @sqs.interface.receive_message(@url, number_of_messages, visibility)
176
172
  list.map! do |entry|
177
- msg = Message.new(self, entry[:id], entry[:body], visibility)
178
- msg.received_at = Time.now
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
- # Peeks message body.
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
- msg = receive
211
- msg.delete if msg
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.get_visibility_timeout(@url)
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.set_visibility_timeout(@url, visibility_timeout)
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') #=> '100'
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
- # Changes +VisibilityTimeout+ for current message.
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, @id)
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