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
@@ -26,7 +26,12 @@ class Lono::Configset
|
|
26
26
|
# Dsl.new(options).build
|
27
27
|
generator_class = "Lono::Configset::Strategy::#{strategy.camelize}"
|
28
28
|
generator_class = Object.const_get(generator_class)
|
29
|
-
generator_class.new(@options.merge(root: configset_root)).build
|
29
|
+
full = generator_class.new(@options.merge(root: configset_root)).build
|
30
|
+
if @options[:cli]
|
31
|
+
full["Metadata"] # contains AWS::CloudFormation::Init and optional AWS::CloudFormation::Authentication
|
32
|
+
else
|
33
|
+
full # Combiner uses full metadata structure
|
34
|
+
end
|
30
35
|
end
|
31
36
|
|
32
37
|
def strategy
|
data/lib/lono/configset/list.rb
CHANGED
@@ -41,7 +41,7 @@ class Lono::Configset
|
|
41
41
|
table = Text::Table.new
|
42
42
|
table.head = ["Name", "Path", "Type", "From"]
|
43
43
|
@final.each do |spec|
|
44
|
-
pretty_root = spec.root.sub("#{Lono.root}/",'')
|
44
|
+
pretty_root = spec.root.sub("#{Lono.root}/",'').sub(ENV["HOME"], "~")
|
45
45
|
table.rows << [spec.name, pretty_root, spec.source_type, spec.from]
|
46
46
|
end
|
47
47
|
|
@@ -32,11 +32,15 @@ class Lono::Configset
|
|
32
32
|
# jade like jade.resource_from_parent.
|
33
33
|
registry = jade.registry
|
34
34
|
registry.resource = jade.resource_from_parent
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
35
|
+
|
36
|
+
# Always prepend to Register::Blueprint.configsets to ensure they are run before any other configset.
|
37
|
+
# Leaving old code in place for now. Possibly revisit this approach.
|
38
|
+
Register::Blueprint.prepend(registry)
|
39
|
+
# if jade.type == "blueprint/configset"
|
40
|
+
# Register::Blueprint.prepend(registry)
|
41
|
+
# elsif jade.type == "configset"
|
42
|
+
# Register::Project.prepend(registry)
|
43
|
+
# end
|
40
44
|
end
|
41
45
|
end
|
42
46
|
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module Lono::Configset::S3File
|
2
|
+
class Build < Lono::AbstractBase
|
3
|
+
include Lono::Utils::Rsync
|
4
|
+
include Lono::Utils::Item::Zip
|
5
|
+
|
6
|
+
def run
|
7
|
+
Lono::Configset::S3File::Registry.items.each do |item|
|
8
|
+
build(item)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def build(item)
|
13
|
+
copy_to_output(item)
|
14
|
+
compress_output
|
15
|
+
end
|
16
|
+
|
17
|
+
def copy_to_output(item)
|
18
|
+
src = "#{item.root}/lib/files/#{item.name}"
|
19
|
+
dest = "#{Lono.config.output_path}/#{@blueprint}/configsets/#{item.configset}/files/#{item.name}"
|
20
|
+
rsync(src, dest)
|
21
|
+
end
|
22
|
+
|
23
|
+
def compress_output
|
24
|
+
Registry.items.each do |item|
|
25
|
+
if item.exist?
|
26
|
+
zip(item)
|
27
|
+
else
|
28
|
+
puts "WARN: #{item.src_path} does not exist. Double check that the path is correct in the s3_key call.".color(:yellow)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Lono::Configset::S3File
|
2
|
+
# Holds metadata about the item in the regsitry.
|
3
|
+
class Item
|
4
|
+
include Lono::Utils::Item::FileMethods
|
5
|
+
|
6
|
+
attr_reader :name, :configset, :root
|
7
|
+
def initialize(name, options={})
|
8
|
+
@name, @options = name, options
|
9
|
+
@blueprint = options[:blueprint]
|
10
|
+
@configset = options[:configset]
|
11
|
+
@root = options[:root]
|
12
|
+
@type = options[:type] || 'file'
|
13
|
+
end
|
14
|
+
|
15
|
+
def src_path
|
16
|
+
"#{@root}/lib/files"
|
17
|
+
end
|
18
|
+
|
19
|
+
def output_path
|
20
|
+
"#{Lono.config.output_path}/#{@blueprint}/configsets/#{@configset}/files/#{@name}"
|
21
|
+
end
|
22
|
+
|
23
|
+
def replacement_value
|
24
|
+
aws_data = AwsData.new
|
25
|
+
# "https://s3.amazonaws.com/#{Lono::S3::Bucket.name}/#{s3_path}"
|
26
|
+
# "https://lono-bucket-12di8xz5sy72z.s3-us-west-2.amazonaws.com/stuff/s3-antivirus.tgz"
|
27
|
+
"https://#{Lono::S3::Bucket.name}.s3-#{aws_data.region}.amazonaws.com/#{s3_path}"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module Lono::Configset::S3File
|
2
|
+
class Upload < Lono::AbstractBase
|
3
|
+
def upload
|
4
|
+
return unless Registry.items.size > 0
|
5
|
+
puts "Uploading configset files..."
|
6
|
+
|
7
|
+
Registry.items.each do |item|
|
8
|
+
Lono::S3::Uploader.new(item.zip_file_path).upload
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -13,6 +13,18 @@ module Lono::Configset::Strategy
|
|
13
13
|
extend Memoist
|
14
14
|
include Lono::Configset::EvaluateFile
|
15
15
|
|
16
|
+
# All Lono DSL Helpers and Fn - so configsets have access to instrinic functions like ref
|
17
|
+
# Not including the Lono::Template::Strategy::Dsl::Builder::Syntax since dont need those methods
|
18
|
+
#
|
19
|
+
# Interesting note: must include these modules here so load_project_predefined_variables works.
|
20
|
+
# Since load_project_predefined_variables calls evaluate_file / instance eval which seems to only be
|
21
|
+
# able to access methods from the direct class, not inherited classes like Dsl.
|
22
|
+
#
|
23
|
+
# This allows methods like ref and sub to work in variables files.
|
24
|
+
#
|
25
|
+
include Lono::Template::Strategy::Dsl::Builder::Helpers
|
26
|
+
include Lono::Template::Strategy::Dsl::Builder::Fn
|
27
|
+
|
16
28
|
def initialize(options={})
|
17
29
|
@options = options
|
18
30
|
@configset = options[:configset]
|
@@ -25,10 +37,18 @@ module Lono::Configset::Strategy
|
|
25
37
|
@evaluation_path = find_evaluation_path # implemented by subclass
|
26
38
|
copy_instance_variables
|
27
39
|
load_configset_helpers
|
28
|
-
load # implemented by subclass
|
40
|
+
init = load # implemented by subclass
|
41
|
+
finish_full_structure(init)
|
29
42
|
end
|
30
43
|
memoize :build
|
31
44
|
|
45
|
+
def finish_full_structure(init)
|
46
|
+
full = {"Metadata" => {}}
|
47
|
+
full["Metadata"]["AWS::CloudFormation::Init"] = init["AWS::CloudFormation::Init"]
|
48
|
+
full["Metadata"]["AWS::CloudFormation::Authentication"] = authentication if authentication # only on dsl
|
49
|
+
full.deep_stringify_keys!
|
50
|
+
end
|
51
|
+
|
32
52
|
def copy_instance_variables
|
33
53
|
load_blueprint_predefined_variables
|
34
54
|
load_project_predefined_variables
|
@@ -1,13 +1,16 @@
|
|
1
1
|
module Lono::Configset::Strategy
|
2
2
|
class Dsl < Base
|
3
|
-
|
4
|
-
include
|
3
|
+
# Configset helpers take higher precedence than Lono DSL Helpers. IE: s3_key is overwritten but s3_bucket is the same
|
4
|
+
include Helpers::Dsl
|
5
5
|
|
6
6
|
def initialize(options={})
|
7
7
|
super
|
8
|
-
@structure = {} # holds in memory the configset hash structure
|
8
|
+
@structure = {} # holds in memory the configset hash structure to build AWS::CloudFormation::Init
|
9
9
|
@current = "main" # current configset
|
10
|
+
@command_counts = Hash.new(0)
|
10
11
|
@tracked = []
|
12
|
+
# Also support ability to add AWS::CloudFormation::Authentication
|
13
|
+
@authentication = nil # holds IAM policy info to build AWS::CloudFormation::Authentication
|
11
14
|
end
|
12
15
|
|
13
16
|
def find_evaluation_path
|
@@ -18,9 +21,9 @@ module Lono::Configset::Strategy
|
|
18
21
|
evaluate_file(@evaluation_path)
|
19
22
|
configsets = @configsets || @tracked.uniq
|
20
23
|
configsets = ["main"] if configsets.empty?
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
+
configsets_structure = {"configSets" => {"default" => configsets}}.merge(@structure)
|
25
|
+
full = { "AWS::CloudFormation::Init" => configsets_structure }
|
26
|
+
full.deep_stringify_keys!
|
24
27
|
end
|
25
28
|
end
|
26
29
|
end
|
@@ -2,7 +2,7 @@ require "json"
|
|
2
2
|
|
3
3
|
module Lono::Configset::Strategy
|
4
4
|
class Erb < Base
|
5
|
-
include Helpers
|
5
|
+
include Helpers::Erb
|
6
6
|
|
7
7
|
def find_evaluation_path
|
8
8
|
paths = %w[configset.yml configset.json].map { |p| "#{@root}/lib/#{p}" }
|
@@ -11,6 +11,7 @@ module Lono::Configset::Strategy
|
|
11
11
|
|
12
12
|
def load
|
13
13
|
content = RenderMePretty.result(@evaluation_path, context: self)
|
14
|
+
# init structure
|
14
15
|
if File.extname(@evaluation_path) == ".yml"
|
15
16
|
load_yaml(content)
|
16
17
|
else
|
@@ -18,6 +19,10 @@ module Lono::Configset::Strategy
|
|
18
19
|
end
|
19
20
|
end
|
20
21
|
|
22
|
+
def authentication
|
23
|
+
# noop
|
24
|
+
end
|
25
|
+
|
21
26
|
def load_yaml(content)
|
22
27
|
# Write to file so can use Yamler::Validator
|
23
28
|
path = "/tmp/lono/configset.yml"
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module Lono::Configset::Strategy::Helpers::Dsl
|
2
|
+
module Auth
|
3
|
+
def authentication(data=nil, force: false)
|
4
|
+
if data.nil?
|
5
|
+
authentication_reader
|
6
|
+
else
|
7
|
+
authentication_setter(data, force)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
# data can be either:
|
12
|
+
#
|
13
|
+
# 1. logical id - String
|
14
|
+
# 2. Full AWS::CloudFormation::Authentication value structure
|
15
|
+
#
|
16
|
+
def authentication_reader
|
17
|
+
# AWS::CloudFormation::Authentication
|
18
|
+
case @authentication
|
19
|
+
when String
|
20
|
+
logical_id = @authentication
|
21
|
+
{
|
22
|
+
rolebased: {
|
23
|
+
type: "S3",
|
24
|
+
buckets: [lono_bucket_name],
|
25
|
+
roleName: {Ref: logical_id}, # currently ref meth is not available
|
26
|
+
}
|
27
|
+
}
|
28
|
+
when Hash
|
29
|
+
@authentication
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def authentication_setter(data, force=false)
|
34
|
+
@authentication = data unless @authentication || force
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
module Lono::Configset::Strategy::Dsl
|
1
|
+
module Lono::Configset::Strategy::Helpers::Dsl
|
2
2
|
module Core
|
3
3
|
def content_file(path)
|
4
4
|
content_path = "#{@root}/lib/content"
|
@@ -9,5 +9,10 @@ module Lono::Configset::Strategy::Dsl::Helpers
|
|
9
9
|
"File not found: #{file}"
|
10
10
|
end
|
11
11
|
end
|
12
|
+
|
13
|
+
def s3_key(name)
|
14
|
+
Lono::Configset::S3File::Registry.register(name, blueprint: @blueprint, configset: @configset, root: @root)
|
15
|
+
"file://configset/#{@configset}/#{name}"
|
16
|
+
end
|
12
17
|
end
|
13
18
|
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module Lono::Configset::Strategy::Helpers::Dsl
|
2
|
+
module Package
|
3
|
+
# In recent versions of the AmazonLinux2 cfnbootstrap, , the package command doesnt work with updated versions of rubygems.
|
4
|
+
# Get this error
|
5
|
+
#
|
6
|
+
# invalid option: --no-ri
|
7
|
+
#
|
8
|
+
# More details: https://gist.github.com/tongueroo/569878afdc7eb904490b9ee8b03f304f
|
9
|
+
#
|
10
|
+
# Found the cfnbootstrap version by looking at the source on 2020-03-21 in
|
11
|
+
#
|
12
|
+
# $ cat /usr/lib/python2.7/site-packages/cfnbootstrap/public_constants.py
|
13
|
+
# _release = '31'
|
14
|
+
# _version = '1.4-' + _release
|
15
|
+
#
|
16
|
+
# There is no way to get the version from the /opt/aws/bin/cfn-init command.
|
17
|
+
#
|
18
|
+
# We work around this be using the command instruction and use the gem install and list commands.
|
19
|
+
#
|
20
|
+
# $ gem list tilt -e -i -v 1.4.0
|
21
|
+
# false # also $? is 1
|
22
|
+
# $ gem list tilt -e -i -v 1.4.1
|
23
|
+
# true # also $? is 0
|
24
|
+
# $
|
25
|
+
#
|
26
|
+
def gem_package(name, version=nil)
|
27
|
+
unless_clause = "gem list #{name} -e -i "
|
28
|
+
unless_clause += "-v #{version}" if version
|
29
|
+
command("#{name}-gem-install",
|
30
|
+
command: "gem install #{name} #{version}",
|
31
|
+
unless: unless_clause
|
32
|
+
)
|
33
|
+
end
|
34
|
+
|
35
|
+
def yum_package(name, version=nil)
|
36
|
+
versions = [version].compact
|
37
|
+
package("yum", name => versions)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
module Lono::Configset::Strategy::Helpers::Dsl
|
2
|
+
module Syntax
|
3
|
+
extend Memoist
|
4
|
+
|
5
|
+
%w[package group user file service].each do |meth|
|
6
|
+
section = meth.pluralize
|
7
|
+
define_method(meth) do |k, props={}|
|
8
|
+
init_empty(@current, section)
|
9
|
+
current_structure(@current)[section].deep_merge!(k => props)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
# Add extra conveniences to command method
|
14
|
+
def command(key, props={})
|
15
|
+
init_empty(@current, "commands")
|
16
|
+
|
17
|
+
# order commands automatically
|
18
|
+
if key !~ /^\d+_/
|
19
|
+
c = @command_counts[@current] += 1 # IE: @command_counts["main"]
|
20
|
+
padded_c = "%03d" % c
|
21
|
+
key = "#{padded_c}_#{key}"
|
22
|
+
end
|
23
|
+
|
24
|
+
# if syntax support
|
25
|
+
if props.key?(:if)
|
26
|
+
if_clause = props.delete(:if)
|
27
|
+
props[:test] = "if #{if_clause} ; then true ; else false ; fi"
|
28
|
+
# returns true - will run command
|
29
|
+
# returns false - will not run command
|
30
|
+
end
|
31
|
+
|
32
|
+
# unless syntax support
|
33
|
+
if props.key?(:unless)
|
34
|
+
unless_clause = props.delete(:unless)
|
35
|
+
props[:test] = "if #{unless_clause} ; then false ; else true ; fi"
|
36
|
+
# returns true - will run command
|
37
|
+
# returns false - will not run command
|
38
|
+
end
|
39
|
+
|
40
|
+
current_structure(@current)["commands"].deep_merge!(key => props)
|
41
|
+
end
|
42
|
+
|
43
|
+
# Source has a different signature than the other native methods
|
44
|
+
def source(*args)
|
45
|
+
if args.first.is_a?(Hash)
|
46
|
+
item = args.first
|
47
|
+
else # 2 args form: first element is k, second is
|
48
|
+
k, v, _ = args
|
49
|
+
item = {k => v}
|
50
|
+
end
|
51
|
+
|
52
|
+
init_empty(@current, "sources")
|
53
|
+
current_structure(@current)["sources"].deep_merge!(item)
|
54
|
+
end
|
55
|
+
|
56
|
+
def configset(current)
|
57
|
+
@tracked << current
|
58
|
+
previous, @current = @current, current
|
59
|
+
yield
|
60
|
+
@current = previous
|
61
|
+
end
|
62
|
+
|
63
|
+
private
|
64
|
+
def current_structure(configset)
|
65
|
+
@structure[configset] ||= {}
|
66
|
+
end
|
67
|
+
memoize :current_structure
|
68
|
+
|
69
|
+
def init_empty(configset, section)
|
70
|
+
current = current_structure(configset)
|
71
|
+
current[section] ||= {}
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
data/lib/lono/extension/list.rb
CHANGED
@@ -26,7 +26,8 @@ class Lono::Extension
|
|
26
26
|
presenter.header = %w[Name Path Type]
|
27
27
|
jadespecs.each do |j|
|
28
28
|
if tracked_extension_names.include?(j.name)
|
29
|
-
|
29
|
+
pretty_path = j.root.sub("#{Lono.root}/",'').sub(ENV["HOME"], "~")
|
30
|
+
presenter.rows << [j.name, pretty_path, j.source_type]
|
30
31
|
end
|
31
32
|
end
|
32
33
|
presenter.show
|