Export/Public/Invoke-CreateInstances.ps1

function Invoke-CreateInstances {
    [CmdletBinding()]
    <#
    .SYNOPSIS
        ...
    .DESCRIPTION
        ...
    #>

    param(
        [Parameter(Mandatory = $true)]
        $StorageAccountContext,
        [Parameter(Mandatory = $true)]
        [string]
        $KeyVaultName,
        [Parameter(Mandatory = $true)]
        [string]
        $StorageTableNameEnvironments,
        [Parameter(Mandatory = $true)]
        [string]
        $StorageTableNameEnvironmentDefaults,
        [Parameter(Mandatory = $true)]
        [string]
        $TypeFilter
    )
    process {
        Import-NecessaryModules -Type Application

        $environments = Get-EnvironmentsFromStorage -StorageAccountContext $StorageAccountContext -TableNameEnvironments $StorageTableNameEnvironments -TableNameDefaults $StorageTableNameEnvironmentDefaults -TypeFilter $TypeFilter -ConfigType Application
        foreach ($environment in $environments) {
            if (-not (Get-NavServerInstance -ServerInstance $environment.ServerInstance)) {
                Write-Verbose "Creating instance: $($environment.ServerInstance)"
                try {
                    New-NAVServerInstance $environment.ServerInstance `
                        -DatabaseServer $environment.DatabaseServer  `
                        -DatabaseInstance $environment.DatabaseInstance  `
                        -Databasename $environment.Databasename `
                        -ClientServicesPort $environment.ClientServicesPort   `
                        -ManagementServicesPort $environment.ManagementServicesPort `
                        -SOAPServicesPort $environment.SoapServicesPort   `
                        -ODataServicesPort $environment.OdataServicesPort -Verbose:$Verbose
                }
                catch {
                    # Using try-catch-construct, because after this call the transcript always stops (even though the process is still running)
                }
                <#
                New-NAVServerInstance $environment.ServerInstance `
                    -DatabaseServer $environment.DatabaseServer `
                    -DatabaseInstance $environment.DatabaseInstance `
                    -Databasename $environment.Databasename `
                    -ClientServicesPort $environment.ClientServicesPort `
                    -ManagementServicesPort $environment.ManagementServicesPort `
                    -SOAPServicesPort $environment.SoapServicesPort `
                    -ODataServicesPort $environment.OdataServicesPort -Verbose:$Verbose
                #>

                Write-Verbose "Changing port-configuration..."
                Set-NAVServerConfiguration -ServerInstance $environment.ServerInstance -KeyName DeveloperServicesPort -KeyValue $environment.DeveloperServicesPort -Verbose:$Verbose
                Write-Verbose "Updating authentication-method..."
                Set-NAVServerConfiguration -ServerInstance $environment.ServerInstance -KeyName ClientServicesCredentialType -KeyValue $environment.Authentication -Verbose:$Verbose

                Write-Verbose "Updating service-account..."
                $params = @{KeyVaultName = $KeyVaultName }
                if (-not([string]::IsNullOrEmpty($environment.KVCredentialIdentifier))) {
                    $params.Add("KVIdentifier", $environment.KVCredentialIdentifier)
                }
                $credentialsObject = Get-ServiceUserCredentialsObject @params -Verbose:$Verbose
                Set-NAVServerInstance -ServerInstance $environment.ServerInstance -ServiceAccount User -ServiceAccountCredential $credentialsObject -Verbose:$Verbose

                foreach ($key in $environment.Settings.Keys) {
                    if ((-not([string]::IsNullOrEmpty($key))) -and (-not([string]::IsNullOrEmpty($environment.Settings[$key])))) {
                        Set-NAVServerConfiguration -ServerInstance $environment.ServerInstance -KeyName $key -KeyValue $environment.Settings[$key] -Verbose:$Verbose
                    }
                }
                Write-Verbose "Restarting service"
                Restart-NAVServerInstance -ServerInstance $environment.ServerInstance
            }
        }
    }
}