diff --git a/plugins/integrations/veeam-control-service/src/main/java/org/apache/cloudstack/veeam/api/dto/OvfXmlUtil.java b/plugins/integrations/veeam-control-service/src/main/java/org/apache/cloudstack/veeam/api/dto/OvfXmlUtil.java
index d417ffde17d..2c06b83de40 100644
--- a/plugins/integrations/veeam-control-service/src/main/java/org/apache/cloudstack/veeam/api/dto/OvfXmlUtil.java
+++ b/plugins/integrations/veeam-control-service/src/main/java/org/apache/cloudstack/veeam/api/dto/OvfXmlUtil.java
@@ -63,6 +63,39 @@ public class OvfXmlUtil {
return sdf;
});
+ protected enum MemoryAllocationUnit {
+ Bytes("byte", 1),
+ Kilobytes("byte * 2^10", 1024),
+ Megabytes("byte * 2^20", 1024 * 1024),
+ Gigabytes("byte * 2^30", 1024 * 1024 * 1024);
+
+ final String allocationUnitsToken;
+ final long bytesMultiplier;
+
+ MemoryAllocationUnit(String allocationUnitsToken, long bytesMultiplier) {
+ this.allocationUnitsToken = allocationUnitsToken;
+ this.bytesMultiplier = bytesMultiplier;
+ }
+
+ public String getAllocationUnitsToken() {
+ return allocationUnitsToken;
+ }
+
+ public long getBytesMultiplier() {
+ return bytesMultiplier;
+ }
+
+ public static MemoryAllocationUnit fromString(String value) {
+ for (MemoryAllocationUnit unit : MemoryAllocationUnit.values()) {
+ if (StringUtils.isNotBlank(value) &&
+ (unit.getAllocationUnitsToken().equalsIgnoreCase(value) || unit.name().equalsIgnoreCase(value))) {
+ return unit;
+ }
+ }
+ return null;
+ }
+ }
+
public static String toXml(final Vm vm, final UserVmJoinVO vo) {
final String vmId = vm.getId();
final String vmName = vm.getName();
@@ -306,7 +339,7 @@ public class OvfXmlUtil {
sb.append("Memory Size");
sb.append("2");
sb.append("4");
- sb.append("MegaBytes");
+ sb.append("").append(MemoryAllocationUnit.Megabytes.getAllocationUnitsToken()).append("");
sb.append("").append(memMb).append("");
sb.append("");
@@ -493,9 +526,8 @@ public class OvfXmlUtil {
if (memItems != null && memItems.getLength() > 0) {
Node memItem = memItems.item(0);
String memStr = childText(memItem, "VirtualQuantity");
- if (StringUtils.isNotBlank(memStr)) {
- vm.setMemory(memStr);
- }
+ String memAllocationUnitsStr = childText(memItem, "AllocationUnits");
+ updateVmMemory(vm, memStr, memAllocationUnitsStr);
}
// CPU
@@ -529,6 +561,21 @@ public class OvfXmlUtil {
}
}
+ private static void updateVmMemory(Vm vm, String memStr, String memAllocationUnitsStr) {
+ if (StringUtils.isAnyBlank(memStr, memAllocationUnitsStr)) {
+ return;
+ }
+ MemoryAllocationUnit memoryAllocationUnit = MemoryAllocationUnit.fromString(memAllocationUnitsStr);
+ if (memoryAllocationUnit == null) {
+ return;
+ }
+ long memory = parseLong(memStr, 0);
+ if (memory == 0) {
+ return;
+ }
+ vm.setMemory(String.valueOf(memory * memoryAllocationUnit.getBytesMultiplier()));
+ }
+
private static void updateFromXmlCloudStackMetadataSection(Vm vm, Node metadataSection, XPath xpath) {
if (metadataSection == null) {
return;
diff --git a/plugins/integrations/veeam-control-service/src/test/java/org/apache/cloudstack/veeam/api/dto/OvfXmlUtilTest.java b/plugins/integrations/veeam-control-service/src/test/java/org/apache/cloudstack/veeam/api/dto/OvfXmlUtilTest.java
index d00ea565266..c4b6c3ba3ed 100644
--- a/plugins/integrations/veeam-control-service/src/test/java/org/apache/cloudstack/veeam/api/dto/OvfXmlUtilTest.java
+++ b/plugins/integrations/veeam-control-service/src/test/java/org/apache/cloudstack/veeam/api/dto/OvfXmlUtilTest.java
@@ -37,7 +37,7 @@ public class OvfXmlUtilTest {
Vm vm = new Vm();
OvfXmlUtil.updateFromXml(vm, configuration);
- assertEquals(String.valueOf(512L), vm.getMemory());
+ assertEquals(String.valueOf(512 * OvfXmlUtil.MemoryAllocationUnit.Megabytes.getBytesMultiplier()), vm.getMemory());
assertEquals("1", vm.getCpu().getTopology().getSockets());
assertEquals("1", vm.getCpu().getTopology().getCores());
assertEquals("1", vm.getCpu().getTopology().getThreads());