Merge pull request #4102 from mitchellh/windows-guest-rename-compat
Addressed issues with Windows guest renaming on Win7/8
This commit is contained in:
commit
5c148e44c3
|
@ -9,14 +9,23 @@ module VagrantPlugins
|
||||||
|
|
||||||
def self.change_host_name_and_wait(machine, name, sleep_timeout)
|
def self.change_host_name_and_wait(machine, name, sleep_timeout)
|
||||||
# If the configured name matches the current name, then bail
|
# 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
|
machine.communicate.execute(
|
||||||
exit_code = machine.communicate.execute(
|
script,
|
||||||
"netdom renamecomputer \"$Env:COMPUTERNAME\" /NewName:#{name} /Force /Reboot:0",
|
error_class: Errors::RenameComputerFailed,
|
||||||
error_check: false)
|
error_key: :rename_computer_failed)
|
||||||
|
|
||||||
raise Errors::RenameComputerFailed if exit_code != 0
|
|
||||||
|
|
||||||
# Don't continue until the machine has shutdown and rebooted
|
# Don't continue until the machine has shutdown and rebooted
|
||||||
sleep(sleep_timeout)
|
sleep(sleep_timeout)
|
||||||
|
|
|
@ -8,7 +8,6 @@ describe "VagrantPlugins::GuestWindows::Cap::ChangeHostName" do
|
||||||
end
|
end
|
||||||
let(:machine) { double("machine") }
|
let(:machine) { double("machine") }
|
||||||
let(:communicator) { VagrantTests::DummyCommunicator::Communicator.new(machine) }
|
let(:communicator) { VagrantTests::DummyCommunicator::Communicator.new(machine) }
|
||||||
let(:old_hostname) { 'oldhostname' }
|
|
||||||
|
|
||||||
before do
|
before do
|
||||||
allow(machine).to receive(:communicate).and_return(communicator)
|
allow(machine).to receive(:communicate).and_return(communicator)
|
||||||
|
@ -19,19 +18,24 @@ describe "VagrantPlugins::GuestWindows::Cap::ChangeHostName" do
|
||||||
end
|
end
|
||||||
|
|
||||||
describe ".change_host_name" do
|
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
|
it "changes the hostname" do
|
||||||
communicator.stub_command('if (!($env:ComputerName -eq \'newhostname\')) { exit 0 } exit 1', exit_code: 0)
|
communicator.stub_command(
|
||||||
communicator.stub_command('netdom renamecomputer "$Env:COMPUTERNAME" /NewName:newhostname /Force /Reboot:0',
|
'if (!([System.Net.Dns]::GetHostName() -eq \'newhostname\')) { exit 0 } exit 1',
|
||||||
exit_code: 0)
|
exit_code: 0)
|
||||||
|
communicator.stub_command(rename_script, exit_code: 0)
|
||||||
described_class.change_host_name_and_wait(machine, 'newhostname', 0)
|
described_class.change_host_name_and_wait(machine, 'newhostname', 0)
|
||||||
end
|
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
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in New Issue