From fb4ddf86cc214941ba04eb93432498c2d44e2ea3 Mon Sep 17 00:00:00 2001 From: Mario Loriedo Date: Fri, 12 Apr 2024 18:32:12 +0200 Subject: [PATCH] Add Hyper-V option in windows installer podman.msi GUI has a radio-button to select WSL or Hyper-V The checkbox in podman.msi GUI allow the user to specify if the machine provider installation (WSL or Hyper-V) should be part of podman installation or not. podman-setup.exe supports 2 new variables: MachineProvider (valid values are `wsl` and `hyperv`) and HyperVCheckbox (valid values are `0` and `1`) Installation creates the configuration file `99-podman-machine-provider.conf` under folder `%APPDATA\containers\containers.conf.d` with the selected machine provider Cirrus CI `win_installer_task` tests the installation with both `hyperv` and `wsl` and verifies the configuration. Uninstallation is tested too. Note that podman-setup.exe GUI doesn't allow to choose the provider yet. See https://github.com/containers/podman/issues/22492 Signed-off-by: Mario Loriedo --- .cirrus.yml | 5 + .gitignore | 10 ++ contrib/cirrus/win-installer-main.ps1 | 51 +++++++- contrib/win-installer/burn.wxs | 8 +- contrib/win-installer/podman-msihooks/check.c | 66 +++++++++- contrib/win-installer/podman.wxs | 121 +++++++++++++++++- .../win-installer/resources/podman-dialog.png | Bin 14142 -> 15039 bytes contrib/win-installer/welcome-install-dlg.wxs | 80 +++++++----- 8 files changed, 294 insertions(+), 47 deletions(-) diff --git a/.cirrus.yml b/.cirrus.yml index fc38608def..c27bb1b3bc 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -486,6 +486,11 @@ swagger_task: win_installer_task: name: "Verify Win Installer Build" + matrix: + - env: + CONTAINERS_MACHINE_PROVIDER: 'wsl' + - env: + CONTAINERS_MACHINE_PROVIDER: 'hyperv' alias: win_installer only_if: # RHEL never releases podman windows installer binary $CIRRUS_TAG == '' && diff --git a/.gitignore b/.gitignore index 5e440f1d99..7ea6620913 100644 --- a/.gitignore +++ b/.gitignore @@ -44,3 +44,13 @@ result # Necessary to prevent hack/tree-status.sh false-positive /*runner_stats.log .generate-bindings +contrib/win-installer/artifacts/ +contrib/win-installer/docs/ +contrib/win-installer/fetch/ +contrib/win-installer/podman.msi +contrib/win-installer/podman-*setup.exe +contrib/win-installer/engine.exe +contrib/win-installer/shasums +contrib/win-installer/pages.wxs +contrib/win-installer/*.wixobj +contrib/win-installer/*.wixpdb diff --git a/contrib/cirrus/win-installer-main.ps1 b/contrib/cirrus/win-installer-main.ps1 index 8bf6764ac3..c951a01f68 100644 --- a/contrib/cirrus/win-installer-main.ps1 +++ b/contrib/cirrus/win-installer-main.ps1 @@ -2,22 +2,59 @@ . $PSScriptRoot\win-lib.ps1 -Set-Location "$ENV:CIRRUS_WORKING_DIR\repo\contrib\win-installer" +if ($Env:CI -eq "true") { + $WIN_INST_FOLDER = "$ENV:CIRRUS_WORKING_DIR\repo\contrib\win-installer" + $RELEASE_DIR = "$ENV:CIRRUS_WORKING_DIR\repo" +} else { + $WIN_INST_FOLDER = "$PSScriptRoot\..\win-installer" + $ENV:WIN_INST_VER = "9.9.9" + $RELEASE_DIR = "$PSScriptRoot\..\.." + $ENV:CONTAINERS_MACHINE_PROVIDER = "wsl" +} + +$ConfFilePath = "$env:ProgramData\containers\containers.conf.d\99-podman-machine-provider.conf" +$WindowsPathsToTest = @("C:\Program Files\RedHat\Podman\podman.exe", + "C:\Program Files\RedHat\Podman\win-sshproxy.exe", + "$ConfFilePath", + "HKLM:\SOFTWARE\Red Hat\Podman") + +Set-Location $WIN_INST_FOLDER # Build Installer # Note: consumes podman-remote-release-windows_amd64.zip from repo.tbz2 -Run-Command ".\build.ps1 $Env:WIN_INST_VER dev `"$ENV:CIRRUS_WORKING_DIR\repo`"" +Run-Command ".\build.ps1 $Env:WIN_INST_VER dev `"$RELEASE_DIR`"" -# Run the installer silently and WSL install option disabled (prevent reboots, wsl requirements) +# Run the installer silently and WSL/HyperV install options disabled (prevent reboots) # We need AllowOldWin=1 for server 2019 (cirrus image), can be dropped after server 2022 -$ret = Start-Process -Wait -PassThru ".\podman-${ENV:WIN_INST_VER}-dev-setup.exe" -ArgumentList "/install /quiet WSLCheckbox=0 AllowOldWin=1 /log inst.log" +$ret = Start-Process -Wait -PassThru ".\podman-${ENV:WIN_INST_VER}-dev-setup.exe" -ArgumentList "/install /quiet MachineProvider=$ENV:CONTAINERS_MACHINE_PROVIDER WSLCheckbox=0 HyperVCheckbox=0 AllowOldWin=1 /log inst.log" if ($ret.ExitCode -ne 0) { Write-Host "Install failed, dumping log" Get-Content inst.log throw "Exit code is $($ret.ExitCode)" } -if (! ((Test-Path -Path "C:\Program Files\RedHat\Podman\podman.exe") -and ` - (Test-Path -Path "C:\Program Files\RedHat\Podman\win-sshproxy.exe"))) { - throw "Expected podman.exe and win-sshproxy.exe, one or both not present after install" +$WindowsPathsToTest | ForEach-Object { + if (! (Test-Path -Path $_) ) { + throw "Expected $_ but it's not present after uninstall" + } } +$machineProvider = Get-Content $ConfFilePath | Select-Object -Skip 1 | ConvertFrom-StringData | ForEach-Object { $_.provider } +if ( $machineProvider -ne "`"$ENV:CONTAINERS_MACHINE_PROVIDER`"" ) { + throw "Expected `"$ENV:CONTAINERS_MACHINE_PROVIDER`" as default machine provider but got $machineProvider" +} + Write-Host "Installer verification successful!" + +# Run the uninstaller silently to verify that it cleans up properly +$ret = Start-Process -Wait -PassThru ".\podman-${ENV:WIN_INST_VER}-dev-setup.exe" -ArgumentList "/uninstall /quiet /log uninst.log" +if ($ret.ExitCode -ne 0) { + Write-Host "Uninstall failed, dumping log" + Get-Content uninst.log + throw "Exit code is $($ret.ExitCode)" +} +$WindowsPathsToTest | ForEach-Object { + if ( Test-Path -Path $_ ) { + throw "Path $_ is still present after uninstall" + } +} + +Write-Host "Uninstaller verification successful!" diff --git a/contrib/win-installer/burn.wxs b/contrib/win-installer/burn.wxs index ae352e6c90..6a367c5457 100644 --- a/contrib/win-installer/burn.wxs +++ b/contrib/win-installer/burn.wxs @@ -17,10 +17,13 @@ + + + @@ -35,9 +38,12 @@ + + + - + diff --git a/contrib/win-installer/podman-msihooks/check.c b/contrib/win-installer/podman-msihooks/check.c index 1a3b10e479..2925c0b8f4 100644 --- a/contrib/win-installer/podman-msihooks/check.c +++ b/contrib/win-installer/podman-msihooks/check.c @@ -2,7 +2,9 @@ #include BOOL isWSLEnabled(); +BOOL isHyperVEnabled(); LPCWSTR boolToNStr(BOOL bool); +LPCSTR szSvcNameHyperv = TEXT("vmms"); /** * CheckWSL is a custom action loaded by the Podman Windows installer @@ -28,6 +30,19 @@ LPCWSTR boolToNStr(BOOL bool); return 0; } +/** + * CheckHyperV is a custom action loaded by the Podman Windows installer + * to determine whether the system already has Hyper-V installed. + */ + + __declspec(dllexport) UINT __cdecl CheckHyperV(MSIHANDLE hInstall) { + BOOL hasHyperV = isHyperVEnabled(); + // Set a property with the HyperV state for the installer to operate on + MsiSetPropertyW(hInstall, L"HAS_HYPERVFEATURE", boolToNStr(hasHyperV)); + + return 0; +} + LPCWSTR boolToNStr(BOOL bool) { return bool ? L"1" : L"0"; } @@ -51,7 +66,7 @@ BOOL isWSLEnabled() { // CreateProcessW requires lpCommandLine to be mutable wchar_t cmd[] = L"wsl --set-default-version 2"; if (! CreateProcessW(NULL, cmd, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, - NULL, NULL, &startup, &process)) { + NULL, NULL, &startup, &process)) { return FALSE; } @@ -64,3 +79,52 @@ BOOL isWSLEnabled() { return exitCode == 0; } + +BOOL isHyperVEnabled() { + /* + * Checks if the Windows service `vmms` is running to + * determine if Hyper-V is enabled. + */ + SC_HANDLE schSCManager; + SC_HANDLE schService; + SERVICE_STATUS_PROCESS ssStatus; + DWORD dwBytesNeeded; + + // Get a handle to the SCM database. + schSCManager = OpenSCManager( + NULL, // local computer + NULL, // servicesActive database + SERVICE_QUERY_STATUS); // service query access rights + + if (NULL == schSCManager) { + return FALSE; + } + + // Get a handle to the service. + schService = OpenService( + schSCManager, + szSvcNameHyperv, + SERVICE_QUERY_STATUS); + + if (schService == NULL) { + CloseServiceHandle(schSCManager); + return FALSE; + } + + // Check the status + if (!QueryServiceStatusEx( + schService, // handle to service + SC_STATUS_PROCESS_INFO, // information level + (LPBYTE) &ssStatus, // address of structure + sizeof(SERVICE_STATUS_PROCESS), // size of structure + &dwBytesNeeded ) ) { + CloseServiceHandle(schService); + CloseServiceHandle(schSCManager); + return FALSE; + } + + CloseServiceHandle(schService); + CloseServiceHandle(schSCManager); + + return ssStatus.dwCurrentState == SERVICE_RUNNING; +} diff --git a/contrib/win-installer/podman.wxs b/contrib/win-installer/podman.wxs index 84db5e1cc9..d1590c85ef 100644 --- a/contrib/win-installer/podman.wxs +++ b/contrib/win-installer/podman.wxs @@ -20,7 +20,83 @@ - NOT (WITH_WSL = 0) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -48,6 +124,22 @@ + + + + + + + + CREATE_MACHINE_PROVIDER_CONFIG_FILE + + + + @@ -57,16 +149,24 @@ - + + - - (NOT Installed) AND WSL_INSTALL = 1 AND HAS_WSLFEATURE = 0 - + + (NOT Installed) AND WSL_INSTALL = 1 + + + + (NOT Installed) AND HYPERV_INSTALL = 1 + + + + @@ -76,8 +176,10 @@ + + @@ -94,8 +196,13 @@ - WSL_INSTALL = 1 - (NOT Installed) AND WSL_INSTALL = 1 AND HAS_WSLFEATURE = 0 AND NOT AFTERREBOOT + + + + (NOT Installed) + AND ((WSL_INSTALL = 1) OR (HYPERV_INSTALL = 1)) + AND (NOT AFTERREBOOT) + diff --git a/contrib/win-installer/resources/podman-dialog.png b/contrib/win-installer/resources/podman-dialog.png index cf0c49d984f85dbeab7a401c2a3db29dfa9ca8db..946bd095ade3293e68ff0d640f6931cb7c2de1e0 100644 GIT binary patch literal 15039 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 literal 14142 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 diff --git a/contrib/win-installer/welcome-install-dlg.wxs b/contrib/win-installer/welcome-install-dlg.wxs index cc0f1c6433..325cd74821 100644 --- a/contrib/win-installer/welcome-install-dlg.wxs +++ b/contrib/win-installer/welcome-install-dlg.wxs @@ -1,31 +1,49 @@ - - - - - - - - - - - - - !(wix.WixUICostingPopupOptOut) OR CostingComplete = 1 - 1]]> - OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND (PROMPTROLLBACKCOST="P" OR NOT PROMPTROLLBACKCOST) - OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND PROMPTROLLBACKCOST="D" - OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND PROMPTROLLBACKCOST="D" - (OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 1) OR (OutOfDiskSpace = 1 AND PROMPTROLLBACKCOST="F") - - - 1 - - - - - - - NOT Installed - - - + + + + + + + + + + HIDE_PROVIDER_CHOICE + + + + + + + HIDE_PROVIDER_CHOICE + + + MACHINE_PROVIDER = "wsl" + MACHINE_PROVIDER = "hyperv" OR HIDE_PROVIDER_CHOICE + HAS_WSLFEATURE = 1 + + + MACHINE_PROVIDER = "hyperv" + MACHINE_PROVIDER = "wsl" OR HIDE_PROVIDER_CHOICE + HAS_HYPERVFEATURE = 1 + + + + !(wix.WixUICostingPopupOptOut) OR CostingComplete = 1 + 1]]> + OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND (PROMPTROLLBACKCOST="P" OR NOT PROMPTROLLBACKCOST) + OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND PROMPTROLLBACKCOST="D" + OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND PROMPTROLLBACKCOST="D" + (OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 1) OR (OutOfDiskSpace = 1 AND PROMPTROLLBACKCOST="F") + + + 1 + + + + + + + NOT Installed + + +