174 lines
5.1 KiB
Ruby
174 lines
5.1 KiB
Ruby
require 'vagrant/machine_index/remote'
|
|
|
|
module Vagrant
|
|
class Environment
|
|
module Remote
|
|
|
|
def self.prepended(klass)
|
|
klass.class_eval do
|
|
attr_reader :client
|
|
end
|
|
end
|
|
|
|
# Client can be either a Project or a Basis
|
|
def initialize(opts={})
|
|
@client = opts[:client]
|
|
if @client.nil?
|
|
raise ArgumentError,
|
|
"Remote client is required for `#{self.class.name}'"
|
|
end
|
|
|
|
@logger = Log4r::Logger.new("vagrant::environment")
|
|
|
|
# Set the default ui class
|
|
opts[:ui_class] ||= UI::Remote
|
|
|
|
@cwd = Pathname.new(@client.cwd)
|
|
@home_path = @client.respond_to?(:home) && Pathname.new(@client.home)
|
|
@vagrantfile_name = @client.respond_to?(:vagrantfile_name) && Array(@client.vagrantfile_name)
|
|
@ui = opts.fetch(:ui, opts[:ui_class].new(@client.ui))
|
|
@local_data_path = Pathname.new(@client.local_data)
|
|
@boxes_path = @home_path && @home_path.join("boxes")
|
|
@data_dir = Pathname.new(@client.data_dir)
|
|
@gems_path = Vagrant::Bundler.instance.plugin_gem_path
|
|
@tmp_path = Pathname.new(@client.temp_dir)
|
|
|
|
# This is the batch lock, that enforces that only one {BatchAction}
|
|
# runs at a time from {#batch}.
|
|
@batch_lock = Mutex.new
|
|
@locks = {}
|
|
|
|
@logger.info("Environment initialized (#{self})")
|
|
@logger.info(" - cwd: #{cwd}")
|
|
@logger.info(" - home path: #{home_path}")
|
|
|
|
# TODO: aliases
|
|
@aliases_path = Pathname.new(ENV["VAGRANT_ALIAS_FILE"]).expand_path if ENV.key?("VAGRANT_ALIAS_FILE")
|
|
@aliases_path ||= @home_path && @home_path.join("aliases")
|
|
|
|
@default_private_key_path = Pathname.new(@client.default_private_key)
|
|
copy_insecure_private_key
|
|
|
|
# Initialize localized plugins
|
|
plugins = Vagrant::Plugin::Manager.instance.localize!(self)
|
|
# Load any environment local plugins
|
|
Vagrant::Plugin::Manager.instance.load_plugins(plugins)
|
|
|
|
# Initialize globalize plugins
|
|
plugins = Vagrant::Plugin::Manager.instance.globalize!
|
|
# Load any global plugins
|
|
Vagrant::Plugin::Manager.instance.load_plugins(plugins)
|
|
|
|
plugins = process_configured_plugins
|
|
|
|
# Call the hooks that does not require configurations to be loaded
|
|
# by using a "clean" action runner
|
|
hook(:environment_plugins_loaded, runner: Action::PrimaryRunner.new(env: self))
|
|
|
|
# Call the environment load hooks
|
|
hook(:environment_load, runner: Action::PrimaryRunner.new(env: self))
|
|
end
|
|
|
|
def active_machines
|
|
targets = client.active_targets
|
|
names = []
|
|
targets.each do |t|
|
|
names << t.name
|
|
end
|
|
names
|
|
end
|
|
|
|
# Returns the collection of boxes for the environment.
|
|
#
|
|
# @return [BoxCollection]
|
|
def boxes
|
|
box_colletion_client = client.boxes
|
|
@_boxes ||= BoxCollection.new(nil, client: box_colletion_client)
|
|
end
|
|
|
|
def config_loader
|
|
return @config_loader if @config_loader
|
|
|
|
root_vagrantfile = nil
|
|
if client.respond_to?(:vagrantfile_path) && client.respond_to?(:vagrantfile_name)
|
|
path = client.vagrantfile_path
|
|
name = client.vagrantfile_name
|
|
root_vagrantfile = path.join(name).to_s
|
|
end
|
|
@config_loader = Config::Loader.new(
|
|
Config::VERSIONS, Config::VERSIONS_ORDER)
|
|
@config_loader.set(:root, root_vagrantfile) if root_vagrantfile
|
|
@config_loader
|
|
end
|
|
|
|
def default_provider(**opts)
|
|
client.respond_to?(:default_provider) && client.default_provider(opts)
|
|
end
|
|
|
|
# Gets a target (machine) by name
|
|
#
|
|
# @param [String] machine name
|
|
# @param [String] provider name
|
|
# return [VagrantPlugins::CommandServe::Client::Machine]
|
|
def get_target(name, provider)
|
|
client.target(name, provider)
|
|
end
|
|
|
|
# Returns the host object associated with this environment.
|
|
#
|
|
# @return [Class]
|
|
def host
|
|
if !@host
|
|
h = @client.host
|
|
@host = Vagrant::Host.new(h, nil, nil, self)
|
|
end
|
|
@host
|
|
end
|
|
|
|
# @param [String] machine name
|
|
# return [Vagrant::Machine]
|
|
def machine(name, provider, **_)
|
|
client.machine(name, provider)
|
|
end
|
|
|
|
def machine_names
|
|
client.target_names
|
|
end
|
|
|
|
# The {MachineIndex} to store information about the machines.
|
|
#
|
|
# @return [MachineIndex]
|
|
def machine_index
|
|
@machine_index ||= Vagrant::MachineIndex.new(client: client.target_index)
|
|
end
|
|
|
|
def primary_machine_name
|
|
client.primary_target_name
|
|
end
|
|
|
|
# def root_path
|
|
# TODO: need the vagrantfile service to be in place in order to be
|
|
# implemented on the Go side
|
|
# end
|
|
|
|
def setup_home_path
|
|
# no-op
|
|
# Don't setup a home path in ruby
|
|
end
|
|
|
|
def setup_local_data_path(force=false)
|
|
# no-op
|
|
# Don't setup a home path in ruby
|
|
end
|
|
|
|
def vagrantfile
|
|
client.vagrantfile
|
|
end
|
|
|
|
def to_proto
|
|
client.proto
|
|
end
|
|
end
|
|
end
|
|
end
|