From 83490a9bdb2e043a6bb590cd888918d0007e1ec8 Mon Sep 17 00:00:00 2001 From: Abhishek Kumar Date: Tue, 5 May 2026 17:22:53 +0530 Subject: [PATCH] fix parsing ovf memory Signed-off-by: Abhishek Kumar --- .../cloudstack/veeam/api/dto/OvfXmlUtil.java | 55 +++++++++++++++++-- .../veeam/api/dto/OvfXmlUtilTest.java | 2 +- 2 files changed, 52 insertions(+), 5 deletions(-) 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());