Repository: cloudstack Updated Branches: refs/heads/4.3 e5761cc85 -> 8a91aa9af
CLOUDSTACK-5685: reboot VR if a out-of-band power-on event is detected (cherry picked from commit ee2adab7c7c9cf42eaf93c7eedb6dd32ebd8b501) Signed-off-by: Rohit Yadav <[email protected]> Conflicts: server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/b2c24027 Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/b2c24027 Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/b2c24027 Branch: refs/heads/4.3 Commit: b2c240278931c20547482cfd987a4c47f3654609 Parents: e5761cc Author: Kelven Yang <[email protected]> Authored: Mon Feb 10 16:58:49 2014 -0800 Committer: Rohit Yadav <[email protected]> Committed: Tue Dec 2 15:30:24 2014 +0530 ---------------------------------------------------------------------- .../VirtualNetworkApplianceManagerImpl.java | 56 ++++++++++++++++---- 1 file changed, 47 insertions(+), 9 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b2c24027/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java index 62dccec..f625b11 100755 --- a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java +++ b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java @@ -256,6 +256,7 @@ import com.cloud.utils.db.Transaction; import com.cloud.utils.db.TransactionCallbackNoReturn; import com.cloud.utils.db.TransactionStatus; import com.cloud.utils.exception.CloudRuntimeException; +import com.cloud.utils.fsm.StateListener; import com.cloud.utils.net.Ip; import com.cloud.utils.net.MacAddress; import com.cloud.utils.net.NetUtils; @@ -288,7 +289,7 @@ import com.cloud.vm.dao.VMInstanceDao; */ @Local(value = { VirtualNetworkApplianceManager.class, VirtualNetworkApplianceService.class }) public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements VirtualNetworkApplianceManager, VirtualNetworkApplianceService, - VirtualMachineGuru, Listener, Configurable { + VirtualMachineGuru, Listener, Configurable, StateListener<State, VirtualMachine.Event, VirtualMachine> { private static final Logger s_logger = Logger.getLogger(VirtualNetworkApplianceManagerImpl.class); @Inject @@ -675,6 +676,8 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V _checkExecutor = Executors.newScheduledThreadPool(1, new NamedThreadFactory("RouterStatusMonitor")); _networkStatsUpdateExecutor = Executors.newScheduledThreadPool(1, new NamedThreadFactory("NetworkStatsUpdater")); + VirtualMachine.State.getStateMachine().registerListener(this); + final Map<String, String> configs = _configDao.getConfiguration("AgentManager", params); _routerRamSize = NumbersUtil.parseInt(configs.get("router.ram.size"), DEFAULT_ROUTER_VM_RAMSIZE); @@ -3490,14 +3493,14 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V } } - - private void createVmDataCommand(VirtualRouter router, UserVm vm, NicVO nic, String publicKey, Commands cmds) { - String serviceOffering = _serviceOfferingDao.findByIdIncludingRemoved(vm.getId(), vm.getServiceOfferingId()).getDisplayText(); - String zoneName = _dcDao.findById(router.getDataCenterId()).getName(); - cmds.addCommand("vmdata", - generateVmDataCommand(router, nic.getIp4Address(), vm.getUserData(), serviceOffering, zoneName, nic.getIp4Address(), - vm.getHostName(), vm.getInstanceName(), vm.getId(), vm.getUuid(), publicKey, nic.getNetworkId())); - + + private void createVmDataCommand(final VirtualRouter router, final UserVm vm, final NicVO nic, final String publicKey, final Commands cmds) { + final String serviceOffering = _serviceOfferingDao.findByIdIncludingRemoved(vm.getId(), vm.getServiceOfferingId()).getDisplayText(); + final String zoneName = _dcDao.findById(router.getDataCenterId()).getName(); + cmds.addCommand( + "vmdata", + generateVmDataCommand(router, nic.getIp4Address(), vm.getUserData(), serviceOffering, zoneName, nic.getIp4Address(), vm.getHostName(), vm.getInstanceName(), + vm.getId(), vm.getUuid(), publicKey, nic.getNetworkId())); } private void createVmDataCommandForVMs(DomainRouterVO router, Commands cmds, long guestNetworkId) { @@ -4301,4 +4304,39 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V public ConfigKey<?>[] getConfigKeys() { return new ConfigKey<?>[] {UseExternalDnsServers, routerVersionCheckEnabled}; } + + @Override + public boolean preStateTransitionEvent(State oldState, VirtualMachine.Event event, State newState, VirtualMachine vo, boolean status, Object opaque) { + return true; + } + + @Override + public boolean postStateTransitionEvent(State oldState, VirtualMachine.Event event, State newState, VirtualMachine vo, boolean status, Object opaque) { + if (oldState == State.Stopped && event == VirtualMachine.Event.FollowAgentPowerOnReport && newState == State.Running) { + if (vo.getType() == VirtualMachine.Type.DomainRouter) { + s_logger.info("Schedule a router reboot task as router " + vo.getId() + " is powered-on out-of-band. we need to reboot to refresh network rules"); + _executor.schedule(new RebootTask(vo.getId()), 1000, TimeUnit.MICROSECONDS); + } + } + return true; + } + + protected class RebootTask extends ManagedContextRunnable { + + long _routerId; + + public RebootTask(long routerId) { + _routerId = routerId; + } + + @Override + protected void runInContext() { + try { + s_logger.info("Reboot router " + _routerId + " to refresh network rules"); + rebootRouter(_routerId, true); + } catch (Exception e) { + s_logger.warn("Error while rebooting the router", e); + } + } + } }
