diff --git a/server/src/main/java/com/cloud/network/NetworkModelImpl.java b/server/src/main/java/com/cloud/network/NetworkModelImpl.java index ccc437e8907..935f22a0f2d 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; @@ -58,6 +56,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; @@ -116,6 +115,7 @@ import com.cloud.user.AccountVO; import com.cloud.user.DomainManager; import com.cloud.user.User; import com.cloud.user.dao.AccountDao; +import com.cloud.utils.Pair; import com.cloud.utils.StringUtils; import com.cloud.utils.component.AdapterBase; import com.cloud.utils.component.ManagerBase; @@ -134,6 +134,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; @@ -2524,10 +2525,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 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 39e2d9b008f..3ab0bb52ac5 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 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 d15263f70aa..501ac8104a8 100644 --- a/server/src/main/java/com/cloud/network/router/CommandSetupHelper.java +++ b/server/src/main/java/com/cloud/network/router/CommandSetupHelper.java @@ -26,14 +26,6 @@ import java.util.Map; import javax.inject.Inject; -import com.cloud.configuration.ConfigurationManager; -import com.cloud.domain.Domain; -import com.cloud.domain.dao.DomainDao; -import com.cloud.hypervisor.Hypervisor; -import com.cloud.network.dao.NetworkDetailVO; -import com.cloud.network.dao.NetworkDetailsDao; -import com.cloud.offerings.dao.NetworkOfferingDetailsDao; -import com.cloud.vm.VmDetailConstants; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService; import org.apache.cloudstack.framework.config.dao.ConfigurationDao; @@ -73,13 +65,17 @@ import com.cloud.agent.api.to.PortForwardingRuleTO; import com.cloud.agent.api.to.StaticNatRuleTO; import com.cloud.agent.manager.Commands; import com.cloud.configuration.Config; +import com.cloud.configuration.ConfigurationManager; import com.cloud.dc.DataCenter; 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; import com.cloud.network.IpAddress; import com.cloud.network.Network; import com.cloud.network.Network.Provider; @@ -94,9 +90,11 @@ import com.cloud.network.VpnUser; import com.cloud.network.VpnUserVO; import com.cloud.network.dao.FirewallRulesDao; import com.cloud.network.dao.IPAddressDao; -import com.cloud.network.dao.NetworkDao; -import com.cloud.network.dao.NetworkVO; import com.cloud.network.dao.IPAddressVO; +import com.cloud.network.dao.NetworkDao; +import com.cloud.network.dao.NetworkDetailVO; +import com.cloud.network.dao.NetworkDetailsDao; +import com.cloud.network.dao.NetworkVO; import com.cloud.network.dao.Site2SiteCustomerGatewayDao; import com.cloud.network.dao.Site2SiteCustomerGatewayVO; import com.cloud.network.dao.Site2SiteVpnGatewayDao; @@ -120,6 +118,7 @@ import com.cloud.network.vpc.dao.VpcDao; import com.cloud.offering.NetworkOffering; import com.cloud.offerings.NetworkOfferingVO; import com.cloud.offerings.dao.NetworkOfferingDao; +import com.cloud.offerings.dao.NetworkOfferingDetailsDao; import com.cloud.service.dao.ServiceOfferingDao; import com.cloud.user.Account; import com.cloud.uservm.UserVm; @@ -136,6 +135,7 @@ import com.cloud.vm.UserVmVO; import com.cloud.vm.VirtualMachine; import com.cloud.vm.VirtualMachineManager; import com.cloud.vm.VirtualMachineProfile; +import com.cloud.vm.VmDetailConstants; import com.cloud.vm.dao.DomainRouterDao; import com.cloud.vm.dao.NicDao; import com.cloud.vm.dao.NicIpAliasDao; @@ -1135,10 +1135,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 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 e858bee74a0..e1bd9b687d6 100644 --- a/utils/src/main/java/com/cloud/utils/StringUtils.java +++ b/utils/src/main/java/com/cloud/utils/StringUtils.java @@ -313,4 +313,11 @@ public class StringUtils { public static String toCSVList(final List csvList) { return join(csvList, ","); } + + public static Pair 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 09a6c71bcf8..cae5b2eec8b 100644 --- a/utils/src/test/java/com/cloud/utils/StringUtilsTest.java +++ b/utils/src/test/java/com/cloud/utils/StringUtilsTest.java @@ -258,4 +258,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 output = StringUtils.getKeyValuePairWithSeparator(kp, "="); + assertEquals(key, output.first()); + assertEquals(value, output.second()); + } }