swa 0.3.2 → 0.3.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/swa/cli/base_command.rb +7 -0
- data/lib/swa/cli/collection_behaviour.rb +10 -0
- data/lib/swa/cli/ec2_command.rb +78 -20
- data/lib/swa/cli/filter_options.rb +1 -1
- data/lib/swa/cli/selector.rb +27 -0
- data/lib/swa/cli/tag_filter_options.rb +17 -0
- data/lib/swa/ec2/image.rb +2 -0
- data/lib/swa/ec2/instance.rb +4 -5
- data/lib/swa/ec2/key_pair.rb +1 -1
- data/lib/swa/ec2/snapshot.rb +1 -4
- data/lib/swa/ec2/volume.rb +1 -4
- data/lib/swa/resource.rb +7 -0
- data/lib/swa/version.rb +1 -1
- data/swa.gemspec +1 -0
- metadata +17 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f67b72cbe913a6388331d39a0712396b0860ed53
|
4
|
+
data.tar.gz: ba6e2d45513837f958df812a219a752fd4cc823b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6c52a78603d824cbcfc1c2326b573d333e1feda685fa3059daf2f90a0463e1365886c8810255e82d111ce4957fe347574ea958cad2f21d4ea0e58fabaf7834c8
|
7
|
+
data.tar.gz: c229d344051e47fde3ba951a30eb0c0c638f7616d8bd4c0fe88fb1d32f6d2c22beb82bedbbdf5cfc7de20ee3646aedd3411013c0a7b5fc7cb150d790c3e9377f
|
data/lib/swa/cli/base_command.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require "chronic"
|
1
2
|
require "clamp"
|
2
3
|
require "console_logger"
|
3
4
|
require "jmespath"
|
@@ -97,6 +98,12 @@ module Swa
|
|
97
98
|
signal_error("invalid JMESPath expression")
|
98
99
|
end
|
99
100
|
|
101
|
+
def parse_datetime(datetime_string)
|
102
|
+
result = Chronic.parse(datetime_string, :guess => false, :endian_precedence => :little)
|
103
|
+
raise ArgumentError, "unrecognised date/time #{datetime_string.inspect}" unless result
|
104
|
+
result
|
105
|
+
end
|
106
|
+
|
100
107
|
end
|
101
108
|
|
102
109
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require "swa/cli/selector"
|
2
|
+
|
1
3
|
module Swa
|
2
4
|
module CLI
|
3
5
|
|
@@ -27,6 +29,14 @@ module Swa
|
|
27
29
|
|
28
30
|
end
|
29
31
|
|
32
|
+
def selector
|
33
|
+
context[:selector] ||= Selector.new
|
34
|
+
end
|
35
|
+
|
36
|
+
def query_options
|
37
|
+
context[:query_options] ||= {}
|
38
|
+
end
|
39
|
+
|
30
40
|
end
|
31
41
|
|
32
42
|
end
|
data/lib/swa/cli/ec2_command.rb
CHANGED
@@ -3,9 +3,9 @@ require "swa/cli/base_command"
|
|
3
3
|
require "swa/cli/collection_behaviour"
|
4
4
|
require "swa/cli/item_behaviour"
|
5
5
|
require "swa/cli/tag_filter_options"
|
6
|
-
require "swa/ec2/key_pair"
|
7
6
|
require "swa/ec2/image"
|
8
7
|
require "swa/ec2/instance"
|
8
|
+
require "swa/ec2/key_pair"
|
9
9
|
require "swa/ec2/security_group"
|
10
10
|
require "swa/ec2/snapshot"
|
11
11
|
require "swa/ec2/volume"
|
@@ -33,12 +33,16 @@ module Swa
|
|
33
33
|
|
34
34
|
subcommand ["key-pairs", "kps"], "List key-pairs" do
|
35
35
|
|
36
|
+
self.description = <<-EOF
|
37
|
+
List key-pairs.
|
38
|
+
EOF
|
39
|
+
|
36
40
|
include CollectionBehaviour
|
37
41
|
|
38
42
|
private
|
39
43
|
|
40
44
|
def key_pairs
|
41
|
-
Swa::EC2::KeyPair
|
45
|
+
query_for(:key_pairs, Swa::EC2::KeyPair)
|
42
46
|
end
|
43
47
|
|
44
48
|
alias_method :collection, :key_pairs
|
@@ -63,9 +67,19 @@ module Swa
|
|
63
67
|
|
64
68
|
subcommand ["images", "amis"], "List images" do
|
65
69
|
|
70
|
+
self.description = <<-EOF
|
71
|
+
List images (AMIs).
|
72
|
+
|
73
|
+
By default only AMIs owned by the current account are listed;
|
74
|
+
use `--owned-by` to select a different scope.
|
75
|
+
EOF
|
76
|
+
|
66
77
|
option "--owned-by", "OWNER", "with specified owner", :default => "self"
|
67
78
|
option "--named", "PATTERN", "with matching name"
|
68
79
|
|
80
|
+
option ["--created-after", "--after"], "WHEN", "earliest creation-date"
|
81
|
+
option ["--created-before", "--before"], "WHEN", "latest creation-date"
|
82
|
+
|
69
83
|
include TagFilterOptions
|
70
84
|
include CollectionBehaviour
|
71
85
|
|
@@ -75,12 +89,23 @@ module Swa
|
|
75
89
|
add_filter("name", name_pattern)
|
76
90
|
end
|
77
91
|
|
92
|
+
def created_after=(datetime_string)
|
93
|
+
min_creation_date = parse_datetime(datetime_string).max
|
94
|
+
selector.add do |image|
|
95
|
+
Time.parse(image.creation_date) > min_creation_date
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
def created_before=(datetime_string)
|
100
|
+
max_creation_date = parse_datetime(datetime_string).min
|
101
|
+
selector.add do |image|
|
102
|
+
Time.parse(image.creation_date) < max_creation_date
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
78
106
|
def images
|
79
|
-
|
80
|
-
|
81
|
-
}
|
82
|
-
options[:filters] = filters unless filters.empty?
|
83
|
-
Swa::EC2::Image.list(ec2.images(options))
|
107
|
+
query_options[:owners] = [owned_by]
|
108
|
+
query_for(:images, Swa::EC2::Image)
|
84
109
|
end
|
85
110
|
|
86
111
|
alias_method :collection, :images
|
@@ -123,6 +148,13 @@ module Swa
|
|
123
148
|
|
124
149
|
subcommand ["instances", "is"], "List instances" do
|
125
150
|
|
151
|
+
self.description = <<-EOF
|
152
|
+
List images (AMIs).
|
153
|
+
|
154
|
+
By default only runnning instances are listed;
|
155
|
+
use `--state` to override ('*' for all states).
|
156
|
+
EOF
|
157
|
+
|
126
158
|
option ["--state"], "STATE", "with specified status",
|
127
159
|
:default => "running"
|
128
160
|
|
@@ -142,6 +174,9 @@ module Swa
|
|
142
174
|
end
|
143
175
|
end
|
144
176
|
|
177
|
+
option ["--launched-after", "--after"], "WHEN", "earliest launch-time"
|
178
|
+
option ["--launched-before", "--before"], "WHEN", "latest launch-time"
|
179
|
+
|
145
180
|
include TagFilterOptions
|
146
181
|
include CollectionBehaviour
|
147
182
|
|
@@ -157,12 +192,25 @@ module Swa
|
|
157
192
|
RUBY
|
158
193
|
end
|
159
194
|
|
195
|
+
def launched_after=(datetime_string)
|
196
|
+
min_launch_time = parse_datetime(datetime_string).max
|
197
|
+
selector.add do |instance|
|
198
|
+
instance.launch_time > min_launch_time
|
199
|
+
end
|
200
|
+
end
|
201
|
+
|
202
|
+
def launched_before=(datetime_string)
|
203
|
+
max_launch_time = parse_datetime(datetime_string).min
|
204
|
+
selector.add do |instance|
|
205
|
+
instance.launch_time < max_launch_time
|
206
|
+
end
|
207
|
+
end
|
208
|
+
|
160
209
|
private
|
161
210
|
|
162
211
|
def instances
|
163
212
|
add_filter("instance-state-name", state)
|
164
|
-
|
165
|
-
Swa::EC2::Instance.list(ec2.instances(options))
|
213
|
+
query_for(:instances, Swa::EC2::Instance)
|
166
214
|
end
|
167
215
|
|
168
216
|
alias_method :collection, :instances
|
@@ -193,9 +241,7 @@ module Swa
|
|
193
241
|
private
|
194
242
|
|
195
243
|
def security_groups
|
196
|
-
|
197
|
-
options[:filters] = filters unless filters.empty?
|
198
|
-
Swa::EC2::SecurityGroup.list(ec2.security_groups(options))
|
244
|
+
query_for(:security_groups, Swa::EC2::SecurityGroup)
|
199
245
|
end
|
200
246
|
|
201
247
|
alias_method :collection, :security_groups
|
@@ -220,6 +266,13 @@ module Swa
|
|
220
266
|
|
221
267
|
subcommand ["snapshots", "snaps"], "List snapshots" do
|
222
268
|
|
269
|
+
self.description = <<-EOF
|
270
|
+
List EBS snapshots.
|
271
|
+
|
272
|
+
By default only snapshots owned by the current account are listed;
|
273
|
+
use `--owned-by` to select a different scope.
|
274
|
+
EOF
|
275
|
+
|
223
276
|
option "--owned-by", "OWNER", "with specified owner", :default => "self"
|
224
277
|
|
225
278
|
include TagFilterOptions
|
@@ -228,11 +281,8 @@ module Swa
|
|
228
281
|
private
|
229
282
|
|
230
283
|
def snapshots
|
231
|
-
|
232
|
-
|
233
|
-
}
|
234
|
-
options[:filters] = filters unless filters.empty?
|
235
|
-
Swa::EC2::Snapshot.list(ec2.snapshots(options))
|
284
|
+
query_options[:owner_ids] = [owned_by]
|
285
|
+
query_for(:snapshots, Swa::EC2::Snapshot)
|
236
286
|
end
|
237
287
|
|
238
288
|
alias_method :collection, :snapshots
|
@@ -257,15 +307,17 @@ module Swa
|
|
257
307
|
|
258
308
|
subcommand ["volumes", "vols"], "List volumes" do
|
259
309
|
|
310
|
+
self.description = <<-EOF
|
311
|
+
List EBS volumes.
|
312
|
+
EOF
|
313
|
+
|
260
314
|
include TagFilterOptions
|
261
315
|
include CollectionBehaviour
|
262
316
|
|
263
317
|
private
|
264
318
|
|
265
319
|
def volumes
|
266
|
-
|
267
|
-
options[:filters] = filters unless filters.empty?
|
268
|
-
Swa::EC2::Volume.list(ec2.volumes(options))
|
320
|
+
query_for(:volumes, Swa::EC2::Volume)
|
269
321
|
end
|
270
322
|
|
271
323
|
alias_method :collection, :volumes
|
@@ -278,6 +330,12 @@ module Swa
|
|
278
330
|
::Aws::EC2::Resource.new(aws_config)
|
279
331
|
end
|
280
332
|
|
333
|
+
def query_for(query_method, resource_model)
|
334
|
+
aws_resources = ec2.public_send(query_method, query_options)
|
335
|
+
wrapped_resources = resource_model.list(aws_resources)
|
336
|
+
selector.apply(wrapped_resources)
|
337
|
+
end
|
338
|
+
|
281
339
|
end
|
282
340
|
|
283
341
|
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Swa
|
2
|
+
module CLI
|
3
|
+
|
4
|
+
class Selector
|
5
|
+
|
6
|
+
def initialize
|
7
|
+
@predicates = []
|
8
|
+
end
|
9
|
+
|
10
|
+
def add(&block)
|
11
|
+
@predicates << block
|
12
|
+
end
|
13
|
+
|
14
|
+
def call(subject)
|
15
|
+
@predicates.all? do |predicate|
|
16
|
+
predicate.call(subject)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def apply(collection)
|
21
|
+
collection.lazy.select(&method(:call))
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
end
|
@@ -11,6 +11,9 @@ module Swa
|
|
11
11
|
|
12
12
|
option "--tagged", "KEY[=VALUE]", "with matching tag",
|
13
13
|
:multivalued => true, :attribute_name => :tag_list
|
14
|
+
option "--not-tagged", "KEY[=VALUE]", "WITHOUT matching tag",
|
15
|
+
:multivalued => true, :attribute_name => :tag_blacklist
|
16
|
+
|
14
17
|
option "--stack", "NAME", "from the named CloudFormation stack"
|
15
18
|
|
16
19
|
protected
|
@@ -20,6 +23,20 @@ module Swa
|
|
20
23
|
add_tag_filter(key, value_pattern)
|
21
24
|
end
|
22
25
|
|
26
|
+
def append_to_tag_blacklist(arg)
|
27
|
+
key, value_pattern = arg.split("=", 2)
|
28
|
+
if value_pattern
|
29
|
+
selector.add do |resource|
|
30
|
+
value = resource.tags[key]
|
31
|
+
value.nil? || !File.fnmatch(value_pattern, value)
|
32
|
+
end
|
33
|
+
else
|
34
|
+
selector.add do |resource|
|
35
|
+
resource.tags[key].nil?
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
23
40
|
def stack=(name)
|
24
41
|
add_tag_filter("aws:cloudformation:stack-name", name)
|
25
42
|
end
|
data/lib/swa/ec2/image.rb
CHANGED
data/lib/swa/ec2/instance.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require "
|
1
|
+
require "base64"
|
2
2
|
require "swa/resource"
|
3
3
|
require "swa/ec2/tagged_resource"
|
4
4
|
|
@@ -26,12 +26,11 @@ module Swa
|
|
26
26
|
end
|
27
27
|
|
28
28
|
def console_output
|
29
|
-
i.console_output.output
|
29
|
+
Base64.decode64(i.console_output.output)
|
30
30
|
end
|
31
31
|
|
32
|
-
|
33
|
-
|
34
|
-
def_delegators :i, :stop, :start, :reboot, :terminate
|
32
|
+
delegate :launch_time
|
33
|
+
delegate :stop, :start, :reboot, :terminate
|
35
34
|
|
36
35
|
private
|
37
36
|
|
data/lib/swa/ec2/key_pair.rb
CHANGED
data/lib/swa/ec2/snapshot.rb
CHANGED
data/lib/swa/ec2/volume.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
require "forwardable"
|
2
1
|
require "swa/resource"
|
3
2
|
require "swa/ec2/tagged_resource"
|
4
3
|
|
@@ -29,9 +28,7 @@ module Swa
|
|
29
28
|
v.attachments.first || OpenStruct.new
|
30
29
|
end
|
31
30
|
|
32
|
-
|
33
|
-
|
34
|
-
def_delegators :v, :delete
|
31
|
+
delegate :delete
|
35
32
|
|
36
33
|
private
|
37
34
|
|
data/lib/swa/resource.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require "forwardable"
|
1
2
|
require "swa/data_presentation"
|
2
3
|
|
3
4
|
module Swa
|
@@ -21,6 +22,12 @@ module Swa
|
|
21
22
|
camelize_keys(_resource_.data.to_h)
|
22
23
|
end
|
23
24
|
|
25
|
+
extend Forwardable
|
26
|
+
|
27
|
+
def self.delegate(*methods)
|
28
|
+
def_delegators :aws_resource, *methods
|
29
|
+
end
|
30
|
+
|
24
31
|
end
|
25
32
|
|
26
33
|
end
|
data/lib/swa/version.rb
CHANGED
data/swa.gemspec
CHANGED
@@ -25,6 +25,7 @@ Gem::Specification.new do |spec|
|
|
25
25
|
spec.add_development_dependency "rspec", "~> 3.0"
|
26
26
|
|
27
27
|
spec.add_runtime_dependency "aws-sdk-resources"
|
28
|
+
spec.add_runtime_dependency "chronic"
|
28
29
|
spec.add_runtime_dependency "clamp"
|
29
30
|
spec.add_runtime_dependency "console_logger"
|
30
31
|
spec.add_runtime_dependency "multi_json"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: swa
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mike Williams
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-06-
|
11
|
+
date: 2016-06-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -66,6 +66,20 @@ dependencies:
|
|
66
66
|
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: chronic
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
69
83
|
- !ruby/object:Gem::Dependency
|
70
84
|
name: clamp
|
71
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -133,6 +147,7 @@ files:
|
|
133
147
|
- lib/swa/cli/filter_options.rb
|
134
148
|
- lib/swa/cli/item_behaviour.rb
|
135
149
|
- lib/swa/cli/main_command.rb
|
150
|
+
- lib/swa/cli/selector.rb
|
136
151
|
- lib/swa/cli/tag_filter_options.rb
|
137
152
|
- lib/swa/data_presentation.rb
|
138
153
|
- lib/swa/ec2/image.rb
|