MultiStep should do input/output validation
This commit is contained in:
parent
7d3746b292
commit
73761dc92a
|
@ -67,6 +67,8 @@ module Vagrant
|
||||||
maps = {}
|
maps = {}
|
||||||
maps = extra_inputs.pop if extra_inputs.last.kind_of?(Hash)
|
maps = extra_inputs.pop if extra_inputs.last.kind_of?(Hash)
|
||||||
|
|
||||||
|
# Go over each extra input and handle the mapping. This is typically
|
||||||
|
# syntactic sugar.
|
||||||
extra_inputs.each do |direct|
|
extra_inputs.each do |direct|
|
||||||
if direct.is_a?(Symbol)
|
if direct.is_a?(Symbol)
|
||||||
# Symbols are assumed to be inputs to this group
|
# Symbols are assumed to be inputs to this group
|
||||||
|
@ -76,6 +78,21 @@ module Vagrant
|
||||||
maps[direct] = direct.variable
|
maps[direct] = direct.variable
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Turn the pure symbols into mapping from last steps
|
||||||
|
maps.keys.each do |from|
|
||||||
|
if from.kind_of?(Symbol)
|
||||||
|
new_from = output(@step_names.last, from)
|
||||||
|
maps[new_from] = maps.delete(from)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# Verify that all the mappings are correctly satisfied.
|
||||||
|
maps.each do |from, to|
|
||||||
|
if !mapping_satisfied?(step_class, from, to)
|
||||||
|
raise ArgumentError, "Mapping from #{from.variable} to #{to} fails."
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
# Append the step
|
# Append the step
|
||||||
@step_names << step_name
|
@step_names << step_name
|
||||||
@steps[step_name] = [step_class, maps]
|
@steps[step_name] = [step_class, maps]
|
||||||
|
@ -120,6 +137,24 @@ module Vagrant
|
||||||
step_outputs[name].dup
|
step_outputs[name].dup
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
protected
|
||||||
|
|
||||||
|
def mapping_satisfied?(step, from, to)
|
||||||
|
# If the step inputs don't contain to then we fail
|
||||||
|
return false if !step.inputs.include?(to)
|
||||||
|
|
||||||
|
if from.kind_of?(GroupInput)
|
||||||
|
# We assume that inputs from the group are satisfied since
|
||||||
|
# it has to come in.
|
||||||
|
return true
|
||||||
|
elsif from.kind_of?(StepOutput)
|
||||||
|
# Verify that the outputs of the step exist to map.
|
||||||
|
return @steps[from.name][0].outputs.include?(from.variable)
|
||||||
|
end
|
||||||
|
|
||||||
|
true
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -136,4 +136,27 @@ describe Vagrant::Action::MultiStep do
|
||||||
g = described_class.new
|
g = described_class.new
|
||||||
expect { g.step :foo }.to raise_error(ArgumentError)
|
expect { g.step :foo }.to raise_error(ArgumentError)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it "should not allow remapping from outputs that don't exist" do
|
||||||
|
step_A = Class.new(Vagrant::Action::Step) do
|
||||||
|
output :output_A
|
||||||
|
end
|
||||||
|
|
||||||
|
step_B = Class.new(Vagrant::Action::Step) do
|
||||||
|
input :input_B
|
||||||
|
end
|
||||||
|
|
||||||
|
g = described_class.new
|
||||||
|
g.step step_A
|
||||||
|
expect { g.step step_B, :output_B => :input_B }.to raise_error(ArgumentError)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "should not allow remapping to inputs that don't exist" do
|
||||||
|
step_A = Class.new(Vagrant::Action::Step) do
|
||||||
|
input :input_A
|
||||||
|
end
|
||||||
|
|
||||||
|
g = described_class.new
|
||||||
|
expect { g.step step_A, g.input(:foo) => :input_B }.to raise_error(ArgumentError)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in New Issue