Skip to content

Commit 30998d0

Browse files
authored
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.mrt22@gmail.com>
1 parent c35d7ac commit 30998d0

File tree

5 files changed

+33
-18
lines changed

5 files changed

+33
-18
lines changed

server/src/main/java/com/cloud/network/NetworkModelImpl.java

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,6 @@
3434
import javax.inject.Inject;
3535
import javax.naming.ConfigurationException;
3636

37-
import com.cloud.domain.Domain;
38-
import com.cloud.vm.VirtualMachineManager;
3937
import org.apache.cloudstack.acl.ControlledEntity.ACLType;
4038
import org.apache.cloudstack.context.CallContext;
4139
import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService;
@@ -60,6 +58,7 @@
6058
import com.cloud.dc.dao.DataCenterDao;
6159
import com.cloud.dc.dao.PodVlanMapDao;
6260
import com.cloud.dc.dao.VlanDao;
61+
import com.cloud.domain.Domain;
6362
import com.cloud.domain.DomainVO;
6463
import com.cloud.domain.dao.DomainDao;
6564
import com.cloud.exception.InsufficientAddressCapacityException;
@@ -142,6 +141,7 @@
142141
import com.cloud.vm.VMInstanceVO;
143142
import com.cloud.vm.VirtualMachine;
144143
import com.cloud.vm.VirtualMachine.Type;
144+
import com.cloud.vm.VirtualMachineManager;
145145
import com.cloud.vm.dao.NicDao;
146146
import com.cloud.vm.dao.NicSecondaryIpDao;
147147
import com.cloud.vm.dao.VMInstanceDao;
@@ -2674,10 +2674,8 @@ protected void addUserDataDetailsToCommand(List<String[]> vmData, String userDat
26742674
String[] keyValuePairs = userDataDetails.split(",");
26752675
for(String pair : keyValuePairs)
26762676
{
2677-
String[] entry = pair.split("=");
2678-
String key = entry[0].trim();
2679-
String value = entry[1].trim();
2680-
vmData.add(new String[]{METATDATA_DIR, key, StringUtils.unicodeEscape(value)});
2677+
final Pair<String, String> keyValue = StringUtils.getKeyValuePairWithSeparator(pair, "=");
2678+
vmData.add(new String[]{METATDATA_DIR, keyValue.first(), StringUtils.unicodeEscape(keyValue.second())});
26812679
}
26822680
}
26832681
}

server/src/main/java/com/cloud/network/element/ConfigDriveNetworkElement.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323

2424
import javax.inject.Inject;
2525

26-
import com.cloud.host.HostVO;
2726
import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
2827
import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
2928
import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint;
@@ -49,6 +48,7 @@
4948
import com.cloud.exception.InsufficientCapacityException;
5049
import com.cloud.exception.ResourceUnavailableException;
5150
import com.cloud.exception.UnsupportedServiceException;
51+
import com.cloud.host.HostVO;
5252
import com.cloud.host.dao.HostDao;
5353
import com.cloud.hypervisor.HypervisorGuruManager;
5454
import com.cloud.network.Network;
@@ -69,6 +69,8 @@
6969
import com.cloud.storage.dao.GuestOSCategoryDao;
7070
import com.cloud.storage.dao.GuestOSDao;
7171
import com.cloud.storage.dao.VolumeDao;
72+
import com.cloud.utils.Pair;
73+
import com.cloud.utils.StringUtils;
7274
import com.cloud.utils.component.AdapterBase;
7375
import com.cloud.utils.crypt.DBEncryptionUtil;
7476
import com.cloud.utils.db.EntityManager;
@@ -624,8 +626,8 @@ private Map<String, String> getVMCustomUserdataParamMap(long vmId) {
624626
String[] keyValuePairs = userDataDetails.split(",");
625627
for(String pair : keyValuePairs)
626628
{
627-
String[] entry = pair.split("=");
628-
customUserdataParamMap.put(entry[0].trim(), entry[1].trim());
629+
final Pair<String, String> keyValue = StringUtils.getKeyValuePairWithSeparator(pair, "=");
630+
customUserdataParamMap.put(keyValue.first(), keyValue.second());
629631
}
630632
}
631633

server/src/main/java/com/cloud/network/router/CommandSetupHelper.java

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,6 @@
2727

2828
import javax.inject.Inject;
2929

30-
import com.cloud.agent.api.routing.UpdateNetworkCommand;
31-
import com.cloud.network.dao.VirtualRouterProviderDao;
32-
import com.cloud.network.vpc.VpcVO;
33-
import com.cloud.domain.Domain;
34-
import com.cloud.domain.dao.DomainDao;
3530
import org.apache.cloudstack.api.ApiConstants;
3631
import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService;
3732
import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
@@ -60,6 +55,7 @@
6055
import com.cloud.agent.api.routing.SetStaticNatRulesCommand;
6156
import com.cloud.agent.api.routing.SetStaticRouteCommand;
6257
import com.cloud.agent.api.routing.Site2SiteVpnCfgCommand;
58+
import com.cloud.agent.api.routing.UpdateNetworkCommand;
6359
import com.cloud.agent.api.routing.VmDataCommand;
6460
import com.cloud.agent.api.routing.VpnUsersCfgCommand;
6561
import com.cloud.agent.api.to.DhcpTO;
@@ -78,6 +74,8 @@
7874
import com.cloud.dc.DataCenterVO;
7975
import com.cloud.dc.dao.DataCenterDao;
8076
import com.cloud.dc.dao.VlanDao;
77+
import com.cloud.domain.Domain;
78+
import com.cloud.domain.dao.DomainDao;
8179
import com.cloud.host.Host;
8280
import com.cloud.host.dao.HostDao;
8381
import com.cloud.hypervisor.Hypervisor;
@@ -105,6 +103,7 @@
105103
import com.cloud.network.dao.Site2SiteCustomerGatewayVO;
106104
import com.cloud.network.dao.Site2SiteVpnGatewayDao;
107105
import com.cloud.network.dao.Site2SiteVpnGatewayVO;
106+
import com.cloud.network.dao.VirtualRouterProviderDao;
108107
import com.cloud.network.dao.VpnUserDao;
109108
import com.cloud.network.lb.LoadBalancingRule;
110109
import com.cloud.network.lb.LoadBalancingRule.LbDestination;
@@ -120,6 +119,7 @@
120119
import com.cloud.network.vpc.StaticRouteProfile;
121120
import com.cloud.network.vpc.Vpc;
122121
import com.cloud.network.vpc.VpcGateway;
122+
import com.cloud.network.vpc.VpcVO;
123123
import com.cloud.network.vpc.dao.VpcDao;
124124
import com.cloud.offering.NetworkOffering;
125125
import com.cloud.offerings.NetworkOfferingVO;
@@ -1269,10 +1269,8 @@ protected void addUserDataDetailsToCommand(VmDataCommand cmd, String userDataDet
12691269
String[] keyValuePairs = userDataDetails.split(",");
12701270
for(String pair : keyValuePairs)
12711271
{
1272-
String[] entry = pair.split("=");
1273-
String key = entry[0].trim();
1274-
String value = entry[1].trim();
1275-
cmd.addVmData("metadata", key, value);
1272+
final Pair<String, String> keyValue = StringUtils.getKeyValuePairWithSeparator(pair, "=");
1273+
cmd.addVmData("metadata", keyValue.first(), keyValue.second());
12761274
}
12771275
}
12781276
}

utils/src/main/java/com/cloud/utils/StringUtils.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -275,4 +275,11 @@ private static <T> List<List<T>> partitionList(final List<T> originalList, final
275275
public static String toCSVList(final List<String> csvList) {
276276
return org.apache.commons.lang3.StringUtils.defaultString(org.apache.commons.lang3.StringUtils.join(csvList, ","));
277277
}
278+
279+
public static Pair<String, String> getKeyValuePairWithSeparator(String keyValuePair, String separator) {
280+
final int index = keyValuePair.indexOf(separator);
281+
final String key = keyValuePair.substring(0, index);
282+
final String value = keyValuePair.substring(index + 1);
283+
return new Pair<>(key.trim(), value.trim());
284+
}
278285
}

utils/src/test/java/com/cloud/utils/StringUtilsTest.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -252,4 +252,14 @@ public void testToCSVList() {
252252
String output = StringUtils.toCSVList(Arrays.asList(input.split(",")));
253253
assertTrue(input.equals(output));
254254
}
255+
256+
@Test
257+
public void testGetKeyValuePairWithSeparator() {
258+
String key = "ssh";
259+
String value = "ABCD==";
260+
String kp = String.format("%s=%s", key, value);
261+
Pair<String, String> output = StringUtils.getKeyValuePairWithSeparator(kp, "=");
262+
assertEquals(key, output.first());
263+
assertEquals(value, output.second());
264+
}
255265
}

0 commit comments

Comments
 (0)