Public/Core/automation/Set-CmAzCoreAutomationDeleteResource.ps1

function Set-CmAzCoreAutomationDeleteResource {

    <#
        .Synopsis
         Enables feature to delete resources on a given date.
 
        .Description
         Completes the following:
            * Uploads a runbook on automation account which delete resources on date given in "cm-delete" tag.
            * Creates Job schedule
 
        .Parameter SettingsFile
         File path for the settings file to be converted into a settings object.
 
        .Parameter SettingsObject
         Object containing the configuration values required to run this cmdlet.
 
        .Component
         Core
 
        .Example
         Set-CmAzCoreAutomationDeleteResource -SettingsFile "cm-delete.yml"
 
        .Example
         Set-CmAzCoreAutomationDeleteResource -SettingsObject $settings
    #>


    [CmdletBinding(SupportsShouldProcess, ConfirmImpact = "Medium")]
    param(
        [parameter(Mandatory = $true, ParameterSetName = "Settings File")]
        [String]$SettingsFile,

        [parameter(Mandatory = $true, ParameterSetName = "Settings Object")]
        [Object]$SettingsObject
    )

    $ErrorActionPreference = "Stop"

    try {

        if ($PSCmdlet.ShouldProcess((Get-CmAzSubscriptionName), "Enable delete resource of tagged date feature using automation account")) {

            # Initializing settings file values
            if ($SettingsFile -and !$SettingsObject) {
                $SettingsObject = Get-CmAzSettingsFile -Path $SettingsFile
            }
            elseif (!$SettingsFile -and !$SettingsObject) {
                Write-Error "No valid input settings." -Category InvalidArgument -CategoryTargetName "SettingsObject"
            }

            $automationService = Get-CmAzService -Service $SettingsObject.service.dependencies.automation -Region $SettingsObject.location -ThrowIfUnavailable -ThrowIfMultiple
            $cmDeleteRunbook = "Delete-TaggedResource.Runbook"

            # Check Modules and install them if not available
            $dataFile = (Import-PowerShellDataFile "$PSScriptRoot/../../../../Cloudmarque.Azure.psd1")

            $modules = $dataFile.requiredModules

            $modules += @{
                "ModuleName" = $dataFile.rootModule.TrimEnd(".psm1");
                "RequiredVersion" = $dataFile.moduleVersion
            }

            Foreach ($module in $modules) {
                $moduleStatus = Get-AzAutomationModule -AutomationAccountName $automationService.name -ResourceGroupName $automationService.resourceGroupName | Where-Object {$_.name -match $module}

                if(!$moduleStatus) {
                    Write-Output "$module not Found. I will be imported in automation account shared resources."
                    New-AzAutomationModule -AutomationAccountName $automationService.Name -ResourceGroupName $automationService.resourceGroupName -Name $module -ContentLinkUri "https://www.powershellgallery.com/api/v2/package/$module"
                }
            }

            # Import runbook to automation account
            Write-Verbose "Automation Account found."
            $exists = Get-AzAutomationRunbook -Name $cmDeleteRunbook -ResourceGroupName $automationService.resourceGroupName -AutomationAccountName $automationService.name -ErrorAction SilentlyContinue

            if ($exists) {
                Write-Verbose "Removing existing Delete-TaggedResource.Runbook"
                Remove-AzAutomationRunbook -Name $cmDeleteRunbook -ResourceGroupName $automationService.resourceGroupName -AutomationAccountName $automationService.name -Force
            }

            Write-Verbose "Importing Runbook into the automation account."
            Import-AzAutomationRunbook -Name $cmDeleteRunbook -Path "$PSScriptRoot/../../../../Runbooks/Delete-TaggedResource.Runbook.ps1" `
                -ResourceGroupName $automationService.resourceGroupName -AutomationAccountName $automationService.name `
                -Type PowerShell -Published

            # Set Job Schedule
            Write-Verbose "Configuring job schedule"
            if ($SettingsObject.schedule.expiryDate -and $SettingsObject.schedule.expiryTime) {
                $expiryTime = "$($SettingsObject.schedule.expiryDate)T$($SettingsObject.schedule.expiryTime)"
            }
            else {
                $expiryTime = $null
            }

            if ($SettingsObject.schedule.startTime -and $SettingsObject.schedule.startDate) {
                $startTime = "$($SettingsObject.schedule.startDate)T$($SettingsObject.schedule.startTime)"
            }
            else {
                $startTime = "$(((Get-Date).AddDays(1)).ToString("yyyy-MM-dd"))T00:00:00"
            }

            switch ($SettingsObject.schedule.frequency) {
                daily { $frequency = "Day" }
                monthly { $frequency = "Month" }
                weekly { $frequency = "Week" }
                Default { $frequency = "Day" }
            }

            $schedule = @{
                "expiryTime"       = $expiryTime;
                "frequency"        = $frequency;
                "interval"         = 1;
                "name"             = Get-CmAzResourceName -Resource "AutomationSchedule" -Architecture "Core" -Region $SettingsObject.location -Name delete-tagged-resource;
                "startTime"        = $startTime;
                "timeZone"         = "Europe/London";
                "advancedSchedule" = @{
                    "weekDays"           = @();
                    "monthDays"          = @();
                    "monthlyOccurrences" = @()
                };
            }

            New-AzResourceGroupDeployment `
                -ResourceGroupName $automationService.resourceGroupName `
                -TemplateFile "$PSScriptRoot/Set-CmAzCoreAutomationDeleteResource.json" `
                -AutomationAccountName $automationService.name `
                -UpdateSchedule $schedule `
                -Force
        }
    }
    catch {
        $PSCmdlet.ThrowTerminatingError($PSitem);
    }
}