1
0
Fork 0
mirror of https://github.com/fog/fog.git synced 2022-11-09 13:51:43 -05:00
fog--fog/lib/fog/rackspace/models/queues/claim.rb

140 lines
5.3 KiB
Ruby

require 'fog/core/model'
module Fog
module Rackspace
class Queues
class Claim < Fog::Model
# @!attribute [r] identity
# @return [String] The claim's id
identity :identity
# @!attribute [rw] grace
# @return [Integer] The grace attribute specifies the message grace period in seconds. The value of grace value must be between 60 and 43200 seconds (12 hours).
# You must include a value for this attribute in your request. To deal with workers that have stopped responding (for up to 1209600 seconds or 14 days, including
# claim lifetime), the server extends the lifetime of claimed messages to be at least as long as the lifetime of the claim itself, plus the specified grace period.
# If a claimed message would normally live longer than the grace period, its expiration is not adjusted.
attribute :grace
# @!attribute [rw] ttl
# @return [Integer] The ttl attribute specifies how long the server waits before releasing the claim. The ttl value must be between 60 and 43200 seconds (12 hours).
attribute :ttl
# @!attribute [rw] limit
# @return [Integer] Specifies the number of messages to return, up to 20 messages. If limit is not specified, limit defaults to 10.
attribute :limit
# @!attribute [r] limit
# @return [Array<Fog::Rackspace::Queues::Messages>, Array<Strings>] Specifies the number of messages to return, up to 20 messages.
# If limit is not specified, limit defaults to 10.
attribute :messages
alias :id :identity
# Creates or updates a claim
#
# @return [Boolean] returns true if claim is being created
#
# @raise [Fog::Rackspace::Queues::NotFound] - HTTP 404
# @raise [Fog::Rackspace::Queues::BadRequest] - HTTP 400
# @raise [Fog::Rackspace::Queues::InternalServerError] - HTTP 500
# @raise [Fog::Rackspace::Queues::ServiceError]
# @see http://docs.rackspace.com/queues/api/v1.0/cq-devguide/content/POST_claimMessages__version__queues__queue_name__claims_claims-operations-dle001.html
# @see http://docs.rackspace.com/queues/api/v1.0/cq-devguide/content/PATCH_updateClaim__version__queues__queue_name__claims__claimId__claims-operations-dle001.html
def save
if identity.nil?
create
else
update
end
end
# Destroys Claim
#
# @return [Boolean] returns true if claim is deleted
#
# @raise [Fog::Rackspace::Queues::NotFound] - HTTP 404
# @raise [Fog::Rackspace::Queues::BadRequest] - HTTP 400
# @raise [Fog::Rackspace::Queues::InternalServerError] - HTTP 500
# @raise [Fog::Rackspace::Queues::ServiceError]
# @see http://docs.rackspace.com/queues/api/v1.0/cq-devguide/content/DELETE_deleteClaim__version__queues__queue_name__claims__claimId__claims-operations-dle001.html
def destroy
requires :identity, :queue
service.delete_claim(queue.name, identity)
#Since Claims aren't a server side collection, we should remove
# the claim from the collection.
collection.delete(self)
true
end
def messages=(messages)
#HACK - Models require a collection, but I don't really want to expose
# the messages collection to users here.
message_collection = Fog::Rackspace::Queues::Messages.new({
:service => service,
:queue => queue,
:client_id => service.client_id,
:echo => true
})
attributes[:messages] = messages.collect do |message|
if message.instance_of? Fog::Rackspace::Queues::Message
message.claim_id = self.id
message
else
Fog::Rackspace::Queues::Message.new(
message.merge({
:service => service,
:collection => message_collection,
:claim_id => self.id
}.merge(message))
)
end
end
end
def initialize(new_attributes = {})
# A hack in support of the #messages= hack up above. #messages= requires #collection to
# be populated first to succeed, which is always the case in modern Rubies that preserve
# Hash ordering, but not in 1.8.7.
@collection = new_attributes.delete(:collection)
super(new_attributes)
end
private
def queue
collection.queue
end
def create
requires :queue, :ttl, :grace, :collection
options = {}
options[:limit] = limit unless limit.nil?
response = service.create_claim(queue.identity, ttl, grace, options)
if [200, 201].include? response.status
self.identity = response.get_header('Location').split('/').last
self.messages = response.body
#Since Claims aren't a server side collection, we need to
# add the claim to the collection
collection << self
true
else
false
end
end
def update
requires :identity, :queue, :ttl
service.update_claim(queue.identity, identity, ttl)
true
end
end
end
end
end