lono 3.5.0 → 4.0.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/.gitignore +15 -4
- data/.rspec +1 -0
- data/CHANGELOG.md +15 -1
- data/Gemfile +3 -3
- data/Guardfile +17 -8
- data/{LICENSE → LICENSE.txt} +1 -1
- data/README.md +20 -12
- data/Rakefile +1 -2
- data/{bin → exe}/lono +1 -0
- data/lib/lono.rb +12 -9
- data/lib/lono/cfn.rb +7 -9
- data/lib/lono/cfn/{aws_services.rb → aws_service.rb} +1 -1
- data/lib/lono/cfn/base.rb +41 -38
- data/lib/lono/cfn/create.rb +6 -2
- data/lib/lono/cfn/delete.rb +2 -2
- data/lib/lono/cfn/diff.rb +1 -1
- data/lib/lono/cfn/preview.rb +26 -15
- data/lib/lono/cfn/update.rb +11 -9
- data/lib/lono/cfn/util.rb +3 -3
- data/lib/lono/clean.rb +1 -1
- data/lib/lono/cli.rb +71 -39
- data/lib/lono/command.rb +42 -18
- data/lib/lono/completer.rb +162 -0
- data/lib/lono/completer/script.rb +6 -0
- data/lib/lono/completer/script.sh +10 -0
- data/lib/lono/completion.rb +15 -0
- data/lib/lono/core.rb +23 -9
- data/lib/lono/core/config.rb +20 -0
- data/lib/lono/default/settings.yml +33 -13
- data/lib/lono/help.rb +6 -79
- data/lib/lono/help/cfn.md +6 -0
- data/lib/lono/help/cfn/create.md +22 -0
- data/lib/lono/help/cfn/delete.md +5 -0
- data/lib/lono/help/cfn/diff.md +5 -0
- data/lib/lono/help/cfn/download.md +5 -0
- data/lib/lono/help/cfn/preview.md +11 -0
- data/lib/lono/help/cfn/update.md +21 -0
- data/lib/lono/help/completion.md +22 -0
- data/lib/lono/help/completion_script.md +3 -0
- data/lib/lono/help/generate.md +7 -0
- data/lib/lono/help/hello.md +5 -0
- data/lib/lono/help/import.md +7 -0
- data/lib/lono/help/inspect.md +4 -0
- data/lib/lono/help/inspect/depends.md +3 -0
- data/lib/lono/help/inspect/summary.md +3 -0
- data/lib/lono/help/new.md +8 -0
- data/lib/lono/help/param.md +3 -0
- data/lib/lono/{param/help.rb → help/param/generate.md} +1 -9
- data/lib/lono/help/script/build.md +5 -0
- data/lib/lono/help/script/upload.md +8 -0
- data/lib/lono/help/template.md +4 -0
- data/lib/lono/help/template/bashify.md +4 -0
- data/lib/lono/help/template/generate.md +7 -0
- data/lib/lono/help/user_data.md +3 -0
- data/lib/lono/importer.rb +43 -20
- data/lib/lono/inspector.rb +2 -19
- data/lib/lono/inspector/base.rb +2 -2
- data/lib/lono/inspector/{depends.rb → graph.rb} +3 -3
- data/lib/lono/inspector/summary.rb +1 -1
- data/lib/lono/new.rb +79 -26
- data/lib/lono/new/helper.rb +16 -0
- data/lib/lono/new/message.rb +35 -0
- data/lib/lono/param.rb +1 -2
- data/lib/lono/param/generator.rb +34 -86
- data/lib/lono/project_checker.rb +35 -40
- data/lib/lono/script.rb +19 -0
- data/lib/lono/script/base.rb +9 -0
- data/lib/lono/script/build.rb +73 -0
- data/lib/lono/script/upload.rb +81 -0
- data/lib/lono/sequence.rb +33 -0
- data/lib/lono/setting.rb +83 -0
- data/lib/lono/template.rb +8 -9
- data/lib/lono/template/{aws_services.rb → aws_service.rb} +1 -1
- data/lib/lono/template/context.rb +73 -0
- data/lib/lono/template/dsl.rb +63 -64
- data/lib/lono/template/helper.rb +201 -0
- data/lib/lono/template/template.rb +29 -221
- data/lib/lono/template/upload.rb +41 -33
- data/lib/lono/upgrade4.rb +175 -0
- data/lib/lono/user_data.rb +31 -0
- data/lib/lono/version.rb +1 -1
- data/lib/starter_projects/autoscaling/.gitignore +1 -0
- data/lib/starter_projects/{json_project → autoscaling}/Gemfile +0 -0
- data/lib/starter_projects/{yaml_project → autoscaling}/Guardfile +0 -0
- data/lib/starter_projects/autoscaling/README.md +118 -0
- data/lib/starter_projects/autoscaling/app/definitions/base.rb +2 -0
- data/lib/starter_projects/autoscaling/app/templates/autoscaling.yml +682 -0
- data/lib/starter_projects/autoscaling/config/params/base/autoscaling.txt +6 -0
- data/lib/starter_projects/autoscaling/config/settings.yml +33 -0
- data/lib/starter_projects/ec2/.gitignore +1 -0
- data/lib/starter_projects/{yaml_project → ec2}/Gemfile +0 -0
- data/lib/starter_projects/{json_project → ec2}/Guardfile +1 -1
- data/lib/starter_projects/ec2/README.md +86 -0
- data/lib/starter_projects/ec2/app/definitions/base.rb +2 -0
- data/lib/starter_projects/ec2/app/definitions/development.rb +1 -0
- data/lib/starter_projects/ec2/app/definitions/production.rb +1 -0
- data/lib/starter_projects/{yaml_project → ec2/app}/helpers/my_custom_helper.rb +0 -0
- data/lib/starter_projects/{json_project/templates/user_data/app.sh → ec2/app/partials/user_data/bootstrap.sh} +1 -2
- data/lib/starter_projects/{yaml_project → ec2/app}/templates/example.yml +0 -0
- data/lib/starter_projects/{json_project/params/base/api-web.txt → ec2/config/params/base/example.txt} +0 -0
- data/lib/starter_projects/ec2/config/params/development/example.txt +3 -0
- data/lib/starter_projects/ec2/config/params/production/example.txt +2 -0
- data/lib/starter_projects/ec2/config/settings.yml +33 -0
- data/lib/starter_projects/ec2/config/variables/base.rb +3 -0
- data/lib/starter_projects/ec2/config/variables/development.rb +2 -0
- data/lib/starter_projects/ec2/config/variables/production.rb +2 -0
- data/lib/starter_projects/ec2/welcome.txt +8 -0
- data/lib/starter_projects/skeleton/.gitignore +1 -0
- data/lib/starter_projects/skeleton/Gemfile +3 -0
- data/lib/starter_projects/skeleton/Guardfile +12 -0
- data/lib/starter_projects/skeleton/README.md +53 -0
- data/{spec/fixtures/my_project/templates/.gitkeep → lib/starter_projects/skeleton/app/definitions/base.rb} +0 -0
- data/lib/starter_projects/skeleton/config/settings.yml +33 -0
- data/lib/starter_projects/skeleton/welcome.txt +7 -0
- data/lono.gemspec +12 -10
- data/spec/fixtures/lono_project/.gitignore +1 -0
- data/spec/fixtures/lono_project/Gemfile +3 -0
- data/spec/fixtures/lono_project/Guardfile +12 -0
- data/spec/fixtures/lono_project/app/definitions/base.rb +10 -0
- data/spec/fixtures/lono_project/app/definitions/base/more.rb +7 -0
- data/spec/fixtures/lono_project/app/definitions/development.rb +1 -0
- data/spec/fixtures/lono_project/app/definitions/production.rb +1 -0
- data/spec/fixtures/lono_project/app/helpers/custom_helper.rb +5 -0
- data/spec/fixtures/lono_project/app/partials/security_group.yml +10 -0
- data/{lib/starter_projects/yaml_project/templates/partial → spec/fixtures/lono_project/app/partials}/user_data/bootstrap.sh +8 -2
- data/spec/fixtures/lono_project/app/templates/example.yml +50 -0
- data/{lib/starter_projects/yaml_project/params/base/api-web-prod.txt → spec/fixtures/lono_project/config/params/base/example.txt} +1 -0
- data/spec/fixtures/lono_project/config/params/development/example.txt +1 -0
- data/spec/fixtures/lono_project/config/params/production/example.txt +1 -0
- data/spec/fixtures/lono_project/config/settings.yml +31 -0
- data/spec/fixtures/lono_project/config/variables/base.rb +3 -0
- data/spec/fixtures/lono_project/config/variables/development.rb +1 -0
- data/spec/fixtures/lono_project/config/variables/production.rb +1 -0
- data/spec/fixtures/params/envonly/params/{prod → development}/network.txt +0 -0
- data/spec/fixtures/params/overlay/params/{prod → development}/network.txt +0 -0
- data/spec/fixtures/raw_templates/aws-waf-security-automations.template +2 -2
- data/spec/lib/lono/cfn_spec.rb +6 -9
- data/spec/lib/lono/cli_spec.rb +44 -0
- data/spec/lib/lono/completion_spec.rb +17 -0
- data/spec/lib/lono/inspect_spec.rb +6 -15
- data/spec/lib/lono/param/generator_spec.rb +45 -26
- data/spec/lib/lono/param_spec.rb +1 -3
- data/spec/lib/lono/setting_spec.rb +47 -0
- data/spec/lib/lono/template/dsl_spec.rb +33 -157
- data/spec/lib/lono/template_spec.rb +4 -16
- data/spec/spec_helper.rb +45 -14
- metadata +168 -82
- data/.coveralls.yml +0 -1
- data/lib/lono/cfn/help.rb +0 -103
- data/lib/lono/current_region.rb +0 -42
- data/lib/lono/inspector/help.rb +0 -21
- data/lib/lono/settings.rb +0 -45
- data/lib/lono/template/help.rb +0 -25
- data/lib/lono/template/helpers.rb +0 -136
- data/lib/starter_projects/json_project/.gitignore +0 -1
- data/lib/starter_projects/json_project/config/templates/base/blog.rb +0 -20
- data/lib/starter_projects/json_project/config/templates/base/stacks.rb +0 -58
- data/lib/starter_projects/json_project/templates/db.json +0 -212
- data/lib/starter_projects/json_project/templates/partial/host_record.json +0 -28
- data/lib/starter_projects/json_project/templates/partial/server.json +0 -45
- data/lib/starter_projects/json_project/templates/user_data/db.sh +0 -39
- data/lib/starter_projects/json_project/templates/user_data/db2.sh +0 -2
- data/lib/starter_projects/json_project/templates/user_data/ruby_script.rb +0 -5
- data/lib/starter_projects/json_project/templates/web.json +0 -386
- data/lib/starter_projects/yaml_project/.gitignore +0 -1
- data/lib/starter_projects/yaml_project/config/templates/base/blog.rb +0 -20
- data/lib/starter_projects/yaml_project/config/templates/base/stacks.rb +0 -56
- data/lib/starter_projects/yaml_project/config/templates/prod/stacks.rb +0 -1
- data/lib/starter_projects/yaml_project/config/templates/stag/stacks.rb +0 -1
- data/lib/starter_projects/yaml_project/config/variables/base/variables.rb +0 -4
- data/lib/starter_projects/yaml_project/config/variables/prod/variables.rb +0 -1
- data/lib/starter_projects/yaml_project/config/variables/stag/variables.rb +0 -1
- data/lib/starter_projects/yaml_project/params/base/example.txt +0 -2
- data/lib/starter_projects/yaml_project/params/prod/example.txt +0 -1
- data/lib/starter_projects/yaml_project/params/stag/example.txt +0 -1
- data/lib/starter_projects/yaml_project/templates/db.yml +0 -148
- data/lib/starter_projects/yaml_project/templates/partial/host_record.yml +0 -14
- data/lib/starter_projects/yaml_project/templates/partial/server.yml +0 -59
- data/lib/starter_projects/yaml_project/templates/web.yml +0 -206
- data/spec/fixtures/my_project/config/templates/base/stacks.rb +0 -3
- data/spec/fixtures/my_project/params/my-stack.txt +0 -3
- data/spec/fixtures/my_project/templates/my-stack.yml +0 -0
- data/spec/lib/lono/new_spec.rb +0 -59
- data/spec/lib/lono/template/template_spec.rb +0 -104
- data/spec/lib/lono_spec.rb +0 -27
data/lib/lono/project_checker.rb
CHANGED
|
@@ -1,46 +1,41 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
#
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
templates_folder_exist
|
|
11
|
-
empty_folders
|
|
12
|
-
end
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
module Lono
|
|
3
|
+
# Checks to see command is running in a lono project.
|
|
4
|
+
# If not, provide a friendly message and possibly exit.
|
|
5
|
+
class ProjectChecker
|
|
6
|
+
class << self
|
|
7
|
+
def check
|
|
8
|
+
check_lono_project
|
|
9
|
+
end
|
|
13
10
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
11
|
+
def check_lono_project
|
|
12
|
+
paths = %w[
|
|
13
|
+
config/settings.yml
|
|
14
|
+
app/definitions
|
|
15
|
+
app/templates
|
|
16
|
+
]
|
|
17
|
+
paths.each do |path|
|
|
18
|
+
unless File.exist?("#{Lono.root}/#{path}")
|
|
19
|
+
puts "ERROR: The #{path} does not exist in this project. Are you sure you are in lono project?".colorize(:red)
|
|
20
|
+
quit 1
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
20
24
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
def empty_folders
|
|
29
|
-
if Dir["#{Lono.root}/config/**/*.rb"].empty?
|
|
30
|
-
puts "The config folder does not contain any lono template definitions."
|
|
31
|
-
quit
|
|
32
|
-
end
|
|
33
|
-
if Dir["#{Lono.root}/templates/**/*"].empty?
|
|
34
|
-
puts "The templates folder does not contain any lono template definitions."
|
|
35
|
-
quit
|
|
36
|
-
end
|
|
37
|
-
end
|
|
25
|
+
# Dont exit for this one. It's okay. But show a warning.
|
|
26
|
+
def empty_templates
|
|
27
|
+
if Dir["#{Lono.config.templates_path}/**/*"].empty?
|
|
28
|
+
puts "INFO: The app/templates folder does not contain any lono template definitions.".colorize(:yellow)
|
|
29
|
+
end
|
|
30
|
+
end
|
|
38
31
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
32
|
+
def quit(signal)
|
|
33
|
+
if ENV['TEST'] == '1'
|
|
34
|
+
signal == 0 || raise("Not in lono project")
|
|
35
|
+
else
|
|
36
|
+
exit(signal)
|
|
37
|
+
end
|
|
38
|
+
end
|
|
44
39
|
end
|
|
45
40
|
end
|
|
46
41
|
end
|
data/lib/lono/script.rb
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
module Lono
|
|
2
|
+
class Script < Command
|
|
3
|
+
autoload :Base, "lono/script/base"
|
|
4
|
+
autoload :Build, "lono/script/build"
|
|
5
|
+
autoload :Upload, "lono/script/upload"
|
|
6
|
+
|
|
7
|
+
desc "build", "Builds output/scripts/scripts-md5sum.tgz from app/script folder"
|
|
8
|
+
long_desc Help.text("script/build")
|
|
9
|
+
def build
|
|
10
|
+
Build.new(options).run
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
desc "upload", "Uploads output/scripts/scripts-md5sum.tgz to s3"
|
|
14
|
+
long_desc Help.text("script/upload")
|
|
15
|
+
def upload
|
|
16
|
+
Upload.new(options).run
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
require "digest"
|
|
2
|
+
require "fileutils"
|
|
3
|
+
|
|
4
|
+
class Lono::Script
|
|
5
|
+
class Build < Base
|
|
6
|
+
# Only avaialble after script has been built.
|
|
7
|
+
def self.scripts_name
|
|
8
|
+
new.scripts_name
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def run
|
|
12
|
+
Lono::ProjectChecker.check
|
|
13
|
+
reset
|
|
14
|
+
if Dir["#{Lono.root}/app/scripts/*"].empty?
|
|
15
|
+
puts "No detected app/scripts"
|
|
16
|
+
return
|
|
17
|
+
else
|
|
18
|
+
puts "Detected app/scripts"
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
puts "Tarballing app/scripts folder to scripts.tgz"
|
|
22
|
+
tarball_path = create_tarball
|
|
23
|
+
save_scripts_info(tarball_path)
|
|
24
|
+
puts "Tarball created at #{tarball_path}"
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# Only avaialble after script has been built.
|
|
28
|
+
def scripts_name
|
|
29
|
+
IO.read(SCRIPTS_INFO_PATH).strip
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def reset
|
|
33
|
+
FileUtils.rm_f(SCRIPTS_INFO_PATH)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def create_tarball
|
|
37
|
+
# https://apple.stackexchange.com/questions/14980/why-are-dot-underscore-files-created-and-how-can-i-avoid-them
|
|
38
|
+
sh "cd app && dot_clean ." if system("type dot_clean > /dev/null")
|
|
39
|
+
|
|
40
|
+
# https://serverfault.com/questions/110208/different-md5sums-for-same-tar-contents
|
|
41
|
+
# Using tar czf directly results in a new m5sum each time because the gzip
|
|
42
|
+
# timestamp is included. So using: tar -c ... | gzip -n
|
|
43
|
+
sh "cd app && tar -c scripts | gzip -n > scripts.tgz" # temporary app/scripts.tgz file
|
|
44
|
+
|
|
45
|
+
rename_with_md5!
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# Apppend a md5 to file after it's been created and moves it to
|
|
49
|
+
# output/scripts/scripts-[MD5].tgz
|
|
50
|
+
def rename_with_md5!
|
|
51
|
+
md5_path = "output/scripts/scripts-#{md5sum}.tgz"
|
|
52
|
+
FileUtils.mkdir_p(File.dirname(md5_path))
|
|
53
|
+
FileUtils.mv("app/scripts.tgz", md5_path)
|
|
54
|
+
md5_path
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def save_scripts_info(scripts_name)
|
|
58
|
+
FileUtils.mkdir_p(File.dirname(SCRIPTS_INFO_PATH))
|
|
59
|
+
IO.write(SCRIPTS_INFO_PATH, scripts_name)
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
# cache this because the file will get removed
|
|
63
|
+
def md5sum
|
|
64
|
+
@md5sum ||= Digest::MD5.file("app/scripts.tgz").to_s[0..7]
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def sh(command)
|
|
68
|
+
puts "=> #{command}"
|
|
69
|
+
system command
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
end
|
|
73
|
+
end
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
require "aws-sdk-s3"
|
|
2
|
+
require "filesize"
|
|
3
|
+
|
|
4
|
+
class Lono::Script
|
|
5
|
+
class Upload < Base
|
|
6
|
+
def run
|
|
7
|
+
Lono::ProjectChecker.check
|
|
8
|
+
return unless scripts_built?
|
|
9
|
+
|
|
10
|
+
upload(tarball_path)
|
|
11
|
+
puts "Uploaded #{File.basename(s3_dest)} to s3}"
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def upload(tarball_path)
|
|
15
|
+
puts "Uploading scripts.tgz (#{filesize}) to #{s3_dest}"
|
|
16
|
+
obj = s3_resource.bucket(bucket_name).object(key)
|
|
17
|
+
start_time = Time.now
|
|
18
|
+
obj.upload_file(tarball_path)
|
|
19
|
+
time_took = pretty_time(Time.now-start_time).colorize(:green)
|
|
20
|
+
puts "Time to upload code to s3: #{time_took}"
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def filesize
|
|
24
|
+
Filesize.from(File.size(tarball_path).to_s + " B").pretty
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def s3_dest
|
|
28
|
+
"s3://#{bucket_name}/#{key}"
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def key
|
|
32
|
+
# Example key: cloudformation/development/scripts/scripts-md5
|
|
33
|
+
"#{dest_folder}/#{File.basename(tarball_path)}"
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# Example:
|
|
37
|
+
# s3_folder: s3://infra-bucket/cloudformation
|
|
38
|
+
# bucket_name: infra-bucket
|
|
39
|
+
def bucket_name
|
|
40
|
+
s3_folder.sub('s3://','').split('/').first
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# Removes s3://bucket-name and adds Lono.env. Example:
|
|
44
|
+
# s3_folder: s3://infra-bucket/cloudformation
|
|
45
|
+
# bucket_name: cloudformation/development/scripts
|
|
46
|
+
def dest_folder
|
|
47
|
+
folder = s3_folder.sub('s3://','').split('/')[1..-1].join('/')
|
|
48
|
+
"#{folder}/#{Lono.env}/scripts"
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# Scripts are only built if the app/scripts folder is non empty
|
|
52
|
+
def scripts_built?
|
|
53
|
+
File.exist?(SCRIPTS_INFO_PATH) && !tarball_path.empty?
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def tarball_path
|
|
57
|
+
IO.read(SCRIPTS_INFO_PATH).strip
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# s3_folder example:
|
|
61
|
+
def s3_folder
|
|
62
|
+
setting = Lono::Setting.new
|
|
63
|
+
setting.s3_folder
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def s3_resource
|
|
67
|
+
@s3_resource ||= Aws::S3::Resource.new
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# http://stackoverflow.com/questions/4175733/convert-duration-to-hoursminutesseconds-or-similar-in-rails-3-or-ruby
|
|
71
|
+
def pretty_time(total_seconds)
|
|
72
|
+
minutes = (total_seconds / 60) % 60
|
|
73
|
+
seconds = total_seconds % 60
|
|
74
|
+
if total_seconds < 60
|
|
75
|
+
"#{seconds.to_i}s"
|
|
76
|
+
else
|
|
77
|
+
"#{minutes.to_i}m #{seconds.to_i}s"
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
require 'fileutils'
|
|
2
|
+
require 'colorize'
|
|
3
|
+
require 'active_support/core_ext/string'
|
|
4
|
+
require 'thor'
|
|
5
|
+
require 'bundler'
|
|
6
|
+
|
|
7
|
+
class Lono::Sequence < Thor::Group
|
|
8
|
+
include Thor::Actions
|
|
9
|
+
|
|
10
|
+
def self.template_name
|
|
11
|
+
ENV['TEMPLATE'] || 'skeleton'
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def self.source_root
|
|
15
|
+
starter_projects = File.expand_path("../starter_projects", File.dirname(__FILE__))
|
|
16
|
+
template_folder = "#{starter_projects}/#{template_name}"
|
|
17
|
+
unless File.exist?(template_folder)
|
|
18
|
+
templates = Dir.glob("#{starter_projects}/*")
|
|
19
|
+
.select { |f| File.directory?(f) }
|
|
20
|
+
.map { |f| " #{File.basename(f)}" }
|
|
21
|
+
.sort
|
|
22
|
+
puts "The TEMPLATE=#{ENV['TEMPLATE']} you specified does not exist.".colorize(:red)
|
|
23
|
+
puts "The available templates are:\n#{templates.join("\n")}"
|
|
24
|
+
exit
|
|
25
|
+
end
|
|
26
|
+
template_folder
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
private
|
|
30
|
+
def git_installed?
|
|
31
|
+
system("type git > /dev/null")
|
|
32
|
+
end
|
|
33
|
+
end
|
data/lib/lono/setting.rb
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
require 'yaml'
|
|
2
|
+
|
|
3
|
+
module Lono
|
|
4
|
+
class Setting
|
|
5
|
+
def initialize(check_lono_project=true)
|
|
6
|
+
@check_lono_project = check_lono_project
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
# data contains the settings.yml config. The order or precedence for settings
|
|
10
|
+
# is the project lono/settings.yml and then the ~/.lono/settings.yml.
|
|
11
|
+
@@data = nil
|
|
12
|
+
def data
|
|
13
|
+
return @@data if @@data
|
|
14
|
+
|
|
15
|
+
if @check_lono_project && !File.exist?(project_settings_path)
|
|
16
|
+
puts "ERROR: No settings file at #{project_settings_path}. Are you sure you are in a project with lono setup?".colorize(:red)
|
|
17
|
+
exit 1
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# project based settings files
|
|
21
|
+
project = load_file(project_settings_path)
|
|
22
|
+
|
|
23
|
+
user_file = "#{ENV['HOME']}/.lono/settings.yml"
|
|
24
|
+
user = load_file(user_file)
|
|
25
|
+
|
|
26
|
+
default_file = File.expand_path("../default/settings.yml", __FILE__)
|
|
27
|
+
default = load_file(default_file)
|
|
28
|
+
|
|
29
|
+
all_envs = default.deep_merge(user.deep_merge(project))
|
|
30
|
+
all_envs = merge_base(all_envs)
|
|
31
|
+
@@data = all_envs[Lono.env] || all_envs["base"] || {}
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# Special helper method to support multiple formats for s3_folder setting.
|
|
35
|
+
# Format 1: Simple String
|
|
36
|
+
#
|
|
37
|
+
# development:
|
|
38
|
+
# s3_folder: mybucket/path/to/folder
|
|
39
|
+
#
|
|
40
|
+
# Format 2: Hash
|
|
41
|
+
#
|
|
42
|
+
# development:
|
|
43
|
+
# s3_folder:
|
|
44
|
+
# default: mybucket/path/to/folder
|
|
45
|
+
# dev_profile1: mybucket/path/to/folder
|
|
46
|
+
# dev_profile1: another-bucket/storage/path
|
|
47
|
+
#
|
|
48
|
+
def s3_folder
|
|
49
|
+
s3_folder = data['s3_folder']
|
|
50
|
+
return s3_folder if s3_folder.nil? or s3_folder.is_a?(String)
|
|
51
|
+
|
|
52
|
+
# If reach here then the s3_folder is a Hash
|
|
53
|
+
s3_folder[ENV['AWS_PROFILE']] || s3_folder["default"]
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
private
|
|
57
|
+
def load_file(path)
|
|
58
|
+
return Hash.new({}) unless File.exist?(path)
|
|
59
|
+
|
|
60
|
+
content = RenderMePretty.result(path)
|
|
61
|
+
data = YAML.load(content)
|
|
62
|
+
# If key is is accidentally set to nil it screws up the merge_base later.
|
|
63
|
+
# So ensure that all keys with nil value are set to {}
|
|
64
|
+
data.each do |lono_env, _setting|
|
|
65
|
+
data[lono_env] ||= {}
|
|
66
|
+
end
|
|
67
|
+
data
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# automatically add base settings to the rest of the environments
|
|
71
|
+
def merge_base(all_envs)
|
|
72
|
+
base = all_envs["base"]
|
|
73
|
+
all_envs.each do |lono_env, env_settings|
|
|
74
|
+
all_envs[lono_env] = base.merge(env_settings) unless lono_env == "base"
|
|
75
|
+
end
|
|
76
|
+
all_envs
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def project_settings_path
|
|
80
|
+
"#{Lono.root}/config/settings.yml"
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
end
|
data/lib/lono/template.rb
CHANGED
|
@@ -2,21 +2,20 @@ require "thor"
|
|
|
2
2
|
require_relative "command"
|
|
3
3
|
|
|
4
4
|
class Lono::Template < Lono::Command
|
|
5
|
-
autoload :
|
|
6
|
-
autoload :
|
|
5
|
+
autoload :Context, 'lono/template/context'
|
|
6
|
+
autoload :Helper, 'lono/template/helper'
|
|
7
7
|
autoload :Bashify, 'lono/template/bashify'
|
|
8
8
|
autoload :DSL, 'lono/template/dsl'
|
|
9
9
|
autoload :Template, 'lono/template/template'
|
|
10
10
|
autoload :Upload, 'lono/template/upload'
|
|
11
|
-
autoload :
|
|
11
|
+
autoload :AwsService, 'lono/template/aws_service'
|
|
12
12
|
|
|
13
|
-
class_option :quiet, type: :boolean,
|
|
13
|
+
class_option :quiet, type: :boolean, desc: "silence the output"
|
|
14
14
|
class_option :noop, type: :boolean, desc: "noop mode, do nothing destructive"
|
|
15
15
|
|
|
16
16
|
desc "generate", "Generate the CloudFormation templates"
|
|
17
|
-
Help.generate
|
|
18
|
-
option :clean, type: :boolean,
|
|
19
|
-
option :pretty, type: :boolean, default: true, desc: "json pretty the output. only applies with json format"
|
|
17
|
+
long_desc Lono::Help.text("template/generate")
|
|
18
|
+
option :clean, type: :boolean, desc: "remove all output files before generating"
|
|
20
19
|
def generate
|
|
21
20
|
DSL.new(options.clone).run
|
|
22
21
|
end
|
|
@@ -26,8 +25,8 @@ class Lono::Template < Lono::Command
|
|
|
26
25
|
Upload.new(options.clone).run
|
|
27
26
|
end
|
|
28
27
|
|
|
29
|
-
desc "bashify
|
|
30
|
-
Help.bashify
|
|
28
|
+
desc "bashify URL-OR-PATH", "Convert the UserData section of an existing CloudFormation Template to a starter bash script that is compatiable with lono"
|
|
29
|
+
long_desc Lono::Help.text("template/bashify")
|
|
31
30
|
def bashify(path)
|
|
32
31
|
Bashify.new(path: path).run
|
|
33
32
|
end
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# Encapsulates helper methods and instance variables to be rendered in the ERB
|
|
2
|
+
# templates.
|
|
3
|
+
class Lono::Template
|
|
4
|
+
class Context
|
|
5
|
+
include Lono::Template::Helper
|
|
6
|
+
|
|
7
|
+
def initialize(options={})
|
|
8
|
+
@options = options
|
|
9
|
+
load_variables
|
|
10
|
+
load_project_helpers
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
# Take a hash and makes them instance variables in the current scope.
|
|
14
|
+
# Use this in custom helper methods to make variables accessible to ERB templates.
|
|
15
|
+
def instance_variables!(variables)
|
|
16
|
+
variables.each do |key, value|
|
|
17
|
+
instance_variable_set('@' + key.to_s, value)
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
private
|
|
22
|
+
# Variables in base.rb are overridden by their environment specific variables
|
|
23
|
+
# file. Example, file LONO_ENV=development:
|
|
24
|
+
#
|
|
25
|
+
# config/variables/base.rb
|
|
26
|
+
# config/variables/development.rb - will override any variables in base.rb
|
|
27
|
+
#
|
|
28
|
+
def load_variables
|
|
29
|
+
load_variables_file("base")
|
|
30
|
+
load_variables_file(Lono.env)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# Load custom helper methods from project
|
|
34
|
+
def load_project_helpers
|
|
35
|
+
Dir.glob("#{Lono.config.helpers_path}/**/*_helper.rb").each do |path|
|
|
36
|
+
filename = path.sub(%r{.*/},'').sub('.rb','')
|
|
37
|
+
module_name = filename.classify
|
|
38
|
+
|
|
39
|
+
# Prepend a period so require works LONO_ROOT is set to a relative path
|
|
40
|
+
# without a period.
|
|
41
|
+
#
|
|
42
|
+
# Example: LONO_ROOT=tmp/lono_project
|
|
43
|
+
first_char = path[0..0]
|
|
44
|
+
path = "./#{path}" unless %w[. /].include?(first_char)
|
|
45
|
+
require path
|
|
46
|
+
self.class.send :include, module_name.constantize
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
# Load the variables defined in config/variables/* to make available in the
|
|
51
|
+
# template blocks in config/templates/*.
|
|
52
|
+
#
|
|
53
|
+
# Example:
|
|
54
|
+
#
|
|
55
|
+
# `config/variables/base.rb`:
|
|
56
|
+
# @foo = 123
|
|
57
|
+
#
|
|
58
|
+
# `app/definitions/base.rb`:
|
|
59
|
+
# template "mytemplate.yml" do
|
|
60
|
+
# source "mytemplate.yml.erb"
|
|
61
|
+
# variables(foo: @foo)
|
|
62
|
+
# end
|
|
63
|
+
#
|
|
64
|
+
# NOTE: Only able to make instance variables avaialble with instance_eval,
|
|
65
|
+
# wasnt able to make local variables available.
|
|
66
|
+
def load_variables_file(name)
|
|
67
|
+
path = "#{Lono.config.variables_path}/#{name}.rb"
|
|
68
|
+
return unless File.exist?(path)
|
|
69
|
+
|
|
70
|
+
instance_eval(IO.read(path))
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end
|