From b1f93e655a66f11f8aaab81409020321f4e04c80 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Thu, 26 Mar 2026 00:26:00 +0000
Subject: [PATCH] fix: set task.Node from UPID + expand SetPveHaRule Type +
extract GetNodeFromUpid helper
Co-authored-by: GoodOlClint <151449+GoodOlClint@users.noreply.github.com>
Agent-Logs-Url: https://github.com/GoodOlClint/PSProxmoxVE/sessions/42467843-de5e-4603-99e3-fb182eaf4251
---
.../Cluster/AddPveClusterConfigNodeCmdlet.cs | 5 +++--
.../Cmdlets/Cluster/AddPveClusterMemberCmdlet.cs | 3 ++-
.../Cmdlets/Cluster/NewPveClusterCmdlet.cs | 6 +++---
src/PSProxmoxVE/Cmdlets/HA/SetPveHaRuleCmdlet.cs | 3 +--
src/PSProxmoxVE/Cmdlets/PveCmdletBase.cs | 15 +++++++++++++++
5 files changed, 24 insertions(+), 8 deletions(-)
diff --git a/src/PSProxmoxVE/Cmdlets/Cluster/AddPveClusterConfigNodeCmdlet.cs b/src/PSProxmoxVE/Cmdlets/Cluster/AddPveClusterConfigNodeCmdlet.cs
index 69b71bb..d073237 100644
--- a/src/PSProxmoxVE/Cmdlets/Cluster/AddPveClusterConfigNodeCmdlet.cs
+++ b/src/PSProxmoxVE/Cmdlets/Cluster/AddPveClusterConfigNodeCmdlet.cs
@@ -65,11 +65,12 @@ namespace PSProxmoxVE.Cmdlets.Cluster
var upid = service.AddConfigNode(session, Node, NewNodeIp, linkDict, NodeId, Votes,
Force.IsPresent ? true : (bool?)null, ApiVersion);
- var task = new PveTask { Upid = upid, Status = "running" };
+ var nodeName = GetNodeFromUpid(upid, session.Hostname);
+
+ var task = new PveTask { Upid = upid, Status = "running", Node = nodeName };
if (Wait.IsPresent && !string.IsNullOrEmpty(upid))
{
- var nodeName = upid.Split(':').Length > 1 ? upid.Split(':')[1] : session.Hostname;
var taskService = new TaskService();
task = taskService.WaitForTask(session, nodeName, upid);
}
diff --git a/src/PSProxmoxVE/Cmdlets/Cluster/AddPveClusterMemberCmdlet.cs b/src/PSProxmoxVE/Cmdlets/Cluster/AddPveClusterMemberCmdlet.cs
index 9df9dce..a8735b6 100644
--- a/src/PSProxmoxVE/Cmdlets/Cluster/AddPveClusterMemberCmdlet.cs
+++ b/src/PSProxmoxVE/Cmdlets/Cluster/AddPveClusterMemberCmdlet.cs
@@ -81,7 +81,8 @@ namespace PSProxmoxVE.Cmdlets.Cluster
var upid = service.JoinCluster(session, Hostname, Fingerprint, plainPassword,
linkDict, NodeId, Votes, Force.IsPresent ? true : (bool?)null);
- var task = new PveTask { Upid = upid, Status = "running" };
+ var node = GetNodeFromUpid(upid, session.Hostname);
+ var task = new PveTask { Upid = upid, Status = "running", Node = node };
if (Wait.IsPresent && !string.IsNullOrEmpty(upid))
{
diff --git a/src/PSProxmoxVE/Cmdlets/Cluster/NewPveClusterCmdlet.cs b/src/PSProxmoxVE/Cmdlets/Cluster/NewPveClusterCmdlet.cs
index a99d6e4..13621c7 100644
--- a/src/PSProxmoxVE/Cmdlets/Cluster/NewPveClusterCmdlet.cs
+++ b/src/PSProxmoxVE/Cmdlets/Cluster/NewPveClusterCmdlet.cs
@@ -53,12 +53,12 @@ namespace PSProxmoxVE.Cmdlets.Cluster
WriteVerbose($"Creating cluster '{ClusterName}'...");
var upid = service.CreateCluster(session, ClusterName, linkDict, NodeId, Votes);
- var task = new PveTask { Upid = upid, Status = "running" };
+ var node = GetNodeFromUpid(upid, session.Hostname);
+
+ var task = new PveTask { Upid = upid, Status = "running", Node = node };
if (Wait.IsPresent && !string.IsNullOrEmpty(upid))
{
- // Extract node name from UPID (format: UPID:node:...)
- var node = upid.Split(':').Length > 1 ? upid.Split(':')[1] : session.Hostname;
var taskService = new TaskService();
task = taskService.WaitForTask(session, node, upid);
}
diff --git a/src/PSProxmoxVE/Cmdlets/HA/SetPveHaRuleCmdlet.cs b/src/PSProxmoxVE/Cmdlets/HA/SetPveHaRuleCmdlet.cs
index 89d7e87..4f6f181 100644
--- a/src/PSProxmoxVE/Cmdlets/HA/SetPveHaRuleCmdlet.cs
+++ b/src/PSProxmoxVE/Cmdlets/HA/SetPveHaRuleCmdlet.cs
@@ -20,8 +20,7 @@ namespace PSProxmoxVE.Cmdlets.HA
public string Rule { get; set; } = string.Empty;
/// Rule type (required by PVE API on update).
- [Parameter(Mandatory = true, Position = 1, HelpMessage = "HA rule type: node-affinity or resource-affinity.")]
- [ValidateSet("node-affinity", "resource-affinity")]
+ [Parameter(Mandatory = true, Position = 1, HelpMessage = "HA rule type (as defined in PVE, e.g. node-affinity, resource-affinity, location, colocation).")]
public string Type { get; set; } = string.Empty;
/// Rule state.
diff --git a/src/PSProxmoxVE/Cmdlets/PveCmdletBase.cs b/src/PSProxmoxVE/Cmdlets/PveCmdletBase.cs
index 2f6b775..467e57d 100644
--- a/src/PSProxmoxVE/Cmdlets/PveCmdletBase.cs
+++ b/src/PSProxmoxVE/Cmdlets/PveCmdletBase.cs
@@ -160,6 +160,21 @@ namespace PSProxmoxVE.Cmdlets
TimeSpan.FromSeconds(timeoutSeconds));
}
+ ///
+ /// Extracts the node name from a UPID string (format: UPID:node:...).
+ /// Falls back to if the UPID is empty or cannot be parsed.
+ ///
+ protected static string GetNodeFromUpid(string? upid, string fallback)
+ {
+ if (upid != null && upid.Length > 0)
+ {
+ var parts = upid.Split(':');
+ if (parts.Length > 1 && !string.IsNullOrWhiteSpace(parts[1]))
+ return parts[1];
+ }
+ return fallback;
+ }
+
///
/// Parses an array of Corosync link strings (e.g. "link0=10.0.0.1") into a dictionary.
/// Emits a warning for entries that do not match the expected "key=value" format.