Functions/Mutations/Protect-RSCObject.ps1
################################################ # Function - Protect-RSCObject - Protects an object in RSC with an SLA domain ################################################ Function Protect-RSCObject { <# .SYNOPSIS A Rubrik Security Cloud (RSC) Reporting Module Function that protects the ObjectID with the SLADomainID specified. .DESCRIPTION Recommended use case is automated protection by SDK, where automated protection by tag, vCenter, host, account etc is not appropriate. .LINK GraphQL schema reference: https://rubrikinc.github.io/rubrik-api-documentation/schema/reference .PARAMETER ObjectID The ObjectID of the object to protect, I.E a VMware VM, use Get-RSCUnprotectedObjects to obtain. .PARAMETER SLADomainID The SLADomainID of the SLA to protect, use Get-RSCSLADomains to obtain. If you use an SLADomain that is not supported by the ObjectID and/or the Rubrik cluster it's on, will error out with the messsage. .OUTPUTS Returns an array with the status of the being snapshot request. .EXAMPLE Protect-RSCObject -ObjectID $ObjectID -SLADomainID $SLADomainID Specify an unprotected objectID and a valid SLADomainID to protect it with. .NOTES Author: Joshua Stenhouse Date: 08/16/2023 #> ################################################ # Paramater Config ################################################ [CmdletBinding()] Param ( [Parameter(Mandatory=$true)] [string]$ObjectID, [Parameter(Mandatory=$true)] [string]$SLADomainID ) ################################################ # Importing Module & Running Required Functions ################################################ # Importing Import-Module RSCReporting # Checking connectivity, exiting function with error if not Test-RSCConnection # Getting protected objects to validate ObjectID $RSCObjects = Get-RSCObjects # Validating object ID exists $RSCObjectInfo = $RSCObjects | Where-Object {$_.ObjectID -eq $ObjectID} # Breaking if not IF($RSCObjectInfo -eq $null) { Write-Error "ERROR: ObjectID specified not found, check and try again.." Break } # Getting object type, as not all objects use the generic on-demand snapshot call $RSCObjectName = $RSCObjectInfo.Object $RSCObjectType = $RSCObjectInfo.Type $RSCObjectRubrikCluster = $RSCObjectInfo.RubrikCluster $RSCObjectRubrikClusterID = $RSCObjectInfo.RubrikClusterID $RSCObjectOldSLADomain = $RSCObjectInfo.SLADomain $RSCObjectOldSLADomainID = $RSCObjectInfo.SLADomainID # Getting protected objects to validate ObjectID $RSCSLADomains = Get-RSCSLADomains # Validating object ID exists $RSCSLADomainInfo = $RSCSLADomains | Where-Object {$_.SLADomainID -eq $SLADomainID} # Breaking if not IF($RSCSLADomainInfo -eq $null) { Write-Error "ERROR: SLADomainID specified not found, check and try again.." Break } # Getting object type, as not all objects use the generic on-demand snapshot call $RSCObjectNewSLADomain = $RSCSLADomainInfo.SLADomain ################################################ # API Call To RSC GraphQL URI To Assign SLA Domain ################################################ # Setting timestamp $UTCDateTime = [System.DateTime]::UtcNow # Building GraphQL query $RSCGraphQL = @{"operationName" = "AssignSlasForSnappableHierarchiesMutation"; "variables" = @{ "userNote" = "SLA Assigned By Powershell SDK" "globalExistingSnapshotRetention" = "RETAIN_SNAPSHOTS" "globalSlaAssignType" = "protectWithSlaId" "globalSlaOptionalFid" = "$SLADomainID" "objectIds" = "$ObjectID" "shouldApplyToExistingSnapshots" = $false "shouldApplyToNonPolicySnapshots" = $false }; "query" = "mutation AssignSlasForSnappableHierarchiesMutation( `$globalExistingSnapshotRetention: GlobalExistingSnapshotRetention, `$globalSlaOptionalFid: UUID, `$globalSlaAssignType: SlaAssignTypeEnum!, `$objectIds: [UUID!]!, `$applicableSnappableTypes: [WorkloadLevelHierarchy!], `$shouldApplyToExistingSnapshots: Boolean, `$shouldApplyToNonPolicySnapshots: Boolean, `$userNote: String) { assignSlasForSnappableHierarchies( globalExistingSnapshotRetention: `$globalExistingSnapshotRetention, globalSlaOptionalFid: `$globalSlaOptionalFid, globalSlaAssignType: `$globalSlaAssignType, objectIds: `$objectIds, applicableSnappableTypes: `$applicableSnappableTypes, shouldApplyToExistingSnapshots: `$shouldApplyToExistingSnapshots, shouldApplyToNonPolicySnapshots: `$shouldApplyToNonPolicySnapshots, userNote: `$userNote ) { success } }" } # Querying API $RSCResponse = Invoke-RestMethod -Method POST -Uri $RSCGraphqlURL -Body $($RSCGraphQL | ConvertTo-JSON -Depth 20) -Headers $RSCSessionHeader # Checking for permission errors IF($RSCResponse.errors.message){$RSCResponse.errors.message} # Getting response $JobResponse = $RSCResponse.data.assignSlasForSnappableHierarchies.success ################################################ # Returing Job Info ################################################ # Deciding outcome if no error messages IF($RSCResponse.errors.message -eq $null){$RequestStatus = "SUCCESS"}ELSE{$RequestStatus = "FAILED"} # Overring if not success on response IF($JobResponse -ne $TRUE){$RequestStatus = "FAILED"} # Adding ErrorReason $ErrorReason = $null IF($RSCResponse.errors.message -eq "INTERNAL: Archival location is not specified in the cluster."){$ErrorReason = "The SLADomainID specified is not valid for the ObjectID, resolve or use a different SLADomainID."} # Adding To Array $Object = New-Object PSObject $Object | Add-Member -MemberType NoteProperty -Name "RSCInstance" -Value $RSCInstance $Object | Add-Member -MemberType NoteProperty -Name "Object" -Value $RSCObjectName $Object | Add-Member -MemberType NoteProperty -Name "ObjectType" -Value $RSCObjectType $Object | Add-Member -MemberType NoteProperty -Name "ObjectID" -Value $ObjectID $Object | Add-Member -MemberType NoteProperty -Name "RubrikCluster" -Value $RSCObjectRubrikCluster $Object | Add-Member -MemberType NoteProperty -Name "RubrikClusterID" -Value $RSCObjectRubrikClusterID $Object | Add-Member -MemberType NoteProperty -Name "OldSLADomain" -Value $RSCObjectOldSLADomain $Object | Add-Member -MemberType NoteProperty -Name "OldSLADomainID" -Value $RSCObjectOldSLADomainID $Object | Add-Member -MemberType NoteProperty -Name "NewSLADomain" -Value $RSCObjectNewSLADomain $Object | Add-Member -MemberType NoteProperty -Name "NewSLADomainID" -Value $SLADomainID $Object | Add-Member -MemberType NoteProperty -Name "RequestDateUTC" -Value $UTCDateTime $Object | Add-Member -MemberType NoteProperty -Name "RequestStatus" -Value $RequestStatus $Object | Add-Member -MemberType NoteProperty -Name "ErrorMessage" -Value $RSCResponse.errors.message $Object | Add-Member -MemberType NoteProperty -Name "ErrorReason" -Value $ErrorReason # Returning array Return $Object # End of function } |