lono 1.1.3 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
@@ -0,0 +1,34 @@
|
|
1
|
+
class Lono::Cfn::Create < Lono::Cfn::Base
|
2
|
+
# save_stack is the interface method
|
3
|
+
def save_stack(params)
|
4
|
+
create_stack(params)
|
5
|
+
end
|
6
|
+
|
7
|
+
# aws cloudformation create-stack --stack-name prod-hi-123456789 --parameters file://output/params/prod-hi-123456789.json --template-body file://output/prod-hi.json
|
8
|
+
def create_stack(params)
|
9
|
+
message = "Creating #{@stack_name} stack."
|
10
|
+
if @options[:noop]
|
11
|
+
puts "NOOP #{message}"
|
12
|
+
return
|
13
|
+
end
|
14
|
+
|
15
|
+
if stack_exists?(@stack_name)
|
16
|
+
puts "Cannot create '#{@stack_name}' stack because it already exists."
|
17
|
+
return
|
18
|
+
end
|
19
|
+
|
20
|
+
unless File.exist?(@template_path)
|
21
|
+
puts "Cannot create '#{@stack_name}' template not found: #{@template_path}."
|
22
|
+
return
|
23
|
+
end
|
24
|
+
|
25
|
+
template_body = IO.read(@template_path)
|
26
|
+
cfn.create_stack(
|
27
|
+
stack_name: @stack_name,
|
28
|
+
template_body: template_body,
|
29
|
+
parameters: params#,
|
30
|
+
# capabilities: ["CAPABILITY_IAM"]
|
31
|
+
)
|
32
|
+
puts message unless @options[:mute]
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
class Lono::Cfn::Delete
|
2
|
+
include Lono::Cfn::AwsServices
|
3
|
+
include Lono::Cfn::Util
|
4
|
+
|
5
|
+
def initialize(stack_name, options={})
|
6
|
+
@stack_name = stack_name
|
7
|
+
@options = options
|
8
|
+
@project_root = options[:project_root] || '.'
|
9
|
+
end
|
10
|
+
|
11
|
+
def run
|
12
|
+
message = "Deleted #{@stack_name} stack."
|
13
|
+
if @options[:noop]
|
14
|
+
puts "NOOP #{message}"
|
15
|
+
else
|
16
|
+
are_you_sure?(:delete)
|
17
|
+
|
18
|
+
if stack_exists?(@stack_name)
|
19
|
+
cfn.delete_stack(stack_name: @stack_name)
|
20
|
+
puts message
|
21
|
+
else
|
22
|
+
puts "#{@stack_name.inspect} stack does not exist".colorize(:red)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
class Lono::Cfn::Diff < Lono::Cfn::Base
|
2
|
+
include Lono::Cfn::AwsServices
|
3
|
+
|
4
|
+
def run
|
5
|
+
if @options[:noop]
|
6
|
+
puts "NOOP Generating CloudFormation source code diff..."
|
7
|
+
else
|
8
|
+
generate_all # from Base superclass. Generates the output lono teplates
|
9
|
+
puts "Generating CloudFormation source code diff..."
|
10
|
+
download_existing_cfn_template
|
11
|
+
show_changes
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def download_existing_cfn_template
|
16
|
+
resp = cfn.get_template(
|
17
|
+
stack_name: @stack_name,
|
18
|
+
template_stage: "Original"
|
19
|
+
)
|
20
|
+
resp.template_body
|
21
|
+
IO.write(existing_template_path, resp.template_body)
|
22
|
+
end
|
23
|
+
|
24
|
+
def show_changes
|
25
|
+
command = "#{diff_viewer} #{existing_template_path} #{new_cfn_template}"
|
26
|
+
puts "Running: #{command}"
|
27
|
+
system(command)
|
28
|
+
end
|
29
|
+
|
30
|
+
# for clarity
|
31
|
+
def new_cfn_template
|
32
|
+
@template_path
|
33
|
+
end
|
34
|
+
|
35
|
+
def diff_viewer
|
36
|
+
return ENV['LONO_CFN_DIFF'] if ENV['LONO_CFN_DIFF']
|
37
|
+
system("type colordiff > /dev/null") ? "colordiff" : "diff"
|
38
|
+
end
|
39
|
+
|
40
|
+
def existing_template_path
|
41
|
+
"/tmp/existing_cfn_template.json"
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,93 @@
|
|
1
|
+
class Lono::Cfn::Help
|
2
|
+
class << self
|
3
|
+
def create
|
4
|
+
<<-EOL
|
5
|
+
Examples:
|
6
|
+
|
7
|
+
Provided that you are in a lono project and have a `my-stack` lono template definition. To create a stack you can simply run:
|
8
|
+
|
9
|
+
$ lono cfn create my-stack
|
10
|
+
|
11
|
+
The above command will generate and use the template in output/my-stack.json and parameters in params/my-stack.txt. The template by convention defaults to the name of the stack. In turn, the params by convention defaults to the name of the template.
|
12
|
+
|
13
|
+
Here are examples of overriding the template and params name conventions.
|
14
|
+
|
15
|
+
$ lono cfn create my-stack --template different-name1
|
16
|
+
|
17
|
+
The template that will be use is output/different-name1.json and the parameters will use params/different-name1.json.
|
18
|
+
|
19
|
+
$ lono cfn create my-stack --params different-name2
|
20
|
+
|
21
|
+
The template that will be use is output/different-name2.json and the parameters will use params/different-name2.json.
|
22
|
+
|
23
|
+
$ lono cfn create my-stack --template different-name3 --params different-name4
|
24
|
+
|
25
|
+
The template that will be use is output/different-name3.json and the parameters will use params/different-name4.json.
|
26
|
+
|
27
|
+
EOL
|
28
|
+
end
|
29
|
+
|
30
|
+
def update
|
31
|
+
<<-EOL
|
32
|
+
Examples:
|
33
|
+
|
34
|
+
Provided that you are in a lono project and have a `my-stack` lono template definition. To update a stack you can simply run:
|
35
|
+
|
36
|
+
$ lono cfn update my-stack
|
37
|
+
|
38
|
+
The above command will generate and use the template in output/my-stack.json and parameters in params/my-stack.txt. The template by convention defaults to the name of the stack. In turn, the params by convention defaults to the name of the template.
|
39
|
+
|
40
|
+
Here are examples of overriding the template and params name conventions.
|
41
|
+
|
42
|
+
$ lono cfn update my-stack --template different-name1
|
43
|
+
|
44
|
+
The template that will be use is output/different-name1.json and the parameters will use params/different-name1.json.
|
45
|
+
|
46
|
+
$ lono cfn update my-stack --params different-name2
|
47
|
+
|
48
|
+
The template that will be use is output/different-name2.json and the parameters will use params/different-name2.json.
|
49
|
+
|
50
|
+
$ lono cfn update my-stack --template different-name3 --params different-name4
|
51
|
+
|
52
|
+
The template that will be use is output/different-name3.json and the parameters will use params/different-name4.json.
|
53
|
+
|
54
|
+
EOL
|
55
|
+
end
|
56
|
+
|
57
|
+
def delete
|
58
|
+
<<-EOL
|
59
|
+
Examples:
|
60
|
+
|
61
|
+
$ lono cfn delete my-stack
|
62
|
+
|
63
|
+
The above command will delete my-stack.
|
64
|
+
EOL
|
65
|
+
end
|
66
|
+
|
67
|
+
def preview
|
68
|
+
<<-EOL
|
69
|
+
Generates a CloudFormation preview. This is similar to a `terraform plan` or puppet's dry-run mode.
|
70
|
+
|
71
|
+
Example output:
|
72
|
+
|
73
|
+
CloudFormation preview for 'example' stack update. Changes:
|
74
|
+
|
75
|
+
Remove AWS::Route53::RecordSet: DnsRecord testsubdomain.sub.tongueroo.com
|
76
|
+
|
77
|
+
Examples:
|
78
|
+
|
79
|
+
$ lono cfn preview my-stack
|
80
|
+
EOL
|
81
|
+
end
|
82
|
+
|
83
|
+
def diff
|
84
|
+
<<-EOL
|
85
|
+
Displays code diff of the generated CloudFormation template locally vs the existing template on AWS. You can set a desired diff viewer by setting the LONO_CFN_DIFF environment variable.
|
86
|
+
|
87
|
+
Examples:
|
88
|
+
|
89
|
+
$ lono cfn diff my-stack
|
90
|
+
EOL
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
@@ -0,0 +1,133 @@
|
|
1
|
+
class Lono::Cfn::Preview < Lono::Cfn::Base
|
2
|
+
# Override run from Base superclass, the run method is different enough with Preview
|
3
|
+
def run
|
4
|
+
if @options[:noop]
|
5
|
+
puts "NOOP CloudFormation preview for #{@stack_name} update"
|
6
|
+
else
|
7
|
+
params = generate_all
|
8
|
+
preview_change_set(params)
|
9
|
+
delete_change_set unless @options[:keep] # Clean up and delete the change set
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def preview_change_set(params)
|
14
|
+
create_change_set(params)
|
15
|
+
display_change_set
|
16
|
+
end
|
17
|
+
|
18
|
+
def create_change_set(params)
|
19
|
+
unless stack_exists?(@stack_name)
|
20
|
+
puts "Cannot create a change set for the stack because the #{@stack_name} does not exists."
|
21
|
+
return
|
22
|
+
end
|
23
|
+
exist_unless_updatable(stack_status(@stack_name))
|
24
|
+
|
25
|
+
template_body = IO.read(@template_path)
|
26
|
+
# begin
|
27
|
+
cfn.create_change_set(
|
28
|
+
change_set_name: change_set_name,
|
29
|
+
stack_name: @stack_name,
|
30
|
+
template_body: template_body,
|
31
|
+
parameters: params
|
32
|
+
)
|
33
|
+
# rescue Aws::CloudFormation::Errors::ValidationError => e
|
34
|
+
# if e.message =~ /^Parameters: /
|
35
|
+
# puts "Error creating CloudFormation preview because invalid CloudFormation parameters. Full error message:".colorize(:red)
|
36
|
+
# puts e.message
|
37
|
+
# quit(1)
|
38
|
+
# else
|
39
|
+
# raise
|
40
|
+
# end
|
41
|
+
# end
|
42
|
+
end
|
43
|
+
|
44
|
+
def display_change_set
|
45
|
+
print "Generating CloudFormation Change Set for preview.."
|
46
|
+
change_set = describe_change_set
|
47
|
+
until change_set_finished?(change_set) do
|
48
|
+
change_set = describe_change_set
|
49
|
+
sleep 1
|
50
|
+
print '.'
|
51
|
+
end
|
52
|
+
puts
|
53
|
+
|
54
|
+
case change_set.status
|
55
|
+
when "CREATE_COMPLETE"
|
56
|
+
puts "CloudFormation preview for '#{@stack_name}' stack update. Changes:"
|
57
|
+
change_set.changes.each do |change|
|
58
|
+
display_change(change)
|
59
|
+
end
|
60
|
+
when "FAILED"
|
61
|
+
puts "Fail to create a CloudFormation preview for '#{@stack_name}' stack update. Reason:".colorize(:red)
|
62
|
+
puts change_set.status_reason
|
63
|
+
quit(1)
|
64
|
+
else
|
65
|
+
raise "hell: never come here"
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def delete_change_set
|
70
|
+
cfn.delete_change_set(
|
71
|
+
change_set_name: change_set_name,
|
72
|
+
stack_name: @stack_name
|
73
|
+
)
|
74
|
+
end
|
75
|
+
|
76
|
+
def execute_change_set
|
77
|
+
cfn.execute_change_set(
|
78
|
+
change_set_name: change_set_name,
|
79
|
+
stack_name: @stack_name
|
80
|
+
)
|
81
|
+
end
|
82
|
+
|
83
|
+
# generates a change set name
|
84
|
+
def change_set_name
|
85
|
+
@change_set_name ||= "changeset-#{Time.now.strftime("%Y%d%m%H%M%S")}"
|
86
|
+
end
|
87
|
+
|
88
|
+
private
|
89
|
+
# Private: formats a Aws::CloudFormation::Types::Change in pretty human readable form
|
90
|
+
#
|
91
|
+
# change - Aws::CloudFormation::Types::Change
|
92
|
+
#
|
93
|
+
# Examples
|
94
|
+
#
|
95
|
+
# display_change(change)
|
96
|
+
# => Remove AWS::Route53::RecordSet: DnsRecord testsubdomain.sub.tongueroo.com
|
97
|
+
#
|
98
|
+
# Returns nil
|
99
|
+
#
|
100
|
+
# change.to_h
|
101
|
+
# {:type=>"Resource",
|
102
|
+
# :resource_change=>
|
103
|
+
# {:action=>"Remove",
|
104
|
+
# :logical_resource_id=>"DnsRecord",
|
105
|
+
# :physical_resource_id=>"testsubdomain.sub.tongueroo.com",
|
106
|
+
# :resource_type=>"AWS::Route53::RecordSet",
|
107
|
+
# :scope=>[],
|
108
|
+
# :details=>[]}}
|
109
|
+
def display_change(change)
|
110
|
+
message = if change.type == "Resource"
|
111
|
+
c = change.resource_change
|
112
|
+
"#{c.action} #{c.resource_type}: #{c.logical_resource_id} #{c.physical_resource_id}"
|
113
|
+
else
|
114
|
+
change.to_h
|
115
|
+
end
|
116
|
+
|
117
|
+
colors = { Remove: :red, Add: :green, Modify: :yellow }
|
118
|
+
action = change.resource_change.action.to_sym
|
119
|
+
message = message.colorize(colors[action]) if colors.has_key?(action)
|
120
|
+
puts message
|
121
|
+
end
|
122
|
+
|
123
|
+
def change_set_finished?(change_set)
|
124
|
+
change_set.status =~ /_COMPLETE/ || change_set.status == "FAILED"
|
125
|
+
end
|
126
|
+
|
127
|
+
def describe_change_set
|
128
|
+
cfn.describe_change_set(
|
129
|
+
change_set_name: change_set_name,
|
130
|
+
stack_name: @stack_name
|
131
|
+
)
|
132
|
+
end
|
133
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
class Lono::Cfn::Update < Lono::Cfn::Base
|
2
|
+
# save_stack is the interface method
|
3
|
+
def save_stack(params)
|
4
|
+
update_stack(params)
|
5
|
+
end
|
6
|
+
|
7
|
+
# aws cloudformation update-stack --stack-name prod-hi-123456789 --parameters file://output/params/prod-hi-123456789.json --template-body file://output/prod-hi.json
|
8
|
+
def update_stack(params)
|
9
|
+
message = "Updating #{@stack_name} stack"
|
10
|
+
if @options[:noop]
|
11
|
+
puts "NOOP #{message}"
|
12
|
+
return
|
13
|
+
end
|
14
|
+
|
15
|
+
unless stack_exists?(@stack_name)
|
16
|
+
puts "Cannot update a stack because the #{@stack_name} does not exists."
|
17
|
+
return
|
18
|
+
end
|
19
|
+
exist_unless_updatable(stack_status(@stack_name))
|
20
|
+
|
21
|
+
error = nil
|
22
|
+
diff.run if @options[:diff]
|
23
|
+
preview.run if @options[:preview]
|
24
|
+
are_you_sure?(:update)
|
25
|
+
|
26
|
+
if @options[:change_set] # defaults to this
|
27
|
+
message << " via change set: #{preview.change_set_name}"
|
28
|
+
change_set_update
|
29
|
+
else
|
30
|
+
standard_update(params)
|
31
|
+
end
|
32
|
+
puts message unless @options[:mute] || error
|
33
|
+
end
|
34
|
+
|
35
|
+
def standard_update(params)
|
36
|
+
template_body = IO.read(@template_path)
|
37
|
+
begin
|
38
|
+
cfn.update_stack(
|
39
|
+
stack_name: @stack_name,
|
40
|
+
template_body: template_body,
|
41
|
+
parameters: params#,
|
42
|
+
# capabilities: ["CAPABILITY_IAM"]
|
43
|
+
)
|
44
|
+
rescue Aws::CloudFormation::Errors::ValidationError => e
|
45
|
+
puts "ERROR: #{e.message}".red
|
46
|
+
error = true
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def preview
|
51
|
+
options = @options.merge(lono: false, mute_params: true, mute_using: true, keep: true)
|
52
|
+
@preview ||= Preview.new(@stack_name, options)
|
53
|
+
end
|
54
|
+
|
55
|
+
def diff
|
56
|
+
@diff ||= Diff.new(@stack_name, @options.merge(lono: false, mute_params: true, mute_using: true))
|
57
|
+
end
|
58
|
+
|
59
|
+
def change_set_update
|
60
|
+
preview.execute_change_set
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Lono::Cfn::Util
|
2
|
+
def are_you_sure?(action)
|
3
|
+
if @options[:sure]
|
4
|
+
sure = 'y'
|
5
|
+
else
|
6
|
+
message = case action
|
7
|
+
when :update
|
8
|
+
"Are you sure you want to want to update the stack with the changes? (y/N)"
|
9
|
+
when :delete
|
10
|
+
"Are you sure you want to want to delete the stack with the changes? (y/N)"
|
11
|
+
end
|
12
|
+
puts message
|
13
|
+
sure = $stdin.gets
|
14
|
+
end
|
15
|
+
|
16
|
+
unless sure =~ /^y/
|
17
|
+
puts "Exiting without #{action}"
|
18
|
+
exit 0
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/lib/lono/cli.rb
CHANGED
@@ -1,8 +1,10 @@
|
|
1
1
|
require 'thor'
|
2
|
-
require 'lono/
|
2
|
+
require 'lono/command'
|
3
3
|
|
4
4
|
module Lono
|
5
|
-
|
5
|
+
autoload :Help, 'lono/help'
|
6
|
+
|
7
|
+
class CLI < Command
|
6
8
|
|
7
9
|
desc "new [NAME]", "Generates lono starter project"
|
8
10
|
Help.new_long_desc
|
@@ -13,20 +15,16 @@ module Lono
|
|
13
15
|
Lono::New.new(options.clone.merge(project_root: project_root)).run
|
14
16
|
end
|
15
17
|
|
16
|
-
desc "generate", "Generate
|
18
|
+
desc "generate", "Generate both CloudFormation templates and parameters files"
|
17
19
|
Help.generate
|
18
20
|
option :clean, type: :boolean, aliases: "-c", desc: "remove all output files before generating"
|
19
21
|
option :project_root, default: ".", aliases: "-r", desc: "project root"
|
20
22
|
option :quiet, type: :boolean, aliases: "-q", desc: "silence the output"
|
21
23
|
option :pretty, type: :boolean, default: true, desc: "json pretty the output. only applies with json format"
|
22
24
|
def generate
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
desc "bashify [URL-OR-PATH]", "Convert the UserData section of an existing CloudFormation Template to a starter bash script that is compatiable with lono"
|
27
|
-
Help.bashify
|
28
|
-
def bashify(path)
|
29
|
-
Lono::Bashify.new(path: path).run
|
25
|
+
puts "Generating both CloudFormation template and parameter files."
|
26
|
+
Lono::Template::DSL.new(options.clone).run
|
27
|
+
Lono::Param::Generator.generate_all(options.clone)
|
30
28
|
end
|
31
29
|
|
32
30
|
desc "version", "Prints version"
|
@@ -34,5 +32,16 @@ module Lono
|
|
34
32
|
puts Lono::VERSION
|
35
33
|
end
|
36
34
|
|
35
|
+
desc "template ACTION", "template subcommand tasks"
|
36
|
+
long_desc Help.template
|
37
|
+
subcommand "template", Template
|
38
|
+
|
39
|
+
desc "cfn ACTION", "cfn subcommand tasks"
|
40
|
+
long_desc Help.cfn
|
41
|
+
subcommand "cfn", Cfn
|
42
|
+
|
43
|
+
desc "param ACTION", "param subcommand tasks"
|
44
|
+
long_desc Help.param
|
45
|
+
subcommand "param", Lono::Param
|
37
46
|
end
|
38
47
|
end
|