Skip to content

Commit 53cbc87

Browse files
committed
Use userdata uuid instead of user data in global settings
1 parent d7b2b62 commit 53cbc87

File tree

12 files changed

+117
-30
lines changed

12 files changed

+117
-30
lines changed

api/src/main/java/org/apache/cloudstack/userdata/UserDataManager.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
// under the License.
1717
package org.apache.cloudstack.userdata;
1818

19+
import com.cloud.template.VirtualMachineTemplate;
1920
import org.apache.cloudstack.api.BaseCmd;
2021
import org.apache.cloudstack.framework.config.ConfigKey;
2122
import org.apache.cloudstack.framework.config.Configurable;
@@ -29,4 +30,5 @@ public interface UserDataManager extends Manager, Configurable {
2930

3031
String concatenateUserData(String userdata1, String userdata2, String userdataProvider);
3132
String validateUserData(String userData, BaseCmd.HTTPMethod httpmethod);
33+
Long validateAndGetUserDataIdForSystemVms(String userDataUuid, VirtualMachineTemplate vmTemplate);
3234
}

engine/userdata/src/main/java/org/apache/cloudstack/userdata/UserDataManagerImpl.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,11 @@
2222
import java.util.List;
2323
import java.util.Map;
2424

25+
import com.cloud.domain.Domain;
26+
import com.cloud.template.VirtualMachineTemplate;
27+
import com.cloud.user.User;
28+
import com.cloud.user.UserDataVO;
29+
import com.cloud.user.dao.UserDataDao;
2530
import org.apache.cloudstack.api.BaseCmd;
2631
import org.apache.cloudstack.framework.config.ConfigKey;
2732
import org.apache.commons.codec.binary.Base64;
@@ -31,7 +36,12 @@
3136
import com.cloud.utils.component.ManagerBase;
3237
import com.cloud.utils.exception.CloudRuntimeException;
3338

39+
import javax.inject.Inject;
40+
3441
public class UserDataManagerImpl extends ManagerBase implements UserDataManager {
42+
@Inject
43+
UserDataDao userDataDao;
44+
3545
private static final int MAX_USER_DATA_LENGTH_BYTES = 2048;
3646
private static final int MAX_HTTP_GET_LENGTH = 2 * MAX_USER_DATA_LENGTH_BYTES; // 4KB
3747
private static final int NUM_OF_2K_BLOCKS = 512;
@@ -118,6 +128,21 @@ public String validateUserData(String userData, BaseCmd.HTTPMethod httpmethod) {
118128
return Base64.encodeBase64String(decodedUserData);
119129
}
120130

131+
@Override
132+
public Long validateAndGetUserDataIdForSystemVms(String userDataUuid, VirtualMachineTemplate vmTemplate) {
133+
UserDataVO templateUserDataVo = vmTemplate.getUserDataId() != null ? userDataDao.findById(vmTemplate.getUserDataId()): null;
134+
UserDataVO userDataVo = StringUtils.isNotBlank(userDataUuid) ? userDataDao.findByUuid(userDataUuid) : null;
135+
if (isUserDataAllowedForSystemVm(templateUserDataVo) &&
136+
isUserDataAllowedForSystemVm(userDataVo)) {
137+
return userDataVo != null ? userDataVo.getId() : null;
138+
}
139+
throw new CloudRuntimeException("User data can only be used by system VMs if it belongs to the ROOT domain and ADMIN account.");
140+
}
141+
142+
private boolean isUserDataAllowedForSystemVm(UserDataVO userData) {
143+
return userData == null || (userData.getDomainId() == Domain.ROOT_DOMAIN && userData.getAccountId() == User.UID_ADMIN);
144+
}
145+
121146
private byte[] validateAndDecodeByHTTPMethod(String userData, int maxHTTPLength, BaseCmd.HTTPMethod httpMethod) {
122147
byte[] decodedUserData = Base64.decodeBase64(userData.getBytes());
123148
if (decodedUserData == null || decodedUserData.length < 1) {

framework/config/src/main/java/org/apache/cloudstack/framework/config/ConfigKey.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@ public class ConfigKey<T> {
4141
public static final String CATEGORY_ADVANCED = "Advanced";
4242
public static final String CATEGORY_ALERT = "Alert";
4343
public static final String CATEGORY_NETWORK = "Network";
44-
public static final String CATEGORY_SECURE = "Secure";
4544
public static final String CATEGORY_SYSTEM = "System";
4645

4746
// Configuration Groups to be used to define group for a config key

plugins/network-elements/elastic-loadbalancer/src/main/java/com/cloud/network/lb/ElasticLoadBalancerManagerImpl.java

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,13 @@
3131
import javax.inject.Inject;
3232
import javax.naming.ConfigurationException;
3333

34+
import com.cloud.vm.UserVmManager;
3435
import org.apache.cloudstack.api.command.user.loadbalancer.CreateLoadBalancerRuleCmd;
3536
import org.apache.cloudstack.config.ApiServiceConfiguration;
3637
import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService;
3738
import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
3839
import org.apache.cloudstack.managed.context.ManagedContextRunnable;
40+
import org.apache.cloudstack.userdata.UserDataManager;
3941
import org.apache.commons.lang3.StringUtils;
4042
import org.springframework.stereotype.Component;
4143

@@ -141,6 +143,10 @@ public class ElasticLoadBalancerManagerImpl extends ManagerBase implements Elast
141143
private ElasticLbVmMapDao _elbVmMapDao;
142144
@Inject
143145
private NicDao _nicDao;
146+
@Inject
147+
private UserDataManager userDataManager;
148+
@Inject
149+
private UserVmManager userVmManager;
144150

145151
String _instance;
146152

@@ -484,10 +490,16 @@ public boolean finalizeVirtualMachineProfile(VirtualMachineProfile profile, Depl
484490
buf.append(" authorized_key=").append(VirtualMachineGuru.getEncodedMsPublicKey(msPublicKey));
485491

486492
if (SystemVmEnableUserData.valueIn(dc.getId())) {
487-
String userData = RouterUserData.valueIn(dc.getId());
488-
if (StringUtils.isNotBlank(userData)) {
489-
String encodedUserData = Base64.getEncoder().encodeToString(userData.getBytes());
490-
buf.append(" userdata=").append(encodedUserData);
493+
String userDataUuid = RouterUserData.valueIn(dc.getId());
494+
try {
495+
Long userDataId = userDataManager.validateAndGetUserDataIdForSystemVms(userDataUuid, profile.getTemplate());
496+
String userData = userVmManager.finalizeUserData(null, userDataId, profile.getTemplate());
497+
if (StringUtils.isNotBlank(userData)) {
498+
String encodedUserData = Base64.getEncoder().encodeToString(userData.getBytes());
499+
buf.append(" userdata=").append(encodedUserData);
500+
}
501+
} catch (Exception e) {
502+
logger.warn("Failed to load user data for the elastic lb vm, ignored", e);
491503
}
492504
}
493505

plugins/network-elements/internal-loadbalancer/src/main/java/org/apache/cloudstack/network/lb/InternalLoadBalancerVMManagerImpl.java

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,13 @@
3737

3838
import com.cloud.event.ActionEvent;
3939
import com.cloud.event.EventTypes;
40+
import com.cloud.vm.UserVmManager;
4041
import org.apache.cloudstack.context.CallContext;
4142
import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService;
4243
import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
4344
import org.apache.cloudstack.lb.ApplicationLoadBalancerRuleVO;
4445
import org.apache.cloudstack.lb.dao.ApplicationLoadBalancerRuleDao;
46+
import org.apache.cloudstack.userdata.UserDataManager;
4547
import org.apache.commons.collections.CollectionUtils;
4648

4749
import com.cloud.agent.AgentManager;
@@ -179,6 +181,10 @@ public class InternalLoadBalancerVMManagerImpl extends ManagerBase implements In
179181
ResourceManager _resourceMgr;
180182
@Inject
181183
UserDao _userDao;
184+
@Inject
185+
private UserDataManager userDataManager;
186+
@Inject
187+
private UserVmManager userVmManager;
182188

183189
@Override
184190
public boolean finalizeVirtualMachineProfile(final VirtualMachineProfile profile, final DeployDestination dest, final ReservationContext context) {
@@ -249,10 +255,16 @@ public boolean finalizeVirtualMachineProfile(final VirtualMachineProfile profile
249255

250256
long dcId = profile.getVirtualMachine().getDataCenterId();
251257
if (SystemVmEnableUserData.valueIn(dcId)) {
252-
String userData = RouterUserData.valueIn(dcId);
253-
if (StringUtils.isNotBlank(userData)) {
254-
String encodedUserData = Base64.getEncoder().encodeToString(userData.getBytes());
255-
buf.append(" userdata=").append(encodedUserData);
258+
String userDataUuid = RouterUserData.valueIn(dcId);
259+
try {
260+
Long userDataId = userDataManager.validateAndGetUserDataIdForSystemVms(userDataUuid, profile.getTemplate());
261+
String userData = userVmManager.finalizeUserData(null, userDataId, profile.getTemplate());
262+
if (StringUtils.isNotBlank(userData)) {
263+
String encodedUserData = Base64.getEncoder().encodeToString(userData.getBytes());
264+
buf.append(" userdata=").append(encodedUserData);
265+
}
266+
} catch (Exception e) {
267+
logger.warn("Failed to load user data for the internal lb vm, ignored", e);
256268
}
257269
}
258270

server/src/main/java/com/cloud/consoleproxy/ConsoleProxyManager.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,8 +94,8 @@ public interface ConsoleProxyManager extends Manager, ConsoleProxyService {
9494
"last console proxy service management state", false, ConfigKey.Kind.Select, consoleProxyManagementStates);
9595

9696
ConfigKey<String> ConsoleProxyUserData = new ConfigKey<>(String.class, "consoleproxy.userdata",
97-
ConfigKey.CATEGORY_SECURE, "",
98-
"Default user data for console proxy VMs. This works only when systemvm.userdata.enabled is set to true",
97+
ConfigKey.CATEGORY_ADVANCED, "",
98+
"UUID for user data for console proxy VMs. This works only when systemvm.userdata.enabled is set to true",
9999
true, ConfigKey.Scope.Zone, null, "User Data for CPVMs",
100100
null, ConfigKey.GROUP_SYSTEM_VMS, ConfigKey.SUBGROUP_CONSOLE_PROXY_VM);
101101

server/src/main/java/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import javax.inject.Inject;
3434
import javax.naming.ConfigurationException;
3535

36+
import com.cloud.vm.UserVmManager;
3637
import org.apache.cloudstack.agent.lb.IndirectAgentLB;
3738
import org.apache.cloudstack.ca.CAManager;
3839
import org.apache.cloudstack.consoleproxy.ConsoleAccessManager;
@@ -49,6 +50,7 @@
4950
import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
5051
import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
5152
import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreDao;
53+
import org.apache.cloudstack.userdata.UserDataManager;
5254
import org.apache.commons.collections.CollectionUtils;
5355
import org.apache.commons.lang3.BooleanUtils;
5456

@@ -230,6 +232,10 @@ public class ConsoleProxyManagerImpl extends ManagerBase implements ConsoleProxy
230232
private CAManager caManager;
231233
@Inject
232234
private NetworkOrchestrationService networkMgr;
235+
@Inject
236+
private UserDataManager userDataManager;
237+
@Inject
238+
private UserVmManager userVmManager;
233239

234240
private ConsoleProxyListener consoleProxyListener;
235241

@@ -1270,10 +1276,16 @@ public boolean finalizeVirtualMachineProfile(VirtualMachineProfile profile, Depl
12701276
buf.append(" keystore_password=").append(VirtualMachineGuru.getEncodedString(PasswordGenerator.generateRandomPassword(16)));
12711277

12721278
if (SystemVmEnableUserData.valueIn(dc.getId())) {
1273-
String userData = ConsoleProxyUserData.valueIn(dc.getId());
1274-
if (StringUtils.isNotBlank(userData)) {
1275-
String encodedUserData = Base64.getEncoder().encodeToString(userData.getBytes());
1276-
buf.append(" userdata=").append(encodedUserData);
1279+
String userDataUuid = ConsoleProxyUserData.valueIn(dc.getId());
1280+
try {
1281+
Long userDataId = userDataManager.validateAndGetUserDataIdForSystemVms(userDataUuid, profile.getTemplate());
1282+
String userData = userVmManager.finalizeUserData(null, userDataId, profile.getTemplate());
1283+
if (org.apache.commons.lang3.StringUtils.isNotBlank(userData)) {
1284+
String encodedUserData = Base64.getEncoder().encodeToString(userData.getBytes());
1285+
buf.append(" userdata=").append(encodedUserData);
1286+
}
1287+
} catch (Exception e) {
1288+
logger.warn("Failed to load user data for the cpvm, ignored", e);
12771289
}
12781290
}
12791291

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,8 @@ public interface VirtualNetworkApplianceManager extends Manager, VirtualNetworkA
6565
"Name of the default router template on Ovm3.", true, ConfigKey.Scope.Zone, null);
6666

6767
ConfigKey<String> RouterUserData = new ConfigKey<>(String.class, "router.userdata",
68-
ConfigKey.CATEGORY_SECURE, "",
69-
"Default user data for VR, VPC VR, internal LB, and elastic LB. This works only when systemvm.userdata.enabled is set to true",
68+
ConfigKey.CATEGORY_ADVANCED, "",
69+
"UUID for user data of VR, VPC VR, internal LB, and elastic LB. This works only when systemvm.userdata.enabled is set to true",
7070
true, ConfigKey.Scope.Zone, null, "User Data for VRs",
7171
null, ConfigKey.GROUP_SYSTEM_VMS, ConfigKey.SUBGROUP_VIRTUAL_ROUTER);
7272

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

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
import javax.inject.Inject;
5050
import javax.naming.ConfigurationException;
5151

52+
import com.cloud.vm.UserVmManager;
5253
import com.google.gson.JsonSyntaxException;
5354
import com.google.gson.reflect.TypeToken;
5455

@@ -73,6 +74,7 @@
7374
import org.apache.cloudstack.network.RoutedIpv4Manager;
7475
import org.apache.cloudstack.network.topology.NetworkTopology;
7576
import org.apache.cloudstack.network.topology.NetworkTopologyContext;
77+
import org.apache.cloudstack.userdata.UserDataManager;
7678
import org.apache.cloudstack.utils.CloudStackVersion;
7779
import org.apache.cloudstack.utils.identity.ManagementServerNode;
7880
import org.apache.cloudstack.utils.usage.UsageUtils;
@@ -354,6 +356,11 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V
354356
@Inject
355357
BGPService bgpService;
356358

359+
@Inject
360+
private UserDataManager userDataManager;
361+
@Inject
362+
private UserVmManager userVmManager;
363+
357364
private int _routerStatsInterval = 300;
358365
private int _routerCheckInterval = 30;
359366
private int _rvrStatusUpdatePoolSize = 10;
@@ -2099,10 +2106,17 @@ public boolean finalizeVirtualMachineProfile(final VirtualMachineProfile profile
20992106
buf.append(String.format(" logrotatefrequency=%s", routerLogrotateFrequency));
21002107

21012108
if (SystemVmEnableUserData.valueIn(router.getDataCenterId())) {
2102-
String userData = RouterUserData.valueIn(router.getDataCenterId());
2103-
if (StringUtils.isNotBlank(userData)) {
2104-
String encodedUserData = Base64.getEncoder().encodeToString(userData.getBytes());
2105-
buf.append(" userdata=").append(encodedUserData);
2109+
String userDataUuid = RouterUserData.valueIn(dc.getId());
2110+
try {
2111+
Long userDataId = userDataManager.validateAndGetUserDataIdForSystemVms(userDataUuid,
2112+
profile.getTemplate());
2113+
String userData = userVmManager.finalizeUserData(null, userDataId, profile.getTemplate());
2114+
if (StringUtils.isNotBlank(userData)) {
2115+
String encodedUserData = Base64.getEncoder().encodeToString(userData.getBytes());
2116+
buf.append(" userdata=").append(encodedUserData);
2117+
}
2118+
} catch (Exception e) {
2119+
logger.warn("Failed to load user data for the virtual router, ignored", e);
21062120
}
21072121
}
21082122

server/src/main/java/com/cloud/storage/secondary/SecondaryStorageVmManager.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,8 @@ public interface SecondaryStorageVmManager extends Manager {
4545
false);
4646

4747
ConfigKey<String> SecondaryStorageUserData = new ConfigKey<>(String.class, "secstorage.userdata",
48-
ConfigKey.CATEGORY_SECURE, "",
49-
"Default user data for secondary storage VMs. This works only when systemvm.userdata.enabled is set to true",
48+
ConfigKey.CATEGORY_ADVANCED, "",
49+
"UUID for user data for secondary storage VMs. This works only when systemvm.userdata.enabled is set to true",
5050
true, ConfigKey.Scope.Zone, null, "User Data for SSVMs",
5151
null, ConfigKey.GROUP_SYSTEM_VMS, ConfigKey.SUBGROUP_SEC_STORAGE_VM);
5252

0 commit comments

Comments
 (0)