From 65e326c751bb7e3ff29d7d8c906eaed500e3107a Mon Sep 17 00:00:00 2001 From: Frank Date: Thu, 27 Jan 2011 18:40:31 -0800 Subject: [PATCH] ovs -- use VmStateListener to track vm state change --- .../network/ovs/OvsNetworkManagerImpl.java | 39 +++++++++++++++++++ .../VirtualNetworkApplianceManagerImpl.java | 5 +-- .../src/com/cloud/vm/UserVmManagerImpl.java | 2 - 3 files changed, 40 insertions(+), 6 deletions(-) diff --git a/server/src/com/cloud/network/ovs/OvsNetworkManagerImpl.java b/server/src/com/cloud/network/ovs/OvsNetworkManagerImpl.java index 23439e66a09..34c6751fa8a 100644 --- a/server/src/com/cloud/network/ovs/OvsNetworkManagerImpl.java +++ b/server/src/com/cloud/network/ovs/OvsNetworkManagerImpl.java @@ -44,10 +44,12 @@ import com.cloud.utils.component.Inject; import com.cloud.utils.concurrency.NamedThreadFactory; import com.cloud.utils.db.DB; import com.cloud.utils.db.Transaction; +import com.cloud.utils.fsm.StateListener; import com.cloud.vm.DomainRouterVO; import com.cloud.vm.UserVmVO; import com.cloud.vm.VMInstanceVO; import com.cloud.vm.VirtualMachine; +import com.cloud.vm.VirtualMachine.Event; import com.cloud.vm.VirtualMachine.State; import com.cloud.vm.VirtualMachineProfile; import com.cloud.vm.dao.DomainRouterDao; @@ -78,10 +80,45 @@ public class OvsNetworkManagerImpl implements OvsNetworkManager { ScheduledExecutorService _executorPool; ScheduledExecutorService _cleanupExecutor; OvsListener _ovsListener; + VmStateListener _stateListener; private long _serverId; private final long _timeBetweenCleanups = 30; //seconds + public class VmStateListener implements StateListener { + OvsNetworkManager _mgr; + public VmStateListener(OvsNetworkManager mgr) { + _mgr = mgr; + } + + @Override + public boolean postStateTransitionEvent(State oldState, Event event, State newState, VirtualMachine vm, boolean status) { + if (!_isEnabled || !status || (vm.getType() != VirtualMachine.Type.User && vm.getType() != VirtualMachine.Type.DomainRouter)) { + return false; + } + + if (VirtualMachine.State.isVmStarted(oldState, event, newState)) { + _mgr.handleVmStateTransition((VMInstanceVO)vm, State.Running); + } else if (VirtualMachine.State.isVmMigrated(oldState, event, newState)) { + } + return true; + } + + @Override + public boolean preStateTransitionEvent(State oldState, Event event, State newState, VirtualMachine vm, boolean status, Long id) { + if (!_isEnabled || !status || (vm.getType() != VirtualMachine.Type.User && vm.getType() != VirtualMachine.Type.DomainRouter)) { + return false; + } + + if (VirtualMachine.State.isVmStopped(oldState, event, newState)) { + _mgr.handleVmStateTransition((VMInstanceVO)vm, State.Stopped); + } + + return true; + } + + } + public class WorkerThread implements Runnable { @Override public void run() { @@ -117,6 +154,8 @@ public class OvsNetworkManagerImpl implements OvsNetworkManager { _cleanupExecutor = Executors.newScheduledThreadPool(1, new NamedThreadFactory("OVS-Cleanup")); _ovsListener = new OvsListener(this, _workDao, _tunnelDao, _vlanMappingDao, _hostDao); _agentMgr.registerForHostEvents(_ovsListener, true, true, true); + _stateListener = new VmStateListener(this); + VirtualMachine.State.getStateMachine().registerListener(_stateListener); } return true; diff --git a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java index ee7dfb0edcd..d2534f912b0 100644 --- a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java +++ b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java @@ -1213,9 +1213,7 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian s_logger.warn("Unable to ssh to the VM: " + answer.getDetails()); return false; } - - DomainRouterVO router = profile.getVirtualMachine(); - _ovsNetworkMgr.handleVmStateTransition(router, State.Running); + return true; } @@ -1226,7 +1224,6 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian } DomainRouterVO router = profile.getVirtualMachine(); - _ovsNetworkMgr.handleVmStateTransition(router, State.Stopped); _ovsTunnelMgr.CheckAndDestroyTunnel(router); } diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java index b62b2cb3a75..98e10d01b7d 100755 --- a/server/src/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/com/cloud/vm/UserVmManagerImpl.java @@ -2248,7 +2248,6 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager @Override public boolean finalizeStart(VirtualMachineProfile profile, long hostId, Commands cmds, ReservationContext context) { UserVmVO vm = profile.getVirtualMachine(); - _ovsNetworkMgr.handleVmStateTransition(vm, State.Running); UsageEventVO usageEvent = new UsageEventVO(EventTypes.EVENT_VM_START, vm.getAccountId(), vm.getDataCenterId(), vm.getId(), vm.getName(), vm.getServiceOfferingId(), vm.getTemplateId(), null); _usageEventDao.persist(usageEvent); @@ -2309,7 +2308,6 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager @Override public void finalizeStop(VirtualMachineProfile profile, StopAnswer answer) { UserVmVO vm = profile.getVirtualMachine(); - _ovsNetworkMgr.handleVmStateTransition(vm, State.Stopped); _ovsTunnelMgr.CheckAndDestroyTunnel(vm); }