CLOUDSTACK-7113: Ability to reset password when Router VM is stopped

With this improvement password reset also happens when router is in stopped state on resetPasswordCmd and restoreVM
This commit is contained in:
Harikrishna Patnala 2014-07-16 15:33:13 +05:30 committed by Jayapal
parent 733a7ba8c1
commit 0069037573
2 changed files with 51 additions and 4 deletions

View File

@ -74,6 +74,7 @@ import com.cloud.network.lb.LoadBalancingRule.LbStickinessPolicy;
import com.cloud.network.lb.LoadBalancingRulesManager;
import com.cloud.network.router.VirtualRouter.Role;
import com.cloud.network.router.VpcVirtualNetworkApplianceManager;
import com.cloud.network.router.VirtualRouter;
import com.cloud.network.rules.FirewallRule;
import com.cloud.network.rules.LbStickinessMethod;
import com.cloud.network.rules.LbStickinessMethod.StickinessMethodType;
@ -89,6 +90,7 @@ import com.cloud.user.AccountManager;
import com.cloud.utils.Pair;
import com.cloud.utils.component.AdapterBase;
import com.cloud.utils.db.QueryBuilder;
import com.cloud.utils.crypt.DBEncryptionUtil;
import com.cloud.utils.db.SearchCriteria.Op;
import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.vm.DomainRouterVO;
@ -681,7 +683,23 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
@SuppressWarnings("unchecked")
VirtualMachineProfile uservm = vm;
return _routerMgr.savePasswordToRouter(network, nic, uservm, routers);
// If any router is running then send save password command otherwise save the password in DB
for (VirtualRouter router : routers) {
if (router.getState() == State.Running) {
return _routerMgr.savePasswordToRouter(network, nic, uservm, routers);
}
}
String password = (String) uservm.getParameter(VirtualMachineProfile.Param.VmPassword);
String password_encrypted = DBEncryptionUtil.encrypt(password);
UserVmVO userVmVO = _userVmDao.findById(vm.getId());
_userVmDao.loadDetails(userVmVO);
userVmVO.setDetail("password", password_encrypted);
_userVmDao.saveDetails(userVmVO);
userVmVO.setUpdateParameters(true);
_userVmDao.update(userVmVO.getId(), userVmVO);
return true;
}
@Override

View File

@ -261,6 +261,7 @@ import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.utils.exception.ExecutionException;
import com.cloud.utils.fsm.NoTransitionException;
import com.cloud.utils.net.NetUtils;
import com.cloud.utils.crypt.DBEncryptionUtil;
import com.cloud.vm.VirtualMachine.State;
import com.cloud.vm.dao.InstanceGroupDao;
import com.cloud.vm.dao.InstanceGroupVMMapDao;
@ -3439,7 +3440,11 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
String password = "saved_password";
if (template.getEnablePassword()) {
password = generateRandomPassword();
if (vm.getDetail("password") != null) {
password = DBEncryptionUtil.decrypt(vm.getDetail("password"));
} else {
password = generateRandomPassword();
}
}
if (!validPassword(password)) {
@ -3479,6 +3484,9 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
if (template.getEnablePassword()) {
vm.setPassword((String)vmParamPair.second().get(VirtualMachineProfile.Param.VmPassword));
vm.setUpdateParameters(false);
if (vm.getDetail("password") != null) {
_vmDetailsDao.remove(_vmDetailsDao.findDetail(vm.getId(), "password").getId());
}
_vmDao.update(vm.getId(), vm);
}
}
@ -4721,8 +4729,11 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
}
}
Map<VirtualMachineProfile.Param, Object> params = null;
String password = null;
if (template.getEnablePassword()) {
String password = generateRandomPassword();
password = generateRandomPassword();
boolean result = resetVMPasswordInternal(vmId, password);
if (result) {
vm.setPassword(password);
@ -4738,7 +4749,25 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
if (needRestart) {
try {
_itMgr.start(vm.getUuid(), null);
if (vm.getDetail("password") != null) {
params = new HashMap<VirtualMachineProfile.Param, Object>();
params.put(VirtualMachineProfile.Param.VmPassword, password);
}
_itMgr.start(vm.getUuid(), params);
vm = _vmDao.findById(vmId);
if (template.getEnablePassword()) {
// this value is not being sent to the backend; need only for api
// display purposes
vm.setPassword(password);
if (vm.isUpdateParameters()) {
vm.setUpdateParameters(false);
_vmDao.loadDetails(vm);
if (vm.getDetail("password") != null) {
_vmDetailsDao.remove(_vmDetailsDao.findDetail(vm.getId(), "password").getId());
}
_vmDao.update(vm.getId(), vm);
}
}
} catch (Exception e) {
s_logger.debug("Unable to start VM " + vm.getUuid(), e);
CloudRuntimeException ex = new CloudRuntimeException("Unable to start VM with specified id" + e.getMessage());