Toolkit/Public/Get-RscMssqlLinkedAvailabilityGroup.ps1

#Requires -Version 3
function Get-RscMssqlLinkedAvailabilityGroup {
    <#
    .SYNOPSIS
    Retrieves linked MSSQL availability groups protected by Rubrik Security Cloud
 
    .DESCRIPTION
    This cmdlet uses the GQL query 'mssqlAvailabilityGroupVirtualGroups' to retrieve a list of linked MSSQL availability groups with a predetermined set of properties.
 
    .LINK
    Schema reference:
    https://rubrikinc.github.io/rubrik-api-documentation/schema/reference
 
    .EXAMPLE
    # Get all linked availability groups
    Get-RscMssqlLinkedAvailabilityGroups
 
    .EXAMPLE
    # Get linked availability group with specific name
    Get-RscMssqlLinkedAvailabilityGroups -Name "jake-001"
 
    #>


    [CmdletBinding(
        DefaultParameterSetName = "Name"
    )]
    Param(
        [Parameter(
            Position = 0,
            Mandatory = $false,
            ParameterSetName = "Name"
        )]
        [String]$Name,
        [Parameter(
            Mandatory = $false,
            ParameterSetName = "Name"
        )]
        [switch]$Relic,
        [Parameter(
            Mandatory = $false,
            ParameterSetName = "Name"
        )]
        [switch]$Replica,
        [Parameter(
            Mandatory = $false,
            ValueFromPipeline = $true,
            ParameterSetName = "Name"
        )]
        [RubrikSecurityCloud.Types.GlobalSlaReply]$Sla,
        [Parameter(
            Mandatory = $false,
            ValueFromPipeline = $true,
            ParameterSetName = "Name"
        )]
        [RubrikSecurityCloud.Types.Cluster]$Cluster,
        [Parameter(
            Mandatory = $false,
            ValueFromPipeline = $true,
            ParameterSetName = "Name"
        )]
        [RubrikSecurityCloud.Types.Org]$Org,
        
        # Returns API query object
        [Parameter()]
        [switch]$AsQuery
    )
    
    Process {

        $query = New-RscQuery -GqlQuery mssqlAvailabilityGroupVirtualGroups
        $query.var.filters = @()

        if ($Name) {
            $nameFilter = New-Object -TypeName RubrikSecurityCloud.Types.MssqlAvailabilityGroupVirtualGroupFilterInput
            $nameFilter.Field = [RubrikSecurityCloud.Types.MssqlAvailabilityGroupVirtualGroupFilterField]::NAME
            $nameFilter.texts = $Name
            $query.var.filters += $nameFilter
        }

        if ($Sla) {
            $slaFilter = New-Object -TypeName RubrikSecurityCloud.Types.MssqlAvailabilityGroupVirtualGroupFilterInput
            $slaFilter.Field = [RubrikSecurityCloud.Types.MssqlAvailabilityGroupVirtualGroupFilterField]::EFFECTIVE_SLA_WITH_RETENTION_SLA
            $slaFilter.Texts = $Sla.id
            $query.var.filters += $slaFilter
        }

        if ($Cluster) {
            $clusterFilter = New-Object -TypeName RubrikSecurityCloud.Types.MssqlAvailabilityGroupVirtualGroupFilterInput
            $clusterFilter.Field = [RubrikSecurityCloud.Types.MssqlAvailabilityGroupVirtualGroupFilterField]::CLUSTER_UUID
            $clusterFilter.Texts = $Cluster.id
            $query.var.filters += $clusterFilter
        }

        if ($Org) {
            $orgFilter = New-Object -TypeName RubrikSecurityCloud.Types.MssqlAvailabilityGroupVirtualGroupFilterInput
            $orgFilter.Field = [RubrikSecurityCloud.Types.MssqlAvailabilityGroupVirtualGroupFilterField]::ORG_ID
            $orgFilter.Texts = $Org.id
            $query.var.filters += $orgFilter
        }

        if ($PSBoundParameters.ContainsKey('relic')) {
            $relicFilter = New-Object -TypeName RubrikSecurityCloud.Types.MssqlAvailabilityGroupVirtualGroupFilterInput
            $relicFilter.Field = [RubrikSecurityCloud.Types.MssqlAvailabilityGroupVirtualGroupFilterField]::IS_RELIC
            $relicFilter.Texts = $Relic
            $query.var.filters += $relicFilter
        }

        if ($PSBoundParameters.ContainsKey('replica')) {
            $replicaFilter = New-Object -TypeName RubrikSecurityCloud.Types.MssqlAvailabilityGroupVirtualGroupFilterInput
            $replicaFilter.Field = [RubrikSecurityCloud.Types.MssqlAvailabilityGroupVirtualGroupFilterField]::IS_REPLICATED
            $replicaFilter.Texts = $replica
            $query.var.filters += $replicaFilter
        }

        $query.Field.nodes = @(
            # Doesn't work. Get-RscType: Cannot dynamically create an instance of type 'System.String'. Reason: Uninitialized Strings cannot be created.
            # Get-RscType -Name MssqlAvailabilityGroupVirtualGroup -InitialProperties name,linkedFids
            New-Object -TypeName RubrikSecurityCloud.Types.MssqlAvailabilityGroupVirtualGroup
        )
        $query.Field.nodes[0].Name = "FETCH"
        $query.Field.Nodes[0].LinkedFids = @(1)
        $query.Field.nodes[0].Groups = Get-RscType -Name MssqlAvailabilityGroup -InitialProperties name,id


        if ($AsQuery.IsPresent) {
            return $query
        }
        else {
            $result = Invoke-Rsc -Query $query
            $result.nodes
        }

    } 
}