bora 1.4.0 → 1.4.1

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: bda479f0f99b528601bf7581eb924ea786ccdcb7
4
- data.tar.gz: 1318e90d4665d1185c07385d684d36d2b1d0fd44
3
+ metadata.gz: a0e4a8a4f46e58395bd724d7b5b43e47682aa4ad
4
+ data.tar.gz: 9f457db9cd67e8b64d6c23d2424491f69cd8977f
5
5
  SHA512:
6
- metadata.gz: c28c0dae89eacea8416d327764a9c1eae4a45cf8a32c230a31c3f7727363ac7a7c4063c66d94fd5d80e26e770205a31c81fd5ffce9e4bedf4e88410d0382146d
7
- data.tar.gz: 8d2017b83d7b70aa761c5ec03ec3306de17673bc8f6a268a3c0d8c7733102eebfc4698cdfeda62b6dfd39d4e5120dcf0a4c6318b0e6695e394dc7283352a6f8f
6
+ metadata.gz: 000fe250f567e4e7e9ad734fdab2f3c8d0783e0d688492163690849cb60c1111e9932267393edce64c7bf856ec7bf1b4b03e925eb4cd9559f6280f0ff6b0dea2
7
+ data.tar.gz: db0d0bde5699eff9255cf38e98419ca46805b0d57f84505e6568ef42568f7294f82238fd66a28f52109559a8248a946de025ad33b84928ccb08aa454268ea5e6
@@ -55,26 +55,13 @@ class Bora
55
55
  underlying_stack.parameters.map { |parameter| Parameter.new(parameter) }
56
56
  end
57
57
 
58
- def template(pretty = true)
58
+ def template
59
59
  return if !exists?
60
- template = cloudformation.get_template({stack_name: @stack_name}).template_body
61
- template = JSON.pretty_generate(JSON.parse(template)) if pretty
62
- template
63
- end
64
-
65
- def new_template(options, pretty = true)
66
- options = resolve_options(options, true)
67
- template = options[:template_body]
68
- if template
69
- template = JSON.pretty_generate(JSON.parse(template)) if pretty
70
- template
71
- else
72
- raise "new_template not yet implemented for URL #{options[:template_url]}"
73
- end
60
+ cloudformation.get_template({stack_name: @stack_name}).template_body
74
61
  end
75
62
 
76
63
  def validate(options)
77
- cloudformation.validate_template(resolve_options(options).select { |k| [:template_body, :template_url].include?(k) })
64
+ cloudformation.validate_template(options.select { |k| [:template_body, :template_url].include?(k) })
78
65
  end
79
66
 
80
67
  def status
@@ -104,7 +91,7 @@ class Bora
104
91
  return true if action == :delete && !exists?
105
92
  @previous_event_time = last_event_time
106
93
  begin
107
- action_options = {stack_name: @stack_name}.merge(resolve_options(options))
94
+ action_options = {stack_name: @stack_name}.merge(options)
108
95
  cloudformation.method("#{action.to_s.downcase}_stack").call(action_options)
109
96
  wait_for_completion(&block)
110
97
  rescue Aws::CloudFormation::Errors::ValidationError => e
@@ -114,19 +101,6 @@ class Bora
114
101
  (action == :delete && !underlying_stack) || status.success?
115
102
  end
116
103
 
117
- def resolve_options(options, load_all = false)
118
- return options if options[:template_body] || !options[:template_url]
119
- uri = URI(options[:template_url])
120
- if uri.scheme != "s3" || load_all
121
- resolved_options = options.clone
122
- resolved_options[:template_body] = open(options[:template_url]).read
123
- resolved_options.delete(:template_url)
124
- resolved_options
125
- else
126
- options
127
- end
128
- end
129
-
130
104
  def wait_for_completion
131
105
  begin
132
106
  events = unprocessed_events
data/lib/bora/stack.rb CHANGED
@@ -29,7 +29,6 @@ class Bora
29
29
  @template_file = template_file
30
30
  @stack_config = stack_config
31
31
  @region = @stack_config['default_region'] || Aws::CloudFormation::Client.new.config[:region]
32
- @cfn_options = extract_cfn_options(stack_config)
33
32
  @cfn_stack = Cfn::Stack.new(@cfn_stack_name, @region)
34
33
  @resolver = ParameterResolver.new(self)
35
34
  end
@@ -41,8 +40,8 @@ class Bora
41
40
  end
42
41
 
43
42
  def apply(override_params = {}, pretty_json = false)
44
- generate(override_params, pretty_json)
45
- success = invoke_action(@cfn_stack.exists? ? "update" : "create", @cfn_options)
43
+ cfn_options = generate(override_params, pretty_json)
44
+ success = invoke_action(@cfn_stack.exists? ? "update" : "create", cfn_options)
46
45
  if success
47
46
  outputs = @cfn_stack.outputs
48
47
  if outputs && outputs.length > 0
@@ -58,9 +57,9 @@ class Bora
58
57
  end
59
58
 
60
59
  def diff(override_params = {}, context_lines = 3)
61
- generate(override_params)
62
- diff_parameters
63
- diff_template(override_params, context_lines)
60
+ cfn_options = generate(override_params)
61
+ diff_parameters(cfn_options)
62
+ diff_template(override_params, context_lines, cfn_options)
64
63
  end
65
64
 
66
65
  def events
@@ -109,17 +108,17 @@ class Bora
109
108
  end
110
109
 
111
110
  def recreate(override_params = {})
112
- generate(override_params)
113
- invoke_action("recreate", @cfn_options)
111
+ cfn_options = generate(override_params)
112
+ invoke_action("recreate", cfn_options)
114
113
  end
115
114
 
116
115
  def show(override_params = {})
117
- generate(override_params)
118
- puts @cfn_stack.new_template(@cfn_options)
116
+ cfn_options = generate(override_params)
117
+ puts get_new_template(cfn_options)
119
118
  end
120
119
 
121
120
  def show_current
122
- template = @cfn_stack.template
121
+ template = get_current_template
123
122
  puts template ? template : (STACK_DOES_NOT_EXIST_MESSAGE % @cfn_stack_name)
124
123
  end
125
124
 
@@ -128,8 +127,8 @@ class Bora
128
127
  end
129
128
 
130
129
  def validate(override_params = {})
131
- generate(override_params)
132
- is_valid = @cfn_stack.validate(@cfn_options)
130
+ cfn_options = generate(override_params)
131
+ is_valid = @cfn_stack.validate(cfn_options)
133
132
  puts STACK_VALIDATE_SUCCESS_MESSAGE % @cfn_stack_name if is_valid
134
133
  is_valid
135
134
  end
@@ -143,29 +142,58 @@ class Bora
143
142
 
144
143
  protected
145
144
 
146
- def diff_parameters
147
- if @cfn_stack.parameters && !@cfn_stack.parameters.empty?
148
- current_params = @cfn_stack.parameters.sort { |a, b| a.key <=> b.key }.map(&:to_s).join("\n") + "\n"
149
- end
150
- if @cfn_options[:parameters] && !@cfn_options[:parameters].empty?
151
- new_params = @cfn_options[:parameters].sort { |a, b|
152
- a[:parameter_key] <=> b[:parameter_key]
153
- }.map { |p|
154
- "#{p[:parameter_key] } - #{p[:parameter_value]}"
155
- }.join("\n") + "\n"
156
- end
145
+ def diff_parameters(cfn_options)
146
+ current_params = current_cfn_parameters
147
+ new_params = new_bora_parameters(cfn_options)
148
+ default_params = template_default_parameters(cfn_options)
149
+ new_params = default_params.merge(new_params || {}) if default_params
157
150
 
158
- if current_params || new_params
151
+ current_params_str = params_as_string(current_params)
152
+ new_params_str = params_as_string(new_params)
153
+ if current_params_str || new_params_str
159
154
  puts "Parameters".colorize(mode: :bold)
160
155
  puts "----------"
161
- diff = Diffy::Diff.new(current_params, new_params).to_s(String.disable_colorization ? :text : :color).chomp
156
+ diff = Diffy::Diff.new(current_params_str, new_params_str).to_s(String.disable_colorization ? :text : :color).chomp
162
157
  puts diff && !diff.empty? ? diff : STACK_DIFF_PARAMETERS_UNCHANGED_MESSAGE
163
158
  puts
164
159
  end
165
160
  end
166
161
 
167
- def diff_template(override_params, context_lines)
168
- diff = Diffy::Diff.new(@cfn_stack.template, @cfn_stack.new_template(@cfn_options),
162
+ def params_as_string(params)
163
+ params ? params.sort.map {|k, v| "#{k} - #{v}" }.join("\n") + "\n" : nil
164
+ end
165
+
166
+ def template_default_parameters(cfn_options)
167
+ params = nil
168
+ template = JSON.parse(cfn_options[:template_body])
169
+ if template["Parameters"]
170
+ params_with_defaults = template["Parameters"].select { |_, v| v["Default"] }
171
+ if !params_with_defaults.empty?
172
+ params = params_with_defaults.map { |k, v| [k, v["Default"]] }.to_h
173
+ end
174
+ end
175
+ params
176
+ end
177
+
178
+ def current_cfn_parameters
179
+ params = nil
180
+ if @cfn_stack.parameters && !@cfn_stack.parameters.empty?
181
+ params = @cfn_stack.parameters.map { |p| [p.key, p.value] }.to_h
182
+ end
183
+ params
184
+ end
185
+
186
+ def new_bora_parameters(cfn_options)
187
+ params = nil
188
+ cfn_parameters = cfn_options[:parameters]
189
+ if cfn_parameters && !cfn_parameters.empty?
190
+ params = cfn_parameters.map { |p| [p[:parameter_key], p[:parameter_value]] }.to_h
191
+ end
192
+ params
193
+ end
194
+
195
+ def diff_template(override_params, context_lines, cfn_options)
196
+ diff = Diffy::Diff.new(get_current_template, get_new_template(cfn_options),
169
197
  context: context_lines,
170
198
  include_diff_info: true)
171
199
  diff = diff.reject { |line| line =~ /^(---|\+\+\+|\\\\)/ }
@@ -190,6 +218,7 @@ class Bora
190
218
  end
191
219
 
192
220
  def generate(override_params = {}, pretty_json = false)
221
+ cfn_options = cfn_options_from_stack_config
193
222
  params = resolved_params(override_params)
194
223
  if File.extname(@template_file) == ".rb"
195
224
  template_body = run_cfndsl(@template_file, params, pretty_json)
@@ -199,17 +228,18 @@ class Bora
199
228
  cfn_params = params.select { |k, v| cfn_param_keys.include?(k) }.map do |k, v|
200
229
  { parameter_key: k, parameter_value: v }
201
230
  end
202
- @cfn_options[:parameters] = cfn_params if !cfn_params.empty?
231
+ cfn_options[:parameters] = cfn_params if !cfn_params.empty?
203
232
  end
204
- @cfn_options[:template_body] = template_body
233
+ cfn_options[:template_body] = template_body
205
234
  else
206
- @cfn_options[:template_url] = @template_file
235
+ cfn_options[:template_body] = File.read(@template_file)
207
236
  if !params.empty?
208
- @cfn_options[:parameters] = params.map do |k, v|
237
+ cfn_options[:parameters] = params.map do |k, v|
209
238
  { parameter_key: k, parameter_value: v }
210
239
  end
211
240
  end
212
241
  end
242
+ cfn_options
213
243
  end
214
244
 
215
245
  def invoke_action(action, *args)
@@ -237,9 +267,19 @@ class Bora
237
267
  template_body
238
268
  end
239
269
 
240
- def extract_cfn_options(config)
270
+ def cfn_options_from_stack_config
241
271
  valid_options = ["capabilities"]
242
- config.select { |k| valid_options.include?(k) }
272
+ @stack_config.select { |k| valid_options.include?(k) }
273
+ end
274
+
275
+ def get_new_template(cfn_options)
276
+ template = cfn_options[:template_body]
277
+ JSON.pretty_generate(JSON.parse(template))
278
+ end
279
+
280
+ def get_current_template
281
+ template = @cfn_stack.template
282
+ template ? JSON.pretty_generate(JSON.parse(template)) : nil
243
283
  end
244
284
 
245
285
  end
data/lib/bora/tasks.rb CHANGED
@@ -20,8 +20,11 @@ class Bora
20
20
  if @stack_options[:template_body] || @stack_options[:template_url]
21
21
  raise "You cannot specify a template in the constructor as well as in the stack_options"
22
22
  else
23
- @stack_options[:template_url] = template_uri
23
+ @stack_options[:template_body] = File.read(template_uri)
24
24
  end
25
+ elsif @stack_options[:template_url]
26
+ @stack_options[:template_body] = File.read(@stack_options[:template_url])
27
+ @stack_options.delete(:template_url)
25
28
  end
26
29
 
27
30
  define_tasks
data/lib/bora/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  class Bora
2
- VERSION = "1.4.0"
2
+ VERSION = "1.4.1"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bora
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.0
4
+ version: 1.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Charles Blaxland
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-10-22 00:00:00.000000000 Z
11
+ date: 2016-11-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aws-sdk