Merge pull request #4102 from mitchellh/windows-guest-rename-compat

Addressed issues with Windows guest renaming on Win7/8
This commit is contained in:
Shawn Neal 2014-07-10 13:30:15 -07:00
commit 5c148e44c3
2 changed files with 30 additions and 17 deletions

View File

@ -9,14 +9,23 @@ module VagrantPlugins
def self.change_host_name_and_wait(machine, name, sleep_timeout)
# If the configured name matches the current name, then bail
return if machine.communicate.test("if ($env:ComputerName -eq '#{name}') { exit 0 } exit 1")
# We cannot use %ComputerName% because it truncates at 15 chars
return if machine.communicate.test("if ([System.Net.Dns]::GetHostName() -eq '#{name}') { exit 0 } exit 1")
# Rename and reboot host if rename succeeded
script = <<-EOH
$computer = Get-WmiObject -Class Win32_ComputerSystem
$retval = $computer.rename("#{name}").returnvalue
if ($retval -eq 0) {
shutdown /r /t 5 /f /d p:4:1 /c "Vagrant Rename Computer"
}
exit $retval
EOH
# Rename and then reboot in one step
exit_code = machine.communicate.execute(
"netdom renamecomputer \"$Env:COMPUTERNAME\" /NewName:#{name} /Force /Reboot:0",
error_check: false)
raise Errors::RenameComputerFailed if exit_code != 0
machine.communicate.execute(
script,
error_class: Errors::RenameComputerFailed,
error_key: :rename_computer_failed)
# Don't continue until the machine has shutdown and rebooted
sleep(sleep_timeout)

View File

@ -8,7 +8,6 @@ describe "VagrantPlugins::GuestWindows::Cap::ChangeHostName" do
end
let(:machine) { double("machine") }
let(:communicator) { VagrantTests::DummyCommunicator::Communicator.new(machine) }
let(:old_hostname) { 'oldhostname' }
before do
allow(machine).to receive(:communicate).and_return(communicator)
@ -19,19 +18,24 @@ describe "VagrantPlugins::GuestWindows::Cap::ChangeHostName" do
end
describe ".change_host_name" do
let(:rename_script) { <<-EOH
$computer = Get-WmiObject -Class Win32_ComputerSystem
$retval = $computer.rename("newhostname").returnvalue
if ($retval -eq 0) {
shutdown /r /t 5 /f /d p:4:1 /c "Vagrant Rename Computer"
}
exit $retval
EOH
}
it "changes the hostname" do
communicator.stub_command('if (!($env:ComputerName -eq \'newhostname\')) { exit 0 } exit 1', exit_code: 0)
communicator.stub_command('netdom renamecomputer "$Env:COMPUTERNAME" /NewName:newhostname /Force /Reboot:0',
communicator.stub_command(
'if (!([System.Net.Dns]::GetHostName() -eq \'newhostname\')) { exit 0 } exit 1',
exit_code: 0)
communicator.stub_command(rename_script, exit_code: 0)
described_class.change_host_name_and_wait(machine, 'newhostname', 0)
end
it "raises RenameComputerFailed when exit code is non-zero" do
communicator.stub_command('if (!($env:ComputerName -eq \'newhostname\')) { exit 0 } exit 1', exit_code: 0)
communicator.stub_command('netdom renamecomputer "$Env:COMPUTERNAME" /NewName:newhostname /Force /Reboot:0',
exit_code: 123)
expect { described_class.change_host_name_and_wait(machine, 'newhostname', 0) }.
to raise_error(VagrantPlugins::GuestWindows::Errors::RenameComputerFailed)
end
end
end