awful 0.0.42 → 0.0.43

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2e1d33f185150489d2da3459a03f125a27719374
4
- data.tar.gz: 5d2201ee4555108b680e7ffe406f5f31f2d3c03c
3
+ metadata.gz: f24f7ddb09a17ac333dcb869ad40e3a8471cafb4
4
+ data.tar.gz: 6a67572ec4b2c85c718b26112196c951b5c5fdce
5
5
  SHA512:
6
- metadata.gz: 732e50aeaf4edc5eeefebac0524b97dee2c781165f6a1daff76cb38568cc1068e4e1c6c9c4092b600e3a9db5d548f6a80641c90dea13445a32728861ddcbacdc
7
- data.tar.gz: 6aa6f92cd1f0ca381f34579a9fd5d1356be17338c065f3a68d9e0c0695c2aa8be7c54a7076420868d6a95a6a04b6aa85929f0ee4a1a4a35900795e89568b38ec
6
+ metadata.gz: 8a9b0dfdc1d550a137c59c2b72d1e813b6b5e2fb1a80f2311627b5ea29a4d4d1cdd07a7e8076a23c7134aea33b7b99bb1481e0e75c8084f7f9e3cd68bba125ba
7
+ data.tar.gz: 594e68b56b07cc02dbf371e0788016d40b4ba6f94faed84fa65711c5add64958c025105334c8f535c380a54e482ad2e48b19790bae39df1f0693957701cc5f8e
data/bin/cf ADDED
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/ruby
2
+ #-*- mode: ruby; -*-
3
+
4
+ require 'awful'
5
+ require 'awful/cloudformation'
6
+
7
+ Awful::CloudFormation.start(ARGV)
@@ -83,6 +83,11 @@ module Awful
83
83
  end
84
84
  end
85
85
 
86
+ ## returns contents of named file, or stdin if file = nil
87
+ def file_or_stdin(file)
88
+ (file and File.read(file)) || ((not $stdin.tty?) and $stdin.read)
89
+ end
90
+
86
91
  ## merge options with config from erb-parsed yaml stdin or file
87
92
  def load_cfg(options = {}, file = nil)
88
93
  Dotenv.overload(options[:env]) if options[:env]
@@ -0,0 +1,91 @@
1
+ module Awful
2
+
3
+ class CloudFormation < Cli
4
+
5
+ no_commands do
6
+ def cf
7
+ @cf ||= Aws::CloudFormation::Client.new
8
+ end
9
+ end
10
+
11
+ desc 'ls [PATTERN]', 'list cloudformation stacks matching PATTERN'
12
+ method_option :long, aliases: '-l', default: false, desc: 'Long listing'
13
+ method_option :all, aliases: '-a', default: false, desc: 'Show all, including stacks in DELETE_COMPLETE'
14
+ def ls(name = /./)
15
+ stacks = cf.list_stacks.stack_summaries.select do |stack|
16
+ stack.stack_name.match(name)
17
+ end
18
+
19
+ ## skip deleted stacks unless -a given
20
+ unless options[:all]
21
+ stacks = stacks.select { |stack| stack.stack_status != 'DELETE_COMPLETE' }
22
+ end
23
+
24
+ stacks.tap do |stacks|
25
+ if options[:long]
26
+ print_table stacks.map { |s| [s.stack_name, s.creation_time, s.stack_status, s.template_description] }
27
+ else
28
+ puts stacks.map(&:stack_name)
29
+ end
30
+ end
31
+ end
32
+
33
+ desc 'dump NAME', 'describe stack named NAME'
34
+ def dump(name)
35
+ cf.describe_stacks(stack_name: name).stacks.tap do |stacks|
36
+ stacks.each do |stack|
37
+ puts YAML.dump(stringify_keys(stack.to_hash))
38
+ end
39
+ end
40
+ end
41
+
42
+ desc 'template NAME', 'get template for stack named NAME'
43
+ def template(name)
44
+ cf.get_template(stack_name: name).template_body.tap do |template|
45
+ puts template
46
+ end
47
+ end
48
+
49
+ desc 'validate FILE', 'validate given template in FILE or stdin'
50
+ def validate(file = nil)
51
+ begin
52
+ cf.validate_template(template_body: file_or_stdin(file)).tap do |response|
53
+ puts YAML.dump(stringify_keys(response.to_hash))
54
+ end
55
+ rescue Aws::CloudFormation::Errors::ValidationError => e
56
+ e.tap { |err| puts err.message }
57
+ end
58
+ end
59
+
60
+ desc 'create NAME', 'create stack with name NAME'
61
+ def create(name, file = nil)
62
+ cf.create_stack(stack_name: name, template_body: file_or_stdin(file)).tap do |response|
63
+ puts response.stack_id
64
+ end
65
+ end
66
+
67
+ desc 'update NAME', 'update stack with name NAME'
68
+ def update(name, file = nil)
69
+ begin
70
+ cf.update_stack(stack_name: name, template_body: file_or_stdin(file)).tap do |response|
71
+ puts response.stack_id
72
+ end
73
+ rescue Aws::CloudFormation::Errors::ValidationError => e
74
+ e.tap { |err| puts err.message }
75
+ end
76
+ end
77
+
78
+ desc 'delete NAME', 'deletes stack with name NAME'
79
+ def delete(name)
80
+ cf.delete_stack(stack_name: name)
81
+ end
82
+
83
+ desc 'events NAME', 'show events for stack with name NAME'
84
+ def events(name)
85
+ cf.describe_stack_events(stack_name: name).stack_events.tap do |events|
86
+ print_table events.map { |e| [e.timestamp, e.resource_status, e.resource_type, e.logical_resource_id, e.resource_status_reason] }
87
+ end
88
+ end
89
+
90
+ end
91
+ end
@@ -1,3 +1,3 @@
1
1
  module Awful
2
- VERSION = "0.0.42"
2
+ VERSION = "0.0.43"
3
3
  end
@@ -6,7 +6,7 @@ module Awful
6
6
  method_option :long, aliases: '-l', default: false, desc: 'Long listing'
7
7
  def ls(name = /./)
8
8
  fields = options[:long] ?
9
- ->(v) { [v.tags.map{ |t| t.value }.join(','), v.vpc_id, v.state, v.cidr_block] } :
9
+ ->(v) { [tag_name(v), v.vpc_id, v.state, v.cidr_block] } :
10
10
  ->(v) { [v.vpc_id] }
11
11
  ec2.describe_vpcs.map(&:vpcs).flatten.select do |vpc|
12
12
  vpc.tags.any? { |tag| tag.value.match(name) }
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.42
4
+ version: 0.0.43
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-10-02 00:00:00.000000000 Z
11
+ date: 2015-10-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -87,6 +87,7 @@ executables:
87
87
  - ami
88
88
  - asg
89
89
  - asgn
90
+ - cf
90
91
  - dp
91
92
  - dyn
92
93
  - dynstr
@@ -114,6 +115,7 @@ files:
114
115
  - bin/ami
115
116
  - bin/asg
116
117
  - bin/asgn
118
+ - bin/cf
117
119
  - bin/dp
118
120
  - bin/dyn
119
121
  - bin/dynstr
@@ -133,6 +135,7 @@ files:
133
135
  - lib/awful/ami.rb
134
136
  - lib/awful/auto_scaling.rb
135
137
  - lib/awful/auto_scaling_notifications.rb
138
+ - lib/awful/cloudformation.rb
136
139
  - lib/awful/datapipeline.rb
137
140
  - lib/awful/dynamodb.rb
138
141
  - lib/awful/dynamodb_streams.rb