sfn 3.0.28 → 3.0.30

Sign up to get free protection for your applications and to get access to all the features.
Files changed (77) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +5 -0
  3. data/docs/callbacks.md +1 -0
  4. data/lib/chef/knife/knife_plugin_seed.rb +11 -17
  5. data/lib/sfn.rb +0 -2
  6. data/lib/sfn/api_provider.rb +0 -2
  7. data/lib/sfn/api_provider/google.rb +6 -9
  8. data/lib/sfn/api_provider/terraform.rb +4 -6
  9. data/lib/sfn/cache.rb +36 -39
  10. data/lib/sfn/callback.rb +0 -2
  11. data/lib/sfn/callback/aws_assume_role.rb +7 -8
  12. data/lib/sfn/callback/aws_mfa.rb +7 -8
  13. data/lib/sfn/callback/stack_policy.rb +15 -17
  14. data/lib/sfn/command.rb +9 -11
  15. data/lib/sfn/command/conf.rb +7 -10
  16. data/lib/sfn/command/create.rb +8 -12
  17. data/lib/sfn/command/describe.rb +6 -8
  18. data/lib/sfn/command/destroy.rb +8 -10
  19. data/lib/sfn/command/diff.rb +18 -25
  20. data/lib/sfn/command/events.rb +15 -16
  21. data/lib/sfn/command/export.rb +13 -17
  22. data/lib/sfn/command/graph.rb +11 -13
  23. data/lib/sfn/command/graph/aws.rb +27 -29
  24. data/lib/sfn/command/graph/terraform.rb +22 -23
  25. data/lib/sfn/command/import.rb +13 -16
  26. data/lib/sfn/command/init.rb +5 -7
  27. data/lib/sfn/command/inspect.rb +26 -29
  28. data/lib/sfn/command/lint.rb +10 -12
  29. data/lib/sfn/command/list.rb +5 -8
  30. data/lib/sfn/command/print.rb +3 -5
  31. data/lib/sfn/command/promote.rb +0 -2
  32. data/lib/sfn/command/update.rb +42 -46
  33. data/lib/sfn/command/validate.rb +4 -6
  34. data/lib/sfn/command_module/base.rb +17 -25
  35. data/lib/sfn/command_module/callbacks.rb +12 -8
  36. data/lib/sfn/command_module/stack.rb +39 -43
  37. data/lib/sfn/command_module/template.rb +89 -90
  38. data/lib/sfn/config.rb +30 -31
  39. data/lib/sfn/config/conf.rb +1 -3
  40. data/lib/sfn/config/create.rb +5 -7
  41. data/lib/sfn/config/describe.rb +3 -5
  42. data/lib/sfn/config/diff.rb +1 -1
  43. data/lib/sfn/config/events.rb +6 -8
  44. data/lib/sfn/config/export.rb +4 -7
  45. data/lib/sfn/config/graph.rb +4 -6
  46. data/lib/sfn/config/import.rb +3 -5
  47. data/lib/sfn/config/init.rb +0 -1
  48. data/lib/sfn/config/inspect.rb +7 -9
  49. data/lib/sfn/config/lint.rb +4 -4
  50. data/lib/sfn/config/list.rb +3 -5
  51. data/lib/sfn/config/print.rb +3 -5
  52. data/lib/sfn/config/promote.rb +3 -5
  53. data/lib/sfn/config/update.rb +10 -12
  54. data/lib/sfn/config/validate.rb +18 -20
  55. data/lib/sfn/lint.rb +0 -2
  56. data/lib/sfn/lint/definition.rb +3 -5
  57. data/lib/sfn/lint/rule.rb +7 -8
  58. data/lib/sfn/lint/rule_set.rb +11 -20
  59. data/lib/sfn/monkey_patch/stack.rb +32 -34
  60. data/lib/sfn/monkey_patch/stack/azure.rb +0 -1
  61. data/lib/sfn/monkey_patch/stack/google.rb +15 -16
  62. data/lib/sfn/planner.rb +1 -3
  63. data/lib/sfn/planner/aws.rb +82 -89
  64. data/lib/sfn/provider.rb +21 -23
  65. data/lib/sfn/utils.rb +0 -2
  66. data/lib/sfn/utils/debug.rb +1 -2
  67. data/lib/sfn/utils/json.rb +3 -2
  68. data/lib/sfn/utils/object_storage.rb +1 -2
  69. data/lib/sfn/utils/output.rb +8 -9
  70. data/lib/sfn/utils/path_selector.rb +9 -10
  71. data/lib/sfn/utils/ssher.rb +2 -3
  72. data/lib/sfn/utils/stack_exporter.rb +20 -21
  73. data/lib/sfn/utils/stack_parameter_scrubber.rb +6 -7
  74. data/lib/sfn/utils/stack_parameter_validator.rb +14 -16
  75. data/lib/sfn/version.rb +1 -1
  76. data/sfn.gemspec +1 -1
  77. metadata +8 -8
@@ -4,7 +4,6 @@ require 'sfn'
4
4
  module Sfn
5
5
  # Remote provider interface
6
6
  class Provider
7
-
8
7
  include Bogo::AnimalStrings
9
8
 
10
9
  # Minimum number of seconds to wait before re-expanding in
@@ -38,15 +37,15 @@ module Sfn
38
37
  # @option args [Logger] :logger use custom logger
39
38
  # @option args [Numeric] :stack_expansion_interval interval to wait between stack data expands
40
39
  # @option args [Numeric] :stack_list_interval interval to wait between stack list refresh
41
- def initialize(args={})
40
+ def initialize(args = {})
42
41
  args = args.to_smash
43
- unless(args.get(:miasma, :provider))
42
+ unless args.get(:miasma, :provider)
44
43
  best_guess = (args[:miasma] || {}).keys.group_by do |key|
45
44
  key.to_s.split('_').first
46
45
  end.sort do |x, y|
47
46
  y.size <=> x.size
48
47
  end.first
49
- if(best_guess)
48
+ if best_guess
50
49
  provider = best_guess.first.to_sym
51
50
  else
52
51
  raise ArgumentError.new 'Cannot auto determine :provider value for credentials'
@@ -54,15 +53,15 @@ module Sfn
54
53
  else
55
54
  provider = args[:miasma].delete(:provider).to_sym
56
55
  end
57
- if(provider == :aws)
58
- if(args[:miasma][:region])
56
+ if provider == :aws
57
+ if args[:miasma][:region]
59
58
  args[:miasma][:aws_region] = args[:miasma].delete(:region)
60
59
  end
61
60
  end
62
- if(ENV['DEBUG'].to_s.downcase == 'true')
61
+ if ENV['DEBUG'].to_s.downcase == 'true'
63
62
  log_to = STDOUT
64
63
  else
65
- if(Gem.win_platform?)
64
+ if Gem.win_platform?
66
65
  log_to = 'NUL'
67
66
  else
68
67
  log_to = '/dev/null'
@@ -74,7 +73,7 @@ module Sfn
74
73
  @connection = Miasma.api(
75
74
  :provider => provider,
76
75
  :type => :orchestration,
77
- :credentials => args[:miasma]
76
+ :credentials => args[:miasma],
78
77
  )
79
78
  @cache = args.fetch(:cache, Cache.new(:local))
80
79
  @async = args.fetch(:async, true)
@@ -82,21 +81,21 @@ module Sfn
82
81
  cache.init(:stacks_lock, :lock, :timeout => 0.1)
83
82
  cache.init(:stacks, :stamped)
84
83
  cache.init(:stack_expansion_lock, :lock, :timeout => 0.1)
85
- if(args.fetch(:fetch, false))
84
+ if args.fetch(:fetch, false)
86
85
  async ? update_stack_list! : fetch_stacks
87
86
  end
88
87
  end
89
88
 
90
89
  # @return [Miasma::Orchestration::Stacks]
91
- def stacks(stack_id=nil)
90
+ def stacks(stack_id = nil)
92
91
  connection.stacks.from_json(cached_stacks(stack_id))
93
92
  end
94
93
 
95
94
  # @return [String] json representation of cached stacks
96
- def cached_stacks(stack_id=nil)
97
- if(!@initial_fetch_complete || stack_id)
95
+ def cached_stacks(stack_id = nil)
96
+ if !@initial_fetch_complete || stack_id
98
97
  recache = true
99
- if(stack_id && @initial_fetch_complete)
98
+ if stack_id && @initial_fetch_complete
100
99
  recache = !!stacks.get(stack_id)
101
100
  end
102
101
  fetch_stacks(stack_id) if recache
@@ -145,7 +144,7 @@ module Sfn
145
144
  # @param stack [Miasma::Models::Orchestration::Stack]
146
145
  def expand_stack(stack)
147
146
  logger.info "Stack expansion requested (#{stack.id})"
148
- if((stack.in_progress? && Time.now.to_i - stack.attributes['Cached'].to_i > stack_expansion_interval) ||
147
+ if ((stack.in_progress? && Time.now.to_i - stack.attributes['Cached'].to_i > stack_expansion_interval) ||
149
148
  !stack.attributes['Cached'])
150
149
  begin
151
150
  expanded = false
@@ -154,7 +153,7 @@ module Sfn
154
153
  stack.reload
155
154
  stack.data['Cached'] = Time.now.to_i
156
155
  end
157
- if(expanded)
156
+ if expanded
158
157
  save_expanded_stack(stack.id, stack.to_json)
159
158
  end
160
159
  rescue => e
@@ -168,10 +167,10 @@ module Sfn
168
167
  # Request stack information and store in cache
169
168
  #
170
169
  # @return [TrueClass]
171
- def fetch_stacks(stack_id=nil)
170
+ def fetch_stacks(stack_id = nil)
172
171
  cache.locked_action(:stacks_lock) do
173
172
  logger.info "Lock aquired for stack update. Requesting stacks from upstream. (#{Thread.current})"
174
- if(stack_id)
173
+ if stack_id
175
174
  single_stack = connection.stacks.get(stack_id)
176
175
  stacks = single_stack ? {single_stack.id => single_stack} : {}
177
176
  else
@@ -181,11 +180,11 @@ module Sfn
181
180
  end
182
181
  ]
183
182
  end
184
- if(cache[:stacks].value)
183
+ if cache[:stacks].value
185
184
  existing_stacks = MultiJson.load(cache[:stacks].value)
186
185
  # Force common types
187
186
  stacks = MultiJson.load(MultiJson.dump(stacks))
188
- if(stack_id)
187
+ if stack_id
189
188
  stacks = existing_stacks.to_smash.deep_merge(stacks)
190
189
  else
191
190
  # Remove stacks that have been deleted
@@ -207,8 +206,8 @@ module Sfn
207
206
  #
208
207
  # @return [TrueClass, FalseClass]
209
208
  def update_stack_list!
210
- if(updater.nil? || !updater.alive?)
211
- self.updater = Thread.new{
209
+ if updater.nil? || !updater.alive?
210
+ self.updater = Thread.new {
212
211
  loop do
213
212
  begin
214
213
  fetch_stacks
@@ -231,7 +230,6 @@ module Sfn
231
230
  def service_for(service)
232
231
  connection.api_for(service)
233
232
  end
234
-
235
233
  end
236
234
  end
237
235
 
@@ -3,7 +3,6 @@ require 'sfn'
3
3
  module Sfn
4
4
  # Utility classes and modules
5
5
  module Utils
6
-
7
6
  autoload :Output, 'sfn/utils/output'
8
7
  autoload :StackParameterValidator, 'sfn/utils/stack_parameter_validator'
9
8
  autoload :StackParameterScrubber, 'sfn/utils/stack_parameter_scrubber'
@@ -18,6 +17,5 @@ module Sfn
18
17
  extend JSON
19
18
  extend ObjectStorage
20
19
  extend Bogo::AnimalStrings
21
-
22
20
  end
23
21
  end
@@ -10,7 +10,7 @@ module Sfn
10
10
  #
11
11
  # @param msg [String]
12
12
  def debug(msg)
13
- if(ENV['DEBUG'] || (respond_to?(:config) && config[:debug]))
13
+ if ENV['DEBUG'] || (respond_to?(:config) && config[:debug])
14
14
  puts "<sfn - debug>: #{msg}"
15
15
  end
16
16
  end
@@ -28,6 +28,5 @@ module Sfn
28
28
  end
29
29
  end
30
30
  end
31
-
32
31
  end
33
32
  end
@@ -13,6 +13,7 @@ module Sfn
13
13
  def _to_json(thing)
14
14
  MultiJson.dump(thing)
15
15
  end
16
+
16
17
  alias_method :dump_json, :_to_json
17
18
 
18
19
  # Load JSON data
@@ -22,6 +23,7 @@ module Sfn
22
23
  def _from_json(thing)
23
24
  MultiJson.load(thing)
24
25
  end
26
+
25
27
  alias_method :load_json, :_from_json
26
28
 
27
29
  # Format object into pretty JSON
@@ -32,9 +34,8 @@ module Sfn
32
34
  thing = _from_json(thing) if thing.is_a?(String)
33
35
  MultiJson.dump(thing, :pretty => true)
34
36
  end
35
- alias_method :format_json, :_format_json
36
37
 
38
+ alias_method :format_json, :_format_json
37
39
  end
38
-
39
40
  end
40
41
  end
@@ -17,12 +17,11 @@ module Sfn
17
17
  content = object.is_a?(String) ? object : Utils._format_json(object)
18
18
  directory.files.create(
19
19
  :identity => path,
20
- :body => content
20
+ :body => content,
21
21
  )
22
22
  loc = directory.service.service.name.split('::').last.downcase
23
23
  "#{loc}://#{directory.identity}/#{path}"
24
24
  end
25
-
26
25
  end
27
26
  end
28
27
  end
@@ -12,12 +12,12 @@ module Sfn
12
12
  # @option args [TrueClass, FalseClass] :flat flatten result array
13
13
  # @option args [Array] :attributes attributes to extract
14
14
  # @todo this was extracted from events and needs to be cleaned up
15
- def process(things, args={})
15
+ def process(things, args = {})
16
16
  @event_ids ||= []
17
17
  processed = things.reverse.map do |thing|
18
18
  next if @event_ids.include?(thing['id'])
19
19
  @event_ids.push(thing['id']).compact!
20
- if(args[:attributes])
20
+ if args[:attributes]
21
21
  args[:attributes].map do |key|
22
22
  thing[key].to_s
23
23
  end
@@ -34,9 +34,9 @@ module Sfn
34
34
  # @param args [Hash]
35
35
  # @option args [Array] :attributes
36
36
  # @return [Array<String>] formatted titles
37
- def get_titles(thing, args={})
37
+ def get_titles(thing, args = {})
38
38
  attrs = args[:attributes] || []
39
- if(attrs.empty?)
39
+ if attrs.empty?
40
40
  hash = thing.is_a?(Array) ? thing.first : thing
41
41
  hash ||= {}
42
42
  attrs = hash.keys
@@ -44,8 +44,8 @@ module Sfn
44
44
  titles = attrs.map do |key|
45
45
  camel(key).gsub(/([a-z])([A-Z])/, '\1 \2')
46
46
  end.compact
47
- if(args[:format])
48
- titles.map{|s| @ui.color(s, :bold)}
47
+ if args[:format]
48
+ titles.map { |s| @ui.color(s, :bold) }
49
49
  else
50
50
  titles
51
51
  end
@@ -58,7 +58,7 @@ module Sfn
58
58
  # @param what [String] description of things for output
59
59
  # @param args [Symbol] options (:ignore_empty_output)
60
60
  def things_output(stack, things, what, *args)
61
- unless(args.include?(:no_title))
61
+ unless args.include?(:no_title)
62
62
  output = get_titles(things, :format => true, :attributes => allowed_attributes)
63
63
  else
64
64
  output = []
@@ -66,14 +66,13 @@ module Sfn
66
66
  columns = allowed_attributes.size
67
67
  output += process(things, :flat => true, :attributes => allowed_attributes)
68
68
  output.compact!
69
- if(output.empty?)
69
+ if output.empty?
70
70
  ui.warn 'No information found' unless args.include?(:ignore_empty_output)
71
71
  else
72
72
  ui.info "#{what.to_s.capitalize} for stack: #{ui.color(stack, :bold)}" if stack
73
73
  ui.info "#{ui.list(output, :uneven_columns_across, columns)}"
74
74
  end
75
75
  end
76
-
77
76
  end
78
77
  end
79
78
  end
@@ -26,11 +26,11 @@ module Sfn
26
26
  # @option opts [String] :files_name title for files
27
27
  # @option opts [String] :filter_prefix only return results matching filter
28
28
  # @return [String] file path
29
- def prompt_for_file(directory, opts={})
29
+ def prompt_for_file(directory, opts = {})
30
30
  file_list = Dir.glob(File.join(directory, '**', '**', '*')).find_all do |file|
31
31
  File.file?(file)
32
32
  end
33
- if(opts[:filter_prefix])
33
+ if opts[:filter_prefix]
34
34
  file_list = file_list.find_all do |file|
35
35
  file.start_with?(options[:filter_prefix])
36
36
  end
@@ -41,12 +41,12 @@ module Sfn
41
41
  files = file_list.find_all do |path|
42
42
  path.sub(directory, '').split('/').size == 2
43
43
  end
44
- if(opts[:ignore_directories])
44
+ if opts[:ignore_directories]
45
45
  directories.delete_if do |dir|
46
46
  opts[:ignore_directories].include?(File.basename(dir))
47
47
  end
48
48
  end
49
- if(directories.empty? && files.empty?)
49
+ if directories.empty? && files.empty?
50
50
  ui.fatal 'No formation paths discoverable!'
51
51
  else
52
52
  output = ['Please select an entry']
@@ -55,7 +55,7 @@ module Sfn
55
55
  output.clear
56
56
  idx = 1
57
57
  valid = {}
58
- unless(directories.empty?)
58
+ unless directories.empty?
59
59
  output << ui.color("#{opts.fetch(:directories_name, 'Directories')}:", :bold)
60
60
  directories.each do |dir|
61
61
  valid[idx] = {:path => dir, :type => :directory}
@@ -63,7 +63,7 @@ module Sfn
63
63
  idx += 1
64
64
  end
65
65
  end
66
- unless(files.empty?)
66
+ unless files.empty?
67
67
  output << ui.color("#{opts.fetch(:files_name, 'Files')}:", :bold)
68
68
  files.each do |file|
69
69
  valid[idx] = {:path => file, :type => :file}
@@ -73,7 +73,7 @@ module Sfn
73
73
  end
74
74
  max = idx.to_s.length
75
75
  output.map! do |o|
76
- if(o.is_a?(Array))
76
+ if o.is_a?(Array)
77
77
  " #{o.first}.#{' ' * (max - o.first.to_s.length)} #{o.last}"
78
78
  else
79
79
  o
@@ -81,12 +81,12 @@ module Sfn
81
81
  end
82
82
  ui.info "#{output.join("\n")}\n"
83
83
  response = ui.ask_question('Enter selection: ').to_i
84
- unless(valid[response])
84
+ unless valid[response]
85
85
  ui.fatal 'How about using a real value'
86
86
  exit 1
87
87
  else
88
88
  entry = valid[response.to_i]
89
- if(entry[:type] == :directory)
89
+ if entry[:type] == :directory
90
90
  prompt_for_file(entry[:path], opts)
91
91
  elsif Pathname(entry[:path]).absolute?
92
92
  entry[:path]
@@ -96,7 +96,6 @@ module Sfn
96
96
  end
97
97
  end
98
98
  end
99
-
100
99
  end
101
100
  end
102
101
  end
@@ -13,8 +13,8 @@ module Sfn
13
13
  # @param path [String] remote file path
14
14
  # @param ssh_opts [Hash]
15
15
  # @return [String, NilClass]
16
- def remote_file_contents(address, user, path, ssh_opts={})
17
- if(path.to_s.strip.empty?)
16
+ def remote_file_contents(address, user, path, ssh_opts = {})
17
+ if path.to_s.strip.empty?
18
18
  raise ArgumentError.new 'No file path provided!'
19
19
  end
20
20
  require 'net/ssh'
@@ -23,7 +23,6 @@ module Sfn
23
23
  content = ssh_session.exec!("sudo cat #{path}")
24
24
  content.empty? ? nil : content
25
25
  end
26
-
27
26
  end
28
27
  end
29
28
  end
@@ -10,7 +10,6 @@ module Sfn
10
10
 
11
11
  # Stack serialization helper
12
12
  class StackExporter
13
-
14
13
  include Bogo::AnimalStrings
15
14
  include Sfn::Utils::JSON
16
15
 
@@ -20,7 +19,7 @@ module Sfn
20
19
  DEFAULT_OPTIONS = Mash.new(
21
20
  :chef_popsicle => true,
22
21
  :ignored_parameters => ['Environment', 'StackCreator', 'Creator'],
23
- :chef_environment_parameter => 'Environment'
22
+ :chef_environment_parameter => 'Environment',
24
23
  )
25
24
  # default structure of export payload
26
25
  DEFAULT_EXPORT_STRUCTURE = {
@@ -29,15 +28,15 @@ module Sfn
29
28
  :options => {
30
29
  :parameters => Mash.new,
31
30
  :capabilities => [],
32
- :notification_topics => []
33
- }
31
+ :notification_topics => [],
32
+ },
34
33
  ),
35
34
  :generator => {
36
35
  :timestamp => Time.now.to_i,
37
36
  :name => 'SparkleFormation',
38
37
  :version => Sfn::VERSION.version,
39
- :provider => nil
40
- }
38
+ :provider => nil,
39
+ },
41
40
  }
42
41
 
43
42
  # @return [Miasma::Models::Orchestration::Stack]
@@ -55,7 +54,7 @@ module Sfn
55
54
  # @option options [TrueClass, FalseClass] :chef_popsicle freeze run list
56
55
  # @option options [Array<String>] :ignored_parameters
57
56
  # @option options [String] :chef_environment_parameter
58
- def initialize(stack, options={})
57
+ def initialize(stack, options = {})
59
58
  @stack = stack
60
59
  @options = DEFAULT_OPTIONS.merge(options)
61
60
  @stack_export = Smash.new
@@ -67,14 +66,14 @@ module Sfn
67
66
  def export
68
67
  @stack_export = Smash.new(DEFAULT_EXPORT_STRUCTURE).tap do |stack_export|
69
68
  [:parameters, :capabilities, :notification_topics].each do |key|
70
- if(val = stack.send(key))
69
+ if val = stack.send(key)
71
70
  stack_export[:stack][key] = val
72
71
  end
73
72
  end
74
73
  stack_export[:stack][:template] = stack.template
75
74
  stack_export[:generator][:timestamp] = Time.now.to_i
76
75
  stack_export[:generator][:provider] = stack.provider.connection.provider
77
- if(chef_popsicle? && defined?(Chef))
76
+ if chef_popsicle? && defined?(Chef)
78
77
  freeze_runlists(stack_export)
79
78
  end
80
79
  remove_ignored_parameters(stack_export)
@@ -90,7 +89,7 @@ module Sfn
90
89
  # @return [Object]
91
90
  def method_missing(*args)
92
91
  m = args.first.to_s
93
- if(m.end_with?('?') && options.has_key?(k = m.sub('?', '').to_sym))
92
+ if m.end_with?('?') && options.has_key?(k = m.sub('?', '').to_sym)
94
93
  !!options[k]
95
94
  else
96
95
  super
@@ -106,7 +105,7 @@ module Sfn
106
105
  # @return [Hash]
107
106
  def remove_ignored_parameters(export)
108
107
  options[:ignored_parameters].each do |param|
109
- if(export[:stack][:options][:parameters])
108
+ if export[:stack][:options][:parameters]
110
109
  export[:stack][:options][:parameters].delete(param)
111
110
  end
112
111
  end
@@ -118,7 +117,7 @@ module Sfn
118
117
  # @param export [Hash] current export state
119
118
  # @return [String] environment name
120
119
  def chef_environment_name(export)
121
- if(chef_environment_parameter?)
120
+ if chef_environment_parameter?
122
121
  name = export[:stack][:options][:parameters][options[:chef_environment_parameter]]
123
122
  end
124
123
  name || DEFAULT_CHEF_ENVIRONMENT
@@ -126,7 +125,7 @@ module Sfn
126
125
 
127
126
  # @return [Chef::Environment]
128
127
  def environment
129
- unless(@env)
128
+ unless @env
130
129
  @env = Chef::Environment.load('_default')
131
130
  end
132
131
  @env
@@ -154,11 +153,11 @@ module Sfn
154
153
  def extract_runlist_item(item)
155
154
  rl_item = item.is_a?(Chef::RunList::RunListItem) ? item : Chef::RunList::RunListItem.new(item)
156
155
  static_content = Mash.new(:run_list => [])
157
- if(rl_item.recipe?)
156
+ if rl_item.recipe?
158
157
  cookbook, recipe = rl_item.name.split('::')
159
158
  peg_version = allowed_cookbook_version(cookbook)
160
159
  static_content[:run_list] << "recipe[#{[cookbook, recipe || 'default'].join('::')}@#{peg_version}]"
161
- elsif(rl_item.role?)
160
+ elsif rl_item.role?
162
161
  role = Chef::Role.load(rl_item.name)
163
162
  role.run_list.each do |item|
164
163
  static_content = Chef::Mixin::DeepMerge.merge(static_content, extract_runlist_item(item))
@@ -209,10 +208,10 @@ module Sfn
209
208
  result = []
210
209
  case thing
211
210
  when Hash
212
- if(thing['content'] && thing['content']['run_list'])
211
+ if thing['content'] && thing['content']['run_list']
213
212
  result << thing['content']
214
213
  else
215
- thing.each do |k,v|
214
+ thing.each do |k, v|
216
215
  result += locate_runlists(v)
217
216
  end
218
217
  end
@@ -229,7 +228,7 @@ module Sfn
229
228
  # @param hsh [Object] stack template item
230
229
  # @return [Object]
231
230
  def cf_replace(hsh)
232
- if(hsh.is_a?(Hash))
231
+ if hsh.is_a?(Hash)
233
232
  case hsh.keys.first
234
233
  when 'Fn::Join'
235
234
  cf_join(*hsh.values.first)
@@ -248,11 +247,11 @@ module Sfn
248
247
  # @param ref_name [Hash]
249
248
  # @return [Object] value in parameters
250
249
  def cf_ref(ref_name)
251
- if(stack.parameters.has_key?(ref_name))
250
+ if stack.parameters.has_key?(ref_name)
252
251
  stack.parameters[ref_name]
253
252
  else
254
253
  raise KeyError.new("No parameter found with given reference name (#{ref_name}). " <<
255
- "Only parameter based references supported!")
254
+ "Only parameter based references supported!")
256
255
  end
257
256
  end
258
257
 
@@ -263,7 +262,7 @@ module Sfn
263
262
  # @return [String]
264
263
  def cf_join(delim, args)
265
264
  args.map do |arg|
266
- if(arg.is_a?(Hash))
265
+ if arg.is_a?(Hash)
267
266
  cf_replace(arg)
268
267
  else
269
268
  arg.to_s