Functions/Get-RSC/Get-RSCReplicationTargets.ps1
################################################ # Function - Get-RSCReplicationTargets - Getting Replication Targets connected to RSC ################################################ Function Get-RSCReplicationTargets { <# .SYNOPSIS A Rubrik Security Cloud (RSC) Reporting Module Function returning a list of all replication targets configured on all clusters. .DESCRIPTION Makes the required GraphQL API calls to RSC via Invoke-RestMethod to get the data as described, then creates a usable array of the returned information, removing the need for the PowerShell user to understand GraphQL in order to interact with RSC. .LINK GraphQL schema reference: https://rubrikinc.github.io/rubrik-api-documentation/schema/reference .OUTPUTS Returns an array of all the available information on the GraphQL endpoint in a uniform and usable format. .EXAMPLE Get-RSCReplicationTargets This example returns an array of all the information returned by the GraphQL endpoint for this object type. .NOTES Author: Joshua Stenhouse Date: 05/11/2023 #> ################################################ # Importing Module & Running Required Functions ################################################ # Importing the module is it needs other modules Import-Module RSCReporting # Checking connectivity, exiting function with error if not connected Test-RSCConnection ################################################ # Querying RSC GraphQL API ################################################ # Creating array for objects $RSCList = @() # Building GraphQL query $RSCGraphQL = @{"operationName" = "ReplicationTargetsListQuery"; "variables" = @{ "first" = 1000 }; "query" = "query ReplicationTargetsListQuery(`$after: String, `$before: String, `$first: Int) { replicationPairs(after: `$after, before: `$before, first: `$first) { edges { cursor node { configDetails { setupType sourceGateway { address ports __typename } targetGateway { address ports __typename } __typename } connectionDetails { sourceAndRubrik sourceAndTarget targetAndRubrik __typename } failedTasks isPaused networkThrottle { currentThrottleLimit defaultThrottleLimit isEnabled scheduledThrottles { throttleLimit daysOfWeek startHour endHour __typename } networkInterface __typename } runningTasks sourceCluster { id name version __typename } status storage targetCluster { id name version __typename } __typename } __typename } pageInfo { endCursor hasNextPage hasPreviousPage __typename } __typename } }" } ################################################ # API Call To RSC GraphQL URI ################################################ # Querying API $RSCResponse = Invoke-RestMethod -Method POST -Uri $RSCGraphqlURL -Body $($RSCGraphQL | ConvertTo-JSON -Depth 20) -Headers $RSCSessionHeader # Setting variable $RSCList += $RSCResponse.data.replicationPairs.edges.node # Getting all results from paginations While ($RSCResponse.data.replicationPairs.pageInfo.hasNextPage) { # Getting next set $RSCGraphQL.variables.after = $RSCResponse.data.replicationPairs.pageInfo.endCursor $RSCResponse = Invoke-RestMethod -Method POST -Uri $RSCGraphqlURL -Body $($RSCGraphQL | ConvertTo-JSON -Depth 20) -Headers $RSCSessionHeader $RSCList += $RSCResponse.data.replicationPairs.edges.node } ################################################ # Processing List ################################################ # Creating array $RSCReplicationTargets = [System.Collections.ArrayList]@() # For Each Object Getting Data ForEach ($ListObject in $RSCList) { # Setting variables $Connection = $ListObject.connectionDetails $SourceClusterStatus = $Connection.sourceAndRubrik $TargetClusterStatus = $Connection.targetAndRubrik $ConnectionStatus = $Connection.sourceAndTarget $ReplicationStatus = $ListObject.status $IsPaused = $ListObject.isPaused $Throttle = $ListObject.networkThrottle $ThrottleEnabled = $Throttle.isEnabled $RunningTasks = $ListObject.runningTasks $SourceClusterName = $ListObject.sourceCluster.name $SourceClusterID = $ListObject.sourceCluster.id $TargetClusterName = $ListObject.targetCluster.name $TargetClusterID = $ListObject.targetCluster.id $UsedBytes = $ListObject.storage # Converting bytes IF($UsedBytes -ne $null){$UsedGB = $UsedBytes / 1000 / 1000 / 1000;$UsedGB = [Math]::Round($UsedGB,2)}ELSE{$UsedGB = $null} # Creating URL $RSCReplicationURL = $RSCURL + "/remote_configs/replication_targets" # Adding To Array $Object = New-Object PSObject $Object | Add-Member -MemberType NoteProperty -Name "RSCInstance" -Value $RSCInstance $Object | Add-Member -MemberType NoteProperty -Name "SourceCluster" -Value $SourceClusterName $Object | Add-Member -MemberType NoteProperty -Name "SourceClusterID" -Value $SourceClusterID $Object | Add-Member -MemberType NoteProperty -Name "TargetCluster" -Value $TargetClusterName $Object | Add-Member -MemberType NoteProperty -Name "TargetClusterID" -Value $TargetClusterID $Object | Add-Member -MemberType NoteProperty -Name "ReplicationStatus" -Value $ReplicationStatus $Object | Add-Member -MemberType NoteProperty -Name "ConnectionStatus" -Value $ConnectionStatus $Object | Add-Member -MemberType NoteProperty -Name "SourceClusterStatus" -Value $SourceClusterStatus $Object | Add-Member -MemberType NoteProperty -Name "TargetClusterStatus" -Value $TargetClusterStatus $Object | Add-Member -MemberType NoteProperty -Name "UsedGB" -Value $UsedGB $Object | Add-Member -MemberType NoteProperty -Name "IsPaused" -Value $IsPaused $Object | Add-Member -MemberType NoteProperty -Name "ThrottleEnabled" -Value $ThrottleEnabled $Object | Add-Member -MemberType NoteProperty -Name "URL" -Value $RSCReplicationURL # Adding $RSCReplicationTargets.Add($Object) | Out-Null # End of for each object below } # End of for each object above # # Returning array Return $RSCReplicationTargets # End of function } |