-
Notifications
You must be signed in to change notification settings - Fork 42
Expand file tree
/
Copy pathstack_differ.rb
More file actions
123 lines (98 loc) · 3.12 KB
/
stack_differ.rb
File metadata and controls
123 lines (98 loc) · 3.12 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
require 'diffy'
require 'hashdiff'
module StackMaster
class StackDiffer
def initialize(proposed_stack, current_stack)
@proposed_stack = proposed_stack
@current_stack = current_stack
end
def proposed_template
return @proposed_stack.template_body unless @proposed_stack.template_format == :json
JSON.pretty_generate(JSON.parse(@proposed_stack.template_body)) + "\n"
end
def current_template
return '' unless @current_stack
return @current_stack.template_body unless @current_stack.template_format == :json
JSON.pretty_generate(TemplateUtils.template_hash(@current_stack.template_body)) + "\n"
end
def current_parameters
if @current_stack
YAML.dump(sort_params(@current_stack.parameters_with_defaults))
else
''
end
end
def proposed_parameters
# **** out any secret parameters in the current stack.
params = @proposed_stack.parameters_with_defaults
if @current_stack
noecho_keys.each do |key|
params[key] = '****'
end
end
YAML.dump(sort_params(params))
end
def body_different?
body_diff.different?
end
def body_diff
@body_diff ||= Diff.new(name: 'Stack',
before: current_template,
after: proposed_template,
context: 7)
end
def params_different?
parameters_diff.different?
end
def parameters_diff
@param_diff ||= Diff.new(name: 'Parameters',
before: current_parameters,
after: proposed_parameters)
end
def tags_different?
tags_diff.different?
end
def tags_diff
@tags_diff ||= Diff.new(name: 'Tags',
before: current_tags,
after: proposed_tags)
end
def current_tags
tags_hash = @current_stack&.tags
return '' if tags_hash.nil? || tags_hash.empty?
YAML.dump(sort_params(tags_hash))
end
def proposed_tags
tags_hash = @proposed_stack.tags
return '' if tags_hash.nil? || tags_hash.empty?
YAML.dump(sort_params(tags_hash))
end
def output_diff
body_diff.display
parameters_diff.display
tags_diff.display
StackMaster.stdout.puts ' * can not tell if NoEcho parameters are different.' unless noecho_keys.empty?
StackMaster.stdout.puts 'No stack found' if @current_stack.nil?
end
def noecho_keys
if @current_stack
@current_stack.parameters_with_defaults.select do |_key, value|
value == '****'
end.keys
else
[]
end
end
def single_param_update?(param_name)
return false if param_name.blank? || @current_stack.blank? || body_different?
differences = Hashdiff.diff(@current_stack.parameters_with_defaults, @proposed_stack.parameters_with_defaults)
return false if differences.count != 1
diff = differences[0]
diff[0] == '~' && diff[1] == param_name
end
private
def sort_params(hash)
hash.sort.to_h
end
end
end