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

Inherits:
Resource
  • Object
show all
Includes:
AwsResources, Helpers, Smash::CloudPowers::Storage, 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, #meta, #name, #remote_id, #tags, #type

Instance Method Summary collapse

Methods included from Zenv

#env_vars, #i_vars, #lsof_cwd, #pid, #proc_cwd, #process_search, #project_root, #project_root=, #ps_cwd, #system_vars, #zfind, #zselect

Methods included from Helpers

#create_logger, #log_file, #logger

Methods included from PathHelp

#common_delimiter, #expand_path, #file_exists?, #file_search, #filename?, #job_exist?, #job_path, #job_require_path, #path_search, #paths_gcd, #paths_lcd, #to_path, #to_pathname, #to_realpath, #touch, #zlib_path

Methods included from LogicHelp

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

Methods included from LangHelp

#deep_modify_keys_with, #extract!, #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 Smash::CloudPowers::Storage

#all_storage, #build_storage, #create_storage, #existing_storage, #local_job_file_exists?, #search, #send_logs_to_s3, #source_job, #storage_select

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



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

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>


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

def address
  @address
end

#responseObject (readonly)

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



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

def response
  @response
end

#sqsObject

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



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

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



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

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



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

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)


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

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, ...>


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

def i_var
  to_i_var(@name)
end


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

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



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

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



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

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.



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

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



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

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