Functions/Public/Test-VMHostNetworking.ps1
<# .Synopsis Test host networking .Description Pings addresses from each provided VMkernel port of VMHosts provided .Parameter VMHosts The VMHosts you want to ping from. Can be a single host or multiple hosts provided by the pipeline. Wildcards are supported .Parameter VMkernel The VMkernel ports to ping from .Parameter IpAddress The IP addresses to ping .Parameter Mtu The ping buffer size (Use 1472 for standard frames and 8972 for jumbo frames) .Example PS C:\>$vmhosts = "esxi*" PS C:\>$mgmt_vmks = 'vmk0' PS C:\>$mgmt_addrs = Get-VMHostNetworkAdapter -VMHost $vmhosts -Name $mgmt_vmks | select -ExpandProperty IP PS C:\>Test-VMHostNetworking -VMHosts $vmhosts -VMkernelPort $mgmt_vmks -IpAddress $mgmt_addrs Ping sweep complete. No failures detected. .Link https://github.com/Dapacruz/VMware.VimAutomation.Custom #> function Test-VMHostNetworking { [CmdletBinding()] Param ( [Parameter(ValueFromPipeline, ValueFromPipelineByPropertyName, Mandatory, Position=0)] [Alias('Name')] [string[]]$VMHosts, [Parameter(Mandatory)] [string[]]$VMkernelPort, [Parameter(Mandatory)] [string[]]$IpAddress, [int]$Mtu = 1472, [int]$Count = 1, [float]$Wait = .001, [switch]$ShowReport ) Begin { $failures = 0 $report = @() } Process { # Expand to full hostname in case wildcards are used $VMHosts = Get-VMHost -Name $VMHosts foreach ($VMHost in $VMHosts) { $esxcli = Get-EsxCli -VMHost $vmhost -V2 $ping = $esxcli.network.diag.ping foreach ($vmk in $VMkernelPort) { for ($i=1; $i -le $Count; $i++) { $obj = New-Object -TypeName PSObject $obj.PSTypeNames.Insert(0,'VMware.VimAutomation.Custom.Test.VMHostNetworking') Add-Member -InputObject $obj -MemberType NoteProperty -Name VMHost -Value $VMHost Add-Member -InputObject $obj -MemberType NoteProperty -Name VMkernelPort -Value $vmk if ($Count -gt 1) { Add-Member -InputObject $obj -MemberType NoteProperty -Name Count -Value $i } foreach ($addr in $IpAddress) { $params = $ping.CreateArgs() $params.host = $addr $params.interface = $vmk $params.size = $mtu $params.df = $true $params.wait = $Wait $params.count = 1 Write-Verbose "Pinging $addr from $vmk on $VMHost ..." $results = $ping.Invoke($params) $rtt = $results.Summary.RoundtripAvgMS if ($results.Summary.PacketLost -ne 0) { Write-Warning "Ping failed on $vmhost ($vmk): $addr" Add-Member -InputObject $obj -MemberType NoteProperty -Name "$addr RTT (ms)" -Value - $failures++ } else { Add-Member -InputObject $obj -MemberType NoteProperty -Name "$addr RTT (ms)" -Value $rtt } if ($results.Summary.Duplicated -gt 0) { Write-Warning "Duplicate address detected on $vmhost ($vmk): $addr" } } $report += $obj } } } } End { if ($failures -eq 0) { Write-Host 'Ping sweep complete. No failures detected.' } else { Write-Host "Ping sweep complete. Failures detected: $failures." } if ($ShowReport) { Write-Output $report } } } |