move all the vm's state machine to itmgr->statetransitTO

This commit is contained in:
edison 2010-12-03 15:36:55 -08:00
parent 2e3ef1408c
commit d17beeb348
24 changed files with 340 additions and 117 deletions

View File

@ -31,6 +31,7 @@ import com.cloud.exception.DiscoveryException;
import com.cloud.exception.InvalidParameterValueException; import com.cloud.exception.InvalidParameterValueException;
import com.cloud.exception.OperationTimedoutException; import com.cloud.exception.OperationTimedoutException;
import com.cloud.host.Host; import com.cloud.host.Host;
import com.cloud.host.Host.Type;
import com.cloud.host.HostStats; import com.cloud.host.HostStats;
import com.cloud.host.HostVO; import com.cloud.host.HostVO;
import com.cloud.host.Status; import com.cloud.host.Status;
@ -155,7 +156,7 @@ public interface AgentManager extends Manager {
* to deploy in, service offering, template, and list of host to avoid. * to deploy in, service offering, template, and list of host to avoid.
*/ */
Host findHost(Host.Type type, DataCenterVO dc, HostPodVO pod, StoragePoolVO sp, ServiceOffering offering, VMTemplateVO template, VMInstanceVO vm, Host currentHost, Set<Host> avoid); Host findHost(Host.Type type, DataCenterVO dc, HostPodVO pod, StoragePoolVO sp, ServiceOfferingVO offering, VMTemplateVO template, VMInstanceVO vm, Host currentHost, Set<Host> avoid);
List<PodCluster> listByDataCenter(long dcId); List<PodCluster> listByDataCenter(long dcId);
List<PodCluster> listByPod(long podId); List<PodCluster> listByPod(long podId);
@ -212,4 +213,5 @@ public interface AgentManager extends Manager {
public List<HostVO> discoverHosts(Long dcId, Long podId, Long clusterId, String clusterName, String url, String username, String password) throws IllegalArgumentException, DiscoveryException, InvalidParameterValueException; public List<HostVO> discoverHosts(Long dcId, Long podId, Long clusterId, String clusterName, String url, String username, String password) throws IllegalArgumentException, DiscoveryException, InvalidParameterValueException;
Answer easySend(Long hostId, Command cmd, int timeout); Answer easySend(Long hostId, Command cmd, int timeout);
} }

View File

@ -95,10 +95,15 @@ import com.cloud.dc.dao.DataCenterDao;
import com.cloud.dc.dao.DataCenterIpAddressDao; import com.cloud.dc.dao.DataCenterIpAddressDao;
import com.cloud.dc.dao.HostPodDao; import com.cloud.dc.dao.HostPodDao;
import com.cloud.dc.dao.VlanDao; import com.cloud.dc.dao.VlanDao;
import com.cloud.deploy.DataCenterDeployment;
import com.cloud.deploy.DeployDestination;
import com.cloud.deploy.DeploymentPlanner;
import com.cloud.deploy.DeploymentPlanner.ExcludeList;
import com.cloud.event.dao.EventDao; import com.cloud.event.dao.EventDao;
import com.cloud.exception.AgentUnavailableException; import com.cloud.exception.AgentUnavailableException;
import com.cloud.exception.ConnectionException; import com.cloud.exception.ConnectionException;
import com.cloud.exception.DiscoveryException; import com.cloud.exception.DiscoveryException;
import com.cloud.exception.InsufficientServerCapacityException;
import com.cloud.exception.InvalidParameterValueException; import com.cloud.exception.InvalidParameterValueException;
import com.cloud.exception.OperationTimedoutException; import com.cloud.exception.OperationTimedoutException;
import com.cloud.exception.UnsupportedVersionException; import com.cloud.exception.UnsupportedVersionException;
@ -218,6 +223,9 @@ public class AgentManagerImpl implements AgentManager, HandlerFactory, ResourceS
@Inject protected DetailsDao _hostDetailsDao = null; @Inject protected DetailsDao _hostDetailsDao = null;
@Inject protected ClusterDao _clusterDao; @Inject protected ClusterDao _clusterDao;
@Inject(adapter=DeploymentPlanner.class)
private Adapters<DeploymentPlanner> _planners;
protected Adapters<Discoverer> _discoverers = null; protected Adapters<Discoverer> _discoverers = null;
protected int _port; protected int _port;
@ -434,24 +442,33 @@ public class AgentManagerImpl implements AgentManager, HandlerFactory, ResourceS
@Override @Override
public Host findHost(final Host.Type type, final DataCenterVO dc, final HostPodVO pod, final StoragePoolVO sp, public Host findHost(final Host.Type type, final DataCenterVO dc, final HostPodVO pod, final StoragePoolVO sp,
final ServiceOffering offering, final VMTemplateVO template, VMInstanceVO vm, final ServiceOfferingVO offering, final VMTemplateVO template, VMInstanceVO vm,
Host currentHost, final Set<Host> avoid) { Host currentHost, final Set<Host> avoid) {
VirtualMachineProfile<VMInstanceVO> vmc = new VirtualMachineProfileImpl<VMInstanceVO>(vm.getType()); VirtualMachineProfileImpl<VMInstanceVO> vmProfile = new VirtualMachineProfileImpl<VMInstanceVO>(vm, template, offering, null, null);
Enumeration<HostAllocator> en = _hostAllocators.enumeration(); DeployDestination dest = null;
while (en.hasMoreElements()) { DataCenterDeployment plan = new DataCenterDeployment(dc.getId(), pod.getId(), sp.getClusterId(), null);
final HostAllocator allocator = en.nextElement(); ExcludeList avoids = new ExcludeList();
final Host host = allocator.allocateTo(vmc, offering, type, dc, pod, sp.getClusterId(), template, avoid); for (Host h : avoid) {
if (host == null) { avoids.addHost(h.getId());
continue; }
} else {
return host; for (DeploymentPlanner planner : _planners) {
} try {
dest = planner.plan(vmProfile, plan, avoids);
if (dest != null) {
return dest.getHost();
}
} catch (InsufficientServerCapacityException e) {
}
} }
s_logger.warn("findHost() could not find a non-null host."); s_logger.warn("findHost() could not find a non-null host.");
return null; return null;
} }
@Override @Override
public List<PodCluster> listByDataCenter(long dcId) { public List<PodCluster> listByDataCenter(long dcId) {
List<HostPodVO> pods = _podDao.listByDataCenterId(dcId); List<HostPodVO> pods = _podDao.listByDataCenterId(dcId);

View File

@ -32,6 +32,7 @@ import com.cloud.user.dao.AccountDao;
import com.cloud.user.dao.UserDao; import com.cloud.user.dao.UserDao;
import com.cloud.utils.component.Manager; import com.cloud.utils.component.Manager;
import com.cloud.vm.UserVmManager; import com.cloud.vm.UserVmManager;
import com.cloud.vm.VmManager;
import com.cloud.vm.dao.DomainRouterDao; import com.cloud.vm.dao.DomainRouterDao;
import com.cloud.vm.dao.UserVmDao; import com.cloud.vm.dao.UserVmDao;
@ -51,4 +52,5 @@ public interface AsyncJobExecutorContext extends Manager {
public IPAddressDao getIpAddressDao(); public IPAddressDao getIpAddressDao();
public AsyncJobDao getJobDao(); public AsyncJobDao getJobDao();
public UserDao getUserDao(); public UserDao getUserDao();
public VmManager getItMgr();
} }

View File

@ -37,6 +37,7 @@ import com.cloud.user.dao.AccountDao;
import com.cloud.user.dao.UserDao; import com.cloud.user.dao.UserDao;
import com.cloud.utils.component.ComponentLocator; import com.cloud.utils.component.ComponentLocator;
import com.cloud.vm.UserVmManager; import com.cloud.vm.UserVmManager;
import com.cloud.vm.VmManager;
import com.cloud.vm.dao.DomainRouterDao; import com.cloud.vm.dao.DomainRouterDao;
import com.cloud.vm.dao.UserVmDao; import com.cloud.vm.dao.UserVmDao;
@ -57,7 +58,8 @@ public class AsyncJobExecutorContextImpl implements AsyncJobExecutorContext {
private DomainRouterDao _routerDao; private DomainRouterDao _routerDao;
private IPAddressDao _ipAddressDao; private IPAddressDao _ipAddressDao;
private AsyncJobDao _jobDao; private AsyncJobDao _jobDao;
private UserDao _userDao; private UserDao _userDao;
private VmManager _itMgr;
private ManagementServer _managementServer; private ManagementServer _managementServer;
@ -138,6 +140,11 @@ public class AsyncJobExecutorContextImpl implements AsyncJobExecutorContext {
public UserDao getUserDao() { public UserDao getUserDao() {
return _userDao; return _userDao;
} }
@Override
public VmManager getItMgr() {
return _itMgr;
}
@Override @Override
public boolean configure(String name, Map<String, Object> params) throws ConfigurationException { public boolean configure(String name, Map<String, Object> params) throws ConfigurationException {
@ -218,7 +225,11 @@ public class AsyncJobExecutorContextImpl implements AsyncJobExecutorContext {
if(_userDao == null) { if(_userDao == null) {
throw new ConfigurationException("unable to get " + UserDao.class.getName()); throw new ConfigurationException("unable to get " + UserDao.class.getName());
} }
_itMgr = locator.getManager(VmManager.class);
if (_itMgr == null) {
throw new ConfigurationException("unable to get " + VmManager.class.getName());
}
return true; return true;
} }

View File

@ -100,7 +100,7 @@ public class DestroyVMExecutor extends VMOperationExecutor {
txn.start(); txn.start();
asyncMgr.getExecutorContext().getAccountMgr().decrementResourceCount(vm.getAccountId(), ResourceType.user_vm); asyncMgr.getExecutorContext().getAccountMgr().decrementResourceCount(vm.getAccountId(), ResourceType.user_vm);
if (!asyncMgr.getExecutorContext().getVmDao().updateIf(vm, VirtualMachine.Event.DestroyRequested, vm.getHostId())) { if (!asyncMgr.getExecutorContext().getItMgr().stateTransitTo(vm, VirtualMachine.Event.DestroyRequested, vm.getHostId())) {
s_logger.debug("Unable to destroy the vm because it is not in the correct state: " + vm.toString()); s_logger.debug("Unable to destroy the vm because it is not in the correct state: " + vm.toString());
txn.rollback(); txn.rollback();
@ -130,7 +130,7 @@ public class DestroyVMExecutor extends VMOperationExecutor {
asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_SUCCEEDED, 0, "success"); asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_SUCCEEDED, 0, "success");
} else { } else {
asyncMgr.getExecutorContext().getVmDao().updateIf(vm, Event.OperationFailed, vm.getHostId()); asyncMgr.getExecutorContext().getItMgr().stateTransitTo(vm, Event.OperationFailed, vm.getHostId());
asyncMgr.completeAsyncJob(getJob().getId(), asyncMgr.completeAsyncJob(getJob().getId(),
AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, "Agent failed to stop VM: " + vm.getHostName()); AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, "Agent failed to stop VM: " + vm.getHostName());
// managementServer.saveEvent(param.getUserId(), vm.getAccountId(), EventVO.LEVEL_ERROR, EventTypes.EVENT_VM_STOP, // managementServer.saveEvent(param.getUserId(), vm.getAccountId(), EventVO.LEVEL_ERROR, EventTypes.EVENT_VM_STOP,

View File

@ -92,7 +92,7 @@ public class StopVMExecutor extends VMOperationExecutor {
AsyncJobResult.STATUS_SUCCEEDED, 0, VMExecutorHelper.composeResultObject(asyncMgr.getExecutorContext().getManagementServer(), vm, null)); AsyncJobResult.STATUS_SUCCEEDED, 0, VMExecutorHelper.composeResultObject(asyncMgr.getExecutorContext().getManagementServer(), vm, null));
jobStatusUpdated = true; jobStatusUpdated = true;
} else { } else {
asyncMgr.getExecutorContext().getVmDao().updateIf(vm, Event.OperationFailed, vm.getHostId()); asyncMgr.getExecutorContext().getItMgr().stateTransitTo(vm, Event.OperationFailed, vm.getHostId());
asyncMgr.completeAsyncJob(getJob().getId(), asyncMgr.completeAsyncJob(getJob().getId(),
AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, "Agent failed to stop VM"); AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, "Agent failed to stop VM");
jobStatusUpdated = true; jobStatusUpdated = true;

View File

@ -632,7 +632,7 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, ConsoleProx
} }
} }
// to ensure atomic state transition to Starting state // to ensure atomic state transition to Starting state
if (!_consoleProxyDao.updateIf(proxy, com.cloud.vm.VirtualMachine.Event.StartRequested, routingHost.getId())) { if (!_itMgr.stateTransitTo(proxy, com.cloud.vm.VirtualMachine.Event.StartRequested, routingHost.getId())) {
if (s_logger.isDebugEnabled()) { if (s_logger.isDebugEnabled()) {
ConsoleProxyVO temp = _consoleProxyDao.findById(proxyId); ConsoleProxyVO temp = _consoleProxyDao.findById(proxyId);
s_logger.debug("Unable to start console proxy " + proxy.getHostName() + " because it is not in a startable state : " s_logger.debug("Unable to start console proxy " + proxy.getHostName() + " because it is not in a startable state : "
@ -664,7 +664,7 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, ConsoleProx
String guestIpAddress = _dcDao.allocateLinkLocalIpAddress(proxy.getDataCenterId(), routingHost.getPodId(), proxy.getId(), null); String guestIpAddress = _dcDao.allocateLinkLocalIpAddress(proxy.getDataCenterId(), routingHost.getPodId(), proxy.getId(), null);
proxy.setGuestIpAddress(guestIpAddress); proxy.setGuestIpAddress(guestIpAddress);
_consoleProxyDao.updateIf(proxy, VirtualMachine.Event.OperationRetry, routingHost.getId()); _itMgr.stateTransitTo(proxy, VirtualMachine.Event.OperationRetry, routingHost.getId());
proxy = _consoleProxyDao.findById(proxy.getId()); proxy = _consoleProxyDao.findById(proxy.getId());
List<VolumeVO> vols = _storageMgr.prepare(proxy, routingHost); List<VolumeVO> vols = _storageMgr.prepare(proxy, routingHost);
@ -768,7 +768,7 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, ConsoleProx
throw new ExecutionException("Couldn't find a routingHost to run console proxy"); throw new ExecutionException("Couldn't find a routingHost to run console proxy");
} }
_consoleProxyDao.updateIf(proxy, VirtualMachine.Event.OperationSucceeded, routingHost.getId()); _itMgr.stateTransitTo(proxy, VirtualMachine.Event.OperationSucceeded, routingHost.getId());
if (s_logger.isDebugEnabled()) { if (s_logger.isDebugEnabled()) {
s_logger.debug("Console proxy is now started, vm id : " + proxy.getId()); s_logger.debug("Console proxy is now started, vm id : " + proxy.getId());
} }
@ -817,7 +817,7 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, ConsoleProx
freePrivateIpAddress(privateIpAddress, proxy.getDataCenterId(), proxy.getId()); freePrivateIpAddress(privateIpAddress, proxy.getDataCenterId(), proxy.getId());
} }
_consoleProxyDao.updateIf(proxy, VirtualMachine.Event.OperationFailed, null); _itMgr.stateTransitTo(proxy, VirtualMachine.Event.OperationFailed, null);
txn.commit(); txn.commit();
} catch (Exception e) { } catch (Exception e) {
s_logger.error("Caught exception during error recovery"); s_logger.error("Caught exception during error recovery");
@ -1120,7 +1120,7 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, ConsoleProx
_consoleProxyDao.update(proxy.getId(), vo); _consoleProxyDao.update(proxy.getId(), vo);
// kick the state machine // kick the state machine
_consoleProxyDao.updateIf(proxy, VirtualMachine.Event.OperationSucceeded, null); _itMgr.stateTransitTo(proxy, VirtualMachine.Event.OperationSucceeded, null);
txn.commit(); txn.commit();
return proxy; return proxy;
@ -1788,7 +1788,7 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, ConsoleProx
@Override @Override
public void completeStartCommand(ConsoleProxyVO vm) { public void completeStartCommand(ConsoleProxyVO vm) {
_consoleProxyDao.updateIf(vm, VirtualMachine.Event.AgentReportRunning, vm.getHostId()); _itMgr.stateTransitTo(vm, VirtualMachine.Event.AgentReportRunning, vm.getHostId());
} }
@Override @Override
@ -1812,7 +1812,7 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, ConsoleProx
_dcDao.releaseLinkLocalIpAddress(guestIpAddress, proxy.getDataCenterId(), proxy.getId()); _dcDao.releaseLinkLocalIpAddress(guestIpAddress, proxy.getDataCenterId(), proxy.getId());
} }
if (!_consoleProxyDao.updateIf(proxy, ev, null)) { if (!_itMgr.stateTransitTo(proxy, ev, null)) {
s_logger.debug("Unable to update the console proxy"); s_logger.debug("Unable to update the console proxy");
return; return;
} }
@ -1969,7 +1969,7 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, ConsoleProx
s_logger.debug("Destroying console proxy vm " + vmId); s_logger.debug("Destroying console proxy vm " + vmId);
} }
if (!_consoleProxyDao.updateIf(vm, VirtualMachine.Event.DestroyRequested, null)) { if (!_itMgr.stateTransitTo(vm, VirtualMachine.Event.DestroyRequested, null)) {
s_logger.debug("Unable to destroy the vm because it is not in the correct state: " + vmId); s_logger.debug("Unable to destroy the vm because it is not in the correct state: " + vmId);
return false; return false;
} }
@ -2050,7 +2050,7 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, ConsoleProx
@Override @Override
public boolean stop(ConsoleProxyVO proxy, long startEventId) throws AgentUnavailableException { public boolean stop(ConsoleProxyVO proxy, long startEventId) throws AgentUnavailableException {
if (!_consoleProxyDao.updateIf(proxy, VirtualMachine.Event.StopRequested, proxy.getHostId())) { if (!_itMgr.stateTransitTo(proxy, VirtualMachine.Event.StopRequested, proxy.getHostId())) {
s_logger.debug("Unable to stop console proxy: " + proxy.toString()); s_logger.debug("Unable to stop console proxy: " + proxy.toString());
return false; return false;
} }
@ -2129,7 +2129,7 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, ConsoleProx
public boolean migrate(ConsoleProxyVO proxy, HostVO host) { public boolean migrate(ConsoleProxyVO proxy, HostVO host) {
HostVO fromHost = _hostDao.findById(proxy.getId()); HostVO fromHost = _hostDao.findById(proxy.getId());
if (!_consoleProxyDao.updateIf(proxy, VirtualMachine.Event.MigrationRequested, proxy.getHostId())) { if (! _itMgr.stateTransitTo(proxy, VirtualMachine.Event.MigrationRequested, proxy.getHostId())) {
s_logger.debug("State for " + proxy.toString() + " has changed so migration can not take place."); s_logger.debug("State for " + proxy.toString() + " has changed so migration can not take place.");
return false; return false;
} }
@ -2152,18 +2152,18 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, ConsoleProx
CheckVirtualMachineAnswer answer = (CheckVirtualMachineAnswer) _agentMgr.send(host.getId(), cvm); CheckVirtualMachineAnswer answer = (CheckVirtualMachineAnswer) _agentMgr.send(host.getId(), cvm);
if (!answer.getResult()) { if (!answer.getResult()) {
s_logger.debug("Unable to complete migration for " + proxy.getId()); s_logger.debug("Unable to complete migration for " + proxy.getId());
_consoleProxyDao.updateIf(proxy, VirtualMachine.Event.AgentReportStopped, null); _itMgr.stateTransitTo(proxy, VirtualMachine.Event.AgentReportStopped, null);
return false; return false;
} }
State state = answer.getState(); State state = answer.getState();
if (state == State.Stopped) { if (state == State.Stopped) {
s_logger.warn("Unable to complete migration as we can not detect it on " + host.getId()); s_logger.warn("Unable to complete migration as we can not detect it on " + host.getId());
_consoleProxyDao.updateIf(proxy, VirtualMachine.Event.AgentReportStopped, null); _itMgr.stateTransitTo(proxy, VirtualMachine.Event.AgentReportStopped, null);
return false; return false;
} }
_consoleProxyDao.updateIf(proxy, VirtualMachine.Event.OperationSucceeded, host.getId()); _itMgr.stateTransitTo(proxy, VirtualMachine.Event.OperationSucceeded, host.getId());
return true; return true;
} }

View File

@ -1,5 +1,6 @@
package com.cloud.deploy; package com.cloud.deploy;
import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
@ -15,12 +16,20 @@ import com.cloud.dc.dao.ClusterDao;
import com.cloud.dc.dao.DataCenterDao; import com.cloud.dc.dao.DataCenterDao;
import com.cloud.dc.dao.HostPodDao; import com.cloud.dc.dao.HostPodDao;
import com.cloud.exception.InsufficientServerCapacityException; import com.cloud.exception.InsufficientServerCapacityException;
import com.cloud.host.DetailVO;
import com.cloud.host.Host; import com.cloud.host.Host;
import com.cloud.host.HostVO; import com.cloud.host.HostVO;
import com.cloud.host.Status; import com.cloud.host.Status;
import com.cloud.host.dao.DetailsDao;
import com.cloud.host.dao.HostDao; import com.cloud.host.dao.HostDao;
import com.cloud.offering.ServiceOffering; import com.cloud.offering.ServiceOffering;
import com.cloud.org.Cluster; import com.cloud.org.Cluster;
import com.cloud.storage.GuestOSCategoryVO;
import com.cloud.storage.GuestOSVO;
import com.cloud.storage.VMTemplateVO;
import com.cloud.storage.dao.GuestOSCategoryDao;
import com.cloud.storage.dao.GuestOSDao;
import com.cloud.template.VirtualMachineTemplate;
import com.cloud.utils.component.Inject; import com.cloud.utils.component.Inject;
import com.cloud.utils.db.DB; import com.cloud.utils.db.DB;
import com.cloud.utils.db.Transaction; import com.cloud.utils.db.Transaction;
@ -33,6 +42,9 @@ public class FirstFitPlanner extends PlannerBase implements DeploymentPlanner {
@Inject private DataCenterDao _dcDao; @Inject private DataCenterDao _dcDao;
@Inject private HostPodDao _podDao; @Inject private HostPodDao _podDao;
@Inject private ClusterDao _clusterDao; @Inject private ClusterDao _clusterDao;
@Inject DetailsDao _hostDetailsDao = null;
@Inject GuestOSDao _guestOSDao = null;
@Inject GuestOSCategoryDao _guestOSCategoryDao = null;
@Override @Override
public DeployDestination plan(VirtualMachineProfile vmProfile, public DeployDestination plan(VirtualMachineProfile vmProfile,
@ -42,13 +54,13 @@ public class FirstFitPlanner extends PlannerBase implements DeploymentPlanner {
ServiceOffering offering = vmProfile.getServiceOffering(); ServiceOffering offering = vmProfile.getServiceOffering();
DataCenter dc = _dcDao.findById(vm.getDataCenterId()); DataCenter dc = _dcDao.findById(vm.getDataCenterId());
int cpu_requested = offering.getCpu() * offering.getSpeed(); int cpu_requested = offering.getCpu() * offering.getSpeed();
int ram_requested = offering.getRamSize(); long ram_requested = offering.getRamSize() * 1024L * 1024L;
if (vm.getLastHostId() != null) { if (vm.getLastHostId() != null) {
HostVO host = _hostDao.findById(vm.getLastHostId()); HostVO host = _hostDao.findById(vm.getLastHostId());
if (host.getStatus() == Status.Up) { if (host.getStatus() == Status.Up) {
boolean canDepployToLastHost = deployToHost(vm.getLastHostId(), cpu_requested, ram_requested, true); boolean canDepployToLastHost = deployToHost(host, cpu_requested, ram_requested, true, avoid);
if (canDepployToLastHost) { if (canDepployToLastHost) {
Pod pod = _podDao.findById(vm.getPodId()); Pod pod = _podDao.findById(vm.getPodId());
Cluster cluster = _clusterDao.findById(host.getClusterId()); Cluster cluster = _clusterDao.findById(host.getClusterId());
@ -58,12 +70,25 @@ public class FirstFitPlanner extends PlannerBase implements DeploymentPlanner {
} }
/*Go through all the pods/clusters under zone*/ /*Go through all the pods/clusters under zone*/
List<HostPodVO> pods = _podDao.listByDataCenterId(plan.getDataCenterId()); List<HostPodVO> pods;
if (plan.getPodId() != null) {
pods = new ArrayList<HostPodVO>(1);
pods.add(_podDao.findById(plan.getPodId()));
} else {
pods = _podDao.listByDataCenterId(plan.getDataCenterId());
}
//Collections.shuffle(pods); //Collections.shuffle(pods);
for (HostPodVO hostPod : pods) { for (HostPodVO hostPod : pods) {
List<ClusterVO> clusters = _clusterDao.listByPodId(hostPod.getId());
//Collections.shuffle(clusters); //Collections.shuffle(clusters);
List<ClusterVO> clusters;
if (plan.getClusterId() != null) {
clusters = new ArrayList<ClusterVO>(1);
clusters.add(_clusterDao.findById(plan.getClusterId()));
} else {
clusters = _clusterDao.listByPodId(hostPod.getId());
}
for (ClusterVO clusterVO : clusters) { for (ClusterVO clusterVO : clusters) {
@ -71,20 +96,15 @@ public class FirstFitPlanner extends PlannerBase implements DeploymentPlanner {
continue; continue;
} }
List<HostVO> hosts = _hostDao.listByCluster(clusterVO.getId()); List<HostVO> hosts = _hostDao.listBy(Host.Type.Routing, clusterVO.getId(), hostPod.getId(), dc.getId());
//Collections.shuffle(hosts); //Collections.shuffle(hosts);
// We will try to reorder the host lists such that we give priority to hosts that have
// the minimums to support a VM's requirements
hosts = prioritizeHosts(vmProfile.getTemplate(), hosts);
for (HostVO hostVO : hosts) { for (HostVO hostVO : hosts) {
if (hostVO.getStatus() != Status.Up) { boolean canDeployToHost = deployToHost(hostVO, cpu_requested, ram_requested, false, avoid);
continue;
}
if (avoid.shouldAvoid(hostVO)) {
continue;
}
boolean canDeployToHost = deployToHost(hostVO.getId(), cpu_requested, ram_requested, false);
if (canDeployToHost) { if (canDeployToHost) {
Pod pod = _podDao.findById(hostPod.getId()); Pod pod = _podDao.findById(hostPod.getId());
Cluster cluster = _clusterDao.findById(clusterVO.getId()); Cluster cluster = _clusterDao.findById(clusterVO.getId());
@ -107,10 +127,13 @@ public class FirstFitPlanner extends PlannerBase implements DeploymentPlanner {
} }
@DB @DB
protected boolean deployToHost(Long hostId, Integer cpu, long ram, boolean fromLastHost) { protected boolean deployToHost(HostVO host, Integer cpu, long ram, boolean fromLastHost, ExcludeList avoid) {
if (avoid.shouldAvoid(host)) {
CapacityVO capacityCpu = _capacityDao.findByHostIdType(hostId, CapacityVO.CAPACITY_TYPE_CPU); return false;
CapacityVO capacityMem = _capacityDao.findByHostIdType(hostId, CapacityVO.CAPACITY_TYPE_MEMORY); }
CapacityVO capacityCpu = _capacityDao.findByHostIdType(host.getId(), CapacityVO.CAPACITY_TYPE_CPU);
CapacityVO capacityMem = _capacityDao.findByHostIdType(host.getId(), CapacityVO.CAPACITY_TYPE_MEMORY);
Transaction txn = Transaction.currentTxn(); Transaction txn = Transaction.currentTxn();
@ -158,4 +181,109 @@ public class FirstFitPlanner extends PlannerBase implements DeploymentPlanner {
} }
} }
protected List<HostVO> prioritizeHosts(VirtualMachineTemplate template, List<HostVO> hosts) {
if (template == null) {
return hosts;
}
// Determine the guest OS category of the template
String templateGuestOSCategory = getTemplateGuestOSCategory(template);
List<HostVO> prioritizedHosts = new ArrayList<HostVO>();
// If a template requires HVM and a host doesn't support HVM, remove it from consideration
List<HostVO> hostsToCheck = new ArrayList<HostVO>();
if (template.isRequiresHvm()) {
for (HostVO host : hosts) {
if (hostSupportsHVM(host)) {
hostsToCheck.add(host);
}
}
} else {
hostsToCheck.addAll(hosts);
}
// If a host is tagged with the same guest OS category as the template, move it to a high priority list
// If a host is tagged with a different guest OS category than the template, move it to a low priority list
List<HostVO> highPriorityHosts = new ArrayList<HostVO>();
List<HostVO> lowPriorityHosts = new ArrayList<HostVO>();
for (HostVO host : hostsToCheck) {
String hostGuestOSCategory = getHostGuestOSCategory(host);
if (hostGuestOSCategory == null) {
continue;
} else if (templateGuestOSCategory.equals(hostGuestOSCategory)) {
highPriorityHosts.add(host);
} else {
lowPriorityHosts.add(host);
}
}
hostsToCheck.removeAll(highPriorityHosts);
hostsToCheck.removeAll(lowPriorityHosts);
// Prioritize the remaining hosts by HVM capability
for (HostVO host : hostsToCheck) {
if (!template.isRequiresHvm() && !hostSupportsHVM(host)) {
// Host and template both do not support hvm, put it as first consideration
prioritizedHosts.add(0, host);
} else {
// Template doesn't require hvm, but the machine supports it, make it last for consideration
prioritizedHosts.add(host);
}
}
// Merge the lists
prioritizedHosts.addAll(0, highPriorityHosts);
prioritizedHosts.addAll(lowPriorityHosts);
return prioritizedHosts;
}
protected boolean hostSupportsHVM(HostVO host) {
// Determine host capabilities
String caps = host.getCapabilities();
if (caps != null) {
String[] tokens = caps.split(",");
for (String token : tokens) {
if (token.contains("hvm")) {
return true;
}
}
}
return false;
}
protected String getHostGuestOSCategory(HostVO host) {
DetailVO hostDetail = _hostDetailsDao.findDetail(host.getId(), "guest.os.category.id");
if (hostDetail != null) {
String guestOSCategoryIdString = hostDetail.getValue();
long guestOSCategoryId;
try {
guestOSCategoryId = Long.parseLong(guestOSCategoryIdString);
} catch (Exception e) {
return null;
}
GuestOSCategoryVO guestOSCategory = _guestOSCategoryDao.findById(guestOSCategoryId);
if (guestOSCategory != null) {
return guestOSCategory.getName();
} else {
return null;
}
} else {
return null;
}
}
protected String getTemplateGuestOSCategory(VirtualMachineTemplate template) {
long guestOSId = template.getGuestOSId();
GuestOSVO guestOS = _guestOSDao.findById(guestOSId);
long guestOSCategoryId = guestOS.getCategoryId();
GuestOSCategoryVO guestOSCategory = _guestOSCategoryDao.findById(guestOSCategoryId);
return guestOSCategory.getName();
}
} }

View File

@ -381,7 +381,7 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute
_eventDao.persist(event); _eventDao.persist(event);
throw new ExecutionException("Unable to create DHCP Server"); throw new ExecutionException("Unable to create DHCP Server");
} }
_routerDao.updateIf(router, VirtualMachine.Event.OperationSucceeded, null); _itMgr.stateTransitTo(router, VirtualMachine.Event.OperationSucceeded, null);
s_logger.info("DHCP server created: id=" + router.getId() + "; name=" + router.getHostName() + "; vlan=" + guestVlan.getVlanId() + "; pod=" + pod.getName()); s_logger.info("DHCP server created: id=" + router.getId() + "; name=" + router.getHostName() + "; vlan=" + guestVlan.getVlanId() + "; pod=" + pod.getName());
@ -551,7 +551,7 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute
_eventDao.persist(event); _eventDao.persist(event);
throw new ExecutionException("Unable to create DomainRouter"); throw new ExecutionException("Unable to create DomainRouter");
} }
_routerDao.updateIf(router, VirtualMachine.Event.OperationSucceeded, null); _itMgr.stateTransitTo(router, VirtualMachine.Event.OperationSucceeded, null);
s_logger.debug("Router created: id=" + router.getId() + "; name=" + router.getHostName()); s_logger.debug("Router created: id=" + router.getId() + "; name=" + router.getHostName());
@ -632,7 +632,7 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute
return false; return false;
} }
router = _routerDao.findById(routerId); router = _routerDao.findById(routerId);
if (!_routerDao.updateIf(router, VirtualMachine.Event.DestroyRequested, router.getHostId())) { if (! _itMgr.stateTransitTo(router, VirtualMachine.Event.DestroyRequested, router.getHostId())) {
s_logger.debug("VM " + router.toString() + " is not in a state to be destroyed."); s_logger.debug("VM " + router.toString() + " is not in a state to be destroyed.");
return false; return false;
} }
@ -855,7 +855,7 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute
return null; return null;
} }
if (!_routerDao.updateIf(router, VirtualMachine.Event.StartRequested, routingHost.getId())) { if (! _itMgr.stateTransitTo(router, VirtualMachine.Event.StartRequested, routingHost.getId())) {
s_logger.debug("Unable to start router " + router.toString() + " because it is not in a startable state"); s_logger.debug("Unable to start router " + router.toString() + " because it is not in a startable state");
throw new ConcurrentOperationException("Someone else is starting the router: " + router.toString()); throw new ConcurrentOperationException("Someone else is starting the router: " + router.toString());
} }
@ -964,7 +964,7 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute
} }
router.setDomain(networkDomain); router.setDomain(networkDomain);
_routerDao.updateIf(router, VirtualMachine.Event.OperationRetry, routingHost.getId()); _itMgr.stateTransitTo(router, VirtualMachine.Event.OperationRetry, routingHost.getId());
List<VolumeVO> vols = _storageMgr.prepare(router, routingHost); List<VolumeVO> vols = _storageMgr.prepare(router, routingHost);
if (vols == null) { if (vols == null) {
@ -1047,7 +1047,7 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute
throw new ExecutionException("Couldn't find a routingHost"); throw new ExecutionException("Couldn't find a routingHost");
} }
_routerDao.updateIf(router, VirtualMachine.Event.OperationSucceeded, routingHost.getId()); _itMgr.stateTransitTo(router, VirtualMachine.Event.OperationSucceeded, routingHost.getId());
if (s_logger.isDebugEnabled()) { if (s_logger.isDebugEnabled()) {
s_logger.debug("Router " + router.toString() + " is now started on " + routingHost.toString()); s_logger.debug("Router " + router.toString() + " is now started on " + routingHost.toString());
} }
@ -1088,7 +1088,7 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute
} }
if (_routerDao.updateIf(router, VirtualMachine.Event.OperationFailed, null)) { if ( _itMgr.stateTransitTo(router, VirtualMachine.Event.OperationFailed, null)) {
txn.commit(); txn.commit();
} }
@ -1570,7 +1570,7 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute
@Override @Override
public void completeStartCommand(final DomainRouterVO router) { public void completeStartCommand(final DomainRouterVO router) {
_routerDao.updateIf(router, VirtualMachine.Event.AgentReportRunning, router.getHostId()); _itMgr.stateTransitTo(router, VirtualMachine.Event.AgentReportRunning, router.getHostId());
} }
@Override @Override
@ -1602,7 +1602,7 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute
} }
router.setPrivateIpAddress(null); router.setPrivateIpAddress(null);
if (!_routerDao.updateIf(router, ev, null)) { if (! _itMgr.stateTransitTo(router, ev, null)) {
s_logger.debug("Router is not updated"); s_logger.debug("Router is not updated");
return; return;
} }
@ -1699,7 +1699,7 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute
event.setType(EventTypes.EVENT_ROUTER_STOP); event.setType(EventTypes.EVENT_ROUTER_STOP);
event.setStartId(eventId); event.setStartId(eventId);
if (!_routerDao.updateIf(router, VirtualMachine.Event.StopRequested, hostId)) { if (! _itMgr.stateTransitTo(router, VirtualMachine.Event.StopRequested, hostId)) {
s_logger.debug("VM " + router.toString() + " is not in a state to be stopped."); s_logger.debug("VM " + router.toString() + " is not in a state to be stopped.");
return false; return false;
} }
@ -1734,7 +1734,7 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute
event.setDescription("failed to stop Domain Router : " + router.getHostName()); event.setDescription("failed to stop Domain Router : " + router.getHostName());
event.setLevel(EventVO.LEVEL_ERROR); event.setLevel(EventVO.LEVEL_ERROR);
_eventDao.persist(event); _eventDao.persist(event);
_routerDao.updateIf(router, VirtualMachine.Event.OperationFailed, router.getHostId()); _itMgr.stateTransitTo(router, VirtualMachine.Event.OperationFailed, router.getHostId());
return false; return false;
} }
@ -1811,7 +1811,7 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute
public boolean migrate(final DomainRouterVO router, final HostVO host) { public boolean migrate(final DomainRouterVO router, final HostVO host) {
final HostVO fromHost = _hostDao.findById(router.getHostId()); final HostVO fromHost = _hostDao.findById(router.getHostId());
if (!_routerDao.updateIf(router, VirtualMachine.Event.MigrationRequested, router.getHostId())) { if (! _itMgr.stateTransitTo(router, VirtualMachine.Event.MigrationRequested, router.getHostId())) {
s_logger.debug("State for " + router.toString() + " has changed so migration can not take place."); s_logger.debug("State for " + router.toString() + " has changed so migration can not take place.");
return false; return false;
} }
@ -1838,18 +1838,18 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute
final CheckVirtualMachineAnswer answer = (CheckVirtualMachineAnswer)_agentMgr.send(host.getId(), cvm); final CheckVirtualMachineAnswer answer = (CheckVirtualMachineAnswer)_agentMgr.send(host.getId(), cvm);
if (answer == null || !answer.getResult()) { if (answer == null || !answer.getResult()) {
s_logger.debug("Unable to complete migration for " + router.getId()); s_logger.debug("Unable to complete migration for " + router.getId());
_routerDao.updateIf(router, VirtualMachine.Event.AgentReportStopped, null); _itMgr.stateTransitTo(router, VirtualMachine.Event.AgentReportStopped, null);
return false; return false;
} }
final State state = answer.getState(); final State state = answer.getState();
if (state == State.Stopped) { if (state == State.Stopped) {
s_logger.warn("Unable to complete migration as we can not detect it on " + host.getId()); s_logger.warn("Unable to complete migration as we can not detect it on " + host.getId());
_routerDao.updateIf(router, VirtualMachine.Event.AgentReportStopped, null); _itMgr.stateTransitTo(router, VirtualMachine.Event.AgentReportStopped, null);
return false; return false;
} }
_routerDao.updateIf(router, VirtualMachine.Event.OperationSucceeded, host.getId()); _itMgr.stateTransitTo(router, VirtualMachine.Event.OperationSucceeded, host.getId());
return true; return true;
} }

View File

@ -356,7 +356,7 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V
} }
} }
// to ensure atomic state transition to Starting state // to ensure atomic state transition to Starting state
if (!_secStorageVmDao.updateIf(secStorageVm, VirtualMachine.Event.StartRequested, routingHost.getId())) { if (! _itMgr.stateTransitTo(secStorageVm, VirtualMachine.Event.StartRequested, routingHost.getId())) {
if (s_logger.isDebugEnabled()) { if (s_logger.isDebugEnabled()) {
SecondaryStorageVmVO temp = _secStorageVmDao.findById(secStorageVmId); SecondaryStorageVmVO temp = _secStorageVmDao.findById(secStorageVmId);
s_logger.debug("Unable to start secondary storage vm " s_logger.debug("Unable to start secondary storage vm "
@ -391,7 +391,7 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V
secStorageVm.setPrivateIpAddress(privateIpAddress); secStorageVm.setPrivateIpAddress(privateIpAddress);
String guestIpAddress = _dcDao.allocateLinkLocalIpAddress(secStorageVm.getDataCenterId(), routingHost.getPodId(), secStorageVm.getId(), null); String guestIpAddress = _dcDao.allocateLinkLocalIpAddress(secStorageVm.getDataCenterId(), routingHost.getPodId(), secStorageVm.getId(), null);
secStorageVm.setGuestIpAddress(guestIpAddress); secStorageVm.setGuestIpAddress(guestIpAddress);
_secStorageVmDao.updateIf(secStorageVm, VirtualMachine.Event.OperationRetry, routingHost.getId()); _itMgr.stateTransitTo(secStorageVm, VirtualMachine.Event.OperationRetry, routingHost.getId());
secStorageVm = _secStorageVmDao.findById(secStorageVm.getId()); secStorageVm = _secStorageVmDao.findById(secStorageVm.getId());
List<VolumeVO> vols = _storageMgr.prepare(secStorageVm, routingHost); List<VolumeVO> vols = _storageMgr.prepare(secStorageVm, routingHost);
@ -504,7 +504,7 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V
"Couldn't find a routingHost to run secondary storage vm"); "Couldn't find a routingHost to run secondary storage vm");
} }
_secStorageVmDao.updateIf(secStorageVm, VirtualMachine.Event.OperationSucceeded, routingHost.getId()); _itMgr.stateTransitTo(secStorageVm, VirtualMachine.Event.OperationSucceeded, routingHost.getId());
if (s_logger.isDebugEnabled()) { if (s_logger.isDebugEnabled()) {
s_logger.debug("Secondary storage vm is now started, vm id : " + secStorageVm.getId()); s_logger.debug("Secondary storage vm is now started, vm id : " + secStorageVm.getId());
} }
@ -544,7 +544,7 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V
secStorageVm.setPrivateIpAddress(null); secStorageVm.setPrivateIpAddress(null);
freePrivateIpAddress(privateIpAddress, secStorageVm.getDataCenterId(), secStorageVm.getId()); freePrivateIpAddress(privateIpAddress, secStorageVm.getDataCenterId(), secStorageVm.getId());
} }
_secStorageVmDao.updateIf(secStorageVm, VirtualMachine.Event.OperationFailed, null); _itMgr.stateTransitTo(secStorageVm, VirtualMachine.Event.OperationFailed, null);
txn.commit(); txn.commit();
} catch (Exception e) { } catch (Exception e) {
s_logger.error("Caught exception during error recovery"); s_logger.error("Caught exception during error recovery");
@ -885,7 +885,7 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V
} }
// kick the state machine // kick the state machine
_secStorageVmDao.updateIf(secStorageVm, VirtualMachine.Event.OperationSucceeded, null); _itMgr.stateTransitTo(secStorageVm, VirtualMachine.Event.OperationSucceeded, null);
return secStorageVm; return secStorageVm;
} catch (StorageUnavailableException e) { } catch (StorageUnavailableException e) {
s_logger.error("Unable to alloc storage for secondary storage vm: ", e); s_logger.error("Unable to alloc storage for secondary storage vm: ", e);
@ -1502,7 +1502,7 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V
@Override @Override
public void completeStartCommand(SecondaryStorageVmVO vm) { public void completeStartCommand(SecondaryStorageVmVO vm) {
_secStorageVmDao.updateIf(vm, VirtualMachine.Event.AgentReportRunning, vm.getHostId()); _itMgr.stateTransitTo(vm, VirtualMachine.Event.AgentReportRunning, vm.getHostId());
} }
@Override @Override
@ -1525,7 +1525,7 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V
secStorageVm.setGuestIpAddress(null); secStorageVm.setGuestIpAddress(null);
_dcDao.releaseLinkLocalIpAddress(guestIpAddress, secStorageVm.getDataCenterId(), secStorageVm.getId()); _dcDao.releaseLinkLocalIpAddress(guestIpAddress, secStorageVm.getDataCenterId(), secStorageVm.getId());
} }
if (!_secStorageVmDao.updateIf(secStorageVm, ev, null)) { if (! _itMgr.stateTransitTo(secStorageVm, ev, null)) {
s_logger.debug("Unable to update the secondary storage vm"); s_logger.debug("Unable to update the secondary storage vm");
return; return;
} }
@ -1681,7 +1681,7 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V
s_logger.debug("Destroying secondary storage vm vm " + vmId); s_logger.debug("Destroying secondary storage vm vm " + vmId);
} }
if (!_secStorageVmDao.updateIf(vm, VirtualMachine.Event.DestroyRequested, null)) { if (! _itMgr.stateTransitTo(vm, VirtualMachine.Event.DestroyRequested, null)) {
String msg = "Unable to destroy the vm because it is not in the correct state: " + vmId; String msg = "Unable to destroy the vm because it is not in the correct state: " + vmId;
s_logger.debug(msg); s_logger.debug(msg);
saveFailedEvent(User.UID_SYSTEM, Account.ACCOUNT_ID_SYSTEM, EventTypes.EVENT_SSVM_DESTROY, msg, startEventId); saveFailedEvent(User.UID_SYSTEM, Account.ACCOUNT_ID_SYSTEM, EventTypes.EVENT_SSVM_DESTROY, msg, startEventId);
@ -1762,7 +1762,7 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V
@Override @Override
public boolean stop(SecondaryStorageVmVO secStorageVm, long startEventId) throws AgentUnavailableException { public boolean stop(SecondaryStorageVmVO secStorageVm, long startEventId) throws AgentUnavailableException {
if (!_secStorageVmDao.updateIf(secStorageVm, VirtualMachine.Event.StopRequested, secStorageVm.getHostId())) { if (! _itMgr.stateTransitTo(secStorageVm, VirtualMachine.Event.StopRequested, secStorageVm.getHostId())) {
String msg = "Unable to stop secondary storage vm: " + secStorageVm.toString(); String msg = "Unable to stop secondary storage vm: " + secStorageVm.toString();
s_logger.debug(msg); s_logger.debug(msg);
saveFailedEvent(User.UID_SYSTEM, Account.ACCOUNT_ID_SYSTEM, EventTypes.EVENT_SSVM_STOP, msg, startEventId); saveFailedEvent(User.UID_SYSTEM, Account.ACCOUNT_ID_SYSTEM, EventTypes.EVENT_SSVM_STOP, msg, startEventId);
@ -1834,7 +1834,7 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V
public boolean migrate(SecondaryStorageVmVO secStorageVm, HostVO host) { public boolean migrate(SecondaryStorageVmVO secStorageVm, HostVO host) {
HostVO fromHost = _hostDao.findById(secStorageVm.getId()); HostVO fromHost = _hostDao.findById(secStorageVm.getId());
if (!_secStorageVmDao.updateIf(secStorageVm, VirtualMachine.Event.MigrationRequested, secStorageVm.getHostId())) { if (! _itMgr.stateTransitTo(secStorageVm, VirtualMachine.Event.MigrationRequested, secStorageVm.getHostId())) {
s_logger.debug("State for " + secStorageVm.toString() + " has changed so migration can not take place."); s_logger.debug("State for " + secStorageVm.toString() + " has changed so migration can not take place.");
return false; return false;
} }
@ -1857,18 +1857,18 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V
CheckVirtualMachineAnswer answer = (CheckVirtualMachineAnswer) _agentMgr.send(host.getId(), cvm); CheckVirtualMachineAnswer answer = (CheckVirtualMachineAnswer) _agentMgr.send(host.getId(), cvm);
if (!answer.getResult()) { if (!answer.getResult()) {
s_logger.debug("Unable to complete migration for " + secStorageVm.getId()); s_logger.debug("Unable to complete migration for " + secStorageVm.getId());
_secStorageVmDao.updateIf(secStorageVm, VirtualMachine.Event.AgentReportStopped, null); _itMgr.stateTransitTo(secStorageVm, VirtualMachine.Event.AgentReportStopped, null);
return false; return false;
} }
State state = answer.getState(); State state = answer.getState();
if (state == State.Stopped) { if (state == State.Stopped) {
s_logger.warn("Unable to complete migration as we can not detect it on " + host.getId()); s_logger.warn("Unable to complete migration as we can not detect it on " + host.getId());
_secStorageVmDao.updateIf(secStorageVm, VirtualMachine.Event.AgentReportStopped, null); _itMgr.stateTransitTo(secStorageVm, VirtualMachine.Event.AgentReportStopped, null);
return false; return false;
} }
_secStorageVmDao.updateIf(secStorageVm, VirtualMachine.Event.OperationSucceeded, host.getId()); _itMgr.stateTransitTo(secStorageVm, VirtualMachine.Event.OperationSucceeded, host.getId());
return true; return true;
} }

View File

@ -19,6 +19,7 @@ package com.cloud.vm;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.UUID; import java.util.UUID;
@ -31,6 +32,7 @@ import org.apache.log4j.Logger;
import com.cloud.agent.AgentManager; import com.cloud.agent.AgentManager;
import com.cloud.agent.AgentManager.OnError; import com.cloud.agent.AgentManager.OnError;
import com.cloud.agent.api.Answer; import com.cloud.agent.api.Answer;
import com.cloud.agent.api.PrepareForMigrationCommand;
import com.cloud.agent.api.Start2Command; import com.cloud.agent.api.Start2Command;
import com.cloud.agent.api.StopAnswer; import com.cloud.agent.api.StopAnswer;
import com.cloud.agent.api.StopCommand; import com.cloud.agent.api.StopCommand;
@ -43,6 +45,8 @@ import com.cloud.cluster.ManagementServerHostVO;
import com.cloud.configuration.Config; import com.cloud.configuration.Config;
import com.cloud.configuration.dao.ConfigurationDao; import com.cloud.configuration.dao.ConfigurationDao;
import com.cloud.dc.DataCenter; import com.cloud.dc.DataCenter;
import com.cloud.dc.DataCenterVO;
import com.cloud.dc.HostPodVO;
import com.cloud.deploy.DataCenterDeployment; import com.cloud.deploy.DataCenterDeployment;
import com.cloud.deploy.DeployDestination; import com.cloud.deploy.DeployDestination;
import com.cloud.deploy.DeploymentPlan; import com.cloud.deploy.DeploymentPlan;
@ -58,6 +62,8 @@ import com.cloud.exception.InsufficientServerCapacityException;
import com.cloud.exception.OperationTimedoutException; import com.cloud.exception.OperationTimedoutException;
import com.cloud.exception.ResourceUnavailableException; import com.cloud.exception.ResourceUnavailableException;
import com.cloud.exception.StorageUnavailableException; import com.cloud.exception.StorageUnavailableException;
import com.cloud.host.Host;
import com.cloud.host.HostVO;
import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.hypervisor.Hypervisor.HypervisorType;
import com.cloud.hypervisor.HypervisorGuru; import com.cloud.hypervisor.HypervisorGuru;
import com.cloud.network.NetworkVO; import com.cloud.network.NetworkVO;
@ -67,7 +73,9 @@ import com.cloud.service.dao.ServiceOfferingDao;
import com.cloud.storage.DiskOfferingVO; import com.cloud.storage.DiskOfferingVO;
import com.cloud.storage.Storage.ImageFormat; import com.cloud.storage.Storage.ImageFormat;
import com.cloud.storage.StorageManager; import com.cloud.storage.StorageManager;
import com.cloud.storage.StoragePoolVO;
import com.cloud.storage.VMTemplateVO; import com.cloud.storage.VMTemplateVO;
import com.cloud.storage.VolumeVO;
import com.cloud.storage.Volume.VolumeType; import com.cloud.storage.Volume.VolumeType;
import com.cloud.storage.dao.VMTemplateDao; import com.cloud.storage.dao.VMTemplateDao;
import com.cloud.user.Account; import com.cloud.user.Account;

View File

@ -896,7 +896,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, VirtualM
StoragePoolVO sp = _storageMgr.getStoragePoolForVm(vm.getId()); StoragePoolVO sp = _storageMgr.getStoragePoolForVm(vm.getId());
VMTemplateVO template = _templateDao.findById(vm.getTemplateId()); VMTemplateVO template = _templateDao.findById(vm.getTemplateId());
ServiceOffering offering = _offeringDao.findById(vm.getServiceOfferingId()); ServiceOfferingVO offering = _offeringDao.findById(vm.getServiceOfferingId());
// If an ISO path is passed in, boot from that ISO // If an ISO path is passed in, boot from that ISO
// Else, check if the VM already has an ISO attached to it. If so, start the VM with that ISO inserted, but don't boot from it. // Else, check if the VM already has an ISO attached to it. If so, start the VM with that ISO inserted, but don't boot from it.
@ -945,7 +945,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, VirtualM
return null; return null;
} }
if (!_vmDao.updateIf(vm, VirtualMachine.Event.StartRequested, host.getId())) { if (!_itMgr.stateTransitTo(vm, VirtualMachine.Event.StartRequested, host.getId())) {
String description = "Unable to start VM " + vm.toString() + " because the state is not correct."; String description = "Unable to start VM " + vm.toString() + " because the state is not correct.";
s_logger.error(description); s_logger.error(description);
event.setDescription(description); event.setDescription(description);
@ -965,7 +965,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, VirtualM
router = _networkMgr.addVirtualMachineToGuestNetwork(vm, password, startEventId); router = _networkMgr.addVirtualMachineToGuestNetwork(vm, password, startEventId);
if (router == null) { if (router == null) {
s_logger.error("Unable to add vm " + vm.getId() + " - " + vm.getHostName()); s_logger.error("Unable to add vm " + vm.getId() + " - " + vm.getHostName());
_vmDao.updateIf(vm, VirtualMachine.Event.OperationFailed, null); _itMgr.stateTransitTo(vm, VirtualMachine.Event.OperationFailed, null);
if(!vm.getHostName().equals(vm.getDisplayName())) { if(!vm.getHostName().equals(vm.getDisplayName())) {
event.setDescription("Unable to start VM: " + vm.getHostName()+"("+vm.getDisplayName()+")" + "; Unable to add VM to guest network"); event.setDescription("Unable to start VM: " + vm.getHostName()+"("+vm.getDisplayName()+")" + "; Unable to add VM to guest network");
} else { } else {
@ -1033,7 +1033,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, VirtualM
if( retry < _retry ) { if( retry < _retry ) {
if (!_vmDao.updateIf(vm, VirtualMachine.Event.OperationRetry, host.getId())) { if (!_itMgr.stateTransitTo(vm, VirtualMachine.Event.OperationRetry, host.getId())) {
String description = "Unable to start VM " + vm.toString() + " because the state is not correct."; String description = "Unable to start VM " + vm.toString() + " because the state is not correct.";
s_logger.debug(description); s_logger.debug(description);
event.setDescription(description); event.setDescription(description);
@ -1125,7 +1125,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, VirtualM
throw new ExecutionException("Unable to start VM: " + vm.getHostName()+ " Reason: "+answer.getDetails()); throw new ExecutionException("Unable to start VM: " + vm.getHostName()+ " Reason: "+answer.getDetails());
} }
if (!_vmDao.updateIf(vm, VirtualMachine.Event.OperationSucceeded, host.getId())) { if (!_itMgr.stateTransitTo(vm, VirtualMachine.Event.OperationSucceeded, host.getId())) {
if(!vm.getHostName().equals(vm.getDisplayName())) { if(!vm.getHostName().equals(vm.getDisplayName())) {
event.setDescription("unable to start VM: " + vm.getHostName()+"("+vm.getDisplayName()+")"); event.setDescription("unable to start VM: " + vm.getHostName()+"("+vm.getDisplayName()+")");
} else { } else {
@ -1158,7 +1158,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, VirtualM
vm.setVnet(null); vm.setVnet(null);
txn.start(); txn.start();
if (_vmDao.updateIf(vm, VirtualMachine.Event.OperationFailed, null)) { if (_itMgr.stateTransitTo(vm, VirtualMachine.Event.OperationFailed, null)) {
txn.commit(); txn.commit();
} }
} }
@ -1273,7 +1273,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, VirtualM
return response; return response;
} }
if (!_vmDao.updateIf(vm, VirtualMachine.Event.StopRequested, vm.getHostId())) { if (!_itMgr.stateTransitTo(vm, VirtualMachine.Event.StopRequested, vm.getHostId())) {
resultDescription = "VM is not in a state to stop"; resultDescription = "VM is not in a state to stop";
executor.getAsyncJobMgr().completeAsyncJob(executor.getJob().getId(), executor.getAsyncJobMgr().completeAsyncJob(executor.getJob().getId(),
AsyncJobResult.STATUS_FAILED, 0, resultDescription); AsyncJobResult.STATUS_FAILED, 0, resultDescription);
@ -1316,7 +1316,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, VirtualM
resultDescription = "Agent is not available"; resultDescription = "Agent is not available";
executor.getAsyncJobMgr().completeAsyncJob(executor.getJob().getId(), executor.getAsyncJobMgr().completeAsyncJob(executor.getJob().getId(),
AsyncJobResult.STATUS_FAILED, 0, resultDescription); AsyncJobResult.STATUS_FAILED, 0, resultDescription);
_vmDao.updateIf(vm, VirtualMachine.Event.OperationFailed, vm.getHostId()); _itMgr.stateTransitTo(vm, VirtualMachine.Event.OperationFailed, vm.getHostId());
response = new OperationResponse(OperationResponse.STATUS_FAILED, resultDescription); response = new OperationResponse(OperationResponse.STATUS_FAILED, resultDescription);
return response; return response;
@ -1663,7 +1663,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, VirtualM
vm = _vmDao.persist(vm); vm = _vmDao.persist(vm);
} else { } else {
vm.setPodId(pod.first().getId()); vm.setPodId(pod.first().getId());
_vmDao.updateIf(vm, VirtualMachine.Event.OperationRetry, null); _itMgr.stateTransitTo(vm, VirtualMachine.Event.OperationRetry, null);
} }
String ipAddressStr = acquireGuestIpAddress(dataCenterId, accountId, vm); String ipAddressStr = acquireGuestIpAddress(dataCenterId, accountId, vm);
@ -1715,7 +1715,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, VirtualM
_eventDao.persist(event); _eventDao.persist(event);
_vmDao.updateIf(vm, VirtualMachine.Event.OperationSucceeded, null); _itMgr.stateTransitTo(vm, VirtualMachine.Event.OperationSucceeded, null);
if (s_logger.isDebugEnabled()) { if (s_logger.isDebugEnabled()) {
s_logger.debug("vm created " + vmId); s_logger.debug("vm created " + vmId);
} }
@ -1876,7 +1876,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, VirtualM
_accountMgr.incrementResourceCount(account.getId(), ResourceType.user_vm); _accountMgr.incrementResourceCount(account.getId(), ResourceType.user_vm);
if (!_vmDao.updateIf(vm, VirtualMachine.Event.RecoveryRequested, null)) { if (!_itMgr.stateTransitTo(vm, VirtualMachine.Event.RecoveryRequested, null)) {
s_logger.debug("Unable to recover the vm because it is not in the correct state: " + vmId); s_logger.debug("Unable to recover the vm because it is not in the correct state: " + vmId);
throw new InvalidParameterValueException("Unable to recover the vm because it is not in the correct state: " + vmId); throw new InvalidParameterValueException("Unable to recover the vm because it is not in the correct state: " + vmId);
} }
@ -2010,7 +2010,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, VirtualM
@Override @Override
public void completeStartCommand(UserVmVO vm) { public void completeStartCommand(UserVmVO vm) {
_vmDao.updateIf(vm, VirtualMachine.Event.AgentReportRunning, vm.getHostId()); _itMgr.stateTransitTo(vm, VirtualMachine.Event.AgentReportRunning, vm.getHostId());
_networkGroupMgr.handleVmStateTransition(vm, State.Running); _networkGroupMgr.handleVmStateTransition(vm, State.Running);
} }
@ -2032,7 +2032,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, VirtualM
txn.start(); txn.start();
if (!_vmDao.updateIf(vm, e, null)) { if (!_itMgr.stateTransitTo(vm, e, null)) {
s_logger.debug("Unable to update "); s_logger.debug("Unable to update ");
return; return;
} }
@ -2111,7 +2111,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, VirtualM
return true; return true;
} }
if (!_vmDao.updateIf(vm, VirtualMachine.Event.StopRequested, vm.getHostId())) { if (!_itMgr.stateTransitTo(vm, VirtualMachine.Event.StopRequested, vm.getHostId())) {
s_logger.debug("VM is not in a state to stop: " + vm.getState().toString()); s_logger.debug("VM is not in a state to stop: " + vm.getState().toString());
return false; return false;
} }
@ -2155,7 +2155,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, VirtualM
} }
event.setLevel(EventVO.LEVEL_ERROR); event.setLevel(EventVO.LEVEL_ERROR);
_eventDao.persist(event); _eventDao.persist(event);
_vmDao.updateIf(vm, VirtualMachine.Event.OperationFailed, vm.getHostId()); _itMgr.stateTransitTo(vm, VirtualMachine.Event.OperationFailed, vm.getHostId());
s_logger.error("Unable to stop vm " + vm.getHostName()); s_logger.error("Unable to stop vm " + vm.getHostName());
} }
@ -2167,7 +2167,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, VirtualM
if (s_logger.isDebugEnabled()) { if (s_logger.isDebugEnabled()) {
s_logger.debug("Destroying vm " + vm.toString()); s_logger.debug("Destroying vm " + vm.toString());
} }
if (!_vmDao.updateIf(vm, VirtualMachine.Event.DestroyRequested, vm.getHostId())) { if (!_itMgr.stateTransitTo(vm, VirtualMachine.Event.DestroyRequested, vm.getHostId())) {
s_logger.debug("Unable to destroy the vm because it is not in the correct state: " + vm.toString()); s_logger.debug("Unable to destroy the vm because it is not in the correct state: " + vm.toString());
return false; return false;
} }
@ -2234,7 +2234,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, VirtualM
public boolean migrate(UserVmVO vm, HostVO host) throws AgentUnavailableException, OperationTimedoutException { public boolean migrate(UserVmVO vm, HostVO host) throws AgentUnavailableException, OperationTimedoutException {
HostVO fromHost = _hostDao.findById(vm.getHostId()); HostVO fromHost = _hostDao.findById(vm.getHostId());
if (!_vmDao.updateIf(vm, VirtualMachine.Event.MigrationRequested, vm.getHostId())) { if (!_itMgr.stateTransitTo(vm, VirtualMachine.Event.MigrationRequested, vm.getHostId())) {
s_logger.debug("State for " + vm.toString() + " has changed so migration can not take place."); s_logger.debug("State for " + vm.toString() + " has changed so migration can not take place.");
return false; return false;
} }
@ -2266,7 +2266,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, VirtualM
releaseGuestIpAddress(vm); releaseGuestIpAddress(vm);
vm.setGuestNetmask(null); vm.setGuestNetmask(null);
vm.setGuestMacAddress(null); vm.setGuestMacAddress(null);
if (!_vmDao.updateIf(vm, VirtualMachine.Event.ExpungeOperation, null)) { if (!_itMgr.stateTransitTo(vm, VirtualMachine.Event.ExpungeOperation, null)) {
s_logger.info("vm " + vmId + " is skipped because it is no longer in Destroyed state"); s_logger.info("vm " + vmId + " is skipped because it is no longer in Destroyed state");
continue; continue;
} }
@ -2335,14 +2335,14 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, VirtualM
CheckVirtualMachineAnswer answer = (CheckVirtualMachineAnswer)_agentMgr.send(host.getId(), cvm); CheckVirtualMachineAnswer answer = (CheckVirtualMachineAnswer)_agentMgr.send(host.getId(), cvm);
if (!answer.getResult()) { if (!answer.getResult()) {
s_logger.debug("Unable to complete migration for " + vm.toString()); s_logger.debug("Unable to complete migration for " + vm.toString());
_vmDao.updateIf(vm, VirtualMachine.Event.AgentReportStopped, null); _itMgr.stateTransitTo(vm, VirtualMachine.Event.AgentReportStopped, null);
return false; return false;
} }
State state = answer.getState(); State state = answer.getState();
if (state == State.Stopped) { if (state == State.Stopped) {
s_logger.warn("Unable to complete migration as we can not detect it on " + host.toString()); s_logger.warn("Unable to complete migration as we can not detect it on " + host.toString());
_vmDao.updateIf(vm, VirtualMachine.Event.AgentReportStopped, null); _itMgr.stateTransitTo(vm, VirtualMachine.Event.AgentReportStopped, null);
return false; return false;
} }
@ -2353,7 +2353,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, VirtualM
Transaction txn = Transaction.currentTxn(); Transaction txn = Transaction.currentTxn();
try { try {
txn.start(); txn.start();
_vmDao.updateIf(vm, VirtualMachine.Event.OperationSucceeded, host.getId()); _itMgr.stateTransitTo(vm, VirtualMachine.Event.OperationSucceeded, host.getId());
txn.commit(); txn.commit();
_networkGroupMgr.handleVmStateTransition(vm, State.Running); _networkGroupMgr.handleVmStateTransition(vm, State.Running);
return true; return true;
@ -2936,7 +2936,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, VirtualM
} }
_eventDao.persist(event); _eventDao.persist(event);
_vmDao.updateIf(vm, VirtualMachine.Event.OperationSucceeded, null); _itMgr.stateTransitTo(vm, VirtualMachine.Event.OperationSucceeded, null);
if (s_logger.isDebugEnabled()) { if (s_logger.isDebugEnabled()) {
s_logger.debug("vm created " + vmId); s_logger.debug("vm created " + vmId);
} }
@ -3093,7 +3093,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, VirtualM
} }
_eventDao.persist(event); _eventDao.persist(event);
_vmDao.updateIf(vm, VirtualMachine.Event.OperationSucceeded, null); _itMgr.stateTransitTo(vm, VirtualMachine.Event.OperationSucceeded, null);
if (s_logger.isDebugEnabled()) { if (s_logger.isDebugEnabled()) {
s_logger.debug("vm created " + vmId); s_logger.debug("vm created " + vmId);
} }

View File

@ -1,16 +1,18 @@
package com.cloud.vm; package com.cloud.vm;
import org.apache.log4j.Logger;
import com.cloud.capacity.CapacityVO; import com.cloud.capacity.CapacityVO;
import com.cloud.capacity.dao.CapacityDao; import com.cloud.capacity.dao.CapacityDao;
import com.cloud.service.ServiceOfferingVO; import com.cloud.service.ServiceOfferingVO;
import com.cloud.service.dao.ServiceOfferingDao; import com.cloud.service.dao.ServiceOfferingDao;
import com.cloud.utils.db.DB;
import com.cloud.utils.db.Transaction; import com.cloud.utils.db.Transaction;
import com.cloud.utils.fsm.StateListener; import com.cloud.utils.fsm.StateListener;
import com.cloud.vm.VirtualMachine.Event; import com.cloud.vm.VirtualMachine.Event;
import com.cloud.vm.dao.VMInstanceDao; import com.cloud.vm.dao.VMInstanceDao;
public class VMStateListener implements StateListener<State, VirtualMachine.Event, VMInstanceVO>{ public class VMStateListener implements StateListener<State, VirtualMachine.Event, VMInstanceVO>{
private static final Logger s_logger = Logger.getLogger(VMStateListener.class);
CapacityDao _capacityDao; CapacityDao _capacityDao;
ServiceOfferingDao _offeringDao; ServiceOfferingDao _offeringDao;
VMInstanceDao _vmDao; VMInstanceDao _vmDao;
@ -49,7 +51,23 @@ public class VMStateListener implements StateListener<State, VirtualMachine.Even
} }
} else if (oldState == State.Migrating) { } else if (oldState == State.Migrating) {
if (event == Event.AgentReportStopped) { if (event == Event.AgentReportStopped) {
/*Release capacity from original host*/
releaseResource(vm, false, true); releaseResource(vm, false, true);
} else if (event == Event.OperationFailed) {
if (vm.getHostId() == id) {
/*Migrate command failed, vm still on the orginal host*/
/*no change for the capacity*/
} else {
/*CheckVirtualMachineCommand cmd got exception, assume vm is running on dest host*/
/*Need to clean up capacity*/
releaseResource(vm, false, false);
if (id != null) {
addResource(vm, id);
}
}
} else if (event == Event.OperationSucceeded) {
releaseResource(vm, false, false);
addResource(vm, id);
} }
} else if (oldState == State.Stopping) { } else if (oldState == State.Stopping) {
if (event == Event.AgentReportStopped || event == Event.OperationSucceeded) { if (event == Event.AgentReportStopped || event == Event.OperationSucceeded) {
@ -84,7 +102,7 @@ public class VMStateListener implements StateListener<State, VirtualMachine.Even
CapacityVO capacityCpu = _capacityDao.findByHostIdType(vm.getHostId(), CapacityVO.CAPACITY_TYPE_CPU); CapacityVO capacityCpu = _capacityDao.findByHostIdType(vm.getHostId(), CapacityVO.CAPACITY_TYPE_CPU);
CapacityVO capacityMemory = _capacityDao.findByHostIdType(vm.getHostId(), CapacityVO.CAPACITY_TYPE_MEMORY); CapacityVO capacityMemory = _capacityDao.findByHostIdType(vm.getHostId(), CapacityVO.CAPACITY_TYPE_MEMORY);
int vmCPU = svo.getCpu() * svo.getSpeed(); int vmCPU = svo.getCpu() * svo.getSpeed();
int vmMem = svo.getRamSize(); long vmMem = svo.getRamSize() * 1024L * 1024L;
capacityCpu = _capacityDao.lockRow(capacityCpu.getId(), true); capacityCpu = _capacityDao.lockRow(capacityCpu.getId(), true);
capacityMemory = _capacityDao.lockRow(capacityMemory.getId(), true); capacityMemory = _capacityDao.lockRow(capacityMemory.getId(), true);
@ -124,4 +142,39 @@ public class VMStateListener implements StateListener<State, VirtualMachine.Even
_capacityDao.update(capacityMemory.getId(), capacityMemory); _capacityDao.update(capacityMemory.getId(), capacityMemory);
} }
/*Add capacity to destination host, for migration*/
private void addResource(VMInstanceVO vm, Long destHostId) {
ServiceOfferingVO svo = _offeringDao.findById(vm.getServiceOfferingId());
CapacityVO capacityCpu = _capacityDao.findByHostIdType(destHostId, CapacityVO.CAPACITY_TYPE_CPU);
CapacityVO capacityMemory = _capacityDao.findByHostIdType(destHostId, CapacityVO.CAPACITY_TYPE_MEMORY);
int vmCPU = svo.getCpu() * svo.getSpeed();
long vmMem = svo.getRamSize() * 1024L * 1024L;
capacityCpu = _capacityDao.lockRow(capacityCpu.getId(), true);
capacityMemory = _capacityDao.lockRow(capacityMemory.getId(), true);
long usedCpu = capacityCpu.getUsedCapacity();
long usedMem = capacityMemory.getUsedCapacity();
long reservedCpu = capacityCpu.getReservedCapacity();
long reservedMem = capacityMemory.getReservedCapacity();
long totalCpu = capacityCpu.getTotalCapacity();
long totalMem = capacityMemory.getTotalCapacity();
if (usedCpu + reservedCpu + vmCPU <= totalCpu) {
capacityCpu.setUsedCapacity(usedCpu + vmCPU);
} else {
s_logger.debug("What's the heck? :u:" + usedCpu + ",r:" + reservedCpu + ",vm:" + vmCPU + " > " + totalCpu);
}
if (usedMem + reservedMem + vmMem <= totalMem) {
capacityMemory.setUsedCapacity(usedMem + vmMem);
} else {
s_logger.debug("What's the heck? :u:" + usedMem + ",r:" + reservedMem + ",vm:" + vmMem + " > " + totalMem);
}
_capacityDao.update(capacityCpu.getId(), capacityCpu);
_capacityDao.update(capacityMemory.getId(), capacityMemory);
}
} }

View File

@ -27,6 +27,7 @@ import com.cloud.exception.InsufficientCapacityException;
import com.cloud.exception.OperationTimedoutException; import com.cloud.exception.OperationTimedoutException;
import com.cloud.exception.ResourceUnavailableException; import com.cloud.exception.ResourceUnavailableException;
import com.cloud.exception.StorageUnavailableException; import com.cloud.exception.StorageUnavailableException;
import com.cloud.host.HostVO;
import com.cloud.network.NetworkVO; import com.cloud.network.NetworkVO;
import com.cloud.service.ServiceOfferingVO; import com.cloud.service.ServiceOfferingVO;
import com.cloud.storage.DiskOfferingVO; import com.cloud.storage.DiskOfferingVO;
@ -78,5 +79,6 @@ public interface VmManager extends Manager {
<T extends VMInstanceVO> void registerGuru(VirtualMachine.Type type, VirtualMachineGuru<T> guru); <T extends VMInstanceVO> void registerGuru(VirtualMachine.Type type, VirtualMachineGuru<T> guru);
boolean stateTransitTo(VMInstanceVO vm, Event e, Long id); boolean stateTransitTo(VMInstanceVO vm, Event e, Long id);
} }

View File

@ -47,5 +47,5 @@ public interface ConsoleProxyDao extends GenericDao<ConsoleProxyVO, Long> {
public int getProxyActiveLoad(long proxyVmId); public int getProxyActiveLoad(long proxyVmId);
public List<Long> getRunningProxyListByMsid(long msid); public List<Long> getRunningProxyListByMsid(long msid);
public boolean updateIf(ConsoleProxyVO vm, VirtualMachine.Event event, Long hostId); //public boolean updateIf(ConsoleProxyVO vm, VirtualMachine.Event event, Long hostId);
} }

View File

@ -145,7 +145,7 @@ public class ConsoleProxyDaoImpl extends GenericDaoBase<ConsoleProxyVO, Long> im
assert _updateTimeAttr != null : "Couldn't get this updateTime attribute"; assert _updateTimeAttr != null : "Couldn't get this updateTime attribute";
} }
@Override /* @Override
public boolean updateIf(ConsoleProxyVO vm, VirtualMachine.Event event, Long hostId) { public boolean updateIf(ConsoleProxyVO vm, VirtualMachine.Event event, Long hostId) {
State oldState = vm.getState(); State oldState = vm.getState();
State newState = oldState.getNextState(event); State newState = oldState.getNextState(event);
@ -195,7 +195,7 @@ public class ConsoleProxyDaoImpl extends GenericDaoBase<ConsoleProxyVO, Long> im
} }
return result > 0; return result > 0;
} }*/
@Override @Override

View File

@ -63,7 +63,7 @@ public interface DomainRouterDao extends GenericDao<DomainRouterVO, Long> {
* @param hostId host id to set to. * @param hostId host id to set to.
* @return true if update worked; false if not. * @return true if update worked; false if not.
*/ */
public boolean updateIf(DomainRouterVO router, VirtualMachine.Event event, Long hostId); // public boolean updateIf(DomainRouterVO router, VirtualMachine.Event event, Long hostId);
/** /**
* list virtual machine routers by host id. pass in null to get all * list virtual machine routers by host id. pass in null to get all

View File

@ -145,7 +145,7 @@ public class DomainRouterDaoImpl extends GenericDaoBase<DomainRouterVO, Long> im
return result; return result;
} }
@Override /* @Override
public boolean updateIf(DomainRouterVO router, VirtualMachine.Event event, Long hostId) { public boolean updateIf(DomainRouterVO router, VirtualMachine.Event event, Long hostId) {
if (s_logger.isDebugEnabled()) { if (s_logger.isDebugEnabled()) {
s_logger.debug("updateIf called on " + router.toString() + " event " + event.toString() + " host " + hostId); s_logger.debug("updateIf called on " + router.toString() + " event " + event.toString() + " host " + hostId);
@ -194,7 +194,7 @@ public class DomainRouterDaoImpl extends GenericDaoBase<DomainRouterVO, Long> im
} }
return result > 0; return result > 0;
} }*/
@Override @Override
public List<DomainRouterVO> listByDataCenter(long dcId) { public List<DomainRouterVO> listByDataCenter(long dcId) {

View File

@ -39,5 +39,5 @@ public interface SecondaryStorageVmDao extends GenericDao<SecondaryStorageVmVO,
public List<Long> getRunningSecStorageVmListByMsid(long msid); public List<Long> getRunningSecStorageVmListByMsid(long msid);
public boolean updateIf(SecondaryStorageVmVO vm, VirtualMachine.Event event, Long hostId); //public boolean updateIf(SecondaryStorageVmVO vm, VirtualMachine.Event event, Long hostId);
} }

View File

@ -85,7 +85,7 @@ public class SecondaryStorageVmDaoImpl extends GenericDaoBase<SecondaryStorageVm
assert _updateTimeAttr != null : "Couldn't get this updateTime attribute"; assert _updateTimeAttr != null : "Couldn't get this updateTime attribute";
} }
@Override /* @Override
public boolean updateIf(SecondaryStorageVmVO vm, VirtualMachine.Event event, Long hostId) { public boolean updateIf(SecondaryStorageVmVO vm, VirtualMachine.Event event, Long hostId) {
State oldState = vm.getState(); State oldState = vm.getState();
State newState = oldState.getNextState(event); State newState = oldState.getNextState(event);
@ -132,7 +132,7 @@ public class SecondaryStorageVmDaoImpl extends GenericDaoBase<SecondaryStorageVm
} }
return result > 0; return result > 0;
} }*/
@Override @Override

View File

@ -57,7 +57,7 @@ public interface UserVmDao extends GenericDao<UserVmVO, Long> {
* @param hostId * @param hostId
* @return true if updated, false if not. * @return true if updated, false if not.
*/ */
boolean updateIf(UserVmVO vm, VirtualMachine.Event event, Long hostId); //boolean updateIf(UserVmVO vm, VirtualMachine.Event event, Long hostId);
/** /**
* Updates display name and group for vm; enables/disables ha * Updates display name and group for vm; enables/disables ha

View File

@ -175,7 +175,7 @@ public class UserVmDaoImpl extends GenericDaoBase<UserVmVO, Long> implements Use
return listIncludingRemovedBy(sc); return listIncludingRemovedBy(sc);
} }
@Override /* @Override
public boolean updateIf(UserVmVO vm, VirtualMachine.Event event, Long hostId) { public boolean updateIf(UserVmVO vm, VirtualMachine.Event event, Long hostId) {
if (s_logger.isDebugEnabled()) { if (s_logger.isDebugEnabled()) {
s_logger.debug("UpdateIf called " + vm.toString() + " event " + event.toString() + " host " + hostId); s_logger.debug("UpdateIf called " + vm.toString() + " event " + event.toString() + " host " + hostId);
@ -224,7 +224,7 @@ public class UserVmDaoImpl extends GenericDaoBase<UserVmVO, Long> implements Use
} }
return result > 0; return result > 0;
} }*/
@Override @Override
public List<UserVmVO> findDestroyedVms(Date date) { public List<UserVmVO> findDestroyedVms(Date date) {

View File

@ -53,7 +53,7 @@ public interface VMInstanceDao extends GenericDao<VMInstanceVO, Long>, StateDao<
*/ */
public List<VMInstanceVO> listNonExpungedByZoneAndTemplate(long zoneId, long templateId); public List<VMInstanceVO> listNonExpungedByZoneAndTemplate(long zoneId, long templateId);
boolean updateIf(VMInstanceVO vm, VirtualMachine.Event event, Long hostId); //boolean updateIf(VMInstanceVO vm, VirtualMachine.Event event, Long hostId);
/** /**
* Find vm instance with names like. * Find vm instance with names like.

View File

@ -140,7 +140,7 @@ public class VMInstanceDaoImpl extends GenericDaoBase<VMInstanceVO, Long> implem
return listBy(sc); return listBy(sc);
} }
@Override /* @Override
public boolean updateIf(VMInstanceVO vm, VirtualMachine.Event event, Long hostId) { public boolean updateIf(VMInstanceVO vm, VirtualMachine.Event event, Long hostId) {
State oldState = vm.getState(); State oldState = vm.getState();
@ -174,7 +174,7 @@ public class VMInstanceDaoImpl extends GenericDaoBase<VMInstanceVO, Long> implem
s_logger.debug(str.toString()); s_logger.debug(str.toString());
} }
return result > 0; return result > 0;
} }*/
@Override @Override
public List<VMInstanceVO> listByHostId(long hostid) { public List<VMInstanceVO> listByHostId(long hostid) {