/// <summary> /// Delete VMdk AntiAffinity Rule Spec /// </summary> /// <param name="podName">string</param> /// <param name="ruleName">string</param> private void DeleteVmdkAntiAffinityRule(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"); StorageDrsVmConfigInfo drsVmConfigInfo = null; StorageDrsConfigSpec sdrsConfigSpec = new StorageDrsConfigSpec(); StorageDrsVmConfigSpec drsVmConfigSpec = new StorageDrsVmConfigSpec(); StorageDrsVmConfigInfo[] sdrsVmConfig = podStorageDrsEntry.storageDrsConfig.vmConfig; foreach (StorageDrsVmConfigInfo vmConfig in sdrsVmConfig) { if (vmConfig.intraVmAntiAffinity != null) { if (vmConfig.intraVmAntiAffinity.name.Equals(ruleName)) { drsVmConfigInfo = vmConfig; } } } if (drsVmConfigInfo != null) { drsVmConfigInfo.intraVmAntiAffinity = null; drsVmConfigSpec.info = drsVmConfigInfo; drsVmConfigSpec.operation = ArrayUpdateOperation.edit; sdrsConfigSpec.vmConfigSpec = new StorageDrsVmConfigSpec[] { drsVmConfigSpec }; } else { string msg = "\nFailure: Rule " + ruleName + " not found."; throw new Exception(msg); } 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 VmdkAntiAffinity Rule."); } else { Console.WriteLine("Failure: Delete VmdkAntiAffinity Rule."); throw new Exception(status); } } } else { throw new Exception("Storage Pod " + podName + "not found"); } }
/// <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> /// Create Object of StorageDrsConfigSpec /// </summary> /// <param name="behavior">string</param> /// <param name="loadBalanceInterval">string</param> /// <returns></returns> private StorageDrsConfigSpec GetStorageDrsConfigSpec(string behavior, string loadBalanceInterval) { StorageDrsConfigSpec sdrsConfigSpec = new StorageDrsConfigSpec(); StorageDrsPodConfigSpec podConfigSpec = new StorageDrsPodConfigSpec(); if (behavior.Equals("true")) { podConfigSpec.defaultVmBehavior = "automated"; } else { podConfigSpec.defaultVmBehavior = "manual"; } podConfigSpec.defaultIntraVmAffinity = true; podConfigSpec.defaultIntraVmAffinitySpecified = true; podConfigSpec.enabled = true; podConfigSpec.enabledSpecified = true; StorageDrsIoLoadBalanceConfig sdrsIoLoadBalanceConfig = new StorageDrsIoLoadBalanceConfig(); if (ioLatencythreshold != null) { sdrsIoLoadBalanceConfig.ioLatencyThreshold = int.Parse(ioLatencythreshold); sdrsIoLoadBalanceConfig.ioLatencyThresholdSpecified = true; } if (ioLoadImbalanceThreshold != null) { sdrsIoLoadBalanceConfig.ioLoadImbalanceThreshold = int.Parse(ioLoadImbalanceThreshold); sdrsIoLoadBalanceConfig.ioLoadImbalanceThresholdSpecified = true; } podConfigSpec.ioLoadBalanceConfig = sdrsIoLoadBalanceConfig; podConfigSpec.ioLoadBalanceEnabled = true; podConfigSpec.ioLoadBalanceEnabledSpecified = true; if (loadBalanceInterval != null) { podConfigSpec.loadBalanceInterval = int.Parse(loadBalanceInterval); podConfigSpec.loadBalanceIntervalSpecified = true; } StorageDrsSpaceLoadBalanceConfig sdrsSpaceLoadBalanceConfig = new StorageDrsSpaceLoadBalanceConfig(); if (spaceUtilizationThreshold != null) { sdrsSpaceLoadBalanceConfig.spaceUtilizationThreshold = int.Parse(spaceUtilizationThreshold); sdrsSpaceLoadBalanceConfig.spaceUtilizationThresholdSpecified = true; } if (minSpaceUtilizationDifference != null) { sdrsSpaceLoadBalanceConfig.minSpaceUtilizationDifference = int.Parse(minSpaceUtilizationDifference); sdrsSpaceLoadBalanceConfig.minSpaceUtilizationDifferenceSpecified = true; } podConfigSpec.spaceLoadBalanceConfig = sdrsSpaceLoadBalanceConfig; sdrsConfigSpec.podConfigSpec = podConfigSpec; return(sdrsConfigSpec); }
/// <summary> /// Create Object of StorageDrsConfigSpec /// </summary> /// <param name="behavior">string</param> /// <param name="loadBalanceInterval">string</param> /// <returns></returns> private StorageDrsConfigSpec GetStorageDrsConfigSpec(string behavior, string loadBalanceInterval) { StorageDrsConfigSpec sdrsConfigSpec = new StorageDrsConfigSpec(); StorageDrsPodConfigSpec podConfigSpec = new StorageDrsPodConfigSpec(); if (behavior.Equals("true")) { podConfigSpec.defaultVmBehavior = "automated"; } else { podConfigSpec.defaultVmBehavior = "manual"; } podConfigSpec.defaultIntraVmAffinity = true; podConfigSpec.defaultIntraVmAffinitySpecified = true; podConfigSpec.enabled = true; podConfigSpec.enabledSpecified = true; StorageDrsIoLoadBalanceConfig sdrsIoLoadBalanceConfig = new StorageDrsIoLoadBalanceConfig(); if (ioLatencythreshold != null) { sdrsIoLoadBalanceConfig.ioLatencyThreshold = int.Parse(ioLatencythreshold); sdrsIoLoadBalanceConfig.ioLatencyThresholdSpecified = true; } if (ioLoadImbalanceThreshold != null) { sdrsIoLoadBalanceConfig.ioLoadImbalanceThreshold = int.Parse(ioLoadImbalanceThreshold); sdrsIoLoadBalanceConfig.ioLoadImbalanceThresholdSpecified = true; } podConfigSpec.ioLoadBalanceConfig = sdrsIoLoadBalanceConfig; podConfigSpec.ioLoadBalanceEnabled = true; podConfigSpec.ioLoadBalanceEnabledSpecified = true; if (loadBalanceInterval != null) { podConfigSpec.loadBalanceInterval = int.Parse(loadBalanceInterval); podConfigSpec.loadBalanceIntervalSpecified = true; } StorageDrsSpaceLoadBalanceConfig sdrsSpaceLoadBalanceConfig = new StorageDrsSpaceLoadBalanceConfig(); if (spaceUtilizationThreshold != null) { sdrsSpaceLoadBalanceConfig.spaceUtilizationThreshold = int.Parse(spaceUtilizationThreshold); sdrsSpaceLoadBalanceConfig.spaceUtilizationThresholdSpecified = true; } if (minSpaceUtilizationDifference != null) { sdrsSpaceLoadBalanceConfig.minSpaceUtilizationDifference = int.Parse(minSpaceUtilizationDifference); sdrsSpaceLoadBalanceConfig.minSpaceUtilizationDifferenceSpecified = true; } podConfigSpec.spaceLoadBalanceConfig = sdrsSpaceLoadBalanceConfig; sdrsConfigSpec.podConfigSpec = podConfigSpec; return sdrsConfigSpec; }
/// <summary> /// Method to create Storage DRSgroup /// </summary> private void CreateSDRS() { string dcName = cb.get_option("dcname"); string drsname = cb.get_option("sdrsname"); string behavior = cb.get_option("behavior"); string loadBalanceInterval = cb.get_option("loadbalinterval"); string dsname = cb.get_option("datastore"); ManagedObjectReference storagePod = new ManagedObjectReference(); ManagedObjectReference storageResourceManager = cb._connection._sic.storageResourceManager; ManagedObjectReference dcmor = cb._svcUtil.getEntityByName("Datacenter", dcName); if (dcmor != null) { ManagedObjectReference datastoreFolder = cb.getServiceUtil().GetMoRefProp (dcmor, "datastoreFolder"); storagePod = cb.getConnection()._service.CreateStoragePod(datastoreFolder, drsname); Console.WriteLine("Success: Creating storagePod."); StorageDrsConfigSpec sdrsConfigSpec = GetStorageDrsConfigSpec(behavior, loadBalanceInterval); ManagedObjectReference taskmor = cb.getConnection()._service.ConfigureStorageDrsForPod_Task(storageResourceManager, storagePod, sdrsConfigSpec, true); if (taskmor != null) { String status = cb.getServiceUtil().WaitForTask( taskmor); if (status.Equals("sucess")) { Console.WriteLine("Sucessfully configured storage pod" + drsname); } else { Console.WriteLine("Failure: Configuring storagePod"); throw new Exception(status); } } if (dsname != null) { ManagedObjectReference dsMoref = cb._svcUtil.getEntityByName("Datastore", dsname); if (dsMoref != null) { ManagedObjectReference[] dslist = new ManagedObjectReference[] { dsMoref }; ManagedObjectReference task = cb.getConnection()._service. MoveIntoFolder_Task(storagePod, dslist); if (task != null) { String status = cb.getServiceUtil().WaitForTask( taskmor); if (status.Equals("sucess")) { Console.WriteLine("\nSuccess: Adding datastore to storagePod."); } else { Console.WriteLine("Failure: Adding datastore to storagePod."); throw new Exception(status); } } } else { throw new Exception("Datastore" + dsname + "not found"); } } } else { throw new Exception("datacenter" + dcName + "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 add VmdkAntiAffinityRule /// </summary> /// <param name="podName">string</param> /// <param name="ruleName">string</param> /// <param name="enabled">string</param> /// <param name="vm">string</param> private void AddVmdkAntiAffinityRule(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(); StorageDrsVmConfigSpec drsVmConfigSpec = new StorageDrsVmConfigSpec(); StorageDrsVmConfigInfo drsVmConfigInfo = new StorageDrsVmConfigInfo(); VirtualDiskAntiAffinityRuleSpec vmdkAntiAffinityRuleSpec = new VirtualDiskAntiAffinityRuleSpec(); vmdkAntiAffinityRuleSpec.name = ruleName; if (enabled.Equals("true")) { vmdkAntiAffinityRuleSpec.enabled = true; vmdkAntiAffinityRuleSpec.enabledSpecified = true; } else { vmdkAntiAffinityRuleSpec.enabled = false; vmdkAntiAffinityRuleSpec.enabledSpecified = false; } vmMoref = cb._svcUtil.getEntityByName("VirtualMachine", vm); if (vmMoref != null) { VirtualMachineConfigInfo vmConfigInfo = (VirtualMachineConfigInfo)cb._svcUtil.GetDynamicProperty(vmMoref, "config"); VirtualDevice[] vDevice = vmConfigInfo.hardware.device; List <VirtualDevice> vDisk = new List <VirtualDevice>(); VirtualDevice[] virtualDisk = null; List <int> diskIdList = new List <int>(); foreach (VirtualDevice device in vDevice) { if (device.GetType().Name.Equals("VirtualDisk")) { vDisk.Add(device); diskIdList.Add(device.key); } } virtualDisk = vDisk.ToArray(); vmdkAntiAffinityRuleSpec.diskId = diskIdList.ToArray(); if (virtualDisk.Length < 2) { throw new Exception( "VM should have minimum of 2 virtual disks" + " while adding VMDK AntiAffinity Rule."); } Console.WriteLine("Adding below list of virtual disk to rule " + ruleName + " :"); foreach (VirtualDevice device in virtualDisk) { Console.WriteLine("Virtual Disk : " + device.deviceInfo.label + ", Key : " + device.key); } vmdkAntiAffinityRuleSpec.userCreated = true; vmdkAntiAffinityRuleSpec.userCreatedSpecified = true; drsVmConfigInfo.intraVmAntiAffinity = vmdkAntiAffinityRuleSpec; drsVmConfigInfo.intraVmAffinitySpecified = true; drsVmConfigInfo.vm = vmMoref; } else { string message = "Failure: " + vm + "VM not found"; throw new Exception(message); } drsVmConfigSpec.info = drsVmConfigInfo; drsVmConfigSpec.operation = ArrayUpdateOperation.add; sdrsConfigSpec.vmConfigSpec = new StorageDrsVmConfigSpec[] { drsVmConfigSpec }; 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 VmdkAntiAffinity Rule."); } else { Console.WriteLine("Failure: Adding VmdkAntiAffinity 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 add VmdkAntiAffinityRule /// </summary> /// <param name="podName">string</param> /// <param name="ruleName">string</param> /// <param name="enabled">string</param> /// <param name="vm">string</param> private void AddVmdkAntiAffinityRule(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(); StorageDrsVmConfigSpec drsVmConfigSpec = new StorageDrsVmConfigSpec(); StorageDrsVmConfigInfo drsVmConfigInfo = new StorageDrsVmConfigInfo(); VirtualDiskAntiAffinityRuleSpec vmdkAntiAffinityRuleSpec = new VirtualDiskAntiAffinityRuleSpec(); vmdkAntiAffinityRuleSpec.name = ruleName; if (enabled.Equals("true")) { vmdkAntiAffinityRuleSpec.enabled = true; vmdkAntiAffinityRuleSpec.enabledSpecified = true; } else { vmdkAntiAffinityRuleSpec.enabled = false; vmdkAntiAffinityRuleSpec.enabledSpecified = false; } vmMoref = cb._svcUtil.getEntityByName("VirtualMachine", vm); if (vmMoref != null) { VirtualMachineConfigInfo vmConfigInfo = (VirtualMachineConfigInfo)cb._svcUtil.GetDynamicProperty(vmMoref, "config"); VirtualDevice[] vDevice = vmConfigInfo.hardware.device; List<VirtualDevice> vDisk = new List<VirtualDevice>(); VirtualDevice[] virtualDisk = null; List<int> diskIdList = new List<int>(); foreach (VirtualDevice device in vDevice) { if (device.GetType().Name.Equals("VirtualDisk")) { vDisk.Add(device); diskIdList.Add(device.key); } } virtualDisk = vDisk.ToArray(); vmdkAntiAffinityRuleSpec.diskId = diskIdList.ToArray(); if (virtualDisk.Length < 2) { throw new Exception( "VM should have minimum of 2 virtual disks" + " while adding VMDK AntiAffinity Rule."); } Console.WriteLine("Adding below list of virtual disk to rule " + ruleName + " :"); foreach (VirtualDevice device in virtualDisk) { Console.WriteLine("Virtual Disk : " + device.deviceInfo.label + ", Key : " + device.key); } vmdkAntiAffinityRuleSpec.userCreated = true; vmdkAntiAffinityRuleSpec.userCreatedSpecified = true; drsVmConfigInfo.intraVmAntiAffinity = vmdkAntiAffinityRuleSpec; drsVmConfigInfo.intraVmAffinitySpecified = true; drsVmConfigInfo.vm = vmMoref; } else { string message = "Failure: " + vm + "VM not found"; throw new Exception(message); } drsVmConfigSpec.info = drsVmConfigInfo; drsVmConfigSpec.operation = ArrayUpdateOperation.add; sdrsConfigSpec.vmConfigSpec = new StorageDrsVmConfigSpec[] { drsVmConfigSpec }; 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 VmdkAntiAffinity Rule."); } else { Console.WriteLine("Failure: Adding VmdkAntiAffinity Rule."); throw new Exception(status); } } } else { throw new Exception("Storage Pod " + podName + "not found"); } }
/// <summary> /// Method to Modify VmdkAntiAffinityRule /// </summary> /// <param name="podName">string</param> /// <param name="ruleName">string</param> /// <param name="newRuleName">string</param> /// <param name="enabled">string</param> private void ModifyVmdkAntiAffinityRule(string podName, string ruleName, string newRuleName, string enabled) { ManagedObjectReference srmRef = cb._connection._sic.storageResourceManager; ManagedObjectReference sdrsMor = cb._svcUtil.getEntityByName("StoragePod", podName); if (sdrsMor != null) { PodStorageDrsEntry podStorageDrsEntry = (PodStorageDrsEntry)cb._svcUtil.GetDynamicProperty(sdrsMor, "podStorageDrsEntry"); StorageDrsVmConfigInfo drsVmConfigInfo = null; StorageDrsConfigSpec sdrsConfigSpec = new StorageDrsConfigSpec(); StorageDrsVmConfigSpec drsVmConfigSpec = new StorageDrsVmConfigSpec(); StorageDrsVmConfigInfo[] sdrsVmConfig = podStorageDrsEntry.storageDrsConfig.vmConfig; foreach (StorageDrsVmConfigInfo vmConfig in sdrsVmConfig) { if (vmConfig.intraVmAntiAffinity != null) { if (vmConfig.intraVmAntiAffinity.name.Equals(ruleName)) { drsVmConfigInfo = vmConfig; } } } if (drsVmConfigInfo != null) { if (newRuleName != null) { drsVmConfigInfo.intraVmAntiAffinity.name = newRuleName; } if (enabled != null) { if (enabled.Equals("true")) { drsVmConfigInfo.intraVmAntiAffinity.enabled = true; drsVmConfigInfo.intraVmAntiAffinity.enabledSpecified = true; } else { drsVmConfigInfo.intraVmAntiAffinity.enabled = false; drsVmConfigInfo.intraVmAntiAffinity.enabledSpecified = false; } } drsVmConfigSpec.info = drsVmConfigInfo; drsVmConfigSpec.operation = ArrayUpdateOperation.edit; sdrsConfigSpec.vmConfigSpec = new StorageDrsVmConfigSpec[] { drsVmConfigSpec }; } else { string msg = "\nFailure: Rule " + ruleName + " not found."; throw new Exception(msg); } 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: Modify VmdkAntiAffinity Rule."); } else { Console.WriteLine("Failure: Modify VmdkAntiAffinity 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"); } }