mirror of
https://github.com/GoodOlClint/PSProxmoxVE.git
synced 2026-07-26 07:58:14 +00:00
feat: disk controller/IO options on New-PveVm + surface all Get-PveVmConfig keys
New-PveVm (F089): - Add -DiskBus (virtio/scsi/sata/ide, default virtio), -ScsiHardware (scsihw), -DiskIoThread, -DiskAio, -DiskSsd, -DiskDiscard, -DiskCache so a tuned disk (e.g. virtio-scsi-single + scsi0,iothread=1,aio=native,ssd=1,discard=on) can be created in one call instead of diskless + a hand-built Set-PveVmConfig string. - Disk spec built via BuildDiskSpec; ValidateDiskOptions runs before ShouldProcess and rejects ssd on virtio and iothread on sata/ide or scsi-without-virtio-scsi-single with clear errors, instead of letting PVE fail at VM start. Get-PveVmConfig (F090): - PveVmConfig was a fixed allow-list, silently dropping keys like scsihw, efidisk0, tpmstate0, hostpci0. Add typed scsihw/efidisk0/tpmstate0 plus a [JsonExtensionData] catch-all exposed as AdditionalProperties (native types via JsonHelper.ToNative, per D013 — no JToken leakage). Makes the disk tuning above verifiable by reading the config back. Closes #65. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -2881,6 +2881,66 @@
|
||||
"evidence": "Added PveSession.Timeout (default 100s) and a TimeSpan? override on PveHttpClient. Connect-PveServer exposes -TimeoutSeconds to set the session-default; Send-PveFile and Invoke-PveStorageDownload expose -TimeoutSeconds with a 30-minute implicit default so large uploads/downloads do not trip the 100s HttpClient default. -TimeoutSeconds 0 means Timeout.InfiniteTimeSpan. PveHttpClient.SendAsync now catches the TimeoutException-wrapped TaskCanceledException and rethrows it as PveApiException(RequestTimeout) with the resource path.",
|
||||
"verified_by": "dotnet build + dotnet test (passed including new SendAsync_TimeoutFires xUnit test) + Pester (-TimeoutSeconds coverage on all three cmdlets)"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "F089",
|
||||
"title": "New-PveVm cannot set disk controller or IO options at create time",
|
||||
"category": "enhancement",
|
||||
"severity": "medium",
|
||||
"status": "resolved",
|
||||
"first_detected": "2026-05-22",
|
||||
"github_issue": 65,
|
||||
"files": [
|
||||
"src/PSProxmoxVE/Cmdlets/Vms/NewPveVmCmdlet.cs"
|
||||
],
|
||||
"description": "New-PveVm only emitted a plain virtio0 from -DiskStorage/-DiskSize/-DiskFormat. There was no way to choose the controller (virtio-scsi-single) or set performance/IO options (iothread, aio, ssd, discard, cache) at create time, forcing callers to create the VM diskless and then hand-build a raw scsi0 string via Set-PveVmConfig.",
|
||||
"scan_history": [
|
||||
{
|
||||
"scan_date": "2026-05-22",
|
||||
"local_id": null,
|
||||
"status": "new"
|
||||
},
|
||||
{
|
||||
"scan_date": "2026-05-22",
|
||||
"local_id": null,
|
||||
"status": "fixed"
|
||||
}
|
||||
],
|
||||
"resolution": {
|
||||
"scan_date": "2026-05-22",
|
||||
"evidence": "Added -DiskBus (virtio/scsi/sata/ide, default virtio), -ScsiHardware (scsihw), -DiskIoThread, -DiskAio, -DiskSsd, -DiskDiscard, -DiskCache. The disk spec is built via a BuildDiskSpec helper; ValidateDiskOptions enforces (before ShouldProcess) that ssd is not used on virtio and that iothread is only used on virtio or scsi+virtio-scsi-single, surfacing clear errors at create time instead of at VM start.",
|
||||
"verified_by": "dotnet build (0 warnings) + Pester (47 New-PveVm tests incl. disk-option validation matrix)"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "F090",
|
||||
"title": "Get-PveVmConfig silently drops config keys not in the typed allow-list",
|
||||
"category": "completeness",
|
||||
"severity": "medium",
|
||||
"status": "resolved",
|
||||
"first_detected": "2026-05-22",
|
||||
"github_issue": 65,
|
||||
"files": [
|
||||
"src/PSProxmoxVE.Core/Models/Vms/PveVmConfig.cs"
|
||||
],
|
||||
"description": "PveVmConfig was a fixed allow-list of [JsonProperty] fields with no catch-all, so keys like scsihw, efidisk0, tpmstate0, hostpci0, and additional disk buses were silently dropped on deserialize — making the F089 workaround unverifiable by reading the config back.",
|
||||
"scan_history": [
|
||||
{
|
||||
"scan_date": "2026-05-22",
|
||||
"local_id": null,
|
||||
"status": "new"
|
||||
},
|
||||
{
|
||||
"scan_date": "2026-05-22",
|
||||
"local_id": null,
|
||||
"status": "fixed"
|
||||
}
|
||||
],
|
||||
"resolution": {
|
||||
"scan_date": "2026-05-22",
|
||||
"evidence": "Added typed scsihw/efidisk0/tpmstate0 properties plus a private [JsonExtensionData] landing field exposed as AdditionalProperties (Dictionary<string, object?> via JsonHelper.ToNative, so values are native .NET types per D013 — no JToken leakage). Typed keys do not duplicate into the catch-all.",
|
||||
"verified_by": "dotnet build + dotnet test (586 passed, new VmModelTests for scsihw/efidisk/tpm, native-typed AdditionalProperties, and no typed-key leakage)"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user