lono 8.0.0.pre.rc1 → 8.0.0.pre.rc4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.cody/acceptance/bin/build.sh +5 -5
- data/.github/ISSUE_TEMPLATE/bug_report.md +84 -0
- data/.github/ISSUE_TEMPLATE/documentation.md +12 -0
- data/.github/ISSUE_TEMPLATE/feature_request.md +64 -0
- data/.github/ISSUE_TEMPLATE/question.md +14 -0
- data/.github/ISSUE_TEMPLATE.md +7 -0
- data/.github/PULL_REQUEST_TEMPLATE.md +50 -0
- data/CHANGELOG.md +59 -2
- data/Gemfile +1 -3
- data/README.md +2 -7
- data/lib/lono/app/callable_option/concern.rb +12 -0
- data/lib/lono/app/callable_option.rb +56 -0
- data/lib/lono/app.rb +56 -20
- data/lib/lono/autoloader.rb +1 -0
- data/lib/lono/aws_services/helper.rb +0 -2
- data/lib/lono/blueprint.rb +1 -18
- data/lib/lono/builder/allow/base.rb +54 -0
- data/lib/lono/builder/allow/env.rb +17 -0
- data/lib/lono/builder/allow/region.rb +20 -0
- data/lib/lono/builder/allow.rb +8 -0
- data/lib/lono/builder/configset/combiner.rb +145 -0
- data/lib/lono/builder/configset/definition/base.rb +47 -0
- data/lib/lono/builder/configset/definition/context.rb +70 -0
- data/lib/lono/{configset/strategy/helpers/dsl → builder/configset/definition/dsl/syntax}/auth.rb +1 -1
- data/lib/lono/builder/configset/definition/dsl/syntax/content.rb +22 -0
- data/lib/lono/{configset/strategy/helpers/dsl/syntax.rb → builder/configset/definition/dsl/syntax/core.rb} +15 -9
- data/lib/lono/{configset/strategy/helpers/dsl → builder/configset/definition/dsl/syntax}/package.rb +1 -1
- data/lib/lono/builder/configset/definition/dsl/syntax.rb +5 -0
- data/lib/lono/{configset/strategy → builder/configset/definition}/dsl.rb +10 -14
- data/lib/lono/{configset/strategy → builder/configset/definition}/erb.rb +13 -16
- data/lib/lono/builder/configset/definition.rb +18 -0
- data/lib/lono/builder/configset/evaluator.rb +10 -0
- data/lib/lono/builder/configset/registration.rb +35 -0
- data/lib/lono/builder/context.rb +33 -18
- data/lib/lono/builder/dsl/evaluator.rb +45 -0
- data/lib/lono/builder/dsl/finalizer/base.rb +8 -0
- data/lib/lono/builder/dsl/finalizer/configsets.rb +20 -0
- data/lib/lono/builder/dsl/finalizer/files/base.rb +4 -0
- data/lib/lono/builder/dsl/finalizer/files/build.rb +50 -0
- data/lib/lono/builder/dsl/finalizer/files/replace.rb +36 -0
- data/lib/lono/builder/dsl/finalizer/files.rb +9 -0
- data/lib/lono/builder/{template/dsl → dsl}/finalizer/parameter_groups.rb +6 -5
- data/lib/lono/builder/dsl/finalizer.rb +15 -0
- data/lib/lono/builder/{template/dsl/evaluator/helpers/ec2_helper.rb → dsl/helpers/ec2.rb} +3 -3
- data/lib/lono/builder/dsl/helpers/files.rb +7 -0
- data/lib/lono/builder/{template/helpers.rb → dsl/helpers/partials.rb} +48 -57
- data/lib/lono/builder/dsl/helpers/s3.rb +14 -0
- data/lib/lono/builder/{context/ssm_fetcher.rb → dsl/helpers/ssm/fetcher.rb} +5 -3
- data/lib/lono/builder/{context/helpers.rb → dsl/helpers/ssm.rb} +3 -3
- data/lib/lono/builder/{template/dsl/evaluator/helpers/stack_helper.rb → dsl/helpers/stack.rb} +6 -6
- data/lib/lono/builder/{template/dsl/evaluator/helpers/tags_helper.rb → dsl/helpers/tags.rb} +2 -2
- data/lib/lono/builder/dsl/helpers/template_file.rb +66 -0
- data/lib/lono/builder/dsl/helpers.rb +5 -0
- data/lib/lono/builder/{template/dsl/evaluator/section → dsl/syntax/core}/base.rb +4 -5
- data/lib/lono/builder/{template/dsl/evaluator/section → dsl/syntax/core}/condition.rb +1 -1
- data/lib/lono/builder/{template/dsl/evaluator/section → dsl/syntax/core}/mapping.rb +1 -1
- data/lib/lono/builder/{template/dsl/evaluator/section → dsl/syntax/core}/output.rb +1 -1
- data/lib/lono/builder/{template/dsl/evaluator/section → dsl/syntax/core}/parameter.rb +1 -1
- data/lib/lono/builder/{template/dsl/evaluator/section → dsl/syntax/core}/resource/property_mover.rb +12 -2
- data/lib/lono/builder/{template/dsl/evaluator/section → dsl/syntax/core}/resource.rb +1 -1
- data/lib/lono/builder/{template/dsl/evaluator/section → dsl/syntax/core}/section.rb +1 -1
- data/lib/lono/builder/dsl/syntax/core/squeezer.rb +40 -0
- data/lib/lono/builder/{template/dsl/evaluator/section/methods.rb → dsl/syntax/core.rb} +2 -2
- data/lib/lono/builder/{template/dsl/evaluator → dsl/syntax}/fn.rb +1 -3
- data/lib/lono/builder/{template/dsl/evaluator → dsl}/syntax/parameter_group.rb +1 -1
- data/lib/lono/builder/dsl/syntax.rb +9 -0
- data/lib/lono/builder/{template/dsl.rb → dsl.rb} +2 -2
- data/lib/lono/builder/param.rb +5 -2
- data/lib/lono/builder/template/upload.rb +2 -15
- data/lib/lono/builder/template.rb +1 -3
- data/lib/lono/builder/{template/dsl/evaluator → util}/stringify.rb +1 -1
- data/lib/lono/builder.rb +39 -0
- data/lib/lono/bundler/component/props/extension.rb +0 -1
- data/lib/lono/bundler/extract/tar.rb +0 -1
- data/lib/lono/bundler/util/git.rb +18 -16
- data/lib/lono/cfn/base.rb +2 -2
- data/lib/lono/cfn/cancel.rb +5 -5
- data/lib/lono/cfn/concerns/build.rb +1 -1
- data/lib/lono/cfn/delete.rb +5 -2
- data/lib/lono/cfn/deploy/iam.rb +1 -2
- data/lib/lono/cfn/deploy/rollback.rb +1 -3
- data/lib/lono/cfn/deploy.rb +46 -5
- data/lib/lono/cfn/download.rb +0 -1
- data/lib/lono/cfn/plan/changeset.rb +3 -3
- data/lib/lono/cfn/plan/diff/data.rb +11 -1
- data/lib/lono/cfn/plan/diff/file.rb +2 -1
- data/lib/lono/cfn/plan/param.rb +1 -1
- data/lib/lono/cfn/plan/template.rb +2 -2
- data/lib/lono/cfn/plan.rb +1 -0
- data/lib/lono/cli/abstract.rb +0 -6
- data/lib/lono/cli/base.rb +6 -3
- data/lib/lono/cli/clean.rb +3 -2
- data/lib/lono/cli/help/cfn/status.md +0 -1
- data/lib/lono/cli/help/new/helper.md +27 -0
- data/lib/lono/cli/help/new/hook.md +14 -0
- data/lib/lono/cli/help/new/project.md +3 -10
- data/lib/lono/cli/help/seed.md +22 -21
- data/lib/lono/cli/iam.rb +27 -0
- data/lib/lono/cli/list.rb +3 -6
- data/lib/lono/cli/new/blueprint.rb +3 -9
- data/lib/lono/cli/new/configset.rb +11 -44
- data/lib/lono/cli/new/helper.rb +19 -11
- data/lib/lono/cli/new/hook.rb +32 -0
- data/lib/lono/cli/new/sequence.rb +6 -1
- data/lib/lono/cli/new.rb +9 -9
- data/lib/lono/cli/s3.rb +3 -3
- data/lib/lono/cli/script/build.rb +0 -5
- data/lib/lono/cli/status.rb +18 -0
- data/lib/lono/{inspector → cli}/summary.rb +23 -33
- data/lib/lono/cli.rb +16 -16
- data/lib/lono/command.rb +28 -2
- data/lib/lono/component.rb +29 -0
- data/lib/lono/concerns/aws_info.rb +14 -0
- data/lib/lono/concerns/names.rb +9 -0
- data/lib/lono/configset.rb +17 -0
- data/lib/lono/core.rb +11 -1
- data/lib/lono/ext/bundler.rb +7 -0
- data/lib/lono/ext/core/module.rb +31 -0
- data/lib/lono/ext/core/object.rb +32 -0
- data/lib/lono/ext/core/string.rb +9 -0
- data/lib/lono/ext.rb +4 -0
- data/lib/lono/files/base.rb +12 -0
- data/lib/lono/{utils → files/builder/lambda_layer}/rsync.rb +3 -5
- data/lib/lono/{app_file/build → files/builder}/lambda_layer/ruby_packager.rb +104 -79
- data/lib/lono/files/builder/lambda_layer/ruby_version.rb +38 -0
- data/lib/lono/files/builder/lambda_layer.rb +17 -0
- data/lib/lono/files/builder.rb +37 -0
- data/lib/lono/files/compressor.rb +53 -0
- data/lib/lono/files/concerns/post_processing.rb +52 -0
- data/lib/lono/files/concerns/registration.rb +16 -0
- data/lib/lono/files/registry.rb +6 -0
- data/lib/lono/files.rb +41 -0
- data/lib/lono/hooks/builder.rb +50 -0
- data/lib/lono/hooks/concern.rb +9 -0
- data/lib/lono/hooks/dsl.rb +20 -0
- data/lib/lono/hooks/runner.rb +46 -0
- data/lib/lono/layering/layer.rb +64 -56
- data/lib/lono/logger.rb +2 -3
- data/lib/lono/names.rb +7 -10
- data/lib/lono/s3/bucket.rb +43 -37
- data/lib/lono/s3/rollback.rb +8 -0
- data/lib/lono/s3/uploader.rb +33 -28
- data/lib/lono/script/build.rb +0 -5
- data/lib/lono/seeder.rb +38 -29
- data/lib/lono/user_data.rb +3 -1
- data/lib/lono/utils/sh.rb +32 -0
- data/lib/lono/utils.rb +5 -0
- data/lib/lono/version.rb +1 -1
- data/lib/lono/yamler/validator.rb +7 -22
- data/lib/lono.rb +8 -0
- data/lib/templates/configset/configset.rb +2 -16
- data/lib/templates/examples/configset/configset.rb +16 -0
- data/lib/templates/helper/%underscore_name%_helper.rb.tt +1 -1
- data/lib/templates/hook/config/hooks.rb.tt +14 -0
- data/lono.gemspec +1 -1
- metadata +99 -93
- data/lib/lono/app_file/base.rb +0 -28
- data/lib/lono/app_file/build/lambda_layer.rb +0 -20
- data/lib/lono/app_file/build.rb +0 -79
- data/lib/lono/app_file/registry/item.rb +0 -24
- data/lib/lono/app_file/registry.rb +0 -16
- data/lib/lono/app_file/upload.rb +0 -12
- data/lib/lono/builder/context/loader/load_files.rb +0 -23
- data/lib/lono/builder/context/loader.rb +0 -35
- data/lib/lono/builder/context/params.rb +0 -7
- data/lib/lono/builder/template/configset_injector.rb +0 -52
- data/lib/lono/builder/template/dsl/evaluator/helpers/core_helper.rb +0 -14
- data/lib/lono/builder/template/dsl/evaluator/helpers/file_helper.rb +0 -44
- data/lib/lono/builder/template/dsl/evaluator/helpers/s3_helper.rb +0 -16
- data/lib/lono/builder/template/dsl/evaluator/helpers.rb +0 -16
- data/lib/lono/builder/template/dsl/evaluator/squeezer.rb +0 -24
- data/lib/lono/builder/template/dsl/evaluator/syntax/extend_with.rb +0 -9
- data/lib/lono/builder/template/dsl/evaluator/syntax.rb +0 -11
- data/lib/lono/builder/template/dsl/evaluator.rb +0 -45
- data/lib/lono/builder/template/dsl/finalizer.rb +0 -12
- data/lib/lono/builder/template/evaluate.rb +0 -52
- data/lib/lono/builder/template/post_processor.rb +0 -67
- data/lib/lono/cli/build.rb +0 -101
- data/lib/lono/cli/code.rb +0 -22
- data/lib/lono/cli/help/blueprint/new.md +0 -56
- data/lib/lono/cli/new/extension.rb +0 -57
- data/lib/lono/configset/builder.rb +0 -59
- data/lib/lono/configset/combiner.rb +0 -164
- data/lib/lono/configset/evaluate_file.rb +0 -8
- data/lib/lono/configset/meta/dsl.rb +0 -12
- data/lib/lono/configset/meta.rb +0 -19
- data/lib/lono/configset/s3_file/build.rb +0 -34
- data/lib/lono/configset/s3_file/item.rb +0 -38
- data/lib/lono/configset/s3_file/registry.rb +0 -12
- data/lib/lono/configset/s3_file/upload.rb +0 -12
- data/lib/lono/configset/strategy/base.rb +0 -83
- data/lib/lono/configset/strategy/helpers/dsl/core.rb +0 -18
- data/lib/lono/configset/strategy/helpers/dsl.rb +0 -8
- data/lib/lono/configset/strategy/helpers/erb.rb +0 -9
- data/lib/lono/extensions/dsl.rb +0 -8
- data/lib/lono/extensions/loader.rb +0 -19
- data/lib/lono/extensions.rb +0 -18
- data/lib/lono/importer/base.rb +0 -48
- data/lib/lono/importer/converter.rb +0 -19
- data/lib/lono/importer/download.rb +0 -46
- data/lib/lono/importer/dsl.rb +0 -36
- data/lib/lono/importer/params.rb +0 -56
- data/lib/lono/importer/service/coder.rb +0 -81
- data/lib/lono/inspector/base.rb +0 -32
- data/lib/lono/lookup.rb +0 -12
- data/lib/lono/seeder/service_role.rb +0 -11
- data/lib/lono/utils/context.rb +0 -15
- data/lib/lono/utils/item/file_methods.rb +0 -29
- data/lib/lono/utils/item/zip.rb +0 -42
- data/lib/templates/extension/lib/%extension_name%/autoloader.rb.tt +0 -23
- data/lib/templates/extension/lib/%extension_name%/helpers/mappings.rb.tt +0 -24
- data/lib/templates/extension/lib/%extension_name%/helpers/outputs.rb.tt +0 -7
- data/lib/templates/extension/lib/%extension_name%/helpers/parameters.rb.tt +0 -10
- data/lib/templates/extension/lib/%extension_name%/helpers/resources/resource.rb.tt +0 -4
- data/lib/templates/extension/lib/%extension_name%/helpers/variables.rb.tt +0 -6
- data/lib/templates/extension/lib/%extension_name%/version.rb.tt +0 -3
- data/lib/templates/extension/lib/%extension_name%.rb.tt +0 -8
@@ -0,0 +1,50 @@
|
|
1
|
+
module Lono::Hooks
|
2
|
+
class Builder
|
3
|
+
extend Memoist
|
4
|
+
include Dsl
|
5
|
+
include DslEvaluator
|
6
|
+
include Lono::Utils
|
7
|
+
|
8
|
+
# IE: dsl_file: config/hooks.rb
|
9
|
+
attr_accessor :name
|
10
|
+
def initialize(blueprint, name)
|
11
|
+
@blueprint, @name = blueprint, name
|
12
|
+
@hooks = {before: {}, after: {}}
|
13
|
+
end
|
14
|
+
|
15
|
+
def build
|
16
|
+
evaluate_file("#{Lono.root}/config/hooks.rb")
|
17
|
+
evaluate_file("#{@blueprint.root}/config/hooks.rb")
|
18
|
+
@hooks.deep_stringify_keys!
|
19
|
+
end
|
20
|
+
memoize :build
|
21
|
+
|
22
|
+
def run_hooks
|
23
|
+
build
|
24
|
+
run_each_hook("before")
|
25
|
+
out = yield if block_given?
|
26
|
+
run_each_hook("after")
|
27
|
+
out
|
28
|
+
end
|
29
|
+
|
30
|
+
def run_each_hook(type)
|
31
|
+
hooks = @hooks.dig(type, @name) || []
|
32
|
+
hooks.each do |hook|
|
33
|
+
run_hook(type, hook)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def run_hook(type, hook)
|
38
|
+
return unless run?(hook)
|
39
|
+
|
40
|
+
id = "#{type} #{@name}"
|
41
|
+
label = " label: #{hook["label"]}" if hook["label"]
|
42
|
+
logger.info "Hook: Running #{id} hook#{label}".color(:cyan) if Lono.config.hooks.show
|
43
|
+
Runner.new(@blueprint, hook).run
|
44
|
+
end
|
45
|
+
|
46
|
+
def run?(hook)
|
47
|
+
!!hook["execute"]
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Lono::Hooks
|
2
|
+
module Dsl
|
3
|
+
def before(*commands, **props)
|
4
|
+
commands.each do |name|
|
5
|
+
each_hook(:before, name, props)
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
def after(*commands, **props)
|
10
|
+
commands.each do |name|
|
11
|
+
each_hook(:after, name, props)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def each_hook(type, name, props={})
|
16
|
+
@hooks[type][name] ||= []
|
17
|
+
@hooks[type][name] << props
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module Lono::Hooks
|
2
|
+
class Runner
|
3
|
+
include Lono::Utils
|
4
|
+
|
5
|
+
# exposing blueprint and hook so lono hooks have access to them via runner context. IE:
|
6
|
+
#
|
7
|
+
# class EnvExporter
|
8
|
+
# def call(runner)
|
9
|
+
# puts "runner.hook #{runner.hook}"
|
10
|
+
# end
|
11
|
+
# end
|
12
|
+
#
|
13
|
+
# Docs: http://lono.cloud/docs/config/hooks/ruby/#method-argument
|
14
|
+
#
|
15
|
+
attr_reader :blueprint, :hook
|
16
|
+
def initialize(blueprint, hook)
|
17
|
+
@blueprint, @hook = blueprint, hook
|
18
|
+
@execute = @hook["execute"]
|
19
|
+
end
|
20
|
+
|
21
|
+
def run
|
22
|
+
case @execute
|
23
|
+
when String
|
24
|
+
sh(@execute, exit_on_fail: @hook["exit_on_fail"])
|
25
|
+
when -> (e) { e.respond_to?(:public_instance_methods) && e.public_instance_methods.include?(:call) }
|
26
|
+
executor = @execute.new
|
27
|
+
when -> (e) { e.respond_to?(:call) }
|
28
|
+
executor = @execute
|
29
|
+
else
|
30
|
+
logger.warn "WARN: execute option not set for hook: #{@hook.inspect}"
|
31
|
+
end
|
32
|
+
|
33
|
+
return unless executor
|
34
|
+
|
35
|
+
meth = executor.method(:call)
|
36
|
+
case meth.arity
|
37
|
+
when 0
|
38
|
+
executor.call # backwards compatibility
|
39
|
+
when 1
|
40
|
+
executor.call(self)
|
41
|
+
else
|
42
|
+
raise "The #{executor} call method definition has been more than 1 arguments and is not supported"
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
data/lib/lono/layering/layer.rb
CHANGED
@@ -14,10 +14,9 @@ module Lono::Layering
|
|
14
14
|
include Lono::Layering
|
15
15
|
include Lono::Utils::Logging
|
16
16
|
include Lono::Utils::Pretty
|
17
|
+
include Lono::Concerns::AwsInfo
|
17
18
|
extend Memoist
|
18
19
|
|
19
|
-
delegate :region, to: :aws_data
|
20
|
-
|
21
20
|
def initialize(blueprint, type)
|
22
21
|
@blueprint, @type = blueprint, type
|
23
22
|
end
|
@@ -32,30 +31,18 @@ module Lono::Layering
|
|
32
31
|
paths
|
33
32
|
end
|
34
33
|
|
35
|
-
def
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
sum += layer_levels(layer) unless layer.nil?
|
40
|
-
sum
|
34
|
+
def full_layers(dir)
|
35
|
+
layers = layer_levels("#{dir}/#{@type}") # root
|
36
|
+
if Lono.role
|
37
|
+
layers += layer_levels("#{dir}/#{@type}/#{Lono.role}")
|
41
38
|
end
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
account,
|
50
|
-
"#{account}/#{region}",
|
51
|
-
]
|
52
|
-
end
|
53
|
-
|
54
|
-
def account
|
55
|
-
name = aws_data.account
|
56
|
-
# friendly name mapping
|
57
|
-
names = Lono.config.layering.names.stringify_keys
|
58
|
-
names[name] || name
|
39
|
+
if Lono.app
|
40
|
+
layers += layer_levels("#{dir}/#{@type}/#{Lono.app}")
|
41
|
+
end
|
42
|
+
if Lono.app && Lono.role
|
43
|
+
layers += layer_levels("#{dir}/#{@type}/#{Lono.app}/#{Lono.role}")
|
44
|
+
end
|
45
|
+
layers
|
59
46
|
end
|
60
47
|
|
61
48
|
# adds prefix and to each layer pair that has base and Lono.env. IE:
|
@@ -63,64 +50,85 @@ module Lono::Layering
|
|
63
50
|
# "#{prefix}/base"
|
64
51
|
# "#{prefix}/#{Lono.env}"
|
65
52
|
#
|
53
|
+
# Params Layers:
|
54
|
+
# config/blueprints/demo/params/txt
|
55
|
+
# config/blueprints/demo/params/base.txt
|
56
|
+
# config/blueprints/demo/params/dev.txt
|
66
57
|
def layer_levels(prefix=nil)
|
67
|
-
levels = ["base", Lono.env]
|
58
|
+
levels = ["", "base", Lono.env]
|
59
|
+
levels << "#{Lono.env}-#{Lono.extra}" if Lono.extra
|
68
60
|
levels.map! do |i|
|
69
|
-
# base layer has prefix of '', reject with blank so it doesnt produce '//'
|
70
61
|
[prefix, i].reject(&:blank?).join('/')
|
71
62
|
end
|
72
|
-
levels.
|
63
|
+
levels.map! { |level| level.sub(/\/$/,'') } # strip trailing slash
|
64
|
+
|
65
|
+
# layers = pre_layers + main_layers + post_layers
|
66
|
+
levels = layers.inject([]) do |sum, layer|
|
67
|
+
layer_levels = levels.map do |level|
|
68
|
+
[level, layer].reject(&:blank?).join('/')
|
69
|
+
end
|
70
|
+
sum += layer_levels
|
71
|
+
sum
|
72
|
+
end
|
73
|
+
|
73
74
|
levels
|
74
75
|
end
|
75
76
|
|
77
|
+
# Interface method: layers = pre_layers + main_layers + post_layers
|
78
|
+
# Simple layering is default. Can set with:
|
79
|
+
#
|
80
|
+
# config.layering.mode = "simple" # simple of full
|
81
|
+
#
|
82
|
+
def main_layers
|
83
|
+
if Lono.config.layering.mode == "simple"
|
84
|
+
['']
|
85
|
+
else # full
|
86
|
+
# includes region, account, and account/region layers
|
87
|
+
# More powerful but less used and more complex to understand
|
88
|
+
[
|
89
|
+
'',
|
90
|
+
region,
|
91
|
+
account,
|
92
|
+
"#{account}/#{region}",
|
93
|
+
]
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
76
97
|
def add_ext!(paths)
|
77
98
|
exts = {
|
78
|
-
params: "
|
99
|
+
params: "env",
|
79
100
|
vars: "rb",
|
80
101
|
}
|
81
102
|
ext = exts[@type.to_sym]
|
82
103
|
|
83
104
|
paths.map! do |path|
|
84
|
-
if path.
|
85
|
-
|
86
|
-
end
|
87
|
-
|
88
|
-
if path.ends_with?('/')
|
89
|
-
"#{path.sub(/\/$/,'')}.#{ext}"
|
90
|
-
else
|
91
|
-
"#{path}.#{ext}"
|
92
|
-
end
|
93
|
-
end
|
94
|
-
end
|
95
|
-
|
96
|
-
def full_layers(dir)
|
97
|
-
layers = full_layering.map do |layer|
|
98
|
-
"#{dir}/#{@type}/#{layer}"
|
99
|
-
end
|
100
|
-
if Lono.app
|
101
|
-
app_layers = full_layering.map do |layer|
|
102
|
-
"#{dir}/#{@type}/#{Lono.app}/#{layer}"
|
103
|
-
end
|
104
|
-
layers += app_layers
|
105
|
+
path = path.sub(/\/$/,'') if path.ends_with?('/')
|
106
|
+
"#{path}.#{ext}"
|
105
107
|
end
|
106
|
-
layers
|
107
108
|
end
|
108
109
|
|
109
110
|
@@shown_layers = {}
|
110
111
|
def show_layers(paths)
|
111
112
|
return if @@shown_layers[@type]
|
112
113
|
logger.debug "#{@type.capitalize} Layers:"
|
114
|
+
show = Lono.config.layering.show || ENV['LONO_LAYERS']
|
113
115
|
paths.each do |path|
|
114
|
-
|
116
|
+
# next if path.include?("app/blueprints/") # more useful to show only config layers
|
117
|
+
if ENV['LONO_LAYERS_ALL']
|
118
|
+
logger.info " #{pretty_path(path)}"
|
119
|
+
elsif show
|
120
|
+
logger.info " #{pretty_path(path)}" if File.exist?(path)
|
121
|
+
end
|
115
122
|
end
|
116
123
|
logger.debug ""
|
117
124
|
@@shown_layers[@type] = true
|
118
125
|
end
|
119
126
|
|
120
|
-
|
121
|
-
|
122
|
-
|
127
|
+
def account
|
128
|
+
name = aws_data.account
|
129
|
+
# friendly name mapping
|
130
|
+
names = Lono.config.layering.names.stringify_keys
|
131
|
+
names[name] || name
|
123
132
|
end
|
124
|
-
memoize :aws_data
|
125
133
|
end
|
126
134
|
end
|
data/lib/lono/logger.rb
CHANGED
@@ -17,9 +17,7 @@ module Lono
|
|
17
17
|
line =~ /\n$/ ? line : "#{line}\n"
|
18
18
|
end
|
19
19
|
|
20
|
-
# Used to allow
|
21
|
-
# Terraspace output goes to stderr by default
|
22
|
-
# See: terraspace/shell.rb
|
20
|
+
# Used to allow output to always go to stdout
|
23
21
|
def stdout(msg, newline: true)
|
24
22
|
if newline
|
25
23
|
puts msg
|
@@ -29,5 +27,6 @@ module Lono
|
|
29
27
|
end
|
30
28
|
|
31
29
|
public :print
|
30
|
+
public :printf
|
32
31
|
end
|
33
32
|
end
|
data/lib/lono/names.rb
CHANGED
@@ -9,7 +9,7 @@ module Lono
|
|
9
9
|
end
|
10
10
|
|
11
11
|
def stack
|
12
|
-
expansion(Lono.config.names.stack)
|
12
|
+
expansion(Lono.config.names.stack) # IE: :APP-:BLUEPRINT-:ENV
|
13
13
|
end
|
14
14
|
memoize :stack
|
15
15
|
|
@@ -21,30 +21,27 @@ module Lono
|
|
21
21
|
vars.each do |var|
|
22
22
|
string.gsub!(var, var_value(var))
|
23
23
|
end
|
24
|
-
|
24
|
+
cleanse(string)
|
25
25
|
end
|
26
26
|
|
27
27
|
def var_value(unexpanded)
|
28
28
|
name = unexpanded.sub(':','').downcase
|
29
29
|
if respond_to?(name)
|
30
|
-
|
30
|
+
send(name).to_s # value
|
31
31
|
else
|
32
32
|
unexpanded
|
33
33
|
end
|
34
34
|
end
|
35
35
|
|
36
|
-
def
|
36
|
+
def cleanse(string)
|
37
37
|
string.sub(/^-+/,'').sub(/-+$/,'') # remove leading and trailing -
|
38
38
|
.gsub(%r{-+},'-') # remove double dashes are more. IE: -- => -
|
39
39
|
.gsub('_','-') # underscores are not allowed in CloudFormation stack names
|
40
40
|
end
|
41
41
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
def env
|
47
|
-
Lono.env
|
42
|
+
delegate :app, :role, :env, :extra, to: :lono
|
43
|
+
def lono
|
44
|
+
Lono
|
48
45
|
end
|
49
46
|
end
|
50
47
|
end
|
data/lib/lono/s3/bucket.rb
CHANGED
@@ -1,41 +1,24 @@
|
|
1
1
|
module Lono::S3
|
2
2
|
class Bucket
|
3
|
-
STACK_NAME = ENV['LONO_STACK_NAME'] || "lono"
|
4
|
-
include Lono::AwsServices
|
5
|
-
include Lono::Utils::Logging
|
6
3
|
extend Lono::AwsServices
|
7
4
|
extend Memoist
|
5
|
+
include Lono::AwsServices
|
6
|
+
include Lono::Cfn::Concerns
|
7
|
+
include Lono::Utils::Logging
|
8
|
+
include Lono::Utils::Sure
|
8
9
|
|
9
|
-
|
10
|
-
@@name = nil
|
11
|
-
def name
|
12
|
-
return @@name if @@name # only memoize once bucket has been created
|
13
|
-
|
14
|
-
check_aws_setup!
|
15
|
-
|
16
|
-
stack = new.find_stack
|
17
|
-
return unless stack
|
18
|
-
|
19
|
-
stack_resources = find_stack_resources(STACK_NAME)
|
20
|
-
bucket = stack_resources.find { |r| r.logical_resource_id == "Bucket" }
|
21
|
-
@@name = bucket.physical_resource_id # actual bucket name
|
22
|
-
end
|
23
|
-
|
24
|
-
def check_aws_setup!
|
25
|
-
AwsSetup.new.check!
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
10
|
+
STACK_NAME = ENV['LONO_STACK_NAME'] || "lono"
|
29
11
|
def initialize(options={})
|
30
12
|
@options = options
|
31
13
|
end
|
32
14
|
|
33
15
|
def deploy
|
16
|
+
stack = find_stack
|
34
17
|
if rollback.complete?
|
35
18
|
logger.info "Existing '#{STACK_NAME}' stack in ROLLBACK_COMPLETE state. Deleting stack before continuing."
|
19
|
+
disable_termination_protection
|
36
20
|
cfn.delete_stack(stack_name: STACK_NAME)
|
37
21
|
status.wait
|
38
|
-
status.reset
|
39
22
|
stack = nil
|
40
23
|
end
|
41
24
|
|
@@ -71,7 +54,6 @@ module Lono::S3
|
|
71
54
|
enable_termination_protection: true,
|
72
55
|
)
|
73
56
|
success = status.wait
|
74
|
-
status.reset
|
75
57
|
unless success
|
76
58
|
logger.info "ERROR: Unable to create lono stack with managed s3 bucket".color(:red)
|
77
59
|
exit 1
|
@@ -89,12 +71,12 @@ module Lono::S3
|
|
89
71
|
are_you_sure?
|
90
72
|
|
91
73
|
logger.info "Deleting #{STACK_NAME} stack with the s3 bucket"
|
92
|
-
|
74
|
+
disable_termination_protection
|
93
75
|
empty_bucket!
|
94
76
|
cfn.delete_stack(stack_name: STACK_NAME)
|
95
77
|
end
|
96
78
|
|
97
|
-
def
|
79
|
+
def disable_termination_protection
|
98
80
|
cfn.update_termination_protection(
|
99
81
|
stack_name: STACK_NAME,
|
100
82
|
enable_termination_protection: false,
|
@@ -111,7 +93,6 @@ module Lono::S3
|
|
111
93
|
def status
|
112
94
|
CfnStatus.new(STACK_NAME)
|
113
95
|
end
|
114
|
-
memoize :status
|
115
96
|
|
116
97
|
private
|
117
98
|
|
@@ -135,20 +116,12 @@ module Lono::S3
|
|
135
116
|
|
136
117
|
|
137
118
|
def are_you_sure?
|
138
|
-
return true if @options[:yes]
|
139
|
-
|
140
119
|
if bucket_name.nil?
|
141
120
|
logger.info "The lono stack and s3 bucket does not exist."
|
142
121
|
exit
|
143
122
|
end
|
144
123
|
|
145
|
-
|
146
|
-
yes = $stdin.gets.strip
|
147
|
-
confirmed = yes =~ /^Y/i
|
148
|
-
unless confirmed
|
149
|
-
logger.info "Phew that was close."
|
150
|
-
exit
|
151
|
-
end
|
124
|
+
sure?("Will empty and delete bucket #{bucket_name.color(:green)}. Are you sure?")
|
152
125
|
end
|
153
126
|
|
154
127
|
def template_body
|
@@ -165,7 +138,40 @@ module Lono::S3
|
|
165
138
|
Tags:
|
166
139
|
- Key: Name
|
167
140
|
Value: lono
|
141
|
+
Outputs:
|
142
|
+
Bucket:
|
143
|
+
Value:
|
144
|
+
Ref: Bucket
|
168
145
|
YAML
|
169
146
|
end
|
147
|
+
|
148
|
+
def rollback
|
149
|
+
Rollback.new(STACK_NAME)
|
150
|
+
end
|
151
|
+
|
152
|
+
class << self
|
153
|
+
@@name = nil
|
154
|
+
def name
|
155
|
+
return @@name if @@name # only memoize once bucket has been created
|
156
|
+
|
157
|
+
AwsSetup.new.check!
|
158
|
+
|
159
|
+
stack = new.find_stack
|
160
|
+
return unless stack
|
161
|
+
|
162
|
+
stack_resources = find_stack_resources(STACK_NAME)
|
163
|
+
bucket = stack_resources.find { |r| r.logical_resource_id == "Bucket" }
|
164
|
+
@@name = bucket.physical_resource_id # actual bucket name
|
165
|
+
end
|
166
|
+
|
167
|
+
@@ensure_exist = false
|
168
|
+
def ensure_exist
|
169
|
+
return if @@ensure_exist
|
170
|
+
bucket = Lono::S3::Bucket.new
|
171
|
+
return if bucket.exist?
|
172
|
+
bucket.deploy
|
173
|
+
@@ensure_exist = true
|
174
|
+
end
|
175
|
+
end
|
170
176
|
end
|
171
177
|
end
|
data/lib/lono/s3/uploader.rb
CHANGED
@@ -3,53 +3,50 @@ module Lono::S3
|
|
3
3
|
extend Memoist
|
4
4
|
include Lono::AwsServices
|
5
5
|
include Lono::Utils::Logging
|
6
|
+
include Lono::Utils::Pretty
|
6
7
|
|
7
|
-
attr_reader :
|
8
|
-
def initialize(
|
9
|
-
@
|
8
|
+
attr_reader :local_path
|
9
|
+
def initialize(local_path, options={})
|
10
|
+
@local_path, @options = local_path, options
|
10
11
|
@checksums = {}
|
11
12
|
end
|
12
13
|
|
13
14
|
# Inputs:
|
14
15
|
#
|
15
|
-
#
|
16
|
+
# local_path: can be full path or relative path
|
16
17
|
#
|
17
18
|
def upload
|
18
|
-
|
19
|
-
|
19
|
+
logger.debug "May upload #{local_path}"
|
20
|
+
logger.debug "To #{s3_path}"
|
20
21
|
|
21
|
-
|
22
|
-
s3_path = "s3://#{s3_bucket}/#{key}"
|
23
|
-
|
24
|
-
local_checksum = Digest::MD5.hexdigest(IO.read(@path))
|
25
|
-
remote_checksum = remote_checksum(key)
|
22
|
+
local_checksum = Digest::MD5.hexdigest(IO.read(local_path))
|
26
23
|
if local_checksum == remote_checksum
|
27
|
-
logger.debug "Not modified
|
24
|
+
logger.debug "Not modified #{s3_path}"
|
28
25
|
return # do not upload unless the checksum has changed
|
29
26
|
else
|
30
27
|
# Example output:
|
31
|
-
# Uploaded:
|
32
|
-
|
33
|
-
message = "Uploading #{pretty_path} to #{s3_path}"
|
34
|
-
logger.debug message
|
28
|
+
# Uploaded: files/ecs/private.yml to s3://bucket/output/demo/files/ecs/private.yml
|
29
|
+
logger.debug "Uploading #{pretty_path(local_path)} to #{s3_path}"
|
35
30
|
end
|
36
31
|
|
37
32
|
s3.put_object(
|
38
|
-
body: IO.read(
|
33
|
+
body: IO.read(local_path),
|
39
34
|
bucket: s3_bucket,
|
40
|
-
key:
|
35
|
+
key: s3_key,
|
41
36
|
)
|
42
37
|
end
|
43
38
|
|
44
39
|
# https://s3.amazonaws.com/mybucket/development/output/blueprint/templates/blueprint.yml
|
45
40
|
def https_url
|
46
|
-
|
47
|
-
"https://s3.amazonaws.com/#{s3_bucket}/#{key}"
|
41
|
+
"https://s3.amazonaws.com/#{s3_bucket}/#{s3_key}"
|
48
42
|
end
|
49
43
|
|
50
44
|
def presigned_url
|
51
|
-
|
52
|
-
|
45
|
+
# Here because want to lazily create this bucket only after user has confirmed lono up
|
46
|
+
# This is the first time bucket needs to exists
|
47
|
+
# Called at Deploy::Opts#template_url which gets passed to cfn.create and calls template_url
|
48
|
+
Lono::S3::Bucket.ensure_exist
|
49
|
+
s3_presigner.presigned_url(:get_object, bucket: s3_bucket, key: s3_key)
|
53
50
|
end
|
54
51
|
|
55
52
|
# used for file_s3_key helper
|
@@ -62,7 +59,7 @@ module Lono::S3
|
|
62
59
|
resp = s3.list_objects(bucket: s3_bucket, prefix: prefix)
|
63
60
|
resp.contents.each do |object|
|
64
61
|
# key does not include the bucket name
|
65
|
-
# full path = s3://my-bucket/
|
62
|
+
# full path = s3://my-bucket/files/production/my-template.yml
|
66
63
|
# key = s3_folder/files/production/my-template.yml
|
67
64
|
# etag is the checksum as long as the file is not a multi-part file upload
|
68
65
|
# it has extra double quotes wrapped around it.
|
@@ -74,17 +71,25 @@ module Lono::S3
|
|
74
71
|
memoize :load_checksums!
|
75
72
|
|
76
73
|
# key example: cloudformation/production/files/lifecycle-0719ab81.zip
|
77
|
-
# s3 path: s3://
|
78
|
-
# s3_folder: s3://
|
79
|
-
def remote_checksum
|
80
|
-
load_checksums!(
|
81
|
-
@checksums[
|
74
|
+
# s3 path: s3://bucket/cloudformation/production/files/lifecycle-0719ab81.zip
|
75
|
+
# s3_folder: s3://bucket/cloudformation
|
76
|
+
def remote_checksum
|
77
|
+
load_checksums!(s3_key)
|
78
|
+
@checksums[s3_key]
|
82
79
|
end
|
83
80
|
|
84
81
|
def strip_surrounding_quotes(string)
|
85
82
|
string.sub(/^"/,'').sub(/"$/,'')
|
86
83
|
end
|
87
84
|
|
85
|
+
def s3_path
|
86
|
+
"s3://#{s3_bucket}/#{s3_key}"
|
87
|
+
end
|
88
|
+
|
89
|
+
def s3_key
|
90
|
+
"#{Lono.env}/#{pretty_path(local_path)}"
|
91
|
+
end
|
92
|
+
|
88
93
|
def s3_bucket
|
89
94
|
Lono::S3::Bucket.name
|
90
95
|
end
|