mirror of
https://github.com/hashicorp/vagrant.git
synced 2026-02-11 23:03:39 -05:00
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.
107 lines
3.1 KiB
Ruby
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
|