Toolkit/Public/Get-RscMssqlAvailabilityGroup.ps1

#Requires -Version 3
function Get-RscMssqlAvailabilityGroup {
    <#
    .SYNOPSIS
    Retrieve info about MSSQL Availability Groups

    .DESCRIPTION
    Retrieve info about MSSQL Availability Groups. An Availability Group is a Parent Object to a database.
    If your database is in an AG, then you will want to use this cmdlet, but if not you will want to get the Instance information
    using Get-RscMssqlInstance.

    .LINK
    Schema reference:
    https://rubrikinc.github.io/rubrik-api-documentation/schema/reference

    .PARAMETER Id
    Used to return a specific Availability Groups based on the Id assigned inside of Rubrik

    .PARAMETER Name
    Used to return a specific Availability Groups based on the name of the Availability Group
    
    .PARAMETER Cluster
    Cluster object retrieved via Get-RscCluster
    
    .PARAMETER Sla
    SLA object retrieved via Get-RscCluster

    .PARAMETER Relic
    Switch to include or exclude relics

    .PARAMETER Replica
    Switch to include or exclude replicated AGs

    .PARAMETER AsQuery
    Return the query object instead of running the query.
    Preliminary read-only queries may still run to gather IDs or
    other data needed to build the main query.

    .EXAMPLE
    Returns a list of Availability Groups in Rubrik, including relics and replicas.
    Get-RscMssqlAvailabilityGroup

    .EXAMPLE
    Returns information about a specific Availability Group based on the Rubrik ID
    Get-RscMssqlAvailabilityGroup -Id "86da734b-2fee-4fdc-bdc8-a73ab5648f"

    .EXAMPLE
    Returns information about a specific Availability Group based on the name of the AG.
    Get-RscMssqlAvailabilityGroup -Name AG_Accounting -Relic:$false -Replica:$false

    .EXAMPLE
    Returns a list of Availability Groups that are connected to a specific Rubrik Cluster
    Get-RscCluster -Name "example" | Get-RscMssqlAvailabilityGroup -Relic:$false -Replica:$false

    .EXAMPLE
    Returns information about a specific Availability Group based on the name of the AG and the name of the Rubrik Cluster
    Get-RscCluster -Name "example" | Get-RscMssqlAvailabilityGroup -Name AG_Accounting -Relic:$false -Replica:$false
    #>


    [CmdletBinding(
        DefaultParameterSetName = "List"
    )]
    Param(
        # DEPRECATED. Providing -List is superfluous. Running Get-RscMssqlAvailabilityGroup with no arguments will return a list. This argument will be ignored.
        [Parameter(ParameterSetName = "List", Mandatory = $false)]
        [Switch]$List,
        
        # Rubrik id of the availability group
        [Parameter(ParameterSetName = "Id",Mandatory = $true)]
        [String]$Id,

        # Name of the availability group
        [Parameter(
            ParameterSetName = "Name",
            Mandatory = $false,
            Position = 0
        )]
        [Alias("AvailabilityGroupName")] # standardizing on -Name across cmdlets. Leaving alias for backward compatibility.
        [String]$Name,

        # Sla Domain object
        [Parameter(
            Mandatory = $false,
            ValueFromPipeline = $true,
            ParameterSetName = "Name"
        )]
        [RubrikSecurityCloud.Types.GlobalSlaReply]$Sla,
        
        # Rubrik cluster
        [Parameter(
            Mandatory = $false,
            ValueFromPipeline = $true,
            ParameterSetName = "Name"
        )]
        [Alias("RscCluster")] # standardizing on -Cluster across cmdlets. Leaving alias for backward compatibility.
        [RubrikSecurityCloud.Types.Cluster]$Cluster,

        # DEPRECATED. -Detail was intended to provide a more detailed view of the objects, however the definitions of "detail" resulted in the potential to pull inaccessible fields.
        # Detail is now the default, and the field definition is managed in the cmdlet code.
        [Parameter(
            Mandatory = $false, 
            ValueFromPipeline = $false
        )][Switch]$Detail,

        # Include Relics
        [Parameter(
            Mandatory = $false
        )]
        [switch]$Relic,

        # Include Replicas
        [Parameter(
            Mandatory = $false
        )]
        [switch]$Replica,

        # Return .NET query object for troubleshooting
        [Parameter(
            Mandatory = $false
        )]
        [switch]$AsQuery
    )
    
    Process {
        Write-Debug "- Running Get-RscMssqlAvailabilityGroup"

        $agFieldDef = Get-RscType -Name MssqlAvailabilityGroup -InitialProperties `
            name,`
            id,`
            cluster.name, cluster.id,`
            primaryClusterLocation.name, primaryClusterLocation.clusterUuid
        
        # This is required because Get-RscType sets it as a ClusterSla, not a globalSlaReply
        $agFieldDef.effectiveSlaDomain = Get-RscType -Name GlobalSlaReply -InitialProperties name,Id
        
         if ($Id) {
            $query = New-RscQuery -Gql mssqlAvailabilityGroup
            $query.Var.filter = @()
            $query.Var.fid = $id
            $query.Field = $agFieldDef
            if ($PSBoundParameters.ContainsKey("AsQuery")) {
                $query
            }
            else {
                $query.invoke()
            }

         }
         else {
            $query = New-RscQuery -Gql mssqlTopLevelDescendants
            $query.var.typeFilter = [RubrikSecurityCloud.Types.HierarchyObjectTypeEnum]::MSSQL_AVAILABILITY_GROUP
            $query.Var.filter = @()
            $query.Field.Nodes = $agFieldDef

            if ($Name) {
                $nameFilter = New-Object -TypeName RubrikSecurityCloud.Types.Filter
                # Regex filter doesn't work in the API right now, but we're going to play pretend.
                # With real Regex, users could search for VMs that start with the letter A if they wanted.
                if ($name.Contains("*")) {
                    $name.Replace("*",'')
                    $nameFilter.Field = [RubrikSecurityCloud.Types.HierarchyFilterField]::REGEX
                    $nameFilter.texts = $Name.Replace("*",'')
                } else {
                    $nameFilter.Field = [RubrikSecurityCloud.Types.HierarchyFilterField]::NAME_EXACT_MATCH
                    $nameFilter.texts = $Name
                }
                $query.var.filter += $nameFilter
            }
            if ($Sla) {
                $slaFilter = New-Object -TypeName RubrikSecurityCloud.Types.Filter
                $slaFilter.Field = [RubrikSecurityCloud.Types.HierarchyFilterField]::EFFECTIVE_SLA
                $slaFilter.Texts = $Sla.id
                $query.var.filter += $slaFilter
            }
            if($Cluster) {
                $clusterFilter = New-Object -TypeName RubrikSecurityCloud.Types.Filter
                $clusterFilter.Field = [RubrikSecurityCloud.Types.HierarchyFilterField]::CLUSTER_ID
                $clusterFilter.texts = $Cluster.Id
                $query.Var.filter += $clusterFilter
            }
            if ($PSBoundParameters.ContainsKey('relic')) {
                $relicFilter = New-Object -TypeName RubrikSecurityCloud.Types.Filter
                $relicFilter.Field = [RubrikSecurityCloud.Types.HierarchyFilterField]::IS_RELIC
                $relicFilter.Texts = $Relic
                $query.var.filter += $relicFilter
            }
            if ($PSBoundParameters.ContainsKey('replica')) {
                $replicaFilter = New-Object -TypeName RubrikSecurityCloud.Types.Filter
                $replicaFilter.Field = [RubrikSecurityCloud.Types.HierarchyFilterField]::IS_REPLICATED
                $replicaFilter.Texts = $Replica
                $query.var.filter += $replicaFilter
            }

            if ($PSBoundParameters.ContainsKey("AsQuery")) {
                $query
            }
            else {
                $query.invoke().nodes
            }
         }
    } 
}