From d17beeb34821ce6867837676cf69d243daa10d3c Mon Sep 17 00:00:00 2001 From: edison Date: Fri, 3 Dec 2010 15:36:55 -0800 Subject: [PATCH] move all the vm's state machine to itmgr->statetransitTO --- server/src/com/cloud/agent/AgentManager.java | 4 +- .../cloud/agent/manager/AgentManagerImpl.java | 39 ++-- .../cloud/async/AsyncJobExecutorContext.java | 2 + .../async/AsyncJobExecutorContextImpl.java | 15 +- .../async/executor/DestroyVMExecutor.java | 4 +- .../cloud/async/executor/StopVMExecutor.java | 2 +- .../consoleproxy/ConsoleProxyManagerImpl.java | 26 +-- .../src/com/cloud/deploy/FirstFitPlanner.java | 166 ++++++++++++++++-- .../router/DomainRouterManagerImpl.java | 30 ++-- .../SecondaryStorageManagerImpl.java | 26 +-- server/src/com/cloud/vm/MauriceMoss.java | 8 + .../src/com/cloud/vm/UserVmManagerImpl.java | 46 ++--- server/src/com/cloud/vm/VMStateListener.java | 57 +++++- server/src/com/cloud/vm/VmManager.java | 2 + .../src/com/cloud/vm/dao/ConsoleProxyDao.java | 2 +- .../com/cloud/vm/dao/ConsoleProxyDaoImpl.java | 4 +- .../src/com/cloud/vm/dao/DomainRouterDao.java | 2 +- .../com/cloud/vm/dao/DomainRouterDaoImpl.java | 4 +- .../cloud/vm/dao/SecondaryStorageVmDao.java | 2 +- .../vm/dao/SecondaryStorageVmDaoImpl.java | 4 +- server/src/com/cloud/vm/dao/UserVmDao.java | 2 +- .../src/com/cloud/vm/dao/UserVmDaoImpl.java | 4 +- .../src/com/cloud/vm/dao/VMInstanceDao.java | 2 +- .../com/cloud/vm/dao/VMInstanceDaoImpl.java | 4 +- 24 files changed, 340 insertions(+), 117 deletions(-) diff --git a/server/src/com/cloud/agent/AgentManager.java b/server/src/com/cloud/agent/AgentManager.java index 71d06cb86aa..80179cb1af8 100755 --- a/server/src/com/cloud/agent/AgentManager.java +++ b/server/src/com/cloud/agent/AgentManager.java @@ -31,6 +31,7 @@ import com.cloud.exception.DiscoveryException; import com.cloud.exception.InvalidParameterValueException; import com.cloud.exception.OperationTimedoutException; import com.cloud.host.Host; +import com.cloud.host.Host.Type; import com.cloud.host.HostStats; import com.cloud.host.HostVO; 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. */ - Host findHost(Host.Type type, DataCenterVO dc, HostPodVO pod, StoragePoolVO sp, ServiceOffering offering, VMTemplateVO template, VMInstanceVO vm, Host currentHost, Set avoid); + Host findHost(Host.Type type, DataCenterVO dc, HostPodVO pod, StoragePoolVO sp, ServiceOfferingVO offering, VMTemplateVO template, VMInstanceVO vm, Host currentHost, Set avoid); List listByDataCenter(long dcId); List listByPod(long podId); @@ -212,4 +213,5 @@ public interface AgentManager extends Manager { public List 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); + } diff --git a/server/src/com/cloud/agent/manager/AgentManagerImpl.java b/server/src/com/cloud/agent/manager/AgentManagerImpl.java index bace866e4e4..4c00f6ef25d 100755 --- a/server/src/com/cloud/agent/manager/AgentManagerImpl.java +++ b/server/src/com/cloud/agent/manager/AgentManagerImpl.java @@ -95,10 +95,15 @@ import com.cloud.dc.dao.DataCenterDao; import com.cloud.dc.dao.DataCenterIpAddressDao; import com.cloud.dc.dao.HostPodDao; 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.exception.AgentUnavailableException; import com.cloud.exception.ConnectionException; import com.cloud.exception.DiscoveryException; +import com.cloud.exception.InsufficientServerCapacityException; import com.cloud.exception.InvalidParameterValueException; import com.cloud.exception.OperationTimedoutException; import com.cloud.exception.UnsupportedVersionException; @@ -218,6 +223,9 @@ public class AgentManagerImpl implements AgentManager, HandlerFactory, ResourceS @Inject protected DetailsDao _hostDetailsDao = null; @Inject protected ClusterDao _clusterDao; + @Inject(adapter=DeploymentPlanner.class) + private Adapters _planners; + protected Adapters _discoverers = null; protected int _port; @@ -434,24 +442,33 @@ public class AgentManagerImpl implements AgentManager, HandlerFactory, ResourceS @Override 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 avoid) { - VirtualMachineProfile vmc = new VirtualMachineProfileImpl(vm.getType()); - Enumeration en = _hostAllocators.enumeration(); - while (en.hasMoreElements()) { - final HostAllocator allocator = en.nextElement(); - final Host host = allocator.allocateTo(vmc, offering, type, dc, pod, sp.getClusterId(), template, avoid); - if (host == null) { - continue; - } else { - return host; - } + VirtualMachineProfileImpl vmProfile = new VirtualMachineProfileImpl(vm, template, offering, null, null); + DeployDestination dest = null; + DataCenterDeployment plan = new DataCenterDeployment(dc.getId(), pod.getId(), sp.getClusterId(), null); + ExcludeList avoids = new ExcludeList(); + for (Host h : avoid) { + avoids.addHost(h.getId()); + } + + 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."); return null; } + @Override public List listByDataCenter(long dcId) { List pods = _podDao.listByDataCenterId(dcId); diff --git a/server/src/com/cloud/async/AsyncJobExecutorContext.java b/server/src/com/cloud/async/AsyncJobExecutorContext.java index 0a565dacb2b..47cab5bed85 100644 --- a/server/src/com/cloud/async/AsyncJobExecutorContext.java +++ b/server/src/com/cloud/async/AsyncJobExecutorContext.java @@ -32,6 +32,7 @@ import com.cloud.user.dao.AccountDao; import com.cloud.user.dao.UserDao; import com.cloud.utils.component.Manager; import com.cloud.vm.UserVmManager; +import com.cloud.vm.VmManager; import com.cloud.vm.dao.DomainRouterDao; import com.cloud.vm.dao.UserVmDao; @@ -51,4 +52,5 @@ public interface AsyncJobExecutorContext extends Manager { public IPAddressDao getIpAddressDao(); public AsyncJobDao getJobDao(); public UserDao getUserDao(); + public VmManager getItMgr(); } diff --git a/server/src/com/cloud/async/AsyncJobExecutorContextImpl.java b/server/src/com/cloud/async/AsyncJobExecutorContextImpl.java index cf000e8566a..5f0f489b612 100644 --- a/server/src/com/cloud/async/AsyncJobExecutorContextImpl.java +++ b/server/src/com/cloud/async/AsyncJobExecutorContextImpl.java @@ -37,6 +37,7 @@ import com.cloud.user.dao.AccountDao; import com.cloud.user.dao.UserDao; import com.cloud.utils.component.ComponentLocator; import com.cloud.vm.UserVmManager; +import com.cloud.vm.VmManager; import com.cloud.vm.dao.DomainRouterDao; import com.cloud.vm.dao.UserVmDao; @@ -57,7 +58,8 @@ public class AsyncJobExecutorContextImpl implements AsyncJobExecutorContext { private DomainRouterDao _routerDao; private IPAddressDao _ipAddressDao; private AsyncJobDao _jobDao; - private UserDao _userDao; + private UserDao _userDao; + private VmManager _itMgr; private ManagementServer _managementServer; @@ -138,6 +140,11 @@ public class AsyncJobExecutorContextImpl implements AsyncJobExecutorContext { public UserDao getUserDao() { return _userDao; } + + @Override + public VmManager getItMgr() { + return _itMgr; + } @Override public boolean configure(String name, Map params) throws ConfigurationException { @@ -218,7 +225,11 @@ public class AsyncJobExecutorContextImpl implements AsyncJobExecutorContext { if(_userDao == null) { 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; } diff --git a/server/src/com/cloud/async/executor/DestroyVMExecutor.java b/server/src/com/cloud/async/executor/DestroyVMExecutor.java index a2ab04a6139..17027ea8a20 100644 --- a/server/src/com/cloud/async/executor/DestroyVMExecutor.java +++ b/server/src/com/cloud/async/executor/DestroyVMExecutor.java @@ -100,7 +100,7 @@ public class DestroyVMExecutor extends VMOperationExecutor { txn.start(); 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()); txn.rollback(); @@ -130,7 +130,7 @@ public class DestroyVMExecutor extends VMOperationExecutor { asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_SUCCEEDED, 0, "success"); } else { - asyncMgr.getExecutorContext().getVmDao().updateIf(vm, Event.OperationFailed, vm.getHostId()); + asyncMgr.getExecutorContext().getItMgr().stateTransitTo(vm, Event.OperationFailed, vm.getHostId()); asyncMgr.completeAsyncJob(getJob().getId(), 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, diff --git a/server/src/com/cloud/async/executor/StopVMExecutor.java b/server/src/com/cloud/async/executor/StopVMExecutor.java index be09425fdd3..c2ab1d358b0 100644 --- a/server/src/com/cloud/async/executor/StopVMExecutor.java +++ b/server/src/com/cloud/async/executor/StopVMExecutor.java @@ -92,7 +92,7 @@ public class StopVMExecutor extends VMOperationExecutor { AsyncJobResult.STATUS_SUCCEEDED, 0, VMExecutorHelper.composeResultObject(asyncMgr.getExecutorContext().getManagementServer(), vm, null)); jobStatusUpdated = true; } else { - asyncMgr.getExecutorContext().getVmDao().updateIf(vm, Event.OperationFailed, vm.getHostId()); + asyncMgr.getExecutorContext().getItMgr().stateTransitTo(vm, Event.OperationFailed, vm.getHostId()); asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, "Agent failed to stop VM"); jobStatusUpdated = true; diff --git a/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java b/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java index 1e056a0cb79..48b88788f9c 100644 --- a/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java +++ b/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java @@ -632,7 +632,7 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, ConsoleProx } } // 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()) { ConsoleProxyVO temp = _consoleProxyDao.findById(proxyId); 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); proxy.setGuestIpAddress(guestIpAddress); - _consoleProxyDao.updateIf(proxy, VirtualMachine.Event.OperationRetry, routingHost.getId()); + _itMgr.stateTransitTo(proxy, VirtualMachine.Event.OperationRetry, routingHost.getId()); proxy = _consoleProxyDao.findById(proxy.getId()); List 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"); } - _consoleProxyDao.updateIf(proxy, VirtualMachine.Event.OperationSucceeded, routingHost.getId()); + _itMgr.stateTransitTo(proxy, VirtualMachine.Event.OperationSucceeded, routingHost.getId()); if (s_logger.isDebugEnabled()) { 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()); } - _consoleProxyDao.updateIf(proxy, VirtualMachine.Event.OperationFailed, null); + _itMgr.stateTransitTo(proxy, VirtualMachine.Event.OperationFailed, null); txn.commit(); } catch (Exception e) { s_logger.error("Caught exception during error recovery"); @@ -1120,7 +1120,7 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, ConsoleProx _consoleProxyDao.update(proxy.getId(), vo); // kick the state machine - _consoleProxyDao.updateIf(proxy, VirtualMachine.Event.OperationSucceeded, null); + _itMgr.stateTransitTo(proxy, VirtualMachine.Event.OperationSucceeded, null); txn.commit(); return proxy; @@ -1788,7 +1788,7 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, ConsoleProx @Override public void completeStartCommand(ConsoleProxyVO vm) { - _consoleProxyDao.updateIf(vm, VirtualMachine.Event.AgentReportRunning, vm.getHostId()); + _itMgr.stateTransitTo(vm, VirtualMachine.Event.AgentReportRunning, vm.getHostId()); } @Override @@ -1812,7 +1812,7 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, ConsoleProx _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"); return; } @@ -1969,7 +1969,7 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, ConsoleProx 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); return false; } @@ -2050,7 +2050,7 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, ConsoleProx @Override 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()); return false; } @@ -2129,7 +2129,7 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, ConsoleProx public boolean migrate(ConsoleProxyVO proxy, HostVO host) { 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."); return false; } @@ -2152,18 +2152,18 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, ConsoleProx CheckVirtualMachineAnswer answer = (CheckVirtualMachineAnswer) _agentMgr.send(host.getId(), cvm); if (!answer.getResult()) { 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; } State state = answer.getState(); if (state == State.Stopped) { 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; } - _consoleProxyDao.updateIf(proxy, VirtualMachine.Event.OperationSucceeded, host.getId()); + _itMgr.stateTransitTo(proxy, VirtualMachine.Event.OperationSucceeded, host.getId()); return true; } diff --git a/server/src/com/cloud/deploy/FirstFitPlanner.java b/server/src/com/cloud/deploy/FirstFitPlanner.java index da02eeda831..f6938435557 100644 --- a/server/src/com/cloud/deploy/FirstFitPlanner.java +++ b/server/src/com/cloud/deploy/FirstFitPlanner.java @@ -1,5 +1,6 @@ package com.cloud.deploy; +import java.util.ArrayList; import java.util.Collections; 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.HostPodDao; import com.cloud.exception.InsufficientServerCapacityException; +import com.cloud.host.DetailVO; import com.cloud.host.Host; import com.cloud.host.HostVO; import com.cloud.host.Status; +import com.cloud.host.dao.DetailsDao; import com.cloud.host.dao.HostDao; import com.cloud.offering.ServiceOffering; 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.db.DB; import com.cloud.utils.db.Transaction; @@ -33,6 +42,9 @@ public class FirstFitPlanner extends PlannerBase implements DeploymentPlanner { @Inject private DataCenterDao _dcDao; @Inject private HostPodDao _podDao; @Inject private ClusterDao _clusterDao; + @Inject DetailsDao _hostDetailsDao = null; + @Inject GuestOSDao _guestOSDao = null; + @Inject GuestOSCategoryDao _guestOSCategoryDao = null; @Override public DeployDestination plan(VirtualMachineProfile vmProfile, @@ -42,13 +54,13 @@ public class FirstFitPlanner extends PlannerBase implements DeploymentPlanner { ServiceOffering offering = vmProfile.getServiceOffering(); DataCenter dc = _dcDao.findById(vm.getDataCenterId()); int cpu_requested = offering.getCpu() * offering.getSpeed(); - int ram_requested = offering.getRamSize(); + long ram_requested = offering.getRamSize() * 1024L * 1024L; if (vm.getLastHostId() != null) { HostVO host = _hostDao.findById(vm.getLastHostId()); 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) { Pod pod = _podDao.findById(vm.getPodId()); 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*/ - List pods = _podDao.listByDataCenterId(plan.getDataCenterId()); + List pods; + if (plan.getPodId() != null) { + pods = new ArrayList(1); + pods.add(_podDao.findById(plan.getPodId())); + } else { + pods = _podDao.listByDataCenterId(plan.getDataCenterId()); + } //Collections.shuffle(pods); for (HostPodVO hostPod : pods) { - List clusters = _clusterDao.listByPodId(hostPod.getId()); + //Collections.shuffle(clusters); + List clusters; + if (plan.getClusterId() != null) { + clusters = new ArrayList(1); + clusters.add(_clusterDao.findById(plan.getClusterId())); + } else { + clusters = _clusterDao.listByPodId(hostPod.getId()); + } for (ClusterVO clusterVO : clusters) { @@ -71,20 +96,15 @@ public class FirstFitPlanner extends PlannerBase implements DeploymentPlanner { continue; } - List hosts = _hostDao.listByCluster(clusterVO.getId()); + List hosts = _hostDao.listBy(Host.Type.Routing, clusterVO.getId(), hostPod.getId(), dc.getId()); //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) { - if (hostVO.getStatus() != Status.Up) { - continue; - } - - if (avoid.shouldAvoid(hostVO)) { - continue; - } - - boolean canDeployToHost = deployToHost(hostVO.getId(), cpu_requested, ram_requested, false); + for (HostVO hostVO : hosts) { + boolean canDeployToHost = deployToHost(hostVO, cpu_requested, ram_requested, false, avoid); if (canDeployToHost) { Pod pod = _podDao.findById(hostPod.getId()); Cluster cluster = _clusterDao.findById(clusterVO.getId()); @@ -107,10 +127,13 @@ public class FirstFitPlanner extends PlannerBase implements DeploymentPlanner { } @DB - protected boolean deployToHost(Long hostId, Integer cpu, long ram, boolean fromLastHost) { - - CapacityVO capacityCpu = _capacityDao.findByHostIdType(hostId, CapacityVO.CAPACITY_TYPE_CPU); - CapacityVO capacityMem = _capacityDao.findByHostIdType(hostId, CapacityVO.CAPACITY_TYPE_MEMORY); + protected boolean deployToHost(HostVO host, Integer cpu, long ram, boolean fromLastHost, ExcludeList avoid) { + if (avoid.shouldAvoid(host)) { + return false; + } + + CapacityVO capacityCpu = _capacityDao.findByHostIdType(host.getId(), CapacityVO.CAPACITY_TYPE_CPU); + CapacityVO capacityMem = _capacityDao.findByHostIdType(host.getId(), CapacityVO.CAPACITY_TYPE_MEMORY); Transaction txn = Transaction.currentTxn(); @@ -158,4 +181,109 @@ public class FirstFitPlanner extends PlannerBase implements DeploymentPlanner { } } + protected List prioritizeHosts(VirtualMachineTemplate template, List hosts) { + if (template == null) { + return hosts; + } + + // Determine the guest OS category of the template + String templateGuestOSCategory = getTemplateGuestOSCategory(template); + + List prioritizedHosts = new ArrayList(); + + // If a template requires HVM and a host doesn't support HVM, remove it from consideration + List hostsToCheck = new ArrayList(); + 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 highPriorityHosts = new ArrayList(); + List lowPriorityHosts = new ArrayList(); + 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(); + } } diff --git a/server/src/com/cloud/network/router/DomainRouterManagerImpl.java b/server/src/com/cloud/network/router/DomainRouterManagerImpl.java index 3116ba0e722..6bf0bf24a67 100644 --- a/server/src/com/cloud/network/router/DomainRouterManagerImpl.java +++ b/server/src/com/cloud/network/router/DomainRouterManagerImpl.java @@ -381,7 +381,7 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute _eventDao.persist(event); 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()); @@ -551,7 +551,7 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute _eventDao.persist(event); 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()); @@ -632,7 +632,7 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute return false; } 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."); return false; } @@ -855,7 +855,7 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute 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"); throw new ConcurrentOperationException("Someone else is starting the router: " + router.toString()); } @@ -964,7 +964,7 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute } router.setDomain(networkDomain); - _routerDao.updateIf(router, VirtualMachine.Event.OperationRetry, routingHost.getId()); + _itMgr.stateTransitTo(router, VirtualMachine.Event.OperationRetry, routingHost.getId()); List vols = _storageMgr.prepare(router, routingHost); if (vols == null) { @@ -1047,7 +1047,7 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute 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()) { 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(); } @@ -1570,7 +1570,7 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute @Override public void completeStartCommand(final DomainRouterVO router) { - _routerDao.updateIf(router, VirtualMachine.Event.AgentReportRunning, router.getHostId()); + _itMgr.stateTransitTo(router, VirtualMachine.Event.AgentReportRunning, router.getHostId()); } @Override @@ -1602,7 +1602,7 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute } router.setPrivateIpAddress(null); - if (!_routerDao.updateIf(router, ev, null)) { + if (! _itMgr.stateTransitTo(router, ev, null)) { s_logger.debug("Router is not updated"); return; } @@ -1699,7 +1699,7 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute event.setType(EventTypes.EVENT_ROUTER_STOP); 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."); return false; } @@ -1734,7 +1734,7 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute event.setDescription("failed to stop Domain Router : " + router.getHostName()); event.setLevel(EventVO.LEVEL_ERROR); _eventDao.persist(event); - _routerDao.updateIf(router, VirtualMachine.Event.OperationFailed, router.getHostId()); + _itMgr.stateTransitTo(router, VirtualMachine.Event.OperationFailed, router.getHostId()); return false; } @@ -1811,7 +1811,7 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute public boolean migrate(final DomainRouterVO router, final HostVO host) { 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."); return false; } @@ -1838,18 +1838,18 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute final CheckVirtualMachineAnswer answer = (CheckVirtualMachineAnswer)_agentMgr.send(host.getId(), cvm); if (answer == null || !answer.getResult()) { 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; } final State state = answer.getState(); if (state == State.Stopped) { 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; } - _routerDao.updateIf(router, VirtualMachine.Event.OperationSucceeded, host.getId()); + _itMgr.stateTransitTo(router, VirtualMachine.Event.OperationSucceeded, host.getId()); return true; } diff --git a/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java b/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java index 0d36ddb6480..40f22971bba 100644 --- a/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java +++ b/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java @@ -356,7 +356,7 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V } } // 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()) { SecondaryStorageVmVO temp = _secStorageVmDao.findById(secStorageVmId); s_logger.debug("Unable to start secondary storage vm " @@ -391,7 +391,7 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V secStorageVm.setPrivateIpAddress(privateIpAddress); String guestIpAddress = _dcDao.allocateLinkLocalIpAddress(secStorageVm.getDataCenterId(), routingHost.getPodId(), secStorageVm.getId(), null); secStorageVm.setGuestIpAddress(guestIpAddress); - _secStorageVmDao.updateIf(secStorageVm, VirtualMachine.Event.OperationRetry, routingHost.getId()); + _itMgr.stateTransitTo(secStorageVm, VirtualMachine.Event.OperationRetry, routingHost.getId()); secStorageVm = _secStorageVmDao.findById(secStorageVm.getId()); List 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"); } - _secStorageVmDao.updateIf(secStorageVm, VirtualMachine.Event.OperationSucceeded, routingHost.getId()); + _itMgr.stateTransitTo(secStorageVm, VirtualMachine.Event.OperationSucceeded, routingHost.getId()); if (s_logger.isDebugEnabled()) { 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); freePrivateIpAddress(privateIpAddress, secStorageVm.getDataCenterId(), secStorageVm.getId()); } - _secStorageVmDao.updateIf(secStorageVm, VirtualMachine.Event.OperationFailed, null); + _itMgr.stateTransitTo(secStorageVm, VirtualMachine.Event.OperationFailed, null); txn.commit(); } catch (Exception e) { s_logger.error("Caught exception during error recovery"); @@ -885,7 +885,7 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V } // kick the state machine - _secStorageVmDao.updateIf(secStorageVm, VirtualMachine.Event.OperationSucceeded, null); + _itMgr.stateTransitTo(secStorageVm, VirtualMachine.Event.OperationSucceeded, null); return secStorageVm; } catch (StorageUnavailableException e) { s_logger.error("Unable to alloc storage for secondary storage vm: ", e); @@ -1502,7 +1502,7 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V @Override public void completeStartCommand(SecondaryStorageVmVO vm) { - _secStorageVmDao.updateIf(vm, VirtualMachine.Event.AgentReportRunning, vm.getHostId()); + _itMgr.stateTransitTo(vm, VirtualMachine.Event.AgentReportRunning, vm.getHostId()); } @Override @@ -1525,7 +1525,7 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V secStorageVm.setGuestIpAddress(null); _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"); return; } @@ -1681,7 +1681,7 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V 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; s_logger.debug(msg); 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 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(); s_logger.debug(msg); 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) { 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."); return false; } @@ -1857,18 +1857,18 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V CheckVirtualMachineAnswer answer = (CheckVirtualMachineAnswer) _agentMgr.send(host.getId(), cvm); if (!answer.getResult()) { 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; } State state = answer.getState(); if (state == State.Stopped) { 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; } - _secStorageVmDao.updateIf(secStorageVm, VirtualMachine.Event.OperationSucceeded, host.getId()); + _itMgr.stateTransitTo(secStorageVm, VirtualMachine.Event.OperationSucceeded, host.getId()); return true; } diff --git a/server/src/com/cloud/vm/MauriceMoss.java b/server/src/com/cloud/vm/MauriceMoss.java index 05f4c0e5fbf..f83a0b41112 100644 --- a/server/src/com/cloud/vm/MauriceMoss.java +++ b/server/src/com/cloud/vm/MauriceMoss.java @@ -19,6 +19,7 @@ package com.cloud.vm; import java.util.ArrayList; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.UUID; @@ -31,6 +32,7 @@ import org.apache.log4j.Logger; import com.cloud.agent.AgentManager; import com.cloud.agent.AgentManager.OnError; import com.cloud.agent.api.Answer; +import com.cloud.agent.api.PrepareForMigrationCommand; import com.cloud.agent.api.Start2Command; import com.cloud.agent.api.StopAnswer; import com.cloud.agent.api.StopCommand; @@ -43,6 +45,8 @@ import com.cloud.cluster.ManagementServerHostVO; import com.cloud.configuration.Config; import com.cloud.configuration.dao.ConfigurationDao; import com.cloud.dc.DataCenter; +import com.cloud.dc.DataCenterVO; +import com.cloud.dc.HostPodVO; import com.cloud.deploy.DataCenterDeployment; import com.cloud.deploy.DeployDestination; import com.cloud.deploy.DeploymentPlan; @@ -58,6 +62,8 @@ import com.cloud.exception.InsufficientServerCapacityException; import com.cloud.exception.OperationTimedoutException; import com.cloud.exception.ResourceUnavailableException; 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.HypervisorGuru; import com.cloud.network.NetworkVO; @@ -67,7 +73,9 @@ import com.cloud.service.dao.ServiceOfferingDao; import com.cloud.storage.DiskOfferingVO; import com.cloud.storage.Storage.ImageFormat; import com.cloud.storage.StorageManager; +import com.cloud.storage.StoragePoolVO; import com.cloud.storage.VMTemplateVO; +import com.cloud.storage.VolumeVO; import com.cloud.storage.Volume.VolumeType; import com.cloud.storage.dao.VMTemplateDao; import com.cloud.user.Account; diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java index 35491499e0f..0f8db073aff 100755 --- a/server/src/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/com/cloud/vm/UserVmManagerImpl.java @@ -896,7 +896,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, VirtualM StoragePoolVO sp = _storageMgr.getStoragePoolForVm(vm.getId()); 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 // 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; } - 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."; s_logger.error(description); event.setDescription(description); @@ -965,7 +965,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, VirtualM router = _networkMgr.addVirtualMachineToGuestNetwork(vm, password, startEventId); if (router == null) { 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())) { event.setDescription("Unable to start VM: " + vm.getHostName()+"("+vm.getDisplayName()+")" + "; Unable to add VM to guest network"); } else { @@ -1033,7 +1033,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, VirtualM 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."; s_logger.debug(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()); } - if (!_vmDao.updateIf(vm, VirtualMachine.Event.OperationSucceeded, host.getId())) { + if (!_itMgr.stateTransitTo(vm, VirtualMachine.Event.OperationSucceeded, host.getId())) { if(!vm.getHostName().equals(vm.getDisplayName())) { event.setDescription("unable to start VM: " + vm.getHostName()+"("+vm.getDisplayName()+")"); } else { @@ -1158,7 +1158,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, VirtualM vm.setVnet(null); txn.start(); - if (_vmDao.updateIf(vm, VirtualMachine.Event.OperationFailed, null)) { + if (_itMgr.stateTransitTo(vm, VirtualMachine.Event.OperationFailed, null)) { txn.commit(); } } @@ -1273,7 +1273,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, VirtualM 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"; executor.getAsyncJobMgr().completeAsyncJob(executor.getJob().getId(), AsyncJobResult.STATUS_FAILED, 0, resultDescription); @@ -1316,7 +1316,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, VirtualM resultDescription = "Agent is not available"; executor.getAsyncJobMgr().completeAsyncJob(executor.getJob().getId(), 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); return response; @@ -1663,7 +1663,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, VirtualM vm = _vmDao.persist(vm); } else { 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); @@ -1715,7 +1715,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, VirtualM _eventDao.persist(event); - _vmDao.updateIf(vm, VirtualMachine.Event.OperationSucceeded, null); + _itMgr.stateTransitTo(vm, VirtualMachine.Event.OperationSucceeded, null); if (s_logger.isDebugEnabled()) { s_logger.debug("vm created " + vmId); } @@ -1876,7 +1876,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, VirtualM _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); 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 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); } @@ -2032,7 +2032,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, VirtualM txn.start(); - if (!_vmDao.updateIf(vm, e, null)) { + if (!_itMgr.stateTransitTo(vm, e, null)) { s_logger.debug("Unable to update "); return; } @@ -2111,7 +2111,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, VirtualM 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()); return false; } @@ -2155,7 +2155,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, VirtualM } event.setLevel(EventVO.LEVEL_ERROR); _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()); } @@ -2167,7 +2167,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, VirtualM if (s_logger.isDebugEnabled()) { 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()); return false; } @@ -2234,7 +2234,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, VirtualM public boolean migrate(UserVmVO vm, HostVO host) throws AgentUnavailableException, OperationTimedoutException { 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."); return false; } @@ -2266,7 +2266,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, VirtualM releaseGuestIpAddress(vm); vm.setGuestNetmask(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"); continue; } @@ -2335,14 +2335,14 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, VirtualM CheckVirtualMachineAnswer answer = (CheckVirtualMachineAnswer)_agentMgr.send(host.getId(), cvm); if (!answer.getResult()) { 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; } State state = answer.getState(); if (state == State.Stopped) { 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; } @@ -2353,7 +2353,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, VirtualM Transaction txn = Transaction.currentTxn(); try { txn.start(); - _vmDao.updateIf(vm, VirtualMachine.Event.OperationSucceeded, host.getId()); + _itMgr.stateTransitTo(vm, VirtualMachine.Event.OperationSucceeded, host.getId()); txn.commit(); _networkGroupMgr.handleVmStateTransition(vm, State.Running); return true; @@ -2936,7 +2936,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, VirtualM } _eventDao.persist(event); - _vmDao.updateIf(vm, VirtualMachine.Event.OperationSucceeded, null); + _itMgr.stateTransitTo(vm, VirtualMachine.Event.OperationSucceeded, null); if (s_logger.isDebugEnabled()) { s_logger.debug("vm created " + vmId); } @@ -3093,7 +3093,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, VirtualM } _eventDao.persist(event); - _vmDao.updateIf(vm, VirtualMachine.Event.OperationSucceeded, null); + _itMgr.stateTransitTo(vm, VirtualMachine.Event.OperationSucceeded, null); if (s_logger.isDebugEnabled()) { s_logger.debug("vm created " + vmId); } diff --git a/server/src/com/cloud/vm/VMStateListener.java b/server/src/com/cloud/vm/VMStateListener.java index d07ffefbbfe..6c753e3aab9 100644 --- a/server/src/com/cloud/vm/VMStateListener.java +++ b/server/src/com/cloud/vm/VMStateListener.java @@ -1,16 +1,18 @@ package com.cloud.vm; +import org.apache.log4j.Logger; + import com.cloud.capacity.CapacityVO; import com.cloud.capacity.dao.CapacityDao; import com.cloud.service.ServiceOfferingVO; import com.cloud.service.dao.ServiceOfferingDao; -import com.cloud.utils.db.DB; import com.cloud.utils.db.Transaction; import com.cloud.utils.fsm.StateListener; import com.cloud.vm.VirtualMachine.Event; import com.cloud.vm.dao.VMInstanceDao; public class VMStateListener implements StateListener{ + private static final Logger s_logger = Logger.getLogger(VMStateListener.class); CapacityDao _capacityDao; ServiceOfferingDao _offeringDao; VMInstanceDao _vmDao; @@ -49,7 +51,23 @@ public class VMStateListener implements StateListener " + 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); + + } } diff --git a/server/src/com/cloud/vm/VmManager.java b/server/src/com/cloud/vm/VmManager.java index 49e07646f77..8d3581bfb7e 100644 --- a/server/src/com/cloud/vm/VmManager.java +++ b/server/src/com/cloud/vm/VmManager.java @@ -27,6 +27,7 @@ import com.cloud.exception.InsufficientCapacityException; import com.cloud.exception.OperationTimedoutException; import com.cloud.exception.ResourceUnavailableException; import com.cloud.exception.StorageUnavailableException; +import com.cloud.host.HostVO; import com.cloud.network.NetworkVO; import com.cloud.service.ServiceOfferingVO; import com.cloud.storage.DiskOfferingVO; @@ -78,5 +79,6 @@ public interface VmManager extends Manager { void registerGuru(VirtualMachine.Type type, VirtualMachineGuru guru); boolean stateTransitTo(VMInstanceVO vm, Event e, Long id); + } diff --git a/server/src/com/cloud/vm/dao/ConsoleProxyDao.java b/server/src/com/cloud/vm/dao/ConsoleProxyDao.java index f6ab6c94cff..9becf6d8e02 100644 --- a/server/src/com/cloud/vm/dao/ConsoleProxyDao.java +++ b/server/src/com/cloud/vm/dao/ConsoleProxyDao.java @@ -47,5 +47,5 @@ public interface ConsoleProxyDao extends GenericDao { public int getProxyActiveLoad(long proxyVmId); public List getRunningProxyListByMsid(long msid); - public boolean updateIf(ConsoleProxyVO vm, VirtualMachine.Event event, Long hostId); + //public boolean updateIf(ConsoleProxyVO vm, VirtualMachine.Event event, Long hostId); } diff --git a/server/src/com/cloud/vm/dao/ConsoleProxyDaoImpl.java b/server/src/com/cloud/vm/dao/ConsoleProxyDaoImpl.java index 7936c22a370..3142e0ff471 100644 --- a/server/src/com/cloud/vm/dao/ConsoleProxyDaoImpl.java +++ b/server/src/com/cloud/vm/dao/ConsoleProxyDaoImpl.java @@ -145,7 +145,7 @@ public class ConsoleProxyDaoImpl extends GenericDaoBase im assert _updateTimeAttr != null : "Couldn't get this updateTime attribute"; } - @Override + /* @Override public boolean updateIf(ConsoleProxyVO vm, VirtualMachine.Event event, Long hostId) { State oldState = vm.getState(); State newState = oldState.getNextState(event); @@ -195,7 +195,7 @@ public class ConsoleProxyDaoImpl extends GenericDaoBase im } return result > 0; - } + }*/ @Override diff --git a/server/src/com/cloud/vm/dao/DomainRouterDao.java b/server/src/com/cloud/vm/dao/DomainRouterDao.java index f5cc5901752..0956ed125f4 100755 --- a/server/src/com/cloud/vm/dao/DomainRouterDao.java +++ b/server/src/com/cloud/vm/dao/DomainRouterDao.java @@ -63,7 +63,7 @@ public interface DomainRouterDao extends GenericDao { * @param hostId host id to set to. * @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 diff --git a/server/src/com/cloud/vm/dao/DomainRouterDaoImpl.java b/server/src/com/cloud/vm/dao/DomainRouterDaoImpl.java index 50a43e5ae07..bf47e79396e 100755 --- a/server/src/com/cloud/vm/dao/DomainRouterDaoImpl.java +++ b/server/src/com/cloud/vm/dao/DomainRouterDaoImpl.java @@ -145,7 +145,7 @@ public class DomainRouterDaoImpl extends GenericDaoBase im return result; } - @Override + /* @Override public boolean updateIf(DomainRouterVO router, VirtualMachine.Event event, Long hostId) { if (s_logger.isDebugEnabled()) { s_logger.debug("updateIf called on " + router.toString() + " event " + event.toString() + " host " + hostId); @@ -194,7 +194,7 @@ public class DomainRouterDaoImpl extends GenericDaoBase im } return result > 0; - } + }*/ @Override public List listByDataCenter(long dcId) { diff --git a/server/src/com/cloud/vm/dao/SecondaryStorageVmDao.java b/server/src/com/cloud/vm/dao/SecondaryStorageVmDao.java index 5c6cb8e3399..d3e9e353a52 100644 --- a/server/src/com/cloud/vm/dao/SecondaryStorageVmDao.java +++ b/server/src/com/cloud/vm/dao/SecondaryStorageVmDao.java @@ -39,5 +39,5 @@ public interface SecondaryStorageVmDao extends GenericDao getRunningSecStorageVmListByMsid(long msid); - public boolean updateIf(SecondaryStorageVmVO vm, VirtualMachine.Event event, Long hostId); + //public boolean updateIf(SecondaryStorageVmVO vm, VirtualMachine.Event event, Long hostId); } diff --git a/server/src/com/cloud/vm/dao/SecondaryStorageVmDaoImpl.java b/server/src/com/cloud/vm/dao/SecondaryStorageVmDaoImpl.java index d5ff13312b8..86f4819bde7 100644 --- a/server/src/com/cloud/vm/dao/SecondaryStorageVmDaoImpl.java +++ b/server/src/com/cloud/vm/dao/SecondaryStorageVmDaoImpl.java @@ -85,7 +85,7 @@ public class SecondaryStorageVmDaoImpl extends GenericDaoBase 0; - } + }*/ @Override diff --git a/server/src/com/cloud/vm/dao/UserVmDao.java b/server/src/com/cloud/vm/dao/UserVmDao.java index 1ca3aa874f9..2b73d629247 100755 --- a/server/src/com/cloud/vm/dao/UserVmDao.java +++ b/server/src/com/cloud/vm/dao/UserVmDao.java @@ -57,7 +57,7 @@ public interface UserVmDao extends GenericDao { * @param hostId * @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 diff --git a/server/src/com/cloud/vm/dao/UserVmDaoImpl.java b/server/src/com/cloud/vm/dao/UserVmDaoImpl.java index 75650783317..9061dcbeb11 100755 --- a/server/src/com/cloud/vm/dao/UserVmDaoImpl.java +++ b/server/src/com/cloud/vm/dao/UserVmDaoImpl.java @@ -175,7 +175,7 @@ public class UserVmDaoImpl extends GenericDaoBase implements Use return listIncludingRemovedBy(sc); } - @Override + /* @Override public boolean updateIf(UserVmVO vm, VirtualMachine.Event event, Long hostId) { if (s_logger.isDebugEnabled()) { s_logger.debug("UpdateIf called " + vm.toString() + " event " + event.toString() + " host " + hostId); @@ -224,7 +224,7 @@ public class UserVmDaoImpl extends GenericDaoBase implements Use } return result > 0; - } + }*/ @Override public List findDestroyedVms(Date date) { diff --git a/server/src/com/cloud/vm/dao/VMInstanceDao.java b/server/src/com/cloud/vm/dao/VMInstanceDao.java index 8403cf6d3b8..c3963afc26e 100644 --- a/server/src/com/cloud/vm/dao/VMInstanceDao.java +++ b/server/src/com/cloud/vm/dao/VMInstanceDao.java @@ -53,7 +53,7 @@ public interface VMInstanceDao extends GenericDao, StateDao< */ public List 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. diff --git a/server/src/com/cloud/vm/dao/VMInstanceDaoImpl.java b/server/src/com/cloud/vm/dao/VMInstanceDaoImpl.java index e927a8dea49..1c5341df047 100644 --- a/server/src/com/cloud/vm/dao/VMInstanceDaoImpl.java +++ b/server/src/com/cloud/vm/dao/VMInstanceDaoImpl.java @@ -140,7 +140,7 @@ public class VMInstanceDaoImpl extends GenericDaoBase implem return listBy(sc); } - @Override + /* @Override public boolean updateIf(VMInstanceVO vm, VirtualMachine.Event event, Long hostId) { State oldState = vm.getState(); @@ -174,7 +174,7 @@ public class VMInstanceDaoImpl extends GenericDaoBase implem s_logger.debug(str.toString()); } return result > 0; - } + }*/ @Override public List listByHostId(long hostid) {