lono 7.3.2 → 7.4.0
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/CHANGELOG.md +4 -0
- data/lib/lono.rb +1 -0
- data/lib/lono/app_file/build.rb +22 -34
- data/lib/lono/app_file/build/lambda_layer/ruby_packager.rb +2 -33
- data/lib/lono/app_file/registry/item.rb +18 -45
- data/lib/lono/app_file/upload.rb +1 -25
- data/lib/lono/cfn/base.rb +8 -2
- data/lib/lono/cfn/create.rb +3 -2
- data/lib/lono/cfn/opts.rb +8 -0
- data/lib/lono/cfn/preview/changeset.rb +1 -0
- data/lib/lono/cfn/update.rb +1 -0
- data/lib/lono/configset.rb +1 -1
- data/lib/lono/configset/combiner.rb +40 -13
- data/lib/lono/configset/generator.rb +6 -1
- data/lib/lono/configset/list.rb +1 -1
- data/lib/lono/configset/register/dsl.rb +3 -3
- data/lib/lono/configset/resolver.rb +9 -5
- data/lib/lono/configset/s3_file/build.rb +33 -0
- data/lib/lono/configset/s3_file/item.rb +30 -0
- data/lib/lono/configset/s3_file/registry.rb +12 -0
- data/lib/lono/configset/s3_file/upload.rb +12 -0
- data/lib/lono/configset/strategy/base.rb +21 -1
- data/lib/lono/configset/strategy/dsl.rb +9 -6
- data/lib/lono/configset/strategy/erb.rb +6 -1
- data/lib/lono/configset/strategy/helpers/dsl.rb +8 -0
- data/lib/lono/configset/strategy/helpers/dsl/auth.rb +37 -0
- data/lib/lono/configset/strategy/{dsl/helpers → helpers/dsl}/core.rb +6 -1
- data/lib/lono/configset/strategy/helpers/dsl/package.rb +40 -0
- data/lib/lono/configset/strategy/helpers/dsl/syntax.rb +74 -0
- data/lib/lono/configset/strategy/{erb/helpers.rb → helpers/erb.rb} +2 -2
- data/lib/lono/extension/list.rb +2 -1
- data/lib/lono/extensions/loader.rb +2 -1
- data/lib/lono/file_uploader.rb +3 -109
- data/lib/lono/finder/base.rb +1 -1
- data/lib/lono/finder/blueprint/configset.rb +3 -3
- data/lib/lono/generate.rb +11 -1
- data/lib/lono/jade/registry.rb +10 -1
- data/lib/lono/jadespec.rb +4 -2
- data/lib/lono/registration/temp.rb +4 -2
- data/lib/lono/s3/uploader.rb +94 -0
- data/lib/lono/seed/base.rb +2 -1
- data/lib/lono/template/configset_injector.rb +6 -4
- data/lib/lono/template/generator.rb +1 -9
- data/lib/lono/template/helper.rb +2 -3
- data/lib/lono/template/post_processor.rb +9 -1
- data/lib/lono/template/strategy/dsl/builder/helpers.rb +1 -0
- data/lib/lono/template/strategy/dsl/builder/helpers/ec2_helper.rb +27 -0
- data/lib/lono/template/strategy/dsl/builder/helpers/s3_helper.rb +1 -0
- data/lib/lono/template/upload.rb +4 -98
- data/lib/lono/utils/item/file_methods.rb +29 -0
- data/lib/lono/utils/item/zip.rb +42 -0
- data/lib/lono/utils/rsync.rb +36 -0
- data/lib/lono/version.rb +1 -1
- data/lib/templates/blueprint/.gitignore +4 -7
- data/lib/templates/configset/%configset_name%.gemspec.tt +1 -1
- data/lib/templates/configset/.gitignore +2 -4
- data/lib/templates/extension/%extension_name%.gemspec.tt +2 -1
- data/lib/templates/extension/.gitignore +11 -17
- data/lib/templates/extension/lib/%extension_name%.rb.tt +3 -0
- data/lib/templates/extension/lib/%extension_name%/autoloader.rb.tt +23 -0
- data/lono.gemspec +1 -0
- metadata +32 -6
- data/lib/lono/configset/strategy/dsl/helpers.rb +0 -5
- data/lib/lono/configset/strategy/dsl/syntax.rb +0 -32
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c0b9294948bbd81eea5198852bffe28c7682aaf9a73cba1273f9fa0b5f2fd7d7
|
4
|
+
data.tar.gz: 948e6cb7dd9ee9ecf5ab02c85f37687339598535bb34deff83dbf02ddc511cf4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7d14a3286bf4b0aba8e2a7c1129abc222b4379dd4c5f3214bcb906c08a0e078ad4455bdd68fcf7e1f774a382dd19e7e0704dacbaf0236517b5c1dce23927af38
|
7
|
+
data.tar.gz: f3a65caf45ca739360cae97be4f16e5eb45c18030eb537e1cbdccbfefa5484e52368ba656c057b75818e1e26bbdb093f173d72ffbab48d4d317f1b4e5dbfe594
|
data/CHANGELOG.md
CHANGED
@@ -3,6 +3,10 @@
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
4
4
|
This project *tries* to adhere to [Semantic Versioning](http://semver.org/), even before v1.0.
|
5
5
|
|
6
|
+
## [7.4.0]
|
7
|
+
- #57 Big improvements generally and configsets
|
8
|
+
- #58 Docs: Configsets and new DSL Helpers
|
9
|
+
|
6
10
|
## [7.3.2]
|
7
11
|
- #56 build lambda layer fix: allow Gemfile.lock to be generated if not provided
|
8
12
|
|
data/lib/lono.rb
CHANGED
data/lib/lono/app_file/build.rb
CHANGED
@@ -2,6 +2,8 @@ require "thor"
|
|
2
2
|
|
3
3
|
module Lono::AppFile
|
4
4
|
class Build < Base
|
5
|
+
include Lono::Utils::Item::Zip
|
6
|
+
|
5
7
|
def initialize_variables
|
6
8
|
@output_files_path = "#{Lono.config.output_path}/#{@blueprint}/files"
|
7
9
|
end
|
@@ -14,11 +16,28 @@ module Lono::AppFile
|
|
14
16
|
|
15
17
|
def build_all
|
16
18
|
clean_output
|
19
|
+
validate_files!
|
17
20
|
copy_to_output
|
18
21
|
build_layers
|
19
22
|
compress_output
|
20
23
|
end
|
21
24
|
|
25
|
+
def validate_files!
|
26
|
+
items = Registry.items + Registry.layers
|
27
|
+
missing = items.select do |item|
|
28
|
+
!File.exist?(item.src_path)
|
29
|
+
end
|
30
|
+
missing_paths = missing.map { |item| item.src_path }.uniq
|
31
|
+
unless missing_paths.empty?
|
32
|
+
puts "ERROR: These app/files are missing were used by the s3_key method but are missing".color(:red)
|
33
|
+
missing_paths.each do |path|
|
34
|
+
puts " #{path}"
|
35
|
+
end
|
36
|
+
puts "Please double check that they exist."
|
37
|
+
exit 1
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
22
41
|
def build_layers
|
23
42
|
layer_items = Registry.layers
|
24
43
|
layer_items.each do |item|
|
@@ -29,12 +48,10 @@ module Lono::AppFile
|
|
29
48
|
def compress_output
|
30
49
|
Registry.items.each do |item|
|
31
50
|
# type can be lambda_layer or file
|
32
|
-
if item.type == "lambda_layer" || item.
|
33
|
-
|
34
|
-
elsif item.file?
|
35
|
-
zip_file(item)
|
51
|
+
if item.type == "lambda_layer" || item.exist?
|
52
|
+
zip(item)
|
36
53
|
else
|
37
|
-
puts "WARN: #{item.
|
54
|
+
puts "WARN: #{item.src_path} does not exist. Double check that the path is correct in the s3_key call.".color(:yellow)
|
38
55
|
end
|
39
56
|
end
|
40
57
|
end
|
@@ -50,35 +67,6 @@ module Lono::AppFile
|
|
50
67
|
end
|
51
68
|
memoize :context
|
52
69
|
|
53
|
-
def zip_file(item)
|
54
|
-
path = item.path
|
55
|
-
zip_file = item.zip_file_name
|
56
|
-
|
57
|
-
puts "Zipping file and generating md5 named file from: #{path}"
|
58
|
-
command = "cd #{File.dirname(path)} && zip -q #{zip_file} #{File.basename(path)}" # create zipfile at same level of file
|
59
|
-
zip(command)
|
60
|
-
end
|
61
|
-
|
62
|
-
def zip_directory(item)
|
63
|
-
path = item.path
|
64
|
-
zip_file = item.zip_file_name
|
65
|
-
|
66
|
-
puts "Zipping folder and generating md5 named file from: #{path}"
|
67
|
-
command = "cd #{path} && zip --symlinks -rq #{zip_file} ." # create zipfile witih directory
|
68
|
-
zip(command)
|
69
|
-
FileUtils.mv("#{path}/#{zip_file}", "#{File.dirname(path)}/#{zip_file}") # move zip back to the parent directory
|
70
|
-
end
|
71
|
-
|
72
|
-
def zip(command)
|
73
|
-
# puts "=> #{command}".color(:green) # uncomment to debug
|
74
|
-
`#{command}`
|
75
|
-
unless $?.success?
|
76
|
-
puts "ERROR: Fail to run #{command}".color(:red)
|
77
|
-
puts "Maybe zip is not installed or path is incorrect?"
|
78
|
-
exit 1
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
70
|
def clean_output
|
83
71
|
FileUtils.rm_rf(@output_files_path)
|
84
72
|
end
|
@@ -1,8 +1,8 @@
|
|
1
|
-
require 'shellwords'
|
2
|
-
|
3
1
|
class Lono::AppFile::Build::LambdaLayer
|
4
2
|
# Based on jets
|
5
3
|
class RubyPackager
|
4
|
+
include Lono::Utils::Rsync
|
5
|
+
|
6
6
|
def initialize(blueprint, registry_item)
|
7
7
|
@blueprint, @registry_item = blueprint, registry_item
|
8
8
|
|
@@ -157,36 +157,5 @@ EOL
|
|
157
157
|
gemfile_path = "#{@app_root}/Gemfile"
|
158
158
|
File.exist?(gemfile_path)
|
159
159
|
end
|
160
|
-
|
161
|
-
def sh(command)
|
162
|
-
puts "=> #{command}"
|
163
|
-
out = `#{command}`
|
164
|
-
puts out if ENV['LONO_DEBUG_LAMBDA_LAYER']
|
165
|
-
success = $?.success?
|
166
|
-
raise("ERROR: running command #{command}").color(:red) unless success
|
167
|
-
success
|
168
|
-
end
|
169
|
-
|
170
|
-
def rsync(src, dest)
|
171
|
-
# Using FileUtils.cp_r doesnt work if there are special files like socket files in the src dir.
|
172
|
-
# Instead of using this hack https://bugs.ruby-lang.org/issues/10104
|
173
|
-
# Using rsync to perform the copy.
|
174
|
-
src.chop! if src.ends_with?('/')
|
175
|
-
dest.chop! if dest.ends_with?('/')
|
176
|
-
check_rsync_installed!
|
177
|
-
# Ensures required trailing slashes
|
178
|
-
FileUtils.mkdir_p(File.dirname(dest))
|
179
|
-
sh "rsync -a --links --no-specials --no-devices #{Shellwords.escape(src)}/ #{Shellwords.escape(dest)}/"
|
180
|
-
end
|
181
|
-
|
182
|
-
@@rsync_installed = false
|
183
|
-
def check_rsync_installed!
|
184
|
-
return if @@rsync_installed # only check once
|
185
|
-
if system "type rsync > /dev/null 2>&1"
|
186
|
-
@@rsync_installed = true
|
187
|
-
else
|
188
|
-
raise "ERROR: Rsync is required. Rsync does not seem to be installed.".color(:red)
|
189
|
-
end
|
190
|
-
end
|
191
160
|
end
|
192
161
|
end
|
@@ -1,50 +1,23 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
def path
|
12
|
-
if @type == "file"
|
13
|
-
"#{Lono.root}/output/#{@blueprint}/files/#{@name}"
|
14
|
-
else
|
15
|
-
"#{Lono.root}/output/#{@blueprint}/lambda_layers/#{@name}/opt"
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
def directory?
|
20
|
-
File.directory?(path)
|
21
|
-
end
|
22
|
-
|
23
|
-
def file?
|
24
|
-
File.file?(path)
|
25
|
-
end
|
26
|
-
|
27
|
-
def s3_path
|
28
|
-
file_path = zip_file_path.sub(%r{.*/output/[\w_-]+/(files|lambda_layers)/}, '') # dont use basename. there might be subfolders
|
29
|
-
"#{s3_prefix}/#{file_path}"
|
30
|
-
end
|
31
|
-
|
32
|
-
# full path
|
33
|
-
def zip_file_path
|
34
|
-
"#{File.dirname(path)}/#{zip_file_name}"
|
35
|
-
end
|
36
|
-
|
37
|
-
def zip_file_name
|
38
|
-
"#{File.basename(path)}-#{@type}-#{Lono::Md5.sum(path)}.zip"
|
39
|
-
end
|
1
|
+
class Lono::AppFile::Registry
|
2
|
+
# Holds metadata about the item in the regsitry.
|
3
|
+
class Item
|
4
|
+
include Lono::Utils::Item::FileMethods
|
5
|
+
|
6
|
+
attr_reader :name, :options, :type
|
7
|
+
def initialize(name, blueprint, options={})
|
8
|
+
@name, @blueprint, @options = name, blueprint, options
|
9
|
+
@type = options[:type] || "file"
|
10
|
+
end
|
40
11
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
end
|
12
|
+
def src_path
|
13
|
+
"#{Lono.blueprint_root}/app/files/#{@name}"
|
14
|
+
end
|
45
15
|
|
46
|
-
|
47
|
-
|
16
|
+
def output_path
|
17
|
+
if @type == "file"
|
18
|
+
"#{Lono.root}/output/#{@blueprint}/files/#{@name}"
|
19
|
+
else
|
20
|
+
"#{Lono.root}/output/#{@blueprint}/lambda_layers/#{@name}/opt"
|
48
21
|
end
|
49
22
|
end
|
50
23
|
end
|
data/lib/lono/app_file/upload.rb
CHANGED
@@ -1,36 +1,12 @@
|
|
1
1
|
module Lono::AppFile
|
2
2
|
class Upload < Base
|
3
|
-
include Lono::AwsServices
|
4
|
-
extend Memoist
|
5
|
-
|
6
3
|
def upload
|
7
4
|
return unless Registry.items.size > 0
|
8
5
|
puts "Uploading app/files..."
|
9
6
|
|
10
7
|
Registry.items.each do |item|
|
11
|
-
|
8
|
+
Lono::S3::Uploader.new(item.zip_file_path).upload
|
12
9
|
end
|
13
10
|
end
|
14
|
-
|
15
|
-
# TODO: check md5sum and only upload if it changes
|
16
|
-
def s3_upload(item)
|
17
|
-
filepath = item.zip_file_path
|
18
|
-
s3_key = item.s3_path
|
19
|
-
s3_path = "s3://#{s3_bucket}/#{s3_key}"
|
20
|
-
message = "Uploading: #{filepath} to #{s3_path}".color(:green)
|
21
|
-
message = "NOOP: #{message}" if @options[:noop]
|
22
|
-
puts message
|
23
|
-
return if @options[:noop]
|
24
|
-
|
25
|
-
s3.put_object(
|
26
|
-
body: IO.read(filepath),
|
27
|
-
bucket: s3_bucket,
|
28
|
-
key: s3_key,
|
29
|
-
)
|
30
|
-
end
|
31
|
-
|
32
|
-
def s3_bucket
|
33
|
-
Lono::S3::Bucket.name
|
34
|
-
end
|
35
11
|
end
|
36
12
|
end
|
data/lib/lono/cfn/base.rb
CHANGED
@@ -167,6 +167,13 @@ class Lono::Cfn
|
|
167
167
|
end
|
168
168
|
end
|
169
169
|
|
170
|
+
def notification_arns
|
171
|
+
@setting ||= Lono::Setting.new
|
172
|
+
settings = @setting.data
|
173
|
+
arns = @options["notification_arns"] || settings["notification_arns"]
|
174
|
+
arns == [''] ? [] : arns # allow removing the notification_arns setting
|
175
|
+
end
|
176
|
+
|
170
177
|
def show_options(options, meth=nil)
|
171
178
|
options = options.clone.compact
|
172
179
|
if options[:template_body] # continue_update_rollback
|
@@ -185,9 +192,8 @@ class Lono::Cfn
|
|
185
192
|
#
|
186
193
|
# Reference: https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cloudformation-limits.html
|
187
194
|
def set_template_url!(options)
|
188
|
-
upload = Lono::Template::Upload.new(@options)
|
189
195
|
url_path = template_path.sub("#{Lono.root}/",'')
|
190
|
-
url =
|
196
|
+
url = Lono::S3::Uploader.new(url_path).presigned_url
|
191
197
|
url.gsub!(/\.yml.*/, ".yml") # Interesting dont need presign query string. For stack sets it actually breaks it. So removing.
|
192
198
|
options[:template_url] = url
|
193
199
|
options
|
data/lib/lono/cfn/create.rb
CHANGED
@@ -24,11 +24,12 @@ class Lono::Cfn
|
|
24
24
|
end
|
25
25
|
|
26
26
|
options = {
|
27
|
-
stack_name: @stack,
|
28
|
-
parameters: parameters,
|
29
27
|
capabilities: capabilities, # ["CAPABILITY_IAM", "CAPABILITY_NAMED_IAM"]
|
30
28
|
disable_rollback: !@options[:rollback],
|
29
|
+
parameters: parameters,
|
30
|
+
stack_name: @stack,
|
31
31
|
}
|
32
|
+
options[:notification_arns] = notification_arns if notification_arns
|
32
33
|
options[:tags] = tags unless tags.empty?
|
33
34
|
set_template_url!(options)
|
34
35
|
|
data/lib/lono/cfn/opts.rb
CHANGED
@@ -1,11 +1,13 @@
|
|
1
1
|
class Lono::Cfn
|
2
2
|
class Opts < Lono::Opts
|
3
3
|
def create
|
4
|
+
notification_arns_option
|
4
5
|
base_options
|
5
6
|
wait_options
|
6
7
|
end
|
7
8
|
|
8
9
|
def update
|
10
|
+
notification_arns_option
|
9
11
|
base_options
|
10
12
|
update_options
|
11
13
|
wait_options
|
@@ -76,5 +78,11 @@ class Lono::Cfn
|
|
76
78
|
option :param_preview, type: :boolean, default: true, desc: "Show parameter diff preview."
|
77
79
|
end
|
78
80
|
end
|
81
|
+
|
82
|
+
def notification_arns_option
|
83
|
+
with_cli_scope do
|
84
|
+
option :notification_arns, type: :array, desc: "The Simple Notification Service (SNS) topic ARNs to publish stack related events."
|
85
|
+
end
|
86
|
+
end
|
79
87
|
end
|
80
88
|
end
|
@@ -31,6 +31,7 @@ module Lono::Cfn::Preview
|
|
31
31
|
stack_name: @stack,
|
32
32
|
parameters: parameters,
|
33
33
|
}
|
34
|
+
options[:notification_arns] = notification_arns if notification_arns
|
34
35
|
options[:tags] = tags unless tags.empty?
|
35
36
|
set_template_url!(options)
|
36
37
|
show_options(options, "cfn.create_change_set")
|
data/lib/lono/cfn/update.rb
CHANGED
@@ -46,6 +46,7 @@ class Lono::Cfn
|
|
46
46
|
capabilities: capabilities, # ["CAPABILITY_IAM", "CAPABILITY_NAMED_IAM"]
|
47
47
|
disable_rollback: !@options[:rollback],
|
48
48
|
}
|
49
|
+
options[:notification_arns] = notification_arns if notification_arns
|
49
50
|
options[:tags] = tags unless tags.empty?
|
50
51
|
set_template_url!(options)
|
51
52
|
show_options(options, "cfn.update_stack")
|
data/lib/lono/configset.rb
CHANGED
@@ -10,7 +10,7 @@ module Lono
|
|
10
10
|
long_desc Help.text(:generate)
|
11
11
|
option :resource, default: "PretendResource", desc: "Set the @resource instance variable availalbe in the configset"
|
12
12
|
def generate(configset)
|
13
|
-
Generator.new(options.merge(configset: configset)).run
|
13
|
+
Generator.new(options.merge(configset: configset, cli: true)).run
|
14
14
|
end
|
15
15
|
end
|
16
16
|
end
|
@@ -56,7 +56,7 @@ class Lono::Configset
|
|
56
56
|
|
57
57
|
data = {
|
58
58
|
registry: Lono::Jade::Registry.new(["#{logical_id}OriginalConfigset"], resource: logical_id),
|
59
|
-
metdata_configset: attributes["Metadata"]
|
59
|
+
metdata_configset: {"Metadata" => attributes["Metadata"]} # # wrap metadata to create right structure
|
60
60
|
}
|
61
61
|
configsets << data
|
62
62
|
end
|
@@ -72,40 +72,67 @@ class Lono::Configset
|
|
72
72
|
end
|
73
73
|
|
74
74
|
metadata_map = {}
|
75
|
+
configsets_map = {}
|
75
76
|
|
76
77
|
@sets.each_with_index do |array, i|
|
77
78
|
padded_i = "%03d" % i
|
78
79
|
registry, metadata = array
|
79
|
-
name, resource = registry.name, registry.resource
|
80
80
|
|
81
|
-
|
82
|
-
|
81
|
+
# metadata example (full structure):
|
82
|
+
#
|
83
|
+
# {"Metadata"=>
|
84
|
+
# {"AWS::CloudFormation::Init"=>
|
85
|
+
# {"configSets"=>{"default"=>["aaa1", "aaa2"]},
|
86
|
+
# "aaa1"=>{"commands"=>{"test"=>{"command"=>"echo from-aaa1 > test1.txt"}}},
|
87
|
+
# "aaa2"=>
|
88
|
+
# {"commands"=>{"test"=>{"command"=>"echo from-aaa2 > test1.txt"}}}}}}
|
83
89
|
|
84
|
-
|
85
|
-
|
90
|
+
name, resource = registry.name, registry.resource
|
91
|
+
configsets = configsets_map[resource] ||= {}
|
86
92
|
|
87
93
|
validate_structure!(name, metadata)
|
88
|
-
|
94
|
+
|
95
|
+
new_metadata = metadata["Metadata"].dup
|
96
|
+
init = new_metadata["AWS::CloudFormation::Init"] # important: adjust data by reference
|
89
97
|
|
90
98
|
if init.key?("configSets")
|
99
|
+
validate_simple!(registry, new_metadata["AWS::CloudFormation::Init"]["configSets"]) # validate original configset for only simple elements
|
100
|
+
|
101
|
+
# 1. expand each config as its own config, flattening to top-level
|
91
102
|
cs = init.delete("configSets") # Only support configSets with simple Array of Strings
|
92
|
-
|
93
|
-
|
103
|
+
new_config_set = {}
|
104
|
+
new_config_set[name] = cs["default"].map {|c| "#{padded_i}_#{c}" }
|
94
105
|
init.transform_keys! { |c| "#{padded_i}_#{c}" }
|
106
|
+
|
107
|
+
# Rebuild default configSet, append the new complex ConfigSet structure with each iteration
|
108
|
+
configsets["default"] ||= []
|
109
|
+
configsets["default"] << {"ConfigSet" => name}
|
110
|
+
configsets.merge!(new_config_set) # add each config from #1 to the top-level
|
111
|
+
|
112
|
+
init["configSets"] = configsets # replace new configset
|
95
113
|
else # simple config
|
114
|
+
init["configSets"] = configsets # adjust data by reference
|
115
|
+
configsets["default"] ||= []
|
116
|
+
configsets["default"] << {"ConfigSet" => name}
|
117
|
+
|
118
|
+
# build new config
|
96
119
|
config_key = "#{padded_i}_single_generated"
|
97
|
-
|
98
|
-
|
120
|
+
configsets[name] = [config_key]
|
121
|
+
new_config = {config_key => init["config"]}
|
122
|
+
# replace old config with new one
|
123
|
+
init.delete("config") # delete original simple config
|
124
|
+
init.merge!(new_config)
|
99
125
|
end
|
100
126
|
|
101
|
-
metadata_map[resource]
|
127
|
+
metadata_map[resource] ||= {"Metadata" => {}}
|
128
|
+
metadata_map[resource]["Metadata"].deep_merge!(new_metadata)
|
102
129
|
@map[resource] = metadata_map[resource]
|
103
130
|
end
|
104
131
|
@map
|
105
132
|
end
|
106
133
|
|
107
134
|
def validate_structure!(name, metadata)
|
108
|
-
return if metadata.is_a?(Hash) && metadata.
|
135
|
+
return if metadata.is_a?(Hash) && metadata.dig("Metadata", "AWS::CloudFormation::Init")
|
109
136
|
|
110
137
|
puts "ERROR: The #{name} configset does not appear to have a AWS::CloudFormation::Init key".color(:red)
|
111
138
|
puts "Please double check the #{name} configset.yml structure"
|