Class: Smash::CloudPowers::Synapse::Queue::Board

Inherits:
Resource
  • Object
show all
Includes:
AwsResources, Helpers, Smash::CloudPowers::Synapse::Queue, Zenv
Defined in:
lib/cloud_powers/synapse/queue/board.rb

Overview

The Queue::Resource class helps wrap up information and functionality of a Queue on SQS. It is basically just an abstraction to make using SQS simpler

Instance Attribute Summary collapse

Attributes inherited from Resource

#call_name, #client, #linked, #name, #remote_id, #tags, #type

Instance Method Summary collapse

Methods included from Zenv

#env_vars, #file_tree_search, #i_vars, #project_root, #project_root=, #system_vars, #zfind

Methods included from Helpers

#create_logger, #log_file, #logger

Methods included from PathHelp

#job_exist?, #job_home, #job_path, #job_require_path

Methods included from LogicHelp

#attr_map, #called_from, #instance_attr_accessor, #smart_retry, #update_message_body

Methods included from LangHelp

#deep_modify_keys_with, #find_and_remove, #format_error_message, #from_json, #modify_keys_with, #to_basic_hash, #to_camel, #to_hyph, #to_i_var, #to_pascal, #to_ruby_file_name, #to_snake, #valid_json?, #valid_url?

Methods included from Smash::CloudPowers::Synapse::Queue

#best_guess_address, #board_name, #build_board, #build_queue, #create_board, #create_queue, #delete_queue_message, #get_queue_message_count, #get_queue_poller, #pluck_queue_message, #poll, #queue_exists?, #queue_name, #queue_poller_name, #queue_search, #send_queue_message

Methods included from AwsResources

#ec2, #image, #kinesis, #queue_poller, #region, #s3, #sns

Methods included from Auth

creds, region

Methods included from Creatable

included

Constructor Details

#initialize(name:, client: sqs, **config) ⇒ Board

Creates a Resource object. The #new() method is wrapped in #build() and #create!() but isn’t private so #new() can be used instead of build. The Resource doesn’t create Queue(s) or any other API calls until it is instructed to.

Parameters

  • name String - the name of the resource can be used to find its arn/url etc

Returns Queue::Resource



36
37
38
39
# File 'lib/cloud_powers/synapse/queue/board.rb', line 36

def initialize(name:, client: sqs, **config)
  super
  @sqs = client
end

Instance Attribute Details

#addressObject

Gives the Queue address (URL). First the environment is searched, using Zenv and if nothing is found, the best guess attempt at the correct address is used.

Returns

* queue address <String>


20
21
22
# File 'lib/cloud_powers/synapse/queue/board.rb', line 20

def address
  @address
end

#responseObject (readonly)

Hash response from Aws SDK Aws::SQS::Client#create_resource()



22
23
24
# File 'lib/cloud_powers/synapse/queue/board.rb', line 22

def response
  @response
end

#sqsObject

An Aws::SQS::Client. See <tt>Smash::CloudPowers::AwsResources#sqs()<tt>



24
25
26
# File 'lib/cloud_powers/synapse/queue/board.rb', line 24

def sqs
  @sqs
end

Instance Method Details

#create_resourceObject

Creates an actual Queue in SQS using the standard format for this queue name (camel case)

Returns Queue::Resource



54
55
56
57
58
59
60
61
62
63
# File 'lib/cloud_powers/synapse/queue/board.rb', line 54

def create_resource
  begin
    @response = sqs.create_queue(queue_name: to_camel(@name))
    yield self if block_given?
    self
  rescue Aws::SQS::Errors::QueueDeletedRecently
    sleep 5
    retry
  end
end

#destroy!Object

Deletes an actual Queue from SQS



66
67
68
# File 'lib/cloud_powers/synapse/queue/board.rb', line 66

def destroy!
  sqs.delete_queue(queue_url: address)
end

#exists?Boolean

Predicate method to query SQS for the queue

Example

queue = Queue::Resource.build('example')
queue.exists?
# => false
queue.save!
queue.exists?
# => true

Returns:

  • (Boolean)


91
92
93
# File 'lib/cloud_powers/synapse/queue/board.rb', line 91

def exists?
  queue_exists?(@name)
end

#i_varObject

Gives back a string representation of the instance variable for this resource.

Returns String - the instance variable for this Resource in string format

Example

queue = Queue::Resource.new(:backlog)
Smash.instance_variable_get(resource.i_var)
#=> Resource <name: :backlog, ...>


78
79
80
# File 'lib/cloud_powers/synapse/queue/board.rb', line 78

def i_var
  to_i_var(@name)
end


95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
# File 'lib/cloud_powers/synapse/queue/board.rb', line 95

def link
  if exists?
    urls = queue_search(call_name)

    if urls.size > 1
      logger.info sitrep(content: "multiple matching #{name} queues to link to")
      return @linked = false
    end

    # @url = urls.first
    @url = sqs.get_queue_url(queue_name: @name).queue_url
  else
    save!
  end
  @linked = @url.eql? urls.first
end

#message_countObject

Gets the approximate message count for a Queue using the ‘ApproximateMessageCount’ attribute

Returns Integer



116
117
118
# File 'lib/cloud_powers/synapse/queue/board.rb', line 116

def message_count
  get_queue_message_count(address)
end

#pluck_messageObject

Retrieves a message from the Queue and deletes it from the Queue in SQS



133
134
135
# File 'lib/cloud_powers/synapse/queue/board.rb', line 133

def pluck_message
  pluck_queue_message(name)
end

#pollerObject

Gets a QueuePoller for the Queue attached to this Resource instance.

Returns Aws::SQS::QueuePoller

Notes

  • Provide an existing SQS Client if one exists. This is used to sort out development

production work.



128
129
130
# File 'lib/cloud_powers/synapse/queue/board.rb', line 128

def poller
  @poller ||= Aws::SQS::QueuePoller.new(queue_url: address, client: sqs)
end

#send_message(message) ⇒ Object

Sends the given message to the queue

Parameters

  • message - used as JSON or converted into it



141
142
143
144
145
# File 'lib/cloud_powers/synapse/queue/board.rb', line 141

def send_message(message)
  send_queue_message(
    address, (valid_json?(message) ? message : message.to_json), sqs
  )
end