vagrant/plugins/commands/validate/command.rb
Chris Roberts ea25996b21
Update Vagrant behavior outside of installers
Remove customized require behaviors and modify the bin executable
to check for missing tools that Vagrant expects to exist when
running outside of an installer.
2025-04-02 11:40:17 -07:00

107 lines
3.1 KiB
Ruby

# Copyright (c) HashiCorp, Inc.
# SPDX-License-Identifier: BUSL-1.1
require 'optparse'
module VagrantPlugins
module CommandValidate
class Command < Vagrant.plugin("2", :command)
def self.synopsis
"validates the Vagrantfile"
end
def execute
options = {}
opts = OptionParser.new do |o|
o.banner = "Usage: vagrant validate [options]"
o.separator ""
o.separator "Validates a Vagrantfile config"
o.separator ""
o.separator "Options:"
o.separator ""
o.on("-p", "--ignore-provider", "Ignores provider config options") do |p|
options[:ignore_provider] = p
end
end
# Parse the options
argv = parse_options(opts)
return if !argv
action_env = {}
if options[:ignore_provider]
action_env[:ignore_provider] = true
tmp_data_dir = mockup_providers!
end
# Validate the configuration of all machines
with_target_vms() do |machine|
machine.action_raw(:config_validate, Vagrant::Action::Builtin::ConfigValidate, action_env)
end
@env.ui.info(I18n.t("vagrant.commands.validate.success"))
# Success, exit status 0
0
ensure
FileUtils.remove_entry tmp_data_dir if tmp_data_dir
end
protected
# This method is required to bypass some of the provider checks that would
# otherwise raise exceptions before Vagrant could load and validate a config.
# It essentially ignores that there are no installed or usable prodivers so
# that Vagrant can go along and validate the rest of the Vagrantfile and ignore
# any provider blocks.
#
# return [String] tmp_data_dir - Temporary dir used to store guest metadata during validation
def mockup_providers!
require 'log4r'
logger = Log4r::Logger.new("vagrant::validate")
logger.debug("Overriding all registered provider classes for validate")
# Without setting up a tmp Environment, Vagrant will completely
# erase the local data dotfile and you can lose state after the
# validate command completes.
tmp_data_dir = Dir.mktmpdir("vagrant-validate-")
@env = Vagrant::Environment.new(
cwd: @env.cwd,
home_path: @env.home_path,
ui_class: @env.ui_class,
vagrantfile_name: @env.vagrantfile_name,
local_data_path: tmp_data_dir,
data_dir: tmp_data_dir
)
Vagrant.plugin("2").manager.providers.each do |key, data|
data[0].class_eval do
def initialize(machine)
end
def machine_id_changed
end
def self.installed?
true
end
def self.usable?(raise_error=false)
true
end
def state
state_id = Vagrant::MachineState::NOT_CREATED_ID
short = :not_created
long = :not_created
Vagrant::MachineState.new(state_id, short, long)
end
end
end
tmp_data_dir
end
end
end
end