This commit introduces a new option to the core trigger feature: `ruby`. It can be defined to run ruby code when the trigger is configured to fire. If you give the ruby block an env and machine argument, the defined ruby code can use those variables internally.
147 lines
3.6 KiB
Ruby
147 lines
3.6 KiB
Ruby
require File.expand_path("../../../../base", __FILE__)
|
|
|
|
require Vagrant.source_root.join("plugins/kernel_v2/config/vm_trigger")
|
|
|
|
describe VagrantPlugins::Kernel_V2::VagrantConfigTrigger do
|
|
include_context "unit"
|
|
|
|
let(:command) { :up }
|
|
|
|
subject { described_class.new(command) }
|
|
|
|
let(:machine) { double("machine") }
|
|
|
|
def assert_invalid
|
|
errors = subject.validate(machine)
|
|
if !errors.empty? { |v| !v.empty? }
|
|
raise "No errors: #{errors.inspect}"
|
|
end
|
|
end
|
|
|
|
def assert_valid
|
|
errors = subject.validate(machine)
|
|
if !errors.empty? { |v| v.empty? }
|
|
raise "Errors: #{errors.inspect}"
|
|
end
|
|
end
|
|
|
|
before do
|
|
env = double("env")
|
|
allow(env).to receive(:root_path).and_return(nil)
|
|
allow(machine).to receive(:env).and_return(env)
|
|
allow(machine).to receive(:provider_config).and_return(nil)
|
|
allow(machine).to receive(:provider_options).and_return({})
|
|
|
|
subject.name = "foo"
|
|
subject.info = "Hello there"
|
|
subject.warn = "Warning!!"
|
|
subject.ignore = :up
|
|
subject.only_on = "guest"
|
|
subject.ruby do |env,machine|
|
|
var = 'test'
|
|
math = 1+1
|
|
end
|
|
subject.run = {inline: "apt-get update"}
|
|
subject.run_remote = {inline: "apt-get update", env: {"VAR"=>"VAL"}}
|
|
end
|
|
|
|
describe "with defaults" do
|
|
it "is valid with test defaults" do
|
|
subject.finalize!
|
|
assert_valid
|
|
end
|
|
|
|
it "sets a command" do
|
|
subject.finalize!
|
|
expect(subject.command).to eq(command)
|
|
end
|
|
|
|
it "uses default error behavior" do
|
|
subject.finalize!
|
|
expect(subject.on_error).to eq(:halt)
|
|
end
|
|
end
|
|
|
|
describe "defining a new config that needs to match internal restraints" do
|
|
let(:cmd) { :destroy }
|
|
let(:cfg) { described_class.new(cmd) }
|
|
let(:arr_cfg) { described_class.new(cmd) }
|
|
|
|
before do
|
|
cfg.only_on = :guest
|
|
cfg.ignore = "up"
|
|
cfg.abort = true
|
|
cfg.ruby do
|
|
var = 1+1
|
|
end
|
|
arr_cfg.only_on = ["guest", /other/]
|
|
arr_cfg.ignore = ["up", "destroy"]
|
|
end
|
|
|
|
it "ensures only_on is an array" do
|
|
cfg.finalize!
|
|
arr_cfg.finalize!
|
|
|
|
expect(cfg.only_on).to be_a(Array)
|
|
expect(arr_cfg.only_on).to be_a(Array)
|
|
end
|
|
|
|
it "ensures ignore is an array of symbols" do
|
|
cfg.finalize!
|
|
arr_cfg.finalize!
|
|
|
|
expect(cfg.ignore).to be_a(Array)
|
|
expect(arr_cfg.ignore).to be_a(Array)
|
|
|
|
cfg.ignore.each do |a|
|
|
expect(a).to be_a(Symbol)
|
|
end
|
|
|
|
arr_cfg.ignore.each do |a|
|
|
expect(a).to be_a(Symbol)
|
|
end
|
|
end
|
|
|
|
it "ensures ruby is a proc" do
|
|
cfg.finalize!
|
|
expect(cfg.ruby_block).to be_a(Proc)
|
|
end
|
|
|
|
it "converts aborts true to exit code 0" do
|
|
cfg.finalize!
|
|
|
|
expect(cfg.abort).to eq(1)
|
|
end
|
|
end
|
|
|
|
describe "defining a basic trigger config" do
|
|
let(:cmd) { :up }
|
|
let(:cfg) { described_class.new(cmd) }
|
|
|
|
before do
|
|
cfg.info = "Hello there"
|
|
cfg.warn = "Warning!!"
|
|
cfg.on_error = :continue
|
|
cfg.ignore = :up
|
|
cfg.abort = 3
|
|
cfg.only_on = "guest"
|
|
cfg.ruby = proc{ var = 1+1 }
|
|
cfg.run = {inline: "apt-get update"}
|
|
cfg.run_remote = {inline: "apt-get update", env: {"VAR"=>"VAL"}}
|
|
end
|
|
|
|
it "sets the options" do
|
|
cfg.finalize!
|
|
expect(cfg.info).to eq("Hello there")
|
|
expect(cfg.warn).to eq("Warning!!")
|
|
expect(cfg.on_error).to eq(:continue)
|
|
expect(cfg.ignore).to eq([:up])
|
|
expect(cfg.only_on).to eq(["guest"])
|
|
expect(cfg.run).to be_a(VagrantPlugins::Shell::Config)
|
|
expect(cfg.run_remote).to be_a(VagrantPlugins::Shell::Config)
|
|
expect(cfg.abort).to eq(3)
|
|
expect(cfg.ruby_block).to be_a(Proc)
|
|
end
|
|
end
|
|
end
|