sfn 3.0.28 → 3.0.30

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.
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
@@ -13,14 +13,14 @@ module Sfn
13
13
 
14
14
  attr_accessor :name
15
15
 
16
- def initialize(template, args={})
16
+ def initialize(template, args = {})
17
17
  super
18
18
  @name = args[:name]
19
19
  end
20
20
 
21
- def apply_function(hash, funcs=[])
21
+ def apply_function(hash, funcs = [])
22
22
  k, v = hash.first
23
- if(hash.size == 1)
23
+ if hash.size == 1
24
24
  case k
25
25
  when 'Ref'
26
26
  parameters.key?(v) ? parameters[v] : hash
@@ -37,27 +37,27 @@ module Sfn
37
37
  end
38
38
  end
39
39
 
40
- def output_discovery(template, outputs, resource_name, parent_template, name='')
41
- if(template['Resources'])
40
+ def output_discovery(template, outputs, resource_name, parent_template, name = '')
41
+ if template['Resources']
42
42
  template['Resources'].keys.each do |r_name|
43
43
  r_info = template['Resources'][r_name]
44
- if(r_info['Type'] == 'AWS::CloudFormation::Stack')
44
+ if r_info['Type'] == 'AWS::CloudFormation::Stack'
45
45
  output_discovery(r_info['Properties']['Stack'], outputs, r_name, template, r_name)
46
46
  end
47
47
  end
48
48
  end
49
- if(parent_template)
49
+ if parent_template
50
50
  ui.debug "Pre-processing stack resource `#{resource_name}`"
51
51
  substack_parameters = Smash[
52
52
  parent_template.fetch('Resources', resource_name, 'Properties', 'Parameters', {}).map do |key, value|
53
53
  result = [key, value]
54
- if(value.is_a?(Hash))
54
+ if value.is_a?(Hash)
55
55
  v_key = value.keys.first
56
56
  v_value = value.values.first
57
- if(v_key == 'Fn::GetAtt' && parent_template.fetch('Resources', {}).keys.include?(v_value.first) && v_value.last.start_with?('Outputs.'))
57
+ if v_key == 'Fn::GetAtt' && parent_template.fetch('Resources', {}).keys.include?(v_value.first) && v_value.last.start_with?('Outputs.')
58
58
  output_key = v_value.first + '__' + v_value.last.split('.', 2).last
59
59
  ui.debug "Output key for check: #{output_key}"
60
- if(outputs.key?(output_key))
60
+ if outputs.key?(output_key)
61
61
  new_value = outputs[output_key]
62
62
  result = [key, new_value]
63
63
  ui.debug "Parameter for output swap `#{key}`: #{value} -> #{new_value}"
@@ -71,8 +71,7 @@ module Sfn
71
71
  ui.debug "Generated internal parameters for `#{resource_name}`: #{substack_parameters}"
72
72
 
73
73
  processor = AwsGraphProcessor.new({},
74
- :parameters => substack_parameters
75
- )
74
+ :parameters => substack_parameters)
76
75
  template['Resources'] = processor.dereference_processor(
77
76
  template['Resources'], ['Ref']
78
77
  )
@@ -80,12 +79,11 @@ module Sfn
80
79
  template['Outputs'], ['Ref']
81
80
  )
82
81
  rename_processor = AwsGraphProcessor.new({},
83
- :parameters => Smash[
84
- template.fetch('Resources', {}).keys.map do |r_key|
85
- [r_key, {'Ref' => [name, r_key].join}]
86
- end
87
- ]
88
- )
82
+ :parameters => Smash[
83
+ template.fetch('Resources', {}).keys.map do |r_key|
84
+ [r_key, {'Ref' => [name, r_key].join}]
85
+ end
86
+ ])
89
87
  derefed_outs = rename_processor.dereference_processor(
90
88
  template.fetch('Outputs', {})
91
89
  ) || {}
@@ -96,12 +94,12 @@ module Sfn
96
94
  end
97
95
  end
98
96
  outputs.dup.each do |key, value|
99
- if(value.is_a?(Hash))
97
+ if value.is_a?(Hash)
100
98
  v_key = value.keys.first
101
99
  v_value = value.values.first
102
- if(v_key == 'Fn::GetAtt' && v_value.last.start_with?('Outputs.'))
100
+ if v_key == 'Fn::GetAtt' && v_value.last.start_with?('Outputs.')
103
101
  output_key = v_value.first << '__' << v_value.last.split('.', 2).last
104
- if(outputs.key?(output_key))
102
+ if outputs.key?(output_key)
105
103
  outputs[key] = outputs[output_key]
106
104
  end
107
105
  end
@@ -114,12 +112,12 @@ module Sfn
114
112
  node_prefix = name
115
113
  resources.each do |resource_name, resource_data|
116
114
  node_name = [node_prefix, resource_name].join
117
- if(resource_data['Type'] == 'AWS::CloudFormation::Stack')
115
+ if resource_data['Type'] == 'AWS::CloudFormation::Stack'
118
116
  graph.subgraph << generate_graph(
119
117
  resource_data['Properties'].delete('Stack'),
120
118
  :name => resource_name,
121
119
  :type => resource_data['Type'],
122
- :resource_names => resource_names
120
+ :resource_names => resource_names,
123
121
  )
124
122
  next
125
123
  else
@@ -129,30 +127,30 @@ module Sfn
129
127
  graph.filled << graph.node(node_name)
130
128
  graph.node(node_name).label "#{resource_name}\n<#{resource_data['Type']}>\n#{name}"
131
129
  resource_dependencies(resource_data, resource_names + resources.keys).each do |dep_name|
132
- if(resources.keys.include?(dep_name))
130
+ if resources.keys.include?(dep_name)
133
131
  dep_name = [node_prefix, dep_name].join
134
132
  end
135
- if(config[:graph_style] == 'creation')
133
+ if config[:graph_style] == 'creation'
136
134
  @root_graph.edge(dep_name, node_name)
137
135
  else
138
136
  @root_graph.edge(node_name, dep_name)
139
137
  end
140
138
  end
141
139
  end
142
- resource_names.concat resources.keys.map{|r_name| [node_prefix, r_name].join}
140
+ resource_names.concat resources.keys.map { |r_name| [node_prefix, r_name].join }
143
141
  end
144
142
 
145
143
  def resource_dependencies(data, names)
146
144
  case data
147
145
  when Hash
148
146
  data.map do |key, value|
149
- if(key == 'Ref' && names.include?(value))
147
+ if key == 'Ref' && names.include?(value)
150
148
  value
151
- elsif(key == 'DependsOn')
149
+ elsif key == 'DependsOn'
152
150
  [value].flatten.compact.find_all do |dependson_name|
153
151
  names.include?(dependson_name)
154
152
  end
155
- elsif(key == 'Fn::GetAtt' && names.include?(res = [value].flatten.compact.first))
153
+ elsif key == 'Fn::GetAtt' && names.include?(res = [value].flatten.compact.first)
156
154
  res
157
155
  else
158
156
  resource_dependencies(key, names) +
@@ -13,15 +13,15 @@ module Sfn
13
13
 
14
14
  attr_accessor :name
15
15
 
16
- def initialize(template, args={})
16
+ def initialize(template, args = {})
17
17
  super
18
18
  @name = args[:name]
19
19
  end
20
20
 
21
- def dereference_processor(obj, funcs=[])
21
+ def dereference_processor(obj, funcs = [])
22
22
  case obj
23
23
  when Array
24
- obj = obj.map{|v| dereference_processor(v, funcs)}
24
+ obj = obj.map { |v| dereference_processor(v, funcs) }
25
25
  when Hash
26
26
  new_hash = {}
27
27
  obj.each do |k, v|
@@ -50,10 +50,10 @@ module Sfn
50
50
  @original.fetch('outputs', {})
51
51
  end
52
52
 
53
- def apply_function(string, funcs=[])
53
+ def apply_function(string, funcs = [])
54
54
  # first check for vars and replace with params
55
55
  string.scan(/(\$\{var\.(.+?)\})/).each do |match|
56
- if(parameters[match.last])
56
+ if parameters[match.last]
57
57
  string.sub!(match.first, parameters[match.last])
58
58
  end
59
59
  end
@@ -61,24 +61,24 @@ module Sfn
61
61
  end
62
62
  end
63
63
 
64
- def output_discovery(template, outputs, resource_name, parent_template, name='')
65
- if(template['resources'])
64
+ def output_discovery(template, outputs, resource_name, parent_template, name = '')
65
+ if template['resources']
66
66
  template['resources'].keys.each do |r_name|
67
67
  r_info = template['resources'][r_name]
68
- if(r_info['type'] == 'module')
68
+ if r_info['type'] == 'module'
69
69
  output_discovery(r_info['properties']['stack'], outputs, r_name, template, r_name)
70
70
  end
71
71
  end
72
72
  end
73
- if(parent_template)
73
+ if parent_template
74
74
  ui.debug "Pre-processing stack resource `#{resource_name}`"
75
75
  substack_parameters = Smash[
76
76
  parent_template.fetch('resources', resource_name, 'properties', 'parameters', {}).map do |key, value|
77
77
  result = [key, value]
78
- if(value.to_s.start_with?('${module.'))
78
+ if value.to_s.start_with?('${module.')
79
79
  output_key = value.sub('${module.', '').sub('}', '').sub('.', '__')
80
80
  ui.debug "Output key for check: #{output_key}"
81
- if(outputs.key?(output_key))
81
+ if outputs.key?(output_key)
82
82
  new_value = outputs[output_key]
83
83
  result = [key, new_value]
84
84
  ui.debug "Parameter for output swap `#{key}`: #{value} -> #{new_value}"
@@ -91,8 +91,7 @@ module Sfn
91
91
  ui.debug "Generated internal parameters for `#{resource_name}`: #{substack_parameters}"
92
92
 
93
93
  processor = TerraformGraphProcessor.new({},
94
- :parameters => substack_parameters
95
- )
94
+ :parameters => substack_parameters)
96
95
  template['resources'] = processor.dereference_processor(
97
96
  template['resources'], []
98
97
  )
@@ -103,7 +102,7 @@ module Sfn
103
102
  derefed_outs.each do |o_name, o_data|
104
103
  o_key = [name, o_name].join('__')
105
104
  val = o_data['value']
106
- if(val.start_with?('${') && val.scan('.').count == 2)
105
+ if val.start_with?('${') && val.scan('.').count == 2
107
106
  val = val.split('.')
108
107
  val[1] = "#{name}__#{val[1]}"
109
108
  val = val.join('.')
@@ -112,9 +111,9 @@ module Sfn
112
111
  end
113
112
  end
114
113
  outputs.dup.each do |key, value|
115
- if(value.to_s.start_with?('${module.'))
114
+ if value.to_s.start_with?('${module.')
116
115
  output_key = value.to_s.sub('${module.', '').sub('}', '').sub('.', '__')
117
- if(outputs.key?(output_key))
116
+ if outputs.key?(output_key)
118
117
  outputs[key] = outputs[output_key]
119
118
  end
120
119
  end
@@ -126,12 +125,12 @@ module Sfn
126
125
  node_prefix = name
127
126
  resources.each do |resource_name, resource_data|
128
127
  node_name = [node_prefix, resource_name].join('__')
129
- if(resource_data['type'] == 'module')
128
+ if resource_data['type'] == 'module'
130
129
  graph.subgraph << generate_graph(
131
130
  resource_data['properties'].delete('stack'),
132
131
  :name => resource_name,
133
132
  :type => resource_data['type'],
134
- :resource_names => resource_names
133
+ :resource_names => resource_names,
135
134
  )
136
135
  next
137
136
  else
@@ -141,24 +140,24 @@ module Sfn
141
140
  graph.filled << graph.node(node_name)
142
141
  graph.node(node_name).label "#{resource_name}\n<#{resource_data['type']}>\n#{name}"
143
142
  resource_dependencies(resource_data, resource_names + resources.keys).each do |dep_name|
144
- if(resources.keys.include?(dep_name))
143
+ if resources.keys.include?(dep_name)
145
144
  dep_name = [node_prefix, dep_name].join('__')
146
145
  end
147
- if(config[:graph_style] == 'creation')
146
+ if config[:graph_style] == 'creation'
148
147
  @root_graph.edge(dep_name, node_name)
149
148
  else
150
149
  @root_graph.edge(node_name, dep_name)
151
150
  end
152
151
  end
153
152
  end
154
- resource_names.concat resources.keys.map{|r_name| [node_prefix, r_name].join('__')}
153
+ resource_names.concat resources.keys.map { |r_name| [node_prefix, r_name].join('__') }
155
154
  end
156
155
 
157
156
  def resource_dependencies(data, names)
158
157
  case data
159
158
  when String
160
159
  result = []
161
- if(data.start_with?('${') && data.scan('.').count >= 1)
160
+ if data.start_with?('${') && data.scan('.').count >= 1
162
161
  data = data.tr('${}', '')
163
162
  check_name = data.split('.')[1]
164
163
  if names.include?(check_name)
@@ -168,7 +167,7 @@ module Sfn
168
167
  result
169
168
  when Hash
170
169
  data.map do |key, value|
171
- if(key == 'depends_on')
170
+ if key == 'depends_on'
172
171
  [value].flatten.compact.map do |dependson_name|
173
172
  dep_name = dependson_name.split('.').last
174
173
  dep_name if names.include?(dep_name)
@@ -5,7 +5,6 @@ module Sfn
5
5
  class Command
6
6
  # Import command
7
7
  class Import < Command
8
-
9
8
  include Sfn::CommandModule::Base
10
9
  include Sfn::Utils::JSON
11
10
  include Sfn::Utils::ObjectStorage
@@ -16,19 +15,19 @@ module Sfn
16
15
  raise NotImplementedError.new 'Implementation updates required'
17
16
  stack_name, json_file = name_args
18
17
  ui.info "#{ui.color('Stack Import:', :bold)} #{stack_name}"
19
- unless(json_file)
18
+ unless json_file
20
19
  entries = [].tap do |_entries|
21
20
  _entries.push('s3') if config[:bucket]
22
21
  _entries.push('fs') if config[:path]
23
22
  end
24
- if(entries.size > 1)
23
+ if entries.size > 1
25
24
  valid = false
26
- until(valid)
25
+ until valid
27
26
  answer = ui.ask_question('Import via file system (fs) or remote bucket (remote)?', :default => 'remote')
28
27
  valid = true if %w(remote fs).include?(answer)
29
28
  entries = [answer]
30
29
  end
31
- elsif(entries.size < 1)
30
+ elsif entries.size < 1
32
31
  ui.fatal 'No path or bucket set. Unable to perform dynamic lookup!'
33
32
  exit 1
34
33
  end
@@ -39,14 +38,14 @@ module Sfn
39
38
  json_file = local_discovery
40
39
  end
41
40
  end
42
- if(File.exists?(json_file) || json_file.is_a?(IO))
41
+ if File.exists?(json_file) || json_file.is_a?(IO)
43
42
  content = json_file.is_a?(IO) ? json_file.read : File.read(json_file)
44
43
  export = Mash.new(_from_json(content))
45
44
  begin
46
45
  creator = namespace.const_val(:Create).new(
47
46
  Smash.new(
48
47
  :template => _from_json(export[:stack][:template]),
49
- :options => _from_json(export[:stack][:options])
48
+ :options => _from_json(export[:stack][:options]),
50
49
  ),
51
50
  [stack_name]
52
51
  )
@@ -68,8 +67,8 @@ module Sfn
68
67
  #
69
68
  # @return [String, NilClass]
70
69
  def bucket_prefix
71
- if(prefix = config[:bucket_prefix])
72
- if(prefix.respond_to?(:call))
70
+ if prefix = config[:bucket_prefix]
71
+ if prefix.respond_to?(:call)
73
72
  prefix.call
74
73
  else
75
74
  prefix.to_s
@@ -87,9 +86,9 @@ module Sfn
87
86
  directory,
88
87
  :directories_name => 'Collections',
89
88
  :files_names => 'Exports',
90
- :filter_prefix => bucket_prefix
89
+ :filter_prefix => bucket_prefix,
91
90
  )
92
- if(file)
91
+ if file
93
92
  remote_file = storage.files.get(file)
94
93
  StringIO.new(remote_file.body)
95
94
  end
@@ -101,17 +100,15 @@ module Sfn
101
100
  def local_discovery
102
101
  _, bucket = config[:path].split('/', 2)
103
102
  storage = provider.service_for(:storage,
104
- :provider => :local,
105
- :local_root => '/'
106
- )
103
+ :provider => :local,
104
+ :local_root => '/')
107
105
  directory = storage.directories.get(bucket)
108
106
  prompt_for_file(
109
107
  directory,
110
108
  :directories_name => 'Collections',
111
- :files_names => 'Exports'
109
+ :files_names => 'Exports',
112
110
  )
113
111
  end
114
-
115
112
  end
116
113
  end
117
114
  end
@@ -5,26 +5,25 @@ module Sfn
5
5
  class Command
6
6
  # Init command
7
7
  class Init < Command
8
-
9
8
  include Sfn::CommandModule::Base
10
9
 
11
10
  INIT_DIRECTORIES = [
12
11
  'sparkleformation/dynamics',
13
12
  'sparkleformation/components',
14
- 'sparkleformation/registry'
13
+ 'sparkleformation/registry',
15
14
  ]
16
15
 
17
16
  # Run the init command to initialize new project
18
17
  def execute!
19
- unless(name_args.size == 1)
18
+ unless name_args.size == 1
20
19
  raise ArgumentError.new 'Please provide path argument only for project initialization'
21
20
  else
22
21
  path = name_args.first
23
22
  end
24
- if(File.file?(path))
23
+ if File.file?(path)
25
24
  raise "Cannot create project directory. Given path is a file. (`#{path}`)"
26
25
  end
27
- if(File.directory?(path))
26
+ if File.directory?(path)
28
27
  ui.warn "Project directory already exists at given path. (`#{path}`)"
29
28
  ui.confirm 'Overwrite existing files?'
30
29
  end
@@ -46,7 +45,7 @@ module Sfn
46
45
  end
47
46
  ui.info 'Installing project bundle'
48
47
  Dir.chdir(path) do
49
- if(defined?(Bundler))
48
+ if defined?(Bundler)
50
49
  Bundler.clean_system('bundle install')
51
50
  else
52
51
  system('bundle install')
@@ -55,7 +54,6 @@ module Sfn
55
54
  ui.info 'Project initialization complete!'
56
55
  ui.puts " Project path -> #{File.expand_path(path)}"
57
56
  end
58
-
59
57
  end
60
58
  end
61
59
  end
@@ -4,7 +4,6 @@ module Sfn
4
4
  class Command
5
5
  # Inspect command
6
6
  class Inspect < Command
7
-
8
7
  include Sfn::CommandModule::Base
9
8
  include Sfn::Utils::Ssher
10
9
 
@@ -16,19 +15,19 @@ module Sfn
16
15
  ui.info "Stack inspection #{ui.color(stack_name, :bold)}:"
17
16
  outputs = api_action!(:api_stack => stack) do
18
17
  [:attribute, :nodes, :load_balancers, :instance_failure].map do |key|
19
- if(config.has_key?(key))
18
+ if config.has_key?(key)
20
19
  send("display_#{key}", stack)
21
20
  key
22
21
  end
23
22
  end.compact
24
23
  end
25
- if(outputs.empty?)
24
+ if outputs.empty?
26
25
  ui.info ' Stack dump:'
27
26
  ui.puts MultiJson.dump(
28
27
  MultiJson.load(
29
28
  stack.reload.to_json
30
29
  ),
31
- :pretty => true
30
+ :pretty => true,
32
31
  )
33
32
  end
34
33
  end
@@ -38,32 +37,32 @@ module Sfn
38
37
  resource.state.to_s.end_with?('failed')
39
38
  end.map do |resource|
40
39
  # If compute instance, simply expand
41
- if(resource.within?(:compute, :servers))
40
+ if resource.within?(:compute, :servers)
42
41
  resource.instance
43
- # If a waitcondition, check for instance ID
44
- elsif(resource.type.to_s.downcase.end_with?('waitcondition'))
45
- if(resource.status_reason.to_s.include?('uniqueId'))
42
+ # If a waitcondition, check for instance ID
43
+ elsif resource.type.to_s.downcase.end_with?('waitcondition')
44
+ if resource.status_reason.to_s.include?('uniqueId')
46
45
  srv_id = resource.status_reason.split(' ').last.strip
47
46
  provider.connection.api_for(:compute).servers.get(srv_id)
48
47
  end
49
48
  end
50
49
  end.compact
51
- if(instances.empty?)
50
+ if instances.empty?
52
51
  ui.error 'Failed to locate any failed instances'
53
52
  else
54
53
  log_path = config[:failure_log_path]
55
- if(log_path.to_s.empty?)
54
+ if log_path.to_s.empty?
56
55
  log_path = '/var/log/chef/client.log'
57
56
  end
58
57
  opts = ssh_key ? {:keys => [ssh_key]} : {}
59
58
  instances.each do |instance|
60
59
  ui.info " -> Log inspect for #{instance.id}:"
61
60
  address = instance.addresses_public.map do |address|
62
- if(address.version == 4)
61
+ if address.version == 4
63
62
  address.address
64
63
  end
65
64
  end
66
- if(address)
65
+ if address
67
66
  ssh_attempt_users.each do |user|
68
67
  begin
69
68
  ui.info remote_file_contents(address.first, user, log_path, opts)
@@ -96,12 +95,12 @@ module Sfn
96
95
  [config[:attribute]].flatten.compact.each do |stack_attribute|
97
96
  attr = stack_attribute.split('.').inject(stack) do |memo, key|
98
97
  args = key.scan(/\(([^\)]*)\)/).flatten.first.to_s
99
- if(args)
100
- args = args.split(',').map{|a| a.to_i.to_s == a ? a.to_i : a}
98
+ if args
99
+ args = args.split(',').map { |a| a.to_i.to_s == a ? a.to_i : a }
101
100
  key = key.split('(').first
102
101
  end
103
- if(memo.public_methods.include?(key.to_sym))
104
- if(args.size == 1 && args.first.to_s.start_with?('&'))
102
+ if memo.public_methods.include?(key.to_sym)
103
+ if args.size == 1 && args.first.to_s.start_with?('&')
105
104
  memo.send(key, &args.first.slice(2, args.first.size).to_sym)
106
105
  else
107
106
  memo.send(*[key, args].flatten.compact)
@@ -115,7 +114,7 @@ module Sfn
115
114
  MultiJson.load(
116
115
  MultiJson.dump(attr)
117
116
  ),
118
- :pretty => true
117
+ :pretty => true,
119
118
  )
120
119
  end
121
120
  end
@@ -129,13 +128,13 @@ module Sfn
129
128
  [
130
129
  asg.name,
131
130
  Smash[
132
- asg.servers.map(&:expand).compact.map{|s|
131
+ asg.servers.map(&:expand).compact.map { |s|
133
132
  [s.id, Smash.new(
134
- :name => s.name,
135
- :addresses => s.addresses.map(&:address)
133
+ :name => s.name,
134
+ :addresses => s.addresses.map(&:address),
136
135
  )]
137
136
  }
138
- ]
137
+ ],
139
138
  ]
140
139
  end
141
140
  ]
@@ -144,19 +143,19 @@ module Sfn
144
143
  resource.within?(:compute, :servers)
145
144
  end.map do |srv|
146
145
  srv = srv.instance
147
- if(srv)
146
+ if srv
148
147
  [srv.id, Smash.new(
149
148
  :name => srv.name,
150
- :addresses => srv.addresses.map(&:address)
149
+ :addresses => srv.addresses.map(&:address),
151
150
  )]
152
151
  end
153
152
  end.compact
154
153
  ]
155
- unless(asg_nodes.empty?)
154
+ unless asg_nodes.empty?
156
155
  ui.info ' AutoScale Group Instances:'
157
156
  ui.puts MultiJson.dump(asg_nodes, :pretty => true)
158
157
  end
159
- unless(compute_nodes.empty?)
158
+ unless compute_nodes.empty?
160
159
  ui.info ' Compute Instances:'
161
160
  ui.puts MultiJson.dump(compute_nodes, :pretty => true)
162
161
  end
@@ -175,9 +174,8 @@ module Sfn
175
174
  :state => exp_lb.state,
176
175
  :public_addresses => lb_pub_addrs,
177
176
  :private_addresses => lb_priv_addrs,
178
- :server_states => exp_lb.server_states
179
- ).delete_if {|k,v| v.nil?}
180
- ]
177
+ :server_states => exp_lb.server_states,
178
+ ).delete_if { |k, v| v.nil? }]
181
179
  end
182
180
  ]
183
181
  unless load_balancers.empty?
@@ -185,7 +183,6 @@ module Sfn
185
183
  ui.puts MultiJson.dump(load_balancers, :pretty => true)
186
184
  end
187
185
  end
188
-
189
186
  end
190
187
  end
191
188
  end