cloud_powers 1.0.0 → 1.0.1
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.
- checksums.yaml +4 -4
- data/.ruby-version +1 -1
- data/cloud_powers.gemspec +4 -4
- data/lib/cloud_powers/version.rb +1 -1
- metadata +10 -11
- data/lib/cloud_powers/synapse/queue/queue.rb +0 -282
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 9cc966e1561d2a202cfa35dd2cf3147d4ef2b840
|
|
4
|
+
data.tar.gz: d371b86048fef80382f4bc6cd61a3a4a5a7d16bf
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 2125004e0684f341d86a5c04ad62edeafb44ee8de978a7487518d319594e0ac165296170cdb1930a6e1928814198c9dd67729a9d0ba8cb10d8604a072b94c78a
|
|
7
|
+
data.tar.gz: 8fc1f114aa0be9caedd619e611d3e3014ac31c3f55113b0ba661a50f1b014e3996c711c8a108601673044c0b4aca22307b2f308fae73679119a724de192c2b0d
|
data/.ruby-version
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
2.
|
|
1
|
+
2.4.0
|
data/cloud_powers.gemspec
CHANGED
|
@@ -4,7 +4,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
|
4
4
|
require 'cloud_powers/version'
|
|
5
5
|
|
|
6
6
|
Gem::Specification.new do |spec|
|
|
7
|
-
spec.required_ruby_version = '~> 2.
|
|
7
|
+
spec.required_ruby_version = '~> 2.4.0'
|
|
8
8
|
spec.name = 'cloud_powers'
|
|
9
9
|
spec.version = CloudPowers::VERSION
|
|
10
10
|
spec.authors = ['Adam Phillipps', 'Faisal Irfan', 'Gerardo Parajeles']
|
|
@@ -45,8 +45,8 @@ Gem::Specification.new do |spec|
|
|
|
45
45
|
spec.add_runtime_dependency 'websocket-eventmachine-client'
|
|
46
46
|
spec.add_runtime_dependency 'workflow'
|
|
47
47
|
|
|
48
|
-
spec.add_development_dependency 'bundler', '~> 1.
|
|
48
|
+
spec.add_development_dependency 'bundler', '~> 1.14.3'
|
|
49
49
|
spec.add_development_dependency 'byebug', '~> 9'
|
|
50
|
-
spec.add_development_dependency 'rake', '~>
|
|
51
|
-
spec.add_development_dependency 'rspec', '~> 3.
|
|
50
|
+
spec.add_development_dependency 'rake', '~> 12.0'
|
|
51
|
+
spec.add_development_dependency 'rspec', '~> 3.5'
|
|
52
52
|
end
|
data/lib/cloud_powers/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: cloud_powers
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.0.
|
|
4
|
+
version: 1.0.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Adam Phillipps
|
|
@@ -10,7 +10,7 @@ authors:
|
|
|
10
10
|
autorequire:
|
|
11
11
|
bindir: exe
|
|
12
12
|
cert_chain: []
|
|
13
|
-
date:
|
|
13
|
+
date: 2017-02-08 00:00:00.000000000 Z
|
|
14
14
|
dependencies:
|
|
15
15
|
- !ruby/object:Gem::Dependency
|
|
16
16
|
name: activesupport-core-ext
|
|
@@ -144,14 +144,14 @@ dependencies:
|
|
|
144
144
|
requirements:
|
|
145
145
|
- - "~>"
|
|
146
146
|
- !ruby/object:Gem::Version
|
|
147
|
-
version: 1.
|
|
147
|
+
version: 1.14.3
|
|
148
148
|
type: :development
|
|
149
149
|
prerelease: false
|
|
150
150
|
version_requirements: !ruby/object:Gem::Requirement
|
|
151
151
|
requirements:
|
|
152
152
|
- - "~>"
|
|
153
153
|
- !ruby/object:Gem::Version
|
|
154
|
-
version: 1.
|
|
154
|
+
version: 1.14.3
|
|
155
155
|
- !ruby/object:Gem::Dependency
|
|
156
156
|
name: byebug
|
|
157
157
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -172,28 +172,28 @@ dependencies:
|
|
|
172
172
|
requirements:
|
|
173
173
|
- - "~>"
|
|
174
174
|
- !ruby/object:Gem::Version
|
|
175
|
-
version: '
|
|
175
|
+
version: '12.0'
|
|
176
176
|
type: :development
|
|
177
177
|
prerelease: false
|
|
178
178
|
version_requirements: !ruby/object:Gem::Requirement
|
|
179
179
|
requirements:
|
|
180
180
|
- - "~>"
|
|
181
181
|
- !ruby/object:Gem::Version
|
|
182
|
-
version: '
|
|
182
|
+
version: '12.0'
|
|
183
183
|
- !ruby/object:Gem::Dependency
|
|
184
184
|
name: rspec
|
|
185
185
|
requirement: !ruby/object:Gem::Requirement
|
|
186
186
|
requirements:
|
|
187
187
|
- - "~>"
|
|
188
188
|
- !ruby/object:Gem::Version
|
|
189
|
-
version: '3.
|
|
189
|
+
version: '3.5'
|
|
190
190
|
type: :development
|
|
191
191
|
prerelease: false
|
|
192
192
|
version_requirements: !ruby/object:Gem::Requirement
|
|
193
193
|
requirements:
|
|
194
194
|
- - "~>"
|
|
195
195
|
- !ruby/object:Gem::Version
|
|
196
|
-
version: '3.
|
|
196
|
+
version: '3.5'
|
|
197
197
|
description: |2
|
|
198
198
|
CloudPowers is a wrapper around AWS and in the future, other cloud service Providers.
|
|
199
199
|
It was developed specifically for the Brain project but hopefully can be used
|
|
@@ -256,7 +256,6 @@ files:
|
|
|
256
256
|
- lib/cloud_powers/synapse/queue.rb
|
|
257
257
|
- lib/cloud_powers/synapse/queue/board.rb
|
|
258
258
|
- lib/cloud_powers/synapse/queue/poller.rb
|
|
259
|
-
- lib/cloud_powers/synapse/queue/queue.rb
|
|
260
259
|
- lib/cloud_powers/synapse/synapse.rb
|
|
261
260
|
- lib/cloud_powers/synapse/web_soc.rb
|
|
262
261
|
- lib/cloud_powers/synapse/web_soc/soc_client.rb
|
|
@@ -275,7 +274,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
275
274
|
requirements:
|
|
276
275
|
- - "~>"
|
|
277
276
|
- !ruby/object:Gem::Version
|
|
278
|
-
version: 2.
|
|
277
|
+
version: 2.4.0
|
|
279
278
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
280
279
|
requirements:
|
|
281
280
|
- - ">="
|
|
@@ -283,7 +282,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
283
282
|
version: '0'
|
|
284
283
|
requirements: []
|
|
285
284
|
rubyforge_project:
|
|
286
|
-
rubygems_version: 2.
|
|
285
|
+
rubygems_version: 2.6.8
|
|
287
286
|
signing_key:
|
|
288
287
|
specification_version: 4
|
|
289
288
|
summary: Cloud providers wrapper. Currently only AWS is supported.
|
|
@@ -1,282 +0,0 @@
|
|
|
1
|
-
require 'uri'
|
|
2
|
-
require_relative 'board'
|
|
3
|
-
|
|
4
|
-
module Smash
|
|
5
|
-
module CloudPowers
|
|
6
|
-
module Synapse
|
|
7
|
-
module Queue
|
|
8
|
-
include Smash::CloudPowers::AwsResources
|
|
9
|
-
include Smash::CloudPowers::Helper
|
|
10
|
-
|
|
11
|
-
# A simple Struct that acts as a Name to URL map
|
|
12
|
-
#
|
|
13
|
-
# Parameters
|
|
14
|
-
# * :set_name +String+ (optional) - An optional name. It should be the same name as the
|
|
15
|
-
# the Board and/or Queue you're working with, or else this Struct isn't that useful
|
|
16
|
-
# * :set_url +String+ (optional) - An optional URL. It should be the same URL as the
|
|
17
|
-
# the Board and/or Queue you're working with, or else this Struct isn't that useful
|
|
18
|
-
#
|
|
19
|
-
# Attributes
|
|
20
|
-
# * name +String+ - the +:set_name+ or parse the +#address()+ for the name
|
|
21
|
-
# * url +String+ - the +:set_url+ or add the name to the end of a best guess at the URL
|
|
22
|
-
#
|
|
23
|
-
# Example
|
|
24
|
-
# name_url_map = NUMap.new(nil, 'https://sqs.us-west-53.amazonaws.com/001101010010/fooBar')
|
|
25
|
-
# name_url_map.name
|
|
26
|
-
# # => 'fooBar'
|
|
27
|
-
#
|
|
28
|
-
# # and now in reverse
|
|
29
|
-
# url_name_map = NUMap.new('snargleBargle')
|
|
30
|
-
# url_name_map.address
|
|
31
|
-
# # => 'https://sqs.us-west-53.amazonaws.com/001101010010/snargleBargle'
|
|
32
|
-
NUMap = Struct.new(:set_name, :set_url) do
|
|
33
|
-
# Gives you back the name, even if it hasn't been set
|
|
34
|
-
#
|
|
35
|
-
# Returns
|
|
36
|
-
# +String+
|
|
37
|
-
def name
|
|
38
|
-
set_name || url.split('/').last # Queue names are last in the URL path
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
# Gives you back the URL, even if it hasn't been set
|
|
42
|
-
#
|
|
43
|
-
# Returns
|
|
44
|
-
# +String+
|
|
45
|
-
def url
|
|
46
|
-
set_url || Smash::CloudPowers::Queue::Board.new(name).best_guess_address
|
|
47
|
-
end
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
# This method can be used to parse a queue name from its address. It can be handy if you need the name
|
|
51
|
-
# of a queue but you don't want the overhead of creating a Board object.
|
|
52
|
-
#
|
|
53
|
-
# Parameters
|
|
54
|
-
# * url +String+
|
|
55
|
-
#
|
|
56
|
-
# Returns
|
|
57
|
-
# +String+
|
|
58
|
-
#
|
|
59
|
-
# Example
|
|
60
|
-
# board_name('https://sqs.us-west-53.amazonaws.com/001101010010/fooBar')
|
|
61
|
-
# => fooBar
|
|
62
|
-
def board_name(url)
|
|
63
|
-
url.to_s.split('/').last
|
|
64
|
-
end
|
|
65
|
-
|
|
66
|
-
# This method builds a Queue::Board object for you to use but doesn't
|
|
67
|
-
# invoke the <tt>#create!()</tt> method, so no API call is made to create the Queue
|
|
68
|
-
# on SQS. This can be used if the Board and/or Queue already exists.
|
|
69
|
-
#
|
|
70
|
-
# Parameters
|
|
71
|
-
# * name +String+ - name of the Queue you want to interact with
|
|
72
|
-
#
|
|
73
|
-
# Returns
|
|
74
|
-
# Queue::Board
|
|
75
|
-
#
|
|
76
|
-
# Example
|
|
77
|
-
# queue_object = build_queue('exampleQueue')
|
|
78
|
-
# queue_object.address
|
|
79
|
-
# => https://sqs.us-west-2.amazonaws.com/81234567/exampleQueue
|
|
80
|
-
def build_queue(name)
|
|
81
|
-
Smash::CloudPowers::Queue::Board.build(to_camel(name), sqs)
|
|
82
|
-
end
|
|
83
|
-
|
|
84
|
-
# This method allows you to create a queue on SQS without explicitly creating a Board object
|
|
85
|
-
#
|
|
86
|
-
# Parameters
|
|
87
|
-
# * name +String+ - The name of the Queue to be created
|
|
88
|
-
#
|
|
89
|
-
# Returns
|
|
90
|
-
# Queue::Board
|
|
91
|
-
#
|
|
92
|
-
# Example
|
|
93
|
-
# create_queue('exampleQueue')
|
|
94
|
-
# get_queue_message_count
|
|
95
|
-
def create_queue!(name)
|
|
96
|
-
begin
|
|
97
|
-
Smash::CloudPowers::Queue::Board.create!(to_camel(name), sqs)
|
|
98
|
-
rescue Aws::SQS::Errors::QueueDeletedRecently
|
|
99
|
-
sleep 5
|
|
100
|
-
retry
|
|
101
|
-
end
|
|
102
|
-
end
|
|
103
|
-
|
|
104
|
-
# Deletes a queue message without caring about reading/interacting with the message.
|
|
105
|
-
# This is usually used for progress tracking, ie; a Neuron takes a message from the Backlog, moves it to
|
|
106
|
-
# WIP and deletes it from Backlog. Then repeats these steps for the remaining States in the Workflow
|
|
107
|
-
#
|
|
108
|
-
# Parameters
|
|
109
|
-
# * queue +String+ - queue is the name of the +Queue+ to interact with
|
|
110
|
-
# * opts +Hash+ (optional) - a configuration +Hash+ for the +SQS::QueuePoller+
|
|
111
|
-
#
|
|
112
|
-
# Notes
|
|
113
|
-
# * throws :stop_polling after the message is deleted
|
|
114
|
-
#
|
|
115
|
-
# Example
|
|
116
|
-
# get_queue_message_count('exampleQueue')
|
|
117
|
-
# # => n
|
|
118
|
-
# delete_queue_message('exampleQueue')
|
|
119
|
-
# get_queue_message_count('exampleQueue')
|
|
120
|
-
# # => n-1
|
|
121
|
-
def delete_queue_message(queue, opts = {})
|
|
122
|
-
poll(queue, opts) do |msg, stats|
|
|
123
|
-
poller(queue).delete_message(msg)
|
|
124
|
-
throw :stop_polling
|
|
125
|
-
end
|
|
126
|
-
end
|
|
127
|
-
|
|
128
|
-
# This method is used to get the approximate count of messages in a given queue
|
|
129
|
-
#
|
|
130
|
-
# Parameters
|
|
131
|
-
# * board_url +String+ - the URL for the board you need to get a count from
|
|
132
|
-
#
|
|
133
|
-
# Returns
|
|
134
|
-
# +Float+
|
|
135
|
-
#
|
|
136
|
-
# Example
|
|
137
|
-
# get_queue_message_count('exampleQueue')
|
|
138
|
-
# # => n
|
|
139
|
-
# delete_queue_message('exampleQueue')
|
|
140
|
-
# get_queue_message_count('exampleQueue')
|
|
141
|
-
# # => n-1
|
|
142
|
-
def get_queue_message_count(board_url)
|
|
143
|
-
sqs.get_queue_attributes(
|
|
144
|
-
queue_url: board_url,
|
|
145
|
-
attribute_names: ['ApproximateNumberOfMessages']
|
|
146
|
-
).attributes['ApproximateNumberOfMessages'].to_f
|
|
147
|
-
end
|
|
148
|
-
|
|
149
|
-
# Get a message from a Queue
|
|
150
|
-
#
|
|
151
|
-
# Parameters
|
|
152
|
-
# * board<String|symbol>: The name of the board
|
|
153
|
-
#
|
|
154
|
-
# Returns
|
|
155
|
-
# * +String+ if +msg.body+ is not valid JSON
|
|
156
|
-
# * +Hash+ if +msg.body+ is valid JSON
|
|
157
|
-
#
|
|
158
|
-
# Example
|
|
159
|
-
# # msg.body == 'Hey' # +String+
|
|
160
|
-
# pluck_queue_message('exampleQueue')
|
|
161
|
-
# # => 'Hey' # +String+
|
|
162
|
-
#
|
|
163
|
-
# # msg.body == "\{"tally":"ho"\}" # +JSON+
|
|
164
|
-
# pluck_queue_message('exampleQueue')
|
|
165
|
-
# # => { 'tally' => 'ho' } # +Hash+
|
|
166
|
-
def pluck_queue_message(board)
|
|
167
|
-
poll(board) do |msg, poller|
|
|
168
|
-
poller.delete_message(msg)
|
|
169
|
-
return valid_json?(msg.body) ? JSON.parse(msg.body) : msg.body
|
|
170
|
-
end
|
|
171
|
-
end
|
|
172
|
-
|
|
173
|
-
# Polls the given board with the given options hash and a block that interacts with
|
|
174
|
-
# the message that is retrieved from the queue
|
|
175
|
-
#
|
|
176
|
-
# Parameters
|
|
177
|
-
# * +board+ +String+ - the name of the queue you want to poll
|
|
178
|
-
# * +opts+ +Hash+ - costomizes the Aws::SQS::QueuePoller's <tt>#poll(<b>opts</b>)</tt> method
|
|
179
|
-
# and can have any +AWS::SQS:QueuePoller+ polling configuration option(s)
|
|
180
|
-
# * +block+ is the block that is used to interact with the message that was retrieved
|
|
181
|
-
#
|
|
182
|
-
# Returns
|
|
183
|
-
# the results from the +message+ and the +block+ that interacts with the +message(s)+
|
|
184
|
-
#
|
|
185
|
-
# Example
|
|
186
|
-
# # continuously run jobs from messages in the Queue and leaves the message in the queue
|
|
187
|
-
# # using the +:skip_delete+ parameter
|
|
188
|
-
# poll(:backlog, :skip_delete) do |msg|
|
|
189
|
-
# demo_job = Job.new(msg.body)
|
|
190
|
-
# demo_job.run
|
|
191
|
-
# end
|
|
192
|
-
def poll(board_name, opts = {})
|
|
193
|
-
this_poller = queue_poller(board_name)
|
|
194
|
-
results = nil
|
|
195
|
-
this_poller.poll(opts) do |msg|
|
|
196
|
-
results = yield msg, this_poller if block_given?
|
|
197
|
-
this_poller.delete_message(msg)
|
|
198
|
-
throw :stop_polling
|
|
199
|
-
end
|
|
200
|
-
results
|
|
201
|
-
end
|
|
202
|
-
|
|
203
|
-
# This method can be used to gain a SQS::QueuePoller. It creates a Board object,
|
|
204
|
-
# the Board then sends the API call to SQS to create the queue and sets an instance
|
|
205
|
-
# variable, using the board's name, to the Board object itself
|
|
206
|
-
#
|
|
207
|
-
# Parameters
|
|
208
|
-
# * board_name +String+ - name of the Queue you want to gain a QueuePoller for
|
|
209
|
-
#
|
|
210
|
-
# Returns
|
|
211
|
-
# <tt>board_name:Queue::Board</tt>
|
|
212
|
-
#
|
|
213
|
-
# Notes
|
|
214
|
-
# * An instance variable is set with this method, if one doesn't exist for the board
|
|
215
|
-
# The instance variable that is created/used is named the same name that was given as
|
|
216
|
-
# a parameter.
|
|
217
|
-
#
|
|
218
|
-
# Example
|
|
219
|
-
# # these are equivalent after @exp_queue_poller is set but before it is set,
|
|
220
|
-
# # exp_queue_poller
|
|
221
|
-
# queue_poller('exampleQueue').poll { |msg| Job.new(msg.body).run }
|
|
222
|
-
# @example_queue.poll { |msg| Job.new(msg.body).run }
|
|
223
|
-
def queue_poller(board_name)
|
|
224
|
-
board = Smash::CloudPowers::Queue::Board.create!(board_name, sqs)
|
|
225
|
-
|
|
226
|
-
unless instance_variable_defined?(board.i_var)
|
|
227
|
-
instance_variable_set(board.i_var, board)
|
|
228
|
-
end
|
|
229
|
-
instance_variable_get(board.i_var).poller
|
|
230
|
-
end
|
|
231
|
-
|
|
232
|
-
# Checks SQS for the existence of this queue using the <tt>#queue_search()</tt> method
|
|
233
|
-
#
|
|
234
|
-
# Parameters
|
|
235
|
-
# * name +String+
|
|
236
|
-
#
|
|
237
|
-
# Returns
|
|
238
|
-
# Boolean
|
|
239
|
-
#
|
|
240
|
-
# Notes
|
|
241
|
-
# * see <tt>#queue_search()</tt>
|
|
242
|
-
def queue_exists?(name)
|
|
243
|
-
!queue_search(name).empty?
|
|
244
|
-
end
|
|
245
|
-
|
|
246
|
-
# Searches for a queue based on the name
|
|
247
|
-
#
|
|
248
|
-
# Parameters
|
|
249
|
-
# name +String+
|
|
250
|
-
#
|
|
251
|
-
# Returns
|
|
252
|
-
# queue_urls +String+
|
|
253
|
-
#
|
|
254
|
-
# Example
|
|
255
|
-
# results = queue_search('exampleQueue') # returns related URLs
|
|
256
|
-
# results.first =~ /exampleQueue/ # regex match against the URL
|
|
257
|
-
def queue_search(name)
|
|
258
|
-
sqs.list_queues(queue_name_prefix: name).queue_urls
|
|
259
|
-
end
|
|
260
|
-
|
|
261
|
-
# Sends a given message to a given queue
|
|
262
|
-
#
|
|
263
|
-
# Parameters
|
|
264
|
-
# * address +String+ - address of the Queue you want to interact with
|
|
265
|
-
# * message +String+ - message to be sent
|
|
266
|
-
#
|
|
267
|
-
# Returns
|
|
268
|
-
# <tt>Array<String></tt> - Array of URLs
|
|
269
|
-
#
|
|
270
|
-
# Example
|
|
271
|
-
# legit_address = 'https://sqs.us-west-2.amazonaws.com/12345678/exampleQueue'
|
|
272
|
-
# random_message = 'Wowza, this is pretty easy.'
|
|
273
|
-
# resp = send_queue_message(legit_address, random_message))
|
|
274
|
-
# resp.message_id
|
|
275
|
-
# => 'some message id'
|
|
276
|
-
def send_queue_message(address, message, this_sqs = sqs)
|
|
277
|
-
this_sqs.send_message(queue_url: address, message_body: message)
|
|
278
|
-
end
|
|
279
|
-
end
|
|
280
|
-
end
|
|
281
|
-
end
|
|
282
|
-
end
|