cfer 0.5.0 → 0.6.0

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: 78cb715113442fbbec2fa9c33e2e243bd048960c
4
- data.tar.gz: f48b5126eebba1e069e2a26f8de51d9fc5f49d80
3
+ metadata.gz: 4f1a58671c07486f353aa90896557273e4d3e241
4
+ data.tar.gz: da2c6b400309256e52e037fb779e7ad9ffbec7ef
5
5
  SHA512:
6
- metadata.gz: 16f2f7eec9dab63812568214952a1aee5668a9553c4c9156346f9a8dffe43e07a6a63e0667bb8491ce9d225493a631c5132af794afb5679bb43afd69896bfa9d
7
- data.tar.gz: c4978b1220c8ce036a6fb4b2b96d695af2cd39b79a18e50371a58434102c8803df735ca18c0625a494c6d58bd798a6de0a82c855c6ce42bdd3fc89ae251319a5
6
+ metadata.gz: 5dd4d902637c52dff7d817408bc31ff0a6369e9ff7d9f6698622007fd732d5b550b7c7b5ebee18998925660964caeceed18722cee2c4f7587c260c08a6a98c53
7
+ data.tar.gz: b60810b50244a46dbf5e81c67be25e67b6ee41cda5f08f225a8d570b5575d01c65ae390ec9fb4bc61a065c0e73123aabe0fcbf7946def8159534ffd3b83f72f7
@@ -1,5 +1,15 @@
1
1
  # Cfer Change Log
2
2
 
3
+ ## 0.6.0
4
+
5
+ ### Enhancements
6
+ * Colorized JSON in `generate` for more readable output. #41
7
+ * Adds `--notification-arns` CLI option. #43
8
+ * Adds `--role-arn` CLI option. #46
9
+
10
+ ### Bugfixes
11
+ * Don't dump backtrace when trying to delete a nonexistent stack. #42
12
+
3
13
  ## 0.5.0
4
14
 
5
15
  ### **BREAKING CHANGES**
@@ -85,11 +85,17 @@ module Cfer
85
85
  when 'Continue'
86
86
  retry
87
87
  when 'Rollback'
88
+ rollback_opts = {
89
+ stack_name: stack_name
90
+ }
91
+
92
+ rollback_opts[:role_arn] = options[:role_arn] if options[:role_arn]
93
+
88
94
  case operation
89
95
  when :created
90
- cfn_stack.delete_stack stack_name: stack_name
96
+ cfn_stack.delete_stack rollback_opts
91
97
  when :updated
92
- cfn_stack.cancel_update_stack stack_name: stack_name
98
+ cfn_stack.cancel_update_stack rollback_opts
93
99
  end
94
100
  retry
95
101
  end
@@ -185,11 +191,22 @@ module Cfer
185
191
  config(options)
186
192
  cfn = options[:aws_options] || {}
187
193
  cfn_stack = options[:cfer_client] || cfn_stack = Cfer::Cfn::Client.new(cfn.merge(stack_name: stack_name))
188
- cfn_stack.delete_stack(stack_name: stack_name)
194
+
195
+ delete_opts = {
196
+ stack_name: stack_name
197
+ }
198
+ delete_opts[:role_arn] = options[:role_arn] if options[:role_arn]
199
+ cfn_stack.delete_stack(delete_opts)
189
200
 
190
201
  if options[:follow]
191
202
  tail! stack_name, options.merge(cfer_client: cfn_stack)
192
203
  end
204
+ rescue Aws::CloudFormation::Errors::ValidationError => e
205
+ if e.message =~ /Stack .* does not exist/
206
+ raise Cfer::Util::StackDoesNotExistError, e.message
207
+ else
208
+ raise e
209
+ end
193
210
  end
194
211
 
195
212
  # Builds a Cfer::Core::Stack from a Ruby block
@@ -270,7 +287,7 @@ module Cfer
270
287
 
271
288
  def render_json(obj, options = {})
272
289
  if options[:pretty_print]
273
- puts JSON.pretty_generate(obj, options)
290
+ puts Cfer::Util::Json.format_json(obj)
274
291
  else
275
292
  puts obj.to_json
276
293
  end
@@ -336,6 +353,7 @@ block.rb
336
353
  config.rb
337
354
 
338
355
  util/error.rb
356
+ util/json.rb
339
357
 
340
358
  core/hooks.rb
341
359
  core/client.rb
@@ -349,4 +367,3 @@ cfn/client.rb
349
367
  require "#{File.dirname(__FILE__)}/cfer/#{f}"
350
368
  end
351
369
  Dir["#{File.dirname(__FILE__)}/cferext/**/*.rb"].each { |f| require(f) }
352
-
@@ -119,6 +119,8 @@ module Cfer::Cfn
119
119
 
120
120
  stack_options[:on_failure] = options[:on_failure] if options[:on_failure]
121
121
  stack_options[:timeout_in_minutes] = options[:timeout] if options[:timeout]
122
+ stack_options[:role_arn] = options[:role_arn] if options[:role_arn]
123
+ stack_options[:notification_arns] = options[:notification_arns] if options[:notification_arns]
122
124
 
123
125
  stack_options.merge! parse_stack_policy(:stack_policy, options[:stack_policy])
124
126
 
@@ -39,9 +39,14 @@ module Cfer
39
39
  optional nil, 'on-failure', 'The action to take if the stack creation fails'
40
40
  optional nil, 'timeout', 'The timeout (in minutes) before the stack operation aborts'
41
41
  #flag nil, 'git-lock', 'When enabled, Cfer will not converge a stack in a dirty git tree'
42
+ optional nil,
43
+ 'notification-arns',
44
+ 'SNS topic ARN to publish stack related events. This option can be supplied multiple times.',
45
+ multiple: true
42
46
 
43
47
  optional :s, 'stack-policy', 'Set a new stack policy on create or update of the stack [file|url|json]'
44
48
  optional :u, 'stack-policy-during-update', 'Set a temporary overriding stack policy during an update [file|url|json]'
49
+ optional nil, 'role-arn', 'Pass a specific role ARN for CloudFormation to use (--role-arn in AWS CLI)'
45
50
 
46
51
  optional nil, 'change', 'Issues updates as a Cfn change set.'
47
52
  optional nil, 'change-description', 'The description of this Cfn change'
@@ -128,6 +133,8 @@ module Cfer
128
133
  usage 'delete <stack>'
129
134
  summary 'Deletes a CloudFormation stack'
130
135
 
136
+ optional nil, 'role-arn', 'Pass a specific role ARN for CloudFormation to use (--role-arn in AWS CLI)'
137
+
131
138
  run do |options, args, cmd|
132
139
  Cfer::Cli.fixup_options(options)
133
140
  options[:number] = 0
@@ -156,10 +163,10 @@ module Cfer
156
163
  Cfer::LOGGER.fatal "Template error: #{e.message}"
157
164
  Cfer::LOGGER.fatal Cfer::Cli.format_backtrace(e.template_backtrace) unless e.template_backtrace.empty?
158
165
  exit 1
159
- rescue Cfer::Util::CferError => e
166
+ rescue Cfer::Util::CferError, Cfer::Util::StackDoesNotExistError => e
160
167
  Cfer::LOGGER.error "#{e.message}"
161
168
  exit 1
162
- rescue StandardError => e
169
+ rescue StandardError => e
163
170
  Cfer::LOGGER.fatal "#{e.class.name}: #{e.message}"
164
171
  Cfer::LOGGER.fatal Cfer::Cli.format_backtrace(e.backtrace) unless e.backtrace.empty?
165
172
 
@@ -155,7 +155,11 @@ module Cfer::Core
155
155
  # Renders the stack into a CloudFormation template.
156
156
  # @return [String] The final template
157
157
  def to_cfn
158
- to_h.to_json
158
+ if @options[:pretty_print]
159
+ JSON.pretty_generate(to_h)
160
+ else
161
+ to_h.to_json
162
+ end
159
163
  end
160
164
 
161
165
  # Gets the Cfn client, if one exists, or throws an error if one does not
@@ -0,0 +1,82 @@
1
+ require 'rainbow'
2
+ require 'json'
3
+
4
+ module Cfer::Util::Json
5
+ class << self
6
+
7
+ QUOTE = '"'
8
+ LBRACE = Rainbow('{').green
9
+ RBRACE = Rainbow('}').green
10
+ LBRACKET = Rainbow('[').green
11
+ RBRACKET = Rainbow(']').green
12
+ COLON = Rainbow(': ').green
13
+
14
+ def format_json(item)
15
+ case item
16
+ when Hash
17
+ format_hash(item)
18
+ when Array
19
+ format_array(item)
20
+ when String
21
+ format_string(item)
22
+ when Numeric
23
+ format_number(item)
24
+ when TrueClass || FalseClass
25
+ format_bool(item)
26
+ else
27
+ format_string(item.to_s)
28
+ end
29
+ end
30
+
31
+ private
32
+ def format_string(s)
33
+ s.to_json
34
+ end
35
+
36
+ def format_number(n)
37
+ n.to_json
38
+ end
39
+
40
+ def format_bool(b)
41
+ b.to_json
42
+ end
43
+
44
+ def format_hash(h)
45
+ LBRACE +
46
+ if h.empty?
47
+ ' '
48
+ else
49
+ "\n" +
50
+ indent do
51
+ h.map { |k, v| format_pair(k, v) }.join(",\n")
52
+ end +
53
+ "\n"
54
+ end +
55
+ RBRACE
56
+ end
57
+
58
+ def format_pair(k, v)
59
+ QUOTE + Rainbow(k).bright + QUOTE + COLON + format_json(v)
60
+ end
61
+
62
+ def format_array(a)
63
+ LBRACKET +
64
+ if a.empty?
65
+ ' '
66
+ else
67
+ "\n" +
68
+ indent do
69
+ a.map { |i| format_json(i) }.join(",\n")
70
+ end +
71
+ "\n"
72
+ end +
73
+ RBRACKET
74
+ end
75
+
76
+ def indent
77
+ str = yield
78
+ " " + str.gsub(/\n/, "\n ")
79
+ end
80
+
81
+ end
82
+ end
@@ -1,5 +1,5 @@
1
1
  module Cfer
2
- VERSION = "0.5.0"
2
+ VERSION = "0.6.0"
3
3
 
4
4
  begin
5
5
  require 'semantic'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cfer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sean Edwards
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-03-02 00:00:00.000000000 Z
11
+ date: 2017-07-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: docile
@@ -238,6 +238,7 @@ files:
238
238
  - lib/cfer/core/resource.rb
239
239
  - lib/cfer/core/stack.rb
240
240
  - lib/cfer/util/error.rb
241
+ - lib/cfer/util/json.rb
241
242
  - lib/cfer/version.rb
242
243
  - lib/cferext/aws/auto_scaling/auto_scaling_group.rb
243
244
  - lib/cferext/aws/cloud_formation/wait_condition.rb