Skip to content

Cluster Snapshot JSON Schema

The .json file written to every per-run folder by Invoke-S2DCartographer (and by New-S2DReport -Format Json) is a structured snapshot of the collected cluster data. The schema is a stable API — downstream tools can depend on the shape of this file.

  • File name: S2DCartographer_<ClusterName>_<yyyyMMdd-HHmm>.json
  • Encoding: UTF-8
  • Pretty-printed: yes (for git-diff friendliness)
  • Canonical sample: samples/cluster-snapshot.json

Versioning

The top-level SchemaVersion field is SemVer-ish:

  • Minor bumps (e.g., 1.01.1) — additive changes only (new optional fields)
  • Major bumps (e.g., 1.x2.0) — rename, removal, or meaning change of an existing field

Downstream tools should read SchemaVersion, tolerate minor bumps, and fail fast on major bumps with a clear message.

Current version: 1.0

Top-level shape

json
{
  "SchemaVersion": "1.0",
  "Generated": { ... },
  "Cluster": { ... },
  "OverallHealth": "Healthy | Warning | Critical | Fail | Unknown",
  "PhysicalDisks": [ ... ],
  "StoragePool": { ... },
  "Volumes": [ ... ],
  "CacheTier": { ... },
  "CapacityWaterfall": { ... },
  "HealthChecks": [ ... ]
}

Generated

Metadata about the run that produced this snapshot.

FieldTypeDescription
Timestampstring (ISO 8601 UTC)When the JSON was written
ModuleVersionstringS2DCartographer module version that produced the file
AuthorstringPassed via -Author on the run (may be empty)
CompanystringPassed via -Company on the run (may be empty)

Cluster

Cluster metadata and node list.

FieldTypeDescription
NamestringCluster name as returned by the cluster itself
FqdnstringResolved FQDN used for the CIM session
NodeCountintNumber of cluster nodes
Nodesarray of stringShort node names
CollectedAtstring (ISO 8601 UTC)When collection started

OverallHealth

Rolled-up health status computed from HealthChecks[]. One of:

  • Healthy — every check passed
  • Warning — at least one non-critical check failed
  • Critical / Fail — at least one critical check failed
  • Unknown — checks were skipped (-SkipHealthChecks)

PhysicalDisks[]

One entry per physical disk visible to any cluster node. Every disk is included, including boot drives and SAN-presented LUNs — use IsPoolMember to filter if you only want S2D pool members.

FieldTypeDescription
NodeNamestringNode where the disk is enumerated
DiskNumberintWindows disk number
UniqueIdstringDisk unique ID
FriendlyNamestringHuman-friendly disk name
SerialNumberstringManufacturer serial
ModelstringModel string
MediaTypestringNVMe / SSD / HDD / Unspecified
BusTypestringNVMe / SAS / SATA / FC / etc.
FirmwareVersionstringFirmware string
ManufacturerstringVendor name
RolestringCache / Capacity / Unknown (Unknown means not a pool member)
UsagestringWindows disk usage: Auto-Select / Journal / ManualSelect / HotSpare
CanPoolboolWindows reports that this disk could be added to a pool
IsPoolMemberboolWhether the disk is a member of the S2D storage pool. Filter on this to exclude boot drives / SAN LUNs.
HealthStatusstringHealthy / Warning / Unhealthy / Unknown
OperationalStatusstringWindows operational status
PhysicalLocationstringEnclosure / slot description
SlotNumberintPhysical slot number
SizeS2DCapacityDisk capacity
SizeBytesint64Convenience — flat bytes
TemperatureintCelsius (if reported)
WearPercentageintSSD wear % (NVMe / SSD only)
PowerOnHoursintCumulative power-on hours
ReadErrors / WriteErrorsintCounters
ReadLatency / WriteLatencyintMilliseconds

StoragePool

Properties of the single S2D storage pool.

FieldTypeDescription
FriendlyNamestringPool name
HealthStatusstringHealthy / Warning / Unhealthy
OperationalStatusstringWindows operational status
IsReadOnlybool
TotalSizeS2DCapacityFull pool capacity
AllocatedSizeS2DCapacityConsumed by volumes
RemainingSizeS2DCapacityFree pool space
ProvisionedSizeS2DCapacityLogical sum of volume sizes (thin-provisioning visible here)
OvercommitRatiodoubleProvisionedSize / TotalSize
FaultDomainAwarenessstringStorageScaleUnit / Rack / etc.
ResiliencySettingsarrayPer-setting resiliency definitions
StorageTiersarrayPool tier definitions

Volumes[]

One entry per volume in the pool.

FieldTypeDescription
FriendlyNamestringVolume name
FileSystemstringReFS / NTFS / CSVFS_ReFS
ResiliencySettingNamestringMirror / Parity / Mirror-Accelerated Parity
NumberOfDataCopiesint2 / 3 for two-way / three-way mirror
PhysicalDiskRedundancyintFailures the volume can survive
ProvisioningTypestringThin / Fixed
SizeS2DCapacityVolume size presented to VMs
FootprintOnPoolS2DCapacityActual pool consumption (size × resiliency multiplier)
AllocatedSizeS2DCapacityData written
EfficiencyPercentdoubleSize / FootprintOnPool × 100
OvercommitRatiodoubleFor thin volumes
IsInfrastructureVolumeboolAzure Local management-plane volume
IsDeduplicationEnabledbool
HealthStatus / OperationalStatusstring

CacheTier

FieldTypeDescription
CacheModestringReadWrite / ReadOnly / Disabled
IsAllFlashboolAll-flash cluster detection
SoftwareCacheEnabledboolS2D software write-back cache enabled
CacheDiskCountintNumber of cache drives across all nodes
CacheDiskModelstringCache drive model
CacheDiskSizeS2DCapacityPer-drive size
CacheToCapacityRatiodoubleRatio of cache bytes to capacity bytes
CacheStatestringActive / Degraded / Disabled
WriteCacheSizeBytesint64Bytes per capacity drive reserved for cache

CapacityWaterfall

The 7-stage capacity accounting model.

FieldTypeDescription
Stagesarray of S2DWaterfallStageOrdered array, 8 entries
RawCapacityS2DCapacityStage 1
UsableCapacityS2DCapacityStage 7 (pipeline terminus)
ReserveRecommendedS2DCapacityBest-practice reserve
ReserveActualS2DCapacityActual free pool space
ReserveStatusstringAdequate / Warning / Critical
IsOvercommittedboolPool is overcommitted
OvercommitRatiodoubleOvercommit ratio
NodeCountintNodes used in the calculation
BlendedEfficiencyPercentdoubleWeighted resiliency efficiency across volumes

Stages[] entry (S2DWaterfallStage)

FieldTypeDescription
Stageint1–8
NamestringStage name
SizeS2DCapacityRemaining capacity at this stage
DeltaS2DCapacityReduction from previous stage
DescriptionstringHuman-readable description
StatusstringOK / Warn / Fail

HealthChecks[]

One entry per check (10 at time of writing).

FieldTypeDescription
CheckNamestringStable identifier (e.g., ReserveAdequacy, DiskSymmetry, NVMeWear)
SeveritystringInfo / Warning / Critical
StatusstringPass / Warn / Fail
DetailsstringHuman-readable detail text
RemediationstringSuggested fix

S2DCapacity

Every size field in the schema is an S2DCapacity object with both binary and decimal units. Downstream consumers never have to convert.

json
{
  "Bytes":   3840000000000,
  "TiB":     3.49,
  "TB":      3.84,
  "GiB":     3576.28,
  "GB":      3840.0,
  "Display": "3.49 TiB (3.84 TB)"
}

Consuming the snapshot

PowerShell

powershell
$snap = Get-Content ./S2DCartographer_*.json -Raw | ConvertFrom-Json
$snap.PhysicalDisks | Where-Object IsPoolMember | Measure-Object -Property SizeBytes -Sum
$snap.HealthChecks  | Where-Object Status -ne 'Pass'

jq

bash
jq '.PhysicalDisks | map(select(.IsPoolMember)) | length' snapshot.json
jq '.CapacityWaterfall.UsableCapacity.TiB' snapshot.json
jq '.HealthChecks[] | select(.Status != "Pass") | {CheckName, Status, Details}' snapshot.json

Python

python
import json
with open('snapshot.json') as f:
    snap = json.load(f)

pool_disks = [d for d in snap['PhysicalDisks'] if d.get('IsPoolMember')]
print(f"{len(pool_disks)} pool-member disks totaling {snap['CapacityWaterfall']['RawCapacity']['TB']} TB raw")

Stability guarantees

  • Field names — stable within a major SchemaVersion
  • Field types — stable within a major SchemaVersion
  • Field presence — required fields listed above are always present. Optional fields (e.g., OEM enrichment fields added by future features) will be documented separately and absent when not applicable.
  • Array orderingCapacityWaterfall.Stages[] is always ordered 1→8. Other arrays (disks, volumes, nodes, health checks) have no guaranteed order — sort by a stable field if ordering matters.

Released under the MIT License.