diff --git a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java index 73b6343dfc1..ba76e57bc08 100644 --- a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java +++ b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java @@ -200,6 +200,7 @@ import com.cloud.user.dao.UserDao; import com.cloud.user.dao.UserStatisticsDao; import com.cloud.user.dao.UserStatsLogDao; import com.cloud.utils.NumbersUtil; +import com.cloud.utils.Pair; import com.cloud.utils.component.ComponentContext; import com.cloud.utils.component.ManagerBase; import com.cloud.utils.concurrency.NamedThreadFactory; @@ -2575,8 +2576,20 @@ Configurable, StateListener { final VirtualMachine.Event event = transition.getEvent(); if (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); + if (opaque != null && opaque instanceof Pair) { + Pair pair = (Pair)opaque; + Object first = pair.first(); + Object second = pair.second(); + if (first != null && second != null && first instanceof Long && second instanceof Long) { + Long hostId = (Long)first; + Long powerHostId = (Long)second; + // If VM host known to CS is different from 'PowerOn' report host, then it is out-of-band movement + if (hostId.longValue() != powerHostId.longValue()) { + s_logger.info("Schedule a router reboot task as router " + vo.getId() + " is powered-on out-of-band, need to reboot to refresh network rules"); + _executor.schedule(new RebootTask(vo.getId()), 1000, TimeUnit.MICROSECONDS); + } + } + } } } return true; diff --git a/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java b/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java index abb4849f76c..688453ec4d6 100644 --- a/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java +++ b/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java @@ -81,6 +81,7 @@ import com.cloud.user.UserStatisticsVO; import com.cloud.utils.Pair; import com.cloud.utils.db.EntityManager; import com.cloud.utils.exception.CloudRuntimeException; +import com.cloud.utils.fsm.StateMachine2; import com.cloud.utils.net.NetUtils; import com.cloud.vm.DomainRouterVO; import com.cloud.vm.Nic; @@ -741,4 +742,11 @@ public class VpcVirtualNetworkApplianceManagerImpl extends VirtualNetworkApplian } return true; } + + @Override + public boolean postStateTransitionEvent(final StateMachine2.Transition transition, final VirtualMachine vo, final boolean status, final Object opaque) { + // Without this VirtualNetworkApplianceManagerImpl.postStateTransitionEvent() gets called twice as part of listeners - + // once from VpcVirtualNetworkApplianceManagerImpl and once from VirtualNetworkApplianceManagerImpl itself + return true; + } }