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.
Files changed (66) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +0 -5
  3. data/lib/stack_master/aws_driver/cloud_formation.rb +21 -19
  4. data/lib/stack_master/aws_driver/s3.rb +18 -11
  5. data/lib/stack_master/change_set.rb +5 -5
  6. data/lib/stack_master/cli.rb +24 -9
  7. data/lib/stack_master/commands/apply.rb +5 -1
  8. data/lib/stack_master/commands/delete.rb +2 -3
  9. data/lib/stack_master/commands/drift.rb +6 -3
  10. data/lib/stack_master/commands/init.rb +6 -5
  11. data/lib/stack_master/commands/nag.rb +0 -1
  12. data/lib/stack_master/commands/resources.rb +9 -1
  13. data/lib/stack_master/commands/tidy.rb +4 -1
  14. data/lib/stack_master/config.rb +16 -11
  15. data/lib/stack_master/identity.rb +2 -1
  16. data/lib/stack_master/parameter_loader.rb +3 -4
  17. data/lib/stack_master/parameter_resolver.rb +4 -1
  18. data/lib/stack_master/parameter_resolvers/acm_certificate.rb +4 -1
  19. data/lib/stack_master/parameter_resolvers/ami_finder.rb +1 -1
  20. data/lib/stack_master/parameter_resolvers/ejson.rb +7 -4
  21. data/lib/stack_master/parameter_resolvers/env.rb +1 -2
  22. data/lib/stack_master/parameter_resolvers/latest_container.rb +6 -4
  23. data/lib/stack_master/parameter_resolvers/one_password.rb +7 -3
  24. data/lib/stack_master/parameter_resolvers/parameter_store.rb +1 -5
  25. data/lib/stack_master/parameter_resolvers/security_group.rb +1 -1
  26. data/lib/stack_master/parameter_resolvers/sso_group_id.rb +2 -1
  27. data/lib/stack_master/parameter_resolvers/stack_output.rb +3 -1
  28. data/lib/stack_master/parameter_validator.rb +1 -0
  29. data/lib/stack_master/prompter.rb +11 -10
  30. data/lib/stack_master/resolver_array.rb +0 -1
  31. data/lib/stack_master/role_assumer.rb +7 -5
  32. data/lib/stack_master/security_group_finder.rb +3 -1
  33. data/lib/stack_master/sns_topic_finder.rb +3 -2
  34. data/lib/stack_master/sparkle_formation/compile_time/allowed_pattern_validator.rb +1 -2
  35. data/lib/stack_master/sparkle_formation/compile_time/allowed_values_validator.rb +2 -3
  36. data/lib/stack_master/sparkle_formation/compile_time/definitions_validator.rb +5 -5
  37. data/lib/stack_master/sparkle_formation/compile_time/empty_validator.rb +0 -2
  38. data/lib/stack_master/sparkle_formation/compile_time/max_length_validator.rb +1 -2
  39. data/lib/stack_master/sparkle_formation/compile_time/max_size_validator.rb +1 -2
  40. data/lib/stack_master/sparkle_formation/compile_time/min_length_validator.rb +2 -3
  41. data/lib/stack_master/sparkle_formation/compile_time/min_size_validator.rb +2 -3
  42. data/lib/stack_master/sparkle_formation/compile_time/number_validator.rb +1 -2
  43. data/lib/stack_master/sparkle_formation/compile_time/parameters_validator.rb +0 -1
  44. data/lib/stack_master/sparkle_formation/compile_time/state_builder.rb +0 -2
  45. data/lib/stack_master/sparkle_formation/compile_time/string_validator.rb +2 -3
  46. data/lib/stack_master/sparkle_formation/compile_time/value_builder.rb +0 -2
  47. data/lib/stack_master/sparkle_formation/compile_time/value_validator.rb +2 -3
  48. data/lib/stack_master/sparkle_formation/compile_time/value_validator_factory.rb +11 -13
  49. data/lib/stack_master/sparkle_formation/template_file.rb +0 -2
  50. data/lib/stack_master/sso_group_id_finder.rb +14 -11
  51. data/lib/stack_master/stack.rb +47 -16
  52. data/lib/stack_master/stack_definition.rb +3 -1
  53. data/lib/stack_master/stack_differ.rb +4 -0
  54. data/lib/stack_master/stack_events/fetcher.rb +3 -1
  55. data/lib/stack_master/stack_events/presenter.rb +6 -1
  56. data/lib/stack_master/stack_events/streamer.rb +3 -1
  57. data/lib/stack_master/stack_status.rb +1 -0
  58. data/lib/stack_master/template_compilers/sparkle_formation.rb +10 -7
  59. data/lib/stack_master/template_utils.rb +6 -2
  60. data/lib/stack_master/test_driver/cloud_formation.rb +27 -10
  61. data/lib/stack_master/utils.rb +1 -0
  62. data/lib/stack_master/validator.rb +6 -5
  63. data/lib/stack_master/version.rb +1 -1
  64. data/lib/stack_master.rb +2 -0
  65. metadata +19 -9
  66. data/lib/stack_master/parameter_resolvers/accounts_by_tags.rb +0 -60
@@ -17,10 +17,13 @@ module StackMaster
17
17
  include Utils::Initializable
18
18
 
19
19
  def template_default_parameters
20
- TemplateUtils.template_hash(template).fetch('Parameters', {}).inject({}) do |result, (parameter_name, description)|
21
- result[parameter_name] = description['Default']
22
- result
23
- end
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(parameter_files: stack_definition.all_parameter_files, parameters: stack_definition.parameters)
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(config, stack_definition, parameter_hash[:compile_time_parameters])
62
- template_body = TemplateCompiler.compile(config, stack_definition.compiler, stack_definition.template_dir, stack_definition.template, compile_time_parameters, stack_definition.compiler_options)
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 = if stack_definition.stack_policy_file_path
65
- File.read(stack_definition.stack_policy_file_path)
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(parameter_files: stack_definition.all_parameter_files, parameters: stack_definition.parameters)
80
- compile_time_parameters = ParameterResolver.resolve(config, stack_definition, parameter_hash[:compile_time_parameters])
81
- template_body = TemplateCompiler.compile(config, stack_definition.compiler, stack_definition.template_dir, stack_definition.template, compile_time_parameters, stack_definition.compiler_options)
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 = if stack_definition.stack_policy_file_path
84
- File.read(stack_definition.stack_policy_file_path)
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
- [ default_parameter_glob, region_parameter_glob ] + additional_parameter_lookup_globs
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.call(cf, :describe_stack_events, { stack_name: @stack_name }, :stack_events).stack_events
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 Rainbow("#{event.timestamp.localtime} #{event.logical_resource_id} #{event.resource_type} #{event.resource_status} #{event.resource_status_reason}").color(event_colour(event))
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, io: nil, &block)
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
@@ -39,6 +39,7 @@ module StackMaster
39
39
 
40
40
  def stack
41
41
  return @stack if defined?(@stack)
42
+
42
43
  StackMaster.cloud_formation_driver.set_region(stack_definition.region)
43
44
  @stack = find_stack
44
45
  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 = if compiler_options['sparkle_path']
32
- File.expand_path(compiler_options['sparkle_path'])
33
- else
34
- template_dir
35
- end
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
- raise ArgumentError.new("Template #{template.inspect} not found in any sparkle pack") unless collection.templates['aws'].include? template
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
- return template_body if template_body.size <= MAX_TEMPLATE_SIZE || identify_template_format(template_body) != :json
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(evaluation: 'Static', change_source: 'ResourceReference', target: OpenStruct.new(attribute: 'Properties', requires_recreation: 'Always', name: 'blah'))
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(action: 'Modify', replacement: 'True', scope: ['Properties'], details: change_details)
112
+ change = OpenStruct.new(
113
+ action: 'Modify',
114
+ replacement: 'True',
115
+ scope: ['Properties'],
116
+ details: change_details
117
+ )
105
118
  changes = [
106
- OpenStruct.new(type: 'AWS::Resource', resource_change: change)
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 = if stack_name
125
- if @stacks[stack_name]
126
- [@stacks[stack_name]]
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
- raise Aws::CloudFormation::Errors::ValidationError.new('', 'Stack does not exist')
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
 
@@ -30,6 +30,7 @@ module StackMaster
30
30
 
31
31
  def hash_to_aws_tags(tags)
32
32
  return [] if tags.nil?
33
+
33
34
  tags.inject([]) do |aws_tags, (key, value)|
34
35
  aws_tags << { key: key, value: value }
35
36
  aws_tags
@@ -35,11 +35,12 @@ module StackMaster
35
35
  end
36
36
 
37
37
  def stack
38
- @stack ||= if validate_template_parameters?
39
- Stack.generate(@stack_definition, @config)
40
- else
41
- Stack.generate_without_parameters(@stack_definition, @config)
42
- end
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
@@ -1,3 +1,3 @@
1
1
  module StackMaster
2
- VERSION = "2.17.0"
2
+ VERSION = "2.17.1"
3
3
  end
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.0
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: 2025-07-11 00:00:00.000000000 Z
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.0
614
- source_code_uri: https://github.com/envato/stack_master/tree/v2.17.0
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: 3.0.3.1
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