ebx_deliver 0.0.1 → 0.0.2
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 +8 -8
- data/Gemfile.lock +2 -0
- data/bin/ebx_db_listen +9 -0
- data/ebx_deliver.gemspec +2 -1
- data/lib/dynamoid/adapter/aws_multi_region_adapter.rb +6 -270
- data/lib/ebx_deliver.rb +4 -1
- data/lib/ebx_deliver/aws_config.rb +16 -0
- data/lib/ebx_deliver/aws_sqs_reader.rb +23 -41
- data/lib/ebx_deliver/version.rb +1 -1
- data/lib/ebx_deliver/writer/client.rb +46 -0
- data/lib/ebx_deliver/writer/sns_handler.rb +60 -0
- metadata +22 -4
- data/lib/ebx_deliver/aws_sns_writer.rb +0 -100
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
YmQ1ODEyZTM5ZDUzNGIwZmZhNTNjYzM3YTUxOTYzNTFhNDdiZDYyOQ==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
NWU2ZTNkOGM0Y2FkM2M2ZmYyMzEzNzQ1MDAxOWQ4NDlhMzZkYzY2OA==
|
7
7
|
!binary "U0hBNTEy":
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
NjBkYjY4MGVjNGJiMDc5MmJjZTFlMzI4MjlmYWMyNjE0MGFkN2JkYTgwM2Y1
|
10
|
+
ZDc0YzA4YzhlZmUwMjcxOTgzNzU0MmJlYWI3MzA3ZDMxM2Y5Mzk4ZDYyNWRm
|
11
|
+
MWE1MGU4Y2U3NDBkNjU0ZGEwN2VjNDFhMWZhYTcyMjY1NGQ5ODE=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
ZjZkYzg0MzcwNjM4ZTc0YzE3ZmE4OGYyZDhkMjY3OGUwYTZmODU2ZmQ0ZmI2
|
14
|
+
ZGFjZjMwNTkzMTAyZDMzYTU2NzcxMmZlNTc3ZjFmNjI5MDVmN2QxMjhhZWY2
|
15
|
+
ZWU2MWZlZmMwOTVlZmFhOWMwMDc4MjA5MDk4OGRiMTU5MjBlYmI=
|
data/Gemfile.lock
CHANGED
@@ -3,6 +3,7 @@ PATH
|
|
3
3
|
specs:
|
4
4
|
ebx_deliver (0.0.1)
|
5
5
|
aws-sdk (~> 1.17.0)
|
6
|
+
daemons (~> 1.1.9)
|
6
7
|
dynamoid (~> 0.7.1)
|
7
8
|
pry (> 0)
|
8
9
|
|
@@ -25,6 +26,7 @@ GEM
|
|
25
26
|
uuidtools (~> 2.1)
|
26
27
|
builder (3.1.4)
|
27
28
|
coderay (1.0.9)
|
29
|
+
daemons (1.1.9)
|
28
30
|
dynamoid (0.7.1)
|
29
31
|
activemodel
|
30
32
|
aws-sdk
|
data/bin/ebx_db_listen
ADDED
data/ebx_deliver.gemspec
CHANGED
@@ -14,13 +14,14 @@ Gem::Specification.new do |spec|
|
|
14
14
|
spec.license = "MIT"
|
15
15
|
|
16
16
|
spec.files = `git ls-files`.split($/)
|
17
|
-
spec.executables = []
|
17
|
+
spec.executables = ['ebx_db_listen']
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
|
21
21
|
spec.add_development_dependency "bundler", "~> 1.3"
|
22
22
|
spec.add_development_dependency "rake"
|
23
23
|
|
24
|
+
spec.add_runtime_dependency("daemons", "~> 1.1.9")
|
24
25
|
spec.add_runtime_dependency("dynamoid", "~> 0.7.1")
|
25
26
|
spec.add_runtime_dependency("aws-sdk", "~> 1.17.0")
|
26
27
|
spec.add_runtime_dependency("pry", "> 0")
|
@@ -1,281 +1,17 @@
|
|
1
|
+
require 'dynamoid/adapter/aws_sdk'
|
2
|
+
|
1
3
|
module Dynamoid
|
2
4
|
module Adapter
|
3
5
|
module AwsMultiRegionAdapter
|
4
|
-
extend
|
5
|
-
@@connection = nil
|
6
|
+
extend Dynamoid::Adapter::AwsSdk
|
6
7
|
|
7
|
-
|
8
|
-
|
9
|
-
# @return [AWS::DynamoDB::Connection] the raw DynamoDB connection
|
10
|
-
# Call DynamoDB new, with no parameters.
|
11
|
-
# Make sure the aws.yml file or aws.rb file, refer the link for more details.
|
12
|
-
#https://github.com/amazonwebservices/aws-sdk-for-ruby
|
13
|
-
# 1. Create config/aws.yml as follows:
|
14
|
-
# Fill in your AWS Access Key ID and Secret Access Key
|
15
|
-
# http://aws.amazon.com/security-credentials
|
16
|
-
#access_key_id: REPLACE_WITH_ACCESS_KEY_ID
|
17
|
-
#secret_access_key: REPLACE_WITH_SECRET_ACCESS_KEY
|
18
|
-
#(or)
|
19
|
-
#2, Create config/initializers/aws.rb as follows:
|
20
|
-
# load the libraries
|
21
|
-
#require 'aws'
|
22
|
-
# log requests using the default rails logger
|
23
|
-
#AWS.config(:logger => Rails.logger)
|
24
|
-
# load credentials from a file
|
25
|
-
#config_path = File.expand_path(File.dirname(__FILE__)+"/../aws.yml")
|
26
|
-
#AWS.config(YAML.load(File.read(config_path)))
|
27
|
-
#Additionally include any of the dynamodb paramters as needed
|
28
|
-
#(eg: if you would like to change the dynamodb endpoint, then add the parameter in
|
29
|
-
# the following paramter in the file aws.yml or aws.rb
|
30
|
-
# dynamo_db_endpoint : dynamodb.ap-southeast-1.amazonaws.com)
|
31
|
-
# @since 0.2.0
|
32
|
-
def connect!
|
33
|
-
@@connection = ::EbxDeliver::AwsSnsWriter.new
|
8
|
+
def self.connect!
|
9
|
+
@@connection = AWS::DynamoDB.new(config: EbxDeliver::AwsConfig.new)
|
34
10
|
end
|
35
11
|
|
36
|
-
|
37
|
-
#
|
38
|
-
# @return [AWS::DynamoDB::Connection] the raw DynamoDB connection
|
39
|
-
#
|
40
|
-
# @since 0.2.0
|
41
|
-
def connection
|
12
|
+
def self.connection
|
42
13
|
@@connection
|
43
14
|
end
|
44
|
-
|
45
|
-
# Get many items at once from DynamoDB. More efficient than getting each item individually.
|
46
|
-
#
|
47
|
-
# @example Retrieve IDs 1 and 2 from the table testtable
|
48
|
-
# Dynamoid::Adapter::AwsSdk.batch_get_item({'table1' => ['1', '2']}, :consistent_read => true)
|
49
|
-
#
|
50
|
-
# @param [Hash] table_ids the hash of tables and IDs to retrieve
|
51
|
-
# @param [Hash] options to be passed to underlying BatchGet call
|
52
|
-
#
|
53
|
-
# @return [Hash] a hash where keys are the table names and the values are the retrieved items
|
54
|
-
#
|
55
|
-
# @since 0.2.0
|
56
|
-
def batch_get_item(table_ids, options = {})
|
57
|
-
binding.pry
|
58
|
-
connection.batch_get do |batch|
|
59
|
-
table_ids.each do |table, keys|
|
60
|
-
batch.table(table, :all, keys)
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
#return hash if table_ids.all?{|k, v| v.empty?}
|
67
|
-
#table_ids.each do |t, ids|
|
68
|
-
# Array(ids).in_groups_of(100, false) do |group|
|
69
|
-
# batch = AWS::DynamoDB::BatchGet.new(:config => @@connection.config)
|
70
|
-
# batch.table(t, :all, Array(group), options) unless group.nil? || group.empty?
|
71
|
-
# batch.each do |table_name, attributes|
|
72
|
-
# hash[table_name] << attributes.symbolize_keys!
|
73
|
-
# end
|
74
|
-
# end
|
75
|
-
#end
|
76
|
-
#hash
|
77
|
-
end
|
78
|
-
|
79
|
-
# Delete many items at once from DynamoDB. More efficient than delete each item individually.
|
80
|
-
#
|
81
|
-
# @example Delete IDs 1 and 2 from the table testtable
|
82
|
-
# Dynamoid::Adapter::AwsSdk.batch_delete_item('table1' => ['1', '2'])
|
83
|
-
#or
|
84
|
-
# Dynamoid::Adapter::AwsSdk.batch_delete_item('table1' => [['hk1', 'rk2'], ['hk1', 'rk2']]]))
|
85
|
-
#
|
86
|
-
# @param [Hash] options the hash of tables and IDs to delete
|
87
|
-
#
|
88
|
-
# @return nil
|
89
|
-
#
|
90
|
-
def batch_delete_item(options)
|
91
|
-
return nil if options.all?{|k, v| v.empty?}
|
92
|
-
options.each do |t, ids|
|
93
|
-
Array(ids).in_groups_of(25, false) do |group|
|
94
|
-
batch = AWS::DynamoDB::BatchWrite.new(:config => @@connection.config)
|
95
|
-
batch.delete(t,group)
|
96
|
-
batch.process!
|
97
|
-
end
|
98
|
-
end
|
99
|
-
nil
|
100
|
-
end
|
101
|
-
|
102
|
-
# Create a table on DynamoDB. This usually takes a long time to complete.
|
103
|
-
#
|
104
|
-
# @param [String] table_name the name of the table to create
|
105
|
-
# @param [Symbol] key the table's primary key (defaults to :id)
|
106
|
-
# @param [Hash] options provide a range_key here if you want one for the table
|
107
|
-
#
|
108
|
-
# @since 0.2.0
|
109
|
-
def create_table(table_name, key = :id, options = {})
|
110
|
-
Dynamoid.logger.info "Creating #{table_name} table. This could take a while."
|
111
|
-
options[:hash_key] ||= {key.to_sym => :string}
|
112
|
-
read_capacity = options[:read_capacity] || Dynamoid::Config.read_capacity
|
113
|
-
write_capacity = options[:write_capacity] || Dynamoid::Config.write_capacity
|
114
|
-
table = @@connection.tables.create(table_name, read_capacity, write_capacity, options)
|
115
|
-
sleep 0.5 while table.status == :creating
|
116
|
-
return table
|
117
|
-
end
|
118
|
-
|
119
|
-
# Removes an item from DynamoDB.
|
120
|
-
#
|
121
|
-
# @param [String] table_name the name of the table
|
122
|
-
# @param [String] key the hash key of the item to delete
|
123
|
-
# @param [Number] range_key the range key of the item to delete, required if the table has a composite key
|
124
|
-
#
|
125
|
-
# @since 0.2.0
|
126
|
-
def delete_item(table_name, key, options = {})
|
127
|
-
range_key = options.delete(:range_key)
|
128
|
-
table = get_table(table_name)
|
129
|
-
result = table.items.at(key, range_key)
|
130
|
-
result.delete unless result.attributes.to_h.empty?
|
131
|
-
true
|
132
|
-
end
|
133
|
-
|
134
|
-
# Deletes an entire table from DynamoDB. Only 10 tables can be in the deleting state at once,
|
135
|
-
# so if you have more this method may raise an exception.
|
136
|
-
#
|
137
|
-
# @param [String] table_name the name of the table to destroy
|
138
|
-
#
|
139
|
-
# @since 0.2.0
|
140
|
-
def delete_table(table_name)
|
141
|
-
Dynamoid.logger.info "Deleting #{table_name} table. This could take a while."
|
142
|
-
table = @@connection.tables[table_name]
|
143
|
-
table.delete
|
144
|
-
sleep 0.5 while table.exists? == true
|
145
|
-
end
|
146
|
-
|
147
|
-
# @todo Add a DescribeTable method.
|
148
|
-
|
149
|
-
# Fetches an item from DynamoDB.
|
150
|
-
#
|
151
|
-
# @param [String] table_name the name of the table
|
152
|
-
# @param [String] key the hash key of the item to find
|
153
|
-
# @param [Number] range_key the range key of the item to find, required if the table has a composite key
|
154
|
-
#
|
155
|
-
# @return [Hash] a hash representing the raw item in DynamoDB
|
156
|
-
#
|
157
|
-
# @since 0.2.0
|
158
|
-
def get_item(table_name, key, options = {})
|
159
|
-
range_key = options.delete(:range_key)
|
160
|
-
table = get_table(table_name)
|
161
|
-
|
162
|
-
result = table.items.at(key, range_key).attributes.to_h(options)
|
163
|
-
|
164
|
-
if result.empty?
|
165
|
-
nil
|
166
|
-
else
|
167
|
-
result.symbolize_keys!
|
168
|
-
end
|
169
|
-
end
|
170
|
-
|
171
|
-
def update_item(table_name, key, options = {}, &block)
|
172
|
-
range_key = options.delete(:range_key)
|
173
|
-
conditions = options.delete(:conditions) || {}
|
174
|
-
table = get_table(table_name)
|
175
|
-
item = table.items.at(key, range_key)
|
176
|
-
item.attributes.update(conditions.merge(:return => :all_new), &block)
|
177
|
-
rescue AWS::DynamoDB::Errors::ConditionalCheckFailedException
|
178
|
-
raise Dynamoid::Errors::ConditionalCheckFailedException
|
179
|
-
end
|
180
|
-
|
181
|
-
# List all tables on DynamoDB.
|
182
|
-
#
|
183
|
-
# @since 0.2.0
|
184
|
-
def list_tables
|
185
|
-
connection.db.tables.collect(&:name)
|
186
|
-
end
|
187
|
-
|
188
|
-
# Persists an item on DynamoDB.
|
189
|
-
#
|
190
|
-
# @param [String] table_name the name of the table
|
191
|
-
# @param [Object] object a hash or Dynamoid object to persist
|
192
|
-
#
|
193
|
-
# @since 0.2.0
|
194
|
-
def put_item(table_name, object, options = nil)
|
195
|
-
connection.put_item(table_name, object, options)
|
196
|
-
end
|
197
|
-
|
198
|
-
# Query the DynamoDB table. This employs DynamoDB's indexes so is generally faster than scanning, but is
|
199
|
-
# only really useful for range queries, since it can only find by one hash key at once. Only provide
|
200
|
-
# one range key to the hash.
|
201
|
-
#
|
202
|
-
# @param [String] table_name the name of the table
|
203
|
-
# @param [Hash] opts the options to query the table with
|
204
|
-
# @option opts [String] :hash_value the value of the hash key to find
|
205
|
-
# @option opts [Range] :range_value find the range key within this range
|
206
|
-
# @option opts [Number] :range_greater_than find range keys greater than this
|
207
|
-
# @option opts [Number] :range_less_than find range keys less than this
|
208
|
-
# @option opts [Number] :range_gte find range keys greater than or equal to this
|
209
|
-
# @option opts [Number] :range_lte find range keys less than or equal to this
|
210
|
-
#
|
211
|
-
# @return [Enumerator] an iterator of all matching items
|
212
|
-
#
|
213
|
-
# @since 0.2.0
|
214
|
-
def query(table_name, opts = {})
|
215
|
-
table = get_table(table_name)
|
216
|
-
|
217
|
-
Enumerator.new do |yielder|
|
218
|
-
consistent_opts = { :consistent_read => opts[:consistent_read] || false }
|
219
|
-
if table.composite_key?
|
220
|
-
table.items.query(opts).each do |data|
|
221
|
-
if opts.has_key? :select
|
222
|
-
yielder.yield data.attributes.symbolize_keys!
|
223
|
-
else
|
224
|
-
yielder.yield data.attributes.to_h(consistent_opts).symbolize_keys!
|
225
|
-
end
|
226
|
-
end
|
227
|
-
else
|
228
|
-
yielder.yield get_item(table_name, opts[:hash_value])
|
229
|
-
end
|
230
|
-
end
|
231
|
-
end
|
232
|
-
|
233
|
-
# Scan the DynamoDB table. This is usually a very slow operation as it naively filters all data on
|
234
|
-
# the DynamoDB servers.
|
235
|
-
#
|
236
|
-
# @param [String] table_name the name of the table
|
237
|
-
# @param [Hash] scan_hash a hash of attributes: matching records will be returned by the scan
|
238
|
-
#
|
239
|
-
# @return [Enumerator] an iterator of all matching items
|
240
|
-
#
|
241
|
-
# @since 0.2.0
|
242
|
-
def scan(table_name, scan_hash, select_opts)
|
243
|
-
table = get_table(table_name)
|
244
|
-
Enumerator.new do |yielder|
|
245
|
-
table.items.where(scan_hash).select(select_opts).each do |data|
|
246
|
-
yielder.yield data.attributes.symbolize_keys!
|
247
|
-
end
|
248
|
-
end
|
249
|
-
end
|
250
|
-
|
251
|
-
# @todo Add an UpdateItem method.
|
252
|
-
|
253
|
-
# @todo Add an UpdateTable method.
|
254
|
-
|
255
|
-
def get_table(table_name)
|
256
|
-
unless table = table_cache[table_name]
|
257
|
-
table = @@connection.db.tables[table_name]
|
258
|
-
table.load_schema
|
259
|
-
table_cache[table_name] = table
|
260
|
-
end
|
261
|
-
table
|
262
|
-
end
|
263
|
-
|
264
|
-
def table_cache
|
265
|
-
@table_cache ||= {}
|
266
|
-
end
|
267
|
-
|
268
|
-
# Number of items from a table
|
269
|
-
#
|
270
|
-
# @param [String] table_name the name of the table
|
271
|
-
#
|
272
|
-
# @return [Integer] the number of items from a table
|
273
|
-
#
|
274
|
-
# @since 0.6.1
|
275
|
-
def count(table_name)
|
276
|
-
table = get_table(table_name)
|
277
|
-
table.items.count
|
278
|
-
end
|
279
15
|
end
|
280
16
|
end
|
281
17
|
end
|
data/lib/ebx_deliver.rb
CHANGED
@@ -4,7 +4,10 @@ require 'pry'
|
|
4
4
|
|
5
5
|
require 'ebx_deliver/version'
|
6
6
|
require 'dynamoid/adapter/aws_multi_region_adapter'
|
7
|
-
require 'ebx_deliver/
|
7
|
+
require 'ebx_deliver/writer/client'
|
8
|
+
require 'ebx_deliver/writer/sns_handler'
|
9
|
+
require 'ebx_deliver/aws_sqs_reader'
|
10
|
+
require 'ebx_deliver/aws_config'
|
8
11
|
|
9
12
|
module EbxDeliver
|
10
13
|
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module EbxDeliver
|
2
|
+
class AwsConfig < AWS::Core::Configuration
|
3
|
+
|
4
|
+
def self.accepted_options
|
5
|
+
self.superclass.accepted_options
|
6
|
+
end
|
7
|
+
|
8
|
+
def initialize(options = {})
|
9
|
+
super(options.merge(AWS.config.supplied))
|
10
|
+
end
|
11
|
+
|
12
|
+
def dynamo_db_client
|
13
|
+
Writer::Client::V20111205.new(config: self)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -1,55 +1,37 @@
|
|
1
1
|
module EbxDeliver
|
2
2
|
class AwsSqsReader
|
3
|
-
def connect!
|
4
|
-
# TODO pull name from settings
|
5
|
-
@queue = sqs.queues.named('development-sns')
|
6
3
|
|
4
|
+
def initialize
|
5
|
+
# TODO pull name from settings
|
6
|
+
@queue = AWS.sqs.queues.named('write-development-sqs')
|
7
7
|
@db = AWS::DynamoDB.new
|
8
|
-
|
9
|
-
@queue.poll do |notification|
|
10
|
-
msg = JSON.parse(JSON.parse(notification.body)['Message'])
|
11
|
-
Rails.logger.info "MSG Received #{msg}"
|
12
|
-
send(msg['method'], *msg['args'])
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
def create_table(options)
|
17
|
-
@db.client.create_table(options)
|
18
|
-
end
|
19
|
-
|
20
|
-
def batch_delete_item(options)
|
21
|
-
@db.client.batch_delete_item(options)
|
22
|
-
end
|
23
|
-
|
24
|
-
def create_table(options = {})
|
25
|
-
@db.client.create_table(options)
|
26
8
|
end
|
27
9
|
|
28
|
-
|
29
|
-
|
10
|
+
# TODO Fix
|
11
|
+
def response_pool
|
12
|
+
r = AWS.config.region
|
13
|
+
AWS.config(region: 'us-west-2')
|
14
|
+
@command_notifications ||= AWS.sns.topics.create('read-development-sns')
|
15
|
+
ensure
|
16
|
+
AWS.config(region: r)
|
30
17
|
end
|
31
18
|
|
32
|
-
def
|
33
|
-
|
34
|
-
|
19
|
+
def connect!
|
20
|
+
# TODO remove poll to avoid autodelete
|
21
|
+
@queue.poll do |notification|
|
22
|
+
msg = JSON.parse(JSON.parse(notification.body)['Message'])
|
23
|
+
puts "MSG Received #{msg}"
|
35
24
|
|
36
|
-
|
37
|
-
|
38
|
-
table.load_schema
|
39
|
-
table.items.create(
|
40
|
-
object.delete_if{|k, v| v.nil? || (v.respond_to?(:empty?) && v.empty?)},
|
41
|
-
options || {}
|
42
|
-
)
|
43
|
-
rescue AWS::DynamoDB::Errors::ConditionalCheckFailedException => e
|
44
|
-
raise Dynamoid::Errors::ConditionalCheckFailedException
|
45
|
-
end
|
25
|
+
response = @db.client.send(msg['method'], msg['args'])
|
26
|
+
puts "RESPONSE #{response.data}"
|
46
27
|
|
47
|
-
|
48
|
-
|
49
|
-
|
28
|
+
response_pool.publish({
|
29
|
+
request_id: msg['request_id'],
|
30
|
+
response: response.http_response
|
31
|
+
}.to_json)
|
50
32
|
|
51
|
-
|
52
|
-
|
33
|
+
notification.delete
|
34
|
+
end
|
53
35
|
end
|
54
36
|
end
|
55
37
|
end
|
data/lib/ebx_deliver/version.rb
CHANGED
@@ -0,0 +1,46 @@
|
|
1
|
+
module EbxDeliver
|
2
|
+
module Writer
|
3
|
+
module Client
|
4
|
+
class V20111205 < AWS::DynamoDB::Client
|
5
|
+
|
6
|
+
def initialize(options = {})
|
7
|
+
super(options)
|
8
|
+
@net_http_handler = @http_handler
|
9
|
+
@sns_handler = Writer::SNSHandler.new
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.service_name
|
13
|
+
'DynamoDB'
|
14
|
+
end
|
15
|
+
|
16
|
+
define_client_methods('2011-12-05')
|
17
|
+
api_config = load_api_config('2011-12-05')
|
18
|
+
api_config[:operations].each do |operation|
|
19
|
+
method_name = operation[:method]
|
20
|
+
define_method(method_name) do |*args, &block|
|
21
|
+
options = args.first ? args.first : {}
|
22
|
+
set_http_handler(method_name)
|
23
|
+
client_request(method_name, options, &block)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def set_http_handler(method_name)
|
28
|
+
@http_handler = case method_name
|
29
|
+
when :batch_get_item,
|
30
|
+
:describe_table,
|
31
|
+
:get_item,
|
32
|
+
:list_tables,
|
33
|
+
:query,
|
34
|
+
:scan
|
35
|
+
@net_http_handler
|
36
|
+
else
|
37
|
+
@sns_handler
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
class Request < AWS::DynamoDB::Request
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
module EbxDeliver
|
2
|
+
module Writer
|
3
|
+
class SNSHandler
|
4
|
+
attr_reader :response_queue
|
5
|
+
|
6
|
+
def initialize
|
7
|
+
@response_queue = AWS.sqs.queues.named('read-development-sqs')
|
8
|
+
end
|
9
|
+
|
10
|
+
def command_notifications
|
11
|
+
r = AWS.config.region
|
12
|
+
AWS.config(region: 'us-west-2')
|
13
|
+
@command_notifications ||= AWS.sns.topics.create('write-development-sns')
|
14
|
+
ensure
|
15
|
+
AWS.config(region: r)
|
16
|
+
end
|
17
|
+
|
18
|
+
def handle(request, response, &read_block)
|
19
|
+
name = request.headers['x-amz-target'].split('.')[-1].underscore
|
20
|
+
options = JSON.parse(request.body).reduce({}) {|h, (k, v)| h[k.underscore] = v; h}
|
21
|
+
puts request.http_method
|
22
|
+
request_id = SecureRandom.uuid
|
23
|
+
publish_command(request_id, name, options)
|
24
|
+
|
25
|
+
retrieve_response(request_id, response)
|
26
|
+
end
|
27
|
+
|
28
|
+
def publish_command(request_id, name, args)
|
29
|
+
command_notifications.publish({
|
30
|
+
method: name,
|
31
|
+
args: args,
|
32
|
+
request_id: request_id
|
33
|
+
}.to_json)
|
34
|
+
end
|
35
|
+
|
36
|
+
def retrieve_response(request_id, response)
|
37
|
+
start_time = Time.now
|
38
|
+
found = false
|
39
|
+
loop do
|
40
|
+
msgs = response_queue.receive_messages(limit: 10)
|
41
|
+
msgs.each do |notification|
|
42
|
+
msg = JSON.parse(JSON.parse(notification.body)['Message'])
|
43
|
+
if msg['request_id'] == request_id
|
44
|
+
found = true
|
45
|
+
response.status = msg['response']['status']
|
46
|
+
response.headers = msg['response']['headers']
|
47
|
+
response.body= msg['response']['body']
|
48
|
+
notification.delete
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
break if found
|
53
|
+
#raise 'Timeout' if (Time.now - start_time) > 5
|
54
|
+
end
|
55
|
+
|
56
|
+
nil
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ebx_deliver
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alex Bullard
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-10-
|
11
|
+
date: 2013-10-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -38,6 +38,20 @@ dependencies:
|
|
38
38
|
- - ! '>='
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: daemons
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ~>
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 1.1.9
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ~>
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 1.1.9
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
56
|
name: dynamoid
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -83,7 +97,8 @@ dependencies:
|
|
83
97
|
description: eb eXtended cross region db command distributor
|
84
98
|
email:
|
85
99
|
- abullrd@gmail.com
|
86
|
-
executables:
|
100
|
+
executables:
|
101
|
+
- ebx_db_listen
|
87
102
|
extensions: []
|
88
103
|
extra_rdoc_files: []
|
89
104
|
files:
|
@@ -94,12 +109,15 @@ files:
|
|
94
109
|
- LICENSE
|
95
110
|
- README.md
|
96
111
|
- Rakefile
|
112
|
+
- bin/ebx_db_listen
|
97
113
|
- ebx_deliver.gemspec
|
98
114
|
- lib/dynamoid/adapter/aws_multi_region_adapter.rb
|
99
115
|
- lib/ebx_deliver.rb
|
100
|
-
- lib/ebx_deliver/
|
116
|
+
- lib/ebx_deliver/aws_config.rb
|
101
117
|
- lib/ebx_deliver/aws_sqs_reader.rb
|
102
118
|
- lib/ebx_deliver/version.rb
|
119
|
+
- lib/ebx_deliver/writer/client.rb
|
120
|
+
- lib/ebx_deliver/writer/sns_handler.rb
|
103
121
|
homepage: https://github.com/Funnerator/ebx_deliver.git
|
104
122
|
licenses:
|
105
123
|
- MIT
|
@@ -1,100 +0,0 @@
|
|
1
|
-
module EbxDeliver
|
2
|
-
class AwsSnsWriter
|
3
|
-
attr_accessor :db
|
4
|
-
|
5
|
-
def initialize
|
6
|
-
# TODO fix
|
7
|
-
@topic = AWS.sns.topics.create('development-sns')
|
8
|
-
|
9
|
-
@db = AWS::DynamoDB.new
|
10
|
-
end
|
11
|
-
|
12
|
-
def batch_get_item(&block)
|
13
|
-
@db.batch_get_item(&block)
|
14
|
-
end
|
15
|
-
|
16
|
-
def batch_write_item(options)
|
17
|
-
@db.client.batch_write_item(options)
|
18
|
-
@topic.publish({
|
19
|
-
method: 'batch_write_item',
|
20
|
-
args: [options]
|
21
|
-
}.to_json)
|
22
|
-
end
|
23
|
-
|
24
|
-
def batch_delete_item(options)
|
25
|
-
@topic.publish({
|
26
|
-
method: 'batch_delete_item',
|
27
|
-
args: [options]
|
28
|
-
}.to_json)
|
29
|
-
end
|
30
|
-
|
31
|
-
def create_table(options = {})
|
32
|
-
@topic.publish({
|
33
|
-
method: 'create_table',
|
34
|
-
args: [options]
|
35
|
-
}.to_json)
|
36
|
-
end
|
37
|
-
|
38
|
-
def delete_item(options = {})
|
39
|
-
@topic.publish({
|
40
|
-
method: 'delete_item',
|
41
|
-
args: [options]
|
42
|
-
}.to_json)
|
43
|
-
end
|
44
|
-
|
45
|
-
def delete_table(options = {})
|
46
|
-
@topic.publish({
|
47
|
-
method: 'delete_table',
|
48
|
-
args: [table_name]
|
49
|
-
}.to_json)
|
50
|
-
end
|
51
|
-
|
52
|
-
def describe_table(options = {})
|
53
|
-
@db.client.describe_table(options)
|
54
|
-
end
|
55
|
-
|
56
|
-
def get_item(table_name, key, options = {})
|
57
|
-
@db.client.get_item(options)
|
58
|
-
end
|
59
|
-
|
60
|
-
def list_tables
|
61
|
-
@db.client.list_tables(options)
|
62
|
-
end
|
63
|
-
|
64
|
-
def put_item(table_name, object, options = nil)
|
65
|
-
@topic.publish({
|
66
|
-
method: 'put_item',
|
67
|
-
args: [table_name, object, options]
|
68
|
-
}.to_json)
|
69
|
-
end
|
70
|
-
|
71
|
-
def query(table_name, opts = {})
|
72
|
-
@db.client.query(options)
|
73
|
-
end
|
74
|
-
|
75
|
-
def scan(options)
|
76
|
-
@db.client.scan(options)
|
77
|
-
end
|
78
|
-
|
79
|
-
def update_item(options = {})
|
80
|
-
@topic.publish({
|
81
|
-
method: 'update_item',
|
82
|
-
args: [options]
|
83
|
-
}.to_json)
|
84
|
-
end
|
85
|
-
|
86
|
-
def update_table(options = {})
|
87
|
-
@topic.publish({
|
88
|
-
method: 'update_item',
|
89
|
-
args: [options]
|
90
|
-
}.to_json)
|
91
|
-
end
|
92
|
-
|
93
|
-
def self.send_test
|
94
|
-
w = AwsSnsWriter.new
|
95
|
-
w.connect!
|
96
|
-
|
97
|
-
w.create_table('testtt')
|
98
|
-
end
|
99
|
-
end
|
100
|
-
end
|