diff --git a/plugins/kernel_v2/config/vm.rb b/plugins/kernel_v2/config/vm.rb index 25bc74762..e7196a8ea 100644 --- a/plugins/kernel_v2/config/vm.rb +++ b/plugins/kernel_v2/config/vm.rb @@ -772,8 +772,7 @@ module VagrantPlugins next end - provisioner_names = @provisioners.map { |i| i.name if i.name != vm_provisioner.name }.reject(&:nil?) - provisioner_errors = vm_provisioner.validate(machine, provisioner_names) + provisioner_errors = vm_provisioner.validate(machine, @provisioners) if provisioner_errors errors = Vagrant::Config::V2::Util.merge_errors(errors, provisioner_errors) end diff --git a/plugins/kernel_v2/config/vm_provisioner.rb b/plugins/kernel_v2/config/vm_provisioner.rb index 9ba6f639d..61f16ba4b 100644 --- a/plugins/kernel_v2/config/vm_provisioner.rb +++ b/plugins/kernel_v2/config/vm_provisioner.rb @@ -108,11 +108,13 @@ module VagrantPlugins # Validates the before/after options # # @param [Vagrant::Machine] machine - machine to validate against - # @param [Array] provisioner_names - Names of provisioners for a given machine + # @param [Array] provisioners - Array of defined provisioners for the guest machine # @return [Array] array of strings of error messages from config option validation - def validate(machine, provisioner_names) + def validate(machine, provisioners) errors = _detected_errors + provisioner_names = provisioners.map { |i| i.name if i.name != name }.reject(&:nil?) + if @before if !VALID_BEFORE_AFTER_TYPES.include?(@before) if @before.is_a?(Symbol) && !VALID_BEFORE_AFTER_TYPES.include?(@before) @@ -128,6 +130,14 @@ module VagrantPlugins action: "before", provisioner_name: @name) end + + dep_prov = provisioners.map { |i| i if i.name.to_s == @before && (i.before || i.after) }.reject(&:nil?) + + if !dep_prov.empty? + errors << I18n.t("vagrant.provisioners.base.dependency_provisioner_dependency", + name: @name, + dep_name: dep_prov.first.name.to_s) + end end end @@ -146,6 +156,13 @@ module VagrantPlugins action: "after", provisioner_name: @name) end + + dep_prov = provisioners.map { |i| i if i.name.to_s == @after && (i.before || i.after) }.reject(&:nil?) + if !dep_prov.empty? + errors << I18n.t("vagrant.provisioners.base.dependency_provisioner_dependency", + name: @name, + dep_name: dep_prov.first.name.to_s) + end end end diff --git a/templates/locales/en.yml b/templates/locales/en.yml index f850324c6..5629125d3 100644 --- a/templates/locales/en.yml +++ b/templates/locales/en.yml @@ -2487,6 +2487,8 @@ en: provisioners: base: + dependency_provisioner_dependency: |- + Dependency provisioner "%{name}" relies on another dependency provisioner "%{dep_name}". This is currently not supported. invalid_alias_value: |- Provisioner option `%{opt}` is not set as a valid type. Must be a string, or one of the alias shortcuts: %{alias} missing_provisioner_name: |-