private static async Task <bool> CheckTaskStatus(string taskId) { if (taskId.Contains("Message")) { return(false); } var taskStatus = false; while (!taskStatus) { taskStatus = ZertoZvmApi.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.ToUpper() == "VRA" || o.Mode.ToUpper() == "VPG" || o.Mode.ToUpper() == "CLOUDVPG" || o.Mode.ToUpper() == "VCDVPG" || o.Mode.ToUpper() == "CLOUDVCDVPG") { Initialise(); Stopwatch watch = new Stopwatch(); watch.Start(); Console.Clear(); Output.WriteLine("Zerto Bulk Creation Tool"); Output.WriteLine("------------------------------------------------------------------------------"); Output.WriteLine("Mode: " + o.Mode.ToUpper()); Output.WriteLine("Local ZVM: " + ZvmConnection.zvm); if (o.Mode.ToUpper() == "CLOUDVPG" || o.Mode.ToUpper() == "CLOUDVCDVPG") { Output.WriteLine("Cloud ZVM: " + CloudZvmConnection.zvm); Output.WriteLine("ZORG: " + o.ZorgName); } Output.WriteLine("WaitTime(s): " + o.WaitTime.ToString()); Output.WriteLine("CSV: " + o.Csv.ToUpper()); if (o.Mode.ToUpper() == "VPG" || o.Mode.ToUpper() == "CLOUDVPG" || o.Mode.ToUpper() == "VCDVPG" || o.Mode.ToUpper() == "CLOUDVCDVPG") { Output.WriteLine("VM List: " + o.VmList.ToUpper()); } Output.WriteLine("------------------------------------------------------------------------------"); try { if (o.Mode.ToUpper() == "CLOUDVCDVPG") { try { if (!string.IsNullOrEmpty(o.ZorgName)) { try { if (ZertoZvmApi.GetSession(ZvmConnection.zvm, ZvmConnection.zvm_username, ZvmConnection.zvm_password, "application/json") && ZertoZvmApi.GetSession(CloudZvmConnection.zvm, CloudZvmConnection.zvm_username, CloudZvmConnection.zvm_password, "application/json", true)) { try { JArray Zorgs = JArray.Parse(ZertoZvmApi.GetZorgs(true)); if (Zorgs.Count > 0) { try { var Zorg = Zorgs.SelectToken("$.[?(@.ZorgName=='" + o.ZorgName + "')]"); if (Zorg != null) { try { //Import VPG CSV var reader1 = new StreamReader(o.Csv); CsvReader csv1 = new CsvReader(reader1); csv1.Configuration.HasHeaderRecord = true; csv1.Configuration.MissingFieldFound = null; var vpgRecords = csv1.GetRecords <CsvCloudVPGList>(); //Import VM CSV var reader2 = new StreamReader(o.VmList); CsvReader csv2 = new CsvReader(reader2); csv2.Configuration.HasHeaderRecord = true; csv2.Configuration.HeaderValidated = null; csv2.Configuration.MissingFieldFound = null; var vmRecords = csv2.GetRecords <CsvVMList>(); //Create VM List List <CsvVMList> vmList = new List <CsvVMList>(); foreach (var vm in vmRecords) { try { vmList.Add(vm); } catch (Exception e) { Output.WriteLine("EXCEPTION PARSING VM LIST!"); Output.WriteLine(e.Message); Output.WriteLine(e.Data.ToString()); } } // Connect to ZVM API and start bulk creation process foreach (var vpg in vpgRecords) { try { Output.WriteLine("Starting VPG Creation Process"); Output.WriteLine("--VPG: " + vpg.VPGName); // Set VPG Varibles var VPGName = vpg.VPGName; var ServiceProfile = vpg.ServiceProfile; var ReplicationPriority = Utils.IsPriority(vpg.ReplicationPriority); var RecoverySiteName = vpg.RecoverySiteName; var OrgVdcName = vpg.OrgVdcName; var FailoverNetwork = vpg.FailoverNetwork; var TestNetwork = vpg.TestNetwork; var ZorgIdentifier = Zorg.SelectToken("ZorgIdentifier").ToString(); // Get identifiers for VPG settings Output.WriteLine("--Requesting Zerto Identifiers"); Output.WriteDebug("ZorgIdentifier: " + ZorgIdentifier); var LocalSiteIdentifier = ZertoZvmApi.GetLocalSiteIdentifier(); Output.WriteDebug("LocalSiteIdentifier: " + LocalSiteIdentifier); JArray ServiceProfiles = JArray.Parse(ZertoZvmApi.GetServiceProfiles()); var ServiceProfileIdentifier = ServiceProfiles.SelectToken("$.[?(@.ServiceProfileName=='" + ServiceProfile + "')]").SelectToken("ServiceProfileIdentifier").ToString(); Output.WriteDebug("ServiceProfileIdentifier: " + ServiceProfileIdentifier); JArray Sites = JArray.Parse(ZertoZvmApi.GetSites()); var TargetSiteIdentifier = Sites.SelectToken("$.[?(@.VirtualizationSiteName=='" + RecoverySiteName + "')]").SelectToken("SiteIdentifier").ToString(); Output.WriteDebug("TargetSiteIdentifier: " + TargetSiteIdentifier); JArray OrgVdcs = JArray.Parse(ZertoZvmApi.GetOrgVdcs(TargetSiteIdentifier)); var OrgVdcIdentifier = OrgVdcs.SelectToken("$.[?(@.OrgVdcName=='" + OrgVdcName + "')]").SelectToken("Identifier").ToString(); Output.WriteDebug("OrgVdcIdentifier: " + OrgVdcIdentifier); JArray OrgVdcNetworks = JArray.Parse(ZertoZvmApi.GetOrgVdcNetworks(TargetSiteIdentifier.ToString(), OrgVdcIdentifier.ToString())); var FailoverNetworkIdentifier = OrgVdcNetworks.SelectToken("$.[?(@.VirtualizationNetworkName=='" + FailoverNetwork + "')]").SelectToken("NetworkIdentifier").ToString(); var TestNetworkIdentifier = OrgVdcNetworks.SelectToken("$.[?(@.VirtualizationNetworkName=='" + TestNetwork + "')]").SelectToken("NetworkIdentifier").ToString(); Output.WriteDebug("FailoverNetworkIdentifier: " + FailoverNetworkIdentifier); Output.WriteDebug("TestNetworkIdentifier: " + TestNetworkIdentifier); // Get VM identifier for each VM in VPG Output.WriteLine("--Adding Virtual Machines"); List <CsvVMList> vpgVms = new List <CsvVMList>(); JArray Vms = JArray.Parse(ZertoZvmApi.GetVms(LocalSiteIdentifier)); foreach (var vm in vmList) { try { if (vm.VPGName == VPGName) { Output.WriteLine("----VM: " + vm.VMName); vm.VMIdentifier = Vms.SelectToken("$.[?(@.VmName=='" + vm.VMName + "')]").SelectToken("VmIdentifier").ToString(); vpgVms.Add(vm); } } catch (Exception e) { Output.WriteLine("EXCEPTION PARSING VM LIST!"); Output.WriteLine(e.Message); Output.WriteLine(e.Data.ToString()); } } // Create VPG JSON Template Output.WriteLine("--Creating VPG JSON Template"); var vpgJsonTemplate = File.ReadAllText("./Templates/cloudvcdvpg.txt"); var vmJsonTemplate = File.ReadAllText("./Templates/vm.txt"); var nicJsonTemplate = File.ReadAllText("./Templates/nic.txt"); // Update JSON with VPG Settings try { JToken vpgJson = JToken.Parse(vpgJsonTemplate); JObject json = (JObject)vpgJson["Basic"]; json["Name"] = VPGName; json["Priority"] = ReplicationPriority; json["ProtectedSiteIdentifier"] = LocalSiteIdentifier; json["RecoverySiteIdentifier"] = TargetSiteIdentifier; json["ServiceProfileIdentifier"] = ServiceProfileIdentifier; json["ZorgIdentifier"] = ZorgIdentifier; json = (JObject)vpgJson["Networks"]["Failover"]["VCD"]; json["DefaultRecoveryOrgVdcNetworkIdentifier"] = FailoverNetworkIdentifier; json = (JObject)vpgJson["Networks"]["FailoverTest"]["VCD"]; json["DefaultRecoveryOrgVdcNetworkIdentifier"] = TestNetworkIdentifier; json = (JObject)vpgJson["Recovery"]["VCD"]; json["OrgVdcIdentifier"] = OrgVdcIdentifier; // Update JSON with VM Settings try { JArray vms = (JArray)vpgJson["Vms"]; foreach (var vm in vpgVms) { var vmJson = JToken.Parse(vmJsonTemplate); json = (JObject)vmJson; json["VmIdentifier"] = vm.VMIdentifier; // Update Nic0 with NIC Settings try { JArray nics = (JArray)vmJson["Nics"]; var nicJson = JToken.Parse(nicJsonTemplate); // Failover Network json = (JObject)nicJson.Value <JObject>("Failover").Value <JObject>("VCD"); if (Utils.IpMode(vm.VMNICFailoverIPMode) == 2) { json["IpMode"] = Utils.IpMode(vm.VMNICFailoverIPMode); json["IpAddress"] = vm.VMNICFailoverIPAddress; } else { json["IpMode"] = Utils.IpMode(vm.VMNICFailoverIPMode); } json["IsConnected"] = Utils.IsBool(vm.VMNICFailoverIsConnected, true); json["IsPrimary"] = Utils.IsBool(vm.VMNICFailoverIsPrimary, true); json["IsResetMacAddress"] = Utils.IsBool(vm.VMNICFailoverIsResetMacAddress); json["RecoveryOrgVdcNetworkIdentifier"] = FailoverNetworkIdentifier; // Failover Test Network json = (JObject)nicJson.Value <JObject>("FailoverTest").Value <JObject>("VCD"); if (Utils.IpMode(vm.VMNICFailoverTestIPMode) == 2) { json["IpMode"] = Utils.IpMode(vm.VMNICFailoverTestIPMode); json["IpAddress"] = vm.VMNICFailoverTestIPAddress; } else { json["IpAddress"] = vm.VMNICFailoverTestIPAddress; } json["IsConnected"] = Utils.IsBool(vm.VMNICFailoverTestIsConnected, true); json["IsPrimary"] = Utils.IsBool(vm.VMNICFailoverTestIsPrimary, true); json["IsResetMacAddress"] = Utils.IsBool(vm.VMNICFailoverTestIsResetMacAddress); json["RecoveryOrgVdcNetworkIdentifier"] = TestNetworkIdentifier; nics.Add(nicJson); } catch (Exception e) { Output.WriteLine("EXCEPTION!"); Output.WriteLine(e.Message); Output.WriteDebug(e.Data.ToString()); } vms.Add(vmJson); } } catch (Exception e) { Output.WriteLine("EXCEPTION!"); Output.WriteLine(e.Message); Output.WriteDebug(e.Data.ToString()); } Output.WriteDebug(vpgJson.ToString()); // POST VPG JSON request and get VpgSettingsIdentifier from ZVM API Output.WriteLine("--Requesting vpgSettingIdentifier"); var vpgSettingsIdentifier = Utils.CleanString(ZertoZvmApi.GetVpgSettingsIdentifier(vpgJson)); Output.WriteDebug(vpgSettingsIdentifier); if (Utils.IsValidUuid(vpgSettingsIdentifier)) { // Get VpgSettingsIdentifier Template from ZVM API Output.WriteLine("--Requesting vpgSetting Template"); var vpgSettingTemplate = ZertoZvmApi.GetVpgSettingsObject(vpgSettingsIdentifier); Output.WriteDebug(vpgSettingTemplate); // Commit VpgSettingsIdentifier Template to ZVM API to initiate VPG creation Output.WriteLine("--Requesting VPG Create Task"); var vpgCreateTask = ZertoZvmApi.CommitVpgSettingsObject(vpgSettingsIdentifier); Output.WriteDebug(vpgCreateTask); //Pause for WaitTime Output.WriteLine("Pausing for " + o.WaitTime + " seconds..."); Thread.Sleep(o.WaitTime * 1000); Output.WriteLine(""); } else { Output.WriteLine("Aborting VPG Creation as vpgSettingIdentifier not valid!"); Output.WriteLine(""); } } catch (Exception e) { Output.WriteLine("EXCEPTION!"); Output.WriteLine(e.Message); Output.WriteDebug(e.Data.ToString()); } } catch (Exception e) { Output.WriteLine("EXCEPTION!"); Output.WriteLine(e.Message); Output.WriteDebug(e.Data.ToString()); } } } catch (Exception e) { Output.WriteLine("EXCEPTION!"); Output.WriteLine(e.Message); Output.WriteDebug(e.Data.ToString()); } } else { Output.WriteLine("WARNING!"); Output.WriteLine("Aborting as unable to find ZORG Identifier"); } } catch (Exception e) { Output.WriteLine("EXCEPTION!"); Output.WriteLine(e.Message); Output.WriteDebug(e.Data.ToString()); } } else { Output.WriteLine("WARNING!"); Output.WriteLine("Aborting as unable to find any existing ZORGS"); } } catch (Exception e) { Output.WriteLine("EXCEPTION!"); Output.WriteLine(e.Message); Output.WriteDebug(e.Data.ToString()); } } else { Output.WriteLine("WARNING!"); Output.WriteLine("Aborting as unable to connect and authenticate to the ZVM using the supplied details"); } } catch (Exception e) { Output.WriteLine("EXCEPTION!"); Output.WriteLine(e.Message); Output.WriteDebug(e.Data.ToString()); } } else { Output.WriteLine("WARNING!"); Output.WriteLine("Aborting as no ZORG Name was specified, please ensure you set the ZORG name using the -z parameter"); } } catch (Exception e) { Output.WriteLine("EXCEPTION!"); Output.WriteLine(e.Message); Output.WriteDebug(e.Data.ToString()); } } } catch (Exception e) { Output.WriteLine("EXCEPTION!"); Output.WriteLine(e.Message); Output.WriteDebug(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(); } }); }