private static async Task <bool> CheckTaskStatus(string taskId) { if (taskId.Contains("Message")) { return(false); } var taskStatus = false; while (!taskStatus) { taskStatus = ZertoZvm.TaskComplete(taskId); Output.Write("."); await Task.Delay(5000); } return(true); }
static void Main(string[] args) { Parser.Default.ParseArguments <Options>(args).WithParsed <Options>(o => { if (o.Mode == null || (o.Mode.ToUpper() != "START" && o.Mode.ToUpper() != "STOP")) { o.Mode = "START"; } if (o.FailoverType == null || (o.FailoverType.ToUpper() != "TEST" && o.FailoverType.ToUpper() != "LIVE")) { o.FailoverType = "LIVE"; } Initialise(); Stopwatch watch = new Stopwatch(); watch.Start(); Console.Clear(); Output.WriteLine("Zerto Failover Application"); Output.WriteLine("vCenter: " + Common.vc); Output.WriteLine("ZVM: " + Common.zvm); Output.WriteLine("Mode: " + o.Mode.ToUpper()); Output.WriteLine("Type: " + o.FailoverType.ToUpper()); if (o.FailoverType.ToUpper() == "LIVE") { Output.WriteLine("Commit Policy: " + o.CommitPolicy.ToUpper()); Output.WriteLine("Wait Time (s): " + o.WaitTime.ToString()); } Output.WriteLine("CSV File: " + o.Csv.ToUpper()); Output.WriteLine("------------------------------------------------------------------------------"); try { var reader = new StreamReader(o.Csv); CsvReader csv = new CsvReader(reader); csv.Configuration.HasHeaderRecord = true; csv.Configuration.MissingFieldFound = null; var csvList = new CsvList(); var csvRecords = csv.EnumerateRecords(csvList); if (ZertoZvm.GetSession(Common.zvm, Common.zvm_username, Common.zvm_password, "application/json")) { foreach (var row in csvRecords) { if (o.Mode.ToUpper() == "START" && o.FailoverType.ToUpper() == "TEST") // START TEST FAILOVER { if (row.BuildGroup == 0) { //START VM PROCESS Output.WriteLine(""); Output.WriteLine("Powering on VM " + row.VpgName); try { Dictionary <string, string> Parameters = new Dictionary <string, string>(); Parameters.Clear(); var vmSession = VmwareRest.GetSession(Common.vc, Common.vc_username, Common.vc_password, "application/json"); Parameters.Add("filter.names", row.VpgName); var vmRef = JToken.Parse(VmwareRest.GetResult("/rest/vcenter/vm", Parameters)); if (JArray.FromObject(vmRef.SelectToken("value")).Count == 0) { Output.WriteLine("Unable to find VM!"); } if (JArray.FromObject(vmRef.SelectToken("value")).Count > 1) { Output.WriteLine("Multiple VMs found, please confirm VM name is unique!"); } if (JArray.FromObject(vmRef.SelectToken("value")).Count == 1) { var vmResult = VmwareRest.PostRequest("/rest/vcenter/vm/" + vmRef.SelectToken("value.[0].vm") + "/power/start", null); if (vmResult == "OK") { Output.WriteLine(row.VpgName + " powered on"); } else { Output.WriteLine("Unable to power on " + row.VpgName); } } } catch (Exception e) { Output.WriteLine(""); Output.WriteLine("EXCEPTION " + e); } } else { //START FAILOVER PROCESS Output.WriteLine(""); Output.Write("Starting Failover Test for " + row.VpgName); try { Task <bool> failoverTest = CheckTaskStatus(ZertoZvm.FailoverTest(row.VpgName, "").ToString()); failoverTest.Wait(); Output.WriteLine(""); if (failoverTest.Result == true) { Output.WriteLine("Built Failover Test for " + row.VpgName); } else { Output.WriteLine("Unable to Build Failover Test for " + row.VpgName); } failoverTest.Dispose(); if (row.Delay > 0) { Output.WriteLine("Pausing for " + row.Delay + " seconds"); Task <bool> delay = Delay(row.Delay); delay.Wait(); delay.Dispose(); Output.WriteLine(""); } } catch (Exception e) { Output.WriteLine(""); Output.WriteLine("EXCEPTION " + e); } } } if (o.Mode.ToUpper() == "START" && o.FailoverType.ToUpper() == "LIVE") // START LIVE FAILOVER { if (row.BuildGroup == 0) { //START VM PROCESS Output.WriteLine(""); Output.WriteLine("Powering on VM " + row.VpgName); try { Dictionary <string, string> Parameters = new Dictionary <string, string>(); Parameters.Clear(); var vmSession = VmwareRest.GetSession(Common.vc, Common.vc_username, Common.vc_password, "application/json"); Parameters.Add("filter.names", row.VpgName); var vmRef = JToken.Parse(VmwareRest.GetResult("/rest/vcenter/vm", Parameters)); if (JArray.FromObject(vmRef.SelectToken("value")).Count == 0) { Output.WriteLine("Unable to find VM!"); } if (JArray.FromObject(vmRef.SelectToken("value")).Count > 1) { Output.WriteLine("Multiple VMs found, please confirm VM name is unique!"); } if (JArray.FromObject(vmRef.SelectToken("value")).Count == 1) { var vmResult = VmwareRest.PostRequest("/rest/vcenter/vm/" + vmRef.SelectToken("value.[0].vm") + "/power/start", null); if (vmResult == "OK") { Output.WriteLine(row.VpgName + " powered on"); } else { Output.WriteLine("Unable to power on " + row.VpgName); } } } catch (Exception e) { Output.WriteLine(""); Output.WriteLine("EXCEPTION " + e); } } else { //START FAILOVER PROCESS Output.WriteLine(""); Output.Write("Starting Failover for " + row.VpgName); try { Task <bool> failover = CheckTaskStatus(ZertoZvm.Failover(row.VpgName, "", GetCommitPolicy(o.CommitPolicy), o.WaitTime).ToString()); failover.Wait(); Output.WriteLine(""); if (failover.Result == true) { Output.WriteLine("Built Failover for " + row.VpgName); } else { Output.WriteLine("Unable to Build Failover for " + row.VpgName); } failover.Dispose(); if (row.Delay > 0) { Output.WriteLine("Pausing for " + row.Delay + " seconds"); Task <bool> delay = Delay(row.Delay); delay.Wait(); delay.Dispose(); Output.WriteLine(""); } } catch (Exception e) { Output.WriteLine(""); Output.WriteLine("EXCEPTION " + e); } } } if (o.Mode.ToUpper() == "STOP" && o.FailoverType.ToUpper() == "TEST") // STOP TEST FAILOVER { if (row.BuildGroup == 0) { //STOP VM PROCESS Output.WriteLine(""); Output.WriteLine("Powering off VM " + row.VpgName); try { Dictionary <string, string> Parameters = new Dictionary <string, string>(); Parameters.Clear(); var vmSession = VmwareRest.GetSession(Common.vc, Common.vc_username, Common.vc_password, "application/json"); Parameters.Add("filter.names", row.VpgName); var vmRef = JToken.Parse(VmwareRest.GetResult("/rest/vcenter/vm", Parameters)); if (JArray.FromObject(vmRef.SelectToken("value")).Count == 0) { Output.WriteLine("Unable to find VM!"); } if (JArray.FromObject(vmRef.SelectToken("value")).Count > 1) { Output.WriteLine("Multiple VMs found, please confirm VM name is unique!"); } if (JArray.FromObject(vmRef.SelectToken("value")).Count == 1) { var vmResult = VmwareRest.PostRequest("/rest/vcenter/vm/" + vmRef.SelectToken("value.[0].vm") + "/power/stop", null); if (vmResult == "OK") { Output.WriteLine(row.VpgName + " powered off"); } else { Output.WriteLine("Unable to power off " + row.VpgName); } } } catch (Exception e) { Output.WriteLine(""); Output.WriteLine("EXCEPTION " + e.Message); } } else { //STOP FAILOVER PROCESS Output.WriteLine(""); Output.Write("Stopping Failover Test for " + row.VpgName); try { Task <bool> stopFailover = CheckTaskStatus(ZertoZvm.FailoverTestStop(row.VpgName).ToString()); stopFailover.Wait(); Output.WriteLine(""); if (stopFailover.Result == true) { Output.WriteLine("Destroyed Failover Test for " + row.VpgName); } else { Output.WriteLine("Unable to Destroy Failover Test for " + row.VpgName); } stopFailover.Dispose(); } catch (Exception e) { Output.WriteLine(""); Output.WriteLine("EXCEPTION " + e.Message); } } } if (o.Mode.ToUpper() == "STOP" && o.FailoverType.ToUpper() == "LIVE") // NOT AN AVAILABLE OPTION { Output.WriteLine(""); Output.WriteLine("Stopping a LIVE failover process is not a valid option..."); } } } else { Output.WriteLine("ERROR"); Output.WriteLine("Unable to authenticate with ZVM API"); } } catch (Exception e) { Output.WriteLine("EXCEPTION"); Output.WriteLine(e.Message); Output.WriteLine(e.Data.ToString()); } watch.Stop(); Output.WriteLine(""); Output.WriteLine("Duration: " + TimeSpan.FromSeconds(watch.Elapsed.TotalSeconds).ToString(@"hh\:mm\:ss")); Console.WriteLine(); Console.WriteLine("Press any key to close..."); Output.WriteLine("------------------------------------------------------------------------------"); Console.ReadKey(); }); }