Public/Switch-P1Version.ps1

function Switch-P1Version {
    <#
    .Synopsis
    Switch to another version an existing PlannerOne tenant (service + web app).

    .Description
    Switch an existing PlannerOne tenant to another version.
    Warning: PlannerOne service will be restarted during the process.

    .Parameter Tenant
    The tenant name.

    .Parameter Version
    The version to switch to.

    .Example
    # Switch a PlannerOne tenant named P1Prod to V6.0.1624.73941.
    Switch-P1Tenant -Tenant P1Prod -Version 6.0.1624.73941
    #>

    [cmdletbinding()]
    param( 
        [Parameter(Mandatory=$true)]
        [string] $Tenant,
        [string] $Version,
        [string] $WebAppName,
        [string] $LegacySite
    )
    Process
    {
        if ($Version -eq "") {
            $VersionStr = "LAST"
        } else {
            $VersionStr = $Version
        }

        Write-Section "Switch tenant $Tenant to version $VersionStr"

        if (!(Test-Tenant $Tenant)) {
            Write-Warning "Tenant $Tenant does not exist."
            Write-Warning "Type Get-P1Tenant for a list of tenants."
            return
        }

        $TenantInfo = Get-P1Tenant $Tenant
        $Adapter = $TenantInfo.Adapter

# Retro compatibility with legacy NAV tooling
        if ($Adapter -eq "") {
            $Adapter = "NAV"
        }

        $erp = $AdapterToERP.Get_Item($Adapter)

        $packageSrvName = Get-PackageName $P1SrvPackage $erp
        if ($Version -eq "") {
            $package = Get-Package $packageSrvName
        } else {
            $package = Get-Package -Name $packageSrvName -RequiredVersion $Version
        }

        if ($package -eq $null) {    
            Write-Warning "Package $packageSrvName does not exist for version: $VersionStr."
            Write-Warning "Call 'Get-Package $packageSrvName -AllVersion' to get a list of available package versions."
            Write-Warning "Call Install-P1Package $packageSrvName to get last package version."
            return
        }

        $packageWebName = Get-PackageName $P1WebPackage $erp
        if ($Version -eq "") {
            $package = Get-Package $packageWebName
        } else {
            $package = Get-Package -Name $packageWebName -RequiredVersion $Version
        }

        if ($package -eq $null) {    
            Write-Warning "Package $packageWebName does not exist for version: $VersionStr."
            Write-Warning "Call 'Get-Package $packageWebName -AllVersion' to get a list of available package versions."
            Write-Warning "Call Install-P1Package $packageWebName to get last package version."
            return
        }


        $serviceName = Get-ServiceNameFromTenant $Tenant
        $service = Get-Service -Name $serviceName
        if ($service -eq $null) {
                Write-Warning "Service $serviceName does not exist"
                Write-Warning "Switch operation canceled"
                return
        }
                
        if ($Version -eq "") {
            $srvBinPath = Get-PackageFolder $packageSrvName
        } else {
            $srvBinPath = Get-PackageFolderForVersion $packageSrvName $Version
        }

        Write-Verbose "Server package folder is $srvBinPath"
        $srvBinFolder = "AppServer"

        #Test if service already exists
        # Link folder to repository
        $serverPath = $TenantInfo.Path
        Write-Verbose "Server path is $serverPath"
        if (!(Test-Path $serverPath)) {
            Write-Warning "$serverPath does not exist."
            Write-Warning "Switch operation canceled."
            return
        }
        
        if ($LegacySite -eq "") {
            $siteName = Get-SiteNameFromTenant $Tenant
        } else {
            Write-Verbose "Site name forced to $LegacySite"
            $siteName = $LegacySite
        }

        if (!$WebAppName) {
            $WebAppName = Get-WebAppNameFromTenant $Tenant
        }

        $sitePath = "$IISRootPath\$siteName"
        $webAppPath = "$sitePath\$WebAppName"
        Write-Verbose "Web app path is $webAppPath"
                
        if ($Version -eq "") {
            $webBinPath = Get-PackageFolder $packageWebName
        } else {
            $WebBinPath = Get-PackageFolderForVersion $packageWebName $Version
        }

        Write-Verbose "Web package folder is $webBinPath"

        if (!(Test-Path $webAppPath)) {
            Write-Warning "$webAppPath does not exist."
            Write-Warning "Switch operation canceled."
            return
        }

        $webApp = Get-P1WebApplication $Tenant
        $poolName = $webApp.applicationPool

        Write-Output "Stopping web application $poolName"
        Stop-WebAppPool "$poolName"

        Write-Output "Stopping service $serviceName"
        Stop-ServiceAndProcess $serviceName
        
        Write-Output "Switching server..."
        Remove-Symlink $serverPath
        New-Symlink $serverPath "$srvBinPath\$srvBinFolder"

        Write-Output "Switching web application..."
        Remove-Symlink $webAppPath
        New-Symlink $webAppPath "$webBinPath\WebServer"
        Restore-P1WebSecurity $Tenant
        $logLevel = Get-P1LogLevel $Tenant

        Write-Output "Reapplying log level configuration"
        Set-P1LogLevel -Tenant $Tenant -Level $logLevel -NoPersist

        Write-Output "Starting service..."
        Start-Service $serviceName

        Write-Output "Starting web application $poolName"
        Start-WebAppPool "$poolName"

        Write-OK "Tenant '$Tenant' switched"
    }
}