From 38fed5469711d6feb309617f64f803e50bf0ccc4 Mon Sep 17 00:00:00 2001 From: Chris Roberts Date: Fri, 28 Jul 2017 10:18:26 -0700 Subject: [PATCH] Update guest IP address discovery for hyper-v guests. Powershell helper script now returns error when guest IP address cannot be discovered. When reading addresses from a network device both IPv4 and IPv6 are stored and the IPv4 address has precedence on returned address. --- .../hyperv/action/wait_for_ip_address.rb | 24 ++++++++------ .../hyperv/scripts/get_network_config.ps1 | 33 ++++++++++++++----- 2 files changed, 38 insertions(+), 19 deletions(-) diff --git a/plugins/providers/hyperv/action/wait_for_ip_address.rb b/plugins/providers/hyperv/action/wait_for_ip_address.rb index 2ea8f6be7..683b2e01d 100644 --- a/plugins/providers/hyperv/action/wait_for_ip_address.rb +++ b/plugins/providers/hyperv/action/wait_for_ip_address.rb @@ -23,19 +23,23 @@ module VagrantPlugins return if env[:interrupted] # Try to get the IP - network_info = env[:machine].provider.driver.read_guest_ip - guest_ip = network_info["ip"] + begin + network_info = env[:machine].provider.driver.read_guest_ip + guest_ip = network_info["ip"] - if guest_ip - begin - IPAddr.new(guest_ip) - break - rescue IPAddr::InvalidAddressError - # Ignore, continue looking. - @logger.warn("Invalid IP address returned: #{guest_ip}") + if guest_ip + begin + IPAddr.new(guest_ip) + break + rescue IPAddr::InvalidAddressError + # Ignore, continue looking. + @logger.warn("Invalid IP address returned: #{guest_ip}") + end end + rescue Errors::PowerShellError + # Ignore, continue looking. + @logger.warn("Failed to read guest IP.") end - sleep 1 end end diff --git a/plugins/providers/hyperv/scripts/get_network_config.ps1 b/plugins/providers/hyperv/scripts/get_network_config.ps1 index b8eab5f9a..b50c2902f 100644 --- a/plugins/providers/hyperv/scripts/get_network_config.ps1 +++ b/plugins/providers/hyperv/scripts/get_network_config.ps1 @@ -7,21 +7,36 @@ Param( $Dir = Split-Path $script:MyInvocation.MyCommand.Path . ([System.IO.Path]::Combine($Dir, "utils\write_messages.ps1")) -$ip_address = "" $vm = Get-VM -Id $VmId -ErrorAction "Stop" $networks = Get-VMNetworkAdapter -VM $vm foreach ($network in $networks) { if ($network.IpAddresses.Length -gt 0) { - $ip_address = $network.IpAddresses[0] - if (-Not ([string]::IsNullOrEmpty($ip_address))) { - # We found our IP address! - break + foreach ($ip_address in $network.IpAddresses) { + if ($ip_address.Contains(".")) { + $ip4_address = $ip_address + } elseif ($ip_address.Contains(":")) { + $ip6_address = $ip_address + } + if (-Not ([string]::IsNullOrEmpty($ip4_address)) -Or -Not ([string]::IsNullOrEmpty($ip6_address))) { + # We found our IP address! + break + } } } } -$resultHash = @{ - ip = "$ip_address" +if (-Not ([string]::IsNullOrEmpty($ip4_address))) { + $guest_ipaddress = $ip4_address +} elseif (-Not ([string]::IsNullOrEmpty($ip6_address))) { + $guest_ipaddress = $ip6_address +} + +if (-Not ([string]::IsNullOrEmpty($guest_ipaddress))) { + $resultHash = @{ + ip = $guest_ipaddress + } + $result = ConvertTo-Json $resultHash + Write-Output-Message $result +} else { + Write-Error-Message "Failed to determine IP address" } -$result = ConvertTo-Json $resultHash -Write-Output-Message $result