Begin to add tests for mixin provisioner
This commit is contained in:
parent
ef82c0a5bc
commit
28ef368881
|
@ -41,6 +41,8 @@ module Vagrant
|
|||
return @_provisioner_instances.compact
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
# Sorts provisioners based on order specified with before/after options
|
||||
#
|
||||
# TODO: make sure all defined provisioners work here (i.e. even thoughs defined in separate but loaded Vagrantfile)
|
||||
|
@ -49,10 +51,6 @@ module Vagrant
|
|||
def sort_provisioner_instances(pvs)
|
||||
final_provs = []
|
||||
root_provs = []
|
||||
dep_provs = []
|
||||
each_provs = []
|
||||
all_provs = []
|
||||
|
||||
# extract root provisioners
|
||||
root_provs = pvs.map { |p,o| [p,o] if o[:before].nil? && o[:after].nil? }.reject(&:nil?)
|
||||
|
||||
|
@ -61,6 +59,10 @@ module Vagrant
|
|||
return pvs
|
||||
end
|
||||
|
||||
dep_provs = []
|
||||
each_provs = []
|
||||
all_provs = []
|
||||
|
||||
# extract dependency provisioners
|
||||
dep_provs = pvs.map { |p,o| [p,o] if (!o[:before].nil? && !o[:before].is_a?(Symbol)) || (!o[:after].nil? && !o[:after].is_a?(Symbol)) }.reject(&:nil?)
|
||||
# extract each provisioners
|
||||
|
@ -73,6 +75,7 @@ module Vagrant
|
|||
# insert provisioners in order
|
||||
final_provs = root_provs
|
||||
dep_provs.each do |p,options|
|
||||
idx = 0
|
||||
if options[:before]
|
||||
idx = final_provs.each_with_index.map { |(p,o), i| i if o[:name].to_s == options[:before] }.reject(&:nil?).first
|
||||
idx -= 1 unless idx == 0
|
||||
|
@ -84,20 +87,23 @@ module Vagrant
|
|||
end
|
||||
end
|
||||
|
||||
# Add :each and :all provisioners in reverse to preserve order in Vagrantfile
|
||||
|
||||
# add each to final array
|
||||
# TODO: Account for additional tmp_final size after insert for BOTH before/after cases (if both shortcuts are used)
|
||||
tmp_final_provs = final_provs.dup
|
||||
extra_index = 0
|
||||
before_extra_index = 1 # offset for final array size
|
||||
after_extra_index = 0
|
||||
each_provs.reverse_each do |p,options|
|
||||
idx = 0
|
||||
final_provs.each_with_index.map do |(prv,o), i|
|
||||
if options[:before]
|
||||
idx = i-1 unless idx == 0
|
||||
idx += extra_index
|
||||
extra_index += 1
|
||||
idx = (i+before_extra_index)-1 unless i == 0
|
||||
before_extra_index += 1
|
||||
tmp_final_provs.insert(idx, [p,options])
|
||||
elsif options[:after]
|
||||
idx = i+1
|
||||
idx += extra_index
|
||||
extra_index += 1
|
||||
idx = (i+after_extra_index)+1
|
||||
after_extra_index += 1
|
||||
tmp_final_provs.insert(idx, [p,options])
|
||||
end
|
||||
end
|
||||
|
|
|
@ -0,0 +1,203 @@
|
|||
require File.expand_path("../../../../base", __FILE__)
|
||||
require Vagrant.source_root.join("plugins/kernel_v2/config/vm")
|
||||
|
||||
require "vagrant/action/builtin/mixin_provisioners"
|
||||
|
||||
describe Vagrant::Action::Builtin::MixinProvisioners do
|
||||
include_context "unit"
|
||||
|
||||
let(:sandbox) { isolated_environment }
|
||||
let(:iso_env) do
|
||||
# We have to create a Vagrantfile so there is a root path
|
||||
sandbox.vagrantfile("")
|
||||
sandbox.create_vagrant_env
|
||||
end
|
||||
|
||||
let(:provisioner_config){ {} }
|
||||
let(:provisioner_one) do
|
||||
prov = VagrantPlugins::Kernel_V2::VagrantConfigProvisioner.new("spec-test", :shell)
|
||||
prov.config = provisioner_config
|
||||
prov
|
||||
end
|
||||
let(:provisioner_two) do
|
||||
prov = VagrantPlugins::Kernel_V2::VagrantConfigProvisioner.new("spec-test", :shell)
|
||||
prov.config = provisioner_config
|
||||
prov
|
||||
end
|
||||
|
||||
let(:provisioner_instances) { [provisioner_one,provisioner_two] }
|
||||
|
||||
let(:ui) { double("ui") }
|
||||
let(:vm) { double("vm", provisioners: provisioner_instances) }
|
||||
let(:config) { double("config", vm: vm) }
|
||||
let(:machine) { double("machine", ui: ui, config: config) }
|
||||
|
||||
let(:env) {{ machine: machine, ui: machine.ui, root_path: Pathname.new(".") }}
|
||||
|
||||
subject do
|
||||
Class.new do
|
||||
extend Vagrant::Action::Builtin::MixinProvisioners
|
||||
end
|
||||
end
|
||||
|
||||
after do
|
||||
sandbox.close
|
||||
end
|
||||
|
||||
describe "#provisioner_instances" do
|
||||
it "returns all the instances of configured provisioners" do
|
||||
result = subject.provisioner_instances(env)
|
||||
expect(result.size).to eq(provisioner_instances.size)
|
||||
shell_one = result.first
|
||||
expect(shell_one.first).to be_a(VagrantPlugins::Shell::Provisioner)
|
||||
shell_two = result[1]
|
||||
expect(shell_two.first).to be_a(VagrantPlugins::Shell::Provisioner)
|
||||
end
|
||||
end
|
||||
|
||||
context "#sort_provisioner_instances" do
|
||||
describe "with no dependency provisioners" do
|
||||
it "returns the original array" do
|
||||
result = subject.provisioner_instances(env)
|
||||
expect(result.size).to eq(provisioner_instances.size)
|
||||
shell_one = result.first
|
||||
expect(shell_one.first).to be_a(VagrantPlugins::Shell::Provisioner)
|
||||
shell_two = result[1]
|
||||
expect(shell_two.first).to be_a(VagrantPlugins::Shell::Provisioner)
|
||||
end
|
||||
end
|
||||
|
||||
describe "with before and after dependency provisioners" do
|
||||
let(:provisioner_config){ {} }
|
||||
let(:provisioner_root) do
|
||||
prov = VagrantPlugins::Kernel_V2::VagrantConfigProvisioner.new("root-test", :shell)
|
||||
prov.config = provisioner_config
|
||||
prov
|
||||
end
|
||||
let(:provisioner_before) do
|
||||
prov = VagrantPlugins::Kernel_V2::VagrantConfigProvisioner.new("before-test", :shell)
|
||||
prov.config = provisioner_config
|
||||
prov.before = "root-test"
|
||||
prov
|
||||
end
|
||||
let(:provisioner_after) do
|
||||
prov = VagrantPlugins::Kernel_V2::VagrantConfigProvisioner.new("after-test", :shell)
|
||||
prov.config = provisioner_config
|
||||
prov.after = "root-test"
|
||||
prov
|
||||
end
|
||||
let(:provisioner_instances) { [provisioner_root,provisioner_before,provisioner_after] }
|
||||
|
||||
it "returns the array in the correct order" do
|
||||
result = subject.provisioner_instances(env)
|
||||
expect(result[0].last[:name]).to eq("before-test")
|
||||
expect(result[1].last[:name]).to eq("root-test")
|
||||
expect(result[2].last[:name]).to eq("after-test")
|
||||
end
|
||||
end
|
||||
|
||||
describe "with before :each dependency provisioners" do
|
||||
let(:provisioner_config){ {} }
|
||||
let(:provisioner_root) do
|
||||
prov = VagrantPlugins::Kernel_V2::VagrantConfigProvisioner.new("root-test", :shell)
|
||||
prov.config = provisioner_config
|
||||
prov
|
||||
end
|
||||
let(:provisioner_root2) do
|
||||
prov = VagrantPlugins::Kernel_V2::VagrantConfigProvisioner.new("root2-test", :shell)
|
||||
prov.config = provisioner_config
|
||||
prov
|
||||
end
|
||||
let(:provisioner_before) do
|
||||
prov = VagrantPlugins::Kernel_V2::VagrantConfigProvisioner.new("before-test", :shell)
|
||||
prov.config = provisioner_config
|
||||
prov.before = :each
|
||||
prov
|
||||
end
|
||||
|
||||
let(:provisioner_instances) { [provisioner_root,provisioner_root2,provisioner_before] }
|
||||
|
||||
it "puts the each shortcut provisioners in place" do
|
||||
result = subject.provisioner_instances(env)
|
||||
|
||||
expect(result[0].last[:name]).to eq("before-test")
|
||||
expect(result[1].last[:name]).to eq("root-test")
|
||||
expect(result[2].last[:name]).to eq("before-test")
|
||||
expect(result[3].last[:name]).to eq("root2-test")
|
||||
end
|
||||
end
|
||||
|
||||
describe "with after :each dependency provisioners" do
|
||||
let(:provisioner_config){ {} }
|
||||
let(:provisioner_root) do
|
||||
prov = VagrantPlugins::Kernel_V2::VagrantConfigProvisioner.new("root-test", :shell)
|
||||
prov.config = provisioner_config
|
||||
prov
|
||||
end
|
||||
let(:provisioner_root2) do
|
||||
prov = VagrantPlugins::Kernel_V2::VagrantConfigProvisioner.new("root2-test", :shell)
|
||||
prov.config = provisioner_config
|
||||
prov
|
||||
end
|
||||
let(:provisioner_after) do
|
||||
prov = VagrantPlugins::Kernel_V2::VagrantConfigProvisioner.new("after-test", :shell)
|
||||
prov.config = provisioner_config
|
||||
prov.after = :each
|
||||
prov
|
||||
end
|
||||
|
||||
let(:provisioner_instances) { [provisioner_root,provisioner_root2,provisioner_after] }
|
||||
|
||||
it "puts the each shortcut provisioners in place" do
|
||||
result = subject.provisioner_instances(env)
|
||||
|
||||
expect(result[0].last[:name]).to eq("root-test")
|
||||
expect(result[1].last[:name]).to eq("after-test")
|
||||
expect(result[2].last[:name]).to eq("root2-test")
|
||||
expect(result[3].last[:name]).to eq("after-test")
|
||||
end
|
||||
end
|
||||
|
||||
describe "with before and after :each dependency provisioners" do
|
||||
let(:provisioner_config){ {} }
|
||||
let(:provisioner_root) do
|
||||
prov = VagrantPlugins::Kernel_V2::VagrantConfigProvisioner.new("root-test", :shell)
|
||||
prov.config = provisioner_config
|
||||
prov
|
||||
end
|
||||
let(:provisioner_root2) do
|
||||
prov = VagrantPlugins::Kernel_V2::VagrantConfigProvisioner.new("root2-test", :shell)
|
||||
prov.config = provisioner_config
|
||||
prov
|
||||
end
|
||||
let(:provisioner_after) do
|
||||
prov = VagrantPlugins::Kernel_V2::VagrantConfigProvisioner.new("after-test", :shell)
|
||||
prov.config = provisioner_config
|
||||
prov.after = :each
|
||||
prov
|
||||
end
|
||||
let(:provisioner_before) do
|
||||
prov = VagrantPlugins::Kernel_V2::VagrantConfigProvisioner.new("before-test", :shell)
|
||||
prov.config = provisioner_config
|
||||
prov.before = :each
|
||||
prov
|
||||
end
|
||||
|
||||
let(:provisioner_instances) { [provisioner_root,provisioner_root2,provisioner_before,provisioner_after] }
|
||||
|
||||
it "puts the each shortcut provisioners in place" do
|
||||
result = subject.provisioner_instances(env)
|
||||
result.each do |p,o|
|
||||
puts o[:name]
|
||||
end
|
||||
|
||||
expect(result[0].last[:name]).to eq("before-test")
|
||||
expect(result[1].last[:name]).to eq("root-test")
|
||||
expect(result[2].last[:name]).to eq("after-test")
|
||||
expect(result[3].last[:name]).to eq("before-test")
|
||||
expect(result[4].last[:name]).to eq("root2-test")
|
||||
expect(result[5].last[:name]).to eq("after-test")
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
Loading…
Reference in New Issue