sfn 3.1.0 → 3.1.2

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
  SHA256:
3
- metadata.gz: 61e1f8b5f3368c544eb62deddf53125068fb58da22d78e0314149017fc525876
4
- data.tar.gz: 30f8e10f6b1fe2364ce1eab3ba6a5b8fabd37386f0dcda8ae10bf4b81ff80789
3
+ metadata.gz: 2a0d3ba5a54ddc491d9a7dc4acc98baf4cd3e9533fe9e6dfb74e4154603566a2
4
+ data.tar.gz: bb96f40718dac5aaf5ea8e3b3de04afac2bcf893a5f3108c44d6023435d86234
5
5
  SHA512:
6
- metadata.gz: 2a723ade4a10648cef17999848c8b41e3b6867c29611bd0b0c4530e30d447b939590153cdc1946a113cc43625b10ac8f42ddfb3d11f200d4ccccfd447ed59cfc
7
- data.tar.gz: '013810809d502b67e8d7257cda9cf37b438bd1d3a5e3ced5fd5fb49e1d4917533024bf46031ae54187b0d1e150ed827ab0e363b888ebbda7f0512f5f4479b449'
6
+ metadata.gz: 01657ee293977a4f07e745d53b426ebc723f056892b4df6cd6f850e2361435521df969bd6cf081cbb9f0ca45ca5fe6764f5763369e59aab3c611794a34dea2ff
7
+ data.tar.gz: 90648c378bae5ac67ee578e41dcba9fa6ac1cd529fa34362dc8a758ce33336df74611adf27b1ec2bf16dc0a86f624f03ae4159a11952a4888f5b5fac1ded1224
@@ -1,3 +1,8 @@
1
+ # v3.1.2
2
+ * [feature] Add `trace` command for template composition inspection (#289)
3
+ * [fix] Return non-zero exit code when polling stack destroy fails (#292)
4
+ * [fix] Update planner to handle value re-order (#290)
5
+
1
6
  # v3.1.0
2
7
  * [enhancement] Split `plan` command into `plan` and `realize` (#285)
3
8
  * [deprecation] Remove sfn command mapping knife integration (#286)
@@ -22,6 +22,7 @@ module Sfn
22
22
  autoload :Print, "sfn/command/print"
23
23
  autoload :Promote, "sfn/command/promote"
24
24
  autoload :Realize, "sfn/command/realize"
25
+ autoload :Trace, "sfn/command/trace"
25
26
  autoload :Update, "sfn/command/update"
26
27
  autoload :Validate, "sfn/command/validate"
27
28
 
@@ -45,12 +45,17 @@ module Sfn
45
45
  end
46
46
  if config[:poll]
47
47
  if stacks.size == 1
48
+ pstack = stacks.first
48
49
  begin
49
- poll_stack(stacks.first)
50
- rescue Miasma::Error::ApiError::RequestError => error
51
- unless error.response.code == 404
52
- raise error
50
+ poll_stack(pstack)
51
+ stack = provider.connection.stacks.get(pstack)
52
+ stack.reload
53
+ if stack.state.to_s.end_with?("failed")
54
+ ui.error("Stack #{ui.color(pstack, :bold)} still exists after polling complete.")
55
+ raise "Failed to successfully destroy stack!"
53
56
  end
57
+ rescue Miasma::Error::ApiError::RequestError => error
58
+ # Ignore if stack cannot be reloaded
54
59
  end
55
60
  else
56
61
  ui.error "Stack polling is not available when multiple stack deletion is requested!"
@@ -0,0 +1,52 @@
1
+ require "sparkle_formation"
2
+ require "sfn"
3
+
4
+ module Sfn
5
+ class Command
6
+ # Trace command
7
+ class Trace < Command
8
+ include Sfn::CommandModule::Base
9
+ include Sfn::CommandModule::Template
10
+ include Sfn::CommandModule::Stack
11
+
12
+ # Print the requested template
13
+ def execute!
14
+ config[:sparkle_dump] = true
15
+ config[:print_only] = true
16
+ file = load_template_file
17
+
18
+ if !file.is_a?(SparkleFormation)
19
+ raise "Cannot trace non-SparkleFormation template"
20
+ else
21
+ writer = proc do |audit_log, indent = ""|
22
+ audit_log.each do |record|
23
+ header = "#{indent}-> "
24
+ header << ui.color(record.type.to_s.capitalize, :bold)
25
+ header << " - #{record.name}"
26
+ source = "#{indent} | source: "
27
+ if record.location.line > 0
28
+ source << "#{record.location.path} @ #{record.location.line}"
29
+ else
30
+ source << ui.color(record.location.path, :yellow)
31
+ end
32
+ origin = "#{indent} | caller: "
33
+ if record.caller.line > 0
34
+ origin << "#{record.caller.path} @ #{record.caller.line}"
35
+ else
36
+ origin << ui.color(record.caller.path, :yellow)
37
+ end
38
+ ui.info header
39
+ ui.info source
40
+ ui.info origin
41
+ if record.audit_log.count > 0
42
+ writer.call(record.audit_log, indent + " |")
43
+ end
44
+ end
45
+ end
46
+ ui.info ui.color("Trace information:", :bold)
47
+ writer.call(file.audit_log)
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
@@ -48,6 +48,7 @@ module Sfn
48
48
  def request_compile_parameter(p_name, p_config, cur_val, nested = false)
49
49
  result = nil
50
50
  attempts = 0
51
+ ui.debug "Fetching compile time param named #{p_name}"
51
52
  parameter_type = p_config.fetch(:type, "string").to_s.downcase.to_sym
52
53
  if parameter_type == :complex
53
54
  ui.debug "Compile time parameter `#{p_name}` is a complex type. Not requesting value from user."
@@ -178,11 +179,11 @@ module Sfn
178
179
  config[:template]
179
180
  elsif config[:file]
180
181
  if config[:processing]
181
- compile_state = merge_compile_time_parameters
182
182
  sf = SparkleFormation.compile(config[:file], :sparkle)
183
183
  if name_args.first
184
184
  sf.name = name_args.first
185
185
  end
186
+ compile_state = merge_compile_time_parameters(sf.root?)
186
187
  sf.compile_time_parameter_setter do |formation|
187
188
  f_name = formation.root_path.map(&:name).map(&:to_s)
188
189
  pathed_name = f_name.join(" > ")
@@ -257,13 +258,17 @@ module Sfn
257
258
 
258
259
  # Merge parameters provided directly via configuration into
259
260
  # core parameter set
260
- def merge_compile_time_parameters
261
+ def merge_compile_time_parameters(root_template = false)
261
262
  compile_state = config.fetch(:compile_parameters, Smash.new)
262
263
  ui.debug "Initial compile parameters - #{compile_state}"
263
264
  compile_state.keys.each do |cs_key|
264
265
  unless cs_key.to_s.start_with?("#{arguments.first}__")
265
266
  named_cs_key = [arguments.first, cs_key].compact.join("__")
266
- non_named = compile_state.delete(cs_key)
267
+ if root_template
268
+ non_named = compile_state[cs_key]
269
+ else
270
+ non_named = compile_state.delete(cs_key)
271
+ end
267
272
  if non_named && !compile_state.key?(named_cs_key)
268
273
  ui.debug "Setting non-named compile parameter `#{cs_key}` into `#{named_cs_key}`"
269
274
  compile_state[named_cs_key] = non_named
@@ -295,12 +300,12 @@ module Sfn
295
300
  def process_nested_stack_shallow(sf, c_stack = nil)
296
301
  sf.apply_nesting(:shallow) do |stack_name, stack, resource|
297
302
  run_callbacks_for(:template, :stack_name => stack_name, :sparkle_stack => stack)
298
- bucket = provider.connection.api_for(:storage).buckets.get(
299
- config[:nesting_bucket]
300
- )
301
303
  if config[:print_only]
302
304
  template_url = "http://example.com/bucket/#{name_args.first}_#{stack_name}.json"
303
305
  else
306
+ bucket = provider.connection.api_for(:storage).buckets.get(
307
+ config[:nesting_bucket]
308
+ )
304
309
  stack_definition = dump_stack_for_storage(stack)
305
310
  unless bucket
306
311
  raise "Failed to locate configured bucket for stack template storage (#{bucket})!"
@@ -60,6 +60,7 @@ module Sfn
60
60
  autoload :Print, "sfn/config/print"
61
61
  autoload :Promote, "sfn/config/promote"
62
62
  autoload :Realize, "sfn/config/realize"
63
+ autoload :Trace, "sfn/config/trace"
63
64
  autoload :Update, "sfn/config/update"
64
65
  autoload :Validate, "sfn/config/validate"
65
66
 
@@ -2,7 +2,7 @@ require "sfn"
2
2
 
3
3
  module Sfn
4
4
  class Config
5
- # Print command configurationUpdate command configuration
5
+ # Print command configuration
6
6
  class Print < Validate
7
7
  attribute(
8
8
  :write_to_file, String,
@@ -0,0 +1,9 @@
1
+ require "sfn"
2
+
3
+ module Sfn
4
+ class Config
5
+ # Print command configurationUpdate command configuration
6
+ class Trace < Validate
7
+ end
8
+ end
9
+ end
@@ -512,10 +512,10 @@ module Sfn
512
512
  def diff_init(diff, path)
513
513
  Smash.new.tap do |di|
514
514
  if diff.size > 1
515
- updated = diff.detect { |x| x.first == "+" }
516
- original = diff.detect { |x| x.first == "-" }
517
- di[:original] = original.last.to_s
518
- di[:updated] = updated.last.to_s
515
+ updated = diff.find_all { |x| x.first == "+" }
516
+ original = diff.find_all { |x| x.first == "-" }
517
+ di[:original] = Array(original).map(&:last).join(", ")
518
+ di[:updated] = Array(updated).map(&:last).join(", ")
519
519
  else
520
520
  diff_data = diff.first
521
521
  di[:path] = path
@@ -101,7 +101,15 @@ module Sfn
101
101
  fetch_stacks(stack_id) if recache
102
102
  end
103
103
  value = cache[:stacks].value
104
- value ? MultiJson.dump(MultiJson.load(value).values) : "[]"
104
+ if value
105
+ value = MultiJson.load(value)
106
+ if value.respond_to?(:values)
107
+ value = value.values
108
+ end
109
+ MultiJson.dump(value)
110
+ else
111
+ "[]"
112
+ end
105
113
  end
106
114
 
107
115
  # @return [Miasma::Orchestration::Stack, NilClass]
@@ -1,4 +1,4 @@
1
1
  module Sfn
2
2
  # Current library version
3
- VERSION = Gem::Version.new("3.1.0")
3
+ VERSION = Gem::Version.new("3.1.2")
4
4
  end
@@ -21,7 +21,7 @@ Gem::Specification.new do |s|
21
21
  s.add_runtime_dependency "miasma-terraform", ">= 0.1.0", "< 0.2.0"
22
22
  s.add_runtime_dependency "jmespath"
23
23
  s.add_runtime_dependency "net-ssh"
24
- s.add_runtime_dependency "sparkle_formation", ">= 3.0.11", "< 4"
24
+ s.add_runtime_dependency "sparkle_formation", ">= 3.0.35", "< 4"
25
25
  s.add_runtime_dependency "hashdiff", "~> 0.2.2"
26
26
  s.add_runtime_dependency "graph", "~> 2.8.1"
27
27
  s.add_development_dependency "rake", "~> 10"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sfn
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.1.0
4
+ version: 3.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chris Roberts
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-12-08 00:00:00.000000000 Z
11
+ date: 2019-01-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bogo-cli
@@ -224,7 +224,7 @@ dependencies:
224
224
  requirements:
225
225
  - - ">="
226
226
  - !ruby/object:Gem::Version
227
- version: 3.0.11
227
+ version: 3.0.35
228
228
  - - "<"
229
229
  - !ruby/object:Gem::Version
230
230
  version: '4'
@@ -234,7 +234,7 @@ dependencies:
234
234
  requirements:
235
235
  - - ">="
236
236
  - !ruby/object:Gem::Version
237
- version: 3.0.11
237
+ version: 3.0.35
238
238
  - - "<"
239
239
  - !ruby/object:Gem::Version
240
240
  version: '4'
@@ -420,6 +420,7 @@ files:
420
420
  - lib/sfn/command/print.rb
421
421
  - lib/sfn/command/promote.rb
422
422
  - lib/sfn/command/realize.rb
423
+ - lib/sfn/command/trace.rb
423
424
  - lib/sfn/command/update.rb
424
425
  - lib/sfn/command/validate.rb
425
426
  - lib/sfn/command_module.rb
@@ -446,6 +447,7 @@ files:
446
447
  - lib/sfn/config/print.rb
447
448
  - lib/sfn/config/promote.rb
448
449
  - lib/sfn/config/realize.rb
450
+ - lib/sfn/config/trace.rb
449
451
  - lib/sfn/config/update.rb
450
452
  - lib/sfn/config/validate.rb
451
453
  - lib/sfn/error.rb
@@ -491,8 +493,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
491
493
  - !ruby/object:Gem::Version
492
494
  version: '0'
493
495
  requirements: []
494
- rubyforge_project:
495
- rubygems_version: 2.7.6
496
+ rubygems_version: 3.0.1
496
497
  signing_key:
497
498
  specification_version: 4
498
499
  summary: SparkleFormation CLI