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

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

Overview

The Queue::Board 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

Class Method Summary collapse

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 Helper

#attr_map!, #available_resources, #called_from, #create_logger, #deep_modify_keys_with, #format_error_message, #log_file, #logger, #modify_keys_with, #smart_retry, #task_exist?, #task_home, #task_path, #task_require_path, #to_camel, #to_hyph, #to_i_var, #to_pascal, #to_ruby_file_name, #to_snake, #update_message_body, #valid_json?, #valid_url?

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

#board_name, #build_queue, #delete_queue_message, #get_queue_message_count, #pluck_queue_message, #poll, #queue_exists?, #queue_poller, #queue_search, #send_queue_message

Methods included from AwsResources

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

Methods included from Auth

creds, region

Constructor Details

#initialize(name, this_sqs = sqs) ⇒ Board

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

Parameters

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

Returns Queue::Board



30
31
32
33
# File 'lib/cloud_powers/synapse/queue/board.rb', line 30

def initialize(name, this_sqs = sqs)
  @sqs = this_sqs
  @name = name
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>


52
53
54
# File 'lib/cloud_powers/synapse/queue/board.rb', line 52

def address
  zfind(@name) ||  best_guess_address
end

#nameObject

The name the Aws::SQS::Queue uses



16
17
18
# File 'lib/cloud_powers/synapse/queue/board.rb', line 16

def name
  @name
end

#sqsObject

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



18
19
20
# File 'lib/cloud_powers/synapse/queue/board.rb', line 18

def sqs
  @sqs
end

Class Method Details

.build(name, this_sqs = nil) ⇒ Object

Builds a Queue::Board object and returns it. No API calls are sent using this method. This is handy if you need to use a Queue but you don’t want to create any resources in AWS.

Parameters name String

Returns Queue::Board

Example

exp_board = Board.build('exampleBoard')
puts exp_board.best_guess_address
# => 'https://sqs.us-west-2.amaz.....'


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

def self.build(name, this_sqs = nil)
  new(name, this_sqs)
end

.create!(name, this_sqs = nil) ⇒ Object

Builds then Creates the Object and makes the API call to SQS to create the queue

Parameters

  • name <String>

Returns Queue::Board with an actual Queue in SQS

Example

exp_board = Board.create!('exampleBoard')
queue_search(exp_board.name)
# => ['https://sqs.us-west-2.amazonaws.com/81234567890/exampleBoard']


94
95
96
# File 'lib/cloud_powers/synapse/queue/board.rb', line 94

def self.create!(name, this_sqs = nil)
  build(name, this_sqs).create_queue!
end

Instance Method Details

#best_guess_addressObject

Gives a best guess at the URL that points toward this Board’s Queue. It uses a couple params to build a standard URL for SQS. The only problem with using this last resort is you may need to use a Queue from a different region, account or name but it can be a handy catch-all for the URLs for most cases.

Returns String



63
64
65
# File 'lib/cloud_powers/synapse/queue/board.rb', line 63

def best_guess_address
  "https://sqs.#{zfind(:aws_region)}.amazonaws.com/#{zfind(:account_number)}/#{@name}"
end

#create_queue!Object

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

Returns Queue::Board



102
103
104
105
106
107
108
109
110
# File 'lib/cloud_powers/synapse/queue/board.rb', line 102

def create_queue!
  begin
    sqs.create_queue(queue_name: to_camel(@name))
    self
  rescue Aws::SQS::Errors::QueueDeletedRecently
    sleep 5
    retry
  end
end

#destroy!Object

Deletes an actual Queue from SQS



113
114
115
# File 'lib/cloud_powers/synapse/queue/board.rb', line 113

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

#exists?Boolean

Predicate method to query SQS for the queue

Example

board = Board.build('example')
board.exists?
# => false
board.save!
board.exists?
# => true

Returns:

  • (Boolean)


126
127
128
# File 'lib/cloud_powers/synapse/queue/board.rb', line 126

def exists?
  queue_exists?(@name)
end

#i_varObject

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

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

Example

board = Board.new(:backlog)
Smash.instance_variable_get(board.i_var)
#=> Board <name: :backlog, ...>


43
44
45
# File 'lib/cloud_powers/synapse/queue/board.rb', line 43

def i_var
  "@#{@name}"
end

#message_countObject

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

Returns Integer



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

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



152
153
154
# File 'lib/cloud_powers/synapse/queue/board.rb', line 152

def pluck_message
  pluck_queue_message(@name)
end

#pollerObject

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

Returns Aws::SQS::QueuePoller

Notes

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

production work.



146
147
148
149
# File 'lib/cloud_powers/synapse/queue/board.rb', line 146

def poller
  args = @sqs.nil? ? address : [address, { client: sqs }]
  @poller ||= Aws::SQS::QueuePoller.new(*args)
end

#save!Object

This method creates the queue in SQS for the given Board instance It can be coupled with the #build() method in order to use a queue without making the call to create it on AWS

Example

board = Board.build('example')
board.exists?
# => false
board.save!
board.exists?
# => true


167
168
169
# File 'lib/cloud_powers/synapse/queue/board.rb', line 167

def save!
  create_queue!
end

#send_message(message) ⇒ Object

Sends the given message to the queue

Parameters

  • message - used as JSON or converted into it



175
176
177
178
179
# File 'lib/cloud_powers/synapse/queue/board.rb', line 175

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