CloudAccount/CloudAccount.psm1

using module '../Common/Result'
Import-Module -Name @(Join-Path  $PSScriptRoot .. | Join-Path -ChildPath Util | Join-Path -ChildPath Util)
function Get-RMCloudAccountsForCurrentProject {
    param(
        [string] $AccountType
    )

    $LoginStatus = Test-UserLoggedIn
    if ($LoginStatus.ReturnCode -eq [RMReturn]::ERROR) {
        return $LoginStatus
    }

    $CurrentProjectId = Get-Variable -Name "RMContext-CurrentProjectId" -ValueOnly

    $PageIndex = 0
    $HeartBeatingCloudAccounts = @{}
    $NonHeartBeatingCloudAccounts = @{}
    do {
        $Response = Get-RMCloudAccountInternal -OrganizationId $CurrentProjectId -AccountType $AccountType -PageNumber $PageIndex
        foreach ($ResponseContent in $Response.content) {
            if ([bool]($ResponseContent.PSObject.Properties.name -match "appliance") -and $ResponseContent.appliance.heartbeat_status) {
                $HeartBeatingCloudAccounts.Add($ResponseContent.name, $ResponseContent)
            } else {
                $NonHeartBeatingCloudAccounts.Add($ResponseContent.name, $ResponseContent)
            }
        }
        $PageIndex++
    } while ($PageIndex -lt $Response.page.totalPages)

    return $HeartBeatingCloudAccounts, $NonHeartBeatingCloudAccounts
}

function Get-RMCloudAccountByName {
    param(
        [string] $CloudAccountName,
        [string] $AccountType
    )
    $HeartBeatingCloudAccounts, $NonHeartBeatingCloudAccounts = Get-RMCloudAccountsForCurrentProject -AccountType $AccountType
    if($NonHeartBeatingCloudAccounts.Keys -contains $CloudAccountName) {
        return $null, "The TargetCloud '$CloudAccountName' is not ready for use, please provide a different TargetCloud"
    }

    if ($HeartBeatingCloudAccounts.Keys -notcontains $CloudAccountName) {
        $ProjectName = Get-Variable -Name "RMContext-CurrentProjectName" -ValueOnly
        $OrgName = Get-Variable -Name "RMContext-CurrentOrganizationName" -ValueOnly
        throw [System.Management.Automation.ItemNotFoundException]::new(`
            "TargetCloud '$CloudAccountName' does not exist in current project '$ProjectName' of organization '$OrgName'")
    }

    return $HeartBeatingCloudAccounts[$CloudAccountName], $null
}

function Get-CachedCloudAttribute {
    param(
        [System.Object] $CloudAccount
    )

    $RMLoginResult = Get-Variable -Name "RMContext-UserLogin" -ValueOnly
    $Uri = Get-Variable -Name "RMContext-ReactorURI" -ValueOnly

    $Headers = @{
        Accept = "application/rm+json"
        "X-Auth-Token" = $RMLoginResult.token
    }

    $Params = @{
        Method = "Get"
        Uri = $Uri + "/cloudaccounts/" + $CloudAccount.id + "/cachedattributes"
        Headers = $Headers
    }

    return Invoke-RMRestMethod -Params $Params
}

function Get-CloudAttributesSummary {
    param(
        [System.Object] $CloudAccount
    )
    $RMLoginResult = Get-Variable -Name "RMContext-UserLogin" -ValueOnly
    $Uri = Get-Variable -Name "RMContext-ReactorURI" -ValueOnly

    $Headers = @{
        Accept = "application/rm+json"
        "X-Auth-Token" = $RMLoginResult.token
    }

    $Params = @{
        Method = "Get"
        Uri = $Uri + "/cloudaccounts/" + $CloudAccount.id + "/attributes?summary=true"
        Headers = $Headers
    }

    return Invoke-RMRestMethod -Params $Params
}

function Get-RMCloudAccountInternal {
    param(
        [string] $OrganizationId,
        [string] $AccountType,
        [int] $PageNumber
    )

    $RMLoginResult = Get-Variable -Name "RMContext-UserLogin"
    $Uri = Get-Variable -Name "RMContext-ReactorURI"

    $Headers = @{
        Accept = "application/rm+json"
        "X-Auth-Token" = $RMLoginResult.Value.token
    }

    $Params = @{
        Method = "Get"
        Uri = $Uri.Value + "/organizations/" + $OrganizationId + "/cloudaccounts?type=" + $AccountType + "&size=25&page=" + $PageNumber + "&sort=created_at%2Cdesc"
        Headers = $Headers
    }
    return Invoke-RMRestMethod -Params $Params
}

function Read-RMCloudAccount {
    param(
        [string] $AccountType
    )

    while ($true) {
        $CloudAccountName = ""
        $HeartBeatingCloudAccounts, $NonHeartBeatingCloudAccounts = Get-RMCloudAccountsForCurrentProject -AccountType $AccountType
        if (0 -eq $HeartBeatingCloudAccounts.Keys.Count) {
            $CloudAccountName = Read-Host "Enter target cloud"
        } elseif (1 -eq $HeartBeatingCloudAccounts.Keys.Count) {
            $CloudAccountName = $HeartBeatingCloudAccounts.Keys[0]
            $ReadValue = Read-Host "Enter target cloud [$CloudAccountName]"
            if ("" -ne $ReadValue) {
                $CloudAccountName = $ReadValue
            }
        } else {
            $CloudAccountNames = $HeartBeatingCloudAccounts.Keys -join ","
            $CloudAccountName = Read-Host "Enter target cloud ($CloudAccountNames)"    
        }
        
        if ("" -eq $CloudAccountName) {
            Write-RMError -Message "Target cloud is required"
            continue
        }

        if($NonHeartBeatingCloudAccounts.Keys -contains $CloudAccountName) {
            Write-RMError -Message "The target cloud '$CloudAccountName' is not ready for use, please enter a different target cloud"
            continue
        }

        if ($HeartBeatingCloudAccounts.Keys -notcontains $CloudAccountName) {
            Write-RMError -Message "Invalid target cloud name"
            continue
        }
    
        return $HeartBeatingCloudAccounts[$CloudAccountName]
    }
}

function Get-RMVMBasedCloudAccountBySource {
    param (
        [System.Object] $Source,
        [string] $AccountType
    )
    $HeartBeatingCloudAccounts, $NonHeartBeatingCloudAccounts = Get-RMCloudAccountsForCurrentProject -AccountType $AccountType
    foreach ($CloudAccount in $HeartBeatingCloudAccounts.Values) {
        if ($CloudAccount.appliance.id -eq $Source.appliance_id) {
            return $CloudAccount
        }
    }

    return $null
}
Export-ModuleMember -Function Get-RMCloudAccountsForCurrentProject, Get-RMCloudAccountByName, `
    Get-CachedCloudAttribute, Get-CloudAttributesSummary, Read-RMCloudAccount, Get-RMVMBasedCloudAccountBySource