Public/func_Set-LogicAppParameters.ps1

Function Set-LogicAppParameters {
    <#
    .SYNOPSIS
    Update logic app parameters for domain and environment
    .DESCRIPTION
    Update logic app parameters for domain and environment ...
    .PARAMETER CdfConfig
    The CdfConfig object that holds the current scope configurations (Platform, Application and Domain)
    .PARAMETER ServiceConfig
    The service configuration from cdf-config.json.
    .PARAMETER Parameters
    Hashtable with contents of logic app standard parameters.json. See examples.

    .OUTPUTS
    Hashtable with required app settings.

    .EXAMPLE
    parameters.json:
    {

    }

    $parameters = Get-Content "parameters.json" | ConvertFrom-Json -AsHashtable
    $serviceConfig = Get-Content "cdf-config.json" | ConvertFrom-Json -AsHashtable
    Set-CdfLogicAppParameters `
        -CdfConfig $CdfConfig `
        -ServiceConfig $serviceConfig `
        -Parameters $arameters

    $parameters | ConvertTo-Json -Depth 10 | Set-Content -Path "parameters.json"

    appsettings.json (result):
    {
        "AzureWebJobsStorage": "",
        "WORKFLOWS_SUBSCRIPTION_ID": "",
        "PlatformKeyVaultUri": "<KeyVaultName>.vault.azure.net"
        "DomainStorageAccountUri": "<StorageAccountName>.vault.azure.net"
    }
    #>


    [CmdletBinding()]
    Param(
        [ValidateNotNullOrEmpty()]
        [Parameter(ValueFromPipeline = $true, Mandatory = $true)]
        [hashtable]$CdfConfig,
        [Parameter(Mandatory = $true)]
        [hashtable]$ServiceConfig,
        [Parameter(Mandatory = $true)]
        [hashtable]$Parameters
    )


    #############################################################
    # Update service parameter values
    #############################################################
    Write-Verbose "Setting service CDF parameters"

    $platformId = $CdfConfig.Platform.Config.platformId
    $platformInstance = $CdfConfig.Platform.Config.instanceId
    $appId = $CdfConfig.Application.Config.applicationId
    $appInstance = $CdfConfig.Application.Config.instanceId

    # Set framework parameters
    $Parameters.Environment.value = $CdfConfig.Application.Env
    $Parameters.Platform.value.Key = "$platformId$platformInstance"
    $Parameters.Platform.value.TemplateName = $CdfConfig.Platform.Config.templateName
    $Parameters.Platform.value.TemplateVersion = $CdfConfig.Platform.Config.templateVersion
    $Parameters.Application.value.Key = "$appId$appInstance"
    $Parameters.Application.value.TemplateName = $CdfConfig.Application.Config.templateName
    $Parameters.Application.value.TemplateVersion = $CdfConfig.Application.Config.templateVersion
    $Parameters.Domain.value.Name = $CdfConfig.Domain.Config.domainName
    $Parameters.Service.value.Name = $CdfConfig.Service.Config.serviceName
    $Parameters.Service.value.Group = $CdfConfig.Service.Config.serviceGroup
    $Parameters.Service.value.Type = $CdfConfig.Service.Config.serviceType
    $Parameters.Service.value.Template = $CdfConfig.Service.Config.serviceTemplate
    $Parameters.BuildContext.value.BuildTimestamp = Get-Date -Format o
    $Parameters.BuildContext.value.BuildRun = $CdfConfig.Service.Tags.BuildRun
    $Parameters.BuildContext.value.BuildRepo = $CdfConfig.Service.Tags.BuildRepo
    $Parameters.BuildContext.value.BuildBranch = $CdfConfig.Service.Tags.BuildBranch
    $Parameters.BuildContext.value.BuildCommit = $CdfConfig.Service.Tags.BuildCommit
    $Parameters.BuildContext.value.TemplateEnv = $CdfConfig.Service.Tags.TemplateEnv
    $Parameters.BuildContext.value.TemplateName = $CdfConfig.Service.Tags.TemplateName
    $Parameters.BuildContext.value.TemplateVersion = $CdfConfig.Service.Tags.TemplateVersion
    $Parameters.BuildContext.value.TemplateInstance = $CdfConfig.Service.Tags.TemplateInstance

    $azCtx = Get-AzureContext -SubscriptionId $CdfConfig.Platform.Env["subscriptionId"]

    $appsettings = @{}

    # Service internal settings
    foreach ($serviceSettingKey in $ServiceConfig.ServiceSettings.Keys) {
        Write-Verbose "Adding service internal setting: $serviceSettingKey"
        $setting = $ServiceConfig.ServiceSettings[$serviceSettingKey]
        switch ($setting.Type) {
            "Constant" {
                if ($setting.IsAppSetting) {
                    $appSettingKey = "Internal_$serviceSettingKey"
                    $appsettings[$appSettingKey] = $setting.Values[0].Value
                    $Parameters.Service.value[$serviceSettingKey] = "@appsetting('$appSettingKey')"
                }
                else {
                    $Parameters.Service.value[$serviceSettingKey] = $setting.Value
                }

            }
            "Setting" {
                if ($setting.IsAppSetting) {
                    $appSettingKey = "Internal_$serviceSettingKey"
                    $appsettings[$appSettingKey] = $setting.Values[0].Value
                    $Parameters.Service.value[$serviceSettingKey] = "@appsetting('$appSettingKey')"
                }
                else {
                    $Parameters.Service.value[$serviceSettingKey] = $setting.Values[0].Value
                }

            }
            "Secret" {
                $secretName = "Internal-$($CdfConfig.Service.Config.serviceName)-$($setting.Identifier)"
                $keyVault = Get-AzKeyVault `
                    -DefaultProfile $azCtx `
                    -VaultName $CdfConfig.Domain.ResourceNames.keyVaultName `
                    -ErrorAction SilentlyContinue
                $appSettingRef = "@Microsoft.KeyVault(SecretUri=$($keyVault.VaultUri)secrets/$secretName)"
                $appSettingKey = "Internal_$serviceSettingKey"
                $appsettings[$appSettingKey] = $appSettingRef
                $Parameters.Service.value[$serviceSettingKey] = "@appsetting('$appSettingKey')"
                Write-Verbose "Prepared KeyVault secret reference for Setting [$serviceSettingKey] using app setting [$appSettingKey] KeyVault ref [$appSettingRef]"
            }
        }
    }

    # Service external settings
    foreach ($externalSettingKey in $ServiceConfig.ExternalSettings.Keys) {
        Write-Verbose "Adding service external setting: $externalSettingKey"
        $setting = $ServiceConfig.ExternalSettings[$externalSettingKey]
        switch ($setting.Type) {
            "Constant" {
                if ($setting.IsAppSetting) {
                    $appSettingKey = "External_$externalSettingKey"
                    $appsettings[$appSettingKey] = $setting.Values[0].Value
                    $Parameters.External.value[$externalSettingKey] = "@appsetting('$appSettingKey')"
                }
                else {
                    $Parameters.External.value[$externalSettingKey] = $setting.Value
                }
            }
            "Setting" {
                [string] $value = ($setting.Values  | Where-Object { $_.Purpose -eq $CdfConfig.Application.Env.purpose }).Value

                if ($setting.IsAppSetting) {
                    $appSettingKey = "External_$externalSettingKey"
                    $appsettings[$appSettingKey] = $value
                    $Parameters.External.value[$externalSettingKey] = "@appsetting('$appSettingKey')"
                }
                else {
                    $Parameters.External.value[$externalSettingKey] = $value
                }
            }
            "Secret" {
                $secretName = "External-$($CdfConfig.Service.Config.serviceName)-$($setting.Identifier)"
                $keyVault = Get-AzKeyVault `
                    -DefaultProfile $azCtx `
                    -VaultName $CdfConfig.Domain.ResourceNames.keyVaultName `
                    -ErrorAction SilentlyContinue
                $appSettingRef = "@Microsoft.KeyVault(SecretUri=$($keyVault.VaultUri)secrets/$secretName)"
                $appSettingKey = "External_$externalSettingKey"
                $appsettings[$appSettingKey] = $appSettingRef
                $Parameters.External.value[$externalSettingKey] = "@appsetting('$appSettingKey')"
                Write-Verbose "Prepared KeyVault secret reference for Setting [$externalSettingKey] using app setting [$appSettingKey] KeyVault ref [$appSettingRef]"
            }
        }
    }
    return $appsettings
}