/* * Copyright (c) 2015 EMC Corporation * All Rights Reserved */ package com.emc.storageos.vcentercontroller; import com.emc.storageos.model.property.PropertyInfo; import com.vmware.vim25.ClusterConfigSpecEx; import com.vmware.vim25.ClusterDasAdmissionControlPolicy; import com.vmware.vim25.ClusterDasConfigInfo; import com.vmware.vim25.ClusterDasVmSettings; import com.vmware.vim25.ClusterDpmConfigInfo; import com.vmware.vim25.ClusterDrsConfigInfo; import com.vmware.vim25.ClusterVmToolsMonitoringSettings; import com.vmware.vim25.ComputeResourceConfigSpec; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Created with IntelliJ IDEA. * User: alaplante * Date: 10/7/14 * Time: 2:06 PM * To change this template use File | Settings | File Templates. */ public class VcenterClusterConfigurerPropertyInfoImpl implements VcenterClusterConfigurer { private final static Logger _log = LoggerFactory.getLogger(VcenterClusterConfigurerPropertyInfoImpl.class); public ClusterConfigSpecEx configure(Object input) throws Exception { PropertyInfo propertyInfo = (PropertyInfo) input; VcenterClusterSettingsConverter converter = VcenterClusterSettingsConverter.getInstance(); ClusterConfigSpecEx clusterConfigSpecEx = new ClusterConfigSpecEx(); clusterConfigSpecEx.setDrsConfig(new ClusterDrsConfigInfo()); clusterConfigSpecEx.getDrsConfig().setEnabled(true); // Enable DRS clusterConfigSpecEx.getDrsConfig().setDefaultVmBehavior( converter.convertToDrsBehavior(propertyInfo.getProperty("vcenter_drs_automationLevel"))); /** * VMWare DRS */ if (Boolean.parseBoolean(propertyInfo.getProperty("vcenter_drs_enabled"))) { _log.info("Set VMWare DRS options for cluster"); clusterConfigSpecEx.setDrsConfig(new ClusterDrsConfigInfo()); clusterConfigSpecEx.getDrsConfig().setEnabled(true); // Enable DRS _log.info("Set Automation level options for cluster"); clusterConfigSpecEx.getDrsConfig().setDefaultVmBehavior( converter.convertToDrsBehavior(propertyInfo.getProperty("vcenter_drs_automationLevel"))); // Automation level clusterConfigSpecEx.getDrsConfig().setVmotionRate( converter.validateThresholdRange(Integer.parseInt(propertyInfo.getProperty("vcenter_drs_migrationThreshold")))); // Migration // threshold // - 1 // is // Aggressive // in // vCenter clusterConfigSpecEx.setDpmConfig(new ClusterDpmConfigInfo()); // Power management - DRS must be enabled clusterConfigSpecEx.getDpmConfig().setEnabled(Boolean.parseBoolean(propertyInfo.getProperty("vcenter_drs_dpm_enabled"))); // Enable // Power // Management // - // DRS // must // first // be // enabled if (Boolean.parseBoolean(propertyInfo.getProperty("vcenter_drs_dpm_enabled"))) { _log.info("Set DPM options for cluster"); clusterConfigSpecEx.getDpmConfig().setDefaultDpmBehavior( converter.convertToDpmBehavior(propertyInfo.getProperty("vcenter_drs_dpm_powerManagement"))); // Power Management clusterConfigSpecEx.getDpmConfig().setHostPowerActionRate( (converter.validateThresholdRange(Integer.parseInt(propertyInfo.getProperty("vcenter_drs_dpm_dpmThreshold"))))); // DPM // Threshold // - // 1 // is // Aggressive // in // vCenter } } /** * VMWare HA */ if (Boolean.parseBoolean(propertyInfo.getProperty("vcenter_das_enabled"))) { _log.info("Set VMWare HA options for cluster"); clusterConfigSpecEx.setDasConfig(new ClusterDasConfigInfo()); clusterConfigSpecEx.getDasConfig().setEnabled(true); clusterConfigSpecEx.getDasConfig().setHostMonitoring( converter.convertToClusterDasConfigInfoServiceState( Boolean.parseBoolean(propertyInfo.getProperty("vcenter_das_hostMonitoring_enabled"))).toString()); // Host // Monitoring // Status _log.info("Set Admission Control Policy options for cluster"); // Work around API quirk - A non-null ACP must be set regardless if ACP is enabled so if disabled just assign some value. Value // doesnt matter and will not be used but it cannot be null! Boolean enableAdmissionControl = Boolean.parseBoolean(propertyInfo.getProperty("vcenter_das_admissionControl_enabled")); String acpName = enableAdmissionControl ? propertyInfo.getProperty("vcenter_das_admissionControlPolicy_policy") : "resourcePercentage"; Integer acpHostFailoverLevel = enableAdmissionControl ? Integer.parseInt(propertyInfo .getProperty("vcenter_das_admissionControlPolicy_hostFailureLevel_failoverLevel")) : 1; Integer acpCpuFailoverPercent = enableAdmissionControl ? Integer.parseInt(propertyInfo .getProperty("vcenter_das_admissionControlPolicy_resourcePercentage_cpuPercentage")) : 50; Integer acpMemoryFailoverPercent = enableAdmissionControl ? Integer.parseInt(propertyInfo .getProperty("vcenter_das_admissionControlPolicy_resourcePercentage_memoryPercentage")) : 50; clusterConfigSpecEx.getDasConfig().setAdmissionControlEnabled(enableAdmissionControl); // Admission Control ClusterDasAdmissionControlPolicy clusterDasAdmissionControlPolicy = converter .convertAdmissionControlPolicyToClusterDasAdmissionControlPolicy(acpName, acpHostFailoverLevel, acpCpuFailoverPercent, acpMemoryFailoverPercent); clusterConfigSpecEx.getDasConfig().setAdmissionControlPolicy(clusterDasAdmissionControlPolicy); /** * Virtual Machine Options */ _log.info("Set Virtual Machine options for cluster"); clusterConfigSpecEx.getDasConfig().setDefaultVmSettings(new ClusterDasVmSettings()); clusterConfigSpecEx .getDasConfig() .getDefaultVmSettings() .setRestartPriority( converter.convertToClusterDasVmSettingsRestartPriority( propertyInfo.getProperty("vcenter_das_vmSettings_restartPriority")).toString()); // VM restart priority clusterConfigSpecEx .getDasConfig() .getDefaultVmSettings() .setIsolationResponse( converter.convertToClusterDasVmSettingsIsolationResponse( propertyInfo.getProperty("vcenter_das_vmSettings_isolationResponse")).toString()); // Host Isolation // Response clusterConfigSpecEx.getDasConfig().setVmMonitoring( converter.convertToClusterDasConfigInfoVmMonitoringState( propertyInfo.getProperty("vcenter_das_vmSettings_vmMonitoring_monitoring")).toString()); // VM Monitoring clusterConfigSpecEx.getDasConfig().getDefaultVmSettings().setVmToolsMonitoringSettings(new ClusterVmToolsMonitoringSettings()); // VM // Monitoring // - // Default // Cluster // Settings // - // Monitoring // sensitivity // is // composed // of // several // options // (simplified // in // UI) converter.convertVmMonitoringSensitivityToFinerGrainedSettings( propertyInfo.getProperty("vcenter_das_vmSettings_vmMonitoring_sensitivity"), clusterConfigSpecEx.getDasConfig() .getDefaultVmSettings().getVmToolsMonitoringSettings()); } /** * VMWare EVC */ // TODO figure out EVC API _log.info("EVC defaulted to always disabled"); /** * VM Swapfile location */ _log.info("Set VM Swapfile location options for cluster"); ComputeResourceConfigSpec computeResourceConfigSpec = (ComputeResourceConfigSpec) clusterConfigSpecEx; computeResourceConfigSpec.setVmSwapPlacement(converter.convertToVirtualMachineConfigInfoSwapPlacementType( propertyInfo.getProperty("vcenter_swapfile_policy")).toString()); // vmDirectory = UI option 1, hostLocal = UI option 2 - // option 2 ALSO requires setting some additional property // localSwapDatastore on VM - will we ever do this? return clusterConfigSpecEx; } }