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);