mirror of
https://github.com/hashicorp/vagrant.git
synced 2026-06-08 16:26:25 -04: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.
86 lines
2.8 KiB
Ruby
86 lines
2.8 KiB
Ruby
# Copyright (c) HashiCorp, Inc.
|
|
# SPDX-License-Identifier: BUSL-1.1
|
|
|
|
require "fileutils"
|
|
require "log4r"
|
|
|
|
module VagrantPlugins
|
|
module HyperV
|
|
module Action
|
|
class Import
|
|
|
|
VALID_HD_EXTENSIONS = [".vhd".freeze, ".vhdx".freeze].freeze
|
|
|
|
def initialize(app, env)
|
|
@app = app
|
|
@logger = Log4r::Logger.new("vagrant::hyperv::import")
|
|
end
|
|
|
|
def call(env)
|
|
vm_dir = env[:machine].box.directory.join("Virtual Machines")
|
|
hd_dir = env[:machine].box.directory.join("Virtual Hard Disks")
|
|
|
|
if !vm_dir.directory? || !hd_dir.directory?
|
|
@logger.error("Required virtual machine directory not found!")
|
|
raise Errors::BoxInvalid, name: env[:machine].name
|
|
end
|
|
|
|
valid_config_ext = [".xml"]
|
|
if env[:machine].provider.driver.has_vmcx_support?
|
|
valid_config_ext << ".vmcx"
|
|
end
|
|
|
|
config_path = nil
|
|
vm_dir.each_child do |file|
|
|
if valid_config_ext.include?(file.extname.downcase)
|
|
config_path = file
|
|
break
|
|
end
|
|
end
|
|
|
|
if !config_path
|
|
@logger.error("Failed to locate box configuration path")
|
|
raise Errors::BoxInvalid, name: env[:machine].name
|
|
else
|
|
@logger.info("Found box configuration path: #{config_path}")
|
|
end
|
|
|
|
image_path = nil
|
|
hd_dir.each_child do |file|
|
|
if VALID_HD_EXTENSIONS.include?(file.extname.downcase)
|
|
image_path = file
|
|
break
|
|
end
|
|
end
|
|
|
|
if !image_path
|
|
@logger.error("Failed to locate box image path")
|
|
raise Errors::BoxInvalid, name: env[:machine].name
|
|
else
|
|
@logger.info("Found box image path: #{image_path}")
|
|
end
|
|
|
|
env[:ui].output("Importing a Hyper-V instance")
|
|
dest_path = env[:machine].data_dir.join("Virtual Hard Disks").join(image_path.basename).to_s
|
|
|
|
options = {
|
|
"VMConfigFile" => Vagrant::Util::Platform.wsl_to_windows_path(config_path).gsub("/", "\\"),
|
|
"DestinationPath" => Vagrant::Util::Platform.wsl_to_windows_path(dest_path).gsub("/", "\\"),
|
|
"DataPath" => Vagrant::Util::Platform.wsl_to_windows_path(env[:machine].data_dir).gsub("/", "\\"),
|
|
"LinkedClone" => !!env[:machine].provider_config.linked_clone,
|
|
"SourcePath" => Vagrant::Util::Platform.wsl_to_windows_path(image_path).gsub("/", "\\"),
|
|
"VMName" => env[:machine].provider_config.vmname,
|
|
}
|
|
|
|
|
|
env[:ui].detail("Creating and registering the VM...")
|
|
server = env[:machine].provider.driver.import(options)
|
|
|
|
env[:ui].detail("Successfully imported VM")
|
|
env[:machine].id = server["id"]
|
|
@app.call(env)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|