public async Task SetAffinity(string isolationTag, Vm[] vms, bool start) { if (_config.IsVCenter) { var configSpec = new ClusterConfigSpec(); var affinityRuleSpec = new ClusterAffinityRuleSpec(); var clusterRuleSpec = new ClusterRuleSpec(); affinityRuleSpec.vm = vms.Select(m => m.Reference.AsReference()).ToArray(); affinityRuleSpec.name = $"Affinity#{isolationTag}"; affinityRuleSpec.enabled = true; affinityRuleSpec.enabledSpecified = true; affinityRuleSpec.mandatory = true; affinityRuleSpec.mandatorySpecified = true; clusterRuleSpec.operation = ArrayUpdateOperation.add; clusterRuleSpec.info = affinityRuleSpec; configSpec.rulesSpec = new ClusterRuleSpec[] { clusterRuleSpec }; _logger.LogDebug("setaffinity: reconfiguring cluster "); await _vim.ReconfigureCluster_TaskAsync(_res, configSpec, true); } if (start) { List <Task <Vm> > tasks = new List <Task <Vm> >(); foreach (Vm vm in vms) { tasks.Add(Start(vm.Id)); } await Task.WhenAll(tasks.ToArray()); } }
/// <summary> /// Method to delete VM Anti AffinityRule /// </summary> /// <param name="podName">string</param> /// <param name="ruleName">string</param> private void DeleteVmAntiAffinityRule(string podName, string ruleName) { ManagedObjectReference srmRef = cb._connection._sic.storageResourceManager; ManagedObjectReference sdrsMor = cb._svcUtil.getEntityByName("StoragePod", podName); if (sdrsMor != null) { PodStorageDrsEntry podStorageDrsEntry = (PodStorageDrsEntry)cb._svcUtil.GetDynamicProperty(sdrsMor, "podStorageDrsEntry"); ClusterRuleSpec ruleSpec = new ClusterRuleSpec(); ClusterRuleInfo[] clusterRuleInfo = podStorageDrsEntry.storageDrsConfig.podConfig.rule; StorageDrsConfigSpec sdrsConfigSpec = new StorageDrsConfigSpec(); StorageDrsPodConfigSpec podConfigSpec = new StorageDrsPodConfigSpec(); ClusterAntiAffinityRuleSpec vmAntiAffinityRuleSpec = null; if (clusterRuleInfo != null) { foreach (ClusterRuleInfo vmRule in clusterRuleInfo) { if (vmRule.name.Equals(ruleName)) { vmAntiAffinityRuleSpec = (ClusterAntiAffinityRuleSpec)vmRule; } } if (vmAntiAffinityRuleSpec != null) { ruleSpec.operation = ArrayUpdateOperation.remove; ruleSpec.info = vmAntiAffinityRuleSpec; ruleSpec.removeKey = vmAntiAffinityRuleSpec.key; podConfigSpec.rule = new ClusterRuleSpec[] { ruleSpec }; sdrsConfigSpec.podConfigSpec = podConfigSpec; ManagedObjectReference taskmor = cb._connection._service.ConfigureStorageDrsForPod_Task(srmRef, sdrsMor, sdrsConfigSpec, true); if (taskmor != null) { String status = cb.getServiceUtil().WaitForTask(taskmor); if (status.Equals("sucess")) { Console.WriteLine("Success: Delete VmAntiAffinity Rule."); } else { Console.WriteLine("Failure: Delete VmAntiAffinity Rule."); throw new Exception(status); } } } else { string msg = "\nFailure: Rule " + ruleName + " not found."; throw new Exception(msg); } } } else { throw new Exception("Storage Pod " + podName + "not found"); } }
/// <summary> /// Method to add VmAntiAffinityRule /// </summary> /// <param name="podName">string</param> /// <param name="ruleName">string</param> /// <param name="enabled">string</param> /// <param name="vm">string array</param> private void AddVmAntiAffinityRule(string podName, string ruleName, string enabled, string[] vm) { ManagedObjectReference srmRef = cb._connection._sic.storageResourceManager; ManagedObjectReference sdrsMor = cb._svcUtil.getEntityByName("StoragePod", podName); if (sdrsMor != null) { ManagedObjectReference vmMoref = null; StorageDrsConfigSpec sdrsConfigSpec = new StorageDrsConfigSpec(); StorageDrsPodConfigSpec podConfigSpec = new StorageDrsPodConfigSpec(); ClusterAntiAffinityRuleSpec vmAntiAffinityRuleSpec = new ClusterAntiAffinityRuleSpec(); ClusterRuleSpec ruleSpec = new ClusterRuleSpec(); vmAntiAffinityRuleSpec.name = ruleName; List <ManagedObjectReference> mor = new List <ManagedObjectReference>(); if (enabled.Equals("true")) { vmAntiAffinityRuleSpec.enabled = true; vmAntiAffinityRuleSpec.enabledSpecified = true; } else { vmAntiAffinityRuleSpec.enabled = false; vmAntiAffinityRuleSpec.enabledSpecified = false; } foreach (string vmname in vm) { vmMoref = cb._svcUtil.getEntityByName("VirtualMachine", vmname); if (vmMoref != null) { mor.Add(vmMoref); } else { string message = "Failure: " + vmname + "VM not found"; throw new Exception(message); } } vmAntiAffinityRuleSpec.vm = mor.ToArray(); vmAntiAffinityRuleSpec.userCreated = true; vmAntiAffinityRuleSpec.userCreatedSpecified = true; ruleSpec.info = vmAntiAffinityRuleSpec; ruleSpec.operation = ArrayUpdateOperation.add; podConfigSpec.rule = new ClusterRuleSpec[] { ruleSpec }; sdrsConfigSpec.podConfigSpec = podConfigSpec; ManagedObjectReference taskmor = cb._connection._service.ConfigureStorageDrsForPod_Task(srmRef, sdrsMor, sdrsConfigSpec, true); if (taskmor != null) { String status = cb.getServiceUtil().WaitForTask( taskmor); if (status.Equals("sucess")) { Console.WriteLine("Success: Adding VmAntiAffinity Rule."); } else { Console.WriteLine("Failure: Adding VmAntiAffinity Rule."); throw new Exception(status); } } } else { throw new Exception("Storage Pod " + podName + "not found"); } }
/// <summary> /// Method to modify VM Anti Affinity Rule /// </summary> /// <param name="podName">string</param> /// <param name="ruleName">string</param> /// <param name="newRuleName">string</param> /// <param name="enabled">string</param> /// <param name="vmList">string array</param> private void ModifyVmAntiAffinityRule(string podName, string ruleName, string newRuleName, string enabled, string[] vmList) { ManagedObjectReference srmRef = cb._connection._sic.storageResourceManager; ManagedObjectReference sdrsMor = cb._svcUtil.getEntityByName("StoragePod", podName); if (sdrsMor != null) { PodStorageDrsEntry podStorageDrsEntry = (PodStorageDrsEntry)cb._svcUtil.GetDynamicProperty(sdrsMor, "podStorageDrsEntry"); ClusterRuleInfo[] clusterRuleInfo = podStorageDrsEntry.storageDrsConfig.podConfig.rule; ClusterRuleSpec ruleSpec = new ClusterRuleSpec(); List <ManagedObjectReference> vmMorefList = new List <ManagedObjectReference>(); ManagedObjectReference vmMoref = null; StorageDrsConfigSpec sdrsConfigSpec = new StorageDrsConfigSpec(); StorageDrsPodConfigSpec podConfigSpec = new StorageDrsPodConfigSpec(); ClusterAntiAffinityRuleSpec vmAntiAffinityRuleSpec = null; foreach (ClusterRuleInfo vmRule in clusterRuleInfo) { if (vmRule.name.Equals(ruleName)) { vmAntiAffinityRuleSpec = (ClusterAntiAffinityRuleSpec)vmRule; } } if (vmAntiAffinityRuleSpec != null) { if (newRuleName != null) { vmAntiAffinityRuleSpec.name = newRuleName; } if (enabled.Equals("true")) { vmAntiAffinityRuleSpec.enabled = true; vmAntiAffinityRuleSpec.enabledSpecified = true; } else { vmAntiAffinityRuleSpec.enabled = false; vmAntiAffinityRuleSpec.enabledSpecified = false; } foreach (string vmname in vmList) { vmMoref = cb._svcUtil.getEntityByName("VirtualMachine", vmname); if (vmMoref != null) { vmMorefList.Add(vmMoref); } else { string message = "Failure: " + vmname + "VM not found"; throw new Exception(message); } } vmAntiAffinityRuleSpec.vm = vmMorefList.ToArray(); vmAntiAffinityRuleSpec.userCreated = true; vmAntiAffinityRuleSpec.userCreatedSpecified = true; ruleSpec.info = vmAntiAffinityRuleSpec; ruleSpec.operation = ArrayUpdateOperation.edit; podConfigSpec.rule = new ClusterRuleSpec[] { ruleSpec }; sdrsConfigSpec.podConfigSpec = podConfigSpec; ManagedObjectReference taskmor = cb._connection._service.ConfigureStorageDrsForPod_Task(srmRef, sdrsMor, sdrsConfigSpec, true); if (taskmor != null) { String status = cb.getServiceUtil().WaitForTask( taskmor); if (status.Equals("sucess")) { Console.WriteLine("Success: Modifying VmAntiAffinity Rule."); } else { Console.WriteLine("Failure: Modifying VmAntiAffinity Rule."); throw new Exception(status); } } } else { string msg = "\nFailure: Rule " + ruleName + " not found."; throw new Exception(msg); } } else { throw new Exception("Storage Pod " + podName + "not found"); } }
/// <summary> /// Method to add VmAntiAffinityRule /// </summary> /// <param name="podName">string</param> /// <param name="ruleName">string</param> /// <param name="enabled">string</param> /// <param name="vm">string array</param> private void AddVmAntiAffinityRule(string podName, string ruleName, string enabled, string[] vm) { ManagedObjectReference srmRef = cb._connection._sic.storageResourceManager; ManagedObjectReference sdrsMor = cb._svcUtil.getEntityByName("StoragePod", podName); if (sdrsMor != null) { ManagedObjectReference vmMoref = null; StorageDrsConfigSpec sdrsConfigSpec = new StorageDrsConfigSpec(); StorageDrsPodConfigSpec podConfigSpec = new StorageDrsPodConfigSpec(); ClusterAntiAffinityRuleSpec vmAntiAffinityRuleSpec = new ClusterAntiAffinityRuleSpec(); ClusterRuleSpec ruleSpec = new ClusterRuleSpec(); vmAntiAffinityRuleSpec.name = ruleName; List<ManagedObjectReference> mor = new List<ManagedObjectReference>(); if (enabled.Equals("true")) { vmAntiAffinityRuleSpec.enabled = true; vmAntiAffinityRuleSpec.enabledSpecified = true; } else { vmAntiAffinityRuleSpec.enabled = false; vmAntiAffinityRuleSpec.enabledSpecified = false; } foreach (string vmname in vm) { vmMoref = cb._svcUtil.getEntityByName("VirtualMachine", vmname); if (vmMoref != null) { mor.Add(vmMoref); } else { string message = "Failure: " + vmname + "VM not found"; throw new Exception(message); } } vmAntiAffinityRuleSpec.vm = mor.ToArray(); vmAntiAffinityRuleSpec.userCreated = true; vmAntiAffinityRuleSpec.userCreatedSpecified = true; ruleSpec.info = vmAntiAffinityRuleSpec; ruleSpec.operation = ArrayUpdateOperation.add; podConfigSpec.rule = new ClusterRuleSpec[] { ruleSpec }; sdrsConfigSpec.podConfigSpec = podConfigSpec; ManagedObjectReference taskmor = cb._connection._service.ConfigureStorageDrsForPod_Task(srmRef, sdrsMor, sdrsConfigSpec, true); if (taskmor != null) { String status = cb.getServiceUtil().WaitForTask( taskmor); if (status.Equals("sucess")) { Console.WriteLine("Success: Adding VmAntiAffinity Rule."); } else { Console.WriteLine("Failure: Adding VmAntiAffinity Rule."); throw new Exception(status); } } } else { throw new Exception("Storage Pod " + podName + "not found"); } }
/// <summary> /// Method to modify VM Anti Affinity Rule /// </summary> /// <param name="podName">string</param> /// <param name="ruleName">string</param> /// <param name="newRuleName">string</param> /// <param name="enabled">string</param> /// <param name="vmList">string array</param> private void ModifyVmAntiAffinityRule(string podName, string ruleName, string newRuleName, string enabled, string[] vmList) { ManagedObjectReference srmRef = cb._connection._sic.storageResourceManager; ManagedObjectReference sdrsMor = cb._svcUtil.getEntityByName("StoragePod", podName); if (sdrsMor != null) { PodStorageDrsEntry podStorageDrsEntry = (PodStorageDrsEntry)cb._svcUtil.GetDynamicProperty(sdrsMor, "podStorageDrsEntry"); ClusterRuleInfo[] clusterRuleInfo = podStorageDrsEntry.storageDrsConfig.podConfig.rule; ClusterRuleSpec ruleSpec = new ClusterRuleSpec(); List<ManagedObjectReference> vmMorefList = new List<ManagedObjectReference>(); ManagedObjectReference vmMoref = null; StorageDrsConfigSpec sdrsConfigSpec = new StorageDrsConfigSpec(); StorageDrsPodConfigSpec podConfigSpec = new StorageDrsPodConfigSpec(); ClusterAntiAffinityRuleSpec vmAntiAffinityRuleSpec = null; foreach (ClusterRuleInfo vmRule in clusterRuleInfo) { if (vmRule.name.Equals(ruleName)) { vmAntiAffinityRuleSpec = (ClusterAntiAffinityRuleSpec)vmRule; } } if (vmAntiAffinityRuleSpec != null) { if (newRuleName != null) { vmAntiAffinityRuleSpec.name = newRuleName; } if (enabled.Equals("true")) { vmAntiAffinityRuleSpec.enabled = true; vmAntiAffinityRuleSpec.enabledSpecified = true; } else { vmAntiAffinityRuleSpec.enabled = false; vmAntiAffinityRuleSpec.enabledSpecified = false; } foreach (string vmname in vmList) { vmMoref = cb._svcUtil.getEntityByName("VirtualMachine", vmname); if (vmMoref != null) { vmMorefList.Add(vmMoref); } else { string message = "Failure: " + vmname + "VM not found"; throw new Exception(message); } } vmAntiAffinityRuleSpec.vm = vmMorefList.ToArray(); vmAntiAffinityRuleSpec.userCreated = true; vmAntiAffinityRuleSpec.userCreatedSpecified = true; ruleSpec.info = vmAntiAffinityRuleSpec; ruleSpec.operation = ArrayUpdateOperation.edit; podConfigSpec.rule = new ClusterRuleSpec[] { ruleSpec }; sdrsConfigSpec.podConfigSpec = podConfigSpec; ManagedObjectReference taskmor = cb._connection._service.ConfigureStorageDrsForPod_Task(srmRef, sdrsMor, sdrsConfigSpec, true); if (taskmor != null) { String status = cb.getServiceUtil().WaitForTask( taskmor); if (status.Equals("sucess")) { Console.WriteLine("Success: Modifying VmAntiAffinity Rule."); } else { Console.WriteLine("Failure: Modifying VmAntiAffinity Rule."); throw new Exception(status); } } } else { string msg = "\nFailure: Rule " + ruleName + " not found."; throw new Exception(msg); } } else { throw new Exception("Storage Pod " + podName + "not found"); } }