From 34b80e7949b06d91e54d4e7df35edeec8b223c96 Mon Sep 17 00:00:00 2001 From: Wei Zhou Date: Tue, 14 Jul 2026 16:15:48 +0200 Subject: [PATCH 1/2] server: fix clone network offerings with detail internetProtocol=IPv4 --- .../api/command/admin/network/NetworkOfferingBaseCmd.java | 5 +++-- .../com/cloud/configuration/ConfigurationManagerImpl.java | 7 +++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/network/NetworkOfferingBaseCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/network/NetworkOfferingBaseCmd.java index 1c832b7217ef..9b42be137314 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/network/NetworkOfferingBaseCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/network/NetworkOfferingBaseCmd.java @@ -216,6 +216,8 @@ public abstract class NetworkOfferingBaseCmd extends BaseCmd { description = "the routing mode for the network offering. Supported types are: Static or Dynamic.") private String routingMode; + private Map sourceDetailsMap; + ///////////////////////////////////////////////////// /////////////////// Accessors /////////////////////// ///////////////////////////////////////////////////// @@ -430,9 +432,8 @@ public Map getServiceCapabilities(Network.Service se public Map getDetails() { if (details == null || details.isEmpty()) { - return null; + return sourceDetailsMap; } - Collection paramsCollection = details.values(); Object objlist[] = paramsCollection.toArray(); Map params = (Map) (objlist[0]); diff --git a/server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java b/server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java index 164193beeda0..b1a19c634894 100644 --- a/server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java +++ b/server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java @@ -8486,8 +8486,11 @@ private void applySourceOfferingValuesToCloneCmd(CloneNetworkOfferingCmd cmd, private Map getSourceOfferingDetails(Long sourceOfferingId) { List sourceDetailsVOs = networkOfferingDetailsDao.listDetails(sourceOfferingId); Map sourceDetailsMap = new HashMap<>(); + List ignoredSourceDetails = Arrays.asList(Detail.internetProtocol.name(), Detail.domainid.name(), Detail.zoneid.name()); for (NetworkOfferingDetailsVO detailVO : sourceDetailsVOs) { - sourceDetailsMap.put(detailVO.getName(), detailVO.getValue()); + if (!ignoredSourceDetails.contains(detailVO.getName())) { + sourceDetailsMap.put(detailVO.getName(), detailVO.getValue()); + } } return sourceDetailsMap; } @@ -8635,7 +8638,7 @@ private void applyResolvedValuesToCommand(CloneNetworkOfferingCmd cmd, NetworkOf if (cmd.getDetails() == null || cmd.getDetails().isEmpty()) { if (!sourceDetailsMap.isEmpty()) { - setField(cmd, "details", sourceDetailsMap); + setField(cmd, "sourceDetailsMap", sourceDetailsMap); } } From 297185e87560f5bab1312735ebd37b0d9908c010 Mon Sep 17 00:00:00 2001 From: Wei Zhou Date: Tue, 14 Jul 2026 16:43:49 +0200 Subject: [PATCH 2/2] use HashSet instead of List Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- .../java/com/cloud/configuration/ConfigurationManagerImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java b/server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java index b1a19c634894..837254ed8b36 100644 --- a/server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java +++ b/server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java @@ -8486,7 +8486,7 @@ private void applySourceOfferingValuesToCloneCmd(CloneNetworkOfferingCmd cmd, private Map getSourceOfferingDetails(Long sourceOfferingId) { List sourceDetailsVOs = networkOfferingDetailsDao.listDetails(sourceOfferingId); Map sourceDetailsMap = new HashMap<>(); - List ignoredSourceDetails = Arrays.asList(Detail.internetProtocol.name(), Detail.domainid.name(), Detail.zoneid.name()); + Set ignoredSourceDetails = new HashSet<>(Arrays.asList(Detail.internetProtocol.name(), Detail.domainid.name(), Detail.zoneid.name())); for (NetworkOfferingDetailsVO detailVO : sourceDetailsVOs) { if (!ignoredSourceDetails.contains(detailVO.getName())) { sourceDetailsMap.put(detailVO.getName(), detailVO.getValue());