stack_master 2.17.0 → 2.17.1
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 +4 -4
- data/README.md +0 -5
- data/lib/stack_master/aws_driver/cloud_formation.rb +21 -19
- data/lib/stack_master/aws_driver/s3.rb +18 -11
- data/lib/stack_master/change_set.rb +5 -5
- data/lib/stack_master/cli.rb +24 -9
- data/lib/stack_master/commands/apply.rb +5 -1
- data/lib/stack_master/commands/delete.rb +2 -3
- data/lib/stack_master/commands/drift.rb +6 -3
- data/lib/stack_master/commands/init.rb +6 -5
- data/lib/stack_master/commands/nag.rb +0 -1
- data/lib/stack_master/commands/resources.rb +9 -1
- data/lib/stack_master/commands/tidy.rb +4 -1
- data/lib/stack_master/config.rb +16 -11
- data/lib/stack_master/identity.rb +2 -1
- data/lib/stack_master/parameter_loader.rb +3 -4
- data/lib/stack_master/parameter_resolver.rb +4 -1
- data/lib/stack_master/parameter_resolvers/acm_certificate.rb +4 -1
- data/lib/stack_master/parameter_resolvers/ami_finder.rb +1 -1
- data/lib/stack_master/parameter_resolvers/ejson.rb +7 -4
- data/lib/stack_master/parameter_resolvers/env.rb +1 -2
- data/lib/stack_master/parameter_resolvers/latest_container.rb +6 -4
- data/lib/stack_master/parameter_resolvers/one_password.rb +7 -3
- data/lib/stack_master/parameter_resolvers/parameter_store.rb +1 -5
- data/lib/stack_master/parameter_resolvers/security_group.rb +1 -1
- data/lib/stack_master/parameter_resolvers/sso_group_id.rb +2 -1
- data/lib/stack_master/parameter_resolvers/stack_output.rb +3 -1
- data/lib/stack_master/parameter_validator.rb +1 -0
- data/lib/stack_master/prompter.rb +11 -10
- data/lib/stack_master/resolver_array.rb +0 -1
- data/lib/stack_master/role_assumer.rb +7 -5
- data/lib/stack_master/security_group_finder.rb +3 -1
- data/lib/stack_master/sns_topic_finder.rb +3 -2
- data/lib/stack_master/sparkle_formation/compile_time/allowed_pattern_validator.rb +1 -2
- data/lib/stack_master/sparkle_formation/compile_time/allowed_values_validator.rb +2 -3
- data/lib/stack_master/sparkle_formation/compile_time/definitions_validator.rb +5 -5
- data/lib/stack_master/sparkle_formation/compile_time/empty_validator.rb +0 -2
- data/lib/stack_master/sparkle_formation/compile_time/max_length_validator.rb +1 -2
- data/lib/stack_master/sparkle_formation/compile_time/max_size_validator.rb +1 -2
- data/lib/stack_master/sparkle_formation/compile_time/min_length_validator.rb +2 -3
- data/lib/stack_master/sparkle_formation/compile_time/min_size_validator.rb +2 -3
- data/lib/stack_master/sparkle_formation/compile_time/number_validator.rb +1 -2
- data/lib/stack_master/sparkle_formation/compile_time/parameters_validator.rb +0 -1
- data/lib/stack_master/sparkle_formation/compile_time/state_builder.rb +0 -2
- data/lib/stack_master/sparkle_formation/compile_time/string_validator.rb +2 -3
- data/lib/stack_master/sparkle_formation/compile_time/value_builder.rb +0 -2
- data/lib/stack_master/sparkle_formation/compile_time/value_validator.rb +2 -3
- data/lib/stack_master/sparkle_formation/compile_time/value_validator_factory.rb +11 -13
- data/lib/stack_master/sparkle_formation/template_file.rb +0 -2
- data/lib/stack_master/sso_group_id_finder.rb +14 -11
- data/lib/stack_master/stack.rb +47 -16
- data/lib/stack_master/stack_definition.rb +3 -1
- data/lib/stack_master/stack_differ.rb +4 -0
- data/lib/stack_master/stack_events/fetcher.rb +3 -1
- data/lib/stack_master/stack_events/presenter.rb +6 -1
- data/lib/stack_master/stack_events/streamer.rb +3 -1
- data/lib/stack_master/stack_status.rb +1 -0
- data/lib/stack_master/template_compilers/sparkle_formation.rb +10 -7
- data/lib/stack_master/template_utils.rb +6 -2
- data/lib/stack_master/test_driver/cloud_formation.rb +27 -10
- data/lib/stack_master/utils.rb +1 -0
- data/lib/stack_master/validator.rb +6 -5
- data/lib/stack_master/version.rb +1 -1
- data/lib/stack_master.rb +2 -0
- metadata +19 -9
- data/lib/stack_master/parameter_resolvers/accounts_by_tags.rb +0 -60
data/lib/stack_master/stack.rb
CHANGED
|
@@ -17,10 +17,13 @@ module StackMaster
|
|
|
17
17
|
include Utils::Initializable
|
|
18
18
|
|
|
19
19
|
def template_default_parameters
|
|
20
|
-
TemplateUtils
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
20
|
+
TemplateUtils
|
|
21
|
+
.template_hash(template)
|
|
22
|
+
.fetch('Parameters', {})
|
|
23
|
+
.inject({}) do |result, (parameter_name, description)|
|
|
24
|
+
result[parameter_name] = description['Default']&.to_s
|
|
25
|
+
result
|
|
26
|
+
end
|
|
24
27
|
end
|
|
25
28
|
|
|
26
29
|
def parameters_with_defaults
|
|
@@ -31,6 +34,7 @@ module StackMaster
|
|
|
31
34
|
cf = StackMaster.cloud_formation_driver
|
|
32
35
|
cf_stack = cf.describe_stacks({ stack_name: stack_name }).stacks.first
|
|
33
36
|
return unless cf_stack
|
|
37
|
+
|
|
34
38
|
parameters = cf_stack.parameters.inject({}) do |params_hash, param_struct|
|
|
35
39
|
params_hash[param_struct.parameter_key] = param_struct.parameter_value
|
|
36
40
|
params_hash
|
|
@@ -56,14 +60,27 @@ module StackMaster
|
|
|
56
60
|
end
|
|
57
61
|
|
|
58
62
|
def self.generate(stack_definition, config)
|
|
59
|
-
parameter_hash = ParameterLoader.load(
|
|
63
|
+
parameter_hash = ParameterLoader.load(
|
|
64
|
+
parameter_files: stack_definition.all_parameter_files,
|
|
65
|
+
parameters: stack_definition.parameters
|
|
66
|
+
)
|
|
60
67
|
template_parameters = ParameterResolver.resolve(config, stack_definition, parameter_hash[:template_parameters])
|
|
61
|
-
compile_time_parameters = ParameterResolver.resolve(
|
|
62
|
-
|
|
68
|
+
compile_time_parameters = ParameterResolver.resolve(
|
|
69
|
+
config,
|
|
70
|
+
stack_definition,
|
|
71
|
+
parameter_hash[:compile_time_parameters]
|
|
72
|
+
)
|
|
73
|
+
template_body = TemplateCompiler.compile(
|
|
74
|
+
config,
|
|
75
|
+
stack_definition.compiler,
|
|
76
|
+
stack_definition.template_dir,
|
|
77
|
+
stack_definition.template,
|
|
78
|
+
compile_time_parameters,
|
|
79
|
+
stack_definition.compiler_options
|
|
80
|
+
)
|
|
63
81
|
template_format = TemplateUtils.identify_template_format(template_body)
|
|
64
|
-
stack_policy_body =
|
|
65
|
-
|
|
66
|
-
end
|
|
82
|
+
stack_policy_body =
|
|
83
|
+
(File.read(stack_definition.stack_policy_file_path) if stack_definition.stack_policy_file_path)
|
|
67
84
|
new(region: stack_definition.region,
|
|
68
85
|
stack_name: stack_definition.stack_name,
|
|
69
86
|
tags: stack_definition.tags,
|
|
@@ -76,13 +93,26 @@ module StackMaster
|
|
|
76
93
|
end
|
|
77
94
|
|
|
78
95
|
def self.generate_without_parameters(stack_definition, config)
|
|
79
|
-
parameter_hash = ParameterLoader.load(
|
|
80
|
-
|
|
81
|
-
|
|
96
|
+
parameter_hash = ParameterLoader.load(
|
|
97
|
+
parameter_files: stack_definition.all_parameter_files,
|
|
98
|
+
parameters: stack_definition.parameters
|
|
99
|
+
)
|
|
100
|
+
compile_time_parameters = ParameterResolver.resolve(
|
|
101
|
+
config,
|
|
102
|
+
stack_definition,
|
|
103
|
+
parameter_hash[:compile_time_parameters]
|
|
104
|
+
)
|
|
105
|
+
template_body = TemplateCompiler.compile(
|
|
106
|
+
config,
|
|
107
|
+
stack_definition.compiler,
|
|
108
|
+
stack_definition.template_dir,
|
|
109
|
+
stack_definition.template,
|
|
110
|
+
compile_time_parameters,
|
|
111
|
+
stack_definition.compiler_options
|
|
112
|
+
)
|
|
82
113
|
template_format = TemplateUtils.identify_template_format(template_body)
|
|
83
|
-
stack_policy_body =
|
|
84
|
-
|
|
85
|
-
end
|
|
114
|
+
stack_policy_body =
|
|
115
|
+
(File.read(stack_definition.stack_policy_file_path) if stack_definition.stack_policy_file_path)
|
|
86
116
|
new(region: stack_definition.region,
|
|
87
117
|
stack_name: stack_definition.stack_name,
|
|
88
118
|
tags: stack_definition.tags,
|
|
@@ -96,6 +126,7 @@ module StackMaster
|
|
|
96
126
|
|
|
97
127
|
def max_template_size(use_s3)
|
|
98
128
|
return TemplateUtils::MAX_S3_TEMPLATE_SIZE if use_s3
|
|
129
|
+
|
|
99
130
|
TemplateUtils::MAX_TEMPLATE_SIZE
|
|
100
131
|
end
|
|
101
132
|
|
|
@@ -65,6 +65,7 @@ module StackMaster
|
|
|
65
65
|
|
|
66
66
|
def template_file_path
|
|
67
67
|
return unless template
|
|
68
|
+
|
|
68
69
|
File.expand_path(template, template_dir)
|
|
69
70
|
end
|
|
70
71
|
|
|
@@ -85,6 +86,7 @@ module StackMaster
|
|
|
85
86
|
|
|
86
87
|
def s3_template_file_name
|
|
87
88
|
return template if ['.json', '.yaml', '.yml'].include?(File.extname(template))
|
|
89
|
+
|
|
88
90
|
Utils.change_extension(template, 'json')
|
|
89
91
|
end
|
|
90
92
|
|
|
@@ -101,7 +103,7 @@ module StackMaster
|
|
|
101
103
|
end
|
|
102
104
|
|
|
103
105
|
def parameter_file_globs
|
|
104
|
-
[
|
|
106
|
+
[default_parameter_glob, region_parameter_glob] + additional_parameter_lookup_globs
|
|
105
107
|
end
|
|
106
108
|
|
|
107
109
|
def stack_policy_file_path
|
|
@@ -10,12 +10,14 @@ module StackMaster
|
|
|
10
10
|
|
|
11
11
|
def proposed_template
|
|
12
12
|
return @proposed_stack.template_body unless @proposed_stack.template_format == :json
|
|
13
|
+
|
|
13
14
|
JSON.pretty_generate(JSON.parse(@proposed_stack.template_body)) + "\n"
|
|
14
15
|
end
|
|
15
16
|
|
|
16
17
|
def current_template
|
|
17
18
|
return '' unless @current_stack
|
|
18
19
|
return @current_stack.template_body unless @current_stack.template_format == :json
|
|
20
|
+
|
|
19
21
|
JSON.pretty_generate(TemplateUtils.template_hash(@current_stack.template_body)) + "\n"
|
|
20
22
|
end
|
|
21
23
|
|
|
@@ -81,8 +83,10 @@ module StackMaster
|
|
|
81
83
|
|
|
82
84
|
def single_param_update?(param_name)
|
|
83
85
|
return false if param_name.blank? || @current_stack.blank? || body_different?
|
|
86
|
+
|
|
84
87
|
differences = Hashdiff.diff(@current_stack.parameters_with_defaults, @proposed_stack.parameters_with_defaults)
|
|
85
88
|
return false if differences.count != 1
|
|
89
|
+
|
|
86
90
|
diff = differences[0]
|
|
87
91
|
diff[0] == "~" && diff[1] == param_name
|
|
88
92
|
end
|
|
@@ -31,7 +31,9 @@ module StackMaster
|
|
|
31
31
|
end
|
|
32
32
|
|
|
33
33
|
def fetch_events
|
|
34
|
-
PagedResponseAccumulator
|
|
34
|
+
PagedResponseAccumulator
|
|
35
|
+
.call(cf, :describe_stack_events, { stack_name: @stack_name }, :stack_events)
|
|
36
|
+
.stack_events
|
|
35
37
|
end
|
|
36
38
|
end
|
|
37
39
|
end
|
|
@@ -10,7 +10,12 @@ module StackMaster
|
|
|
10
10
|
end
|
|
11
11
|
|
|
12
12
|
def print_event(event)
|
|
13
|
-
@io.puts
|
|
13
|
+
@io.puts(
|
|
14
|
+
Rainbow(
|
|
15
|
+
"#{event.timestamp.localtime} #{event.logical_resource_id} #{event.resource_type} " \
|
|
16
|
+
"#{event.resource_status} #{event.resource_status_reason}"
|
|
17
|
+
).color(event_colour(event))
|
|
18
|
+
)
|
|
14
19
|
end
|
|
15
20
|
|
|
16
21
|
def event_colour(event)
|
|
@@ -7,7 +7,8 @@ module StackMaster
|
|
|
7
7
|
new(stack_name, region, **args, &block).stream
|
|
8
8
|
end
|
|
9
9
|
|
|
10
|
-
def initialize(stack_name, region, from: Time.now, break_on_finish_state: true, sleep_between_fetches: 1,
|
|
10
|
+
def initialize(stack_name, region, from: Time.now, break_on_finish_state: true, sleep_between_fetches: 1,
|
|
11
|
+
io: nil, &block)
|
|
11
12
|
@stack_name = stack_name
|
|
12
13
|
@region = region
|
|
13
14
|
@block = block
|
|
@@ -42,6 +43,7 @@ module StackMaster
|
|
|
42
43
|
[].tap do |unseen_events|
|
|
43
44
|
events.each do |event|
|
|
44
45
|
next if @seen_events.include?(event.event_id)
|
|
46
|
+
|
|
45
47
|
@seen_events << event.event_id
|
|
46
48
|
unseen_events << event
|
|
47
49
|
end
|
|
@@ -4,7 +4,6 @@ require 'stack_master/sparkle_formation/compile_time/state_builder'
|
|
|
4
4
|
|
|
5
5
|
module StackMaster::TemplateCompilers
|
|
6
6
|
class SparkleFormation
|
|
7
|
-
|
|
8
7
|
CompileTime = StackMaster::SparkleFormation::CompileTime
|
|
9
8
|
|
|
10
9
|
def self.require_dependencies
|
|
@@ -28,11 +27,12 @@ module StackMaster::TemplateCompilers
|
|
|
28
27
|
private
|
|
29
28
|
|
|
30
29
|
def self.compile_sparkle_template(template_dir, template, compiler_options)
|
|
31
|
-
sparkle_path =
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
30
|
+
sparkle_path =
|
|
31
|
+
if compiler_options['sparkle_path']
|
|
32
|
+
File.expand_path(compiler_options['sparkle_path'])
|
|
33
|
+
else
|
|
34
|
+
template_dir
|
|
35
|
+
end
|
|
36
36
|
|
|
37
37
|
collection = ::SparkleFormation::SparkleCollection.new
|
|
38
38
|
root_pack = ::SparkleFormation::Sparkle.new(
|
|
@@ -48,7 +48,10 @@ module StackMaster::TemplateCompilers
|
|
|
48
48
|
end
|
|
49
49
|
|
|
50
50
|
if compiler_options['sparkle_pack_template']
|
|
51
|
-
|
|
51
|
+
unless collection.templates['aws'].include? template
|
|
52
|
+
raise ArgumentError.new("Template #{template.inspect} not found in any sparkle pack")
|
|
53
|
+
end
|
|
54
|
+
|
|
52
55
|
template_file_path = collection.templates['aws'][template].top['path']
|
|
53
56
|
else
|
|
54
57
|
template_file_path = File.join(template_dir, template)
|
|
@@ -16,8 +16,9 @@ module StackMaster
|
|
|
16
16
|
end
|
|
17
17
|
end
|
|
18
18
|
|
|
19
|
-
def template_hash(template_body=nil)
|
|
19
|
+
def template_hash(template_body = nil)
|
|
20
20
|
return unless template_body
|
|
21
|
+
|
|
21
22
|
template_format = identify_template_format(template_body)
|
|
22
23
|
case template_format
|
|
23
24
|
when :json
|
|
@@ -30,7 +31,10 @@ module StackMaster
|
|
|
30
31
|
def maybe_compressed_template_body(template_body)
|
|
31
32
|
# Do not compress the template if it's not JSON because parsing YAML as a hash ignores
|
|
32
33
|
# CloudFormation-specific tags such as !Ref
|
|
33
|
-
|
|
34
|
+
if template_body.size <= MAX_TEMPLATE_SIZE || identify_template_format(template_body) != :json
|
|
35
|
+
return template_body
|
|
36
|
+
end
|
|
37
|
+
|
|
34
38
|
JSON.dump(template_hash(template_body))
|
|
35
39
|
end
|
|
36
40
|
end
|
|
@@ -99,11 +99,27 @@ module StackMaster
|
|
|
99
99
|
change_set_id = options.fetch(:change_set_name)
|
|
100
100
|
change_set = @change_sets.fetch(change_set_id)
|
|
101
101
|
change_details = [
|
|
102
|
-
OpenStruct.new(
|
|
102
|
+
OpenStruct.new(
|
|
103
|
+
evaluation: 'Static',
|
|
104
|
+
change_source: 'ResourceReference',
|
|
105
|
+
target: OpenStruct.new(
|
|
106
|
+
attribute: 'Properties',
|
|
107
|
+
requires_recreation: 'Always',
|
|
108
|
+
name: 'blah'
|
|
109
|
+
)
|
|
110
|
+
)
|
|
103
111
|
]
|
|
104
|
-
change = OpenStruct.new(
|
|
112
|
+
change = OpenStruct.new(
|
|
113
|
+
action: 'Modify',
|
|
114
|
+
replacement: 'True',
|
|
115
|
+
scope: ['Properties'],
|
|
116
|
+
details: change_details
|
|
117
|
+
)
|
|
105
118
|
changes = [
|
|
106
|
-
OpenStruct.new(
|
|
119
|
+
OpenStruct.new(
|
|
120
|
+
type: 'AWS::Resource',
|
|
121
|
+
resource_change: change
|
|
122
|
+
)
|
|
107
123
|
]
|
|
108
124
|
OpenStruct.new(change_set.merge(changes: changes, status: 'CREATE_COMPLETE'))
|
|
109
125
|
end
|
|
@@ -121,15 +137,16 @@ module StackMaster
|
|
|
121
137
|
|
|
122
138
|
def describe_stacks(options = {})
|
|
123
139
|
stack_name = options[:stack_name]
|
|
124
|
-
stacks =
|
|
125
|
-
if
|
|
126
|
-
|
|
140
|
+
stacks =
|
|
141
|
+
if stack_name
|
|
142
|
+
if @stacks[stack_name]
|
|
143
|
+
[@stacks[stack_name]]
|
|
144
|
+
else
|
|
145
|
+
raise Aws::CloudFormation::Errors::ValidationError.new('', 'Stack does not exist')
|
|
146
|
+
end
|
|
127
147
|
else
|
|
128
|
-
|
|
148
|
+
@stacks.values
|
|
129
149
|
end
|
|
130
|
-
else
|
|
131
|
-
@stacks.values
|
|
132
|
-
end
|
|
133
150
|
OpenStruct.new(stacks: stacks, next_token: nil)
|
|
134
151
|
end
|
|
135
152
|
|
data/lib/stack_master/utils.rb
CHANGED
|
@@ -35,11 +35,12 @@ module StackMaster
|
|
|
35
35
|
end
|
|
36
36
|
|
|
37
37
|
def stack
|
|
38
|
-
@stack ||=
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
38
|
+
@stack ||=
|
|
39
|
+
if validate_template_parameters?
|
|
40
|
+
Stack.generate(@stack_definition, @config)
|
|
41
|
+
else
|
|
42
|
+
Stack.generate_without_parameters(@stack_definition, @config)
|
|
43
|
+
end
|
|
43
44
|
end
|
|
44
45
|
|
|
45
46
|
def parameter_validator
|
data/lib/stack_master/version.rb
CHANGED
data/lib/stack_master.rb
CHANGED
|
@@ -140,6 +140,7 @@ module StackMaster
|
|
|
140
140
|
|
|
141
141
|
def debug(message)
|
|
142
142
|
return unless debug?
|
|
143
|
+
|
|
143
144
|
stderr.puts Rainbow("[DEBUG] #{message}").color(:green)
|
|
144
145
|
end
|
|
145
146
|
|
|
@@ -167,6 +168,7 @@ module StackMaster
|
|
|
167
168
|
end
|
|
168
169
|
|
|
169
170
|
attr_accessor :non_interactive_answer
|
|
171
|
+
|
|
170
172
|
@non_interactive_answer = 'y'
|
|
171
173
|
|
|
172
174
|
def base_dir
|
metadata
CHANGED
|
@@ -1,15 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: stack_master
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 2.17.
|
|
4
|
+
version: 2.17.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Steve Hodgkiss
|
|
8
8
|
- Glen Stampoultzis
|
|
9
|
-
autorequire:
|
|
10
9
|
bindir: bin
|
|
11
10
|
cert_chain: []
|
|
12
|
-
date:
|
|
11
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
|
13
12
|
dependencies:
|
|
14
13
|
- !ruby/object:Gem::Dependency
|
|
15
14
|
name: bundler
|
|
@@ -123,6 +122,20 @@ dependencies:
|
|
|
123
122
|
- - ">="
|
|
124
123
|
- !ruby/object:Gem::Version
|
|
125
124
|
version: '0'
|
|
125
|
+
- !ruby/object:Gem::Dependency
|
|
126
|
+
name: rubocop
|
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
|
128
|
+
requirements:
|
|
129
|
+
- - ">="
|
|
130
|
+
- !ruby/object:Gem::Version
|
|
131
|
+
version: '0'
|
|
132
|
+
type: :development
|
|
133
|
+
prerelease: false
|
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
135
|
+
requirements:
|
|
136
|
+
- - ">="
|
|
137
|
+
- !ruby/object:Gem::Version
|
|
138
|
+
version: '0'
|
|
126
139
|
- !ruby/object:Gem::Dependency
|
|
127
140
|
name: os
|
|
128
141
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -542,7 +555,6 @@ files:
|
|
|
542
555
|
- lib/stack_master/paged_response_accumulator.rb
|
|
543
556
|
- lib/stack_master/parameter_loader.rb
|
|
544
557
|
- lib/stack_master/parameter_resolver.rb
|
|
545
|
-
- lib/stack_master/parameter_resolvers/accounts_by_tags.rb
|
|
546
558
|
- lib/stack_master/parameter_resolvers/acm_certificate.rb
|
|
547
559
|
- lib/stack_master/parameter_resolvers/ami_finder.rb
|
|
548
560
|
- lib/stack_master/parameter_resolvers/ejson.rb
|
|
@@ -610,9 +622,8 @@ licenses:
|
|
|
610
622
|
metadata:
|
|
611
623
|
bug_tracker_uri: https://github.com/envato/stack_master/issues
|
|
612
624
|
changelog_uri: https://github.com/envato/stack_master/blob/master/CHANGELOG.md
|
|
613
|
-
documentation_uri: https://www.rubydoc.info/gems/stack_master/2.17.
|
|
614
|
-
source_code_uri: https://github.com/envato/stack_master/tree/v2.17.
|
|
615
|
-
post_install_message:
|
|
625
|
+
documentation_uri: https://www.rubydoc.info/gems/stack_master/2.17.1
|
|
626
|
+
source_code_uri: https://github.com/envato/stack_master/tree/v2.17.1
|
|
616
627
|
rdoc_options: []
|
|
617
628
|
require_paths:
|
|
618
629
|
- lib
|
|
@@ -627,8 +638,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
627
638
|
- !ruby/object:Gem::Version
|
|
628
639
|
version: '0'
|
|
629
640
|
requirements: []
|
|
630
|
-
rubygems_version:
|
|
631
|
-
signing_key:
|
|
641
|
+
rubygems_version: 4.0.2
|
|
632
642
|
specification_version: 4
|
|
633
643
|
summary: StackMaster is a sure-footed way of creating, updating and keeping track
|
|
634
644
|
of Amazon (AWS) CloudFormation stacks.
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
module StackMaster
|
|
2
|
-
module ParameterResolvers
|
|
3
|
-
class AccountsByTags < Resolver
|
|
4
|
-
array_resolver class_name: 'AccountsByTags'
|
|
5
|
-
|
|
6
|
-
def initialize(config, stack_definition)
|
|
7
|
-
@config = config
|
|
8
|
-
@stack_definition = stack_definition
|
|
9
|
-
end
|
|
10
|
-
|
|
11
|
-
def resolve(team)
|
|
12
|
-
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
private
|
|
16
|
-
|
|
17
|
-
def fetch_all_aws_accounts()
|
|
18
|
-
return @aws_accounts if defined(@aws_accounts)
|
|
19
|
-
@aws_accounts = []
|
|
20
|
-
next_token = nil
|
|
21
|
-
client = Aws::Organizations::Client.new(region: @stack_definition.region)
|
|
22
|
-
loop do
|
|
23
|
-
resp = client.list_accounts(next_token: next_token)
|
|
24
|
-
@aws_accounts << resp.accounts
|
|
25
|
-
next_token = resp.next_token
|
|
26
|
-
break if next_token.nil?
|
|
27
|
-
end
|
|
28
|
-
@aws_accounts.flatten! || @aws_accounts
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
def_fetch_tags_for_account(account)
|
|
32
|
-
client = Aws::Organizations::Client.new(region: @stack_definition.region)
|
|
33
|
-
next_token = nil
|
|
34
|
-
tags = []
|
|
35
|
-
loop do
|
|
36
|
-
client.list_tags_for_resource(resource_id: account.id, next_token: next_token)
|
|
37
|
-
tags << resp.tags
|
|
38
|
-
next_token = resp.next_token
|
|
39
|
-
break if next_token.nil?
|
|
40
|
-
end
|
|
41
|
-
tags.flatten! || tags
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
def fetch_tags_for_accounts()
|
|
45
|
-
return @tagged_aws_accounts if defined?(@tagged_aws_accounts )
|
|
46
|
-
@tagged_aws_accounts = Hash.new()
|
|
47
|
-
fetch_all_aws_accounts()
|
|
48
|
-
@aws_accounts.each do |account|
|
|
49
|
-
@tagged_aws_accounts[account.id.to_sym] = { :account => account.id, :tags => fetch_tags_for_account(account.id) }
|
|
50
|
-
end
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
def account_in_group?(account, group)
|
|
54
|
-
fetch_tags_for_accounts if defined?(@tagged_aws_accounts)
|
|
55
|
-
@tagged_aws_accounts[:account.to_sym][:tags].select {|tag| tag['key'] =='Group' && tag['value']==group}
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
end
|
|
59
|
-
end
|
|
60
|
-
end
|