awful 0.0.12 → 0.0.13
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/awful.gemspec +2 -1
- data/lib/awful.rb +99 -91
- data/lib/awful/auto_scaling.rb +5 -6
- data/lib/awful/ec2.rb +1 -2
- data/lib/awful/elb.rb +1 -2
- data/lib/awful/launch_config.rb +8 -15
- data/lib/awful/rds.rb +1 -2
- data/lib/awful/route_table.rb +1 -2
- data/lib/awful/security_group.rb +1 -2
- data/lib/awful/subnet.rb +1 -2
- data/lib/awful/version.rb +1 -1
- data/lib/awful/vpc.rb +1 -2
- metadata +20 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 81ec18bc27ae6f684004db441b82b05ed0cacf2e
|
4
|
+
data.tar.gz: 1a573418df38eae2043626ce28805cb9cd0f23c0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7fc1de9863ae692e5019ae5083bffac6c3b02f7112cfb6a7a3ac4e1f144684b8991d9a698ad1564bbb44758482e696db1a427ba7447e3a600f1cc043d75b3a03
|
7
|
+
data.tar.gz: 67c9693f4e02a50dd40fb97486887b779c4eb050f588981a61ab668f22415d895963e12167dfb4f495d3702769805a37b8679ea2cc22fb2772bc746b3174d832
|
data/awful.gemspec
CHANGED
@@ -19,8 +19,9 @@ Gem::Specification.new do |spec|
|
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
|
21
21
|
spec.add_development_dependency "bundler", "~> 1.7"
|
22
|
-
spec.add_development_dependency "rake"
|
22
|
+
spec.add_development_dependency "rake"
|
23
23
|
|
24
24
|
spec.add_dependency('aws-sdk', '~> 2')
|
25
25
|
spec.add_dependency('thor')
|
26
|
+
spec.add_dependency('dotenv')
|
26
27
|
end
|
data/lib/awful.rb
CHANGED
@@ -4,101 +4,109 @@ require 'aws-sdk'
|
|
4
4
|
require 'thor'
|
5
5
|
require 'yaml'
|
6
6
|
require 'erb'
|
7
|
+
require 'dotenv'
|
7
8
|
|
8
9
|
module Awful
|
10
|
+
class Cli < Thor
|
11
|
+
class_option :env, aliases: '-e', default: nil, desc: 'Load environment variables from file'
|
12
|
+
|
13
|
+
no_commands do
|
14
|
+
def ec2
|
15
|
+
@ec2 ||= Aws::EC2::Client.new
|
16
|
+
end
|
17
|
+
|
18
|
+
def autoscaling
|
19
|
+
@autoscaling ||= Aws::AutoScaling::Client.new
|
20
|
+
end
|
21
|
+
|
22
|
+
def elb
|
23
|
+
@elb ||= Aws::ElasticLoadBalancing::Client.new
|
24
|
+
end
|
25
|
+
|
26
|
+
def rds
|
27
|
+
@rds || Aws::RDS::Client.new
|
28
|
+
end
|
29
|
+
|
30
|
+
def symbolize_keys(thing)
|
31
|
+
if thing.is_a?(Hash)
|
32
|
+
Hash[ thing.map { |k,v| [ k.to_sym, symbolize_keys(v) ] } ]
|
33
|
+
elsif thing.respond_to?(:map)
|
34
|
+
thing.map { |v| symbolize_keys(v) }
|
35
|
+
else
|
36
|
+
thing
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def stringify_keys(thing)
|
41
|
+
if thing.is_a?(Hash)
|
42
|
+
Hash[ thing.map { |k,v| [ k.to_s, stringify_keys(v) ] } ]
|
43
|
+
elsif thing.respond_to?(:map)
|
44
|
+
thing.map { |v| stringify_keys(v) }
|
45
|
+
else
|
46
|
+
thing
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def load_cfg(options = {}, file = nil)
|
51
|
+
Dotenv.load!(options[:env]) if options[:env]
|
52
|
+
src = (file and File.read(file)) || ((not $stdin.tty?) and $stdin.read)
|
53
|
+
cfg = src ? YAML.load(::ERB.new(src).result(binding)) : {}
|
54
|
+
symbolize_keys(cfg).merge(symbolize_keys(options.reject{ |_,v| v.nil? }))
|
55
|
+
end
|
56
|
+
|
57
|
+
def only_keys_matching(hash, keylist)
|
58
|
+
hash.select do |key,_|
|
59
|
+
keylist.include?(key)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def remove_empty_strings(hash)
|
64
|
+
hash.reject do |_,value|
|
65
|
+
value.respond_to?(:empty?) and value.empty?
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def tag_name(thing)
|
70
|
+
tn = thing.tags.find { |tag| tag.key == 'Name' }
|
71
|
+
tn && tn.value
|
72
|
+
end
|
73
|
+
|
74
|
+
## return id for instance by name
|
75
|
+
def find_instance(name)
|
76
|
+
if name .nil?
|
77
|
+
nil?
|
78
|
+
elsif name.match(/^i-[\d[a-f]]{8}$/)
|
79
|
+
name
|
80
|
+
else
|
81
|
+
ec2.describe_instances.map(&:reservations).flatten.map(&:instances).flatten.find do |instance|
|
82
|
+
tag_name(instance) == name
|
83
|
+
end.instance_id
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
## return id for subnet by name
|
88
|
+
def find_subnet(name)
|
89
|
+
if name.match(/^subnet-[\d[a-f]]{8}$/)
|
90
|
+
name
|
91
|
+
else
|
92
|
+
ec2.describe_subnets.map(&:subnets).flatten.find do |subnet|
|
93
|
+
tag_name(subnet) == name
|
94
|
+
end.subnet_id
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
## return id for security group by name
|
99
|
+
def find_sg(name)
|
100
|
+
if name.match(/^sg-[\d[a-f]]{8}$/)
|
101
|
+
name
|
102
|
+
else
|
103
|
+
ec2.describe_security_groups.map(&:security_groups).flatten.find do |sg|
|
104
|
+
tag_name(sg) == name
|
105
|
+
end.group_id
|
106
|
+
end
|
107
|
+
end
|
9
108
|
|
10
|
-
def ec2
|
11
|
-
@ec2 ||= Aws::EC2::Client.new
|
12
|
-
end
|
13
|
-
|
14
|
-
def autoscaling
|
15
|
-
@autoscaling ||= Aws::AutoScaling::Client.new
|
16
|
-
end
|
17
|
-
|
18
|
-
def elb
|
19
|
-
@elb ||= Aws::ElasticLoadBalancing::Client.new
|
20
|
-
end
|
21
|
-
|
22
|
-
def rds
|
23
|
-
@rds || Aws::RDS::Client.new
|
24
|
-
end
|
25
|
-
|
26
|
-
def symbolize_keys(thing)
|
27
|
-
if thing.is_a?(Hash)
|
28
|
-
Hash[ thing.map { |k,v| [ k.to_sym, symbolize_keys(v) ] } ]
|
29
|
-
elsif thing.respond_to?(:map)
|
30
|
-
thing.map { |v| symbolize_keys(v) }
|
31
|
-
else
|
32
|
-
thing
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
def stringify_keys(thing)
|
37
|
-
if thing.is_a?(Hash)
|
38
|
-
Hash[ thing.map { |k,v| [ k.to_s, stringify_keys(v) ] } ]
|
39
|
-
elsif thing.respond_to?(:map)
|
40
|
-
thing.map { |v| stringify_keys(v) }
|
41
|
-
else
|
42
|
-
thing
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
def load_cfg(options = {}, file = nil)
|
47
|
-
src = (file and File.read(file)) || ((not $stdin.tty?) and $stdin.read)
|
48
|
-
cfg = src ? YAML.load(::ERB.new(src).result(binding)) : {}
|
49
|
-
symbolize_keys(cfg).merge(symbolize_keys(options.reject{ |_,v| v.nil? }))
|
50
|
-
end
|
51
109
|
|
52
|
-
def only_keys_matching(hash, keylist)
|
53
|
-
hash.select do |key,_|
|
54
|
-
keylist.include?(key)
|
55
110
|
end
|
56
111
|
end
|
57
|
-
|
58
|
-
def remove_empty_strings(hash)
|
59
|
-
hash.reject do |_,value|
|
60
|
-
value.respond_to?(:empty?) and value.empty?
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
def tag_name(thing)
|
65
|
-
tn = thing.tags.find { |tag| tag.key == 'Name' }
|
66
|
-
tn && tn.value
|
67
|
-
end
|
68
|
-
|
69
|
-
## return id for instance by name
|
70
|
-
def find_instance(name)
|
71
|
-
if name .nil?
|
72
|
-
nil?
|
73
|
-
elsif name.match(/^i-[\d[a-f]]{8}$/)
|
74
|
-
name
|
75
|
-
else
|
76
|
-
ec2.describe_instances.map(&:reservations).flatten.map(&:instances).flatten.find do |instance|
|
77
|
-
tag_name(instance) == name
|
78
|
-
end.instance_id
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
|
-
## return id for subnet by name
|
83
|
-
def find_subnet(name)
|
84
|
-
if name.match(/^subnet-[\d[a-f]]{8}$/)
|
85
|
-
name
|
86
|
-
else
|
87
|
-
ec2.describe_subnets.map(&:subnets).flatten.find do |subnet|
|
88
|
-
tag_name(subnet) == name
|
89
|
-
end.subnet_id
|
90
|
-
end
|
91
|
-
end
|
92
|
-
|
93
|
-
## return id for security group by name
|
94
|
-
def find_sg(name)
|
95
|
-
if name.match(/^sg-[\d[a-f]]{8}$/)
|
96
|
-
name
|
97
|
-
else
|
98
|
-
ec2.describe_security_groups.map(&:security_groups).flatten.find do |sg|
|
99
|
-
tag_name(sg) == name
|
100
|
-
end.group_id
|
101
|
-
end
|
102
|
-
end
|
103
|
-
|
104
112
|
end
|
data/lib/awful/auto_scaling.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
module Awful
|
2
2
|
|
3
|
-
class AutoScaling <
|
4
|
-
include Awful
|
3
|
+
class AutoScaling < Cli
|
5
4
|
|
6
5
|
desc 'ls [PATTERN]', 'list autoscaling groups with name matching PATTERN'
|
7
6
|
method_option :long, aliases: '-l', default: false, desc: 'Long listing'
|
@@ -86,17 +85,17 @@ module Awful
|
|
86
85
|
puts YAML.dump(stringify_keys(asg))
|
87
86
|
end
|
88
87
|
|
89
|
-
desc 'create
|
88
|
+
desc 'create [FILE]', 'create a new auto-scaling group'
|
89
|
+
method_option :auto_scaling_group_name, aliases: '-n', default: nil, desc: 'Auto-scaling group name'
|
90
|
+
method_option :launch_configuration_name, aliases: '-l', default: nil, desc: 'Launch config name'
|
90
91
|
method_option :desired_capacity, aliases: '-d', default: nil, desc: 'Set desired capacity'
|
91
92
|
method_option :min_size, aliases: '-m', default: nil, desc: 'Set minimum capacity'
|
92
93
|
method_option :max_size, aliases: '-M', default: nil, desc: 'Set maximum capacity'
|
93
|
-
|
94
|
-
def create(name, file = nil)
|
94
|
+
def create(file = nil)
|
95
95
|
opt = load_cfg(options, file)
|
96
96
|
whitelist = %i[auto_scaling_group_name launch_configuration_name instance_id min_size max_size desired_capacity default_cooldown availability_zones
|
97
97
|
load_balancer_names health_check_type health_check_grace_period placement_group vpc_zone_identifier termination_policies tags ]
|
98
98
|
|
99
|
-
opt[:auto_scaling_group_name] = name
|
100
99
|
opt = remove_empty_strings(opt)
|
101
100
|
opt = only_keys_matching(opt, whitelist)
|
102
101
|
|
data/lib/awful/ec2.rb
CHANGED
data/lib/awful/elb.rb
CHANGED
data/lib/awful/launch_config.rb
CHANGED
@@ -2,8 +2,7 @@ require 'base64'
|
|
2
2
|
|
3
3
|
module Awful
|
4
4
|
|
5
|
-
class LaunchConfig <
|
6
|
-
include Awful
|
5
|
+
class LaunchConfig < Cli
|
7
6
|
|
8
7
|
desc 'ls [PATTERN]', 'list launch configs with name matching PATTERN'
|
9
8
|
method_option :long, aliases: '-l', default: false, desc: 'Long listing'
|
@@ -54,9 +53,10 @@ module Awful
|
|
54
53
|
end
|
55
54
|
|
56
55
|
desc 'create NAME [FILE]', 'create a new launch configuration'
|
57
|
-
method_option :timestamp,
|
58
|
-
method_option :
|
59
|
-
|
56
|
+
method_option :timestamp, aliases: '-t', default: false, desc: 'Add timestamp to launch config name'
|
57
|
+
method_option :launch_configuration_name, aliases: '-n', default: nil, desc: 'launch configuration name'
|
58
|
+
method_option :image_id, aliases: '-i', default: nil, desc: 'image ID (AMI to use)'
|
59
|
+
def create(file = nil)
|
60
60
|
opt = load_cfg(options, file)
|
61
61
|
|
62
62
|
whitelist = %i[launch_configuration_name image_id key_name security_groups classic_link_vpc_id classic_link_vpc_security_groups user_data
|
@@ -64,22 +64,15 @@ module Awful
|
|
64
64
|
ebs_optimized associate_public_ip_address placement_tenancy]
|
65
65
|
|
66
66
|
if options[:timestamp]
|
67
|
-
opt[:launch_configuration_name]
|
68
|
-
elsif opt[:patch]
|
69
|
-
print "bumping version from latest: "
|
70
|
-
m = latest(name).match(/^#{name}-(\w+)\.(\w+)\.(\w+)$/)
|
71
|
-
raise "latest launch config does not match format #{name}-x.x.x" unless m
|
72
|
-
opt[:launch_configuration_name] = "#{name}-#{[m[1], m[2], m[3].to_i + 1].join('.')}"
|
73
|
-
else
|
74
|
-
opt[:launch_configuration_name] = name
|
67
|
+
opt[:launch_configuration_name] += "-#{Time.now.utc.strftime('%Y%m%d%H%M%S')}"
|
75
68
|
end
|
76
69
|
|
77
70
|
opt[:user_data] = Base64.encode64(opt[:user_data]) # encode user data
|
78
71
|
opt = remove_empty_strings(opt)
|
79
72
|
opt = only_keys_matching(opt, whitelist)
|
80
73
|
autoscaling.create_launch_configuration(opt)
|
81
|
-
opt[:launch_configuration_name].tap do |
|
82
|
-
puts
|
74
|
+
opt[:launch_configuration_name].tap do |name|
|
75
|
+
puts name
|
83
76
|
end
|
84
77
|
end
|
85
78
|
|
data/lib/awful/rds.rb
CHANGED
data/lib/awful/route_table.rb
CHANGED
data/lib/awful/security_group.rb
CHANGED
data/lib/awful/subnet.rb
CHANGED
data/lib/awful/version.rb
CHANGED
data/lib/awful/vpc.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.13
|
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
|
+
date: 2015-05-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -28,16 +28,16 @@ dependencies:
|
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - "
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
40
|
+
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: aws-sdk
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -66,6 +66,20 @@ dependencies:
|
|
66
66
|
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: dotenv
|
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
|
description: AWS cmdline and yaml loader.
|
70
84
|
email:
|
71
85
|
- rlister+gh@gmail.com
|