Scripts/Restore/Restore-CohesityOracleDatabase.ps1

function Restore-CohesityOracleDatabase {
    <#
        .SYNOPSIS
        From cluster restores the specified Oracle database from a previous backup.
        .DESCRIPTION
        From cluster restores the specified Oracle database from a previous backup.
        .NOTES
        Published by Cohesity
        .LINK
        https://cohesity.github.io/cohesity-powershell-module/#/README
        .EXAMPLE
        Restore-CohesityOracleDatabase -SourceName 10.2.14.31 -TargetSourceId 1277 -JobId 31520 -TargetHostId 770 -NewDatabaseName CohesityDB_r1
        Restore Oracle database from cluster with database id 1279 , database instance id 1277 and job id as 31520
    #>


    [CmdletBinding(DefaultParameterSetName = "Default", SupportsShouldProcess = $True, ConfirmImpact = "High")]
    Param(
        [Parameter(Mandatory = $false)]
        # Specifies the name of the restore task.
        [string]$TaskName = "Restore-Oracle-Object-" + (Get-Date -Format "dddd-MM-dd-yyyy-HH-mm-ss").ToString(),
        [Parameter(Mandatory = $true)]
        # Specifies the source name of the Oracle database to restore. This can be obtained using Get-CohesityProtectionSource -Environments kOracle.
        [string]$SourceName,
        [Parameter(Mandatory = $true)]
        # Specifies a name of the database to recover.
        [string]$SourceDatabaseName,
        [Parameter(Mandatory = $true)]
        # Specifies the Oracle home directory path.
        [string]$OracleHome,
        [Parameter(Mandatory = $true)]
        # Specifies the Oracle base directory path.
        [string]$OracleBase,
        [Parameter(Mandatory = $true)]
        # Specifies the id of Oracle source id to restore the database.
        [long]$TargetSourceId,
        [Parameter(Mandatory = $true)]
        [ValidateRange(1, [long]::MaxValue)]
        # Specifies the job id that backed up this Oracle instance and will be used for this restore.
        [long]$JobId,
        [Parameter(Mandatory = $false)]
        [ValidateRange(1, [long]::MaxValue)]
        # Specifies the job run id that captured the snapshot for this Oracle instance. If not specified the latest run is used.
        # This field must be set if restoring to a different target host.
        [long]$JobRunId,
        [Parameter(Mandatory = $false)]
        # Specifies if the tail logs are to be captured before the restore operation.
        # This is only applicable if restoring the database to its hosting Protection Source and the database is not being renamed.
        [string]$CaptureTailLogs,
        [Parameter(Mandatory = $false)]
        # Specifies a new name for the restored database.
        [string]$NewDatabaseName
    )
    Begin {
    }

    Process {
        $resp = Get-CohesityProtectionSource -Name $SourceName
        if ($resp -eq $null) {
            write-output ("Source " + $SourceName + " is not available")
            return
        }
    
        write-output $resp | convertto-json -depth 100
        write-output $resp.rootNode.id

        $SourceId = $resp.rootNode.id
        if ($PSCmdlet.ShouldProcess($SourceId)) {
        
            $job = Get-CohesityProtectionJob -Ids $JobId
            if (-not $job) {
                Write-Output "Cannot proceed, the job id '$JobId' is invalid"
                return
            }

            $protectionSourceObject = Get-CohesityProtectionSource -Id $TargetSourceId
            if ($protectionSourceObject.id -ne $TargetSourceId) {
                Write-Output "Cannot proceed, the target host id '$TargetSourceId' is invalid"
                return
            }
            $ORACLE_OBJECT_RESTORE_TYPE = 19
            $searchedVMDetails = $null
                
            $searchURL = '/irisservices/api/v1/searchvms?entityTypes=kOracle&jobIds=' + $JobId + '&vmName=' + $SourceDatabaseName
            Write-Output $searchURL
            $searchResult = Invoke-RestApi -Method Get -Uri $searchURL

            if ($Global:CohesityAPIStatus.StatusCode -ne 200) {
                Write-Output "Could not search Oracle objects with the job id $JobId"
                return
            }
            $searchedVMDetails = $searchResult.vms | Where-Object { ($_.vmDocument.objectAliases -contains $SourceName) }
            write-output $searchResult.vms[0].vmDocument.objectAliases
            if ($searchedVMDetails -eq $null) {
                write-output "Failed to fetch VM details of source"
            }


            if (-not $JobRunId) {
                $runs = Get-CohesityProtectionJobRun -JobId $JobId -ExcludeErrorRuns:$true
                foreach ($run in $runs) {
                    if ($run.backupRun.status -eq "kSuccess") {
                        $JobRunId = $run.backupRun.jobRunId
                        $StartTime = $run.backupRun.stats.startTimeUsecs
                    }
                }
            }
            $OracleDbConfig = @{
                controlFilePathVec   = @()
                enableArchiveLogMode = $True
                redoLogConf          = @{
                    groupMemberVec = @()
                    memberPrefix   = "redo"
                    sizeMb         = 20
                }
                fraSizeMb            = $fraSizeMb
            }

            if (-not $NewDatabaseName) {
                $NewDatabaseName = $SourceDatabaseName
            }
            $jobUid = $searchedVMDetails.vmDocument.objectId.jobUid
            write-output $searchedVMDetails

            $oracleRestoreParams = [PSCustomObject]@{
                captureTailLogs = $true
            }
            $restoreParams = [PSCustomObject]@{}
            $alternateLocationParams = $null
            if (($SourceId -ne $TargetSourceId) -or ($NewDatabaseName -ne $SourceDatabaseName)) {
                $alternateLocationParams = [PSCustomObject]@{}
                $alternateLocationParams | add-member -type noteproperty -name newDatabaseName  -value $NewDatabaseName
                $alternateLocationParams | add-member -type noteproperty -name homeDir -value $OracleHome
                $alternateLocationParams | add-member -type noteproperty -name baseDir -value $OracleBase
                $alternateLocationParams | add-member -type noteproperty -name oracleDbConfig -value $OracleDbConfig
                $alternateLocationParams | add-member -type noteproperty -name databaseFileDestination -value $OracleHome

                #$oracleRestoreParams | Add-Member -Name alternateLocationParams -value $alternateLocationParams -memberType NoteProperty

                #$restoreParams | Add-Member -name targetHost -Type NoteProperty -Value @{
                # id = $TargetSourceId
                #
                $restoreParams | Add-Member -name targetHost  -Type NoteProperty -Value @{
                    id = $TargetSourceId
                }           
            }
           

            $oracleRestoreParams | Add-Member  -Name alternateLocationParams -value $alternateLocationParams -memberType NoteProperty
            $restoreParams | add-member -type noteproperty -name oracleRestoreParams -value $oracleRestoreParams 
            write-output $oracleRestoreParams | ConvertTo-Json -Depth 100

            write-output $oracleRestoreParams | ConvertTo-Json -Depth 100
            write-output $restoreParams | ConvertTo-Json -Depth 100
            write-output  (($SourceId -ne $TargetSourceId) -or ($NewDatabaseName -ne $SourceDatabaseName))


            $restoreAppObject = [PSCustomObject]@{
                appEntity     = [PSCustomObject]$searchedVMDetails.vmDocument.objectId.entity
                restoreParams = [PSCustomObject] $restoreParams
            
            }
            write-output $restoreAppObject | ConvertTo-Json -Depth 100
            write-output $restoreParams | ConvertTo-Json -Depth 100

            $payload = [PSCustomObject]@{
                action           = "kRecoverApp"
                name             = $TaskName
                restoreAppParams = @{
                    type                = $ORACLE_OBJECT_RESTORE_TYPE
                    ownerRestoreInfo    = @{
                        ownerObject        = @{
                            jobUid         = $jobUid
                            jobId          = $JobId
                            jobInstanceId  = $JobRunId
                            startTimeUsecs = $StartTime
                            entity         = @{
                                id = $SourceId
                            }
                        }
                        ownerRestoreParams = @{
                            action           = "kRecoverVMs"
                            powerStateConfig = @{}
                        }
                        performRestore     = $false
                    }
                    restoreAppObjectVec = @($restoreAppObject)
                }
            }
            $url = '/irisservices/api/v1/recoverApplication'
            $payloadJson = $payload | ConvertTo-Json -Depth 100

            $resp = Invoke-RestApi -Method 'Post' -Uri $url -Body $payloadJson
            if ($Global:CohesityAPIStatus.StatusCode -eq 200) {
                $taskId = $resp.restoreTask.performRestoreTaskState.base.taskId
                if ($taskId) {
                    $resp = Get-CohesityRestoreTask -Ids $taskId
                    $errorMsg = "Successfully created restore task " + $taskName
                }
                else {
                    $errorMsg = "Failed to create restore task " + $taskName
                }
                Write-Output $errorMsg
                CSLog -Message $errorMsg
            }
            else {
                $errorMsg = $Global:CohesityAPIStatus.ErrorMessage + ", Oracle Object : Failed to recover."
                Write-Output $errorMsg
                CSLog -Message $errorMsg
            }
           
        }
    }
    End {
    }
}