lono 7.1.0 → 7.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.circleci/config.yml +3 -1
- data/.cody/acceptance.sh +2 -0
- data/.cody/buildspec.yml +3 -0
- data/.cody/project.rb +1 -1
- data/CHANGELOG.md +5 -0
- data/lib/lono/cli.rb +12 -0
- data/lib/lono/configset/combiner.rb +1 -1
- data/lib/lono/configset/meta/dsl.rb +1 -1
- data/lib/lono/configset/preparer.rb +5 -5
- data/lib/lono/configset/register/base.rb +2 -1
- data/lib/lono/configset/register/dsl.rb +2 -3
- data/lib/lono/configset/resolver.rb +1 -0
- data/lib/lono/extension.rb +9 -0
- data/lib/lono/extension/helper.rb +13 -0
- data/lib/lono/extension/list.rb +39 -0
- data/lib/lono/extension/new.rb +72 -0
- data/lib/lono/extensions.rb +18 -0
- data/lib/lono/extensions/dsl.rb +11 -0
- data/lib/lono/extensions/loader.rb +32 -0
- data/lib/lono/extensions/preparer.rb +23 -0
- data/lib/lono/extensions/register.rb +15 -0
- data/lib/lono/finder/base.rb +3 -3
- data/lib/lono/finder/extension.rb +11 -0
- data/lib/lono/help/user_data.md +0 -1
- data/lib/lono/jade.rb +24 -17
- data/lib/lono/jade/circular.rb +1 -1
- data/lib/lono/{configset/materializer/jade.rb → jade/materializer.rb} +3 -3
- data/lib/lono/{configset → jade}/materializer/final.rb +1 -1
- data/lib/lono/{configset → jade}/materializer/gems_builder.rb +3 -3
- data/lib/lono/{configset → jade}/materializer/source.rb +1 -1
- data/lib/lono/jade/registry.rb +55 -0
- data/lib/lono/template/context.rb +1 -2
- data/lib/lono/template/context/loader.rb +19 -13
- data/lib/lono/template/context/loader/load_files.rb +24 -0
- data/lib/lono/template/helper.rb +0 -42
- data/lib/lono/template/strategy/common/helpers.rb +44 -0
- data/lib/lono/template/strategy/dsl.rb +3 -8
- data/lib/lono/template/strategy/dsl/builder.rb +12 -17
- data/lib/lono/template/strategy/dsl/builder/helpers.rb +2 -0
- data/lib/lono/template/strategy/dsl/builder/helpers/file_helper.rb +2 -2
- data/lib/lono/template/strategy/dsl/builder/syntax.rb +2 -1
- data/lib/lono/template/strategy/dsl/builder/syntax/extend_with.rb +9 -0
- data/lib/lono/template/strategy/dsl/builder/{section/extensions.rb → syntax/parameter_group.rb} +2 -2
- data/lib/lono/version.rb +1 -1
- data/lib/templates/extension/%extension_name%.gemspec.tt +45 -0
- data/lib/templates/extension/.gitignore +17 -0
- data/lib/templates/extension/.rspec +3 -0
- data/lib/templates/extension/CHANGELOG.md +7 -0
- data/lib/templates/extension/Gemfile.tt +4 -0
- data/lib/templates/extension/Rakefile.tt +9 -0
- data/lib/templates/extension/lib/%extension_name%.rb.tt +5 -0
- data/lib/templates/extension/lib/%extension_name%/helpers/mappings.rb.tt +24 -0
- data/lib/templates/extension/lib/%extension_name%/helpers/outputs.rb.tt +7 -0
- data/lib/templates/extension/lib/%extension_name%/helpers/parameters.rb.tt +10 -0
- data/lib/templates/extension/lib/%extension_name%/helpers/resources/resource.rb.tt +4 -0
- data/lib/templates/extension/lib/%extension_name%/helpers/variables.rb.tt +6 -0
- data/lib/templates/extension/lib/%extension_name%/version.rb.tt +3 -0
- data/lib/templates/extension/spec/spec_helper.rb.tt +29 -0
- data/lono.gemspec +1 -0
- metadata +49 -8
- data/lib/lono/configset/registry.rb +0 -34
data/lib/lono/help/user_data.md
CHANGED
@@ -30,7 +30,6 @@ Running `lono user_data bootstrap` produces:
|
|
30
30
|
aws s3 cp s3://mybucket/path/to/folder/development/scripts/scripts-93b8b29b.tgz /opt/
|
31
31
|
cd /opt
|
32
32
|
tar zxf /opt/scripts-93b8b29b.tgz
|
33
|
-
chmod -R a+x /opt/scripts
|
34
33
|
chown -R ec2-user:ec2-user /opt/scripts
|
35
34
|
|
36
35
|
SCRIPTS=/opt/scripts
|
data/lib/lono/jade.rb
CHANGED
@@ -2,10 +2,6 @@ module Lono
|
|
2
2
|
class Jade
|
3
3
|
include Circular
|
4
4
|
extend Memoist
|
5
|
-
class_attribute :tracked
|
6
|
-
self.tracked = []
|
7
|
-
class_attribute :downloaded
|
8
|
-
self.downloaded = []
|
9
5
|
|
10
6
|
delegate :source_type, to: :jadespec
|
11
7
|
|
@@ -18,7 +14,6 @@ module Lono
|
|
18
14
|
@materialized = false
|
19
15
|
@resolved = false
|
20
16
|
@depends_ons = []
|
21
|
-
self.class.tracked << self
|
22
17
|
end
|
23
18
|
|
24
19
|
def repo
|
@@ -34,7 +29,9 @@ module Lono
|
|
34
29
|
|
35
30
|
def dependencies
|
36
31
|
@depends_ons.map do |registry|
|
37
|
-
Lono::Jade.new(registry.depends_on, registry.parent.type, registry)
|
32
|
+
jade = Lono::Jade.new(registry.depends_on, registry.parent.type, registry) # not same sig as register_configset?
|
33
|
+
Lono::Jade::Registry.tracked_configsets << jade
|
34
|
+
jade
|
38
35
|
end
|
39
36
|
end
|
40
37
|
|
@@ -56,7 +53,12 @@ module Lono
|
|
56
53
|
return nil unless @jadespec
|
57
54
|
if @jadespec.source_type == "materialized"
|
58
55
|
# possible "duplicated" jade instances with same name but will uniq in final materialized Gemfile
|
59
|
-
|
56
|
+
case @jadespec.lono_type
|
57
|
+
when "configset"
|
58
|
+
Lono::Jade::Registry.downloaded_configsets << self
|
59
|
+
when "extension"
|
60
|
+
Lono::Jade::Registry.downloaded_extensions << self
|
61
|
+
end
|
60
62
|
end
|
61
63
|
evaluate_meta_rb
|
62
64
|
@jadespec
|
@@ -66,18 +68,23 @@ module Lono
|
|
66
68
|
# Must return config to set @jadespec in materialize
|
67
69
|
# Only allow download of Lono::Blueprint::Configset::Jade
|
68
70
|
# Other configsets should be configured in project Gemfile.
|
71
|
+
#
|
72
|
+
# Cases:
|
73
|
+
#
|
74
|
+
# 1a) blueprint/configset top-level - download
|
75
|
+
# 1b) blueprint/configset depends_on - download
|
76
|
+
# 2a) configset top-level - dont download, will report to user with validate_all!
|
77
|
+
# 2b) configset depends_on - download
|
78
|
+
# 3) extension - download
|
79
|
+
#
|
69
80
|
def download
|
70
81
|
return if finder.find(@name, local_only: true) # no need to download because locally found
|
71
|
-
|
72
|
-
#
|
73
|
-
#
|
74
|
-
#
|
75
|
-
|
76
|
-
|
77
|
-
# only download jades that came from depends_on
|
78
|
-
return unless @registry.parent || @type == "blueprint/configset"
|
79
|
-
jade = Lono::Configset::Materializer::Jade.new(self)
|
80
|
-
jade.build
|
82
|
+
return unless %w[blueprint/configset configset extension].include?(@type)
|
83
|
+
# Comment out. Unsure if this complexity is worth it. Always download jades.
|
84
|
+
# Only download jades that came from depends_on
|
85
|
+
# return unless @registry.parent || %w[blueprint/configset extension].include?(@type)
|
86
|
+
materializer = Materializer.new(self)
|
87
|
+
materializer.build
|
81
88
|
end
|
82
89
|
memoize :download
|
83
90
|
|
data/lib/lono/jade/circular.rb
CHANGED
@@ -4,7 +4,7 @@ class Lono::Jade
|
|
4
4
|
circular = circular_dependency?
|
5
5
|
return unless circular
|
6
6
|
|
7
|
-
puts "ERROR:
|
7
|
+
puts "ERROR: jade circular dependency detected".color(:red)
|
8
8
|
puts "circular dependency: #{parent_names.join(" => ")}"
|
9
9
|
exit 1
|
10
10
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require "bundler"
|
2
2
|
|
3
|
-
|
4
|
-
class
|
3
|
+
class Lono::Jade
|
4
|
+
class Materializer
|
5
5
|
extend Memoist
|
6
6
|
|
7
7
|
def initialize(jade)
|
@@ -9,7 +9,7 @@ module Lono::Configset::Materializer
|
|
9
9
|
end
|
10
10
|
|
11
11
|
def build
|
12
|
-
GemsBuilder.new(@jade).build
|
12
|
+
Materializer::GemsBuilder.new(@jade).build
|
13
13
|
end
|
14
14
|
end
|
15
15
|
end
|
@@ -1,12 +1,12 @@
|
|
1
1
|
require 'open3'
|
2
2
|
|
3
|
-
|
3
|
+
class Lono::Jade::Materializer
|
4
4
|
class GemsBuilder
|
5
5
|
extend Memoist
|
6
6
|
|
7
7
|
def initialize(*jades)
|
8
8
|
@jades = jades.flatten
|
9
|
-
@build_root = "#{Lono.root}/tmp/
|
9
|
+
@build_root = "#{Lono.root}/tmp/jades"
|
10
10
|
end
|
11
11
|
|
12
12
|
def build
|
@@ -51,7 +51,7 @@ module Lono::Configset::Materializer
|
|
51
51
|
puts stdout
|
52
52
|
puts stderr
|
53
53
|
if stderr.include?("correct access rights")
|
54
|
-
puts "Are you sure you have access to the git repo?".color(:yellow)
|
54
|
+
puts "Are you sure you have access to the git repo and the repo exists?".color(:yellow)
|
55
55
|
end
|
56
56
|
exit 1
|
57
57
|
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
class Lono::Jade
|
2
|
+
class Registry
|
3
|
+
attr_reader :args, :options
|
4
|
+
attr_accessor :caller_line, :parent, :depends_on
|
5
|
+
def initialize(args, options)
|
6
|
+
@args, @options = args, options
|
7
|
+
end
|
8
|
+
|
9
|
+
def name
|
10
|
+
@args.first
|
11
|
+
end
|
12
|
+
|
13
|
+
def gem_options
|
14
|
+
options = @options.dup
|
15
|
+
# Delete special options that is not supported by bundler Gemfile
|
16
|
+
options.delete(:repo)
|
17
|
+
options.delete(:resource) # configset
|
18
|
+
options.delete(:vars) # configset
|
19
|
+
options
|
20
|
+
end
|
21
|
+
|
22
|
+
# configset
|
23
|
+
def resource
|
24
|
+
@options[:resource]
|
25
|
+
end
|
26
|
+
|
27
|
+
def resource=(v)
|
28
|
+
@options[:resource] = v
|
29
|
+
end
|
30
|
+
|
31
|
+
def vars
|
32
|
+
options[:vars] || {}
|
33
|
+
end
|
34
|
+
|
35
|
+
class_attribute :tracked_configsets, default: []
|
36
|
+
class_attribute :downloaded_configsets, default: []
|
37
|
+
class_attribute :tracked_extensions, default: []
|
38
|
+
class_attribute :downloaded_extensions, default: []
|
39
|
+
|
40
|
+
class << self
|
41
|
+
def register_configset(args, options)
|
42
|
+
registry = new(args, options)
|
43
|
+
jade = Lono::Jade.new(registry.name, 'configset', registry)
|
44
|
+
self.tracked_configsets << jade
|
45
|
+
registry
|
46
|
+
end
|
47
|
+
|
48
|
+
def register_extension(args, options)
|
49
|
+
registry = new(args, options)
|
50
|
+
self.tracked_extensions << registry
|
51
|
+
registry
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -1,6 +1,20 @@
|
|
1
1
|
class Lono::Template::Context
|
2
2
|
module Loader
|
3
|
+
include LoadFiles
|
4
|
+
|
3
5
|
private
|
6
|
+
# Not using Lono::Template::Context because that works differently.
|
7
|
+
# That is used to load a context object that is passed to RenderMePretty's context.
|
8
|
+
# So that we can load context for params files and erb templates.
|
9
|
+
#
|
10
|
+
# In this case builder is actually the dsl context.
|
11
|
+
# We want to load variables and helpers into this builder context directly.
|
12
|
+
# This loads additional context. It looks very similar to Lono::Template::Context
|
13
|
+
def load_context
|
14
|
+
load_variables
|
15
|
+
load_helpers
|
16
|
+
end
|
17
|
+
|
4
18
|
# Variables in base.rb are overridden by their environment specific variables
|
5
19
|
# file. Example, file LONO_ENV=development:
|
6
20
|
#
|
@@ -27,20 +41,12 @@ class Lono::Template::Context
|
|
27
41
|
end
|
28
42
|
|
29
43
|
# Load custom helper methods from project
|
30
|
-
def
|
31
|
-
|
32
|
-
|
33
|
-
module_name = filename.camelize
|
44
|
+
def load_helpers
|
45
|
+
load_project_helpers # project helpers will override extension helpers
|
46
|
+
end
|
34
47
|
|
35
|
-
|
36
|
-
|
37
|
-
#
|
38
|
-
# Example: LONO_ROOT=tmp/lono_project
|
39
|
-
first_char = path[0..0]
|
40
|
-
path = "./#{path}" unless %w[. /].include?(first_char)
|
41
|
-
require path
|
42
|
-
self.class.send :include, module_name.constantize
|
43
|
-
end
|
48
|
+
def load_project_helpers
|
49
|
+
load_files(Lono.config.helpers_path)
|
44
50
|
end
|
45
51
|
end
|
46
52
|
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Lono::Template::Context::Loader
|
2
|
+
module LoadFiles
|
3
|
+
# Load custom helper methods from project
|
4
|
+
def load_files(root)
|
5
|
+
paths = Dir.glob("#{root}/**/*.rb")
|
6
|
+
paths.sort_by! { |p| p.size } # so namespaces are loaded first
|
7
|
+
paths.each do |path|
|
8
|
+
# lib = gem extensions
|
9
|
+
# app = project extensions
|
10
|
+
filename = path.sub(%r{.*/lib/},'').sub(%r{.*/app/helpers/},'').sub('.rb','')
|
11
|
+
module_name = filename.camelize
|
12
|
+
|
13
|
+
# Prepend a period so require works LONO_ROOT is set to a relative path without a period.
|
14
|
+
#
|
15
|
+
# Example: LONO_ROOT=tmp/lono_project
|
16
|
+
first_char = path[0..0]
|
17
|
+
path = "./#{path}" unless %w[. /].include?(first_char)
|
18
|
+
|
19
|
+
require path
|
20
|
+
self.class.send :include, module_name.constantize
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
data/lib/lono/template/helper.rb
CHANGED
@@ -7,44 +7,6 @@ require "aws-sdk-core"
|
|
7
7
|
#
|
8
8
|
# Lono::Template::Context.new(blueprint, @options)
|
9
9
|
module Lono::Template::Helper
|
10
|
-
# Bash code that is meant to included in user-data
|
11
|
-
def extract_scripts(options={})
|
12
|
-
settings = setting.data["extract_scripts"] || {}
|
13
|
-
options = settings.merge(options)
|
14
|
-
# defaults also here in case they are removed from settings
|
15
|
-
to = options[:to] || "/opt"
|
16
|
-
user = options[:as] || "ec2-user"
|
17
|
-
|
18
|
-
if Dir.glob("#{Lono.config.scripts_path}/*").empty?
|
19
|
-
puts "WARN: you are using the extract_scripts helper method but you do not have any app/scripts.".color(:yellow)
|
20
|
-
calling_line = caller[0].split(':')[0..1].join(':')
|
21
|
-
puts "Called from: #{calling_line}"
|
22
|
-
return ""
|
23
|
-
end
|
24
|
-
|
25
|
-
<<-BASH_CODE
|
26
|
-
# Generated from the lono extract_scripts helper.
|
27
|
-
# Downloads scripts from s3, extract them, and setup.
|
28
|
-
mkdir -p #{to}
|
29
|
-
aws s3 cp #{scripts_s3_path} #{to}/
|
30
|
-
(
|
31
|
-
cd #{to}
|
32
|
-
tar zxf #{to}/#{scripts_name}
|
33
|
-
chmod -R a+x #{to}/scripts
|
34
|
-
chown -R #{user}:#{user} #{to}/scripts
|
35
|
-
)
|
36
|
-
BASH_CODE
|
37
|
-
end
|
38
|
-
|
39
|
-
def scripts_name
|
40
|
-
File.basename(scripts_s3_path)
|
41
|
-
end
|
42
|
-
|
43
|
-
def scripts_s3_path
|
44
|
-
upload = Lono::Script::Upload.new(@options)
|
45
|
-
upload.s3_dest
|
46
|
-
end
|
47
|
-
|
48
10
|
def template_s3_path(template_name)
|
49
11
|
# high jacking Upload for useful s3_https_url method
|
50
12
|
template_path = "output/#{@blueprint}/templates/#{template_name}.yml"
|
@@ -188,8 +150,4 @@ private
|
|
188
150
|
|
189
151
|
path # original path if this point is reached
|
190
152
|
end
|
191
|
-
|
192
|
-
def setting
|
193
|
-
@setting ||= Lono::Setting.new
|
194
|
-
end
|
195
153
|
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module Lono::Template::Strategy::Common
|
2
|
+
module Helpers
|
3
|
+
# Bash code that is meant to included in user-data
|
4
|
+
def extract_scripts(options={})
|
5
|
+
settings = setting.data["extract_scripts"] || {}
|
6
|
+
options = settings.merge(options)
|
7
|
+
# defaults also here in case they are removed from settings
|
8
|
+
to = options[:to] || "/opt"
|
9
|
+
user = options[:as] || "ec2-user"
|
10
|
+
|
11
|
+
if Dir.glob("#{Lono.config.scripts_path}/*").empty?
|
12
|
+
puts "WARN: you are using the extract_scripts helper method but you do not have any app/scripts.".color(:yellow)
|
13
|
+
calling_line = caller[0].split(':')[0..1].join(':')
|
14
|
+
puts "Called from: #{calling_line}"
|
15
|
+
return ""
|
16
|
+
end
|
17
|
+
|
18
|
+
<<~BASH_CODE
|
19
|
+
# Generated from the lono extract_scripts helper.
|
20
|
+
# Downloads scripts from s3, extract them, and setup.
|
21
|
+
mkdir -p #{to}
|
22
|
+
aws s3 cp #{scripts_s3_path} #{to}/
|
23
|
+
(
|
24
|
+
cd #{to}
|
25
|
+
tar zxf #{to}/#{scripts_name}
|
26
|
+
chown -R #{user}:#{user} #{to}/scripts
|
27
|
+
)
|
28
|
+
BASH_CODE
|
29
|
+
end
|
30
|
+
|
31
|
+
def scripts_name
|
32
|
+
File.basename(scripts_s3_path)
|
33
|
+
end
|
34
|
+
|
35
|
+
def scripts_s3_path
|
36
|
+
upload = Lono::Script::Upload.new(@options)
|
37
|
+
upload.s3_dest
|
38
|
+
end
|
39
|
+
|
40
|
+
def setting
|
41
|
+
@setting ||= Lono::Setting.new
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -1,18 +1,13 @@
|
|
1
1
|
module Lono::Template::Strategy
|
2
2
|
class Dsl < Base
|
3
3
|
attr_reader :results
|
4
|
-
def initialize(options={})
|
5
|
-
super
|
6
|
-
end
|
7
|
-
|
8
4
|
def run
|
9
5
|
puts "Generating CloudFormation templates for blueprint #{@blueprint.color(:green)}:" unless @options[:quiet]
|
10
|
-
|
11
|
-
build_template(template_path)
|
6
|
+
build_template
|
12
7
|
end
|
13
8
|
|
14
|
-
def build_template
|
15
|
-
builder = Builder.new(
|
9
|
+
def build_template
|
10
|
+
builder = Builder.new(@options)
|
16
11
|
builder.build
|
17
12
|
end
|
18
13
|
end
|
@@ -6,22 +6,29 @@ class Lono::Template::Strategy::Dsl
|
|
6
6
|
include Syntax
|
7
7
|
extend Memoist
|
8
8
|
|
9
|
-
def initialize(
|
10
|
-
@
|
11
|
-
@template =
|
9
|
+
def initialize(options={})
|
10
|
+
@options = options
|
11
|
+
@stack, @blueprint, @template, @param = Lono::Conventions.new(options).values
|
12
|
+
@template_path = "#{Lono.config.templates_path}/#{@template}.rb"
|
12
13
|
@parameters = [] # registry
|
13
14
|
@cfn = {}
|
14
15
|
end
|
15
16
|
|
16
17
|
def build
|
17
|
-
|
18
|
-
|
18
|
+
load_extensions # load_extensions before project helpers
|
19
|
+
load_context # variables and project helpers
|
20
|
+
evaluate_template_path(@template_path) # modifies @cfn
|
19
21
|
finalize
|
20
22
|
to_yaml
|
21
23
|
write_output
|
22
24
|
@cfn
|
23
25
|
end
|
24
26
|
|
27
|
+
# load_extensions and evaluate extend_with methods earlier than load_context so project helpers can override extensions
|
28
|
+
def load_extensions # evaluates extend_with
|
29
|
+
Lono::Extensions::Preparer.new(@options).run
|
30
|
+
end
|
31
|
+
|
25
32
|
def finalize
|
26
33
|
o = @options.merge(parameters: @parameters)
|
27
34
|
@cfn = Finalizer.new(@cfn, o).run
|
@@ -46,17 +53,5 @@ class Lono::Template::Strategy::Dsl
|
|
46
53
|
puts " #{pretty_path}"
|
47
54
|
end
|
48
55
|
end
|
49
|
-
|
50
|
-
# Not using Lono::Template::Context because that works differently.
|
51
|
-
# That is used to load a context object that is passed to RenderMePretty's context.
|
52
|
-
# So that we can load context for params files and erb templates.
|
53
|
-
#
|
54
|
-
# In this case builder is actually the dsl context.
|
55
|
-
# We want to load variables and helpers into this builder context directly.
|
56
|
-
# This loads additional context. It looks very similar to Lono::Template::Context
|
57
|
-
def load_context
|
58
|
-
load_variables
|
59
|
-
load_project_helpers
|
60
|
-
end
|
61
56
|
end
|
62
57
|
end
|