module Kitchen::Driver::HypervHelpers

Public Instance Methods

encode_command(script) click to toggle source
# File lib/kitchen/driver/helpers.rb, line 25
def encode_command(script)
  encoded_script = script.encode("UTF-16LE", "UTF-8")
  Base64.strict_encode64(encoded_script)
end
execute_command(cmd, options = {}) click to toggle source
# File lib/kitchen/driver/helpers.rb, line 73
def execute_command(cmd, options = {})
  debug("#Local Command BEGIN (#{cmd})")
  sh = Mixlib::ShellOut.new(cmd, options)
  sh.run_command
  debug("Local Command END #{Util.duration(sh.execution_time)}")
  raise "Failed: #{sh.stderr}" if sh.error?

  stdout = sanitize_stdout(sh.stdout)
  JSON.parse(stdout) if stdout.length > 2
end
hyperv_default_switch_ps() click to toggle source
# File lib/kitchen/driver/helpers.rb, line 99
      def hyperv_default_switch_ps
        <<-VMSWITCH
          Get-DefaultVMSwitch #{ENV["KITCHEN_HYPERV_SWITCH"]} | ConvertTo-Json
        VMSWITCH
      end
hyperv_switch() click to toggle source
# File lib/kitchen/driver/helpers.rb, line 88
def hyperv_switch
  default_switch_object = run_ps hyperv_default_switch_ps
  if default_switch_object.nil? ||
      !default_switch_object.key?("Name") ||
      default_switch_object["Name"].empty?
    raise "Failed to find a default VM Switch."
  end

  default_switch_object["Name"]
end
is_32bit?() click to toggle source
# File lib/kitchen/driver/helpers.rb, line 36
def is_32bit?
  os_arch = ENV["PROCESSOR_ARCHITEW6432"] || ENV["PROCESSOR_ARCHITECTURE"]
  ruby_arch = ["foo"].pack("p").size == 4 ? 32 : 64
  os_arch != "AMD64" && ruby_arch == 32
end
is_64bit?() click to toggle source
# File lib/kitchen/driver/helpers.rb, line 30
def is_64bit?
  os_arch = ENV["PROCESSOR_ARCHITEW6432"] || ENV["PROCESSOR_ARCHITECTURE"]
  ruby_arch = ["foo"].pack("p").size == 4 ? 32 : 64
  os_arch == "AMD64" && ruby_arch == 64
end
powershell_64_bit() click to toggle source
# File lib/kitchen/driver/helpers.rb, line 42
def powershell_64_bit
  if is_64bit? || is_32bit?
    'c:\windows\system32\windowspowershell\v1.0\powershell.exe'
  else
    'c:\windows\sysnative\windowspowershell\v1.0\powershell.exe'
  end
end
run_ps(cmd, options = {}) click to toggle source

Convenience method to run a powershell command locally.

@param cmd [String] command to run locally @param options [Hash] options hash @see Kitchen::ShellOut.run_command @api private

# File lib/kitchen/driver/helpers.rb, line 65
def run_ps(cmd, options = {})
  cmd = "echo #{cmd}" if config[:dry_run]
  debug("Preparing to run: ")
  debug("  #{cmd}")
  wrapped_command = wrap_command cmd
  execute_command wrapped_command, options
end
sanitize_stdout(stdout) click to toggle source
# File lib/kitchen/driver/helpers.rb, line 84
def sanitize_stdout(stdout)
  stdout.split("\n").select { |s| !s.start_with?("PS") }.join("\n")
end
wrap_command(script) click to toggle source
# File lib/kitchen/driver/helpers.rb, line 50
def wrap_command(script)
  base_script_path = File.join(File.dirname(__FILE__), "/../../../support/hyperv.ps1")
  debug("Loading functions from #{base_script_path}")
  new_script = [ ". #{base_script_path}", "#{script}" ].join(";\n")
  debug("Wrapped script: #{new_script}")
  "#{powershell_64_bit} -noprofile -executionpolicy bypass" \
  " -encodedcommand #{encode_command new_script} -outputformat Text"
end

Private Instance Methods

ruby_array_to_ps_array(list) click to toggle source
# File lib/kitchen/driver/helpers.rb, line 107
def ruby_array_to_ps_array(list)
  return "@()" if list.nil? || list.empty?

  list.to_s.tr("[]", "()").prepend("@")
end