Skip to content

Commit fe10e68

Browse files
author
Paul Angus
authored
Merge pull request #2743 from nuagenetworks/bugfix/marvin_config_drive
CLOUDSTACK-10380: Fix startvm giving another pw after pw reset
2 parents c2f4b36 + cca2505 commit fe10e68

23 files changed

Lines changed: 2241 additions & 2626 deletions

engine/orchestration/src/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1336,7 +1336,7 @@ public boolean canUpdateInSequence(Network network, boolean forced){
13361336

13371337
//check if the there are no service provider other than virtualrouter.
13381338
for(Provider provider : providers) {
1339-
if (provider!=Provider.VirtualRouter)
1339+
if (provider != Provider.VirtualRouter)
13401340
throw new UnsupportedOperationException("Cannot update the network resources in sequence when providers other than virtualrouter are used");
13411341
}
13421342
//check if routers are in correct state before proceeding with the update

engine/schema/src/com/cloud/vm/dao/UserVmDaoImpl.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,11 @@
2929
import javax.annotation.PostConstruct;
3030
import javax.inject.Inject;
3131

32+
import org.apache.log4j.Logger;
33+
3234
import com.cloud.network.Network;
3335
import com.cloud.network.dao.NetworkDao;
3436
import com.cloud.network.dao.NetworkVO;
35-
import org.apache.log4j.Logger;
36-
3737
import com.cloud.server.ResourceTag.ResourceObjectType;
3838
import com.cloud.tags.dao.ResourceTagDao;
3939
import com.cloud.user.Account;
@@ -368,9 +368,13 @@ public void saveDetails(UserVmVO vm) {
368368
if (detailsStr == null) {
369369
return;
370370
}
371+
372+
final Map<String, Boolean> visibilityMap = _detailsDao.listDetailsVisibility(vm.getId());
373+
371374
List<UserVmDetailVO> details = new ArrayList<UserVmDetailVO>();
372-
for (String key : detailsStr.keySet()) {
373-
details.add(new UserVmDetailVO(vm.getId(), key, detailsStr.get(key), true));
375+
for (Map.Entry<String, String> entry : detailsStr.entrySet()) {
376+
boolean display = visibilityMap.getOrDefault(entry.getKey(), true);
377+
details.add(new UserVmDetailVO(vm.getId(), entry.getKey(), entry.getValue(), display));
374378
}
375379

376380
_detailsDao.saveDetails(details);

engine/schema/src/org/apache/cloudstack/resourcedetail/ResourceDetailsDao.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,8 @@ public interface ResourceDetailsDao<R extends ResourceDetail> extends GenericDao
7373

7474
public Map<String, String> listDetailsKeyPairs(long resourceId, boolean forDisplay);
7575

76+
Map<String, Boolean> listDetailsVisibility(long resourceId);
77+
7678
public void saveDetails(List<R> details);
7779

7880
public void addDetail(long resourceId, String key, String value, boolean display);

engine/schema/src/org/apache/cloudstack/resourcedetail/ResourceDetailsDaoBase.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
import com.cloud.utils.db.SearchCriteria;
2828
import com.cloud.utils.db.TransactionLegacy;
2929

30-
public abstract class ResourceDetailsDaoBase<R extends ResourceDetail> extends GenericDaoBase<R, Long> {
30+
public abstract class ResourceDetailsDaoBase<R extends ResourceDetail> extends GenericDaoBase<R, Long> implements ResourceDetailsDao<R> {
3131
private SearchBuilder<R> AllFieldsSearch;
3232

3333
public ResourceDetailsDaoBase() {
@@ -81,6 +81,18 @@ public Map<String, String> listDetailsKeyPairs(long resourceId) {
8181
return details;
8282
}
8383

84+
public Map<String, Boolean> listDetailsVisibility(long resourceId) {
85+
SearchCriteria<R> sc = AllFieldsSearch.create();
86+
sc.setParameters("resourceId", resourceId);
87+
88+
List<R> results = search(sc, null);
89+
Map<String, Boolean> details = new HashMap<>(results.size());
90+
for (R result : results) {
91+
details.put(result.getName(), result.isDisplay());
92+
}
93+
return details;
94+
}
95+
8496
public List<R> listDetails(long resourceId) {
8597
SearchCriteria<R> sc = AllFieldsSearch.create();
8698
sc.setParameters("resourceId", resourceId);

server/src/com/cloud/network/element/VirtualRouterElement.java

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,12 @@
2424

2525
import javax.inject.Inject;
2626

27-
import com.cloud.utils.net.NetUtils;
28-
import org.springframework.beans.factory.annotation.Autowired;
29-
import org.springframework.beans.factory.annotation.Qualifier;
30-
import com.cloud.network.router.NetworkHelper;
3127
import org.apache.commons.collections.CollectionUtils;
3228
import org.apache.log4j.Logger;
3329
import org.cloud.network.router.deployment.RouterDeploymentDefinition;
3430
import org.cloud.network.router.deployment.RouterDeploymentDefinitionBuilder;
31+
import org.springframework.beans.factory.annotation.Autowired;
32+
import org.springframework.beans.factory.annotation.Qualifier;
3533

3634
import com.google.gson.Gson;
3735

@@ -83,6 +81,7 @@
8381
import com.cloud.network.dao.VirtualRouterProviderDao;
8482
import com.cloud.network.lb.LoadBalancingRule;
8583
import com.cloud.network.lb.LoadBalancingRulesManager;
84+
import com.cloud.network.router.NetworkHelper;
8685
import com.cloud.network.router.VirtualRouter;
8786
import com.cloud.network.router.VirtualRouter.Role;
8887
import com.cloud.network.router.VpcVirtualNetworkApplianceManager;
@@ -103,6 +102,7 @@
103102
import com.cloud.utils.db.QueryBuilder;
104103
import com.cloud.utils.db.SearchCriteria.Op;
105104
import com.cloud.utils.exception.CloudRuntimeException;
105+
import com.cloud.utils.net.NetUtils;
106106
import com.cloud.vm.DomainRouterVO;
107107
import com.cloud.vm.NicProfile;
108108
import com.cloud.vm.ReservationContext;
@@ -703,7 +703,14 @@ public boolean savePassword(final Network network, final NicProfile nic, final V
703703
// save the password in DB
704704
for (final VirtualRouter router : routers) {
705705
if (router.getState() == State.Running) {
706-
return networkTopology.savePasswordToRouter(network, nic, uservm, router);
706+
final boolean result = networkTopology.savePasswordToRouter(network, nic, uservm, router);
707+
if (result) {
708+
// Explicit password reset, while VM hasn't generated a password yet.
709+
final UserVmVO userVmVO = _userVmDao.findById(vm.getId());
710+
userVmVO.setUpdateParameters(false);
711+
_userVmDao.update(userVmVO.getId(), userVmVO);
712+
}
713+
return result;
707714
}
708715
}
709716
final String password = (String) uservm.getParameter(VirtualMachineProfile.Param.VmPassword);

server/src/com/cloud/vm/UserVmManagerImpl.java

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,11 @@
3939
import javax.inject.Inject;
4040
import javax.naming.ConfigurationException;
4141

42+
import org.apache.commons.codec.binary.Base64;
43+
import org.apache.commons.collections.MapUtils;
44+
import org.apache.commons.lang3.StringUtils;
45+
import org.apache.log4j.Logger;
46+
4247
import org.apache.cloudstack.acl.ControlledEntity.ACLType;
4348
import org.apache.cloudstack.acl.SecurityChecker.AccessType;
4449
import org.apache.cloudstack.affinity.AffinityGroupService;
@@ -91,10 +96,6 @@
9196
import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
9297
import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreDao;
9398
import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreVO;
94-
import org.apache.commons.codec.binary.Base64;
95-
import org.apache.commons.collections.MapUtils;
96-
import org.apache.commons.lang3.StringUtils;
97-
import org.apache.log4j.Logger;
9899

99100
import com.cloud.agent.AgentManager;
100101
import com.cloud.agent.api.Answer;
@@ -688,10 +689,6 @@ public UserVm resetVMPassword(ResetVMPasswordCmd cmd, String password) throws Re
688689

689690
if (result) {
690691
userVm.setPassword(password);
691-
// update the password in vm_details table too
692-
// Check if an SSH key pair was selected for the instance and if so
693-
// use it to encrypt & save the vm password
694-
encryptAndStorePassword(userVm, password);
695692
} else {
696693
throw new CloudRuntimeException("Failed to reset password for the virtual machine ");
697694
}
@@ -736,7 +733,6 @@ private boolean resetVMPasswordInternal(Long vmId, String password) throws Resou
736733
} else {
737734
final UserVmVO userVm = _vmDao.findById(vmId);
738735
_vmDao.loadDetails(userVm);
739-
userVm.setPassword(password);
740736
// update the password in vm_details table too
741737
// Check if an SSH key pair was selected for the instance and if so
742738
// use it to encrypt & save the vm password
@@ -850,8 +846,9 @@ private boolean resetVMSSHKeyInternal(Long vmId, String sshPublicKey, String pas
850846
userVm.setPassword(password);
851847
//update the encrypted password in vm_details table too
852848
encryptAndStorePassword(userVm, password);
849+
} else {
850+
_vmDao.saveDetails(userVm);
853851
}
854-
_vmDao.saveDetails(userVm);
855852

856853
if (vmInstance.getState() == State.Stopped) {
857854
s_logger.debug("Vm " + vmInstance + " is stopped, not rebooting it as a part of SSH Key reset");
@@ -4461,6 +4458,7 @@ public Pair<UserVmVO, Map<VirtualMachineProfile.Param, Object>> startVirtualMach
44614458
password = DBEncryptionUtil.decrypt(vm.getDetail("password"));
44624459
} else {
44634460
password = _mgr.generateRandomPassword();
4461+
vm.setPassword(password);
44644462
}
44654463
}
44664464

@@ -4499,11 +4497,10 @@ public Pair<UserVmVO, Map<VirtualMachineProfile.Param, Object>> startVirtualMach
44994497
// this value is not being sent to the backend; need only for api
45004498
// display purposes
45014499
if (template.getEnablePassword()) {
4502-
vm.setPassword((String)vmParamPair.second().get(VirtualMachineProfile.Param.VmPassword));
4503-
vm.setUpdateParameters(false);
45044500
if (vm.getDetail("password") != null) {
4505-
_vmDetailsDao.remove(_vmDetailsDao.findDetail(vm.getId(), "password").getId());
4501+
_vmDetailsDao.removeDetail(vm.getId(), "password");
45064502
}
4503+
vm.setUpdateParameters(false);
45074504
_vmDao.update(vm.getId(), vm);
45084505
}
45094506
}
@@ -6180,7 +6177,7 @@ public UserVm restoreVMInternal(Account caller, UserVmVO vm, Long newTemplateId)
61806177
vm.setUpdateParameters(false);
61816178
_vmDao.loadDetails(vm);
61826179
if (vm.getDetail("password") != null) {
6183-
_vmDetailsDao.remove(_vmDetailsDao.findDetail(vm.getId(), "password").getId());
6180+
_vmDetailsDao.removeDetail(vm.getId(), "password");
61846181
}
61856182
_vmDao.update(vm.getId(), vm);
61866183
}

0 commit comments

Comments
 (0)