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.