Toolkit/Public/New-RscMssqlLogShippingSecondary.ps1

#Requires -Version 3
function New-RscMssqlLogShippingSecondary{
    <#
    .SYNOPSIS
    Adds a new log Shipping secondary to a database

    .DESCRIPTION
    Adds a new log Shipping secondary to a database

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

    .PARAMETER RscMssqlDatabase
    Database object returned from Get-RscMssqlDatabase

    .PARAMETER RscCluster
    Database object returned from Get-RscCluster

    .PARAMETER TargetMssqlInstance
    SQL Server Instance Object returned from Get-RscMssqlInstance

    .PARAMETER TargetDatabaseName
    Any name you want to call your database when it is recovered onto the target instance

    .PARAMETER TargetDataPath
    Single path that all data files will be placed into

    .PARAMETER TargeLogPath
    Single path that all log files will be placed into

    .PARAMETER TargetFilePaths
    Object can be built manually like the below example, or by using Get-RscMssqlDatabaseFiles.

    .PARAMETER MaxDataStreams
    This controls the number of streams used for the restore. By default, Rubrik will use 2 streams. This cannot exceed a value of 8.

    In general, the default value of 2 performs best. However in some cases, increasing the value can provide better performance of the restore. Do not change this value in a
    production setting without running some tests in a non-production environment.

    .PARAMETER DisconnectStandbyUsers
    Automatically disconnect users when restoring backups
    .PARAMETER State
    State of Log Shipping Secondaary. Can be either RESTORING or STANDBY

    .PARAMETER AutomaticReseed
    Automatically reseed the log shipping configuration when the primary transaction log chain breaks
    
    #>


    [CmdletBinding()]
    Param(
        [Parameter(            
            Mandatory = $true, 
            ValueFromPipeline = $true
        )][RubrikSecurityCloud.Types.MssqlDatabase]$RscMssqlDatabase,

        [Parameter(
            Mandatory = $false
        )][RubrikSecurityCloud.Types.Cluster]$RscCluster,

        [Parameter(
            Mandatory = $true
        )][RubrikSecurityCloud.Types.MssqlInstance]$TargetMssqlInstance, 

        [Parameter(
            Mandatory = $true
        )][String]$TargetDatabaseName,

        [Parameter(
            ParameterSetName = "Simple Method",
            Mandatory = $false
        )][String]$TargetDataPath,

        [Parameter(
            ParameterSetName = "Simple Method",
            Mandatory = $false
        )][String]$TargeLogPath,

        [Parameter(
            ParameterSetName = "Advanced Method",
            Mandatory = $false
        )][PSCustomObject]$TargetFilePaths,

        [ValidateRange(1, 8)]
        [Parameter(
            Mandatory = $false
        )][int]$MaxDataStreams = 2,

        [Parameter(
            Mandatory = $false
        )][Switch]$DisconnectStandbyUsers,

        [Parameter(Mandatory = $true)]
        [ValidateSet("RESTORING", "STANDBY")]
        [String]$State,

        [Parameter(
            Mandatory = $false
        )][Switch]$AutomaticReseed

    )
    
    Process {
        Write-Debug "- Running New-RscMssqlLogShippingSecondary"
        
        #region Create Query
        $query = New-RscMutationMssql -Op CreateLogShippingConfiguration
        $query.Var.input = New-Object -TypeName RubrikSecurityCloud.Types.CreateMssqlLogShippingConfigurationInput
        $query.Var.input.Id = $RscMssqlDatabase.Id
        $query.Var.input.clusterUuid = $RscCluster.Id
        
        $query.Var.input.Config = New-Object -TypeName RubrikSecurityCloud.Types.MssqlLogShippingCreateConfigV2Input
        if ($AutomaticReseed){
            $query.Var.input.Config.makeupReseedLimit = 1
        }
        else {
            $query.Var.input.Config.makeupReseedLimit = 0
        }
        
        $query.Var.input.Config.mssqlLogShippingCreateConfig = New-Object -TypeName RubrikSecurityCloud.Types.MssqlLogShippingCreateConfigInput
        If (![string]::IsNullOrEmpty($maxDataStreams)){$query.Var.input.Config.mssqlLogShippingCreateConfig.maxDataStreams = $maxDataStreams}
        
        # Simple Method
        If (![string]::IsNullOrEmpty($TargetDataPath) -and ![string]::IsNullOrEmpty($TargeLogPath)){
            $query.Var.input.Config.mssqlLogShippingCreateConfig.targetDataFilePath = $TargetDataPath
            $query.Var.input.Config.mssqlLogShippingCreateConfig.targetLogFilePath = $TargeLogPath
        }
        # Advanced Method
        If (![string]::IsNullOrEmpty($TargetFilePaths)){
            $query.Var.input.Config.mssqlLogShippingCreateConfig.targetFilePaths = New-Object -TypeName RubrikSecurityCloud.Types.MssqlDbFileExportPathInput 
            $query.Var.input.Config.mssqlLogShippingCreateConfig.targetFilePaths = $TargetFilePaths
        }

        $query.Var.input.Config.mssqlLogShippingCreateConfig.targetDatabaseName = $TargetDatabaseName
        $query.Var.input.Config.mssqlLogShippingCreateConfig.targetInstanceId = $TargetMssqlInstance.Id
        $query.Var.input.Config.mssqlLogShippingCreateConfig.mssqlLogShippingTargetStateOptions = New-Object -TypeName RubrikSecurityCloud.Types.MssqlLogShippingTargetStateOptionsInput
        
        if ($DisconnectStandbyUsers){
            $query.Var.input.Config.mssqlLogShippingCreateConfig.mssqlLogShippingTargetStateOptions.shouldDisconnectStandbyUsers = $true
        }else {
            $query.Var.input.Config.mssqlLogShippingCreateConfig.mssqlLogShippingTargetStateOptions.shouldDisconnectStandbyUsers = $false
        }
        switch ($State) {
            "Restoring" { 
                $query.Var.input.Config.mssqlLogShippingCreateConfig.mssqlLogShippingTargetStateOptions.state = "MSSQL_LOG_SHIPPING_OK_STATE_RESTORING"
             }
             "StandBy" {
                $query.Var.input.Config.mssqlLogShippingCreateConfig.mssqlLogShippingTargetStateOptions.state = "MSSQL_LOG_SHIPPING_OK_STATE_STANDBY"
             }
        }        
        #endregion

        $query.Invoke()
        
    } 
}