lono 3.5.0 → 4.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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/template/upload.rb
CHANGED
@@ -4,20 +4,20 @@ require 'base64'
|
|
4
4
|
require 'digest'
|
5
5
|
|
6
6
|
class Lono::Template::Upload
|
7
|
-
include Lono::Template::
|
7
|
+
include Lono::Template::AwsService
|
8
8
|
|
9
9
|
def initialize(options={})
|
10
10
|
@options = options
|
11
11
|
@checksums = {}
|
12
|
+
@prefix = "#{folder_key}/#{Lono.env}/templates" # s3://s3-bucket/folder/developemnt/templates
|
12
13
|
end
|
13
14
|
|
14
15
|
def run
|
15
16
|
ensure_s3_setup!
|
16
17
|
load_checksums!
|
17
18
|
|
18
|
-
paths = Dir.glob("#{Lono.
|
19
|
-
paths.
|
20
|
-
select { |p| File.file?(p) }.each do |path|
|
19
|
+
paths = Dir.glob("#{Lono.config.output_path}/templates/**/*")
|
20
|
+
paths.select { |p| File.file?(p) }.each do |path|
|
21
21
|
upload(path)
|
22
22
|
end
|
23
23
|
say "Templates uploaded to s3."
|
@@ -35,12 +35,11 @@ class Lono::Template::Upload
|
|
35
35
|
def load_checksums!
|
36
36
|
return if @options[:noop]
|
37
37
|
|
38
|
-
|
39
|
-
resp = s3.list_objects(bucket: s3_bucket, prefix: prefix)
|
38
|
+
resp = s3.list_objects(bucket: s3_bucket, prefix: @prefix)
|
40
39
|
resp.contents.each do |object|
|
41
40
|
# key does not include the bucket name
|
42
|
-
# full path = s3://my-bucket/
|
43
|
-
# key =
|
41
|
+
# full path = s3://my-bucket/s3_folder/templates/production/my-template.yml
|
42
|
+
# key = s3_folder/templates/production/my-template.yml
|
44
43
|
# etag is the checksum as long as the file is not a multi-part file upload
|
45
44
|
# it has extra double quotes wrapped around it.
|
46
45
|
# etag = "\"9cb437490cee2cc96101baf326e5ca81\""
|
@@ -55,7 +54,7 @@ class Lono::Template::Upload
|
|
55
54
|
|
56
55
|
def upload(path)
|
57
56
|
pretty_path = path.sub(/^\.\//, '')
|
58
|
-
key = "#{
|
57
|
+
key = "#{@prefix}/#{pretty_path.sub(%r{output/templates/},'')}"
|
59
58
|
s3_full_path = "s3://#{s3_bucket}/#{key}"
|
60
59
|
|
61
60
|
local_checksum = Digest::MD5.hexdigest(IO.read(path))
|
@@ -73,57 +72,66 @@ class Lono::Template::Upload
|
|
73
72
|
) unless @options[:noop]
|
74
73
|
|
75
74
|
# Example output:
|
76
|
-
# Uploaded: output/docker.yml to s3://boltops-
|
77
|
-
# Uploaded: output/ecs/private.yml to s3://boltops-
|
75
|
+
# Uploaded: output/templates/docker.yml to s3://boltops-dev/s3_folder/templates/development/docker.yml
|
76
|
+
# Uploaded: output/templates/ecs/private.yml to s3://boltops-dev/s3_folder/templates/development/ecs/private.yml
|
78
77
|
message = "Uploaded: #{pretty_path} to #{s3_full_path}".colorize(:green)
|
79
78
|
message = "NOOP: #{message}" if @options[:noop]
|
80
79
|
say message
|
81
80
|
end
|
82
81
|
|
83
|
-
# @checksums map has a key format:
|
82
|
+
# @checksums map has a key format: s3_folder/templates/development/docker.yml
|
84
83
|
#
|
85
|
-
# path = ./output/docker.yml
|
86
|
-
#
|
84
|
+
# path = ./output/templates/docker.yml
|
85
|
+
# s3_folder = s3://boltops-dev/s3_folder/templates/development/docker.yml
|
87
86
|
def remote_checksum(path)
|
88
87
|
# first convert the local path to the path format that is stored in @checksums keys
|
89
|
-
# ./output/docker.yml =>
|
88
|
+
# ./output/templates/docker.yml => s3_folder/templates/development/docker.yml
|
90
89
|
pretty_path = path.sub(/^\.\//, '')
|
91
|
-
key = "#{
|
90
|
+
key = "#{@prefix}/#{pretty_path.sub(%r{output/templates/},'')}"
|
92
91
|
@checksums[key]
|
93
92
|
end
|
94
93
|
|
95
|
-
# https://s3.amazonaws.com/mybucket/
|
94
|
+
# https://s3.amazonaws.com/mybucket/s3_folder/templates/production/parent.yml
|
96
95
|
def s3_https_url(template_path)
|
97
96
|
ensure_s3_setup!
|
98
|
-
"https://s3.amazonaws.com/#{s3_bucket}/#{
|
97
|
+
"https://s3.amazonaws.com/#{s3_bucket}/#{@prefix}/#{template_path}"
|
99
98
|
end
|
100
99
|
|
100
|
+
# Parse the s3_folder setting and remove the folder portion to leave the
|
101
|
+
# "s3_bucket" portion
|
101
102
|
# Example:
|
102
|
-
# s3_bucket('s3://mybucket/templates/storage/path')
|
103
|
+
# s3_bucket('s3://mybucket/templates/storage/path')
|
104
|
+
# => mybucket
|
103
105
|
def s3_bucket
|
104
|
-
return
|
105
|
-
|
106
|
+
return nil if @options[:noop] # to get spec passing
|
107
|
+
return nil unless s3_folder
|
108
|
+
s3_folder.sub('s3://','').split('/').first
|
106
109
|
end
|
107
110
|
|
111
|
+
# The folder_key is the s3_folder setting with the s3 bucket.
|
112
|
+
#
|
108
113
|
# Example:
|
109
|
-
# s3_bucket('s3://mybucket/templates/storage/path')
|
110
|
-
|
111
|
-
|
112
|
-
@
|
114
|
+
# s3_bucket('s3://mybucket/templates/storage/path')
|
115
|
+
# => templates/storage/path
|
116
|
+
def folder_key
|
117
|
+
return nil if @options[:noop] # to get spec passing
|
118
|
+
return nil unless s3_folder
|
119
|
+
s3_folder.sub('s3://','').split('/')[1..-1].join('/')
|
120
|
+
end
|
121
|
+
|
122
|
+
def s3_folder
|
123
|
+
settings = Lono::Setting.new
|
124
|
+
settings.s3_folder
|
113
125
|
end
|
114
126
|
|
115
127
|
# nice warning if the s3 path not found
|
116
128
|
def ensure_s3_setup!
|
117
129
|
return if @options[:noop]
|
130
|
+
return if s3_folder
|
118
131
|
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
else
|
123
|
-
say "Unable to upload templates to s3 because you have not configured the s3.path option in lono settings.yml.".colorize(:red)
|
124
|
-
say "Please configure settings.yml with s3.path. Refer to http://lono.cloud/docs/settings/ for more help.".colorize(:red)
|
125
|
-
exit 1
|
126
|
-
end
|
132
|
+
say "Unable to upload templates to s3 because you have not configured the s3_folder option in lono settings.yml.".colorize(:red)
|
133
|
+
say "Please configure settings.yml with s3_folder. For more help: http://lono.cloud/docs/settings/".colorize(:red)
|
134
|
+
exit 1
|
127
135
|
end
|
128
136
|
|
129
137
|
def say(message)
|
@@ -0,0 +1,175 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
require 'yaml'
|
3
|
+
|
4
|
+
module Lono
|
5
|
+
class Upgrade4
|
6
|
+
def initialize(options)
|
7
|
+
@options = options
|
8
|
+
end
|
9
|
+
|
10
|
+
def run
|
11
|
+
checks
|
12
|
+
puts "Upgrading structure of your current project to the new lono version 4 project structure"
|
13
|
+
|
14
|
+
upgrade_settings("config/settings.yml")
|
15
|
+
upgrade_settings("#{ENV['HOME']}/.lono/settings.yml")
|
16
|
+
add_mandantory_settings
|
17
|
+
|
18
|
+
FileUtils.mkdir_p("app")
|
19
|
+
mv("helpers", "app/helpers")
|
20
|
+
mv("params", "config/params")
|
21
|
+
mv("config/templates", "app/definitions")
|
22
|
+
mv("templates", "app/templates")
|
23
|
+
mv("app/templates/partial", "app/partials")
|
24
|
+
mv("app/partials/user_data", "app/user_data")
|
25
|
+
update_variables
|
26
|
+
update_stacks
|
27
|
+
update_params
|
28
|
+
|
29
|
+
puts "Upgrade to lono version 4 complete!"
|
30
|
+
end
|
31
|
+
|
32
|
+
def update_stacks
|
33
|
+
update_structure("app/definitions")
|
34
|
+
end
|
35
|
+
|
36
|
+
def update_variables
|
37
|
+
update_structure("config/variables")
|
38
|
+
end
|
39
|
+
|
40
|
+
# Takes variable files in the subfolder like config/variables/production/*
|
41
|
+
# and combines the into a single file like config/variables/production.rb.
|
42
|
+
#
|
43
|
+
# config/variables/base/* -> config/variables/base.rb
|
44
|
+
# config/variables/development/* -> config/variables/development.rb
|
45
|
+
# config/variables/production/* -> config/variables/production.rb
|
46
|
+
# app/definitions/base/* -> app/definitions/base.rb
|
47
|
+
# app/definitions/development/* -> app/definitions/development.rb
|
48
|
+
# app/definitions/production/* -> app/definitions/production.rb
|
49
|
+
def update_structure(component_path)
|
50
|
+
puts "Updating structure of #{component_path}"
|
51
|
+
Dir.glob("#{component_path}/*").each do |path|
|
52
|
+
next unless File.directory?(path)
|
53
|
+
folder = File.basename(path)
|
54
|
+
update_structure_for(component_path, folder)
|
55
|
+
end
|
56
|
+
|
57
|
+
# remove the old folders
|
58
|
+
Dir.glob("#{component_path}/*").each do |path|
|
59
|
+
next unless File.directory?(path)
|
60
|
+
FileUtils.rm_rf(path)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
# combines the files in the lono_env subfolder into one file
|
65
|
+
def update_structure_for(component_path, lono_env)
|
66
|
+
code = ""
|
67
|
+
Dir.glob("#{component_path}/#{lono_env}/*.rb").each do |path|
|
68
|
+
code << IO.read(path)
|
69
|
+
code << "\n"
|
70
|
+
end
|
71
|
+
IO.write("#{component_path}/#{env_map(lono_env)}.rb", code)
|
72
|
+
end
|
73
|
+
|
74
|
+
def update_params
|
75
|
+
Dir.glob("config/params/*").each do |path|
|
76
|
+
next unless File.directory?(path)
|
77
|
+
lono_env = File.basename(path)
|
78
|
+
mapped_env = env_map(lono_env)
|
79
|
+
if mapped_env != lono_env
|
80
|
+
mv("config/params/#{lono_env}", "config/params/#{mapped_env}")
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
# make to the longer full environment names
|
86
|
+
def env_map(lono_env)
|
87
|
+
map = {
|
88
|
+
"prod" => "production",
|
89
|
+
"stag" => "staging",
|
90
|
+
"dev" => "development",
|
91
|
+
}
|
92
|
+
map[lono_env] || lono_env
|
93
|
+
end
|
94
|
+
|
95
|
+
def checks
|
96
|
+
if File.exist?(Lono.config.definitions_path)
|
97
|
+
puts "It looks like you already have a #{Lono.config.definitions_path} folder in your project. This is the new project structure so exiting without updating anything."
|
98
|
+
exit
|
99
|
+
end
|
100
|
+
|
101
|
+
old_templates_path = "#{Lono.root}/config/templates"
|
102
|
+
if !File.exist?(old_templates_path)
|
103
|
+
puts "Could not find a #{old_templates_path} folder in your project. Maybe you want to run lono new to initialize a new lono project instead?"
|
104
|
+
exit
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
def upgrade_settings(path)
|
109
|
+
return unless File.exist?(path)
|
110
|
+
|
111
|
+
data = YAML.load_file(path)
|
112
|
+
return if data.key?("base") # already in new format
|
113
|
+
|
114
|
+
new_structure = {}
|
115
|
+
|
116
|
+
(data["aws_profile_lono_env_map"] || {}).each do |aws_profile, lono_env|
|
117
|
+
new_structure[env_map(lono_env)] ||= {}
|
118
|
+
new_structure[env_map(lono_env)]["aws_profiles"] ||= []
|
119
|
+
new_structure[env_map(lono_env)]["aws_profiles"] << aws_profile
|
120
|
+
end
|
121
|
+
data.delete("aws_profile_lono_env_map")
|
122
|
+
|
123
|
+
data = update_s3_setting(data)
|
124
|
+
|
125
|
+
new_structure["base"] = data
|
126
|
+
text = YAML.dump(new_structure)
|
127
|
+
IO.write(path, text)
|
128
|
+
puts "Upgraded settings: #{path}"
|
129
|
+
if path.include?(ENV['HOME'])
|
130
|
+
puts "NOTE: Your ~/.lono/settings.yml file was also upgraded to the new format. If you are using lono in other projects those will have to be upgraded also."
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
# accounts for most cases
|
135
|
+
def update_s3_setting(data)
|
136
|
+
return data unless data["s3"] && data["s3"]["path"]
|
137
|
+
|
138
|
+
options = data["s3"]["path"]
|
139
|
+
if options.is_a?(String)
|
140
|
+
data.delete("s3")
|
141
|
+
data["s3_folder"] = options
|
142
|
+
return data # return early if String
|
143
|
+
end
|
144
|
+
|
145
|
+
# Reach here: dealing with a Hash
|
146
|
+
if options.size == 1 and options["default"]
|
147
|
+
data["s3_folder"] = options["default"]
|
148
|
+
end
|
149
|
+
|
150
|
+
if options.size > 1
|
151
|
+
data["s3_folder"] = {}
|
152
|
+
options.each do |key, value|
|
153
|
+
data["s3_folder"][key] = value
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
data.delete("s3")
|
158
|
+
data
|
159
|
+
end
|
160
|
+
|
161
|
+
# If config/settings.yml does not exist, use the default one.
|
162
|
+
def add_mandantory_settings
|
163
|
+
return if File.exists?("config/settings.yml")
|
164
|
+
|
165
|
+
default_settings = File.expand_path("default/settings.yml", File.dirname(__FILE__))
|
166
|
+
FileUtils.cp(default_settings, "config/settings.yml")
|
167
|
+
end
|
168
|
+
|
169
|
+
def mv(src, dest)
|
170
|
+
return unless File.exist?(src)
|
171
|
+
puts "mv #{src} #{dest}"
|
172
|
+
FileUtils.mv(src, dest)
|
173
|
+
end
|
174
|
+
end
|
175
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module Lono
|
2
|
+
# This class is not use by lono internally. It is really only meant to be
|
3
|
+
# exposed to the lono userdata command so users can debug their generated
|
4
|
+
# app/user_data scripts. It is useful for debugging.
|
5
|
+
#
|
6
|
+
# Normally, the Lono::DSL#run method generates the CloudFormation templates
|
7
|
+
# and embeds user-data script into the template.
|
8
|
+
class UserData
|
9
|
+
def initialize(options)
|
10
|
+
@options = options
|
11
|
+
@name = options[:name]
|
12
|
+
@path = "#{Lono.root}/app/user_data/#{@name}.sh"
|
13
|
+
end
|
14
|
+
|
15
|
+
def generate
|
16
|
+
puts "Generating user_data for '#{@name}' at #{@path}"
|
17
|
+
if File.exist?(@path)
|
18
|
+
puts RenderMePretty.result(@path, context: context)
|
19
|
+
else
|
20
|
+
puts "ERROR: #{@path} does not exist".colorize(:red)
|
21
|
+
exit 1
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
# Context for ERB rendering.
|
26
|
+
# This is where we control what references get passed to the ERB rendering.
|
27
|
+
def context
|
28
|
+
@context ||= Lono::Template::Context.new(@options)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
data/lib/lono/version.rb
CHANGED
@@ -0,0 +1 @@
|
|
1
|
+
output
|
File without changes
|
File without changes
|
@@ -0,0 +1,118 @@
|
|
1
|
+
# Autoscaling Lono Example
|
2
|
+
|
3
|
+
## Usage
|
4
|
+
|
5
|
+
Create a new project.
|
6
|
+
|
7
|
+
```
|
8
|
+
TEMPLATE=autoscaling lono new autoscaling
|
9
|
+
cd autoscaling
|
10
|
+
```
|
11
|
+
|
12
|
+
Edit `config/params/base/autoscaling.txt` with your desired parameters. Here are the current contents of `config/params/base/autoscaling.txt`:
|
13
|
+
|
14
|
+
```sh
|
15
|
+
VpcId=
|
16
|
+
Subnets=
|
17
|
+
OperatorEMail=
|
18
|
+
KeyName=
|
19
|
+
#InstanceType= # optional
|
20
|
+
#SSHLocation= # optional
|
21
|
+
```
|
22
|
+
|
23
|
+
|
24
|
+
Then launch the stack.
|
25
|
+
|
26
|
+
```sh
|
27
|
+
lono cfn create autoscaling
|
28
|
+
```
|
29
|
+
|
30
|
+
## How This Example Was Originally Built
|
31
|
+
|
32
|
+
First, generate a skeleton starter lono project.
|
33
|
+
|
34
|
+
```sh
|
35
|
+
lono new autoscaling
|
36
|
+
```
|
37
|
+
|
38
|
+
Then import a standard CloudFormation template into lono. The `--name` option is used to name the template `autoscaling`.
|
39
|
+
|
40
|
+
```
|
41
|
+
$ lono import https://s3-us-west-2.amazonaws.com/cloudformation-templates-us-west-2/AutoScalingMultiAZWithNotifications.template --name autoscaling
|
42
|
+
=> Imported CloudFormation template and lono-fied it.
|
43
|
+
Template definition added to app/definitions/base.rb
|
44
|
+
Params file created to config/params/base/autoscaling.txt
|
45
|
+
Template downloaded to app/templates/autoscaling.yml
|
46
|
+
=> CloudFormation Template Summary:
|
47
|
+
Parameters:
|
48
|
+
Required:
|
49
|
+
VpcId (AWS::EC2::VPC::Id)
|
50
|
+
Subnets (List<AWS::EC2::Subnet::Id>)
|
51
|
+
OperatorEMail (String)
|
52
|
+
KeyName (AWS::EC2::KeyPair::KeyName)
|
53
|
+
Optional:
|
54
|
+
InstanceType (String) Default: t2.small
|
55
|
+
SSHLocation (String) Default: 0.0.0.0/0
|
56
|
+
Resources:
|
57
|
+
2 AWS::AutoScaling::ScalingPolicy
|
58
|
+
2 AWS::CloudWatch::Alarm
|
59
|
+
1 AWS::AutoScaling::LaunchConfiguration
|
60
|
+
1 AWS::ElasticLoadBalancingV2::LoadBalancer
|
61
|
+
1 AWS::ElasticLoadBalancingV2::Listener
|
62
|
+
1 AWS::ElasticLoadBalancingV2::TargetGroup
|
63
|
+
1 AWS::SNS::Topic
|
64
|
+
1 AWS::EC2::SecurityGroup
|
65
|
+
1 AWS::AutoScaling::AutoScalingGroup
|
66
|
+
9 Total
|
67
|
+
Here are contents of the params config/params/base/autoscaling.txt file:
|
68
|
+
VpcId=
|
69
|
+
Subnets=
|
70
|
+
OperatorEMail=
|
71
|
+
KeyName=
|
72
|
+
#InstanceType= # optional
|
73
|
+
#SSHLocation= # optional
|
74
|
+
$
|
75
|
+
```
|
76
|
+
|
77
|
+
The template was imported from [CloudFormation Auto Scaling Samples](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/sample-templates-services-us-west-2.html#w2ab2c23c48c13b7).
|
78
|
+
|
79
|
+
A starter `config/params/base/autoscaling.txt` was generated with required parameters emptied and optional parameters commented out. Fill in the required parameters.
|
80
|
+
|
81
|
+
### Filling in the Parameters
|
82
|
+
|
83
|
+
You can use the following commands to grab the default VPC and a subnet, and set the values needed for the parameters:
|
84
|
+
|
85
|
+
```
|
86
|
+
VPC=$(aws ec2 describe-vpcs | jq -r '.Vpcs[] | select(.IsDefault == true) | .VpcId')
|
87
|
+
SUBNETS=$(aws ec2 describe-subnets | jq -r '.Subnets[].SubnetId' | tr -s '\n' ',' | sed 's/,*$//g')
|
88
|
+
EMAIL=email@domain.com
|
89
|
+
KEY_NAME=default
|
90
|
+
```
|
91
|
+
|
92
|
+
Now update the required parameters:
|
93
|
+
|
94
|
+
```
|
95
|
+
sed "s/VpcId=/VpcId=$VPC/; s/Subnets=/Subnets=$SUBNETS/; s/OperatorEMail=/OperatorEMail=$EMAIL/; s/KeyName=/KeyName=$KEY_NAME/;" config/params/base/autoscaling.txt > config/params/base/autoscaling.txt.1
|
96
|
+
mv config/params/base/autoscaling.txt{.1,}
|
97
|
+
```
|
98
|
+
|
99
|
+
Now launch the stack:
|
100
|
+
|
101
|
+
```
|
102
|
+
lono cfn create autoscaling
|
103
|
+
```
|
104
|
+
|
105
|
+
## Commands Summarized
|
106
|
+
|
107
|
+
```sh
|
108
|
+
lono new autoscaling
|
109
|
+
cd autoscaling
|
110
|
+
lono import https://s3-us-west-2.amazonaws.com/cloudformation-templates-us-west-2/AutoScalingMultiAZWithNotifications.template --name autoscaling
|
111
|
+
VPC=$(aws ec2 describe-vpcs | jq -r '.Vpcs[] | select(.IsDefault == true) | .VpcId')
|
112
|
+
SUBNETS=$(aws ec2 describe-subnets | jq -r '.Subnets[].SubnetId' | tr -s '\n' ',' | sed 's/,*$//g')
|
113
|
+
EMAIL=email@domain.com
|
114
|
+
KEY_NAME=default
|
115
|
+
sed "s/VpcId=/VpcId=$VPC/; s/Subnets=/Subnets=$SUBNETS/; s/OperatorEMail=/OperatorEMail=$EMAIL/; s/KeyName=/KeyName=$KEY_NAME/;" config/params/base/autoscaling.txt > config/params/base/autoscaling.txt.1
|
116
|
+
mv config/params/base/autoscaling.txt{.1,}
|
117
|
+
lono cfn create autoscaling --template autoscaling
|
118
|
+
```
|