sfn 2.1.10 → 2.1.12

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: be1b4ec736e954ea46336a4a6e3a957c8331a450
4
- data.tar.gz: a62b4144c909edaeaa66e0c871ed6fe23e66934b
3
+ metadata.gz: 1998884aef2f32da686903df01d5dbcd702e134d
4
+ data.tar.gz: 2d4cd76d833eaf5db2e3d05d69e815546d092b9f
5
5
  SHA512:
6
- metadata.gz: a8a4930dc3f88d29f9c277cd40037fbb8e7b8fae0f21efe709271bde0ec9afec7a968cf50aed21dd708488ba3a3a3883e6d2b66a048479ef90dce3100095ba59
7
- data.tar.gz: 6ad2aba6a8d844eb5984e5c147a0ec0bc11bcd4f29838d72df2ea4dc96ad61d47a2acf594b9194953f68e2f18beeb0ed19e765ad45e65462bf9327e2fdafb454
6
+ metadata.gz: 6c7021222f98ebbf2587d876172d02ee49e20c5eca73be13862ccb332c1674c4be34031963a69ff9dcf6739e9497e0d0ae4b8b778911d0e1b9e3946c350352c3
7
+ data.tar.gz: 30fbcb41c8291f6e77231c4c372d3a85d32dae4280a733efae28f64ab79bb966dc881dc7b52e5d11ed9e72343f4958d573b6289b166639a9f2126f7d76f77fdb
@@ -1,3 +1,11 @@
1
+ # v2.1.12
2
+ * [fix] Provide useful error message when nesting_bucket is unset (#159)
3
+ * [fix] Properly locate templates when relative path provided (#160)
4
+ * [enhancement] Support plan only output on update via `--plan-only` (#158)
5
+ * [enhancement] Allow tag updates on stack updates via `--merge-api-options` (see: #154)
6
+ * [fix] Add `DependsOn` support to graph generation
7
+ * [enhancement] Provide "dependency" style graph option
8
+
1
9
  # v2.1.10
2
10
  * [fix] Prevent direct output key modification on graph mapping
3
11
  * [enhancement] Restrict graph colors to readable values
data/bin/sfn CHANGED
@@ -41,7 +41,11 @@ Bogo::Cli::Setup.define do
41
41
  o[:delimiter] = nil
42
42
  end
43
43
  end
44
- on info[:short], on_name, info[:description], opts
44
+ if(info[:short])
45
+ on info[:short], on_name, info[:description], opts
46
+ else
47
+ on on_name, info[:description], opts
48
+ end
45
49
  end
46
50
 
47
51
  run do |opts, args|
@@ -327,6 +327,27 @@ Example of stack diff:
327
327
 
328
328
  ![stack diff](./images/d_diff.png)
329
329
 
330
+ #### Template graphs
331
+
332
+ Creation or dependency graphs can be created via `sfn`. Two styles of the graph can be
333
+ generated:
334
+
335
+ * `"creation"` - Resource creation flow (default)
336
+ * `"dependency"` - Resource dependency composition
337
+
338
+ To generate a graph:
339
+
340
+ ~~~
341
+ $ sfn graph --file my_template --graph-style dependency
342
+ ~~~
343
+
344
+ By default the graph command will create a Graphviz compatible dot format file. If Graphviz
345
+ is installed on the local system, an image can be generated directly:
346
+
347
+ ~~~
348
+ $ sfn graph --file my_template --graph-type png
349
+ ~~~
350
+
330
351
  ### Configuration commands
331
352
 
332
353
  To aid setup and configuration, `sfn` provides a configuration helper:
@@ -77,6 +77,10 @@ $ knife sparkleformation --help
77
77
  | | Valid | `Hash`
78
78
  | | Default | none
79
79
  |----------------------------|---------------|---------------------------------------------------------------
80
+ | `merge_api_options` | Description | Merges API options on stack update
81
+ | | Valid | `TrueClass`, `FalseClass`
82
+ | | Default | `false`
83
+ |----------------------------|---------------|---------------------------------------------------------------
80
84
  | `ssh_attempt_users` | Description | List of users to attempt SSH connection on node failure
81
85
  | | Valid | `Array<String>`
82
86
  | | Default | none
@@ -10,16 +10,23 @@ module Sfn
10
10
  include Sfn::CommandModule::Template
11
11
  include Sfn::CommandModule::Stack
12
12
 
13
+ # Valid graph styles
14
+ GRAPH_STYLES = [
15
+ 'creation',
16
+ 'dependency'
17
+ ]
18
+
13
19
  # Generate graph
14
20
  def execute!
15
21
  config[:print_only] = true
22
+ validate_graph_style!
16
23
  file = load_template_file
17
24
  file.delete('sfn_nested_stack')
18
25
  file = Sfn::Utils::StackParameterScrubber.scrub!(file)
19
26
  file = translate_template(file)
20
27
  @outputs = Smash.new
21
28
  file = file.to_smash
22
- ui.info 'Template resource graph generation'
29
+ ui.info "Template resource graph generation - Style: #{ui.color(config[:graph_style], :bold)}"
23
30
  if(config[:file])
24
31
  ui.puts " -> path: #{config[:file]}"
25
32
  end
@@ -162,7 +169,11 @@ module Sfn
162
169
  if(resources.keys.include?(dep_name))
163
170
  dep_name = [node_prefix, dep_name].join
164
171
  end
165
- @root_graph.edge(dep_name, node_name)
172
+ if(config[:graph_style] == 'creation')
173
+ @root_graph.edge(dep_name, node_name)
174
+ else
175
+ @root_graph.edge(node_name, dep_name)
176
+ end
166
177
  end
167
178
  end
168
179
  resource_names.concat resources.keys.map{|r_name| [node_prefix, r_name].join}
@@ -174,6 +185,10 @@ module Sfn
174
185
  data.map do |key, value|
175
186
  if(key == 'Ref' && names.include?(value))
176
187
  value
188
+ elsif(key == 'DependsOn')
189
+ [value].flatten.compact.find_all do |dependson_name|
190
+ names.include?(dependson_name)
191
+ end
177
192
  elsif(key == 'Fn::GetAtt' && names.include?(res = [value].flatten.compact.first))
178
193
  res
179
194
  else
@@ -211,6 +226,17 @@ module Sfn
211
226
  color
212
227
  end
213
228
 
229
+ def validate_graph_style!
230
+ if(config[:luckymike])
231
+ ui.warn 'Detected luckymike power override. Forcing `dependency` style!'
232
+ config[:graph_style] = 'dependency'
233
+ end
234
+ config[:graph_style] = config[:graph_style].to_s
235
+ unless(GRAPH_STYLES.include?(config[:graph_style]))
236
+ raise ArgumentError.new "Invalid graph style provided `#{config[:graph_style]}`. Valid: `#{GRAPH_STYLES.join('`, `')}`"
237
+ end
238
+ end
239
+
214
240
  class GraphProcessor < SparkleFormation::Translation
215
241
  MAP = {}
216
242
  REF_MAPPING = {}
@@ -99,30 +99,33 @@ module Sfn
99
99
  unless(e.message.include?('Confirmation declined'))
100
100
  ui.error "Unexpected error when generating plan information: #{e.class} - #{e}"
101
101
  ui.debug "#{e.class}: #{e}\n#{e.backtrace.join("\n")}"
102
- ui.confirm 'Continue with stack update?'
102
+ ui.confirm 'Continue with stack update?' unless config[:plan_only]
103
103
  else
104
104
  raise
105
105
  end
106
106
  end
107
+ if(config[:plan_only])
108
+ ui.info 'Plan only mode requested. Exiting.'
109
+ exit 0
110
+ end
107
111
  end
108
112
 
109
113
  stack.parameters = config_root_parameters
110
114
  stack.template = scrub_template(update_template)
111
115
  else
112
116
  apply_stacks!(stack)
113
-
114
117
  original_parameters = stack.parameters
115
118
  populate_parameters!(stack.template, :current_parameters => stack.parameters)
119
+ stack.parameters = config_root_parameters
120
+ end
116
121
 
117
- if(config[:plan])
118
- stack.parameters = original_parameters
119
- plan = build_planner(stack)
120
- if(plan)
121
- result = plan.generate_plan(stack.template, config_root_parameters)
122
- display_plan_information(result)
122
+ # Set options defined within config into stack instance for update request
123
+ if(config[:merge_api_options])
124
+ config.fetch(:options, Smash.new).each_pair do |key, value|
125
+ if(stack.respond_to?("#{key}="))
126
+ stack.send("#{key}=", value)
123
127
  end
124
128
  end
125
- stack.parameters = config_root_parameters
126
129
  end
127
130
 
128
131
  begin
@@ -168,7 +171,7 @@ module Sfn
168
171
  unless(print_plan_result(result))
169
172
  ui.info 'No resources life cycle changes detected in this update!'
170
173
  end
171
- ui.confirm 'Apply this stack update?'
174
+ ui.confirm 'Apply this stack update?' unless config[:plan_only]
172
175
  end
173
176
 
174
177
 
@@ -180,6 +180,7 @@ module Sfn
180
180
  end
181
181
  run_callbacks_for(:template, :stack_name => arguments.first, :sparkle_stack => sf)
182
182
  if(sf.nested? && config[:apply_nesting])
183
+ validate_nesting_bucket!
183
184
  if(config[:apply_nesting] == true)
184
185
  config[:apply_nesting] = :deep
185
186
  end
@@ -206,6 +207,14 @@ module Sfn
206
207
  end
207
208
  end
208
209
 
210
+ # Force user friendly error if nesting bucket is not set within configuration
211
+ def validate_nesting_bucket!
212
+ if(config[:nesting_bucket].to_s.empty?)
213
+ ui.error 'Missing required configuration value for `nesting_bucket`. Cannot generated nested templates!'
214
+ raise ArgumentError.new 'Required configuration value for `nesting_bucket` not provided.'
215
+ end
216
+ end
217
+
209
218
  # Processes template using the original shallow workflow
210
219
  #
211
220
  # @param sf [SparkleFormation] stack formation
@@ -406,7 +415,13 @@ module Sfn
406
415
  if(!config[:file] && config[:file_path_prompt])
407
416
  config[:file] = prompt_for_template
408
417
  else
409
- config[:file] = sparkle_collection.get(:template, config[:file])[:path]
418
+ file_lookup_path = File.expand_path(config[:file])
419
+ unless(File.exists?(file_lookup_path))
420
+ file_lookup_path = config[:file]
421
+ end
422
+ config[:file] = sparkle_collection.get(
423
+ :template, file_lookup_path
424
+ )[:path]
410
425
  end
411
426
  else
412
427
  if(config[:file])
@@ -142,8 +142,10 @@ module Sfn
142
142
  if(!short.to_s.empty? && shorts.include?(short))
143
143
  raise ArgumentError.new "Short flag already in use! (`#{short}` not available for `#{klass}`)"
144
144
  end
145
- shorts << short
146
- info[:short] = short
145
+ unless(short.to_s.empty?)
146
+ shorts << short
147
+ info[:short] = short
148
+ end
147
149
  info[:long] = name.tr('_', '-')
148
150
  info[:boolean] = [info[:type]].compact.flatten.all?{|t| BOOLEAN_VALUES.include?(t)}
149
151
  [name, info]
@@ -19,6 +19,18 @@ module Sfn
19
19
  :default => 'dot'
20
20
  )
21
21
 
22
+ attribute(
23
+ :graph_style, String,
24
+ :description => 'Style of graph (`dependency`, `creation`)',
25
+ :default => 'creation'
26
+ )
27
+
28
+ attribute(
29
+ :luckymike, [TrueClass, FalseClass],
30
+ :description => 'Force `dependency` style graph',
31
+ :default => false
32
+ )
33
+
22
34
  end
23
35
  end
24
36
  end
@@ -40,11 +40,21 @@ module Sfn
40
40
  :description => 'Provide planning information prior to update',
41
41
  :short_flag => 'l'
42
42
  )
43
+ attribute(
44
+ :plan_only, [TrueClass, FalseClass],
45
+ :default => false,
46
+ :description => 'Exit after plan display'
47
+ )
43
48
  attribute(
44
49
  :diffs, [TrueClass, FalseClass],
45
50
  :description => 'Show planner content diff',
46
51
  :short_flag => 'D'
47
52
  )
53
+ attribute(
54
+ :merge_api_options, [TrueClass, FalseClass],
55
+ :description => 'Merge API options defined within configuration on update',
56
+ :default => false
57
+ )
48
58
 
49
59
  end
50
60
  end
@@ -1,4 +1,4 @@
1
1
  module Sfn
2
2
  # Current library version
3
- VERSION = Gem::Version.new('2.1.10')
3
+ VERSION = Gem::Version.new('2.1.12')
4
4
  end
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: 2.1.10
4
+ version: 2.1.12
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chris Roberts
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-03-10 00:00:00.000000000 Z
11
+ date: 2016-03-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bogo-cli