bora 1.4.0 → 1.4.1

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: 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