lono 4.2.1 → 4.2.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +3 -0
- data/lib/lono/version.rb +1 -1
- data/lono.gemspec +5 -3
- metadata +3 -79
- data/spec/fixtures/cfn.json +0 -369
- data/spec/fixtures/cfn/stack-events-complete.json +0 -1080
- data/spec/fixtures/cfn/stack-events-in-progress.json +0 -1080
- data/spec/fixtures/cfn/stack-events-update-rollback-complete.json +0 -1086
- data/spec/fixtures/lono_project/.gitignore +0 -1
- data/spec/fixtures/lono_project/Gemfile +0 -3
- data/spec/fixtures/lono_project/Guardfile +0 -12
- data/spec/fixtures/lono_project/app/definitions/base.rb +0 -10
- data/spec/fixtures/lono_project/app/definitions/base/more.rb +0 -7
- data/spec/fixtures/lono_project/app/definitions/development.rb +0 -1
- data/spec/fixtures/lono_project/app/definitions/production.rb +0 -1
- data/spec/fixtures/lono_project/app/helpers/custom_helper.rb +0 -5
- data/spec/fixtures/lono_project/app/partials/security_group.yml +0 -10
- data/spec/fixtures/lono_project/app/partials/user_data/bootstrap.sh +0 -11
- data/spec/fixtures/lono_project/app/templates/example.yml +0 -50
- data/spec/fixtures/lono_project/config/params/base/example.txt +0 -3
- data/spec/fixtures/lono_project/config/params/development/example.txt +0 -1
- data/spec/fixtures/lono_project/config/params/production/example.txt +0 -1
- data/spec/fixtures/lono_project/config/settings.yml +0 -31
- data/spec/fixtures/lono_project/config/variables/base.rb +0 -3
- data/spec/fixtures/lono_project/config/variables/development.rb +0 -1
- data/spec/fixtures/lono_project/config/variables/production.rb +0 -1
- data/spec/fixtures/params/baseonly/params/base/network.txt +0 -1
- data/spec/fixtures/params/envonly/params/development/network.txt +0 -1
- data/spec/fixtures/params/overlay/params/base/network.txt +0 -1
- data/spec/fixtures/params/overlay/params/development/network.txt +0 -1
- data/spec/fixtures/raw_templates/aws-waf-security-automations.template +0 -1575
- data/spec/lib/lono/cfn/status_spec.rb +0 -77
- data/spec/lib/lono/cfn_spec.rb +0 -38
- data/spec/lib/lono/cli_spec.rb +0 -44
- data/spec/lib/lono/completion_spec.rb +0 -17
- data/spec/lib/lono/inspect_spec.rb +0 -11
- data/spec/lib/lono/param/generator_spec.rb +0 -56
- data/spec/lib/lono/param_spec.rb +0 -13
- data/spec/lib/lono/setting_spec.rb +0 -47
- data/spec/lib/lono/template/dsl_spec.rb +0 -59
- data/spec/lib/lono/template_spec.rb +0 -21
- data/spec/spec_helper.rb +0 -62
@@ -1,77 +0,0 @@
|
|
1
|
-
describe Lono::Cfn::Status do
|
2
|
-
let(:status) do
|
3
|
-
status = Lono::Cfn::Status.new("test-stack")
|
4
|
-
allow(status).to receive(:cfn).and_return(cfn)
|
5
|
-
status
|
6
|
-
end
|
7
|
-
let(:cfn) do
|
8
|
-
service = double("service").as_null_object
|
9
|
-
allow(service).to receive(:describe_stacks).and_return(stack_status)
|
10
|
-
allow(service).to receive(:describe_stack_events).and_return(stack_events)
|
11
|
-
service
|
12
|
-
end
|
13
|
-
|
14
|
-
context "in progress" do
|
15
|
-
let(:stack_status) { "UPDATE_IN_PROGRESS" }
|
16
|
-
let(:stack_events) { JSON.load(IO.read("spec/fixtures/cfn/stack-events-in-progress.json")) }
|
17
|
-
it "lists events since user initiated event" do
|
18
|
-
status.refresh_events
|
19
|
-
i = status.find_index(:start)
|
20
|
-
expect(i).to eq 15
|
21
|
-
# uncomment to view and debug
|
22
|
-
# status.show_events
|
23
|
-
# puts "****"
|
24
|
-
# status.show_events # show not show anything
|
25
|
-
end
|
26
|
-
|
27
|
-
it "lists events since last shown event" do
|
28
|
-
# first display
|
29
|
-
status.refresh_events
|
30
|
-
i = status.find_index(:start)
|
31
|
-
expect(i).to eq 15
|
32
|
-
|
33
|
-
# move the last event back in time 4 events, so should print 3 events
|
34
|
-
status.instance_variable_set(:@last_shown_event_id, "TargetGroup-ec634c43-b887-4bde-a525-7c69782865a6")
|
35
|
-
|
36
|
-
captured_events = []
|
37
|
-
allow(status).to receive(:print_event) do |e|
|
38
|
-
captured_events << "#{e["resource_type"]} #{e["resource_status"]}"
|
39
|
-
end
|
40
|
-
status.show_events
|
41
|
-
expect(captured_events).to eq([
|
42
|
-
"AWS::ElasticLoadBalancingV2::LoadBalancer DELETE_IN_PROGRESS",
|
43
|
-
"AWS::ElasticLoadBalancingV2::LoadBalancer DELETE_COMPLETE",
|
44
|
-
"AWS::EC2::SecurityGroup DELETE_IN_PROGRESS",
|
45
|
-
])
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
context "complete" do
|
50
|
-
let(:stack_status) { "UPDATE_COMPLETE" }
|
51
|
-
let(:stack_events) { JSON.load(IO.read("spec/fixtures/cfn/stack-events-complete.json")) }
|
52
|
-
it "lists events all the way to completion" do
|
53
|
-
status.refresh_events
|
54
|
-
i = status.find_index(:start)
|
55
|
-
expect(i).to eq 17
|
56
|
-
# uncomment to view and debug
|
57
|
-
# status.show_events
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
context "update_rollback" do
|
62
|
-
let(:stack_status) { "UPDATE_ROLLBACK_COMPLETE" }
|
63
|
-
let(:stack_events) { JSON.load(IO.read("spec/fixtures/cfn/stack-events-update-rollback-complete.json")) }
|
64
|
-
it "lists events all the way to update rollback complete" do
|
65
|
-
status.refresh_events
|
66
|
-
expect(status.success?).to be false
|
67
|
-
expect(status.update_rollback?).to be true
|
68
|
-
expect(status.rollback_error_message).to include("STATIC_NAME")
|
69
|
-
|
70
|
-
# i = status.find_index(:start)
|
71
|
-
# expect(i).to eq 17
|
72
|
-
# uncomment to view and debug
|
73
|
-
# status.show_events
|
74
|
-
end
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
data/spec/lib/lono/cfn_spec.rb
DELETED
@@ -1,38 +0,0 @@
|
|
1
|
-
describe Lono::Cfn do
|
2
|
-
before(:all) do
|
3
|
-
@args = "--noop"
|
4
|
-
end
|
5
|
-
|
6
|
-
describe "lono cfn" do
|
7
|
-
it "create stack" do
|
8
|
-
out = execute("#{@env} exe/lono cfn create example #{@args}")
|
9
|
-
expect(out).to include("Creating")
|
10
|
-
end
|
11
|
-
|
12
|
-
it "update stack" do
|
13
|
-
out = execute("#{@env} exe/lono cfn update example #{@args}")
|
14
|
-
expect(out).to include("Updating")
|
15
|
-
end
|
16
|
-
|
17
|
-
it "delete stack" do
|
18
|
-
out = execute("#{@env} exe/lono cfn delete example #{@args}")
|
19
|
-
expect(out).to include("Deleted")
|
20
|
-
end
|
21
|
-
|
22
|
-
it "preview stack" do
|
23
|
-
out = execute("#{@env} exe/lono cfn preview example #{@args}")
|
24
|
-
expect(out).to include("CloudFormation preview")
|
25
|
-
end
|
26
|
-
|
27
|
-
it "diff stack" do
|
28
|
-
out = execute("#{@env} exe/lono cfn diff example #{@args}")
|
29
|
-
expect(out).to include("diff")
|
30
|
-
end
|
31
|
-
|
32
|
-
it "download stack" do
|
33
|
-
out = execute("#{@env} exe/lono cfn download example #{@args}")
|
34
|
-
expect(out).to include("Download")
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
data/spec/lib/lono/cli_spec.rb
DELETED
@@ -1,44 +0,0 @@
|
|
1
|
-
describe Lono::CLI do
|
2
|
-
context "general" do
|
3
|
-
it "new generate new project" do
|
4
|
-
# using another name for the lono project because we call
|
5
|
-
# exe/lono new lono_project for all specs via the RSpec.config already
|
6
|
-
# NOTE: LONO_ROOT modified in the spec_helper.rb
|
7
|
-
execute("exe/lono new test_project --no-bundle")
|
8
|
-
exist = File.exist?("tmp/test_project/config/settings.yml")
|
9
|
-
expect(exist).to be true
|
10
|
-
FileUtils.rm_rf("tmp/test_project")
|
11
|
-
end
|
12
|
-
|
13
|
-
it "import should download template" do
|
14
|
-
out = execute("exe/lono import spec/fixtures/raw_templates/aws-waf-security-automations.template --name waf")
|
15
|
-
expect(out).to match(/=> Imported CloudFormation template/)
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
# Ensure the example starter project is always able to produce output/templates.
|
20
|
-
context "project generated from lono new command" do
|
21
|
-
before(:all) do
|
22
|
-
# hack to so we don't have to change LONO_ROOT
|
23
|
-
@project = ENV['LONO_ROOT']
|
24
|
-
FileUtils.mv(@project, "#{@project}.temp") if File.exist?(@project)
|
25
|
-
end
|
26
|
-
after(:all) do
|
27
|
-
FileUtils.rm_rf(@project)
|
28
|
-
# move temp back for the rest of the tests
|
29
|
-
FileUtils.mv("#{@project}.temp", @project) if File.exist?("#{@project}.temp")
|
30
|
-
end
|
31
|
-
|
32
|
-
it "generate should build templates" do
|
33
|
-
# NOTE: LONO_ROOT modified in the spec_helper.rb
|
34
|
-
execute("exe/lono new lono_project --no-bundle")
|
35
|
-
execute("exe/lono generate")
|
36
|
-
success = $?.exitstatus == 0
|
37
|
-
expect(success).to be true
|
38
|
-
|
39
|
-
exist = File.exist?("#{Lono.root}/config/settings.yml")
|
40
|
-
expect(exist).to be true
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
@@ -1,17 +0,0 @@
|
|
1
|
-
describe Lono::CLI do
|
2
|
-
describe "lono completion" do
|
3
|
-
commands = {
|
4
|
-
# "new" => "name", # options is the completion because it's a Thor::Group
|
5
|
-
"generate" => "--clean",
|
6
|
-
"cfn" => "create",
|
7
|
-
"cfn create" => "name",
|
8
|
-
"param" => "generate",
|
9
|
-
}
|
10
|
-
commands.each do |command, expected_word|
|
11
|
-
it "#{command}" do
|
12
|
-
out = execute("exe/lono completion #{command}")
|
13
|
-
expect(out).to include(expected_word) # only checking for one word for simplicity
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
@@ -1,11 +0,0 @@
|
|
1
|
-
describe Lono::Inspector do
|
2
|
-
it "lono xgraph" do
|
3
|
-
out = execute("exe/lono xgraph example --noop")
|
4
|
-
expect(out).to include("Generating dependencies tree")
|
5
|
-
end
|
6
|
-
|
7
|
-
it "lono summary" do
|
8
|
-
out = execute("exe/lono summary example")
|
9
|
-
expect(out).to include("Summary")
|
10
|
-
end
|
11
|
-
end
|
@@ -1,56 +0,0 @@
|
|
1
|
-
describe Lono::Param::Generator do
|
2
|
-
context "layering" do
|
3
|
-
def generate(context)
|
4
|
-
path = "spec/fixtures/params/#{context}/params/development/network.txt"
|
5
|
-
param = Lono::Param::Generator.new("network",
|
6
|
-
path: path,
|
7
|
-
mute: true,
|
8
|
-
)
|
9
|
-
json = param.generate
|
10
|
-
data = JSON.load(json)
|
11
|
-
param_value = data.first["ParameterValue"]
|
12
|
-
end
|
13
|
-
|
14
|
-
context "overlay params" do
|
15
|
-
it "should combine params" do
|
16
|
-
param_value = generate("overlay")
|
17
|
-
expect(param_value).to eq "2"
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
context "only base param" do
|
22
|
-
it "should generate prod param from base param" do
|
23
|
-
param_value = generate("baseonly")
|
24
|
-
expect(param_value).to eq "foo"
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
context "only env param" do
|
29
|
-
it "should generate prod param from env param" do
|
30
|
-
param_value = generate("envonly")
|
31
|
-
expect(param_value).to eq "bar"
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
# Load the variables defined in config/variables/* to make available the params/*.txt files
|
37
|
-
#
|
38
|
-
# Example:
|
39
|
-
#
|
40
|
-
# config/variables/base/variables.rb:
|
41
|
-
# @ami = "ami-base-main"
|
42
|
-
#
|
43
|
-
# params/base/example.txt:
|
44
|
-
# Ami=<%= @ami %>
|
45
|
-
#
|
46
|
-
context "shared variables access" do
|
47
|
-
it "should have access to shared variables" do
|
48
|
-
# quickest to write test by shelling out
|
49
|
-
out = execute("exe/lono generate")
|
50
|
-
text = IO.read("#{Lono.root}/output/params/example.json")
|
51
|
-
data = JSON.load(text)
|
52
|
-
param = data.select { |i| i["ParameterKey"] == "Ami" }.first
|
53
|
-
expect(param["ParameterValue"]).to eq "ami-base-main"
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|
data/spec/lib/lono/param_spec.rb
DELETED
@@ -1,47 +0,0 @@
|
|
1
|
-
describe Lono::Param::Generator do
|
2
|
-
let(:setting) do
|
3
|
-
setting = Lono::Setting.new(check_lono_project=false)
|
4
|
-
allow(setting).to receive(:data).and_return(data)
|
5
|
-
setting
|
6
|
-
end
|
7
|
-
context "simple string" do
|
8
|
-
let(:data) do
|
9
|
-
{
|
10
|
-
"s3_folder" => "s3-bucket/simple/string/example"
|
11
|
-
}
|
12
|
-
end
|
13
|
-
it "should return simple string value" do
|
14
|
-
value = setting.s3_folder
|
15
|
-
expect(value).to eq "s3-bucket/simple/string/example"
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
context "options hash" do
|
20
|
-
let(:data) do
|
21
|
-
{
|
22
|
-
"s3_folder" => {
|
23
|
-
"default" => "s3-bucket/default/path",
|
24
|
-
"aws_profile1" => "s3-bucket/aws_profile1/path",
|
25
|
-
}
|
26
|
-
}
|
27
|
-
end
|
28
|
-
it "should return default value when AWS_PROFILE not set" do
|
29
|
-
saved = ENV['AWS_PROFILE']
|
30
|
-
|
31
|
-
value = setting.s3_folder
|
32
|
-
expect(value).to eq "s3-bucket/default/path"
|
33
|
-
|
34
|
-
ENV['AWS_PROFILE'] = saved
|
35
|
-
end
|
36
|
-
|
37
|
-
it "should return AWS_PROFILE value when AWS_PROFILE set" do
|
38
|
-
saved = ENV['AWS_PROFILE']
|
39
|
-
ENV['AWS_PROFILE'] = "aws_profile1"
|
40
|
-
|
41
|
-
value = setting.s3_folder
|
42
|
-
expect(value).to eq "s3-bucket/aws_profile1/path"
|
43
|
-
|
44
|
-
ENV['AWS_PROFILE'] = saved
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
@@ -1,59 +0,0 @@
|
|
1
|
-
describe Lono::Template::DSL do
|
2
|
-
context "tmp/lono_project" do
|
3
|
-
it "#evaluate_templates" do
|
4
|
-
dsl = Lono::Template::DSL.new(
|
5
|
-
quiet: true
|
6
|
-
)
|
7
|
-
dsl.evaluate_templates
|
8
|
-
templates = dsl.instance_variable_get(:@templates)
|
9
|
-
template_names = templates.map { |h| h[:name] }
|
10
|
-
expect(template_names).to include("example")
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
context "lono generate" do
|
15
|
-
before(:each) do
|
16
|
-
dsl = Lono::Template::DSL.new(quiet: true)
|
17
|
-
dsl.run
|
18
|
-
end
|
19
|
-
|
20
|
-
it "should generate cloudformation template" do
|
21
|
-
template = YAML.load_file("#{Lono.root}/output/templates/example.yml")
|
22
|
-
expect(template['Description']).to include "AWS CloudFormation Sample Template"
|
23
|
-
end
|
24
|
-
|
25
|
-
# <%= partial("security_group", desc: "whatever", port: 22)
|
26
|
-
it "partial local variables become instance variables in partial view" do
|
27
|
-
template = YAML.load_file("#{Lono.root}/output/templates/example.yml")
|
28
|
-
desc = template['Resources']['InstanceSecurityGroup']['Properties']['GroupDescription']
|
29
|
-
expect(desc).to eq 'Enable SSH access via port 22'
|
30
|
-
end
|
31
|
-
|
32
|
-
it "partials should have access to variables" do
|
33
|
-
text = IO.read("#{Lono.root}/output/templates/example.yml")
|
34
|
-
expect(text).to include("override_test=overridden-by-development")
|
35
|
-
end
|
36
|
-
|
37
|
-
it "should have access to custom helpers" do
|
38
|
-
text = IO.read("#{Lono.root}/output/templates/example.yml")
|
39
|
-
expect(text).to include("custom_helper value")
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
context "yaml parse error" do
|
44
|
-
let(:dsl) do
|
45
|
-
Lono::Template::DSL.new(quiet: true)
|
46
|
-
end
|
47
|
-
|
48
|
-
it "show exact line of error code when yaml is invalid" do
|
49
|
-
IO.write("tmp/bad.yml", <<EOL)
|
50
|
-
test: 1
|
51
|
-
foo
|
52
|
-
test
|
53
|
-
EOL
|
54
|
-
out = dsl.validate("tmp/bad.yml")
|
55
|
-
expect(out).to include("2 foo")
|
56
|
-
end
|
57
|
-
|
58
|
-
end
|
59
|
-
end
|
@@ -1,21 +0,0 @@
|
|
1
|
-
describe Lono do
|
2
|
-
describe "bashify" do
|
3
|
-
it "should convert cfn user_data to bash script" do
|
4
|
-
path = "spec/fixtures/cfn.json"
|
5
|
-
out = execute("exe/lono template bashify #{path}")
|
6
|
-
expect(out).to match /bash -lexv/
|
7
|
-
end
|
8
|
-
end
|
9
|
-
|
10
|
-
describe "cli specs" do
|
11
|
-
it "should generate templates" do
|
12
|
-
out = execute("exe/lono template generate --clean")
|
13
|
-
expect(out).to match /Generating CloudFormation templates/
|
14
|
-
end
|
15
|
-
|
16
|
-
it "should upload templates" do
|
17
|
-
out = execute("exe/lono template upload --noop")
|
18
|
-
expect(out).to match /Templates uploaded to s3/
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
data/spec/spec_helper.rb
DELETED
@@ -1,62 +0,0 @@
|
|
1
|
-
ENV['TEST'] = '1'
|
2
|
-
# Ensures aws api never called. Fixture home folder does not contain ~/.aws/credentails
|
3
|
-
ENV['HOME'] = "spec/fixtures/home"
|
4
|
-
# We'll always re-generate a new lono project in tmp. It can be:
|
5
|
-
#
|
6
|
-
# 1. copied from spec/fixtures/lono_project
|
7
|
-
# 2. generated from `lono new`
|
8
|
-
#
|
9
|
-
# This is done because changing LONO_ROOT for specs was a mess.
|
10
|
-
ENV['LONO_ROOT'] = "tmp/lono_project" # this gets kept
|
11
|
-
|
12
|
-
require "pp"
|
13
|
-
require "byebug"
|
14
|
-
|
15
|
-
# require "bundler"
|
16
|
-
# Bundler.require(:development)
|
17
|
-
|
18
|
-
root = File.expand_path("../", File.dirname(__FILE__))
|
19
|
-
require "#{root}/lib/lono"
|
20
|
-
|
21
|
-
module Helper
|
22
|
-
def execute(cmd)
|
23
|
-
puts "Running: #{cmd}" if show_command?
|
24
|
-
out = `#{cmd}`
|
25
|
-
puts out if show_command?
|
26
|
-
out
|
27
|
-
end
|
28
|
-
|
29
|
-
# Added SHOW_COMMAND because DEBUG is also used by other libraries like
|
30
|
-
# bundler and it shows its internal debugging logging also.
|
31
|
-
def show_command?
|
32
|
-
ENV['DEBUG'] || ENV['SHOW_COMMAND']
|
33
|
-
end
|
34
|
-
|
35
|
-
def ensure_tmp_exists
|
36
|
-
FileUtils.mkdir_p("tmp")
|
37
|
-
end
|
38
|
-
|
39
|
-
# Copies spec/fixtures/lono_project to tmp/lono_project,
|
40
|
-
# Main fixture we'll use because it's faster
|
41
|
-
def copy_lono_project
|
42
|
-
destroy_lono_project # just in case KEEP_TMP_PROJECT is used
|
43
|
-
FileUtils.cp_r("spec/fixtures/lono_project", "tmp/lono_project")
|
44
|
-
end
|
45
|
-
|
46
|
-
def destroy_lono_project
|
47
|
-
# Only use KEEP_TMP_PROJECT if you are testing exactly 1 spec for debugging
|
48
|
-
# or it'll affect other tests.
|
49
|
-
FileUtils.rm_rf(Lono.root)
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
RSpec.configure do |c|
|
54
|
-
c.include Helper
|
55
|
-
c.before(:all) do
|
56
|
-
ensure_tmp_exists
|
57
|
-
copy_lono_project
|
58
|
-
end
|
59
|
-
c.after(:all) do
|
60
|
-
destroy_lono_project unless ENV['KEEP_TMP_PROJECT']
|
61
|
-
end
|
62
|
-
end
|