#!/usr/bin/env pwsh # Usage example: # # rm .\contrib\win-installer\*.log && # rm .\contrib\win-installer\*.exe && # rm .\contrib\win-installer\*.wixpdb && # .\winmake.ps1 installer && # .\winmake.ps1 installer 9.9.9 && # .\contrib\win-installer\test-installer.ps1 ` # -scenario all ` # -setupExePath ".\contrib\win-installer\podman-5.4.0-dev-setup.exe" ` # -nextSetupExePath ".\contrib\win-installer\podman-9.9.9-dev-setup.exe" ` # -provider hyperv # # The Param statement must be the first statement, except for comments and any #Require statements. param ( [Parameter(Mandatory)] [ValidateSet("test-objects-exist", "test-objects-exist-not", "installation-green-field", "installation-skip-config-creation-flag", "installation-with-pre-existing-podman-exe", "update-without-user-changes", "update-with-user-changed-config-file", "update-with-user-removed-config-file", "update-without-user-changes-to-next", "update-with-user-changed-config-file-to-next", "update-with-user-removed-config-file-to-next", "update-without-user-changes-from-531", "all")] [string]$scenario, [ValidateScript({Test-Path $_ -PathType Leaf})] [string]$setupExePath, [ValidateScript({Test-Path $_ -PathType Leaf})] [string]$previousSetupExePath, [ValidateScript({Test-Path $_ -PathType Leaf})] [string]$nextSetupExePath, [ValidateSet("wsl", "hyperv")] [string]$provider="wsl", [switch]$skipWinVersionCheck=$false, [switch]$skipConfigFileCreation=$false ) . $PSScriptRoot\utils.ps1 $MachineConfPath = "$env:ProgramData\containers\containers.conf.d\99-podman-machine-provider.conf" $PodmanFolderPath = "$env:ProgramFiles\RedHat\Podman" $PodmanExePath = "$PodmanFolderPath\podman.exe" $WindowsPathsToTest = @($PodmanExePath, "$PodmanFolderPath\win-sshproxy.exe", "HKLM:\SOFTWARE\Red Hat\Podman") function Install-Podman { param ( [Parameter(Mandatory)] [ValidateScript({Test-Path $_ -PathType Leaf})] [string]$setupExePath ) if ($skipWinVersionCheck) {$allowOldWinVar = "1"} else {$allowOldWinVar = "0"} if ($skipConfigFileCreation) {$skipConfigFileCreationVar = "1"} else {$skipConfigFileCreationVar = "0"} Write-Host "Running the installer ($setupExePath)..." Write-Host "(provider=`"$provider`", AllowOldWin=`"$allowOldWinVar`", SkipConfigFileCreation=`"$skipConfigFileCreationVar`")" $ret = Start-Process -Wait ` -PassThru "$setupExePath" ` -ArgumentList "/install /quiet ` MachineProvider=${provider} ` AllowOldWin=${allowOldWinVar} ` SkipConfigFileCreation=${skipConfigFileCreationVar} ` /log $PSScriptRoot\podman-setup.log" if ($ret.ExitCode -ne 0) { Write-Host "Install failed, dumping log" Get-Content $PSScriptRoot\podman-setup.log throw "Exit code is $($ret.ExitCode)" } Write-Host "Installation completed successfully!`n" } # Install-Podman-With-Defaults is used to test updates. That's because when # using the installer GUI the user can't change the default values. function Install-Podman-With-Defaults { param ( [Parameter(Mandatory)] [ValidateScript({Test-Path $_ -PathType Leaf})] [string]$setupExePath ) Write-Host "Running the installer using defaults ($setupExePath)..." $ret = Start-Process -Wait ` -PassThru "$setupExePath" ` -ArgumentList "/install /quiet ` /log $PSScriptRoot\podman-setup-default.log" if ($ret.ExitCode -ne 0) { Write-Host "Install failed, dumping log" Get-Content $PSScriptRoot\podman-setup-default.log throw "Exit code is $($ret.ExitCode)" } Write-Host "Installation completed successfully!`n" } function Install-Podman-With-Defaults-Expected-Fail { param ( [Parameter(Mandatory)] [ValidateScript({Test-Path $_ -PathType Leaf})] [string]$setupExePath ) Write-Host "Running the installer using defaults ($setupExePath)..." $ret = Start-Process -Wait ` -PassThru "$setupExePath" ` -ArgumentList "/install /quiet ` /log $PSScriptRoot\podman-setup-default.log" if ($ret.ExitCode -eq 0) { Write-Host "Install completed successfully but a failure was expected, dumping log" Get-Content $PSScriptRoot\podman-setup-default.log throw "Exit code is $($ret.ExitCode)" } Write-Host "Installation has failed as expected!`n" } function Install-Current-Podman { Install-Podman -setupExePath $setupExePath } function Test-Podman-Objects-Exist { Write-Host "Verifying that podman files, folders and registry entries exist..." $WindowsPathsToTest | ForEach-Object { if (! (Test-Path -Path $_) ) { throw "Expected $_ but doesn't exist" } } Write-Host "Verification was successful!`n" } function Test-Podman-Machine-Conf-Exist { Write-Host "Verifying that $MachineConfPath exist..." if (! (Test-Path -Path $MachineConfPath) ) { throw "Expected $MachineConfPath but doesn't exist" } Write-Host "Verification was successful!`n" } function Test-Podman-Machine-Conf-Content { param ( [ValidateSet("wsl", "hyperv")] [string]$expected=$provider ) Write-Host "Verifying that the machine provider configuration is correct..." $machineProvider = Get-Content $MachineConfPath | Select-Object -Skip 1 | ConvertFrom-StringData | ForEach-Object { $_.provider } if ( $machineProvider -ne "`"$expected`"" ) { throw "Expected `"$expected`" as default machine provider but got $machineProvider" } Write-Host "Verification was successful!`n" } function Uninstall-Podman { param ( # [Parameter(Mandatory)] [ValidateScript({Test-Path $_ -PathType Leaf})] [string]$setupExePath ) Write-Host "Running the uninstaller ($setupExePath)..." $ret = Start-Process -Wait ` -PassThru "$setupExePath" ` -ArgumentList "/uninstall ` /quiet /log $PSScriptRoot\podman-setup-uninstall.log" if ($ret.ExitCode -ne 0) { Write-Host "Uninstall failed, dumping log" Get-Content $PSScriptRoot\podman-setup-uninstall.log throw "Exit code is $($ret.ExitCode)" } Write-Host "The uninstallation completed successfully!`n" } function Uninstall-Current-Podman { Uninstall-Podman -setupExePath $setupExePath } function Test-Podman-Objects-Exist-Not { Write-Host "Verifying that podman files, folders and registry entries don't exist..." $WindowsPathsToTest | ForEach-Object { if ( Test-Path -Path $_ ) { throw "Path $_ is present" } } Write-Host "Verification was successful!`n" } function Test-Podman-Machine-Conf-Exist-Not { Write-Host "Verifying that $MachineConfPath doesn't exist..." if ( Test-Path -Path $MachineConfPath ) { throw "Path $MachineConfPath is present" } Write-Host "Verification was successful!`n" } function New-Fake-Podman-Exe { Write-Host "Creating a fake $PodmanExePath..." New-Item -ItemType Directory -Path $PodmanFolderPath -Force -ErrorAction Stop | out-null New-Item -ItemType File -Path $PodmanExePath -ErrorAction Stop | out-null Write-Host "Creation successful!`n" } function Switch-Podman-Machine-Conf-Content { $currentProvider = $provider if ( $currentProvider -eq "wsl" ) { $newProvider = "hyperv" } else { $newProvider = "wsl" } Write-Host "Editing $MachineConfPath content (was $currentProvider, will be $newProvider)..." "[machine]`nprovider=`"$newProvider`"" | Out-File -FilePath $MachineConfPath -ErrorAction Stop Write-Host "Edit successful!`n" return $newProvider } function Remove-Podman-Machine-Conf { Write-Host "Deleting $MachineConfPath..." Remove-Item -Path $MachineConfPath -ErrorAction Stop | out-null Write-Host "Deletion successful!`n" } function Test-Installation { param ( [ValidateSet("wsl", "hyperv")] [string]$expectedConf ) Test-Podman-Objects-Exist Test-Podman-Machine-Conf-Exist if ($expectedConf) { Test-Podman-Machine-Conf-Content -expected $expectedConf } else { Test-Podman-Machine-Conf-Content } } function Test-Installation-No-Config { Test-Podman-Objects-Exist Test-Podman-Machine-Conf-Exist-Not } function Test-Uninstallation { Test-Podman-Objects-Exist-Not Test-Podman-Machine-Conf-Exist-Not } # SCENARIOS function Start-Scenario-Installation-Green-Field { Write-Host "`n===========================================" Write-Host " Running scenario: Installation-Green-Field" Write-Host "===========================================" Install-Current-Podman Test-Installation Uninstall-Current-Podman Test-Uninstallation } function Start-Scenario-Installation-Skip-Config-Creation-Flag { Write-Host "`n=========================================================" Write-Host " Running scenario: Installation-Skip-Config-Creation-Flag" Write-Host "=========================================================" $skipConfigFileCreation = $true Install-Current-Podman Test-Installation-No-Config Uninstall-Current-Podman Test-Uninstallation } function Start-Scenario-Installation-With-Pre-Existing-Podman-Exe { Write-Host "`n============================================================" Write-Host " Running scenario: Installation-With-Pre-Existing-Podman-Exe" Write-Host "============================================================" New-Fake-Podman-Exe Install-Current-Podman Test-Installation-No-Config Uninstall-Current-Podman Test-Uninstallation } function Start-Scenario-Update-Without-User-Changes { param ( [ValidateSet("From-Previous", "To-Next", "From-v531")] [string]$mode="From-Previous" ) Write-Host "`n======================================================" Write-Host " Running scenario: Update-Without-User-Changes-$mode" Write-Host "======================================================" switch ($mode) { 'From-Previous' {$i = $previousSetupExePath; $u = $setupExePath} 'To-Next' {$i = $setupExePath; $u = $nextSetupExePath} 'From-v531' {$i = $v531SetupExePath; $u = $setupExePath} } Install-Podman -setupExePath $i Test-Installation # Updates are expected to succeed except when updating from v5.3.1 # The v5.3.1 installer has a bug that is patched in v5.3.2 # Upgrading from v5.3.1 requires upgrading to v5.3.2 first if ($mode -eq "From-Previous" -or $mode -eq "To-Next") { Install-Podman-With-Defaults -setupExePath $u Test-Installation Uninstall-Podman -setupExePath $u } else { # From-v531 is expected to fail Install-Podman-With-Defaults-Expected-Fail -setupExePath $u Uninstall-Podman -setupExePath $i } Test-Uninstallation } function Start-Scenario-Update-Without-User-Changes-To-Next { Start-Scenario-Update-Without-User-Changes -mode "To-Next" } function Start-Scenario-Update-Without-User-Changes-From-v531 { Start-Scenario-Update-Without-User-Changes -mode "From-v531" } function Start-Scenario-Update-With-User-Changed-Config-File { param ( [ValidateSet("From-Previous", "To-Next")] [string]$mode="From-Previous" ) Write-Host "`n==============================================================" Write-Host " Running scenario: Update-With-User-Changed-Config-File-$mode" Write-Host "==============================================================" switch ($mode) { 'From-Previous' {$i = $previousSetupExePath; $u = $setupExePath} 'To-Next' {$i = $setupExePath; $u = $nextSetupExePath} } Install-Podman -setupExePath $i Test-Installation $newProvider = Switch-Podman-Machine-Conf-Content Install-Podman-With-Defaults -setupExePath $u Test-Installation -expectedConf $newProvider Uninstall-Podman -setupExePath $u Test-Uninstallation } function Start-Scenario-Update-With-User-Changed-Config-File-To-Next { Start-Scenario-Update-With-User-Changed-Config-File -mode "To-Next" } function Start-Scenario-Update-With-User-Removed-Config-File { param ( [ValidateSet("From-Previous", "To-Next")] [string]$mode="From-Previous" ) Write-Host "`n==============================================================" Write-Host " Running scenario: Update-With-User-Removed-Config-File-$mode" Write-Host "==============================================================" switch ($mode) { 'From-Previous' {$i = $previousSetupExePath; $u = $setupExePath} 'To-Next' {$i = $setupExePath; $u = $nextSetupExePath} } Install-Podman -setupExePath $i Test-Installation Remove-Podman-Machine-Conf Install-Podman-With-Defaults -setupExePath $u Test-Installation-No-Config Uninstall-Podman -setupExePath $u Test-Uninstallation } function Start-Scenario-Update-With-User-Removed-Config-File-To-Next { Start-Scenario-Update-With-User-Removed-Config-File -mode "To-Next" } switch ($scenario) { 'test-objects-exist' { Test-Podman-Objects-Exist } 'test-objects-exist-not' { Test-Podman-Objects-Exist-Not } 'installation-green-field' { Start-Scenario-Installation-Green-Field } 'installation-skip-config-creation-flag' { Start-Scenario-Installation-Skip-Config-Creation-Flag } 'installation-with-pre-existing-podman-exe' { Start-Scenario-Installation-With-Pre-Existing-Podman-Exe } 'update-without-user-changes' { if (!$previousSetupExePath) { $previousSetupExePath = Get-Latest-Podman-Setup-From-GitHub } Start-Scenario-Update-Without-User-Changes } 'update-without-user-changes-to-next' { if (!$nextSetupExePath) { throw "Next version installer path is not defined. Use '-nextSetupExePath ' to define it." } Start-Scenario-Update-Without-User-Changes-To-Next } 'update-without-user-changes-from-531' { if (!$v531SetupExePath) { $v531SetupExePath = Get-Podman-Setup-From-GitHub -version "tags/v5.3.1" } Start-Scenario-Update-Without-User-Changes-From-v531 } 'update-with-user-changed-config-file' { if (!$previousSetupExePath) { $previousSetupExePath = Get-Latest-Podman-Setup-From-GitHub } Start-Scenario-Update-With-User-Changed-Config-File } 'update-with-user-changed-config-file-to-next' { if (!$nextSetupExePath) { throw "Next version installer path is not defined. Use '-nextSetupExePath ' to define it." } Start-Scenario-Update-With-User-Changed-Config-File-To-Next } 'update-with-user-removed-config-file' { if (!$previousSetupExePath) { $previousSetupExePath = Get-Latest-Podman-Setup-From-GitHub } Start-Scenario-Update-With-User-Removed-Config-File } 'update-with-user-removed-config-file-to-next' { if (!$nextSetupExePath) { throw "Next version installer path is not defined. Use '-nextSetupExePath ' to define it." } Start-Scenario-Update-With-User-Removed-Config-File-To-Next } 'all' { if (!$nextSetupExePath) { throw "Next version installer path is not defined. Use '-nextSetupExePath ' to define it." } if (!$previousSetupExePath) { $previousSetupExePath = Get-Latest-Podman-Setup-From-GitHub } if (!$v531SetupExePath) { $v531SetupExePath = Get-Podman-Setup-From-GitHub -version "tags/v5.3.1" } Start-Scenario-Installation-Green-Field Start-Scenario-Installation-Skip-Config-Creation-Flag Start-Scenario-Installation-With-Pre-Existing-Podman-Exe Start-Scenario-Update-Without-User-Changes Start-Scenario-Update-Without-User-Changes-To-Next Start-Scenario-Update-With-User-Changed-Config-File Start-Scenario-Update-With-User-Changed-Config-File-To-Next Start-Scenario-Update-With-User-Removed-Config-File Start-Scenario-Update-With-User-Removed-Config-File-To-Next Start-Scenario-Update-Without-User-Changes-From-v531 } }