Private/Set-RubrikRSCSla.ps1

function Set-RubrikRSCSLA
{
  [CmdletBinding(SupportsShouldProcess = $true,ConfirmImpact = 'High')]
  Param(
    # SLA id value from the Rubrik Cluster
    [Parameter(
      ValueFromPipelineByPropertyName = $true,
      Mandatory = $true )]
    [ValidateNotNullOrEmpty()]
    [String]$id,
    # SLA Domain Name
    [Parameter(
      ValueFromPipelineByPropertyName = $true)]
    [Alias('SLA')]
    [ValidateNotNullOrEmpty()]
    [String]$Name,
    # Hourly frequency to take snapshots
    [int]$HourlyFrequency,
    # Number of days or weeks to retain the hourly snapshots. For CDM versions prior to 5.0 this value must be set in days
    [int]$HourlyRetention,
    # Retention type to apply to hourly snapshots when advanced configuration is enabled. Does not apply to CDM versions prior to 5.0
    [ValidateSet('Daily','Weekly')]
    [String]$HourlyRetentionType='Daily',
    # Daily frequency to take snapshots
    [int]$DailyFrequency,
    # Number of days or weeks to retain the daily snapshots. For CDM versions prior to 5.0 this value must be set in days
    [int]$DailyRetention,
    # Retention type to apply to daily snapshots when advanced configuration is enabled. Does not apply to CDM versions prior to 5.0
    [ValidateSet('Daily','Weekly')]
    [String]$DailyRetentionType='Daily',
    # Weekly frequency to take snapshots
    [int]$WeeklyFrequency,
    # Number of weeks to retain the weekly snapshots
    [int]$WeeklyRetention,
    # Day of week for the weekly snapshots when advanced configuration is enabled. The default is Saturday. Does not apply to CDM versions prior to 5.0
    [ValidateSet('Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday')]
    [String]$DayOfWeek='Saturday',
    # Monthly frequency to take snapshots
    [int]$MonthlyFrequency,
    # Number of months, quarters or years to retain the monthly backups. For CDM versions prior to 5.0, this value must be set in years
    [int]$MonthlyRetention,
    # Day of month for the monthly snapshots when advanced configuration is enabled. The default is the last day of the month. Does not apply to CDM versions prior to 5.0
    [ValidateSet('FirstDay','Fifteenth','LastDay')]
    [String]$DayOfMonth='LastDay',
    # Retention type to apply to monthly snapshots. Does not apply to CDM versions prior to 5.0
    [ValidateSet('Monthly','Quarterly','Yearly')]
    [String]$MonthlyRetentionType='Monthly',
    # Quarterly frequency to take snapshots. Does not apply to CDM versions prior to 5.0
    [int]$QuarterlyFrequency,
    # Number of quarters or years to retain the monthly snapshots. Does not apply to CDM versions prior to 5.0
    [int]$QuarterlyRetention,
    # Day of quarter for the quarterly snapshots when advanced configuration is enabled. The default is the last day of the quarter. Does not apply to CDM versions prior to 5.0
    [ValidateSet('FirstDay','LastDay')]
    [String]$DayOfQuarter='LastDay',
    # Month that starts the first quarter of the year for the quarterly snapshots when advanced configuration is enabled. The default is January. Does not apply to CDM versions prior to 5.0
    [ValidateSet('January','February','March','April','May','June','July','August','September','October','November','December')]
    [String]$FirstQuarterStartMonth='January',
    # Retention type to apply to quarterly snapshots. The default is Quarterly. Does not apply to CDM versions prior to 5.0
    [ValidateSet('Quarterly','Yearly')]
    [String]$QuarterlyRetentionType='Quarterly',
    # Yearly frequency to take snapshots
    [int]$YearlyFrequency,
    # Number of years to retain the yearly snapshots
    [int]$YearlyRetention,
    # Day of year for the yearly snapshots when advanced configuration is enabled. The default is the last day of the year. Does not apply to CDM versions prior to 5.0
    [ValidateSet('FirstDay','LastDay')]
    [String]$DayOfYear='LastDay',
    # Month that starts the first quarter of the year for the quarterly snapshots when advanced configuration is enabled. The default is January. Does not apply to CDM versions prior to 5.0
    [ValidateSet('January','February','March','April','May','June','July','August','September','October','November','December')]
    [String]$YearStartMonth='January',
    # Whether to turn advanced SLA configuration on or off. Does not apply to CDM versions prior to 5.0
    [Parameter(
      ValueFromPipelineByPropertyName = $true)]
    [alias('showAdvancedUi')]
    [switch]$AdvancedConfig,
    # Hour from which backups are allowed to run. Uses the 24-hour clock
    [ValidateRange(0,23)]
    [int]$BackupStartHour,
    # Minute of hour from which backups are allowed to run
    [ValidateRange(0,59)]
    [int]$BackupStartMinute,
    # Number of hours during which backups are allowed to run
    [ValidateRange(1,23)]
    [int]$BackupWindowDuration,
    # Hour from which the first full backup is allowed to run. Uses the 24-hour clock
    [ValidateRange(0,23)]
    [int]$FirstFullBackupStartHour,
    # Minute of hour from which the first full backup is allowed to run
    [ValidateRange(0,59)]
    [int]$FirstFullBackupStartMinute,
    [ValidateSet('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','1','2','3','4','5','6','7')]
    [String]$FirstFullBackupDay,
    # Number of hours during which the first full backup is allowed to run
    [int]$FirstFullBackupWindowDuration,
    # Whether to enable archival
    [switch]$Archival,
    # Time in days to keep backup data locally on the cluster.
    [Parameter(
      ValueFromPipelineByPropertyName = $true)]
    [alias('localRetentionLimit')]
    [int]$LocalRetention,
    # ID of the archival location
    [ValidateNotNullOrEmpty()]
    [String]$ArchivalLocationId,
    # Polaris Managed ID
    [ValidateNotNullOrEmpty()]
    [String]$PolarisID,
    # Whether to enable Instant Archive
    [switch]$InstantArchive,
    # Whether a retention lock is active on this SLA, Does not apply to CDM versions prior to 5.2
    [alias('isRetentionLocked')]
    [switch]$RetentionLock,
    # Whether to enable replication
    [switch]$Replication,
    # ID of the replication target
    [ValidateNotNullOrEmpty()]
    [String]$ReplicationTargetId,
    # Time in days to keep data on the replication target.
    [int]$RemoteRetention,
    # Retrieves frequencies from Get-RubrikSLA via the pipeline
    [Parameter(
      ValueFromPipelineByPropertyName = $true)]
    [object[]] $Frequencies,
    # Retrieves the advanced UI configuration parameters from Get-RubrikSLA via the pipeline
    [Parameter(
      ValueFromPipelineByPropertyName = $true)]
    [alias('advancedUiConfig')]
    [object[]] $AdvancedFreq,
    # Retrieves the allowed backup windows from Get-RubrikSLA via the pipeline
    [Parameter(
      ValueFromPipelineByPropertyName = $true)]
    [alias('allowedBackupWindows')]
    [object[]] $BackupWindows,
    # Retrieves the allowed backup windows for the first full backup from Get-RubrikSLA via the pipeline
    [Parameter(
      ValueFromPipelineByPropertyName = $true)]
    [alias('firstFullAllowedBackupWindows')]
    [object[]] $FirstFullBackupWindows,
    # Retrieves the archical specifications from Get-RubrikSLA via the pipeline
    [Parameter(
      ValueFromPipelineByPropertyName = $true)]
    [object[]] $ArchivalSpecs,
    # Retrieves the replication specifications from Get-RubrikSLA via the pipeline
    [Parameter(
      ValueFromPipelineByPropertyName = $true)]
    [object[]] $ReplicationSpecs,
    # Rubrik server IP or FQDN
    [String]$Server = $global:RubrikConnection.server,
    # API version
    [String]$api = $global:RubrikConnection.api
  )

    $RscParams = @{}

    if ($id) {
        $RscParams.Add("id",$id)
    }

    if ($HourlyFrequency) {
        if ($HourlyRetentionType -eq "Weekly") {
            $RetentionUnit = "WEEKS"
        } else {
            $RetentionUnit = "DAYS"
        }
        $hourlySchedule = New-RscSlaSnapshotSchedule -Type Hourly -Frequency $HourlyFrequency -Retention $HourlyRetention -RetentionUnit $RetentionUnit
        $RscParams.Add("HourlySchedule", $hourlySchedule)
    }
    if ($DailyFrequency) {
        if ($DailyRetentionType -eq "Weekly") {
            $RetentionUnit = "WEEKS"
        } else {
            $RetentionUnit = "DAYS"
        }
        $dailySchedule = New-RscSlaSnapshotSchedule -Type Daily -Frequency $DailyFrequency -Retention $DailyRetention -RetentionUnit $RetentionUnit
        $RscParams.Add("DailySchedule",$dailySchedule)
    }
    if ($WeeklyFrequency) {
        if ($DayOfWeek) {
            $DayToTakeSnap = $DayOfWeek.toUpper()
        } else {
            $DayToTakeSnap = "MONDAY"
        }
        $weeklySchedule = New-RscSlaSnapshotSchedule -Type Weekly -Frequency $WeeklyFrequency -Retention $WeeklyRetention -DayOfWeek $DayToTakeSnap -RetentionUnit WEEKS
        Write-Host "Adding weekly"
        $RscParams.Add("WeeklySchedule",$weeklySchedule)
    }
    if ($MonthlyFrequency) {
        if ($DayOfMonth -eq "FirstDay") {
            $DayToTakeSnap = "FIRST_DAY"
        } elseif ($DayOfMonth -eq "Fifteenth") {
            $DayToTakeSnap = "FIFTEENTH"
        } else {
            $DayToTakeSnap = "LAST_DAY"
        }
        if ($MonthlyRetentionType -eq "Quarterly") {
            $RetentionUnit = "QUARTERS"
        } elseif ($MonthlyRetentionType -eq "Yearly") {
            $RetentionUnit = "YEARS"
        } else {
            $RetentionUnit = "MONTHS"
        }
        $monthlySchedule = New-RscSlaSnapshotSchedule -Type Monthly -Frequency $MonthlyFrequency -Retention $MonthlyRetention -DayOfMonth $DayToTakeSnap -RetentionUnit $RetentionUnit
        $RscParams.Add("MonthlySchedule",$monthlySchedule)
    }
    if ($QuarterlyFrequency) {
        if ($DayOfQuarter -eq "FirstDay") {
            $DayToTakeSnap = "FIRST_DAY"
        } else {
            $DayToTakeSnap = "LAST_DAY"
        }
        
        if ($FirstQuarterStartMonth) {
            $QuarterStartMonth = $FirstQuarterStartMonth.toUpper()
        } else {
            $QuarterStartMonth = "JANUARY"
        }
        if ($QuarterlyRetentionType -eq "Yearly") {
            $RetentionUnit = "YEARS"
        } else {
            $RetentionUnit = "QUARTERS"
        }
        $quarterlySchedule = New-RscSlaSnapshotSchedule -Type Quarterly -Frequency $QuarterlyFrequency -Retention $QuarterlyRetention -DayOfQuarter $DayToTakeSnap -RetentionUnit $RetentionUnit -QuarterStartMonth $QuarterStartMonth
        $RscParams.Add("QuarterlySchedule",$quarterlySchedule)
    }
    if ($YearlyFrequency) {
        $RetentionUnit = "YEARS"
        if ($YearStartMonth) {
            $YearStart = [RubrikSecurityCloud.Types.Month] $YearStartMonth.toUpper()
        } else {
            $YearStart = [RubrikSecurityCloud.Types.Month] "JANUARY"
        }
        if ($DayOfYear -eq "FirstDay") {
            $DayYear = "FIRST_DAY"
        } else {
            $DayYear = "LAST_DAY"
        }
        $yearlySchedule = New-RscSlaSnapshotSchedule -Type Yearly -Frequency $YearlyFrequency -Retention $YearlyRetention -RetentionUnit $RetentionUnit -YearStartMonth $YearStart -DayOfYear $DayYear
        $RscParams.Add("YearlySchedule",$yearlySchedule)
    }

    if ($Name) {
        $RscParams.Add("Name",$Name)
    }

    # Retrieve current object types for sla

    $query = New-RscQuery -GqlQuery slaDomains
    $query.Field.nodes[1].ObjectTypes = "VSPHERE_OBJECT_TYPE"
    $slas = (Invoke-Rsc $query).nodes
    $indsla = $slas | where-Object {$_.id -eq $id}
    $objecttypes = $indsla.ObjectTypes

    $RscParams.Add("ObjectType",$objectTypes)
    $response = Set-RscSla @RscParams
    return $response

}