podman-build/contrib/win-installer/test-installer.ps1
2025-10-11 12:30:35 +09:00

437 lines
16 KiB
PowerShell

#!/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 <setup-exe-path>' 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 <setup-exe-path>' 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 <setup-exe-path>' 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 <setup-exe-path>' 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
}
}