Container/New-BCDevContainer.ps1

function New-BCDevContainer {
    param (
        [Parameter(Mandatory = $false)] [ValidateSet('bricklead', 'primus-by-bricklead')][string]$DevOpsSignature = 'bricklead',
        [Parameter(Mandatory = $false)] [ValidateSet("Sandbox", "OnPrem")][string]$SubVersion = 'Sandbox',
        [Parameter(Mandatory = $false)] [ValidateSet("AppSource", "Master", "Release-Candidate")] [string]$SourceApp = 'Release-Candidate',
        [Parameter(Mandatory = $false)] [boolean]$launchBrowser = $true,
        [switch]$CopyCRONUS,
        [switch]$NoTestLibrary,
        [switch]$Insider,
        [Switch]$NoCleanArtifact
    )

    Clear-Host
    $DevOpsSignature = $DevOpsSignature.ToLower()
    $Profil = "Consultant"
    if (Test-Path "$($env:USERPROFILE)\.vscode\extensions\ms-dynamics-smb.al-*") {
        $Profil = "Developer"
    }
    if ($NoTestLibrary) {
        $Profil = "Consultant"
    }
    #Checking container permissions
    Write-Host "Checking container permissions" -foregroun Yellow
    Check-BcContainerHelperPermissions -Fix
    # Version
    Write-Host
    Write-Host "Getting D365BC $SubVersion Artifacts..." -foregroun Yellow
    $TempJson = "$env:TEMP\$([Guid]::newguid().ToString()).json"
    $SourceVersion = 'https://bribcextension.blob.core.windows.net/devops/bcartifactversion/bc' + $SubVersion
    if ($insider) {
        $SourceVersion += 'insider'
    }
    $SourceVersion += '.json'
    Download-File -SourceURl $SourceVersion.ToLowerInvariant() -destinationFile $TempJson
    $BCVersions = Get-Content $TempJson | ConvertFrom-Json
    Remove-Item $TempJson -Force -ErrorAction SilentlyContinue
    # Master
    $VersionMajor = $BCVersions.Major | Sort-Object | Get-Unique
    if ($VersionMajor.length -gt 1) {
        $VersionMajor = Get-Choice -ChoiceList $VersionMajor -DefaultChoice ($VersionMajor.Length - 1)
    }
    # Minor
    $VersionMinor = ($BCVersions | Where-Object Major -eq $VersionMajor).Minor | Sort-Object | Get-Unique
    if ($VersionMinor.length -gt 1) {
        $VersionMinor = Get-Choice -Caption "Please select a cumulative update" -ChoiceList $VersionMinor -DefaultChoice ($VersionMinor.Length - 1)
    }
    # Country
    $Countries = ($BCVersions | Where-Object Major -eq $VersionMajor | Where-Object Minor -EQ $VersionMinor).country
    if ($Countries.Length -gt 2) {
        $Countries = @("base") + $Countries
    }
    if ($Countries.length -gt 1) {
        $Default = ($Countries.IndexOf("fr"))
        if (($Profil -eq "Developer") -and ($Countries.IndexOf("base") -gt -1 )) {
            $Default = ($Countries.IndexOf("base"))
        }
        $Country = Get-Choice -Caption "Please select a country version" -ChoiceList $Countries -DefaultChoice $Default
    }
    # Get Artifact
    Write-Host "Getting latest D365BC $SubVersion $VersionMajor.$VersionMinor $Countru Artifacts..." -foregroun Yellow
    if ($Insider) {
        $ArtifactURL = Get-BCArtifactUrl -type $SubVersion -Version "$VersionMajor.$VersionMinor" -country $Country -storageAccount bcinsider -Select All -accept_insiderEula
    }
    else {
        $ArtifactURL = Get-BCArtifactUrl -type $SubVersion -Version "$VersionMajor.$VersionMinor" -country $Country
    }
    Write-Host
    Write-Host "Container version : $($ArtifactURL.split('/')[3]) $($ArtifactURL.split('/')[4]) $($ArtifactURL.split('/')[5])" -ForegroundColor Green
    # Container Name
    $ContainerName = ($SubVersion + $VersionMajor + '-' + $VersionMinor + '-' + $Country).ToLower()
    $ContainerName = $ContainerName.Replace('-0', '').Replace('-base', '')
    Write-Host
    $ContainerName = Get-FromUser -Message "Container Name" -DefaultValue $ContainerName
    $ContainerName = $ContainerName.ToLower()
    # Select Extension to Insert
    $TempJson = "$env:TEMP\$([Guid]::newguid().ToString()).json"
    Download-File -SourceURl "https://bribcextension.blob.core.windows.net/devops/availability/$DevOpsSignature/available-extensions.json" -destinationFile $TempJson
    $ExtensionList = (Get-Content $TempJson | ConvertFrom-Json).extension.Name | Sort-Object
    Remove-Item $TempJson -Force -ErrorAction SilentlyContinue
    $AddExtensions = Get-FromList -Values $ExtensionList
    # License File
    $LicenseTemp = "$env:TEMP\$([Guid]::newguid().ToString())"
    if ($ArtifactURL.Split('/')[4].Split('.')[0] -ge 22) { $LicenseSignature = 'bclicense' } else { $LicenseSignature = 'flf' };
    $LicenseCountry = $Country;
    if ($LicenseCountry -eq 'base') { $LicenseCountry = 'w1' };
    Try {
        $LicenseUrl = "https://bribcresource.blob.core.windows.net/resource/license/$DevOpsSignature/$VersionMajor/$LicenseCountry.$LicenseSignature".ToLowerInvariant()
        Download-file -SourceURL $LicenseUrl -destinationFile $LicenseTemp
    }
    catch {
        Try {
            $LicenseUrl = "https://bribcresource.blob.core.windows.net/resource/license/$DevOpsSignature/$VersionMajor/w1.$LicenseSignature".ToLowerInvariant()
            Download-file -SourceURL $LicenseUrl -destinationFile $LicenseTemp
        }
        catch {
            $LicenseUrl = "https://bribcresource.blob.core.windows.net/resource/license/$DevOpsSignature/latest/w1.$LicenseSignature".ToLowerInvariant()
            Download-file -SourceURL $LicenseUrl -destinationFile $LicenseTemp
        }
    }
    # Not a Developpement License
    if ($null -eq (Select-String -Path $LicenseTemp -Pattern "Solution Developer")) {
        $Profil = "Consultant"
    }
    Remove-Item -Path $LicenseTemp -ErrorAction SilentlyContinue


    # Credentials
    $AdminCredential = New-Object System.Management.Automation.PSCredential -argumentList "ADMIN", (ConvertTo-SecureString -String "P@ssword1" -AsPlainText -Force)
    # Shortcuts Folder
    $NewShortcutsFolder = "$($bcContainerHelperConfig.hostHelperFolder)\Extensions\$ContainerName\Shortcuts"
    $AppsFolder = "$($bcContainerHelperConfig.hostHelperFolder)\Extensions\$ContainerName\Apps"
    Remove-Item -Path $NewShortcutsFolder -Recurse -ErrorAction SilentlyContinue -Force | Out-Null
    # Build Container arguments
    $arguments = @{}
    $arguments.containerName = $ContainerName
    $arguments.accept_eula = $true
    $arguments.accept_insiderEula = $true
    $arguments.accept_outdated = $true
    $arguments.alwaysPull = $true
    $arguments.auth = "NavUserPassword"
    $arguments.Credential = $AdminCredential
    $arguments.artifactUrl = $ArtifactURL
    $arguments.memoryLimit = "8G"
    $arguments.licenseFile = $LicenseURL
    $arguments.shortcuts = "Desktop"
    $arguments.assignPremiumPlan = $true
    $arguments.updateHosts = $true
    $arguments.UseBestContainerOS = $true
    $arguments.enableTaskScheduler = $true
    $arguments.timeout = -1
    # $arguments.isolation = "hyperv" ### In case of fail
    if ($Profil -eq "Developer") {
        $arguments.includeTestToolkit = $true
        $arguments.includeTestLibrariesOnly = $true
        if ($VersionMajor -eq 14) {
            $arguments.includeCSide = $true
            $arguments.doNotExportObjectsToText = $true
            $arguments.enableSymbolLoading = $true
        }
    }


    Clear-Host
    # Create Container
    Write-Host "Creating Container $ContainerName" -ForegroundColor Yellow
    New-BcContainer @arguments
    # New Shortcut Folder
    New-Item -Path $NewShortcutsFolder -ItemType Directory -ErrorAction SilentlyContinue -Force | Out-Null
    # Save Log
    Write-Host
    Write-Host "Saving Container log" -ForegroundColor Yellow
    docker logs $ContainerName | Out-File "$NewShortcutsFolder\$ContainerName Container Log.txt" -Force
    # Move shortcuts
    Write-Host
    Write-Host "Moving shortcuts" -ForegroundColor Yellow
    Move-Item -Path "$([Environment]::GetFolderPath("Desktop"))\$ContainerName *" `
        -Destination "$NewShortcutsFolder\" `
        -Force
    # Adding fonts
    Write-Host
    Write-Host "Adding Arial family fonts" -ForegroundColor Yellow
    Add-FontsToBcContainer -containerName $ContainerName -path @("C:\Windows\Fonts\arial*.ttf")
    if (Test-Path "C:\Windows\Fonts\IDAutomation*.ttf") {
        Write-Host "Adding Arial Codabar fonts" -ForegroundColor Yellow
        Add-FontsToBcContainer -containerName $ContainerName -path @("C:\Windows\Fonts\IDAutomation*.ttf")
    }
    # Insert Test Users
    if ($Profil -eq "Developer") {
        Write-Host
        Write-Host "Adding Test Users" -ForegroundColor Yellow
        Setup-BcContainerTestUsers -containerName $ContainerName -credential $AdminCredential
    }
    # Insert Extensions
    Write-Host
    Write-Host "Searching $Source Extensions" -ForegroundColor Yellow
    New-Item -Path $AppsFolder -ItemType Directory -ErrorAction SilentlyContinue -Force | Out-Null
    $bcContainerHelperConfig.TrustedNuGetFeeds = @(
        [PSCustomObject]@{ "url" = "https://pkgs.dev.azure.com/isaISV/_packaging/$SourceApp/nuget/v3/index.json".ToLower();
            "token"              = '4gaswdlecvwh5x22ybfsgf6uagtakrpjfdxt3zpd3bwnvw24wb2a';
            "patterns"           = @("*")
        }
    )
    foreach ($Extension in $AddExtensions) {
        Download-BcNuGetPackageToFolder -packageName ($Extension -replace '[^a-zA-Z]', '') `
            -downloadDependencies allButMicrosoft `
            -folder $AppsFolder
    }
    $AppFiles = @()
    foreach ($Files in (Get-Item "$AppsFolder\*.app")) {
        $AppFiles += $Files.FullName
    }
    Write-Host "Sorting $($AppFiles.Length) extensions..." -ForegroundColor Yellow
    $AppFiles = Sort-AppFilesByDependencies -appFiles $AppFiles
    foreach ($Files in $AppFiles) {
        $ShortName = $Files.split('\')[-1]
        Write-Host " $($ShortName)"
    }
    Write-Host
    Write-Host "Publishing extensions..." -ForegroundColor Yellow
    foreach ($Files in $AppFiles) {
        try {
            Publish-BcContainerApp -containerName $ContainerName -appfile $Files -useDevEndpoint -syncMode ForceSync -install -credential $AdminCredential
        }
        catch {
            Write-Host "$Files not installed." -ForegroundColor Red
        }
    }
    # Create a Cronus Copy
    if ($CopyCRONUS) {
        Write-Host
        Write-Host "Copying CRONUS to zCompany" -ForegroundColor Yellow
        $CompanyInDocker = (Get-CompanyInNavContainer -containerName $ContainerName | Where-Object { $_.CompanyName -like "*CRONUS*" } | Select-Object -First 1).CompanyName
        try {
            Copy-CompanyInBcContainer -containerName $ContainerName `
                -sourceCompanyName $CompanyInDocker `
                -destinationCompanyName "z$CompanyInDocker"
        }
        catch {
            Write-Host "zCompany creation failed." -ForegroundColor Red
        }
    }
    # Launch Browser
    if ($launchBrowser) {
        $URL = Get-Content "$NewShortcutsFolder\$ContainerName Container Log.txt"
        $URL = $URL | Where-Object { $_ -like "Web Client*" }
        $URL = $URL.split(":")[2]
        Write-Host
        Write-Host "Launching Browser http:$URL" -ForegroundColor Yellow
        Start-Process "http:$URL"
    }
    if (!($NoCleanArtifact)) {
        Write-Host
        Write-Host "Cleaning BC Artifacts" -ForegroundColor Yellow
        Docker image prune -f
        Flush-ContainerHelperCache -cache bcartifacts -keepDays 2
    }
}
Export-ModuleMember -Function New-BCDevContainer