예제 #1
0
        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);
        }
예제 #2
0
        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();
            });
        }