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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6f0703571ca89556e9efc56775170d18aaab6373
4
- data.tar.gz: 646f54dd08e397f6ea1ad1210ab66ab0c91a86f9
3
+ metadata.gz: 81ec18bc27ae6f684004db441b82b05ed0cacf2e
4
+ data.tar.gz: 1a573418df38eae2043626ce28805cb9cd0f23c0
5
5
  SHA512:
6
- metadata.gz: 8ed049a0836cc96f60bebeed84562b1ded715cd322a0573a4c550f3d29d7e0e56cc6b63e81e06b460256ffc47489aa3c5fe5d281aac66b4df9ba8152fb6459c8
7
- data.tar.gz: 667c2ad1e33fb85855a5f9e3def233cc5b45b1d9b0b800beeda9d1980190e1a893c0b3af3ae5c424156dd15928fdddf683bf9525fd36b1ab4c05ac3dd819de86
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", "~> 10.0"
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
@@ -1,7 +1,6 @@
1
1
  module Awful
2
2
 
3
- class AutoScaling < Thor
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 NAME [FILE]', 'create a new auto-scaling group'
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
- method_option :launch_configuration_name, aliases: '-l', default: nil, desc: 'Launch config name'
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
@@ -2,8 +2,7 @@ require 'base64'
2
2
 
3
3
  module Awful
4
4
 
5
- class Ec2 < Thor
6
- include Awful
5
+ class Ec2 < Cli
7
6
 
8
7
  desc 'ls [PATTERN]', 'list EC2 instances [with id or tags matching PATTERN]'
9
8
  method_option :long, aliases: '-l', default: false, desc: 'Long listing'
data/lib/awful/elb.rb CHANGED
@@ -1,7 +1,6 @@
1
1
  module Awful
2
2
 
3
- class Elb < Thor
4
- include Awful
3
+ class Elb < Cli
5
4
 
6
5
  desc 'ls [PATTERN]', 'list vpcs [with any tags matching PATTERN]'
7
6
  method_option :long, aliases: '-l', default: false, desc: 'Long listing'
@@ -2,8 +2,7 @@ require 'base64'
2
2
 
3
3
  module Awful
4
4
 
5
- class LaunchConfig < Thor
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, aliases: '-t', default: false, desc: 'Add timestamp to launch config name'
58
- method_option :patch, aliases: '-p', default: false, desc: 'Add release to launch config name'
59
- def create(name, file = nil)
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] = "#{name}-#{Time.now.utc.strftime('%Y%m%d%H%M%S')}"
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 |lcname|
82
- puts lcname
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
@@ -1,7 +1,6 @@
1
1
  module Awful
2
2
 
3
- class Rds < Thor
4
- include Awful
3
+ class Rds < Cli
5
4
 
6
5
  desc 'ls [NAME]', 'list DB instances matching NAME'
7
6
  method_option :long, aliases: '-l', default: false, desc: 'Long listing'
@@ -1,7 +1,6 @@
1
1
  module Awful
2
2
 
3
- class RouteTable < Thor
4
- include Awful
3
+ class RouteTable < Cli
5
4
 
6
5
  desc 'ls [PATTERN]', 'list routes'
7
6
  method_option :long, aliases: '-l', default: false, desc: 'Long listing'
@@ -1,7 +1,6 @@
1
1
  module Awful
2
2
 
3
- class SecurityGroup < Thor
4
- include Awful
3
+ class SecurityGroup < Cli
5
4
 
6
5
  desc 'ls [NAME]', 'list security groups [matching NAME]'
7
6
  method_option :long, aliases: '-l', default: false, desc: 'Long listing'
data/lib/awful/subnet.rb CHANGED
@@ -1,7 +1,6 @@
1
1
  module Awful
2
2
 
3
- class Subnet < Thor
4
- include Awful
3
+ class Subnet < Cli
5
4
 
6
5
  desc 'ls [PATTERN]', 'list subnets [with any tags matching PATTERN]'
7
6
  method_option :long, aliases: '-l', default: false, desc: 'Long listing'
data/lib/awful/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Awful
2
- VERSION = "0.0.12"
2
+ VERSION = "0.0.13"
3
3
  end
data/lib/awful/vpc.rb CHANGED
@@ -1,7 +1,6 @@
1
1
  module Awful
2
2
 
3
- class Vpc < Thor
4
- include Awful
3
+ class Vpc < Cli
5
4
 
6
5
  desc 'ls [PATTERN]', 'list vpcs [with any tags matching PATTERN]'
7
6
  method_option :long, aliases: '-l', default: false, desc: 'Long listing'
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.12
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-04-29 00:00:00.000000000 Z
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: '10.0'
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: '10.0'
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