Toolkit/Public/Get-RscWorkload.ps1

#Requires -Version 3
function Get-RscWorkload {
    <#
    .SYNOPSIS
    Retrieves workloads managed by Rubrik Security Cloud.

    .DESCRIPTION
    Returns protectable objects (workloads) across all workload types. This is a
    cross-workload search that spans VMs, databases, filesets, and other object types.
    You can filter by name, type, SLA compliance status, protection status, cluster,
    or organization. Use -Id to retrieve specific workloads by RSC ID, or -CdmId
    with -Cluster to look up a workload by its CDM-side identifier.

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

    .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
    # Get all workloads
    Get-RscWorkload

    .EXAMPLE
    # Get all workloads from a specific SLA
    Get-RscSla -Name "Gold" | Get-RscWorkload

    .EXAMPLE
    # Get all out-of-compliance workloads on a specific cluster
    Get-RscCluster -Name "MyCluster" | Get-RscWorkload -ComplianceStatus OUT_OF_COMPLIANCE

    .EXAMPLE
    # Get workloads of a specific type
    Get-RscWorkload -Type WINDOWS_FILESET
    #>

    [CmdletBinding(DefaultParameterSetName = "Name")]
    Param(
        [Parameter(
            Mandatory = $false,
            ParameterSetName = "CdmId"
        )]
        [String]$CdmId,
        [Parameter(
            Mandatory = $false,
            ParameterSetName = "Id"
        )]
        [String[]]$Id,
        [Parameter(
            Mandatory = $false
        )]
        [RubrikSecurityCloud.Types.ObjectTypeEnum[]]$Type,
        [Parameter(
            Mandatory = $false
        )]
        [RubrikSecurityCloud.Types.ObjectTypeEnum[]]$ExcludeType,
        [Parameter(
            Mandatory = $false
        )]
        [RubrikSecurityCloud.Types.ObjectState[]]$State,
        [Parameter(
            Mandatory = $false
        )]
        [RubrikSecurityCloud.Types.ComplianceStatusEnum[]]$ComplianceStatus,
        [Parameter(
            Mandatory = $false
        )]
        [RubrikSecurityCloud.Types.SlaComplianceTimeRange]$ComplianceTimeRange = [RubrikSecurityCloud.Types.SlaComplianceTimeRange]::UNKNOWN,
        [Parameter(
            Mandatory = $false
        )]
        [RubrikSecurityCloud.Types.ProtectionStatusEnum[]]$ProtectionStatus,
        [Parameter(
            Mandatory = $false
        )]
        [String]$SearchTerm,
        [Parameter(
            Mandatory = $false,
            ValueFromPipeline = $true
        )]
        [RubrikSecurityCloud.Types.GlobalSlaReply]$Sla,
        [Parameter(
            Mandatory = $false,
            ValueFromPipeline = $true
        )]
        [RubrikSecurityCloud.Types.Cluster]$Cluster,
        [Parameter(
            Mandatory = $false,
            ValueFromPipeline = $true
        )]
        [RubrikSecurityCloud.Types.Org]$Org,
        [Parameter(
            Mandatory = $false
        )]
        [switch]$AsQuery

    )
    
    Process {

        $query = New-RscQuery -Gql snappableConnection
        $query.Field.Nodes[0].Id = "FOO"
        $query.Field.Nodes[0].Location = "FOO"
        $query.Field.Nodes[0].complianceStatus = [RubrikSecurityCloud.Types.ComplianceStatusEnum]::IN_COMPLIANCE
        $query.Field.Nodes[0].protectionStatus = [RubrikSecurityCloud.Types.ProtectionStatusEnum]::PROTECTED
        $query.Field.Nodes[0].objectType = [RubrikSecurityCloud.Types.ObjectTypeEnum]::VMWARE_VIRTUAL_MACHINE
        $query.Field.Nodes[0].objectState = [RubrikSecurityCloud.Types.ObjectState]::ACTIVE
        $query.Field.Nodes[0].protectedOn = [System.Datetime]"1/1/2000"
        $query.Field.Nodes[0].totalSnapshots = 1
        $query.Field.Nodes[0].missedSnapshots = 1
        $query.Field.Nodes[0].lastSnapshot = [System.Datetime]"1/1/2000"
        $query.Field.Nodes[0].latestArchivalSnapshot = [System.Datetime]"1/1/2000"
        $query.Field.Nodes[0].latestReplicationSnapshot = [System.Datetime]"1/1/2000"
        $query.Field.Nodes[0].localOnDemandSnapshots = 1
        $query.Field.Nodes[0].localSlaSnapshots = 1
        $query.Field.Nodes[0].archivalSnapshotLag = 1
        $query.Field.Nodes[0].replicationSnapshotLag = 1
        $query.Field.Nodes[0].archivalComplianceStatus = [RubrikSecurityCloud.Types.ComplianceStatusEnum]::IN_COMPLIANCE
        $query.Field.Nodes[0].replicationComplianceStatus = [RubrikSecurityCloud.Types.ComplianceStatusEnum]::IN_COMPLIANCE
        $query.Field.Nodes[0].awaitingFirstFull = $true
        $query.Field.Nodes[0].pullTime = [System.Datetime]"1/1/2000"
        $query.Field.Nodes[0].location = "FOO"
        $query.Field.Nodes[0].localStorage = 1
        $query.Field.Nodes[0].localMeteredData = 1
        $query.Field.Nodes[0].usedBytes = 1
        $query.Field.Nodes[0].provisionedBytes = 1
        $query.Field.Nodes[0].localProtectedData = 1
        $query.Field.Nodes[0].localEffectiveStorage = 1
        $query.Field.Nodes[0].lastSnapshotLogicalBytes = 1
        $query.Field.Nodes[0].orgId = "FOO"
        $query.Field.Nodes[0].sourceProtocol = "FOO"
        $query.Field.Nodes[0].ncdPolicyName = "FOO"
        $query.Field.Nodes[0].ncdLatestArchiveSnapshot = [System.Datetime]"1/1/2000"
        $query.Field.Nodes[0].slaDomain = New-Object RubrikSecurityCloud.Types.GlobalSlaReply
        $query.Field.Nodes[0].slaDomain.name = "FOO"
        $query.Field.Nodes[0].slaDomain.id = "FOO"
        $query.Field.Nodes[0].cluster = New-Object RubrikSecurityCloud.Types.Cluster
        $query.Field.Nodes[0].cluster.name = "FOO"
        $query.Field.Nodes[0].cluster.id = "FOO"
        $query.Field.Nodes[0].fid = "FOO"
        $query.Field.Nodes[0].localSnapshots = 1
        $query.Field.Nodes[0].replicaSnapshots = 1
        $query.Field.Nodes[0].physicalBytes = 1
        $query.Field.Nodes[0].transferredBytes = 1
        $query.Field.Nodes[0].logicalBytes = 1
        $query.Field.Nodes[0].replicaStorage = 1
        $query.Field.Nodes[0].archiveStorage = 1
        $query.Field.Nodes[0].dataReduction = 1
        $query.Field.Nodes[0].logicalDataReduction = 1
        $query.Field.Nodes[0].workloadOrg = New-Object RubrikSecurityCloud.Types.WorkloadOrganization
        $query.Field.Nodes[0].workloadOrg.name = "FOO"
        $query.Field.Nodes[0].workloadOrg.id = "FOO"

        $query.var.filter = New-Object -TypeName RubrikSecurityCloud.Types.SnappableFilterInput

        if ($CdmId) {
            if (!$Cluster) {
                throw "Must provide Cluster to get workload by CDM ID"
            }
            else {
                # Run workloadForeverId, add Id to snappableConnectionFilter then run snappableConnection
                $fidQuery = New-RscQuery -Gql workloadForeverId
                $fidQuery.var.clusterUuid = $Cluster.Id
                $fidQuery.var.managedId = $CdmId
                $fidQueryResult = Invoke-Rsc $fidQuery
                $ForeverId = $fidQueryResult
                $Id = $ForeverId
            }
        }
        if ($Type) {
            $query.var.filter.objectType = $Type
        }
        if ($Id) {
            $query.var.filter.ObjectFid = $Id
        }
        if ($State) {
            $query.var.filter.objectState = $State
        }
        if ($ComplianceStatus) {
            $query.var.filter.complianceStatus = $ComplianceStatus
        }
        if ($ComplianceTimeRange -ne [RubrikSecurityCloud.Types.SlaComplianceTimeRange]::UNKNOWN) {
            $query.var.filter.slaTimeRange = $ComplianceTimeRange
        }
        if ($ProtectionStatus) {
            $query.var.filter.protectionStatus = $ProtectionStatus
        }
        if ($Sla) {
            $slaFilter = New-Object -TypeName RubrikSecurityCloud.Types.SnappableSlaDomainFilterInput
            $slaFilter.Id = $Sla.Id
            $query.var.filter.slaDomain = $slaFilter
        }
        if ($Cluster) {
            $clusterFilter = New-Object -TypeName RubrikSecurityCloud.Types.CommonClusterFilterInput
            $clusterFilter.Id = $Cluster.Id
            $query.var.filter.cluster = $clusterFilter
        }
        if ($Org) {
            $query.var.filter.orgId = $Org.Id
        }
        if ($PSBoundParameters.ContainsKey('AsQuery')) {
            $query
        }
        else {
            $result = Invoke-Rsc -Query $query
            $result.nodes
        }
    }
}