ovs -- use VmStateListener to track vm state change

This commit is contained in:
Frank 2011-01-27 18:40:31 -08:00
parent 41cbd0edac
commit 65e326c751
3 changed files with 40 additions and 6 deletions

View File

@ -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<State, VirtualMachine.Event, VirtualMachine> {
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;

View File

@ -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);
}

View File

@ -2248,7 +2248,6 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager
@Override
public boolean finalizeStart(VirtualMachineProfile<UserVmVO> 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<UserVmVO> profile, StopAnswer answer) {
UserVmVO vm = profile.getVirtualMachine();
_ovsNetworkMgr.handleVmStateTransition(vm, State.Stopped);
_ovsTunnelMgr.CheckAndDestroyTunnel(vm);
}