Public/New-AzureDevopsGuestConfigurationPolicy.ps1

Function New-AzureDevopsGuestConfigurationPolicy{
    [CmdletBinding()]
    param (
        [string]$StorageAccountName,
        [string]$StorageContainerName,
        [string]$StorageAccountKey,
        [string]$PipelineConfigdata
    )
    
    
    Begin{
    
        $jsonData = [System.Text.Encoding]::UTF8.GetString([Convert]::FromBase64String($PipelineConfigdata))
        $blobNames = $jsonData | ConvertFrom-Json
        $SASTokenURls = @()
        $NewGuestConfigurationPolicyData=@() 
        $storageAccountKey = "$(storagekey)"
        Write-Verbose "Creating storage account context for $storageAccountName"
        Try{
        $context = New-AzStorageContext -StorageAccountName $storageAccountName -StorageAccountKey $storageAccountKey
        }
        Catch{

            Write-Error "An error occured xwhile creating storage account context for $storageAccountName. Error - $($_.Exception.Message)."
            Break
        }
    }
    Process{
    
        Foreach($blobName in $blobNames){

                Write-Host "Processing the configuration $blobName"
                $Pattern = "^$($blobName.ConfigurationName)\.\d+\.\d+\.\d+\.\d+\.zip$"
                Switch($blobName.ChangeType){
    
                                    {$_ -ieq "add" -or $_ -ieq "rename" }{
                                                        Write-Verbose "Change type - $($blobName.ChangeType), generating SAS url for the config file $($blobName.ConfigurationPackageName)"
                                                        Write-Verbose "Getting the existing config packages for the config $($blobName.ConfigurationName) from storage account $($StorageAccountName)."
                                                        Try{
                                                            $ExistingConfigurations = Get-AzStorageBlob -Container $StorageContainerName -Context $context | Where-Object {$_.Name -match $Pattern}
                                                            If($ExistingConfigurations){
                                                                    Write-Verbose "[$($ExistingConfigurations.Count)] Existing configurations found, performing the cleanup."
                                                                    Write-Verbose "Excluding the latest configuration package - $($blobName.ConfigurationPackageName)"
                                                                    $ConfigurationsToDelete = $ExistingConfigurations | Where-Object {$_.Name -ne "$($blobName.ConfigurationPackageName)"}
                                                                    $ConfigurationsToDelete | Remove-AzStorageBlob -Force
                                                                }
                                                            else{
                                                                Write-Verbose "No existing configuration package found for the configuration $($blobName.ConfigurationName) in the storage account storage account $($StorageAccountName)"
                                                                }
                                                            }
                                                        Catch{
                                                                Write-Error "An error occured while getting the existing config packages for the config $($blobName.ConfigurationName) from storage account $($StorageAccountName). Error - $($_.Exception.Message)"
                                                            }
                                                        $sasToken = New-AzStorageBlobSASToken -Container $StorageContainerName -Blob $blobName.ConfigurationPackageName -Permission r -Context $context -ExpiryTime (Get-Date).AddYears(1) -FullUri
                                                        $SASTokenURls += [PSCustomObject]@{
                                                                                            ConfigurationName = $blobName.ConfigurationName
                                                                                            Version = $blobName.Version
                                                                                            ConfigurationPackageName = $blobName.ConfigurationPackageName 
                                                                                            SaSURL = $sasToken
                                                                                            ChangeType = $blobName.ChangeType
                                                                                        }
                                                    
                                                    }
                                    {$_ -eq  'Edit'}{
                                                        Write-Verbose "Change type - $($blobName.ChangeType), clean-up the existing configuration pacakages."
                                                        Write-Verbose "Getting the existing config packages for the config $($blobName.ConfigurationName) from storage account $($StorageAccountName)."
                                                        Try{
                                                            $ExistingConfigurations = Get-AzStorageBlob -Container $StorageContainerName -Context $context | Where-Object {$_.Name -match $Pattern}
                                                            If($ExistingConfigurations){
                                                                    Write-Verbose "[$($ExistingConfigurations.Count)] Existing configurations found, performing the cleanup."
                                                                    Write-Verbose "Excluding the latest configuration package - $($blobName.ConfigurationPackageName)"
                                                                    $ConfigurationsToDelete = $ExistingConfigurations | Where-Object {$_.Name -ne "$($blobName.ConfigurationPackageName)"}
                                                                    $ConfigurationsToDelete | Remove-AzStorageBlob -Force
                                                                }
                                                            else{
                                                                Write-Verbose "No existing configuration package found for the configuration $($blobName.ConfigurationName) in the storage account storage account $($StorageAccountName)"
                                                                }
                                                            }
                                                        Catch{
                                                                Write-Error "An error occured while getting the existing config packages for the config $($blobName.ConfigurationName) from storage account $($StorageAccountName). Error - $($_.Exception.Message)"
                                                            }
    
                                                        Try{
                                                                Write-Verbose "Generating the SAS token for the package $($blobName.ConfigurationPackageName)"
                                                                $sasToken = New-AzStorageBlobSASToken -Container $StorageContainerName -Blob $blobName.ConfigurationPackageName -Permission r -Context $context -ExpiryTime (Get-Date).AddYears(1) -FullUri
                                                                $SASTokenURls += [PSCustomObject]@{
                                                                                                    ConfigurationName = $blobName.ConfigurationName
                                                                                                    Version = $blobName.Version
                                                                                                    ConfigurationPackageName = $blobName.ConfigurationPackageName 
                                                                                                    SaSURL = $sasToken
                                                                                                    ChangeType = $blobName.ChangeType
                                                                                                }
                                                            }
                                                        Catch{
    
                                                                Write-Error "An error occured while generating the SAS URL for the config package $($blobName.ConfigurationPackageName) from storage account $($StorageAccountName). Error - $($_.Exception.Message)"
                                                            }
                                                    }
                                    
                                    {$_ -ieq "delete" -or $_ -ieq "delete, sourceRename"} {
                                                            Write-Verbose "Change type - $($blobName.ChangeType), no SAS url. Deleting the config files from the storage account $($StorageAccountName)"
                                                            
                                                            Try{
                                                                $ExistingConfigurations = Get-AzStorageBlob -Container $StorageContainerName -Context $context | Where-Object {$_.Name -match $Pattern}
                                                                If($ExistingConfigurations){
                                                                   
                                                                        Write-Verbose "[$($ExistingConfigurations.Count)] Existing configurations found, performing the cleanup."
                                                                        $ExistingConfigurations | Remove-AzStorageBlob -Force -ErrorAction Stop
                                                                        $SASTokenURls += [PSCustomObject]@{
                                                                                                ConfigurationName = $blobName.ConfigurationName
                                                                                                Version = $blobName.Version
                                                                                                ConfigurationPackageName = $blobName.ConfigurationPackageName 
                                                                                                SaSURL = "NO_SAS_URL"
                                                                                                ChangeType = $blobName.ChangeType
                                                                        }
                                                                    }
                                                                else{
                                                                    Write-Verbose "No existing configuration package found for the configuration $($blobName.ConfigurationName) in the storage account storage account $($StorageAccountName)"
                                                                    }
                                                                }
                                                            Catch{
                                                                    Write-Error "An error occured while getting the existing config packages for the config $($blobName.ConfigurationName) from storage account $($StorageAccountName). Error - $($_.Exception.Message)"
                                                                }
                                                        }
                                            
                }#End of switch
            
           }#End of foreach
            
    #Return $SASTokenURls
    
        foreach($Data in $SASTokenURls){
            
            If($Data.ChangeType -ieq "add" -or $Data.ChangeType -ieq "rename" -or $Data.ChangeType -ieq "edit" ){
                Write-Verbose "Generating new guest configuration policy for the configurations $($Data.ConfigurationName). Change type - $($Data.ChangeType)"
                $PolicyConfig = @{
                                    PolicyId      = $(New-Guid)
                                    ContentUri    = $Data.SaSUrl
                                    DisplayName   = $($Data.ConfigurationName)
                                    Description   = $($Data.ConfigurationName)
                                    Path          = './policies/deployIfNotExists.json'
                                    Platform      = 'Windows'
                                    PolicyVersion = "$($Data.Version)"
                                    Mode          = 'ApplyAndAutoCorrect'
                                }
                
                $NewGuestConfigurationPolicy = New-GuestConfigurationPolicy @PolicyConfig
                $NewGuestConfigurationPolicyData += [PSCustomObject]@{
                                                                        PolicyName = $NewGuestConfigurationPolicy.Name
                                                                        PolicyFilePath = $NewGuestConfigurationPolicy.Path
                                                                        PolicyID = $NewGuestConfigurationPolicy.PolicyId
                                                                        Version = $($Data.Version)
                                                                        ChangeType = $Data.ChangeType 
                                                                    }
            }
    
            If($Data.ChangeType -ieq "delete, sourceRename" -or $Data.ChangeType -ieq "delete"){
                Write-Verbose "Generating new guest configuration policy for the configurations $($Data.ConfigurationName). Change type - $($Data.ChangeType)"
                $NewGuestConfigurationPolicyData += [PSCustomObject]@{
                                                                        PolicyName = $Data.ConfigurationName
                                                                        PolicyFilePath = "NA"
                                                                        PolicyID = "NA"
                                                                        Version = $($Data.Version)
                                                                        ChangeType = $Data.ChangeType
                                                                    }
            }
        }
    
    
    }
    End{
    
        $context =@()
        $PolicyDatacollection = $NewGuestConfigurationPolicyData | ConvertTo-Json -Compress 
        $PolicyCollectionbase64Data = [Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes($PolicyDatacollection)) # Converting into Base64 format to handle the json array data correctly.
        Write-Verbose "Creating the azure devops variable 'policydatacollection' $($Data.ConfigurationName)."
        Write-Host "##vso[task.setvariable variable=policydatacollection]$PolicyCollectionbase64Data " #This is to write custom variable in azure devops
    }
    
} #END OF New-AzureDevopsGuestConfigurationPolicy