cloud_powers 1.0.0 → 1.0.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|