lono 4.2.7 → 5.0.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/.cody/README.md +6 -0
- data/.cody/acceptance.sh +30 -0
- data/.cody/buildspec.yml +21 -0
- data/.cody/demo.rb +38 -0
- data/.cody/project.rb +12 -0
- data/.cody/role.rb +1 -0
- data/.gitignore +2 -0
- data/.gitmodules +6 -3
- data/.travis.yml +7 -0
- data/CHANGELOG.md +10 -0
- data/Gemfile +0 -1
- data/LICENSE.txt +1 -22
- data/README.md +46 -55
- data/lib/lono.rb +20 -27
- data/lib/lono/app_file.rb +5 -0
- data/lib/lono/app_file/base.rb +19 -0
- data/lib/lono/app_file/build.rb +78 -0
- data/lib/lono/app_file/registry.rb +14 -0
- data/lib/lono/app_file/registry/item.rb +46 -0
- data/lib/lono/app_file/upload.rb +39 -0
- data/lib/lono/autoloader.rb +22 -0
- data/lib/lono/aws_services.rb +46 -0
- data/lib/lono/aws_services/util.rb +49 -0
- data/lib/lono/blueprint.rb +113 -0
- data/lib/lono/blueprint/find.rb +90 -0
- data/lib/lono/blueprint/helper.rb +18 -0
- data/lib/lono/blueprint/info.rb +10 -0
- data/lib/lono/blueprint/list.rb +14 -0
- data/lib/lono/blueprint/root.rb +43 -0
- data/lib/lono/cfn.rb +31 -19
- data/lib/lono/cfn/aws_service.rb +16 -0
- data/lib/lono/cfn/base.rb +244 -261
- data/lib/lono/cfn/create.rb +36 -32
- data/lib/lono/cfn/current.rb +1 -1
- data/lib/lono/cfn/delete.rb +2 -2
- data/lib/lono/cfn/deploy.rb +11 -0
- data/lib/lono/cfn/diff.rb +1 -1
- data/lib/lono/cfn/preview.rb +3 -3
- data/lib/lono/cfn/rollback.rb +26 -0
- data/lib/lono/cfn/status.rb +2 -203
- data/lib/lono/cfn/suffix.rb +67 -0
- data/lib/lono/cfn/update.rb +61 -53
- data/lib/lono/cli.rb +42 -23
- data/lib/lono/completer.rb +0 -2
- data/lib/lono/configure.rb +37 -0
- data/lib/lono/configure/aws_services.rb +18 -0
- data/lib/lono/configure/base.rb +94 -0
- data/lib/lono/configure/helpers.rb +128 -0
- data/lib/lono/conventions.rb +11 -0
- data/lib/lono/core.rb +42 -12
- data/lib/lono/core/config.rb +5 -4
- data/lib/lono/default/settings.yml +0 -11
- data/lib/lono/file_uploader.rb +9 -4
- data/lib/lono/help.rb +1 -2
- data/lib/lono/help/blueprint.md +46 -0
- data/lib/lono/help/cfn.md +5 -4
- data/lib/lono/help/cfn/create.md +14 -9
- data/lib/lono/help/cfn/deploy.md +92 -0
- data/lib/lono/help/cfn/diff.md +0 -1
- data/lib/lono/help/cfn/update.md +16 -15
- data/lib/lono/help/completion.md +3 -3
- data/lib/lono/help/generate.md +0 -1
- data/lib/lono/help/new.md +40 -34
- data/lib/lono/help/param.md +1 -1
- data/lib/lono/help/param/generate.md +1 -1
- data/lib/lono/help/template.md +2 -2
- data/lib/lono/help/xgraph.md +1 -1
- data/lib/lono/inspector.rb +1 -1
- data/lib/lono/inspector/base.rb +26 -10
- data/lib/lono/inspector/graph.rb +7 -3
- data/lib/lono/inspector/summary.rb +15 -3
- data/lib/lono/md5.rb +46 -0
- data/lib/lono/new.rb +40 -28
- data/lib/lono/new/helper.rb +2 -3
- data/lib/lono/param.rb +12 -11
- data/lib/lono/param/generator.rb +96 -42
- data/lib/lono/project_checker.rb +27 -8
- data/lib/lono/s3.rb +23 -0
- data/lib/lono/s3/bucket.rb +123 -0
- data/lib/lono/script.rb +4 -8
- data/lib/lono/script/base.rb +7 -2
- data/lib/lono/script/build.rb +7 -8
- data/lib/lono/script/upload.rb +4 -20
- data/lib/lono/sequence.rb +19 -16
- data/lib/lono/setting.rb +19 -27
- data/lib/lono/template.rb +22 -26
- data/lib/lono/template/base.rb +13 -0
- data/lib/lono/template/context.rb +4 -56
- data/lib/lono/template/context/loader.rb +70 -0
- data/lib/lono/template/dsl.rb +15 -151
- data/lib/lono/template/dsl/builder.rb +60 -0
- data/lib/lono/template/dsl/builder/base.rb +14 -0
- data/lib/lono/template/dsl/builder/condition.rb +26 -0
- data/lib/lono/template/dsl/builder/fn.rb +114 -0
- data/lib/lono/template/dsl/builder/helper.rb +64 -0
- data/lib/lono/template/dsl/builder/mapping.rb +24 -0
- data/lib/lono/template/dsl/builder/output.rb +37 -0
- data/lib/lono/template/dsl/builder/parameter.rb +39 -0
- data/lib/lono/template/dsl/builder/resource.rb +38 -0
- data/lib/lono/template/dsl/builder/section.rb +12 -0
- data/lib/lono/template/dsl/builder/syntax.rb +58 -0
- data/lib/lono/template/erb.rb +82 -0
- data/lib/lono/template/evaluate.rb +39 -0
- data/lib/lono/template/generator.rb +29 -0
- data/lib/lono/template/helper.rb +7 -29
- data/lib/lono/template/post_processor.rb +69 -0
- data/lib/lono/template/template.rb +4 -9
- data/lib/lono/template/upload.rb +103 -133
- data/lib/lono/template/util.rb +48 -0
- data/lib/lono/upgrade.rb +5 -3
- data/lib/lono/upgrade/upgrade5.rb +55 -0
- data/lib/lono/user_data.rb +4 -4
- data/lib/lono/version.rb +1 -1
- data/lib/templates/blueprint/%blueprint_name%.gemspec.tt +44 -0
- data/lib/templates/blueprint/.gitignore +14 -0
- data/lib/templates/blueprint/.lono/config.yml.tt +3 -0
- data/lib/templates/blueprint/.meta/config.yml.tt +3 -0
- data/lib/templates/blueprint/CHANGELOG.md +7 -0
- data/lib/templates/blueprint/Gemfile +4 -0
- data/lib/templates/blueprint/README.md +37 -0
- data/lib/templates/blueprint/Rakefile +6 -0
- data/lib/templates/blueprint/setup/configs.rb +54 -0
- data/lib/templates/blueprint_configs/configs/%blueprint_name%/params/base.txt +2 -0
- data/lib/{starter_projects/skeleton/app/definitions/base.rb → templates/blueprint_configs/configs/%blueprint_name%/params/development.txt} +0 -0
- data/lib/templates/blueprint_configs/configs/%blueprint_name%/variables/base.rb +2 -0
- data/lib/templates/blueprint_configs/configs/%blueprint_name%/variables/development.rb +0 -0
- data/lib/templates/blueprint_types/dsl/app/templates/%blueprint_name%.rb +37 -0
- data/lib/templates/blueprint_types/dsl/app/user_data/bootstrap.sh +2 -0
- data/lib/templates/blueprint_types/erb/app/definitions/base.rb.tt +1 -0
- data/lib/templates/blueprint_types/erb/app/templates/%blueprint_name%.yml +8 -0
- data/lib/{starter_projects/autoscaling → templates/skeleton}/.gitignore +1 -0
- data/lib/templates/skeleton/Gemfile +3 -0
- data/lib/{starter_projects/autoscaling → templates/skeleton}/Guardfile +2 -2
- data/lib/templates/skeleton/README.md +58 -0
- data/lib/templates/skeleton/configs/settings.yml +17 -0
- data/lib/templates/upgrade5/blueprints/main/.lono/config.yml +3 -0
- data/lib/templates/upgrade5/blueprints/main/.meta/config.yml +3 -0
- data/lono.gemspec +12 -8
- data/vendor/cfn-status/CHANGELOG.md +10 -0
- data/vendor/cfn-status/Gemfile +4 -0
- data/vendor/cfn-status/LICENSE.txt +21 -0
- data/vendor/cfn-status/README.md +56 -0
- data/vendor/cfn-status/Rakefile +6 -0
- data/vendor/cfn-status/bin/console +14 -0
- data/vendor/cfn-status/bin/setup +8 -0
- data/vendor/cfn-status/cfn-status.gemspec +30 -0
- data/vendor/cfn-status/lib/cfn-status.rb +1 -0
- data/vendor/cfn-status/lib/cfn/aws_service.rb +51 -0
- data/vendor/cfn-status/lib/cfn/status.rb +219 -0
- data/vendor/cfn-status/lib/cfn/status/version.rb +5 -0
- data/vendor/cfn-status/spec/cfn/status_spec.rb +81 -0
- data/vendor/cfn-status/spec/fixtures/cfn/stack-events-complete.json +1080 -0
- data/vendor/cfn-status/spec/fixtures/cfn/stack-events-in-progress.json +1080 -0
- data/vendor/cfn-status/spec/fixtures/cfn/stack-events-update-rollback-complete.json +1086 -0
- data/vendor/cfn-status/spec/spec_helper.rb +14 -0
- data/vendor/cfn_camelizer/CHANGELOG.md +20 -0
- data/vendor/cfn_camelizer/Gemfile +4 -0
- data/vendor/cfn_camelizer/LICENSE.txt +21 -0
- data/vendor/cfn_camelizer/README.md +40 -0
- data/vendor/cfn_camelizer/Rakefile +6 -0
- data/vendor/cfn_camelizer/bin/console +14 -0
- data/vendor/cfn_camelizer/bin/setup +8 -0
- data/vendor/cfn_camelizer/cfn_camelizer.gemspec +32 -0
- data/vendor/cfn_camelizer/lib/camelizer.yml +37 -0
- data/vendor/cfn_camelizer/lib/cfn_camelizer.rb +94 -0
- data/vendor/cfn_camelizer/lib/cfn_camelizer/version.rb +3 -0
- data/vendor/cfn_camelizer/spec/cfn_camelizer_spec.rb +86 -0
- data/vendor/cfn_camelizer/spec/spec_helper.rb +14 -0
- metadata +189 -62
- data/.circleci/bin/commit_docs.sh +0 -26
- data/.circleci/config.yml +0 -72
- data/bin/release +0 -9
- data/lib/lono/help/import.md +0 -54
- data/lib/lono/importer.rb +0 -134
- data/lib/lono/new/message.rb +0 -35
- data/lib/starter_projects/autoscaling/Gemfile +0 -3
- data/lib/starter_projects/autoscaling/README.md +0 -118
- data/lib/starter_projects/autoscaling/app/definitions/base.rb +0 -2
- data/lib/starter_projects/autoscaling/app/templates/autoscaling.yml +0 -682
- data/lib/starter_projects/autoscaling/config/params/base/autoscaling.txt +0 -6
- data/lib/starter_projects/autoscaling/config/settings.yml +0 -33
- data/lib/starter_projects/ec2/.gitignore +0 -2
- data/lib/starter_projects/ec2/Gemfile +0 -3
- data/lib/starter_projects/ec2/Guardfile +0 -12
- data/lib/starter_projects/ec2/README.md +0 -86
- data/lib/starter_projects/ec2/app/definitions/base.rb +0 -2
- data/lib/starter_projects/ec2/app/definitions/development.rb +0 -1
- data/lib/starter_projects/ec2/app/definitions/production.rb +0 -1
- data/lib/starter_projects/ec2/app/helpers/my_custom_helper.rb +0 -17
- data/lib/starter_projects/ec2/app/partials/user_data/bootstrap.sh +0 -4
- data/lib/starter_projects/ec2/app/templates/example.yml +0 -430
- data/lib/starter_projects/ec2/config/params/base/example.txt +0 -2
- data/lib/starter_projects/ec2/config/params/development/example.txt +0 -3
- data/lib/starter_projects/ec2/config/params/production/example.txt +0 -2
- data/lib/starter_projects/ec2/config/settings.yml +0 -33
- data/lib/starter_projects/ec2/config/variables/base.rb +0 -3
- data/lib/starter_projects/ec2/config/variables/development.rb +0 -2
- data/lib/starter_projects/ec2/config/variables/production.rb +0 -2
- data/lib/starter_projects/ec2/welcome.txt +0 -8
- data/lib/starter_projects/skeleton/.gitignore +0 -2
- data/lib/starter_projects/skeleton/Gemfile +0 -3
- data/lib/starter_projects/skeleton/Guardfile +0 -12
- data/lib/starter_projects/skeleton/README.md +0 -53
- data/lib/starter_projects/skeleton/config/settings.yml +0 -33
- data/lib/starter_projects/skeleton/welcome.txt +0 -7
- data/vendor/plissken/Gemfile +0 -14
- data/vendor/plissken/LICENSE.txt +0 -20
- data/vendor/plissken/README.md +0 -46
- data/vendor/plissken/Rakefile +0 -56
- data/vendor/plissken/VERSION +0 -1
- data/vendor/plissken/lib/plissken.rb +0 -1
- data/vendor/plissken/lib/plissken/ext/hash/to_snake_keys.rb +0 -45
- data/vendor/plissken/plissken.gemspec +0 -61
- data/vendor/plissken/spec/lib/to_snake_keys_spec.rb +0 -177
- data/vendor/plissken/spec/spec_helper.rb +0 -90
- data/vendor/plissken/test/helper.rb +0 -20
- data/vendor/plissken/test/plissken/ext/hash/to_snake_keys_test.rb +0 -184
- data/vendor/plissken/test/test_plissken.rb +0 -2
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
class Lono::Template::Dsl
|
|
2
|
+
class Builder
|
|
3
|
+
include Lono::Template::Util
|
|
4
|
+
include Lono::Template::Context::Loader
|
|
5
|
+
|
|
6
|
+
include Fn
|
|
7
|
+
include Helper # built-in helpers
|
|
8
|
+
include Lono::Template::Evaluate
|
|
9
|
+
include Syntax
|
|
10
|
+
|
|
11
|
+
def initialize(path, blueprint, options={})
|
|
12
|
+
@path, @blueprint, @options = path, blueprint, options
|
|
13
|
+
@template = @path.sub("#{Lono.config.templates_path}/",'').sub(/\.rb$/,'')
|
|
14
|
+
@cfn = {}
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def build
|
|
18
|
+
load_context
|
|
19
|
+
evaluate_template_path(@path)
|
|
20
|
+
build_template
|
|
21
|
+
write_output
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def build_template
|
|
25
|
+
@results = YAML.dump(camelize(@cfn))
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def write_output
|
|
29
|
+
output_path = "#{Lono.config.output_path}/#{@blueprint}/templates"
|
|
30
|
+
FileUtils.mkdir_p(output_path)
|
|
31
|
+
|
|
32
|
+
path = "#{output_path}/#{@template}.yml"
|
|
33
|
+
ensure_parent_dir(path)
|
|
34
|
+
IO.write(path, @results)
|
|
35
|
+
|
|
36
|
+
validate_yaml(path)
|
|
37
|
+
|
|
38
|
+
unless @options[:quiet]
|
|
39
|
+
pretty_path = path.sub("#{Lono.root}/",'')
|
|
40
|
+
puts " #{pretty_path}"
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def camelize(data)
|
|
45
|
+
CfnCamelizer.transform(data)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# Not using Lono::Template::Context because that works differently.
|
|
49
|
+
# That is used to load a context object that is passed to RenderMePretty's context.
|
|
50
|
+
# So that we can load context for params files and erb templates.
|
|
51
|
+
#
|
|
52
|
+
# In this case builder is actually the dsl context.
|
|
53
|
+
# We want to load variables and helpers into this builder context directly.
|
|
54
|
+
# This loads additional context. It looks very similar to Lono::Template::Context
|
|
55
|
+
def load_context
|
|
56
|
+
load_variables
|
|
57
|
+
load_project_helpers
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# Implements:
|
|
2
|
+
#
|
|
3
|
+
# template - uses @definition to build a CloudFormation template section
|
|
4
|
+
#
|
|
5
|
+
class Lono::Template::Dsl::Builder
|
|
6
|
+
class Condition < Base
|
|
7
|
+
def template
|
|
8
|
+
camelize(standarize(@definition))
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
# There are only 2 forms for condition: long and medium
|
|
12
|
+
#
|
|
13
|
+
# Type is the only required property: https://amzn.to/2x8W5aD
|
|
14
|
+
def standarize(definition)
|
|
15
|
+
first, second, _ = definition
|
|
16
|
+
if definition.size == 1 && first.is_a?(Hash) # long form
|
|
17
|
+
first # pass through
|
|
18
|
+
elsif definition.size == 2 && second.is_a?(Hash) # medium form
|
|
19
|
+
logical_id, properties = first, second
|
|
20
|
+
{ logical_id => properties }
|
|
21
|
+
else # I dont know what form
|
|
22
|
+
raise "Invalid form provided. definition #{definition.inspect}"
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
class Lono::Template::Dsl::Builder
|
|
2
|
+
module Fn
|
|
3
|
+
# Also act as documentation on the method signatures
|
|
4
|
+
# Also used in Coder crafting so should always list all the functions here
|
|
5
|
+
# even if they are overriden with specific implementations below
|
|
6
|
+
FUNCTIONS = {
|
|
7
|
+
base64: :simple,
|
|
8
|
+
cidr: :array,
|
|
9
|
+
find_in_map: :array,
|
|
10
|
+
get_att: :array, # special case
|
|
11
|
+
# get_azs: :simple, # special map to GetAZs, and default region=''
|
|
12
|
+
import_value: :simple,
|
|
13
|
+
# join: :array, # special case
|
|
14
|
+
select: :array,
|
|
15
|
+
split: :array,
|
|
16
|
+
# sub: :array, # special case
|
|
17
|
+
transform: :simple,
|
|
18
|
+
# Conditional methods
|
|
19
|
+
# Most of the condition methods need to be accessed via the modulde
|
|
20
|
+
# since they are Ruby keywords. So Fn::if , also builder has an fn method
|
|
21
|
+
# so they can also be called via fn::if
|
|
22
|
+
and: :array,
|
|
23
|
+
equals: :array,
|
|
24
|
+
if: :array, # special case, if is a Ruby keyword , we'll use fn_if instead
|
|
25
|
+
not: :array,
|
|
26
|
+
or: :array,
|
|
27
|
+
ref: :simple,
|
|
28
|
+
}
|
|
29
|
+
# These are also Ruby keywords
|
|
30
|
+
# keywords: and if not or
|
|
31
|
+
|
|
32
|
+
# Note, for if function, do not flatten the args. Its arguments can be Arrays. Example:
|
|
33
|
+
#
|
|
34
|
+
# SecurityGroups:
|
|
35
|
+
# Fn::If:
|
|
36
|
+
# - ExistingSecurityGroupIsBlank
|
|
37
|
+
# - - GroupId:
|
|
38
|
+
# Ref: SecurityGroup
|
|
39
|
+
# - - GroupId:
|
|
40
|
+
# Ref: SecurityGroup
|
|
41
|
+
# - GroupId:
|
|
42
|
+
# Ref: ExistingSecurityGroup
|
|
43
|
+
FUNCTIONS.each do |name, type|
|
|
44
|
+
if type == :simple
|
|
45
|
+
define_method(name) do |arg|
|
|
46
|
+
id = fn_id(name)
|
|
47
|
+
arg = arg.is_a?(Symbol) ? CfnCamelizer.camelize(arg) : arg
|
|
48
|
+
{ id => arg }
|
|
49
|
+
end
|
|
50
|
+
else # array
|
|
51
|
+
define_method(name) do |*args|
|
|
52
|
+
id = fn_id(name)
|
|
53
|
+
# Note, do not flatten args for if statement as it can have Array as arguments.
|
|
54
|
+
args = args.flatten unless name == :if
|
|
55
|
+
args = args.map do |arg|
|
|
56
|
+
arg.is_a?(Symbol) ? CfnCamelizer.camelize(arg) : arg
|
|
57
|
+
end
|
|
58
|
+
{ id => args }
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def fn_id(name)
|
|
64
|
+
"Fn::#{CfnCamelizer.camelize(name)}"
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# special cases
|
|
68
|
+
def ref(name)
|
|
69
|
+
name = CfnCamelizer.camelize(name)
|
|
70
|
+
{ "Ref" => name }
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
# Examples:
|
|
74
|
+
# get_attr("logical_id.attribute")
|
|
75
|
+
# get_attr("logical_id", "attribute")
|
|
76
|
+
# get_attr(["logical_id", "attribute"])
|
|
77
|
+
def get_att(*item)
|
|
78
|
+
item = item.flatten
|
|
79
|
+
options = item.last.is_a?(Hash) ? item.pop : {}
|
|
80
|
+
|
|
81
|
+
# list is an Array
|
|
82
|
+
list = if item.size == 1
|
|
83
|
+
item.first.split('.')
|
|
84
|
+
else
|
|
85
|
+
item
|
|
86
|
+
end
|
|
87
|
+
list.map!(&:camelize) unless options[:autoformat] == false
|
|
88
|
+
{ "Fn::GetAtt" => list }
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def join(delimiter, *list)
|
|
92
|
+
list = list.flatten
|
|
93
|
+
{ "Fn::Join" => [delimiter, list] }
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def get_azs(region='')
|
|
97
|
+
{ "Fn::GetAZs" => region }
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
def sub(str, vals={})
|
|
101
|
+
{ "Fn::Sub" => [str, vals] }
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
# for fn::if and fn.if to work
|
|
105
|
+
def fn
|
|
106
|
+
Fn
|
|
107
|
+
end
|
|
108
|
+
extend self # for Fn::if and Fn.if
|
|
109
|
+
|
|
110
|
+
def self.included(base)
|
|
111
|
+
base.extend(Fn)
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
end
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# Built-in helpers for the DSL form
|
|
2
|
+
class Lono::Template::Dsl::Builder
|
|
3
|
+
module Helper
|
|
4
|
+
extend Memoist
|
|
5
|
+
|
|
6
|
+
def tags(hash, casing: :camelize)
|
|
7
|
+
hash.map do |k,v|
|
|
8
|
+
k = k.to_s
|
|
9
|
+
k = case casing
|
|
10
|
+
when :camelize
|
|
11
|
+
CfnCamelizer.camelize(k)
|
|
12
|
+
when :underscore
|
|
13
|
+
k.underscore
|
|
14
|
+
when :dasherize
|
|
15
|
+
k.dasherize
|
|
16
|
+
else # leave alone
|
|
17
|
+
k
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
{key: k, value: v}
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def dimensions(hash, casing: :camelize)
|
|
25
|
+
tags(hash, casing: casing).map { |h|
|
|
26
|
+
h[:name] = h.delete(:key)
|
|
27
|
+
h
|
|
28
|
+
}
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def user_data(path)
|
|
32
|
+
path = "#{Lono.config.user_data_path}/#{path}"
|
|
33
|
+
if File.exist?(path)
|
|
34
|
+
render_path(path)
|
|
35
|
+
else
|
|
36
|
+
message = "WARNING: user-data path #{path} not found"
|
|
37
|
+
puts message.color(:yellow)
|
|
38
|
+
puts "Called from:"
|
|
39
|
+
puts caller[1]
|
|
40
|
+
message
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
memoize :user_data
|
|
44
|
+
|
|
45
|
+
def render_path(path)
|
|
46
|
+
RenderMePretty.result(path, context: self)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def s3_bucket
|
|
50
|
+
Lono::S3::Bucket.name
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def file_s3_key(name, options={})
|
|
54
|
+
Lono::AppFile::Registry.register(name, @blueprint, options)
|
|
55
|
+
"file://app/files/#{name}" # placeholder for post processing
|
|
56
|
+
end
|
|
57
|
+
alias_method :s3_key, :file_s3_key
|
|
58
|
+
|
|
59
|
+
def setting
|
|
60
|
+
Lono::Setting.new
|
|
61
|
+
end
|
|
62
|
+
memoize :setting
|
|
63
|
+
end
|
|
64
|
+
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# Implements:
|
|
2
|
+
#
|
|
3
|
+
# template - uses @definition to build a CloudFormation template section
|
|
4
|
+
#
|
|
5
|
+
class Lono::Template::Dsl::Builder
|
|
6
|
+
class Mapping < Base
|
|
7
|
+
def template
|
|
8
|
+
camelize(standarize(@definition))
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
# Type is the only required property: https://amzn.to/2x8W5aD
|
|
12
|
+
def standarize(definition)
|
|
13
|
+
first, second, _ = definition
|
|
14
|
+
if definition.size == 1 && first.is_a?(Hash) # long form
|
|
15
|
+
first # pass through
|
|
16
|
+
elsif definition.size == 2 && second.is_a?(Hash) # medium form
|
|
17
|
+
logical_id, maps = first, second
|
|
18
|
+
{ logical_id => maps }
|
|
19
|
+
else # I dont know what form
|
|
20
|
+
raise "Invalid form provided. definition #{definition.inspect}"
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# Implements:
|
|
2
|
+
#
|
|
3
|
+
# template - uses @definition to build a CloudFormation template section
|
|
4
|
+
#
|
|
5
|
+
class Lono::Template::Dsl::Builder
|
|
6
|
+
class Output < Base
|
|
7
|
+
def template
|
|
8
|
+
camelize(standarize(@definition))
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
# Value is the only required property: https://amzn.to/2xbhmk3
|
|
12
|
+
def standarize(definition)
|
|
13
|
+
first, second, _ = definition
|
|
14
|
+
if definition.size == 1 && first.is_a?(Hash) # long form
|
|
15
|
+
first # pass through
|
|
16
|
+
elsif definition.size == 2 && second.is_a?(Hash) # medium form
|
|
17
|
+
if second.key?(:value)
|
|
18
|
+
logical_id, properties = first, second
|
|
19
|
+
else
|
|
20
|
+
logical_id = first
|
|
21
|
+
properties = {value: second}
|
|
22
|
+
end
|
|
23
|
+
{ logical_id => properties }
|
|
24
|
+
elsif definition.size == 2 && second.is_a?(String) # short form
|
|
25
|
+
logical_id = first
|
|
26
|
+
properties = second.is_a?(String) ? { value: second } : {}
|
|
27
|
+
{ logical_id => properties }
|
|
28
|
+
elsif definition.size == 1
|
|
29
|
+
logical_id = first.to_s
|
|
30
|
+
properties = {value: ref(logical_id) }
|
|
31
|
+
{ logical_id => properties }
|
|
32
|
+
else # I dont know what form
|
|
33
|
+
raise "Invalid form provided. definition #{definition.inspect}"
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# Implements:
|
|
2
|
+
#
|
|
3
|
+
# template - uses @definition to build a CloudFormation template section
|
|
4
|
+
#
|
|
5
|
+
class Lono::Template::Dsl::Builder
|
|
6
|
+
class Parameter < Base
|
|
7
|
+
def template
|
|
8
|
+
camelize(add_required(standarize(@definition)))
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
# Type is the only required property: https://amzn.to/2x8W5aD
|
|
12
|
+
def standarize(definition)
|
|
13
|
+
first, second, _ = definition
|
|
14
|
+
if definition.size == 1 && first.is_a?(Hash) # long form
|
|
15
|
+
first # pass through
|
|
16
|
+
elsif definition.size == 2 && second.is_a?(Hash) # medium form
|
|
17
|
+
logical_id, properties = first, second
|
|
18
|
+
{ logical_id => properties }
|
|
19
|
+
elsif (definition.size == 2 && num_or_str?(second)) || # short form
|
|
20
|
+
definition.size == 1
|
|
21
|
+
logical_id = first
|
|
22
|
+
properties = num_or_str?(second) ? { default: second } : {}
|
|
23
|
+
{ logical_id => properties }
|
|
24
|
+
else # I dont know what form
|
|
25
|
+
raise "Invalid form provided. definition #{definition.inspect}"
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def add_required(attributes)
|
|
30
|
+
properties = attributes.values.first
|
|
31
|
+
properties[:type] ||= 'String'
|
|
32
|
+
attributes
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def num_or_str?(o)
|
|
36
|
+
o.is_a?(Float) || o.is_a?(Integer) || o.is_a?(String)
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# Implements:
|
|
2
|
+
#
|
|
3
|
+
# template - uses @definition to build a CloudFormation template section
|
|
4
|
+
#
|
|
5
|
+
class Lono::Template::Dsl::Builder
|
|
6
|
+
class Resource < Base
|
|
7
|
+
def template
|
|
8
|
+
camelize(standarize(@definition))
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
# Type is the only required property: https://amzn.to/2x8W5aD
|
|
12
|
+
def standarize(definition)
|
|
13
|
+
first, second, third, _ = definition
|
|
14
|
+
if definition.size == 1 && first.is_a?(Hash) # long form
|
|
15
|
+
first # pass through
|
|
16
|
+
elsif definition.size == 2 && second.is_a?(Hash) # medium form
|
|
17
|
+
logical_id, attributes = first, second
|
|
18
|
+
attributes.delete(:properties) if attributes[:properties].nil? || attributes[:properties].empty?
|
|
19
|
+
{ logical_id => attributes }
|
|
20
|
+
elsif definition.size == 2 && second.is_a?(String) # short form
|
|
21
|
+
logical_id, type = first, second
|
|
22
|
+
{ logical_id => {
|
|
23
|
+
type: type
|
|
24
|
+
}}
|
|
25
|
+
elsif definition.size == 3 && (second.is_a?(String) || second.is_a?(NilClass))# short form
|
|
26
|
+
logical_id, type, properties = first, second, third
|
|
27
|
+
template = { logical_id => {
|
|
28
|
+
type: type
|
|
29
|
+
}}
|
|
30
|
+
attributes = template.values.first
|
|
31
|
+
attributes[:properties] = properties unless properties.empty?
|
|
32
|
+
template
|
|
33
|
+
else # Dont understand this form
|
|
34
|
+
raise "Invalid form provided. definition #{definition.inspect}"
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# Organize core syntax here
|
|
2
|
+
class Lono::Template::Dsl::Builder
|
|
3
|
+
module Syntax
|
|
4
|
+
def aws_template_format_version(version_date)
|
|
5
|
+
@cfn["AWSTemplateFormatVersion"] = version_date
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def description(text)
|
|
9
|
+
@cfn["Description"] = text
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def metadata(data)
|
|
13
|
+
@cfn["Metadata"] = data
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def transform(*definition)
|
|
17
|
+
definition = definition.flatten
|
|
18
|
+
definition.map! { |x| CfnCamelizer.camelize(x) }
|
|
19
|
+
@cfn["Transform"] = definition.size == 1 ? definition.first : definition
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def parameter(*definition)
|
|
23
|
+
@cfn["Parameters"] ||= {}
|
|
24
|
+
param = Parameter.new(definition)
|
|
25
|
+
@cfn["Parameters"].merge!(param.template)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def mapping(*definition)
|
|
29
|
+
@cfn["Mappings"] ||= {}
|
|
30
|
+
mapping = Mapping.new(definition)
|
|
31
|
+
@cfn["Mappings"].merge!(mapping.template)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def resource(*definition)
|
|
35
|
+
@cfn["Resources"] ||= {}
|
|
36
|
+
resource = Resource.new(definition)
|
|
37
|
+
@cfn["Resources"].merge!(resource.template)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def condition(*definition)
|
|
41
|
+
@cfn["Conditions"] ||= {}
|
|
42
|
+
condition = Condition.new(definition)
|
|
43
|
+
@cfn["Conditions"].merge!(condition.template)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def output(*definition)
|
|
47
|
+
@cfn["Outputs"] ||= {}
|
|
48
|
+
output = Output.new(definition)
|
|
49
|
+
@cfn["Outputs"].merge!(output.template)
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# Generic section method in case CloudFormation adds a new future section.
|
|
53
|
+
# The generic section method adds a new top-level key
|
|
54
|
+
def section(key, definition)
|
|
55
|
+
@cfn[key] = Section.new(definition).template
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|