Functions/Get-AHSavingsReport.ps1


Function Get-AHSavingsReport {
    <#
.SYNOPSIS
    Retrieves a list of changes that can be made to a subscription to cut costs

.DESCRIPTION
    Get-AHSavingsReport is a function that compiles a list of changes for each subscription
    to cut costs utilizing other functions in the AzureHelper module.

.PARAMETER AllSubscriptions
    Run this command against all subscriptions.

.PARAMETER Subscription
    Specifies the subscription to run against. The default is the current subscription.

.PARAMETER ReportPath
    Specifies the path the report should be output to

.PARAMETER IncludeCost
    Include cost data in the output for supported resources - This makes the command take about 25x longer to run.

.EXAMPLE
    Get-AHSavingsReport -AllSubscriptions

.INPUTS
    String

.OUTPUTS
    CSV
    HTML

.NOTES
    Author: Paul Harrison
#>

    [CmdletBinding()]
    param (
        [Switch]
        $AllSubscriptions,

        [bool]
        $HTML = $true,

        [bool]
        $CSV = $true,

        [Parameter(ValueFromPipeline = $true)]
        $Subscription,

        [string]
        $ReportPath = ".\",

        [switch]
        $IncludeCost
    )
    begin {
        Test-AHEnvironment
        #validate ReportPath here
        If (!(Test-Path $ReportPath)) {
            Throw("Invalid Path")
        }
        Else {
            $ReportPath = (Convert-Path $ReportPath) + '\' 
        }
        $ArgumentList = @()
        $ArgumentList += $CSV
        $ArgumentList += $HTML
        $MyScriptBlock = {
            param($CSV, $HTML)
            $ReportName = (Get-AzContext).name.split('(')[0].replace(' ', '')
            
            Write-Progress -Activity "Checking for savings" -Status (Get-AzContext).Subscription.Name -PercentComplete (100 * $subCount / $($subs.count))

            $UnusedDisks = Get-AHUnusedDisks -IncludeCost:$IncludeCost
            $UnusedNICs = Get-AHUnusedNICs -IncludeCost:$IncludeCost
            $UnusedPIPs = Get-AHUnusedPIPs #-IncludeCost:$IncludeCost
            $DBAllocation = Get-AHDBAllocation -IncludeCost:$IncludeCost
            $ExtraDiskGBPaidFor = Get-AHExtraDiskGBPaidFor
            $AHNonHubWindowsServers = Get-AHNonHubWindowsServers

            $MyScriptBlock2 = { (get-azvm -Status | Select-Object Name, PowerState, @{N = 'Size'; E = { $_.HardwareProfile.Size } }, ResourceGroupName, @{N = 'Subscription'; E = { (Get-AzContext).Subscription.Name } }) }
            $VMStatus = Invoke-AzureCommand -ScriptBlock $MyScriptBlock2 #-AllSubscriptions
            #$VMStatus | Where-Object { $_.PowerState -eq 'VM deallocated' } | Export-Csv DeallocatedVMs.csv

            If ($CSV) {
                $UnusedDisks  | Export-Csv $($ReportPath + $ReportName + '-Savings-UnusedDisks.csv') -NoTypeInformation
                $UnusedNICs   | Export-Csv $($ReportPath + $ReportName + '-Savings-UnusedNICs.csv') -NoTypeInformation
                $UnusedPIPs   | Export-Csv $($ReportPath + $ReportName + '-Savings-UnusedPIPs.csv') -NoTypeInformation
                $DBAllocation | Export-Csv $($ReportPath + $ReportName + '-Savings-DBAllocation.csv') -NoTypeInformation
                $ExtraDiskGBPaidFor | Export-Csv $($ReportPath + $ReportName + '-Savings-ExtraDiskGBPaidFor.csv') -NoTypeInformation
                $AHNonHubWindowsServers | Export-Csv  $($ReportPath + $ReportName + '-Savings-NonAHUBWindowsServers.csv') -NoTypeInformation
                $VMStatus | Where-Object { $_.PowerState -eq 'VM deallocated' } | Export-Csv  $($ReportPath + $ReportName + '-Savings-DeallocatedVMs.csv') -NoTypeInformation
            }
            If ($HTML) {
                "<h1>" + (Get-Date) + "</h1>" | Out-File $($ReportPath + $ReportName + '-Savings.html') -Append
                "<h1>Unused Disks</h1>" | Out-File $($ReportPath + $ReportName + '-Savings.html') -Append
                $UnusedDisks  | ConvertTo-Html | Out-File $($ReportPath + $ReportName + '-Savings.html') -Append
                "<h1>Unused NICs</h1>" | Out-File $($ReportPath + $ReportName + '-Savings.html') -Append
                $UnusedNICs   | ConvertTo-Html | Out-File $($ReportPath + $ReportName + '-Savings.html') -Append
                "<h1>Unused PIPs</h1>" | Out-File $($ReportPath + $ReportName + '-Savings.html') -Append
                $UnusedPIPs   | ConvertTo-Html | Out-File $($ReportPath + $ReportName + '-Savings.html') -Append
                "<h1>DB Allocation</h1>" | Out-File $($ReportPath + $ReportName + '-Savings.html') -Append
                $DBAllocation | ConvertTo-Html | Out-File $($ReportPath + $ReportName + '-Savings.html') -Append
                "<h1>Extra Disk GB Paid For</h1>" | Out-File $($ReportPath + $ReportName + '-Savings.html') -Append
                $ExtraDiskGBPaidFor | ConvertTo-Html | Out-File $($ReportPath + $ReportName + '-Savings.html') -Append
                "<h1>Non hybrid benefit Windows Servers</h1>" | Out-File $($ReportPath + $ReportName + '-Savings.html') -Append
                $AHNonHubWindowsServers | ConvertTo-Html | Out-File $($ReportPath + $ReportName + '-Savings.html') -Append
                
                "<h1>Deallocated VMs</h1>" | Out-File $($ReportPath + $ReportName + '-Savings.html') -Append
                $VMStatus | Where-Object { $_.PowerState -eq 'VM deallocated' } | ConvertTo-Html | Out-File $($ReportPath + $ReportName + '-Savings.html') -Append
            }
        }
    }
    process {
        if ($Subscription) { $Subscription | Invoke-AzureCommand -ScriptBlock $MyScriptBlock -ArgumentList $ArgumentList }
        else { Invoke-AzureCommand -ScriptBlock $MyScriptBlock -AllSubscriptions:$AllSubscriptions -ArgumentList $ArgumentList }
    }

}