Src/Private/Get-AbrVSphereVMHostStorage.ps1

function Get-AbrVSphereVMHostStorage {
    <#
    .SYNOPSIS
        Used by As Built Report to retrieve VMware vSphere ESXi VMHost Storage information.
    .NOTES
        Version: 2.0.0
        Author: Tim Carman
        Twitter: @tpcarman
        Github: tpcarman
    #>

    [CmdletBinding()]
    param ()

    begin {
        $LocalizedData = $reportTranslate.GetAbrVSphereVMHostStorage
    }

    process {
        try {
            Write-PScriboMessage -Message $LocalizedData.Collecting
            #region ESXi Host Storage Section
            Section -Style Heading4 $LocalizedData.SectionHeading {
                Paragraph ($LocalizedData.ParagraphSummary -f $VMHost)

                #region ESXi Host Datastore Specifications
                $VMHostDatastores = $VMHost | Get-Datastore | Where-Object { ($_.State -eq 'Available') -and ($_.CapacityGB -gt 0) } | Sort-Object Name
                if ($VMHostDatastores) {
                    Section -Style NOTOCHeading5 -ExcludeFromTOC $LocalizedData.DatastoreSpecs {
                        $VMHostDsSpecs = foreach ($VMHostDatastore in $VMHostDatastores) {

                            $VMHostDsUsedPercent = if (0 -in @($VMHostDatastore.FreeSpaceGB, $VMHostDatastore.CapacityGB)) { 0 } else { [math]::Round((100 - (($VMHostDatastore.FreeSpaceGB) / ($VMHostDatastore.CapacityGB) * 100)), 2) }
                            $VMHostDsFreePercent = if (0 -in @($VMHostDatastore.FreeSpaceGB, $VMHostDatastore.CapacityGB)) { 0 } else { [math]::Round(($VMHostDatastore.FreeSpaceGB / $VMHostDatastore.CapacityGB) * 100, 2) }
                            $VMHostDsUsedCapacityGB = ($VMHostDatastore.CapacityGB) - ($VMHostDatastore.FreeSpaceGB)

                            [PSCustomObject]@{
                                $LocalizedData.Datastore = $VMHostDatastore.Name
                                $LocalizedData.DatastoreType = $VMHostDatastore.Type
                                $LocalizedData.Version = if ($VMHostDatastore.FileSystemVersion) {
                                    $VMHostDatastore.FileSystemVersion
                                } else {
                                    '--'
                                }
                                $LocalizedData.NumberOfVMs = $VMHostDatastore.ExtensionData.VM.Count
                                $LocalizedData.TotalCapacity = Convert-DataSize $VMHostDatastore.CapacityGB
                                $LocalizedData.UsedCapacity = "{0} ({1}%)" -f (Convert-DataSize $VMHostDsUsedCapacityGB), $VMHostDsUsedPercent
                                $LocalizedData.FreeCapacity = "{0} ({1}%)" -f (Convert-DataSize $Datastore.FreeSpaceGB), $VMHostDsFreePercent
                                $LocalizedData.PercentUsed = $VMHostDsUsedPercent
                            }
                        }
                        if ($Healthcheck.Datastore.CapacityUtilization) {
                            $VMHostDsSpecs | Where-Object { $_.$($LocalizedData.PercentUsed) -ge 90 } | Set-Style -Style Critical -Property $LocalizedData.UsedCapacity, $LocalizedData.FreeCapacity
                            $VMHostDsSpecs | Where-Object { $_.$($LocalizedData.PercentUsed) -ge 75 -and $_.$($LocalizedData.PercentUsed) -lt 90 } | Set-Style -Style Warning -Property $LocalizedData.UsedCapacity, $LocalizedData.FreeCapacity
                        }
                        $TableParams = @{
                            Name = ($LocalizedData.TableDatastores -f $VMHost)
                            Columns = $LocalizedData.Datastore, $LocalizedData.DatastoreType, $LocalizedData.Version, $LocalizedData.NumberOfVMs, $LocalizedData.TotalCapacity, $LocalizedData.UsedCapacity, $LocalizedData.FreeCapacity
                            ColumnWidths = 21, 10, 9, 9, 17, 17, 17
                        }
                        if ($Report.ShowTableCaptions) {
                            $TableParams['Caption'] = "- $($TableParams.Name)"
                        }
                        $VMHostDsSpecs | Sort-Object $LocalizedData.Datastore | Table @TableParams
                    }
                }
                #endregion ESXi Host Datastore Specifications

                #region ESXi Host Storage Adapter Information
                $VMHostHbas = $VMHost | Get-VMHostHba | Sort-Object Device
                if ($VMHostHbas) {
                    #region ESXi Host Storage Adapters Section
                    Section -Style NOTOCHeading5 -ExcludeFromTOC $LocalizedData.StorageAdapters {
                        Paragraph ($LocalizedData.ParagraphStorageAdapters -f $VMHost)
                        foreach ($VMHostHba in $VMHostHbas) {
                            $Target = ((Get-View $VMHostHba.VMhost).Config.StorageDevice.ScsiTopology.Adapter | Where-Object { $_.Adapter -eq $VMHostHba.Key }).Target
                            $LUNs = Get-ScsiLun -Hba $VMHostHba -LunType "disk" -ErrorAction SilentlyContinue
                            $Paths = ($Target | ForEach-Object { $_.Lun.Count } | Measure-Object -Sum)
                            Section -Style NOTOCHeading5 -ExcludeFromTOC "$($VMHostHba.Device)" {
                                $VMHostStorageAdapter = [PSCustomObject]@{
                                    $LocalizedData.AdapterName = $VMHostHba.Device
                                    $LocalizedData.AdapterType = switch ($VMHostHba.Type) {
                                        'FibreChannel' { $LocalizedData.FC }
                                        'IScsi' { $LocalizedData.iSCSI }
                                        'ParallelScsi' { $LocalizedData.ParallelSCSI }
                                        default { $TextInfo.ToTitleCase($VMHostHba.Type) }
                                    }
                                    $LocalizedData.AdapterModel = $VMHostHba.Model
                                    $LocalizedData.AdapterStatus = $TextInfo.ToTitleCase($VMHostHba.Status)
                                    $LocalizedData.AdapterTargets = $Target.Count
                                    $LocalizedData.AdapterDevices = $LUNs.Count
                                    $LocalizedData.AdapterPaths = $Paths.Sum
                                }
                                $MemberProps = @{
                                    'InputObject' = $VMHostStorageAdapter
                                    'MemberType' = 'NoteProperty'
                                }
                                if ($VMHostStorageAdapter.$($LocalizedData.AdapterType) -eq $LocalizedData.iSCSI) {
                                    $iScsiAuthenticationMethod = switch ($VMHostHba.ExtensionData.AuthenticationProperties.ChapAuthenticationType) {
                                        'chapProhibited' { $LocalizedData.ChapNone }
                                        'chapPreferred' { $LocalizedData.ChapUniPreferred }
                                        'chapDiscouraged' { $LocalizedData.ChapUniRequired }
                                        'chapRequired' {
                                            switch ($VMHostHba.ExtensionData.AuthenticationProperties.MutualChapAuthenticationType) {
                                                'chapProhibited' { $LocalizedData.ChapUnidirectional }
                                                'chapRequired' { $LocalizedData.ChapBidirectional }
                                            }
                                        }
                                        default { $VMHostHba.ExtensionData.AuthenticationProperties.ChapAuthenticationType }
                                    }
                                    Add-Member @MemberProps -Name $LocalizedData.iSCSIName -Value $VMHostHba.IScsiName
                                    if ($VMHostHba.IScsiAlias) {
                                        Add-Member @MemberProps -Name $LocalizedData.iSCSIAlias -Value $VMHostHba.IScsiAlias
                                    } else {
                                        Add-Member @MemberProps -Name $LocalizedData.iSCSIAlias -Value '--'
                                    }
                                    if ($VMHostHba.CurrentSpeedMb) {
                                        Add-Member @MemberProps -Name $LocalizedData.AdapterSpeed -Value "$($VMHostHba.CurrentSpeedMb) Mb"
                                    } else {
                                        Add-Member @MemberProps -Name $LocalizedData.AdapterSpeed -Value '--'
                                    }
                                    if ($VMHostHba.ExtensionData.ConfiguredSendTarget) {
                                        Add-Member @MemberProps -Name $LocalizedData.DynamicDiscovery -Value (($VMHostHba.ExtensionData.ConfiguredSendTarget | ForEach-Object { "$($_.Address)" + ":" + "$($_.Port)" }) -join [Environment]::NewLine)
                                    } else {
                                        Add-Member @MemberProps -Name $LocalizedData.DynamicDiscovery -Value '--'
                                    }
                                    if ($VMHostHba.ExtensionData.ConfiguredStaticTarget) {
                                        Add-Member @MemberProps -Name $LocalizedData.StaticDiscovery -Value (($VMHostHba.ExtensionData.ConfiguredStaticTarget | ForEach-Object { "$($_.Address)" + ":" + "$($_.Port)" + " " + "$($_.IScsiName)" }) -join [Environment]::NewLine)
                                    } else {
                                        Add-Member @MemberProps -Name $LocalizedData.StaticDiscovery -Value '--'
                                    }
                                    if ($iScsiAuthenticationMethod -eq $LocalizedData.ChapNone) {
                                        Add-Member @MemberProps -Name $LocalizedData.AuthMethod -Value $iScsiAuthenticationMethod
                                    } elseif ($iScsiAuthenticationMethod -eq $LocalizedData.ChapBidirectional) {
                                        Add-Member @MemberProps -Name $LocalizedData.AuthMethod -Value $iScsiAuthenticationMethod
                                        Add-Member @MemberProps -Name $LocalizedData.CHAPOutgoing -Value $VMHostHba.ExtensionData.AuthenticationProperties.ChapName
                                        Add-Member @MemberProps -Name $LocalizedData.CHAPIncoming -Value $VMHostHba.ExtensionData.AuthenticationProperties.MutualChapName
                                    } else {
                                        Add-Member @MemberProps -Name $LocalizedData.AuthMethod -Value $iScsiAuthenticationMethod
                                        Add-Member @MemberProps -Name $LocalizedData.CHAPOutgoing -Value $VMHostHba.ExtensionData.AuthenticationProperties.ChapName
                                    }
                                    if ($InfoLevel.VMHost -ge 4) {
                                        Add-Member @MemberProps -Name $LocalizedData.AdvancedOptions -Value (($VMHostHba.ExtensionData.AdvancedOptions | ForEach-Object { "$($_.Key) = $($_.Value)" }) -join [Environment]::NewLine)
                                    }
                                }
                                if ($VMHostStorageAdapter.$($LocalizedData.AdapterType) -eq $LocalizedData.FC) {
                                    Add-Member @MemberProps -Name $LocalizedData.NodeWWN -Value (([String]::Format("{0:X}", $VMHostHba.NodeWorldWideName) -split "(\w{2})" | Where-Object { $_ -ne "" }) -join ":")
                                    Add-Member @MemberProps -Name $LocalizedData.PortWWN -Value (([String]::Format("{0:X}", $VMHostHba.PortWorldWideName) -split "(\w{2})" | Where-Object { $_ -ne "" }) -join ":")
                                    Add-Member @MemberProps -Name $LocalizedData.AdapterSpeed -Value $VMHostHba.Speed
                                }
                                if ($Healthcheck.VMHost.StorageAdapter) {
                                    $VMHostStorageAdapter | Where-Object { $_.$($LocalizedData.AdapterStatus) -ne $LocalizedData.Online } | Set-Style -Style Warning -Property $LocalizedData.AdapterStatus
                                    $VMHostStorageAdapter | Where-Object { $_.$($LocalizedData.AdapterStatus) -eq $LocalizedData.Offline } | Set-Style -Style Critical -Property $LocalizedData.AdapterStatus
                                }
                                $TableParams = @{
                                    Name = ($LocalizedData.TableStorageAdapter -f $VMHostStorageAdapter.$($LocalizedData.AdapterName), $VMHost)
                                    List = $true
                                    ColumnWidths = 25, 75
                                }
                                if ($Report.ShowTableCaptions) {
                                    $TableParams['Caption'] = "- $($TableParams.Name)"
                                }
                                $VMHostStorageAdapter | Table @TableParams
                            }
                        }
                    }
                    #endregion ESXi Host Storage Adapters Section
                }
                #endregion ESXi Host Storage Adapter Information
            }
        } catch {
            Write-PScriboMessage -IsWarning $($_.Exception.Message)
        }
        #endregion ESXi Host Storage Section
    }

    end {}
}