diff --git a/src/PSProxmoxVE/Cmdlets/Cluster/NewPveClusterCmdlet.cs b/src/PSProxmoxVE/Cmdlets/Cluster/NewPveClusterCmdlet.cs
index 13621c7..4a485a9 100644
--- a/src/PSProxmoxVE/Cmdlets/Cluster/NewPveClusterCmdlet.cs
+++ b/src/PSProxmoxVE/Cmdlets/Cluster/NewPveClusterCmdlet.cs
@@ -1,3 +1,4 @@
+using System;
using System.Management.Automation;
using PSProxmoxVE.Core.Models.Vms;
using PSProxmoxVE.Core.Services;
@@ -36,10 +37,15 @@ namespace PSProxmoxVE.Cmdlets.Cluster
[Parameter(Mandatory = false, HelpMessage = "Corosync link addresses as key=value strings (e.g. 'link0=10.0.0.1').")]
public string[]? Links { get; set; }
- /// Wait for the cluster creation task to complete.
- [Parameter(Mandatory = false, HelpMessage = "Wait for the task to complete before returning.")]
+ /// Wait for the cluster creation task to complete and the cluster to reach quorum.
+ [Parameter(Mandatory = false, HelpMessage = "Wait for the task to complete and the cluster to reach quorum before returning.")]
public SwitchParameter Wait { get; set; }
+ /// Seconds to wait for the cluster to reach quorum when -Wait is used.
+ [Parameter(Mandatory = false, HelpMessage = "Timeout in seconds for -Wait (default 60).")]
+ [ValidateRange(1, 3600)]
+ public int Timeout { get; set; } = 60;
+
protected override void ProcessRecord()
{
if (!ShouldProcess($"cluster '{ClusterName}'", "Create new cluster"))
@@ -61,6 +67,11 @@ namespace PSProxmoxVE.Cmdlets.Cluster
{
var taskService = new TaskService();
task = taskService.WaitForTask(session, node, upid);
+
+ // The create task returns before corosync converges; the cluster
+ // rejects joins until it is quorate.
+ WriteVerbose("Waiting for cluster to reach quorum...");
+ service.WaitForQuorum(session, TimeSpan.FromSeconds(Timeout));
}
WriteObject(task);