fix(storage): implement Portal defaulting for iSCSI, fix Pool/CephPool selection, add NFS format validation

Co-authored-by: GoodOlClint <151449+GoodOlClint@users.noreply.github.com>
Agent-Logs-Url: https://github.com/GoodOlClint/PSProxmoxVE/sessions/d84722e4-409e-4ced-bfbc-f323715b8bdc
This commit is contained in:
copilot-swe-agent[bot]
2026-03-24 20:36:46 +00:00
parent 79c227f131
commit f76ff513e9
3 changed files with 32 additions and 3 deletions
@@ -1,3 +1,4 @@
using System;
using System.Collections.Generic;
using System.Management.Automation;
using Newtonsoft.Json.Linq;
@@ -114,14 +115,32 @@ namespace PSProxmoxVE.Cmdlets.Storage
AddIfNotEmpty(data, "content", Content);
AddIfNotEmpty(data, "path", Path);
AddIfNotEmpty(data, "server", Server);
AddIfNotEmpty(data, "export", Export);
AddIfNotEmpty(data, "vgname", VgName);
AddIfNotEmpty(data, "thinpool", ThinPool);
AddIfNotEmpty(data, "pool", Pool ?? CephPool);
AddIfNotEmpty(data, "pool", !string.IsNullOrEmpty(Pool) ? Pool : CephPool);
AddIfNotEmpty(data, "monhost", MonHost);
AddIfNotEmpty(data, "target", Target);
AddIfNotEmpty(data, "portal", Portal);
// For iSCSI types, 'server' is not a valid API field; derive portal from Server if Portal omitted.
bool isIscsiType = string.Equals(Type, "iscsi", StringComparison.OrdinalIgnoreCase)
|| string.Equals(Type, "iscsidirect", StringComparison.OrdinalIgnoreCase);
if (isIscsiType)
{
string? portalValue;
if (!string.IsNullOrEmpty(Portal))
portalValue = Portal;
else if (!string.IsNullOrEmpty(Server))
portalValue = $"{Server}:3260";
else
portalValue = null;
AddIfNotEmpty(data, "portal", portalValue);
}
else
{
AddIfNotEmpty(data, "server", Server);
AddIfNotEmpty(data, "portal", Portal);
}
AddIfNotEmpty(data, "nodes", Nodes);
if (Shared.IsPresent) data["shared"] = "1";
if (Disable.IsPresent) data["disable"] = "1";
@@ -95,6 +95,13 @@ Describe 'Shared Storage — Integration' -Tag 'Integration' {
# Parse server and export from the full NFS export path (e.g. "10.0.0.1:/srv/nfs/shared")
$nfsParts = $script:NfsExport -split ':', 2
if (-not $nfsParts -or
$nfsParts.Count -ne 2 -or
[string]::IsNullOrWhiteSpace($nfsParts[0]) -or
[string]::IsNullOrWhiteSpace($nfsParts[1])) {
Set-ItResult -Skipped -Because "PVETEST_NFS_EXPORT must be in 'server:/export/path' format (current value: '$($script:NfsExport)')"
return
}
$nfsServer = $nfsParts[0]
$nfsExportPath = $nfsParts[1]
@@ -53,6 +53,9 @@ services:
privileged: true
volumes:
- nfs-data:/srv/nfs/shared
# NOTE: /lib/modules is required by the NFS kernel module loader.
# This mount is Linux-host-specific and will fail on macOS/Windows Docker Desktop.
# Integration tests using this compose file must run on a Linux host (e.g. GitHub-hosted runners or the dev container).
- /lib/modules:/lib/modules:ro
environment:
NFS_EXPORT_0: /srv/nfs/shared *(rw,sync,no_subtree_check,no_root_squash)