fix: skip node removal in 2-node cluster integration tests

Removing a node from a 2-node PVE cluster via REST API is not supported
— the remaining node loses quorum mid-operation, causing "no quorum!"
errors. PVE requires stopping corosync on the departing node first
(pvecm expected 1), which is not available via the REST API.

Replace removal tests with a final cluster state verification.
Test infrastructure handles cleanup via reprovisioning.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Clint Branham
2026-03-25 09:32:28 -05:00
parent 988b1446b0
commit 4d9533ae36
@@ -107,23 +107,8 @@ BeforeAll {
}
AfterAll {
# Best-effort cleanup — each step may fail if cluster state is partial
if ($script:ClusterCreated -and $script:NodeBName -and $script:Password) {
try {
# Reconnect as root@pam for privileged cleanup
$secPw = ConvertTo-SecureString $script:Password -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential('root@pam', $secPw)
Connect-PveServer -Server $script:Host_ -Port $script:Port -Credential $cred -SkipCertificateCheck
Write-Warning "Cleanup: removing node '$($script:NodeBName)' from cluster..."
Remove-PveClusterConfigNode -Node $script:NodeBName -Confirm:$false -ErrorAction Stop
}
catch {
Write-Warning "Cleanup: failed to remove node B from cluster: $_"
}
}
# Disconnect any active sessions
# Node removal from a 2-node cluster is not possible via API (quorum loss).
# Test infrastructure handles cleanup via reprovisioning.
try { Disconnect-PveServer -ErrorAction SilentlyContinue } catch { }
}
@@ -423,41 +408,18 @@ Describe 'Cluster Config & HA Lifecycle — Integration' -Tag 'Integration' {
}
# -------------------------------------------------------------------
Context 'Remove node B and cleanup' {
It 'Remove-PveClusterConfigNode removes node B' {
if (Skip-IfNoNodeB) { return }
if (Skip-IfNoCluster) { return }
if (-not $script:NodeBName) {
Set-ItResult -Skipped -Because 'Node B name was not discovered'
return
}
# Ensure we are connected to node A as root@pam (node removal requires it)
$secPw = ConvertTo-SecureString $script:Password -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential('root@pam', $secPw)
Connect-PveServer `
-Server $script:Host_ `
-Port $script:Port `
-Credential $cred `
-SkipCertificateCheck
{ Remove-PveClusterConfigNode -Node $script:NodeBName -Confirm:$false -ErrorAction Stop } |
Should -Not -Throw
# Clear the name so AfterAll does not try to remove again
$script:NodeBName = $null
# Wait for config to propagate
Start-Sleep -Seconds 5
}
It 'Get-PveClusterConfigNode shows only node A' {
# NOTE: Removing a node from a 2-node cluster via API is not supported
# because the remaining node loses quorum mid-operation. PVE requires
# stopping corosync on the departing node first (pvecm expected 1),
# which is not available via the REST API. Test infrastructure handles
# cleanup via reprovisioning.
Context 'Verify cluster state at end of test' {
It 'Get-PveClusterConfigNode shows both nodes still present' {
if (Skip-IfNoNodeB) { return }
if (Skip-IfNoCluster) { return }
$nodes = Get-PveClusterConfigNode -ErrorAction Stop
@($nodes).Count | Should -Be 1
@($nodes)[0].Name | Should -Be $script:Node
@($nodes).Count | Should -BeGreaterOrEqual 2
}
}
}