awful 0.0.61 → 0.0.62
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/awful/dynamodb.rb +107 -4
- data/lib/awful/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f95833d42a45ebbe11943600ad47c0154f6d971d
|
4
|
+
data.tar.gz: b155483d0719e88268210fbfed8d18770e3cc612
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6f4a1db5f374f27bac8baf813c0748c4db2a913f3c6600047c943e8c20241164cbed0efdad9ba9460515a09108a49314fd6a337fdc4eb7ddefcd2d69d6bab358
|
7
|
+
data.tar.gz: a594f7e829d45a30c788d2ba7c822183a983b02fa44a85b4a7d491bd7cb662cb43aa0a96095c1aa9441fe15cacca3ea7d5c94470464f1b31801af13a680d2948
|
data/lib/awful/dynamodb.rb
CHANGED
@@ -75,6 +75,21 @@ module Awful
|
|
75
75
|
dynamodb.create_table(params)
|
76
76
|
end
|
77
77
|
|
78
|
+
desc 'throughput NAME', 'get or update provisioned throughput for table NAME'
|
79
|
+
method_option :read_capacity_units, aliases: '-r', type: :numeric, default: nil, desc: 'Read capacity units'
|
80
|
+
method_option :write_capacity_units, aliases: '-w', type: :numeric, default: nil, desc: 'Write capacity units'
|
81
|
+
def throughput(name)
|
82
|
+
provisioned = dynamodb.describe_table(table_name: name).table.provisioned_throughput.to_h
|
83
|
+
provisioned.merge!(symbolize_keys(options))
|
84
|
+
if options.empty? # just print current throughput
|
85
|
+
provisioned.tap do |p|
|
86
|
+
puts YAML.dump(stringify_keys(p))
|
87
|
+
end
|
88
|
+
else # update from options
|
89
|
+
dynamodb.update_table(table_name: name, provisioned_throughput: only_keys_matching(provisioned, %i[read_capacity_units write_capacity_units]))
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
78
93
|
desc 'delete NAME', 'delete table with NAME'
|
79
94
|
def delete_table(name)
|
80
95
|
confirmation = ask("to delete #{name} and all its data, type the name of table to delete:", :yellow)
|
@@ -87,6 +102,7 @@ module Awful
|
|
87
102
|
end
|
88
103
|
|
89
104
|
no_commands do
|
105
|
+
|
90
106
|
## uses simple_json to get Aws::Plugins::Protocols::JsonRpc output from scan;
|
91
107
|
## this also means request params need to be raw strings and not symbols, etc
|
92
108
|
def scan_to_file(name, exclusive_start_key, fd)
|
@@ -100,6 +116,55 @@ module Awful
|
|
100
116
|
scan_to_file(name, r['LastEvaluatedKey'], fd)
|
101
117
|
end
|
102
118
|
end
|
119
|
+
|
120
|
+
end
|
121
|
+
|
122
|
+
desc 'copy [region/]SRC [region/]DEST', 'copy data from table region/SRC to table region/DEST'
|
123
|
+
method_option :dots, aliases: '-d', type: :boolean, default: false, desc: 'Show dots for put_item progress'
|
124
|
+
method_option :no_clobber, aliases: '-n', type: :boolean, default: false, desc: 'Do not overwrite existing items'
|
125
|
+
def copy(src, dst)
|
126
|
+
src_table, src_region = src.split('/').reverse # parse region/table into [table, region]
|
127
|
+
dst_table, dst_region = dst.split('/').reverse
|
128
|
+
|
129
|
+
## clients are potentially for different regions
|
130
|
+
src_client = Aws::DynamoDB::Client.new({region: src_region}.reject{|_,v| v.nil?})
|
131
|
+
dst_client = Aws::DynamoDB::Client.new({region: dst_region}.reject{|_,v| v.nil?})
|
132
|
+
|
133
|
+
## params for put_item call
|
134
|
+
params = {table_name: dst_table}
|
135
|
+
|
136
|
+
## add condition not to overwrite existing primary keys (hash or composite hash AND range)
|
137
|
+
if options[:no_clobber]
|
138
|
+
keys = dst_client.describe_table(table_name: dst_table).table.key_schema.map(&:attribute_name)
|
139
|
+
params.merge!(condition_expression: keys.map{|key| "attribute_not_exists(#{key})"}.join(' AND '))
|
140
|
+
end
|
141
|
+
|
142
|
+
## lame progress indicator, pass true for put, false for skip
|
143
|
+
dots = options[:dots] ? ->(x){print x ? '.' : 'x'} : ->{}
|
144
|
+
|
145
|
+
## recursive closure to scan some items from src and put to dest;
|
146
|
+
## would be more studly as an anonymous y-combinator, but we should write readable code instead
|
147
|
+
scan_and_put = ->(myself, key) {
|
148
|
+
r = src_client.scan(table_name: src_table, exclusive_start_key: key, return_consumed_capacity: 'INDEXES')
|
149
|
+
print "[#{Time.now}] Scanned #{r.count} items; last evaluated key: #{r.last_evaluated_key}"
|
150
|
+
r.items.each do |item|
|
151
|
+
begin
|
152
|
+
dst_client.put_item(params.merge(item: item))
|
153
|
+
dots.call(true)
|
154
|
+
rescue Aws::DynamoDB::Errors::ConditionalCheckFailedException #item key exists
|
155
|
+
dots.call(false)
|
156
|
+
end
|
157
|
+
end
|
158
|
+
print "\n"
|
159
|
+
|
160
|
+
## recurse if there are more keys to scan
|
161
|
+
if r.last_evaluated_key
|
162
|
+
myself.call(myself, r.last_evaluated_key)
|
163
|
+
end
|
164
|
+
}
|
165
|
+
|
166
|
+
## start scanning data
|
167
|
+
scan_and_put.call(scan_and_put, nil)
|
103
168
|
end
|
104
169
|
|
105
170
|
desc 'scan NAME', 'scan table with NAME'
|
@@ -111,14 +176,52 @@ module Awful
|
|
111
176
|
end
|
112
177
|
|
113
178
|
desc 'put_items NAME', 'puts json items into the table with NAME'
|
179
|
+
method_option :no_clobber, aliases: '-n', type: :boolean, default: false, desc: 'Do not overwrite existing items'
|
114
180
|
def put_items(name, file = nil)
|
181
|
+
params = {'TableName' => name}
|
182
|
+
|
183
|
+
## set a condition not to overwrite items with existing primary key(s)
|
184
|
+
if options[:no_clobber]
|
185
|
+
keys = dynamodb.describe_table(table_name: name).table.key_schema.map(&:attribute_name)
|
186
|
+
params.merge!('ConditionExpression' => keys.map{|key| "attribute_not_exists(#{key})"}.join(' AND '))
|
187
|
+
end
|
188
|
+
|
189
|
+
## input data
|
115
190
|
io = (file and File.open(file)) || ((not $stdin.tty?) and $stdin)
|
116
|
-
|
191
|
+
|
192
|
+
put_count = 0
|
193
|
+
skip_count = 0
|
117
194
|
io.each_line do |line|
|
118
|
-
|
119
|
-
|
195
|
+
begin
|
196
|
+
dynamodb_simple.put_item(params.merge('Item' => JSON.parse(line)))
|
197
|
+
put_count += 1
|
198
|
+
rescue Aws::DynamoDB::Errors::ConditionalCheckFailedException #item key exists
|
199
|
+
skip_count += 1
|
200
|
+
end
|
201
|
+
end
|
202
|
+
|
203
|
+
## return counts
|
204
|
+
[put_count, skip_count].tap do |put, skip|
|
205
|
+
puts "put #{put} items, skipped #{skip} items"
|
206
|
+
end
|
207
|
+
end
|
208
|
+
|
209
|
+
desc 'batch_write NAME', 'batch write items to table NAME'
|
210
|
+
def batch_write(name)
|
211
|
+
items = (1..25).map do |n|
|
212
|
+
{
|
213
|
+
put_request: {
|
214
|
+
item: {
|
215
|
+
"store_id" => "store#{n}",
|
216
|
+
"object_id" => "object#{n}",
|
217
|
+
"object_value" => "value#{n}"
|
218
|
+
}
|
219
|
+
}
|
220
|
+
}
|
120
221
|
end
|
121
|
-
|
222
|
+
p items
|
223
|
+
r = dynamodb.batch_write_item(request_items: {name => items})
|
224
|
+
p r
|
122
225
|
end
|
123
226
|
|
124
227
|
end
|
data/lib/awful/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: awful
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.62
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ric Lister
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-11-
|
11
|
+
date: 2015-11-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|