2014-02-16 00:28:11 +00:00
|
|
|
require "json"
|
|
|
|
|
|
|
|
require "vagrant/util/powershell"
|
2014-02-15 23:29:16 +00:00
|
|
|
|
2014-02-16 00:35:04 +00:00
|
|
|
require_relative "plugin"
|
|
|
|
|
2014-02-15 23:29:16 +00:00
|
|
|
module VagrantPlugins
|
|
|
|
module HyperV
|
2014-02-16 00:28:11 +00:00
|
|
|
class Driver
|
2014-02-16 00:51:25 +00:00
|
|
|
ERROR_REGEXP = /===Begin-Error===(.+?)===End-Error===/m
|
|
|
|
OUTPUT_REGEXP = /===Begin-Output===(.+?)===End-Output===/m
|
2014-03-06 16:51:07 +00:00
|
|
|
|
2014-03-06 16:58:31 +00:00
|
|
|
attr_reader :vm_id
|
|
|
|
|
|
|
|
def initialize(id)
|
|
|
|
@vm_id = id
|
2014-03-06 16:51:07 +00:00
|
|
|
end
|
2014-02-16 00:51:25 +00:00
|
|
|
|
2014-02-16 00:28:11 +00:00
|
|
|
def execute(path, options)
|
2014-02-16 00:51:25 +00:00
|
|
|
r = execute_powershell(path, options)
|
2014-02-16 00:35:04 +00:00
|
|
|
if r.exit_code != 0
|
|
|
|
raise Errors::PowerShellError,
|
|
|
|
script: path,
|
|
|
|
stderr: r.stderr
|
|
|
|
end
|
|
|
|
|
2014-02-16 00:51:25 +00:00
|
|
|
# We only want unix-style line endings within Vagrant
|
|
|
|
r.stdout.gsub!("\r\n", "\n")
|
|
|
|
r.stderr.gsub!("\r\n", "\n")
|
2014-02-16 00:28:11 +00:00
|
|
|
|
2014-02-16 00:51:25 +00:00
|
|
|
error_match = ERROR_REGEXP.match(r.stdout)
|
|
|
|
output_match = OUTPUT_REGEXP.match(r.stdout)
|
|
|
|
|
|
|
|
if error_match
|
|
|
|
data = JSON.parse(error_match[1])
|
|
|
|
|
|
|
|
# We have some error data.
|
|
|
|
raise Errors::PowerShellError,
|
|
|
|
script: path,
|
|
|
|
stderr: data["error"]
|
2014-02-16 00:28:11 +00:00
|
|
|
end
|
2014-02-16 00:51:25 +00:00
|
|
|
|
|
|
|
# Nothing
|
|
|
|
return nil if !output_match
|
|
|
|
return JSON.parse(output_match[1])
|
2014-02-16 00:28:11 +00:00
|
|
|
end
|
|
|
|
|
2014-03-06 16:51:07 +00:00
|
|
|
def get_current_state
|
|
|
|
execute('get_vm_status.ps1', { VmId: vm_id })
|
|
|
|
end
|
|
|
|
|
|
|
|
def delete_vm
|
|
|
|
execute('delete_vm.ps1', { VmId: vm_id })
|
|
|
|
end
|
|
|
|
|
|
|
|
def read_guest_ip
|
|
|
|
execute('get_network_config.ps1', { VmId: vm_id })
|
|
|
|
end
|
|
|
|
|
|
|
|
def resume
|
|
|
|
execute('resume_vm.ps1', { VmId: vm_id })
|
|
|
|
end
|
|
|
|
|
|
|
|
def start
|
|
|
|
execute('start_vm.ps1', { VmId: vm_id })
|
|
|
|
end
|
|
|
|
|
|
|
|
def stop
|
|
|
|
execute('stop_vm.ps1', { VmId: vm_id })
|
|
|
|
end
|
|
|
|
|
|
|
|
def suspend
|
|
|
|
execute("suspend_vm.ps1", { VmId: vm_id })
|
|
|
|
end
|
|
|
|
|
|
|
|
def import(options)
|
|
|
|
execute('import_vm.ps1', options)
|
|
|
|
end
|
|
|
|
|
2014-02-16 00:28:11 +00:00
|
|
|
protected
|
|
|
|
|
|
|
|
def execute_powershell(path, options, &block)
|
2014-02-16 00:51:25 +00:00
|
|
|
lib_path = Pathname.new(File.expand_path("../scripts", __FILE__))
|
2014-02-16 00:28:11 +00:00
|
|
|
path = lib_path.join(path).to_s.gsub("/", "\\")
|
|
|
|
options = options || {}
|
|
|
|
ps_options = []
|
|
|
|
options.each do |key, value|
|
|
|
|
ps_options << "-#{key}"
|
|
|
|
ps_options << "'#{value}'"
|
|
|
|
end
|
2014-02-16 19:42:20 +00:00
|
|
|
|
|
|
|
# Always have a stop error action for failures
|
|
|
|
ps_options << "-ErrorAction" << "Stop"
|
|
|
|
|
2014-02-16 00:28:11 +00:00
|
|
|
opts = { notify: [:stdout, :stderr, :stdin] }
|
|
|
|
Vagrant::Util::PowerShell.execute(path, *ps_options, **opts, &block)
|
|
|
|
end
|
2014-02-15 23:29:16 +00:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|