diff --git a/core/src/com/cloud/hypervisor/vmware/manager/VmwareStorageManagerImpl.java b/core/src/com/cloud/hypervisor/vmware/manager/VmwareStorageManagerImpl.java index 0f20b1e5b35..f25ccf00798 100644 --- a/core/src/com/cloud/hypervisor/vmware/manager/VmwareStorageManagerImpl.java +++ b/core/src/com/cloud/hypervisor/vmware/manager/VmwareStorageManagerImpl.java @@ -181,7 +181,7 @@ public class VmwareStorageManagerImpl implements VmwareStorageManager { workerVMName = UUID.randomUUID().toString().replaceAll("-", ""); //attach a volume to dummay wrapper VM for taking snapshot and exporting the VM for backup - if (!hyperHost.createBlankVm(workerVMName, 1, 512, 0, false, 4, VirtualMachineGuestOsIdentifier._otherGuest.toString(), morDs, false)) { + if (!hyperHost.createBlankVm(workerVMName, 1, 512, 0, false, 4, 0, VirtualMachineGuestOsIdentifier._otherGuest.toString(), morDs, false)) { String msg = "Unable to create worker VM to execute BackupSnapshotCommand"; s_logger.error(msg); throw new Exception(msg); diff --git a/core/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java b/core/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java index c2589b56eb7..653438586b1 100755 --- a/core/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java +++ b/core/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java @@ -238,8 +238,12 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa protected String _privateNetworkVSwitchName; protected String _publicNetworkVSwitchName; protected String _guestNetworkVSwitchName; + protected float _cpuOverprovisioningFactor = 1; protected boolean _reserveCpu = false; + + protected float _memOverprovisioningFactor = 1; + protected boolean _reserveMem = false; protected ManagedObjectReference _morHyperHost; protected VmwareContext _serviceContext; @@ -1099,7 +1103,7 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa assert (vmSpec.getSpeed() != null) && (rootDiskDataStoreDetails != null); if (!hyperHost.createBlankVm(vmName, vmSpec.getCpus(), vmSpec.getSpeed().intValue(), - getReserveCpuMHz(vmSpec.getSpeed().intValue()), vmSpec.getLimitCpuUse(), ramMb, + getReserveCpuMHz(vmSpec.getSpeed().intValue()), vmSpec.getLimitCpuUse(), ramMb, getReserveMemMB(ramMb), translateGuestOsIdentifier(vmSpec.getArch(), vmSpec.getOs()).toString(), rootDiskDataStoreDetails.first(), false)) { throw new Exception("Failed to create VM. vmName: " + vmName); } @@ -1131,7 +1135,7 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa VirtualMachineConfigSpec vmConfigSpec = new VirtualMachineConfigSpec(); int ramMb = (int) (vmSpec.getMinRam() / (1024 * 1024)); VmwareHelper.setBasicVmConfig(vmConfigSpec, vmSpec.getCpus(), vmSpec.getSpeed().intValue(), - getReserveCpuMHz(vmSpec.getSpeed().intValue()), ramMb, + getReserveCpuMHz(vmSpec.getSpeed().intValue()), ramMb, getReserveMemMB(ramMb), translateGuestOsIdentifier(vmSpec.getArch(), vmSpec.getOs()).toString(), vmSpec.getLimitCpuUse()); VirtualDeviceConfigSpec[] deviceConfigSpecArray = new VirtualDeviceConfigSpec[totalChangeDevices]; @@ -1321,6 +1325,14 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa return 0; } + + private int getReserveMemMB(int memMB) { + if(this._reserveMem) { + return (int)(memMB / this._memOverprovisioningFactor); + } + + return 0; + } private NicTO[] sortNicsByDeviceId(NicTO[] nics) { @@ -3658,7 +3670,15 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa value = (String) params.get("vmware.reserve.cpu"); if(value != null && value.equalsIgnoreCase("true")) - _reserveCpu = true; + _reserveCpu = true; + + value = (String) params.get("mem.overprovisioning.factor"); + if(value != null) + _memOverprovisioningFactor = Float.parseFloat(value); + + value = (String) params.get("vmware.reserve.mem"); + if(value != null && value.equalsIgnoreCase("true")) + _reserveMem = true; String[] tokens = _guid.split("@"); _vCenterAddress = tokens[1]; diff --git a/deps/.classpath b/deps/.classpath index 7de648393b5..45c54d0cfea 100755 --- a/deps/.classpath +++ b/deps/.classpath @@ -1,60 +1,59 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/server/src/com/cloud/hypervisor/vmware/VmwareManagerImpl.java b/server/src/com/cloud/hypervisor/vmware/VmwareManagerImpl.java index e2ead1b8a65..4dc5d632ae7 100755 --- a/server/src/com/cloud/hypervisor/vmware/VmwareManagerImpl.java +++ b/server/src/com/cloud/hypervisor/vmware/VmwareManagerImpl.java @@ -124,6 +124,9 @@ public class VmwareManagerImpl implements VmwareManager, VmwareStorageMount, Lis String _cpuOverprovisioningFactor = "1"; String _reserveCpu = "false"; + String _memOverprovisioningFactor = "1"; + String _reserveMem = "false"; + Map _storageMounts = new HashMap(); Random _rand = new Random(System.currentTimeMillis()); @@ -234,10 +237,17 @@ public class VmwareManagerImpl implements VmwareManager, VmwareStorageMount, Lis _cpuOverprovisioningFactor = configDao.getValue(Config.CPUOverprovisioningFactor.key()); if(_cpuOverprovisioningFactor == null || _cpuOverprovisioningFactor.isEmpty()) _cpuOverprovisioningFactor = "1"; + + _memOverprovisioningFactor = configDao.getValue(Config.MemOverprovisioningFactor.key()); + if(_memOverprovisioningFactor == null || _memOverprovisioningFactor.isEmpty()) + _memOverprovisioningFactor = "1"; _reserveCpu = configDao.getValue(Config.VmwareReserveCpu.key()); if(_reserveCpu == null || _reserveCpu.isEmpty()) _reserveCpu = "false"; + _reserveMem = configDao.getValue(Config.VmwareReserveMem.key()); + if(_reserveMem == null || _reserveMem.isEmpty()) + _reserveMem = "false"; s_logger.info("Additional VNC port allocation range is settled at " + _additionalPortRangeStart + " to " + (_additionalPortRangeStart + _additionalPortRangeSize)); @@ -461,6 +471,8 @@ public class VmwareManagerImpl implements VmwareManager, VmwareStorageMount, Lis params.put("management.portgroup.name", _managemetPortGroupName); params.put("cpu.overprovisioning.factor", _cpuOverprovisioningFactor); params.put("vmware.reserve.cpu", _reserveCpu); + params.put("mem.overprovisioning.factor", _memOverprovisioningFactor); + params.put("vmware.reserve.mem", _reserveMem); } @Override diff --git a/vmware-base/src/com/cloud/hypervisor/vmware/mo/ClusterMO.java b/vmware-base/src/com/cloud/hypervisor/vmware/mo/ClusterMO.java index be44e89ca3b..d897d48af17 100755 --- a/vmware-base/src/com/cloud/hypervisor/vmware/mo/ClusterMO.java +++ b/vmware-base/src/com/cloud/hypervisor/vmware/mo/ClusterMO.java @@ -255,7 +255,7 @@ public class ClusterMO extends BaseMO implements VmwareHypervisorHost { } @Override - public boolean createBlankVm(String vmName, int cpuCount, int cpuSpeedMHz, int cpuReservedMHz, boolean limitCpuUse, int memoryMB, + public boolean createBlankVm(String vmName, int cpuCount, int cpuSpeedMHz, int cpuReservedMHz, boolean limitCpuUse, int memoryMB, int memoryReserveMB, String guestOsIdentifier, ManagedObjectReference morDs, boolean snapshotDirToParent) throws Exception { if(s_logger.isTraceEnabled()) @@ -264,7 +264,7 @@ public class ClusterMO extends BaseMO implements VmwareHypervisorHost { + ", guestOS: " + guestOsIdentifier + ", datastore: " + morDs.get_value() + ", snapshotDirToParent: " + snapshotDirToParent); boolean result = HypervisorHostHelper.createBlankVm(this, vmName, cpuCount, cpuSpeedMHz, cpuReservedMHz, limitCpuUse, - memoryMB, guestOsIdentifier, morDs, snapshotDirToParent); + memoryMB, memoryReserveMB, guestOsIdentifier, morDs, snapshotDirToParent); if(s_logger.isTraceEnabled()) s_logger.trace("vCenter API trace - createBlankVm() done"); diff --git a/vmware-base/src/com/cloud/hypervisor/vmware/mo/HostMO.java b/vmware-base/src/com/cloud/hypervisor/vmware/mo/HostMO.java index b937a66cf62..1b512c36eca 100755 --- a/vmware-base/src/com/cloud/hypervisor/vmware/mo/HostMO.java +++ b/vmware-base/src/com/cloud/hypervisor/vmware/mo/HostMO.java @@ -664,7 +664,7 @@ public class HostMO extends BaseMO implements VmwareHypervisorHost { } @Override - public boolean createBlankVm(String vmName, int cpuCount, int cpuSpeedMHz, int cpuReservedMHz, boolean limitCpuUse, int memoryMB, + public boolean createBlankVm(String vmName, int cpuCount, int cpuSpeedMHz, int cpuReservedMHz, boolean limitCpuUse, int memoryMB, int memoryReserveMB, String guestOsIdentifier, ManagedObjectReference morDs, boolean snapshotDirToParent) throws Exception { if(s_logger.isTraceEnabled()) @@ -673,7 +673,7 @@ public class HostMO extends BaseMO implements VmwareHypervisorHost { + ", guestOS: " + guestOsIdentifier + ", datastore: " + morDs.get_value() + ", snapshotDirToParent: " + snapshotDirToParent); boolean result = HypervisorHostHelper.createBlankVm(this, vmName, cpuCount, cpuSpeedMHz, cpuReservedMHz, limitCpuUse, - memoryMB, guestOsIdentifier, morDs, snapshotDirToParent); + memoryMB, memoryReserveMB, guestOsIdentifier, morDs, snapshotDirToParent); if(s_logger.isTraceEnabled()) s_logger.trace("vCenter API trace - createBlankVm() done"); diff --git a/vmware-base/src/com/cloud/hypervisor/vmware/mo/HypervisorHostHelper.java b/vmware-base/src/com/cloud/hypervisor/vmware/mo/HypervisorHostHelper.java index 0ea881e41e9..25bc3743f46 100755 --- a/vmware-base/src/com/cloud/hypervisor/vmware/mo/HypervisorHostHelper.java +++ b/vmware-base/src/com/cloud/hypervisor/vmware/mo/HypervisorHostHelper.java @@ -398,7 +398,7 @@ public class HypervisorHostHelper { } public static boolean createBlankVm(VmwareHypervisorHost host, String vmName, - int cpuCount, int cpuSpeedMHz, int cpuReservedMHz, boolean limitCpuUse, int memoryMB, String guestOsIdentifier, + int cpuCount, int cpuSpeedMHz, int cpuReservedMHz, boolean limitCpuUse, int memoryMB, int memoryReserveMB, String guestOsIdentifier, ManagedObjectReference morDs, boolean snapshotDirToParent) throws Exception { if(s_logger.isInfoEnabled()) @@ -407,7 +407,7 @@ public class HypervisorHostHelper { // VM config basics VirtualMachineConfigSpec vmConfig = new VirtualMachineConfigSpec(); vmConfig.setName(vmName); - VmwareHelper.setBasicVmConfig(vmConfig, cpuCount, cpuSpeedMHz, cpuReservedMHz, memoryMB, guestOsIdentifier, limitCpuUse); + VmwareHelper.setBasicVmConfig(vmConfig, cpuCount, cpuSpeedMHz, cpuReservedMHz, memoryMB, memoryReserveMB, guestOsIdentifier, limitCpuUse); // Scsi controller VirtualLsiLogicController scsiController = new VirtualLsiLogicController(); diff --git a/vmware-base/src/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java b/vmware-base/src/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java index 4784825267a..6b4e0a1fae9 100755 --- a/vmware-base/src/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java +++ b/vmware-base/src/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java @@ -1377,7 +1377,7 @@ public class VirtualMachineMO extends BaseMO { HostMO hostMo = getRunningHost(); VirtualMachineConfigInfo vmConfigInfo = getConfigInfo(); - hostMo.createBlankVm(clonedVmName, 1, cpuSpeedMHz, 0, false, memoryMb, vmConfigInfo.getGuestId(), morDs, false); + hostMo.createBlankVm(clonedVmName, 1, cpuSpeedMHz, 0, false, memoryMb, 0, vmConfigInfo.getGuestId(), morDs, false); VirtualMachineMO clonedVmMo = hostMo.findVmOnHyperHost(clonedVmName); VirtualMachineConfigSpec vmConfigSpec = new VirtualMachineConfigSpec(); diff --git a/vmware-base/src/com/cloud/hypervisor/vmware/mo/VmwareHypervisorHost.java b/vmware-base/src/com/cloud/hypervisor/vmware/mo/VmwareHypervisorHost.java index 3796bc0c1d1..8ac2906a0ad 100755 --- a/vmware-base/src/com/cloud/hypervisor/vmware/mo/VmwareHypervisorHost.java +++ b/vmware-base/src/com/cloud/hypervisor/vmware/mo/VmwareHypervisorHost.java @@ -33,7 +33,7 @@ public interface VmwareHypervisorHost { VirtualMachineMO findVmOnPeerHyperHost(String name) throws Exception; boolean createVm(VirtualMachineConfigSpec vmSpec) throws Exception; - boolean createBlankVm(String vmName, int cpuCount, int cpuSpeedMHz, int cpuReservedMHz, boolean limitCpuUse, int memoryMB, + boolean createBlankVm(String vmName, int cpuCount, int cpuSpeedMHz, int cpuReservedMHz, boolean limitCpuUse, int memoryMB, int memoryReserveMB, String guestOsIdentifier, ManagedObjectReference morDs, boolean snapshotDirToParent) throws Exception; void importVmFromOVF(String ovfFilePath, String vmName, DatastoreMO dsMo, String diskOption) throws Exception; diff --git a/vmware-base/src/com/cloud/hypervisor/vmware/util/VmwareHelper.java b/vmware-base/src/com/cloud/hypervisor/vmware/util/VmwareHelper.java index 178ee337ddd..4e458b4e4f7 100755 --- a/vmware-base/src/com/cloud/hypervisor/vmware/util/VmwareHelper.java +++ b/vmware-base/src/com/cloud/hypervisor/vmware/util/VmwareHelper.java @@ -407,7 +407,7 @@ public class VmwareHelper { } public static void setBasicVmConfig(VirtualMachineConfigSpec vmConfig, int cpuCount, int cpuSpeedMHz, int cpuReservedMhz, - int memoryMB, String guestOsIdentifier, boolean limitCpuUse) { + int memoryMB, int memoryReserveMB, String guestOsIdentifier, boolean limitCpuUse) { // VM config basics vmConfig.setMemoryMB((long)memoryMB); @@ -425,7 +425,7 @@ public class VmwareHelper { ResourceAllocationInfo memInfo = new ResourceAllocationInfo(); memInfo.setLimit((long)memoryMB); - memInfo.setReservation((long)memoryMB); + memInfo.setReservation((long)memoryReserveMB); vmConfig.setMemoryAllocation(memInfo); vmConfig.setGuestId(guestOsIdentifier);