From 98bfb945f6fc5a9b08452b495e01a771a90f577e Mon Sep 17 00:00:00 2001 From: Bharat Kumar Date: Thu, 17 Dec 2015 16:19:30 +0530 Subject: [PATCH 1/2] CLOUDSTACK-9727 Password reset discrepancy in RVR when one of the Router is not in Running state. --- .../network/element/VirtualRouterElement.java | 39 +++++++++++++------ 1 file changed, 27 insertions(+), 12 deletions(-) diff --git a/server/src/com/cloud/network/element/VirtualRouterElement.java b/server/src/com/cloud/network/element/VirtualRouterElement.java index 159826b2e5b2..3088c8236f81 100644 --- a/server/src/com/cloud/network/element/VirtualRouterElement.java +++ b/server/src/com/cloud/network/element/VirtualRouterElement.java @@ -779,24 +779,39 @@ public boolean savePassword(final Network network, final NicProfile nic, final V final DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId()); final NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO); - // If any router is running then send save password command otherwise - // save the password in DB + // If any router is not running then save the password in DB + List routerList = new ArrayList(); + //applied true implies we have applied the password successfully on at + //least one router. save true implies we have to save the password to send + //it to the remaining routers. + Boolean applied = true, save = false; for (final VirtualRouter router : routers) { if (router.getState() == State.Running) { - return networkTopology.savePasswordToRouter(network, nic, uservm, router); + routerList.add(router); + } else { + save = true; } } - final String password = (String) uservm.getParameter(VirtualMachineProfile.Param.VmPassword); - final String password_encrypted = DBEncryptionUtil.encrypt(password); - final UserVmVO userVmVO = _userVmDao.findById(vm.getId()); - - _userVmDao.loadDetails(userVmVO); - userVmVO.setDetail("password", password_encrypted); - _userVmDao.saveDetails(userVmVO); + for (VirtualRouter router : routerList) { + applied = networkTopology.savePasswordToRouter(network, nic, uservm, router); + if (!applied) + break; + } + if (save && applied) { + final String password = (String) uservm.getParameter(VirtualMachineProfile.Param.VmPassword); + final String password_encrypted = DBEncryptionUtil.encrypt(password); + final UserVmVO userVmVO = _userVmDao.findById(vm.getId()); - userVmVO.setUpdateParameters(true); - _userVmDao.update(userVmVO.getId(), userVmVO); + _userVmDao.loadDetails(userVmVO); + userVmVO.setDetail("password", password_encrypted); + _userVmDao.saveDetails(userVmVO); + userVmVO.setUpdateParameters(true); + _userVmDao.update(userVmVO.getId(), userVmVO); + } + if (!applied) { + return false; + } return true; } From 4788ad6cd2c06470b783c4b328a78fb28c35dfed Mon Sep 17 00:00:00 2001 From: Bharat Kumar Date: Wed, 17 May 2017 15:44:23 +0530 Subject: [PATCH 2/2] send password only to master router --- .../network/element/VirtualRouterElement.java | 50 ++++++++----------- .../topology/AdvancedNetworkVisitor.java | 8 ++- 2 files changed, 26 insertions(+), 32 deletions(-) diff --git a/server/src/com/cloud/network/element/VirtualRouterElement.java b/server/src/com/cloud/network/element/VirtualRouterElement.java index 3088c8236f81..bec36ff7ca6d 100644 --- a/server/src/com/cloud/network/element/VirtualRouterElement.java +++ b/server/src/com/cloud/network/element/VirtualRouterElement.java @@ -775,43 +775,33 @@ public boolean savePassword(final Network network, final NicProfile nic, final V } final VirtualMachineProfile uservm = vm; - final DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId()); final NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO); - // If any router is not running then save the password in DB - List routerList = new ArrayList(); - //applied true implies we have applied the password successfully on at - //least one router. save true implies we have to save the password to send - //it to the remaining routers. - Boolean applied = true, save = false; - for (final VirtualRouter router : routers) { - if (router.getState() == State.Running) { - routerList.add(router); - } else { - save = true; - } + if (!network.isRedundant()) { + return networkTopology.savePasswordToRouter(network, nic, uservm, routers.get(0)); } - for (VirtualRouter router : routerList) { - applied = networkTopology.savePasswordToRouter(network, nic, uservm, router); - if (!applied) - break; + + for (final VirtualRouter router : routers) { + if (router.getState() == State.Running && router.getRedundantState() == VirtualRouter.RedundantState.MASTER) { + return networkTopology.savePasswordToRouter(network, nic, uservm, router); + } } - if (save && applied) { - final String password = (String) uservm.getParameter(VirtualMachineProfile.Param.VmPassword); - final String password_encrypted = DBEncryptionUtil.encrypt(password); - final UserVmVO userVmVO = _userVmDao.findById(vm.getId()); + return savePassword(uservm); + } - _userVmDao.loadDetails(userVmVO); - userVmVO.setDetail("password", password_encrypted); - _userVmDao.saveDetails(userVmVO); + private boolean savePassword(VirtualMachineProfile uservm) { + //save password + final String password = (String) uservm.getParameter(VirtualMachineProfile.Param.VmPassword); + final String password_encrypted = DBEncryptionUtil.encrypt(password); + final UserVmVO userVmVO = _userVmDao.findById(uservm.getId()); - userVmVO.setUpdateParameters(true); - _userVmDao.update(userVmVO.getId(), userVmVO); - } - if (!applied) { - return false; - } + _userVmDao.loadDetails(userVmVO); + userVmVO.setDetail("password", password_encrypted); + _userVmDao.saveDetails(userVmVO); + + userVmVO.setUpdateParameters(true); + _userVmDao.update(userVmVO.getId(), userVmVO); return true; } diff --git a/server/src/org/apache/cloudstack/network/topology/AdvancedNetworkVisitor.java b/server/src/org/apache/cloudstack/network/topology/AdvancedNetworkVisitor.java index b5283dacfeba..025c36d79bb8 100644 --- a/server/src/org/apache/cloudstack/network/topology/AdvancedNetworkVisitor.java +++ b/server/src/org/apache/cloudstack/network/topology/AdvancedNetworkVisitor.java @@ -61,13 +61,17 @@ public class AdvancedNetworkVisitor extends BasicNetworkVisitor { @Override public boolean visit(final UserdataPwdRules userdata) throws ResourceUnavailableException { final VirtualRouter router = userdata.getRouter(); - final Commands commands = new Commands(Command.OnError.Stop); final VirtualMachineProfile profile = userdata.getProfile(); final NicVO nicVo = userdata.getNicVo(); final UserVmVO userVM = userdata.getUserVM(); - _commandSetupHelper.createPasswordCommand(router, profile, nicVo, commands); + if (router.getIsRedundantRouter() && router.getVpcId() == null && router.getRedundantState() == VirtualRouter.RedundantState.MASTER) { + _commandSetupHelper.createPasswordCommand(router, profile, nicVo, commands); + }else if (!router.getIsRedundantRouter() || router.getVpcId()!= null){ + _commandSetupHelper.createPasswordCommand(router, profile, nicVo, commands); + } + _commandSetupHelper.createVmDataCommand(router, userVM, nicVo, userVM.getDetail("SSH.PublicKey"), commands); return _networkGeneralHelper.sendCommandsToRouter(router, commands);