vagrant-windows 1.3.0.pre.2 → 1.3.0.pre.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,37 +1,36 @@
1
1
  require 'timeout'
2
2
  require 'log4r'
3
- require_relative '../errors'
3
+ require_relative 'winrmshell_factory'
4
4
  require_relative 'winrmshell'
5
5
  require_relative 'winrmfinder'
6
+ require_relative '../errors'
7
+ require_relative '../windows_machine'
6
8
 
7
9
  module VagrantWindows
8
10
  module Communication
9
- # Provides communication with the VM via WinRM.
11
+ # Provides communication channel for Vagrant commands via WinRM.
10
12
  class WinRMCommunicator < Vagrant.plugin("2", :communicator)
11
-
12
- attr_reader :logger
13
- attr_reader :machine
14
- attr_reader :winrm_finder
15
13
 
16
14
  def self.match?(machine)
17
- machine.config.vm.guest.eql? :windows
15
+ VagrantWindows::WindowsMachine.is_windows?(machine)
18
16
  end
19
17
 
20
18
  def initialize(machine)
21
- @machine = machine
19
+ @windows_machine = VagrantWindows::WindowsMachine.new(machine)
20
+ @winrm_shell_factory = WinRMShellFactory.new(@windows_machine, WinRMFinder.new(@windows_machine))
21
+
22
22
  @logger = Log4r::Logger.new("vagrant_windows::communication::winrmcommunicator")
23
23
  @logger.debug("initializing WinRMCommunicator")
24
- @winrm_finder = WinRMFinder.new(machine)
25
24
  end
26
25
 
27
26
  def ready?
28
- logger.debug("Checking whether WinRM is ready...")
27
+ @logger.debug("Checking whether WinRM is ready...")
29
28
 
30
- Timeout.timeout(@machine.config.winrm.timeout) do
31
- session.powershell("hostname")
29
+ Timeout.timeout(@windows_machine.winrm_config.timeout) do
30
+ winrmshell.powershell("hostname")
32
31
  end
33
32
 
34
- logger.info("WinRM is ready!")
33
+ @logger.info("WinRM is ready!")
35
34
  return true
36
35
 
37
36
  rescue Vagrant::Errors::VagrantError => e
@@ -69,56 +68,30 @@ module VagrantWindows
69
68
 
70
69
  def upload(from, to)
71
70
  @logger.debug("Uploading: #{from} to #{to}")
72
- file = "winrm-upload-#{rand()}"
73
- file_name = (session.cmd("echo %TEMP%\\#{file}"))[:data][0][:stdout].chomp
74
- session.powershell <<-EOH
75
- if(Test-Path #{to})
76
- {
77
- rm #{to}
78
- }
79
- EOH
80
- Base64.encode64(IO.binread(from)).gsub("\n",'').chars.to_a.each_slice(8000-file_name.size) do |chunk|
81
- out = session.cmd("echo #{chunk.join} >> \"#{file_name}\"")
82
- end
83
- session.powershell("mkdir $([System.IO.Path]::GetDirectoryName(\"#{to}\"))")
84
- session.powershell <<-EOH
85
- $base64_string = Get-Content \"#{file_name}\"
86
- $bytes = [System.Convert]::FromBase64String($base64_string)
87
- $new_file = [System.IO.Path]::GetFullPath(\"#{to}\")
88
- [System.IO.File]::WriteAllBytes($new_file,$bytes)
89
- EOH
71
+ winrmshell.upload(from, to)
90
72
  end
91
73
 
92
74
  def download(from, to=nil)
93
75
  @logger.warn("Downloading: #{from} to #{to} not supported on Windows guests")
94
76
  end
95
77
 
96
- # Runs a remote WQL query against the VM
97
- #
98
- # Note: This is not part of the standard Vagrant communicator interface, but
99
- # guest capabilities may need to use this.
100
- def wql(query)
101
- session.wql(query)
78
+ def winrmshell=(winrmshell)
79
+ @winrmshell = winrmshell
102
80
  end
103
81
 
104
- def set_winrmshell(winrmshell)
105
- @session = winrmshell
82
+ def winrmshell
83
+ @winrmshell ||= @winrm_shell_factory.create_winrm_shell()
106
84
  end
107
85
 
108
- def session
109
- @session ||= new_session
110
- end
111
- alias_method :winrmshell, :session
112
-
113
86
 
114
87
  protected
115
88
 
116
89
  def do_execute(command, shell, &block)
117
90
  if shell.eql? :cmd
118
- session.cmd(command, &block)[:exitcode]
91
+ winrmshell.cmd(command, &block)[:exitcode]
119
92
  else
120
93
  command = VagrantWindows.load_script("command_alias.ps1") << "\r\n" << command
121
- session.powershell(command, &block)[:exitcode]
94
+ winrmshell.powershell(command, &block)[:exitcode]
122
95
  end
123
96
  end
124
97
 
@@ -130,18 +103,6 @@ module VagrantWindows
130
103
  raise opts[:error_class], error_opts
131
104
  end
132
105
 
133
- def new_session
134
- WinRMShell.new(
135
- @winrm_finder.winrm_host_address(),
136
- @machine.config.winrm.username,
137
- @machine.config.winrm.password,
138
- {
139
- :port => @winrm_finder.winrm_host_port(),
140
- :timeout_in_seconds => @machine.config.winrm.timeout,
141
- :max_tries => @machine.config.winrm.max_tries
142
- })
143
- end
144
-
145
106
  end #WinRM class
146
107
  end
147
- end
108
+ end
@@ -1,46 +1,49 @@
1
1
  require 'log4r'
2
2
  require_relative '../errors'
3
+ require_relative '../windows_machine'
3
4
 
4
5
  module VagrantWindows
5
6
  module Communication
6
7
  class WinRMFinder
7
8
 
8
9
  attr_reader :logger
9
- attr_reader :machine
10
+ attr_reader :windows_machine
10
11
 
11
- def initialize(machine)
12
- @machine = machine
12
+ def initialize(windows_machine)
13
+ @windows_machine = windows_machine
13
14
  @logger = Log4r::Logger.new("vagrant_windows::communication::winrmfinder")
14
15
  end
15
16
 
17
+ # Finds the address of the Windows machine.
18
+ # Raises a Vagrant::Errors::SSHNotReady if WinRM is not responding yet.
19
+ #
20
+ # @return [String] The IP of the Windows machine
16
21
  def winrm_host_address
17
22
  # Get the SSH info for the machine, raise an exception if the
18
23
  # provider is saying that the machine is not ready.
19
- ssh_info = @machine.ssh_info
24
+ ssh_info = @windows_machine.ssh_info
20
25
  raise VagrantWindows::Errors::WinRMNotReady if ssh_info.nil?
21
26
 
22
27
  # if the configuration has a host value, that takes precedence
23
- host = @machine.config.winrm.host || ssh_info[:host]
28
+ host = @windows_machine.winrm_config.host || ssh_info[:host]
24
29
  @logger.info("WinRM host: #{host}")
25
30
  host
26
31
  end
27
32
 
33
+ # Finds the IP port of the Windows machine's WinRM service.
34
+ #
35
+ # @return [String] The port of the Windows machine's WinRM service
28
36
  def winrm_host_port
29
- expected_guest_port = @machine.config.winrm.guest_port
37
+ expected_guest_port = @windows_machine.winrm_config.guest_port
30
38
  @logger.debug("Searching for WinRM port: #{expected_guest_port.inspect}")
31
39
 
32
40
  # Look for the forwarded port only by comparing the guest port
33
- begin
34
- @machine.provider.driver.read_forwarded_ports.each do |_, _, hostport, guestport|
35
- return hostport if guestport == expected_guest_port
36
- end
37
- rescue NoMethodError => e
38
- # VMWare provider doesn't support read_forwarded_ports
39
- @logger.debug(e.message)
41
+ @windows_machine.read_forwarded_ports().each do |_, _, hostport, guestport|
42
+ return hostport if guestport == expected_guest_port
40
43
  end
41
44
 
42
45
  # We tried, give up and use the configured port as-is
43
- @machine.config.winrm.port
46
+ @windows_machine.winrm_config.port
44
47
  end
45
48
 
46
49
  end
@@ -56,6 +56,26 @@ module VagrantWindows
56
56
  def wql(query)
57
57
  execute_wql(query)
58
58
  end
59
+
60
+ def upload(from, to)
61
+ @logger.debug("Uploading: #{from} to #{to}")
62
+ file_name = (cmd("echo %TEMP%\\winrm-upload-#{rand()}"))[:data][0][:stdout].chomp
63
+ powershell <<-EOH
64
+ if(Test-Path #{to}) {
65
+ rm #{to}
66
+ }
67
+ EOH
68
+ Base64.encode64(IO.binread(from)).gsub("\n",'').chars.to_a.each_slice(8000-file_name.size) do |chunk|
69
+ out = cmd("echo #{chunk.join} >> \"#{file_name}\"")
70
+ end
71
+ powershell <<-EOH
72
+ mkdir $([System.IO.Path]::GetDirectoryName(\"#{to}\"))
73
+ $base64_string = Get-Content \"#{file_name}\"
74
+ $bytes = [System.Convert]::FromBase64String($base64_string)
75
+ $new_file = [System.IO.Path]::GetFullPath(\"#{to}\")
76
+ [System.IO.File]::WriteAllBytes($new_file,$bytes)
77
+ EOH
78
+ end
59
79
 
60
80
  protected
61
81
 
@@ -0,0 +1,34 @@
1
+ require_relative 'winrmshell'
2
+ require_relative 'winrmfinder'
3
+
4
+ module VagrantWindows
5
+ module Communication
6
+
7
+ # Factory class for generating new WinRMShell instances
8
+ class WinRMShellFactory
9
+
10
+ # @param [WindowsMachine] The Windows machine instance
11
+ # @param [WinRMFinder] The WinRMFinder instance
12
+ def initialize(windows_machine, winrm_finder)
13
+ @windows_machine = windows_machine
14
+ @winrm_finder = winrm_finder
15
+ end
16
+
17
+ # Creates a new WinRMShell instance
18
+ #
19
+ # @return [WinRMShell]
20
+ def create_winrm_shell()
21
+ WinRMShell.new(
22
+ @winrm_finder.winrm_host_address(),
23
+ @windows_machine.winrm_config.username,
24
+ @windows_machine.winrm_config.password,
25
+ {
26
+ :port => @winrm_finder.winrm_host_port(),
27
+ :timeout_in_seconds => @windows_machine.winrm_config.timeout,
28
+ :max_tries => @windows_machine.winrm_config.max_tries
29
+ })
30
+ end
31
+
32
+ end #WinShell class
33
+ end
34
+ end
@@ -3,6 +3,7 @@ require_relative '../../communication/guestnetwork'
3
3
  require_relative '../../communication/winrmshell'
4
4
  require_relative '../../errors'
5
5
  require_relative '../../helper'
6
+ require_relative '../../windows_machine'
6
7
 
7
8
  module VagrantWindows
8
9
  module Guest
@@ -14,9 +15,10 @@ module VagrantWindows
14
15
  def self.configure_networks(machine, networks)
15
16
  @@logger.debug("networks: #{networks.inspect}")
16
17
 
17
- guest_network = ::VagrantWindows::Communication::GuestNetwork.new(machine.communicate.winrmshell)
18
- unless VagrantWindows::Helper.is_vmware(machine)
19
- vm_interface_map = create_vm_interface_map(machine, guest_network)
18
+ windows_machine = VagrantWindows::WindowsMachine.new(machine)
19
+ guest_network = VagrantWindows::Communication::GuestNetwork.new(windows_machine.winrmshell)
20
+ unless windows_machine.is_vmware?()
21
+ vm_interface_map = create_vm_interface_map(windows_machine, guest_network)
20
22
  end
21
23
 
22
24
  networks.each do |network|
@@ -40,13 +42,13 @@ module VagrantWindows
40
42
  raise WindowsError, "#{network_type} network type is not supported, try static or dhcp"
41
43
  end
42
44
  end
43
- guest_network.set_all_networks_to_work() if machine.config.windows.set_work_network
45
+ guest_network.set_all_networks_to_work() if windows_machine.windows_config.set_work_network
44
46
  end
45
47
 
46
48
  #{1=>{:name=>"Local Area Connection", :mac_address=>"0800275FAC5B", :interface_index=>"11", :index=>"7"}}
47
- def self.create_vm_interface_map(machine, guest_network)
49
+ def self.create_vm_interface_map(windows_machine, guest_network)
48
50
  vm_interface_map = {}
49
- driver_mac_address = machine.provider.driver.read_mac_addresses.invert
51
+ driver_mac_address = windows_machine.read_mac_addresses.invert
50
52
  @@logger.debug("mac addresses: #{driver_mac_address.inspect}")
51
53
  guest_network.network_adapters().each do |nic|
52
54
  @@logger.debug("nic: #{nic.inspect}")
@@ -3,6 +3,10 @@ module VagrantWindows
3
3
  module Cap
4
4
  class Halt
5
5
  def self.halt(machine)
6
+ # Fix defect 129, if there's an existing scheduled reboot cancel it so shutdown succeeds
7
+ machine.communicate.execute("shutdown -a", :error_check => false)
8
+
9
+ # Force shutdown the machine now
6
10
  machine.communicate.execute("shutdown /s /t 1 /c \"Vagrant Halt\" /f /d p:4:1")
7
11
 
8
12
  # Wait until the VM's state is actually powered off. If this doesn't
@@ -12,11 +12,13 @@ module VagrantWindows
12
12
  # Vagrant 1.1.x compatibility methods
13
13
  # Implement the 1.1.x methods and call through to the new 1.2.x capabilities
14
14
 
15
+ attr_reader :windows_machine
15
16
  attr_reader :machine
16
17
 
17
18
  def initialize(machine = nil)
18
19
  super(machine) unless machine == nil
19
20
  @machine = machine
21
+ @windows_machine = ::VagrantWindows::WindowsMachine.new(machine)
20
22
  end
21
23
 
22
24
  def change_host_name(name)
@@ -32,7 +34,7 @@ module VagrantWindows
32
34
  end
33
35
 
34
36
  def mount_shared_folder(name, guestpath, options)
35
- if VagrantWindows::Helper.is_vmware(@machine) then
37
+ if @windows_machine.is_vmware?() then
36
38
  VagrantWindows::Guest::Cap::MountSharedFolder.mount_vmware_shared_folder(
37
39
  @machine, name, guestpath, options)
38
40
  else
@@ -2,6 +2,8 @@ module VagrantWindows
2
2
  module Helper
3
3
  extend self
4
4
 
5
+ @@logger = Log4r::Logger.new("vagrant_windows::helper")
6
+
5
7
  # Makes a path Windows guest friendly.
6
8
  # Turns '/vagrant' into 'c:\vagrant'
7
9
  #
@@ -22,12 +24,17 @@ module VagrantWindows
22
24
  return shared_folder_name.gsub(/[\/\/]/,'_').sub(/^_/, '')
23
25
  end
24
26
 
25
- # Checks to see if the specified machine is using VMWare Fusion or Workstation.
27
+ # Check to see if the guest is rebooting, if its rebooting then wait until its ready
26
28
  #
27
- # @return [Boolean]
28
- def is_vmware(machine)
29
- machine.provider_name.to_s().start_with?('vmware')
29
+ # @param [WindowsMachine] The windows machine instance
30
+ # @param [Int] The time in seconds to wait between checks
31
+ def wait_if_rebooting(windows_machine, wait_in_seconds=10)
32
+ @@logger.info('Checking guest reboot status')
33
+ while windows_machine.is_rebooting?
34
+ @@logger.debug('Guest is rebooting, waiting 10 seconds...')
35
+ sleep(wait_in_seconds)
36
+ end
30
37
  end
31
-
38
+
32
39
  end
33
40
  end
@@ -1,6 +1,7 @@
1
1
  require 'tempfile'
2
2
  require "#{Vagrant::source_root}/plugins/provisioners/chef/provisioner/chef_solo"
3
3
  require_relative '../../../../../helper'
4
+ require_relative '../../../../../windows_machine'
4
5
 
5
6
  module VagrantPlugins
6
7
  module Chef
@@ -14,25 +15,16 @@ module VagrantPlugins
14
15
 
15
16
  # This patch is needed until Vagrant supports chef on Windows guests
16
17
  define_method(:run_chef_solo) do
17
- is_windows ? run_chef_solo_on_windows() : run_chef_solo_on_linux.bind(self).()
18
+ is_windows? ? run_chef_solo_on_windows() : run_chef_solo_on_linux.bind(self).()
18
19
  end
19
20
 
20
21
  define_method(:provision) do
21
- wait_if_rebooting() if is_windows
22
+ windows_machine = VagrantWindows::WindowsMachine.new(@machine)
23
+ wait_if_rebooting(windows_machine) if is_windows?
22
24
  provision_on_linux.bind(self).()
23
25
  end
24
26
 
25
- def wait_if_rebooting
26
- # Check to see if the guest is rebooting, if its rebooting then wait until its ready
27
- @logger.info('Checking guest reboot status')
28
-
29
- while is_rebooting?(machine)
30
- @logger.debug('Guest is rebooting, waiting 10 seconds...')
31
- sleep(10)
32
- end
33
- end
34
-
35
- def run_chef_solo_on_windows
27
+ def run_chef_solo_on_windows
36
28
  # create cheftaskrun.ps1 that the scheduled task will invoke when run
37
29
  render_file_and_upload("cheftaskrun.ps1", chef_script_options[:chef_task_run_ps1], :options => chef_script_options)
38
30
 
@@ -116,13 +108,8 @@ module VagrantPlugins
116
108
  @chef_script_options
117
109
  end
118
110
 
119
- def is_rebooting?(machine)
120
- reboot_detect_script = VagrantWindows.load_script('reboot_detect.ps1')
121
- @machine.communicate.execute(reboot_detect_script, :error_check => false) != 0
122
- end
123
-
124
- def is_windows
125
- @machine.config.vm.guest.eql? :windows
111
+ def is_windows?
112
+ VagrantWindows::WindowsMachine.is_windows?(@machine)
126
113
  end
127
114
 
128
115
  end # ChefSolo class
@@ -1,20 +1,31 @@
1
1
  require "#{Vagrant::source_root}/plugins/provisioners/puppet/provisioner/puppet"
2
+ require_relative '../../../../../windows_machine'
3
+ require_relative '../../../../../helper'
2
4
 
3
5
  module VagrantPlugins
4
6
  module Puppet
5
7
  module Provisioner
6
8
  class Puppet < Vagrant.plugin("2", :provisioner)
9
+
10
+ include VagrantWindows::Helper
7
11
 
8
12
  # This patch is needed until Vagrant supports Puppet on Windows guests
13
+ provision_on_linux = instance_method(:provision)
9
14
  run_puppet_apply_on_linux = instance_method(:run_puppet_apply)
10
15
  configure_on_linux = instance_method(:configure)
11
16
 
12
17
  define_method(:run_puppet_apply) do
13
- is_windows ? run_puppet_apply_on_windows() : run_puppet_apply_on_linux.bind(self).()
18
+ is_windows? ? run_puppet_apply_on_windows() : run_puppet_apply_on_linux.bind(self).()
14
19
  end
15
20
 
16
21
  define_method(:configure) do |root_config|
17
- is_windows ? configure_on_windows(root_config) : configure_on_linux.bind(self).(root_config)
22
+ is_windows? ? configure_on_windows(root_config) : configure_on_linux.bind(self).(root_config)
23
+ end
24
+
25
+ define_method(:provision) do
26
+ windows_machine = VagrantWindows::WindowsMachine.new(@machine)
27
+ wait_if_rebooting(windows_machine) if is_windows?
28
+ provision_on_linux.bind(self).()
18
29
  end
19
30
 
20
31
  def run_puppet_apply_on_windows
@@ -108,8 +119,8 @@ module VagrantPlugins
108
119
  end
109
120
  end
110
121
 
111
- def is_windows
112
- @machine.config.vm.guest.eql? :windows
122
+ def is_windows?
123
+ VagrantWindows::WindowsMachine.is_windows?(@machine)
113
124
  end
114
125
 
115
126
  end # Puppet class
@@ -1,5 +1,6 @@
1
1
  require "#{Vagrant::source_root}/plugins/provisioners/shell/provisioner"
2
2
  require_relative '../../../../helper'
3
+ require_relative '../../../../windows_machine'
3
4
 
4
5
  module VagrantPlugins
5
6
  module Shell
@@ -11,13 +12,16 @@ module VagrantPlugins
11
12
  provision_on_linux = instance_method(:provision)
12
13
 
13
14
  define_method(:provision) do
14
- is_windows ? provision_on_windows() : provision_on_linux.bind(self).()
15
+ VagrantWindows::WindowsMachine.is_windows?(@machine) ? provision_on_windows() : provision_on_linux.bind(self).()
15
16
  end
16
-
17
+
17
18
  def provision_on_windows
18
19
  args = ""
19
20
  args = " #{config.args}" if config.args
20
21
 
22
+ windows_machine = VagrantWindows::WindowsMachine.new(@machine)
23
+ wait_if_rebooting(windows_machine)
24
+
21
25
  with_script_file do |path|
22
26
  # Upload the script to the machine
23
27
  @machine.communicate.tap do |comm|
@@ -80,10 +84,6 @@ module VagrantPlugins
80
84
  end
81
85
  end
82
86
 
83
- def is_windows
84
- @machine.config.vm.guest.eql? :windows
85
- end
86
-
87
87
  end # Provisioner class
88
88
  end
89
89
  end
@@ -1,3 +1,3 @@
1
1
  module VagrantWindows
2
- VERSION = "1.3.0.pre.2"
2
+ VERSION = "1.3.0.pre.3"
3
3
  end
@@ -0,0 +1,76 @@
1
+ module VagrantWindows
2
+
3
+ # Provides a wrapper around the Vagrant machine object
4
+ class WindowsMachine
5
+
6
+ attr_reader :machine
7
+
8
+ # Returns true if the specifed Vagrant machine is a Windows guest, otherwise false.
9
+ #
10
+ # @param [Machine] The Vagrant machine object
11
+ # @return [Boolean]
12
+ def self.is_windows?(machine)
13
+ machine.config.vm.guest.eql? :windows
14
+ end
15
+
16
+ # @param [Machine] The Vagrant machine object
17
+ def initialize(machine)
18
+ @machine = machine
19
+ @logger = Log4r::Logger.new("vagrant_windows::windows_machine")
20
+ end
21
+
22
+ # Checks to see if the machine is using VMWare Fusion or Workstation.
23
+ #
24
+ # @return [Boolean]
25
+ def is_vmware?()
26
+ @machine.provider_name.to_s().start_with?('vmware')
27
+ end
28
+
29
+ # Checks to see if the machine is rebooting or has a scheduled reboot.
30
+ #
31
+ # @return [Boolean] True if rebooting
32
+ def is_rebooting?()
33
+ reboot_detect_script = VagrantWindows.load_script('reboot_detect.ps1')
34
+ @machine.communicate.execute(reboot_detect_script, :error_check => false) != 0
35
+ end
36
+
37
+ # Returns the active WinRMShell for the guest.
38
+ #
39
+ # @return [WinRMShell]
40
+ def winrmshell()
41
+ @machine.communicate.winrmshell
42
+ end
43
+
44
+ # Reads the machine's MAC addresses keyed by interface index.
45
+ # {1=>"0800273FAC5A", 2=>"08002757E68A"}
46
+ #
47
+ # @return [Hash]
48
+ def read_mac_addresses()
49
+ @machine.provider.driver.read_mac_addresses
50
+ end
51
+
52
+ # Returns a list of forwarded ports for a VM.
53
+ # NOTE: For VMWare this is currently unsupported.
54
+ #
55
+ # @return [Array<Array>]
56
+ def read_forwarded_ports()
57
+ is_vmware?() ? [] : @machine.provider.driver.read_forwarded_ports
58
+ end
59
+
60
+ # Returns the SSH config for this machine.
61
+ #
62
+ # @return [Hash]
63
+ def ssh_info()
64
+ @machine.ssh_info
65
+ end
66
+
67
+ def windows_config()
68
+ @machine.config.windows
69
+ end
70
+
71
+ def winrm_config()
72
+ @machine.config.winrm
73
+ end
74
+
75
+ end
76
+ end
@@ -5,7 +5,7 @@ describe VagrantWindows::Communication::GuestNetwork , :integration => true do
5
5
  before(:all) do
6
6
  # This test requires you already have a running Windows Server 2008 R2 Vagrant VM
7
7
  # Not ideal, but you have to start somewhere
8
- @shell = VagrantWindows::Communication::WinRMShell.new("localhost", "vagrant", "vagrant")
8
+ @shell = VagrantWindows::Communication::WinRMShell.new("127.0.0.1", "vagrant", "vagrant")
9
9
  @guestnetwork = VagrantWindows::Communication::GuestNetwork.new(@shell)
10
10
  end
11
11
 
@@ -35,23 +35,5 @@ describe VagrantWindows::Helper , :unit => true do
35
35
  end
36
36
 
37
37
  end
38
-
39
- describe "is_vmware" do
40
- it "should be true for vmware_fusion" do
41
- machine = stub(:provider_name => :vmware_fusion)
42
- expect(@dummy.is_vmware(machine)).to be_true
43
- end
44
-
45
- it "should be true for vmware_workstation" do
46
- machine = stub(:provider_name => :vmware_workstation)
47
- expect(@dummy.is_vmware(machine)).to be_true
48
- end
49
-
50
- it "should be false for virtual_box" do
51
- machine = stub(:provider_name => :virtual_box)
52
- expect(@dummy.is_vmware(machine)).to be_false
53
- end
54
-
55
- end
56
38
 
57
39
  end
@@ -0,0 +1,44 @@
1
+ require 'spec_helper'
2
+ require 'mocha/api'
3
+ require 'vagrant-windows/windows_machine'
4
+
5
+ describe VagrantWindows::WindowsMachine , :unit => true do
6
+
7
+ describe "is_vmware?" do
8
+ it "should be true for vmware_fusion" do
9
+ machine = stub(:provider_name => :vmware_fusion)
10
+ windows_machine = VagrantWindows::WindowsMachine.new(machine)
11
+ expect(windows_machine.is_vmware?()).to be_true
12
+ end
13
+
14
+ it "should be true for vmware_workstation" do
15
+ machine = stub(:provider_name => :vmware_workstation)
16
+ windows_machine = VagrantWindows::WindowsMachine.new(machine)
17
+ expect(windows_machine.is_vmware?()).to be_true
18
+ end
19
+
20
+ it "should be false for virtual_box" do
21
+ machine = stub(:provider_name => :virtual_box)
22
+ windows_machine = VagrantWindows::WindowsMachine.new(machine)
23
+ expect(windows_machine.is_vmware?()).to be_false
24
+ end
25
+ end
26
+
27
+ describe "is_windows?" do
28
+ it "should return true when config vm guest is windows" do
29
+ vm = stub(:guest => :windows)
30
+ config = stub(:vm => vm)
31
+ machine = stub(:config => config)
32
+ expect(VagrantWindows::WindowsMachine.is_windows?(machine)).to be_true
33
+ end
34
+
35
+ it "should return false when config vm guest is not windows" do
36
+ vm = stub(:guest => :ubuntu)
37
+ config = stub(:vm => vm)
38
+ machine = stub(:config => config)
39
+ expect(VagrantWindows::WindowsMachine.is_windows?(machine)).to be_false
40
+ end
41
+
42
+ end
43
+
44
+ end
@@ -5,9 +5,8 @@ describe VagrantWindows::Communication::WinRMCommunicator, :integration => true
5
5
  before(:all) do
6
6
  # This test requires you already have a running Windows Server 2008 R2 Vagrant VM
7
7
  # Not ideal, but you have to start somewhere
8
- @shell = VagrantWindows::Communication::WinRMShell.new("localhost", "vagrant", "vagrant")
9
8
  @communicator = VagrantWindows::Communication::WinRMCommunicator.new({})
10
- @communicator.set_winrmshell(@shell)
9
+ @communicator.winrmshell = VagrantWindows::Communication::WinRMShell.new("127.0.0.1", "vagrant", "vagrant")
11
10
  end
12
11
 
13
12
  describe "execute" do
@@ -24,5 +23,25 @@ describe VagrantWindows::Communication::WinRMCommunicator, :integration => true
24
23
  expect { @communicator.execute("exit 1", opts) }.to raise_error(VagrantWindows::Errors::WinRMInvalidShell)
25
24
  end
26
25
  end
26
+
27
+ describe "upload" do
28
+ it "should upload the file and overwrite it if it exists" do
29
+ test_file = Tempfile.new("uploadtest")
30
+ IO.write(test_file, "hello world")
31
+ @communicator.upload(test_file, "c:\\vagrantuploadtest.txt")
32
+
33
+ # ensure we can overwrite
34
+ IO.write(test_file, "goodbye cruel world")
35
+ @communicator.upload(test_file, "c:\\vagrantuploadtest.txt")
36
+
37
+ # get the uploaded file's contents to ensure it uploaded properly
38
+ uploaded_file_content = ''
39
+ @communicator.execute("cat c:\\vagrantuploadtest.txt", {}) do |type, line|
40
+ uploaded_file_content = uploaded_file_content + line
41
+ end
42
+
43
+ expect(uploaded_file_content.chomp).to eq("goodbye cruel world")
44
+ end
45
+ end
27
46
 
28
47
  end
@@ -17,8 +17,7 @@ describe VagrantWindows::Communication::WinRMFinder, :unit => true do
17
17
  # setup the winrm config to return nil for the host (i.e. the default)
18
18
  winrm_config = VagrantWindows::Config::WinRM.new()
19
19
  winrm_config.finalize!()
20
- machine_config = stub(:winrm => winrm_config)
21
- @machine.stubs(:config).returns(machine_config)
20
+ @machine.stubs(:winrm_config).returns(winrm_config)
22
21
 
23
22
  # setup the machine ssh_info to return a 10.0.0.1
24
23
  @machine.stubs(:ssh_info).returns({ :host => '10.0.0.1' })
@@ -31,8 +30,7 @@ describe VagrantWindows::Communication::WinRMFinder, :unit => true do
31
30
  winrm_config = VagrantWindows::Config::WinRM.new()
32
31
  winrm_config.host = '10.0.0.1'
33
32
  winrm_config.finalize!()
34
- machine_config = stub(:winrm => winrm_config)
35
- @machine.stubs(:config).returns(machine_config)
33
+ @machine.stubs(:winrm_config).returns(winrm_config)
36
34
 
37
35
  # setup the machine ssh_info to return a 10.0.0.1
38
36
  @machine.stubs(:ssh_info).returns({ :host => '127.0.0.1' })
@@ -5,7 +5,7 @@ describe VagrantWindows::Communication::WinRMShell, :integration => true do
5
5
  before(:all) do
6
6
  # This test requires you already have a running Windows Server 2008 R2 Vagrant VM
7
7
  # Not ideal, but you have to start somewhere
8
- @shell = VagrantWindows::Communication::WinRMShell.new("localhost", "vagrant", "vagrant")
8
+ @shell = VagrantWindows::Communication::WinRMShell.new("127.0.0.1", "vagrant", "vagrant")
9
9
  end
10
10
 
11
11
  describe "powershell" do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vagrant-windows
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.0.pre.2
4
+ version: 1.3.0.pre.3
5
5
  prerelease: 6
6
6
  platform: ruby
7
7
  authors:
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2013-11-01 00:00:00.000000000 Z
13
+ date: 2013-11-04 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: winrm
@@ -163,6 +163,7 @@ files:
163
163
  - lib/vagrant-windows/communication/winrmcommunicator.rb
164
164
  - lib/vagrant-windows/communication/winrmfinder.rb
165
165
  - lib/vagrant-windows/communication/winrmshell.rb
166
+ - lib/vagrant-windows/communication/winrmshell_factory.rb
166
167
  - lib/vagrant-windows/config/windows.rb
167
168
  - lib/vagrant-windows/config/winrm.rb
168
169
  - lib/vagrant-windows/errors.rb
@@ -190,6 +191,7 @@ files:
190
191
  - lib/vagrant-windows/scripts/set_work_network.ps1
191
192
  - lib/vagrant-windows/scripts/winrs_v3_get_adapters.ps1
192
193
  - lib/vagrant-windows/version.rb
194
+ - lib/vagrant-windows/windows_machine.rb
193
195
  - lib/vagrant-windows.rb
194
196
  - LICENSE
195
197
  - locales/en.yml
@@ -200,6 +202,7 @@ files:
200
202
  - spec/vagrant-windows/helper_spec.rb
201
203
  - spec/vagrant-windows/mount_shared_folder_spec.rb
202
204
  - spec/vagrant-windows/windows_config_spec.rb
205
+ - spec/vagrant-windows/windows_machine_spec.rb
203
206
  - spec/vagrant-windows/winrm_config_spec.rb
204
207
  - spec/vagrant-windows/winrmcommunicator_spec.rb
205
208
  - spec/vagrant-windows/winrmfinder_spec.rb
@@ -225,7 +228,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
225
228
  version: '0'
226
229
  segments:
227
230
  - 0
228
- hash: -2247683547305016940
231
+ hash: -432043001542177050
229
232
  required_rubygems_version: !ruby/object:Gem::Requirement
230
233
  none: false
231
234
  requirements:
@@ -245,6 +248,7 @@ test_files:
245
248
  - spec/vagrant-windows/helper_spec.rb
246
249
  - spec/vagrant-windows/mount_shared_folder_spec.rb
247
250
  - spec/vagrant-windows/windows_config_spec.rb
251
+ - spec/vagrant-windows/windows_machine_spec.rb
248
252
  - spec/vagrant-windows/winrm_config_spec.rb
249
253
  - spec/vagrant-windows/winrmcommunicator_spec.rb
250
254
  - spec/vagrant-windows/winrmfinder_spec.rb