diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a86080b7..8b724ac0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -867,6 +867,18 @@ jobs: Start-Sleep -Seconds 2 } while ($true) + # Storage Spaces Direct clusters have a Health resource (type "Health + # Service") that answers CLUSCTL_RESOURCE_GET_CLASS_INFO with only the + # class DWORD (#2669). S2D itself claims every disk of an allowed bus + # type, and marking the other VHDX disks as not claimable removes them + # from the host, which breaks the other steps. Disks from a loopback + # iSCSI target vanish when the node joins the cluster, because the + # iSCSI Target Server then only serves clustered targets. So register + # the resource directly. It stays offline without S2D. + if ($null -eq (Get-ClusterResource -Name "Health" -ErrorAction SilentlyContinue)) { + Add-ClusterResource -Name "Health" -ResourceType "Health Service" -Group "Cluster Group" | Out-Null + } + Get-Cluster | Format-List Name, AdministrativeAccessPoint Get-ClusterNode | Format-Table Name, State, NodeWeight, DynamicWeight Get-ClusterNetwork | Format-Table Name, State, Role, Address diff --git a/internal/collector/mscluster/AGENTS.md b/internal/collector/mscluster/AGENTS.md index 4702c175..f0c02b56 100644 --- a/internal/collector/mscluster/AGENTS.md +++ b/internal/collector/mscluster/AGENTS.md @@ -27,6 +27,17 @@ two groups (`CIResources`, `CIFailedResources`) on a private network of an internal Hyper-V switch; the parity tests require them. It has no clustered disks, so shared volume parity still compares empty sets. + The "Cluster Group" also holds an offline "Health Service" resource + without Storage Spaces Direct. It answers `CLUSCTL_RESOURCE_GET_CLASS_INFO` + with only 4 bytes, like the Health resource of S2D clusters (#2669). S2D + itself cannot be enabled on the runner: it claims every VHDX disk of the + other steps, and `Set-ClusterStorageSpacesDirectDisk -CanBeClaimed $false` + removes those disks from the host instead of leaving them alone. Disks from + a loopback iSCSI target (with `S2DBusTypes` limited to iSCSI) appear before + `New-Cluster`, but the session and the target are gone after it: once the + node is clustered, the iSCSI Target Server only serves clustered targets. + A clustered target needs a cluster disk for its files, and + `Get-ClusterAvailableDisk` does not list a host-mounted VHDX. - Property lists returned by the cluster service end with an extra `CLUSPROP_SYNTAX_ENDMARK` after the last value list; fixtures built only from the documentation miss this. The parser validates only the structure and