Scripts/ProtectionJobRun/Set-CohesitySnapshotRetention.ps1

function Set-CohesitySnapshotRetention {
    <#
        .SYNOPSIS
        Changes the retention of the snapshots associated with a Protection Job.
        .DESCRIPTION
        Changes the retention of the snapshots associated with a Protection Job. Returns success if the retention for snapshots is updated successfully.
        .NOTES
        Published by Cohesity
        .LINK
        https://cohesity.github.io/cohesity-powershell-module/#/README
        .EXAMPLE
        Set-CohesitySnapshotRetention -JobName Test-Job -JobRunId 2123 -ExtendByDays 30
        Extends the retention of the snapshots associated with the specified Protection Job and Job Run Id by 30 days.
        .EXAMPLE
        Set-CohesitySnapshotRetention -JobName Test-Job -JobRunId 2123 -ReduceByDays 30
        Reduces the retention of the snapshots associated with the specified Protection Job and Job Run Id by 30 days.
        .EXAMPLE
        Set-CohesitySnapshotRetention -JobName Test-Job -JobRunId 2123 -ExtendByDays 30 -SourceIds 883
        Extends the retention of the snapshots associated with only the specified Source Id (such as a VM), Protection Job and Job Run Id by 30 days.
    #>

    [CmdletBinding(DefaultParameterSetName = 'ExtendRetention', SupportsShouldProcess = $True, ConfirmImpact = "High")]
    Param(
        [Parameter(Mandatory = $true)]
        [ValidateNotNullOrEmpty()]
        # The name of the Protection Job.
        [string]$JobName,
        [Parameter(Mandatory = $true)]
        [ValidateNotNullOrEmpty()]
        # The unique id of the Protection Job Run.
        [long]$JobRunId,
        [Parameter(Mandatory = $true, ParameterSetName = "ExtendRetention")]
        [ValidateNotNullOrEmpty()]
        # Specifies the number of days by which the Snapshot retention will be extended.
        [long]$ExtendByDays,
        [Parameter(Mandatory = $true, ParameterSetName = "ReduceRetention")]
        [ValidateNotNullOrEmpty()]
        # Specifies the number of days by which the Snapshot retention will be reduced.
        [long]$ReduceByDays,
        [Parameter(Mandatory = $false)]
        # Specifies the source ids to only select snapshots belonging to these source ids.
        [long[]]$SourceIds = $null
    )

    Begin {
        if (-not (Test-Path -Path "$HOME/.cohesity")) {
            throw "Failed to authenticate. Please connect to the Cohesity Cluster using 'Connect-CohesityCluster'"
        }
        $cohesitySession = Get-Content -Path $HOME/.cohesity | ConvertFrom-Json
        $cohesityCluster = $cohesitySession.ClusterUri
        $cohesityToken = $cohesitySession.Accesstoken.Accesstoken
    }

    Process {
        if ($PSCmdlet.ShouldProcess($JobRunId)) {
            $jobs = Get-CohesityProtectionJob
            $job = $jobs | Where-Object { $_.name -eq $JobName }
            if ($null -eq $job) {
                Write-Output "No job found with the name '$JobName'"
                return
            }
            $jobRuns = Get-CohesityProtectionJobRun -JobName $JobName
            if ($null -eq $jobRuns) {
                Write-Output "Job runs not found for job '$JobName'"
                return
            }
            $jobRun = $jobRuns | Where-Object { $_.BackupRun.JobRunId -eq $JobRunId }
            if ($null -eq $jobRun) {
                Write-Output "The job run '$JobRunId' does not exists for job '$JobName'"
                return
            }

            $cohesityClusterURL = $cohesityCluster + '/irisservices/api/v1/public/protectionRuns'
            $cohesityHeaders = @{'Authorization' = 'Bearer ' + $cohesityToken }

            [long]$retentionDays = 0
            if ($ExtendByDays) {
                $retentionDays = $ExtendByDays
            }
            elseif ($ReduceByDays) {
                $retentionDays = - $ReduceByDays
            }
            $targetObject = @{
                type                = "kLocal"
                daysToKeep          = $retentionDays
                holdForLegalPurpose = $null
            }
            $copyRunTargetsObject = @()
            $copyRunTargetsObject += $targetObject
            $jobUidObject = @{
                ClusterId            = $null
                ClusterIncarnationId = $null
                Id                   = $null
            }
            if ($job.IsActive -eq $false) {
                # using a private API for protection job in remote clusters
                # find out the job run for a partcular job
                $backupRunURL = $cohesityCluster + '/irisservices/api/v1/backupjobruns?allUnderHierarchy=true&id=' + $job.id
                $resp = Invoke-RestApi -Method Get -Uri $backupRunURL -Headers $cohesityHeaders
                $searchedJobRun = $resp | Where-Object { $_.backupJobRuns.jobDescription.name -eq $JobName }
                if ($null -eq $searchedJobRun) {
                    Write-Output "Could not find backup run details for inactive job '$JobName'"
                    return
                }
                $jobUidObject.ClusterId = $searchedJobRun.backupJobRuns.jobDescription.primaryJobUid.ClusterId
                $jobUidObject.ClusterIncarnationId = $searchedJobRun.backupJobRuns.jobDescription.primaryJobUid.ClusterIncarnationId
                $jobUidObject.Id = $searchedJobRun.backupJobRuns.jobDescription.primaryJobUid.objectId

            }
            else {
                $jobUidObject.ClusterId = $jobRun.JobUid.ClusterId
                $jobUidObject.ClusterIncarnationId = $jobRun.JobUid.ClusterIncarnationId
                $jobUidObject.Id = $jobRun.JobUid.Id
            }

            $jobRunObject = @{
                copyRunTargets    = $copyRunTargetsObject
                runStartTimeUsecs = $jobRun.CopyRun[0].RunStartTimeUsecs
                jobUid            = $jobUidObject
                sourceIds         = $SourceIds
            }
            $jobRunsObject = @()
            $jobRunsObject += $jobRunObject
            $payload = @{
                jobRuns = $jobRunsObject
            }
            $payloadJson = $payload | ConvertTo-Json -Depth 100
            $resp = Invoke-RestApi -Method Put -Uri $cohesityClusterURL -Headers $cohesityHeaders -Body $payloadJson

            $success = $false
            # there is no response to the API call. Therefore using the response status to identify
            if ($Global:CohesityAPIResponse) {
                if ($Global:CohesityAPIResponse.StatusCode -eq 204) {
                    $success = $true
                }
            }
            if ($success -eq $true) {
                $message = $null
                if ($ExtendByDays) {
                    $message = "Extended the snapshot retention successfully"
                }
                elseif ($ReduceByDays) {
                    $message = "Reduced the snapshot retention successfully"
                }
                $message
            }
            else {
                $errorMsg = "Snapshot retention : Failed to update the snapshot"
                Write-Output $errorMsg
                CSLog -Message $errorMsg
            }
        }
    }

    End {
    }
}