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/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
|
+
```
|