This is an automated email from the ASF dual-hosted git repository. rohit pushed a commit to branch 4.18 in repository https://gitbox.apache.org/repos/asf/cloudstack.git
The following commit(s) were added to refs/heads/4.18 by this push: new 30998d0ab7e server: fix userdatadetails parsing (#7328) 30998d0ab7e is described below commit 30998d0ab7e9c090a4b20780e03ad8b0a1012863 Author: Abhishek Kumar <abhishek.mr...@gmail.com> AuthorDate: Tue Apr 4 17:01:04 2023 +0530 server: fix userdatadetails parsing (#7328) Fixes the case when userdata variable value contains '=' sign. This PR considers everything before occurrence of first '=' sign as key and remaining string as value. Signed-off-by: Abhishek Kumar <abhishek.mr...@gmail.com> --- .../main/java/com/cloud/network/NetworkModelImpl.java | 10 ++++------ .../cloud/network/element/ConfigDriveNetworkElement.java | 8 +++++--- .../com/cloud/network/router/CommandSetupHelper.java | 16 +++++++--------- utils/src/main/java/com/cloud/utils/StringUtils.java | 7 +++++++ utils/src/test/java/com/cloud/utils/StringUtilsTest.java | 10 ++++++++++ 5 files changed, 33 insertions(+), 18 deletions(-) diff --git a/server/src/main/java/com/cloud/network/NetworkModelImpl.java b/server/src/main/java/com/cloud/network/NetworkModelImpl.java index cd3b2b7671e..5776d4e1628 100644 --- a/server/src/main/java/com/cloud/network/NetworkModelImpl.java +++ b/server/src/main/java/com/cloud/network/NetworkModelImpl.java @@ -34,8 +34,6 @@ import java.util.TreeSet; import javax.inject.Inject; import javax.naming.ConfigurationException; -import com.cloud.domain.Domain; -import com.cloud.vm.VirtualMachineManager; import org.apache.cloudstack.acl.ControlledEntity.ACLType; import org.apache.cloudstack.context.CallContext; import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService; @@ -60,6 +58,7 @@ import com.cloud.dc.VlanVO; import com.cloud.dc.dao.DataCenterDao; import com.cloud.dc.dao.PodVlanMapDao; import com.cloud.dc.dao.VlanDao; +import com.cloud.domain.Domain; import com.cloud.domain.DomainVO; import com.cloud.domain.dao.DomainDao; import com.cloud.exception.InsufficientAddressCapacityException; @@ -142,6 +141,7 @@ import com.cloud.vm.NicVO; import com.cloud.vm.VMInstanceVO; import com.cloud.vm.VirtualMachine; import com.cloud.vm.VirtualMachine.Type; +import com.cloud.vm.VirtualMachineManager; import com.cloud.vm.dao.NicDao; import com.cloud.vm.dao.NicSecondaryIpDao; import com.cloud.vm.dao.VMInstanceDao; @@ -2674,10 +2674,8 @@ public class NetworkModelImpl extends ManagerBase implements NetworkModel, Confi String[] keyValuePairs = userDataDetails.split(","); for(String pair : keyValuePairs) { - String[] entry = pair.split("="); - String key = entry[0].trim(); - String value = entry[1].trim(); - vmData.add(new String[]{METATDATA_DIR, key, StringUtils.unicodeEscape(value)}); + final Pair<String, String> keyValue = StringUtils.getKeyValuePairWithSeparator(pair, "="); + vmData.add(new String[]{METATDATA_DIR, keyValue.first(), StringUtils.unicodeEscape(keyValue.second())}); } } } diff --git a/server/src/main/java/com/cloud/network/element/ConfigDriveNetworkElement.java b/server/src/main/java/com/cloud/network/element/ConfigDriveNetworkElement.java index 7bbf39a6655..be536226034 100644 --- a/server/src/main/java/com/cloud/network/element/ConfigDriveNetworkElement.java +++ b/server/src/main/java/com/cloud/network/element/ConfigDriveNetworkElement.java @@ -23,7 +23,6 @@ import java.util.Set; import javax.inject.Inject; -import com.cloud.host.HostVO; import org.apache.cloudstack.engine.subsystem.api.storage.DataStore; import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager; import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint; @@ -49,6 +48,7 @@ import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.InsufficientCapacityException; import com.cloud.exception.ResourceUnavailableException; import com.cloud.exception.UnsupportedServiceException; +import com.cloud.host.HostVO; import com.cloud.host.dao.HostDao; import com.cloud.hypervisor.HypervisorGuruManager; import com.cloud.network.Network; @@ -69,6 +69,8 @@ import com.cloud.storage.VolumeVO; import com.cloud.storage.dao.GuestOSCategoryDao; import com.cloud.storage.dao.GuestOSDao; import com.cloud.storage.dao.VolumeDao; +import com.cloud.utils.Pair; +import com.cloud.utils.StringUtils; import com.cloud.utils.component.AdapterBase; import com.cloud.utils.crypt.DBEncryptionUtil; import com.cloud.utils.db.EntityManager; @@ -624,8 +626,8 @@ public class ConfigDriveNetworkElement extends AdapterBase implements NetworkEle String[] keyValuePairs = userDataDetails.split(","); for(String pair : keyValuePairs) { - String[] entry = pair.split("="); - customUserdataParamMap.put(entry[0].trim(), entry[1].trim()); + final Pair<String, String> keyValue = StringUtils.getKeyValuePairWithSeparator(pair, "="); + customUserdataParamMap.put(keyValue.first(), keyValue.second()); } } diff --git a/server/src/main/java/com/cloud/network/router/CommandSetupHelper.java b/server/src/main/java/com/cloud/network/router/CommandSetupHelper.java index 75e8230f46a..6bd01998600 100644 --- a/server/src/main/java/com/cloud/network/router/CommandSetupHelper.java +++ b/server/src/main/java/com/cloud/network/router/CommandSetupHelper.java @@ -27,11 +27,6 @@ import java.util.Set; import javax.inject.Inject; -import com.cloud.agent.api.routing.UpdateNetworkCommand; -import com.cloud.network.dao.VirtualRouterProviderDao; -import com.cloud.network.vpc.VpcVO; -import com.cloud.domain.Domain; -import com.cloud.domain.dao.DomainDao; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService; import org.apache.cloudstack.framework.config.dao.ConfigurationDao; @@ -60,6 +55,7 @@ import com.cloud.agent.api.routing.SetSourceNatCommand; import com.cloud.agent.api.routing.SetStaticNatRulesCommand; import com.cloud.agent.api.routing.SetStaticRouteCommand; import com.cloud.agent.api.routing.Site2SiteVpnCfgCommand; +import com.cloud.agent.api.routing.UpdateNetworkCommand; import com.cloud.agent.api.routing.VmDataCommand; import com.cloud.agent.api.routing.VpnUsersCfgCommand; import com.cloud.agent.api.to.DhcpTO; @@ -78,6 +74,8 @@ import com.cloud.dc.DataCenter.NetworkType; import com.cloud.dc.DataCenterVO; import com.cloud.dc.dao.DataCenterDao; import com.cloud.dc.dao.VlanDao; +import com.cloud.domain.Domain; +import com.cloud.domain.dao.DomainDao; import com.cloud.host.Host; import com.cloud.host.dao.HostDao; import com.cloud.hypervisor.Hypervisor; @@ -105,6 +103,7 @@ import com.cloud.network.dao.Site2SiteCustomerGatewayDao; import com.cloud.network.dao.Site2SiteCustomerGatewayVO; import com.cloud.network.dao.Site2SiteVpnGatewayDao; import com.cloud.network.dao.Site2SiteVpnGatewayVO; +import com.cloud.network.dao.VirtualRouterProviderDao; import com.cloud.network.dao.VpnUserDao; import com.cloud.network.lb.LoadBalancingRule; import com.cloud.network.lb.LoadBalancingRule.LbDestination; @@ -120,6 +119,7 @@ import com.cloud.network.vpc.PrivateIpAddress; import com.cloud.network.vpc.StaticRouteProfile; import com.cloud.network.vpc.Vpc; import com.cloud.network.vpc.VpcGateway; +import com.cloud.network.vpc.VpcVO; import com.cloud.network.vpc.dao.VpcDao; import com.cloud.offering.NetworkOffering; import com.cloud.offerings.NetworkOfferingVO; @@ -1269,10 +1269,8 @@ public class CommandSetupHelper { String[] keyValuePairs = userDataDetails.split(","); for(String pair : keyValuePairs) { - String[] entry = pair.split("="); - String key = entry[0].trim(); - String value = entry[1].trim(); - cmd.addVmData("metadata", key, value); + final Pair<String, String> keyValue = StringUtils.getKeyValuePairWithSeparator(pair, "="); + cmd.addVmData("metadata", keyValue.first(), keyValue.second()); } } } diff --git a/utils/src/main/java/com/cloud/utils/StringUtils.java b/utils/src/main/java/com/cloud/utils/StringUtils.java index 817cb696ef4..9e197a8a94b 100644 --- a/utils/src/main/java/com/cloud/utils/StringUtils.java +++ b/utils/src/main/java/com/cloud/utils/StringUtils.java @@ -275,4 +275,11 @@ public class StringUtils { public static String toCSVList(final List<String> csvList) { return org.apache.commons.lang3.StringUtils.defaultString(org.apache.commons.lang3.StringUtils.join(csvList, ",")); } + + public static Pair<String, String> getKeyValuePairWithSeparator(String keyValuePair, String separator) { + final int index = keyValuePair.indexOf(separator); + final String key = keyValuePair.substring(0, index); + final String value = keyValuePair.substring(index + 1); + return new Pair<>(key.trim(), value.trim()); + } } diff --git a/utils/src/test/java/com/cloud/utils/StringUtilsTest.java b/utils/src/test/java/com/cloud/utils/StringUtilsTest.java index 3d8c57b3946..8aab74f1134 100644 --- a/utils/src/test/java/com/cloud/utils/StringUtilsTest.java +++ b/utils/src/test/java/com/cloud/utils/StringUtilsTest.java @@ -252,4 +252,14 @@ public class StringUtilsTest { String output = StringUtils.toCSVList(Arrays.asList(input.split(","))); assertTrue(input.equals(output)); } + + @Test + public void testGetKeyValuePairWithSeparator() { + String key = "ssh"; + String value = "ABCD=="; + String kp = String.format("%s=%s", key, value); + Pair<String, String> output = StringUtils.getKeyValuePairWithSeparator(kp, "="); + assertEquals(key, output.first()); + assertEquals(value, output.second()); + } }