lono 1.1.3 → 2.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/.gitmodules +3 -0
- data/CHANGELOG.md +8 -0
- data/README.md +150 -39
- data/bin/lono +2 -2
- data/circle.yml +4 -0
- data/lib/lono.rb +16 -7
- data/lib/lono/cfn.rb +64 -0
- data/lib/lono/cfn/aws_services.rb +37 -0
- data/lib/lono/cfn/base.rb +144 -0
- data/lib/lono/cfn/create.rb +34 -0
- data/lib/lono/cfn/delete.rb +26 -0
- data/lib/lono/cfn/diff.rb +43 -0
- data/lib/lono/cfn/help.rb +93 -0
- data/lib/lono/cfn/preview.rb +133 -0
- data/lib/lono/cfn/update.rb +62 -0
- data/lib/lono/cfn/util.rb +21 -0
- data/lib/lono/cli.rb +19 -10
- data/lib/lono/command.rb +25 -0
- data/lib/lono/help.rb +59 -0
- data/lib/lono/new.rb +3 -2
- data/lib/lono/param.rb +20 -0
- data/lib/lono/param/generator.rb +90 -0
- data/lib/lono/param/help.rb +15 -0
- data/lib/lono/project_checker.rb +44 -0
- data/lib/lono/template.rb +22 -248
- data/lib/lono/template/bashify.rb +39 -0
- data/lib/lono/template/dsl.rb +139 -0
- data/lib/lono/template/help.rb +25 -0
- data/lib/lono/template/template.rb +251 -0
- data/lib/lono/version.rb +1 -1
- data/lib/{starter_project_yaml → starter_projects/json_project}/Gemfile +0 -1
- data/lib/{starter_project_json → starter_projects/json_project}/Guardfile +0 -0
- data/lib/{starter_project_json → starter_projects/json_project}/config/lono.rb +0 -0
- data/lib/{starter_project_json → starter_projects/json_project}/config/lono/api.rb +0 -0
- data/lib/starter_projects/json_project/params/api-web-prod.txt +20 -0
- data/lib/{starter_project_json → starter_projects/json_project}/templates/db.json.erb +0 -0
- data/lib/{starter_project_json → starter_projects/json_project}/templates/partial/host_record.json.erb +0 -0
- data/lib/{starter_project_json → starter_projects/json_project}/templates/partial/server.json.erb +0 -0
- data/lib/{starter_project_json → starter_projects/json_project}/templates/user_data/app.sh.erb +0 -0
- data/lib/{starter_project_json → starter_projects/json_project}/templates/user_data/db.sh.erb +0 -0
- data/lib/{starter_project_json → starter_projects/json_project}/templates/user_data/db2.sh.erb +0 -0
- data/lib/{starter_project_json → starter_projects/json_project}/templates/user_data/ruby_script.rb.erb +0 -0
- data/lib/{starter_project_json → starter_projects/json_project}/templates/web.json.erb +0 -0
- data/lib/{starter_project_json → starter_projects/yaml_project}/Gemfile +0 -1
- data/lib/{starter_project_yaml → starter_projects/yaml_project}/Guardfile +0 -0
- data/lib/{starter_project_yaml → starter_projects/yaml_project}/config/lono.rb +0 -0
- data/lib/{starter_project_yaml → starter_projects/yaml_project}/config/lono/api.rb +0 -0
- data/lib/starter_projects/yaml_project/params/api-web-prod.txt +20 -0
- data/lib/{starter_project_yaml → starter_projects/yaml_project}/templates/db.yml.erb +0 -0
- data/lib/{starter_project_yaml → starter_projects/yaml_project}/templates/partial/host_record.yml.erb +0 -0
- data/lib/{starter_project_yaml → starter_projects/yaml_project}/templates/partial/server.yml.erb +0 -0
- data/lib/{starter_project_yaml → starter_projects/yaml_project}/templates/partial/user_data/bootstrap.sh.erb +0 -0
- data/lib/{starter_project_yaml → starter_projects/yaml_project}/templates/web.yml.erb +0 -0
- data/lono.gemspec +15 -10
- data/spec/fixtures/my_project/config/lono.rb +1 -0
- data/spec/fixtures/my_project/params/my-stack.txt +3 -0
- data/spec/fixtures/my_project/templates/.gitkeep +0 -0
- data/spec/fixtures/my_project/templates/my-stack.yml.erb +0 -0
- data/spec/lib/lono/cfn_spec.rb +35 -0
- data/spec/lib/lono/new_spec.rb +3 -3
- data/spec/lib/lono/param_spec.rb +15 -0
- data/spec/lib/lono/{dsl_spec.rb → template/dsl_spec.rb} +9 -9
- data/spec/lib/lono/template/template_spec.rb +104 -0
- data/spec/lib/lono/template_spec.rb +22 -37
- data/spec/lib/lono_spec.rb +6 -83
- data/vendor/plissken/Gemfile +14 -0
- data/vendor/plissken/LICENSE.txt +20 -0
- data/vendor/plissken/README.md +46 -0
- data/vendor/plissken/Rakefile +56 -0
- data/vendor/plissken/VERSION +1 -0
- data/vendor/plissken/lib/plissken.rb +1 -0
- data/vendor/plissken/lib/plissken/ext/hash/to_snake_keys.rb +45 -0
- data/vendor/plissken/plissken.gemspec +61 -0
- data/vendor/plissken/spec/lib/to_snake_keys_spec.rb +177 -0
- data/vendor/plissken/spec/spec_helper.rb +90 -0
- data/vendor/plissken/test/helper.rb +20 -0
- data/vendor/plissken/test/plissken/ext/hash/to_snake_keys_test.rb +184 -0
- data/vendor/plissken/test/test_plissken.rb +2 -0
- metadata +115 -39
- data/lib/lono/bashify.rb +0 -41
- data/lib/lono/cli/help.rb +0 -37
- data/lib/lono/dsl.rb +0 -132
data/lib/lono/bashify.rb
DELETED
@@ -1,41 +0,0 @@
|
|
1
|
-
require 'open-uri'
|
2
|
-
|
3
|
-
module Lono
|
4
|
-
class Bashify
|
5
|
-
def initialize(options={})
|
6
|
-
@options = options
|
7
|
-
@path = options[:path]
|
8
|
-
end
|
9
|
-
|
10
|
-
def user_data_paths(data,path="")
|
11
|
-
paths = []
|
12
|
-
paths << path
|
13
|
-
data.each do |key,value|
|
14
|
-
if value.is_a?(Hash)
|
15
|
-
paths += user_data_paths(value,"#{path}/#{key}")
|
16
|
-
else
|
17
|
-
paths += ["#{path}/#{key}"]
|
18
|
-
end
|
19
|
-
end
|
20
|
-
paths.select {|p| p =~ /UserData/ && p =~ /Fn::Join/ }
|
21
|
-
end
|
22
|
-
|
23
|
-
def run
|
24
|
-
raw = open(@path).read
|
25
|
-
json = JSON.load(raw)
|
26
|
-
paths = user_data_paths(json)
|
27
|
-
if paths.empty?
|
28
|
-
puts "No UserData script found"
|
29
|
-
return
|
30
|
-
end
|
31
|
-
paths.each do |path|
|
32
|
-
puts "UserData script for #{path}:"
|
33
|
-
key = path.sub('/','').split("/").map {|x| "['#{x}']"}.join('')
|
34
|
-
user_data = eval("json#{key}")
|
35
|
-
delimiter = user_data[0]
|
36
|
-
script = user_data[1]
|
37
|
-
puts script.join(delimiter)
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
data/lib/lono/cli/help.rb
DELETED
@@ -1,37 +0,0 @@
|
|
1
|
-
module Lono
|
2
|
-
module Help
|
3
|
-
def new_long_desc
|
4
|
-
<<-EOL
|
5
|
-
Examples:
|
6
|
-
|
7
|
-
$ lono new project
|
8
|
-
|
9
|
-
$ lono new lono
|
10
|
-
EOL
|
11
|
-
end
|
12
|
-
|
13
|
-
def generate
|
14
|
-
<<-EOL
|
15
|
-
Examples:
|
16
|
-
|
17
|
-
$ lono generate
|
18
|
-
|
19
|
-
$ lono g -c # shortcut
|
20
|
-
|
21
|
-
Builds the cloudformation templates files based on lono project and writes them to the output folder on the filesystem.
|
22
|
-
EOL
|
23
|
-
end
|
24
|
-
|
25
|
-
def bashify
|
26
|
-
<<-EOL
|
27
|
-
Examples:
|
28
|
-
|
29
|
-
$ lono bashify /path/to/cloudformation-template.json
|
30
|
-
|
31
|
-
$ lono bashify https://s3.amazonaws.com/cloudformation-templates-us-east-1/EC2WebSiteSample.template
|
32
|
-
EOL
|
33
|
-
end
|
34
|
-
|
35
|
-
extend self
|
36
|
-
end
|
37
|
-
end
|
data/lib/lono/dsl.rb
DELETED
@@ -1,132 +0,0 @@
|
|
1
|
-
module Lono
|
2
|
-
class DSL
|
3
|
-
def initialize(options={})
|
4
|
-
@options = options
|
5
|
-
@options[:project_root] ||= '.'
|
6
|
-
@path = "#{@options[:project_root]}/config/lono.rb"
|
7
|
-
@templates = []
|
8
|
-
@results = {}
|
9
|
-
@detected_format = nil
|
10
|
-
end
|
11
|
-
|
12
|
-
def run(options={})
|
13
|
-
evaluate
|
14
|
-
build
|
15
|
-
output
|
16
|
-
end
|
17
|
-
|
18
|
-
def evaluate
|
19
|
-
instance_eval(File.read(@path), @path)
|
20
|
-
load_subfolder
|
21
|
-
@detected_format = detect_format
|
22
|
-
end
|
23
|
-
|
24
|
-
# Detects the format of the templates. Simply checks the extension of all the
|
25
|
-
# templates files.
|
26
|
-
# All the templates must be of the same format, either all json or all yaml.
|
27
|
-
def detect_format
|
28
|
-
# @templates contains Array of Hashes. Example:
|
29
|
-
# [{name: ""blog-web-prod.json", block: ...},
|
30
|
-
# {name: ""api-web-prod.json", block: ...}]
|
31
|
-
formats = @templates.map{ |t| File.extname(t[:name]) }.uniq
|
32
|
-
if formats.size > 1
|
33
|
-
puts "ERROR: Detected multiple formats: #{formats.join(", ")}".colorize(:red)
|
34
|
-
puts "All the source values in the template blocks in the config folder must have the same format extension."
|
35
|
-
exit 1
|
36
|
-
else
|
37
|
-
found_format = formats.first
|
38
|
-
if found_format
|
39
|
-
detected_format = found_format.sub(/^\./,'')
|
40
|
-
detected_format = "yaml" if detected_format == "yml"
|
41
|
-
else # empty templates, no templates defined yet
|
42
|
-
detected_format = "yaml" # defaults to yaml
|
43
|
-
end
|
44
|
-
end
|
45
|
-
detected_format
|
46
|
-
end
|
47
|
-
|
48
|
-
# load any templates defined in project/config/lono/*
|
49
|
-
def load_subfolder
|
50
|
-
Dir.glob("#{File.dirname(@path)}/lono/**/*").select{ |e| File.file? e }.each do |path|
|
51
|
-
instance_eval(File.read(path), path)
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
def template(name, &block)
|
56
|
-
@templates << {name: name, block: block}
|
57
|
-
end
|
58
|
-
|
59
|
-
def build
|
60
|
-
@templates.each do |t|
|
61
|
-
@results[t[:name]] = Template.new(t[:name], t[:block], @options).build
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
def output
|
66
|
-
output_path = "#{@options[:project_root]}/output"
|
67
|
-
FileUtils.rm_rf(output_path) if @options[:clean]
|
68
|
-
FileUtils.mkdir(output_path) unless File.exist?(output_path)
|
69
|
-
puts "Generating CloudFormation templates:" unless @options[:quiet]
|
70
|
-
@results.each do |name,text|
|
71
|
-
path = "#{output_path}/#{name}".sub(/^\.\//,'')
|
72
|
-
puts " #{path}" unless @options[:quiet]
|
73
|
-
ensure_parent_dir(path)
|
74
|
-
validate(text, path)
|
75
|
-
File.open(path, 'w') do |f|
|
76
|
-
f.write(output_format(text))
|
77
|
-
end
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
|
-
# TODO: set @detected_format upon DSL.new
|
82
|
-
def validate(text, path)
|
83
|
-
if @detected_format == "json"
|
84
|
-
validate_json(text, path)
|
85
|
-
else
|
86
|
-
validate_yaml(text, path)
|
87
|
-
end
|
88
|
-
end
|
89
|
-
|
90
|
-
def validate_yaml(yaml, path)
|
91
|
-
begin
|
92
|
-
YAML.load(yaml)
|
93
|
-
rescue Psych::SyntaxError => e
|
94
|
-
puts "Invalid yaml. Output written to #{path} for debugging".colorize(:red)
|
95
|
-
puts "ERROR: #{e.message}".colorize(:red)
|
96
|
-
File.open(path, 'w') {|f| f.write(yaml) }
|
97
|
-
exit 1
|
98
|
-
end
|
99
|
-
end
|
100
|
-
|
101
|
-
def validate_json(json, path)
|
102
|
-
begin
|
103
|
-
JSON.parse(json)
|
104
|
-
rescue JSON::ParserError => e
|
105
|
-
puts "Invalid json. Output written to #{path} for debugging".colorize(:red)
|
106
|
-
puts "ERROR: #{e.message}".colorize(:red)
|
107
|
-
File.open(path, 'w') {|f| f.write(json) }
|
108
|
-
exit 1
|
109
|
-
end
|
110
|
-
end
|
111
|
-
|
112
|
-
def output_format(text)
|
113
|
-
@options[:pretty] ? prettify(text) : text
|
114
|
-
end
|
115
|
-
|
116
|
-
# Input text is either yaml or json.
|
117
|
-
# Do not prettify yaml format because it removes the !Ref like CloudFormation notation
|
118
|
-
def prettify(text)
|
119
|
-
@detected_format == "json" ? JSON.pretty_generate(JSON.parse(text)) : remove_blank_lines(text)
|
120
|
-
end
|
121
|
-
|
122
|
-
# ERB templates leaves blank lines around, remove those lines
|
123
|
-
def remove_blank_lines(text)
|
124
|
-
text.split("\n").reject { |l| l.strip == '' }.join("\n") + "\n"
|
125
|
-
end
|
126
|
-
|
127
|
-
def ensure_parent_dir(path)
|
128
|
-
dir = File.dirname(path)
|
129
|
-
FileUtils.mkdir_p(dir) unless File.exist?(dir)
|
130
|
-
end
|
131
|
-
end
|
132
|
-
end
|