You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by ap...@apache.org on 2013/07/25 13:56:41 UTC

[03/50] git commit: updated refs/heads/ldapplugin to 1f64354

Moved the rest of VirtualMachineManager to be vm agnostic


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/e99a1ef1
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/e99a1ef1
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/e99a1ef1

Branch: refs/heads/ldapplugin
Commit: e99a1ef1d947ae2161cd64f97a089ef6f042a59e
Parents: 9bc5870
Author: Alex Huang <al...@citrix.com>
Authored: Tue Jul 23 18:24:44 2013 -0700
Committer: Alex Huang <al...@citrix.com>
Committed: Tue Jul 23 18:24:59 2013 -0700

----------------------------------------------------------------------
 .../cloud/ha/HighAvailabilityManagerImpl.java   |  12 +-
 server/src/com/cloud/storage/VolumeManager.java |   6 +-
 .../com/cloud/storage/VolumeManagerImpl.java    |  10 +-
 server/src/com/cloud/vm/UserVmManagerImpl.java  |  23 +-
 .../src/com/cloud/vm/VirtualMachineManager.java |  17 +-
 .../com/cloud/vm/VirtualMachineManagerImpl.java |  85 ++---
 .../cloud/vm/VirtualMachineManagerImplTest.java | 315 ++++++++++---------
 7 files changed, 229 insertions(+), 239 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e99a1ef1/server/src/com/cloud/ha/HighAvailabilityManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/ha/HighAvailabilityManagerImpl.java b/server/src/com/cloud/ha/HighAvailabilityManagerImpl.java
index a7e0bd9..71c1a4d 100755
--- a/server/src/com/cloud/ha/HighAvailabilityManagerImpl.java
+++ b/server/src/com/cloud/ha/HighAvailabilityManagerImpl.java
@@ -51,7 +51,6 @@ import com.cloud.exception.InsufficientCapacityException;
 import com.cloud.exception.InsufficientServerCapacityException;
 import com.cloud.exception.OperationTimedoutException;
 import com.cloud.exception.ResourceUnavailableException;
-import com.cloud.exception.VirtualMachineMigrationException;
 import com.cloud.ha.dao.HighAvailabilityDao;
 import com.cloud.host.Host;
 import com.cloud.host.HostVO;
@@ -573,20 +572,15 @@ public class HighAvailabilityManagerImpl extends ManagerBase implements HighAvai
         try {
             work.setStep(Step.Migrating);
             _haDao.update(work.getId(), work);
+            
+            VMInstanceVO vm = _instanceDao.findById(vmId);
 
-            if (!_itMgr.migrateAway(work.getType(), vmId, srcHostId)) {
-                s_logger.warn("Unable to migrate vm from " + srcHostId);
-                _resourceMgr.maintenanceFailed(srcHostId);
-            }
+            _itMgr.migrateAway(vm.getUuid(), srcHostId);
             return null;
         } catch (InsufficientServerCapacityException e) {
             s_logger.warn("Insufficient capacity for migrating a VM.");
             _resourceMgr.maintenanceFailed(srcHostId);
             return (System.currentTimeMillis() >> 10) + _migrateRetryInterval;
-        } catch (VirtualMachineMigrationException e) {
-            s_logger.warn("Looks like VM is still starting, we need to retry migrating the VM later.");
-            _resourceMgr.maintenanceFailed(srcHostId);
-            return (System.currentTimeMillis() >> 10) + _migrateRetryInterval;
         }
     }
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e99a1ef1/server/src/com/cloud/storage/VolumeManager.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/storage/VolumeManager.java b/server/src/com/cloud/storage/VolumeManager.java
index d9bbd54..13ddbab 100644
--- a/server/src/com/cloud/storage/VolumeManager.java
+++ b/server/src/com/cloud/storage/VolumeManager.java
@@ -27,7 +27,6 @@ import org.apache.cloudstack.api.command.user.volume.MigrateVolumeCmd;
 import org.apache.cloudstack.api.command.user.volume.ResizeVolumeCmd;
 import org.apache.cloudstack.api.command.user.volume.UploadVolumeCmd;
 import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
-import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
 
 import com.cloud.agent.api.to.VirtualMachineTO;
 import com.cloud.deploy.DeployDestination;
@@ -41,6 +40,7 @@ import com.cloud.storage.Volume.Type;
 import com.cloud.user.Account;
 import com.cloud.vm.DiskProfile;
 import com.cloud.vm.VMInstanceVO;
+import com.cloud.vm.VirtualMachine;
 import com.cloud.vm.VirtualMachineProfile;
 
 public interface VolumeManager extends VolumeApiService {
@@ -91,8 +91,8 @@ public interface VolumeManager extends VolumeApiService {
     @Override
     Volume migrateVolume(MigrateVolumeCmd cmd);
 
-    <T extends VMInstanceVO> void migrateVolumes(T vm, VirtualMachineTO vmTo, Host srcHost, Host destHost,
-            Map<VolumeVO, StoragePoolVO> volumeToPool);
+    void migrateVolumes(VirtualMachine vm, VirtualMachineTO vmTo, Host srcHost, Host destHost,
+            Map<Volume, StoragePool> volumeToPool);
 
     boolean storageMigration(VirtualMachineProfile vm, StoragePool destPool);
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e99a1ef1/server/src/com/cloud/storage/VolumeManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/storage/VolumeManagerImpl.java b/server/src/com/cloud/storage/VolumeManagerImpl.java
index f9e04f6..c4ffc1b 100644
--- a/server/src/com/cloud/storage/VolumeManagerImpl.java
+++ b/server/src/com/cloud/storage/VolumeManagerImpl.java
@@ -2243,15 +2243,15 @@ public class VolumeManagerImpl extends ManagerBase implements VolumeManager {
     }
 
     @Override
-    public <T extends VMInstanceVO> void migrateVolumes(T vm, VirtualMachineTO vmTo, Host srcHost, Host destHost,
-            Map<VolumeVO, StoragePoolVO> volumeToPool) {
+    public void migrateVolumes(VirtualMachine vm, VirtualMachineTO vmTo, Host srcHost, Host destHost,
+            Map<Volume, StoragePool> volumeToPool) {
         // Check if all the vms being migrated belong to the vm.
         // Check if the storage pool is of the right type.
         // Create a VolumeInfo to DataStore map too.
         Map<VolumeInfo, DataStore> volumeMap = new HashMap<VolumeInfo, DataStore>();
-        for (Map.Entry<VolumeVO, StoragePoolVO> entry : volumeToPool.entrySet()) {
-            VolumeVO volume = entry.getKey();
-            StoragePoolVO storagePool = entry.getValue();
+        for (Map.Entry<Volume, StoragePool> entry : volumeToPool.entrySet()) {
+            Volume volume = entry.getKey();
+            StoragePool storagePool = entry.getValue();
             StoragePool destPool = (StoragePool)dataStoreMgr.getDataStore(storagePool.getId(),
                     DataStoreRole.Primary);
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e99a1ef1/server/src/com/cloud/vm/UserVmManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java
index 6db1e8a..ae12523 100755
--- a/server/src/com/cloud/vm/UserVmManagerImpl.java
+++ b/server/src/com/cloud/vm/UserVmManagerImpl.java
@@ -33,6 +33,9 @@ import javax.ejb.Local;
 import javax.inject.Inject;
 import javax.naming.ConfigurationException;
 
+import org.apache.commons.codec.binary.Base64;
+import org.apache.log4j.Logger;
+
 import org.apache.cloudstack.acl.ControlledEntity.ACLType;
 import org.apache.cloudstack.acl.SecurityChecker.AccessType;
 import org.apache.cloudstack.affinity.AffinityGroupService;
@@ -66,8 +69,6 @@ import org.apache.cloudstack.engine.subsystem.api.storage.TemplateInfo;
 import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
 import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
 import org.apache.cloudstack.storage.to.TemplateObjectTO;
-import org.apache.commons.codec.binary.Base64;
-import org.apache.log4j.Logger;
 
 import com.cloud.agent.AgentManager;
 import com.cloud.agent.api.Answer;
@@ -735,8 +736,6 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
     private UserVm rebootVirtualMachine(long userId, long vmId)
             throws InsufficientCapacityException, ResourceUnavailableException {
         UserVmVO vm = _vmDao.findById(vmId);
-        User caller = _accountMgr.getActiveUser(userId);
-        Account owner = _accountMgr.getAccount(vm.getAccountId());
 
         if (vm == null || vm.getState() == State.Destroyed
                 || vm.getState() == State.Expunging || vm.getRemoved() != null) {
@@ -746,10 +745,10 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
 
         if (vm.getState() == State.Running && vm.getHostId() != null) {
             collectVmDiskStatistics(vm);
-            return _itMgr.reboot(vm, null, caller, owner);
+            _itMgr.reboot(vm.getUuid(), null);
+            return _vmDao.findById(vmId);
         } else {
-            s_logger.error("Vm id=" + vmId
-                    + " is not in Running state, failed to reboot");
+            s_logger.error("Vm id=" + vmId + " is not in Running state, failed to reboot");
             return null;
         }
     }
@@ -3875,8 +3874,8 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
         if (uservm != null) {
             collectVmDiskStatistics(uservm);
         }
-        VMInstanceVO migratedVm = _itMgr.migrate(vm, srcHostId, dest);
-        return migratedVm;
+        _itMgr.migrate(vm.getUuid(), srcHostId, dest);
+        return _vmDao.findById(vmId);
     }
 
     private boolean checkIfHostIsDedicated(HostVO host) {
@@ -4164,7 +4163,7 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
         }
 
         List<VolumeVO> vmVolumes = _volsDao.findUsableVolumesForInstance(vm.getId());
-        Map<VolumeVO, StoragePoolVO> volToPoolObjectMap = new HashMap<VolumeVO, StoragePoolVO>();
+        Map<Volume, StoragePool> volToPoolObjectMap = new HashMap<Volume, StoragePool>();
         if (!isVMUsingLocalStorage(vm) && destinationHost.getClusterId().equals(srcHost.getClusterId())) {
             if (volumeToPool.isEmpty()) {
                 // If the destination host is in the same cluster and volumes do not have to be migrated across pools
@@ -4214,8 +4213,8 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
 
         checkHostsDedication(vm, srcHostId, destinationHost.getId());
 
-        VMInstanceVO migratedVm = _itMgr.migrateWithStorage(vm, srcHostId, destinationHost.getId(), volToPoolObjectMap);
-        return migratedVm;
+        _itMgr.migrateWithStorage(vm.getUuid(), srcHostId, destinationHost.getId(), volToPoolObjectMap);
+        return _vmDao.findById(vm.getId());
 }
 
     @DB

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e99a1ef1/server/src/com/cloud/vm/VirtualMachineManager.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/vm/VirtualMachineManager.java b/server/src/com/cloud/vm/VirtualMachineManager.java
index 5dbd80a..79fa6f1 100644
--- a/server/src/com/cloud/vm/VirtualMachineManager.java
+++ b/server/src/com/cloud/vm/VirtualMachineManager.java
@@ -20,8 +20,6 @@ import java.net.URI;
 import java.util.List;
 import java.util.Map;
 
-import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
-
 import com.cloud.agent.api.to.NicTO;
 import com.cloud.agent.api.to.VirtualMachineTO;
 import com.cloud.deploy.DeployDestination;
@@ -43,9 +41,7 @@ import com.cloud.service.ServiceOfferingVO;
 import com.cloud.storage.DiskOfferingVO;
 import com.cloud.storage.StoragePool;
 import com.cloud.storage.VMTemplateVO;
-import com.cloud.storage.VolumeVO;
-import com.cloud.user.Account;
-import com.cloud.user.User;
+import com.cloud.storage.Volume;
 import com.cloud.utils.Pair;
 import com.cloud.utils.component.Manager;
 import com.cloud.utils.fsm.NoTransitionException;
@@ -96,15 +92,16 @@ public interface VirtualMachineManager extends Manager {
 
     void destroy(String vmUuid) throws AgentUnavailableException, OperationTimedoutException, ConcurrentOperationException;
 
-    boolean migrateAway(VirtualMachine.Type type, long vmid, long hostId) throws InsufficientServerCapacityException, VirtualMachineMigrationException;
+    void migrateAway(String vmUuid, long hostId) throws InsufficientServerCapacityException;
 
-    <T extends VMInstanceVO> T migrate(T vm, long srcHostId, DeployDestination dest) throws ResourceUnavailableException, ConcurrentOperationException, ManagementServerException, VirtualMachineMigrationException;
+    void migrate(String vmUuid, long srcHostId, DeployDestination dest) throws ResourceUnavailableException, ConcurrentOperationException;
 
-    <T extends VMInstanceVO> T migrateWithStorage(T vm, long srcId, long destId, Map<VolumeVO, StoragePoolVO> volumeToPool) throws ResourceUnavailableException, ConcurrentOperationException, ManagementServerException, VirtualMachineMigrationException;
+    void migrateWithStorage(String vmUuid, long srcId, long destId, Map<Volume, StoragePool> volumeToPool) throws ResourceUnavailableException, ConcurrentOperationException;
 
-    <T extends VMInstanceVO> T reboot(T vm, Map<VirtualMachineProfile.Param, Object> params, User caller, Account account) throws InsufficientCapacityException, ResourceUnavailableException;
+    void reboot(String vmUuid, Map<VirtualMachineProfile.Param, Object> params) throws InsufficientCapacityException, ResourceUnavailableException;
 
-    <T extends VMInstanceVO> T advanceReboot(T vm, Map<VirtualMachineProfile.Param, Object> params, User caller, Account account) throws InsufficientCapacityException, ResourceUnavailableException, ConcurrentOperationException, OperationTimedoutException;
+    void advanceReboot(String vmUuid, Map<VirtualMachineProfile.Param, Object> params) throws InsufficientCapacityException, ResourceUnavailableException,
+            ConcurrentOperationException, OperationTimedoutException;
 
     /**
      * Check to see if a virtual machine can be upgraded to the given service offering

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e99a1ef1/server/src/com/cloud/vm/VirtualMachineManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/vm/VirtualMachineManagerImpl.java b/server/src/com/cloud/vm/VirtualMachineManagerImpl.java
index 8fbdb19..33dadf0 100755
--- a/server/src/com/cloud/vm/VirtualMachineManagerImpl.java
+++ b/server/src/com/cloud/vm/VirtualMachineManagerImpl.java
@@ -1443,17 +1443,18 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
     }
 
     @Override
-    public <T extends VMInstanceVO> T migrate(T vmm, long srcHostId, DeployDestination dest) throws ResourceUnavailableException, ConcurrentOperationException,
-            ManagementServerException,
-    VirtualMachineMigrationException {
-        VMInstanceVO vm = _vmDao.findByUuid(vmm.getUuid());
+    public void migrate(String vmUuid, long srcHostId, DeployDestination dest) throws ResourceUnavailableException, ConcurrentOperationException {
+        VMInstanceVO vm = _vmDao.findByUuid(vmUuid);
         if (vm == null) {
             if (s_logger.isDebugEnabled()) {
-                s_logger.debug("Unable to find the vm " + vm);
+                s_logger.debug("Unable to find the vm " + vmUuid);
             }
-            throw new CloudRuntimeException("Unable to find a virtual machine with id " + vmm.getUuid());
+            throw new CloudRuntimeException("Unable to find a virtual machine with id " + vmUuid);
         }
+        migrate(vm, srcHostId, dest);
+    }
 
+    protected void migrate(VMInstanceVO vm, long srcHostId, DeployDestination dest) throws ResourceUnavailableException, ConcurrentOperationException {
         s_logger.info("Migrating " + vm + " to " + dest);
 
         long dstHostId = dest.getHost().getId();
@@ -1474,7 +1475,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
             if (s_logger.isDebugEnabled()) {
                 s_logger.debug("VM is not Running, unable to migrate the vm " + vm);
             }
-            throw new VirtualMachineMigrationException("VM is not Running, unable to migrate the vm currently " + vm + " , current state: " + vm.getState().toString());
+            throw new CloudRuntimeException("VM is not Running, unable to migrate the vm currently " + vm + " , current state: " + vm.getState().toString());
         }
 
         short alertType = AlertManager.ALERT_TYPE_USERVM_MIGRATE;
@@ -1542,8 +1543,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
             try {
                 MigrateAnswer ma = (MigrateAnswer) _agentMgr.send(vm.getLastHostId(), mc);
                 if (!ma.getResult()) {
-                    s_logger.error("Unable to migrate due to " + ma.getDetails());
-                    return null;
+                    throw new CloudRuntimeException("Unable to migrate due to " + ma.getDetails());
                 }
             } catch (OperationTimedoutException e) {
                 if (e.isActive()) {
@@ -1570,13 +1570,12 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
                         s_logger.error("AgentUnavailableException while cleanup on source host: " + srcHostId);
                     }
                     cleanup(vmGuru, new VirtualMachineProfileImpl(vm), work, Event.AgentReportStopped, true);
-                    return null;
+                    throw new CloudRuntimeException("Unable to complete migration for " + vm);
                 }
             } catch (OperationTimedoutException e) {
             }
 
             migrated = true;
-            return vmm;
         } finally {
             if (!migrated) {
                 s_logger.info("Migration was unsuccessful.  Cleaning up: " + vm);
@@ -1604,11 +1603,10 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
         }
     }
 
-    private Map<VolumeVO, StoragePoolVO> getPoolListForVolumesForMigration(VirtualMachineProfile profile,
-            Host host, Map<VolumeVO, StoragePoolVO> volumeToPool) {
+    private Map<Volume, StoragePool> getPoolListForVolumesForMigration(VirtualMachineProfile profile, Host host, Map<Volume, StoragePool> volumeToPool) {
         List<VolumeVO> allVolumes = _volsDao.findUsableVolumesForInstance(profile.getId());
         for (VolumeVO volume : allVolumes) {
-            StoragePoolVO pool = volumeToPool.get(volume);
+            StoragePool pool = volumeToPool.get(volume);
             DiskOfferingVO diskOffering = _diskOfferingDao.findById(volume.getDiskOfferingId());
             StoragePoolVO currentPool = _storagePoolDao.findById(volume.getPoolId());
             if (pool != null) {
@@ -1692,10 +1690,9 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
     }
 
     @Override
-    public <T extends VMInstanceVO> T migrateWithStorage(T vmm, long srcHostId, long destHostId,
-            Map<VolumeVO, StoragePoolVO> volumeToPool) throws ResourceUnavailableException, ConcurrentOperationException,
-            ManagementServerException, VirtualMachineMigrationException {
-        VMInstanceVO vm = _vmDao.findByUuid(vmm.getUuid());
+    public void migrateWithStorage(String vmUuid, long srcHostId, long destHostId, Map<Volume, StoragePool> volumeToPool) throws ResourceUnavailableException,
+            ConcurrentOperationException {
+        VMInstanceVO vm = _vmDao.findByUuid(vmUuid);
 
         HostVO srcHost = _hostDao.findById(srcHostId);
         HostVO destHost = _hostDao.findById(destHostId);
@@ -1756,14 +1753,13 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
                         s_logger.error("AgentUnavailableException while cleanup on source host: " + srcHostId);
                     }
                     cleanup(vmGuru, new VirtualMachineProfileImpl(vm), work, Event.AgentReportStopped, true);
-                    return null;
+                    throw new CloudRuntimeException("VM not found on desintation host. Unable to complete migration for " + vm);
                 }
             } catch (OperationTimedoutException e) {
                 s_logger.warn("Error while checking the vm " + vm + " is on host " + destHost, e);
             }
 
             migrated = true;
-            return vmm;
         } finally {
             if (!migrated) {
                 s_logger.info("Migration was unsuccessful.  Cleaning up: " + vm);
@@ -1832,11 +1828,11 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
     }
 
     @Override
-    public boolean migrateAway(VirtualMachine.Type vmType, long vmId, long srcHostId) throws InsufficientServerCapacityException, VirtualMachineMigrationException {
-        VMInstanceVO vm = _vmDao.findById(vmId);
+    public void migrateAway(String vmUuid, long srcHostId) throws InsufficientServerCapacityException {
+        VMInstanceVO vm = _vmDao.findByUuid(vmUuid);
         if (vm == null) {
-            s_logger.debug("Unable to find a VM for " + vmId);
-            return true;
+            s_logger.debug("Unable to find a VM for " + vmUuid);
+            throw new CloudRuntimeException("Unable to find " + vmUuid);
         }
 
         VirtualMachineProfile profile = new VirtualMachineProfileImpl(vm);
@@ -1844,7 +1840,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
         Long hostId = vm.getHostId();
         if (hostId == null) {
             s_logger.debug("Unable to migrate because the VM doesn't have a host id: " + vm);
-            return true;
+            throw new CloudRuntimeException("Unable to migrate " + vmUuid);
         }
 
         Host host = _hostDao.findById(hostId);
@@ -1876,38 +1872,28 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
             }
 
             excludes.addHost(dest.getHost().getId());
-            VMInstanceVO vmInstance = null;
             try {
-                vmInstance = migrate(vm, srcHostId, dest);
+                migrate(vm, srcHostId, dest);
+                return;
             } catch (ResourceUnavailableException e) {
                 s_logger.debug("Unable to migrate to unavailable " + dest);
             } catch (ConcurrentOperationException e) {
                 s_logger.debug("Unable to migrate VM due to: " + e.getMessage());
-            } catch (ManagementServerException e) {
-                s_logger.debug("Unable to migrate VM: " + e.getMessage());
-            } catch (VirtualMachineMigrationException e) {
-                s_logger.debug("Got VirtualMachineMigrationException, Unable to migrate: " + e.getMessage());
-                if (vm.getState() == State.Starting) {
-                    s_logger.debug("VM seems to be still Starting, we should retry migration later");
-                    throw e;
-                } else {
-                    s_logger.debug("Unable to migrate VM, VM is not in Running or even Starting state, current state: " + vm.getState().toString());
-                }
-            }
-            if (vmInstance != null) {
-                return true;
             }
+
             try {
                 advanceStop(vm, true);
-                return true;
+                throw new CloudRuntimeException("Unable to migrate " + vm);
             } catch (ResourceUnavailableException e) {
                 s_logger.debug("Unable to stop VM due to " + e.getMessage());
+                throw new CloudRuntimeException("Unable to migrate " + vm);
             } catch (ConcurrentOperationException e) {
                 s_logger.debug("Unable to stop VM due to " + e.getMessage());
+                throw new CloudRuntimeException("Unable to migrate " + vm);
             } catch (OperationTimedoutException e) {
                 s_logger.debug("Unable to stop VM due to " + e.getMessage());
+                throw new CloudRuntimeException("Unable to migrate " + vm);
             }
-            return false;
         }
     }
 
@@ -1938,18 +1924,18 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
     }
 
     @Override
-    public <T extends VMInstanceVO> T reboot(T vm, Map<VirtualMachineProfile.Param, Object> params, User caller, Account account) throws InsufficientCapacityException, ResourceUnavailableException {
+    public void reboot(String vmUuid, Map<VirtualMachineProfile.Param, Object> params) throws InsufficientCapacityException, ResourceUnavailableException {
         try {
-            return advanceReboot(vm, params, caller, account);
+            advanceReboot(vmUuid, params);
         } catch (ConcurrentOperationException e) {
             throw new CloudRuntimeException("Unable to reboot a VM due to concurrent operation", e);
         }
     }
 
     @Override
-    public <T extends VMInstanceVO> T advanceReboot(T vm, Map<VirtualMachineProfile.Param, Object> params, User caller, Account account) throws InsufficientCapacityException,
-    ConcurrentOperationException, ResourceUnavailableException {
-        T rebootedVm = null;
+    public void advanceReboot(String vmUuid, Map<VirtualMachineProfile.Param, Object> params) throws InsufficientCapacityException, ConcurrentOperationException,
+            ResourceUnavailableException {
+        VMInstanceVO vm = _vmDao.findByUuid(vmUuid);
 
         DataCenter dc = _configMgr.getZone(vm.getDataCenterId());
         Host host = _hostDao.findById(vm.getHostId());
@@ -1968,16 +1954,13 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
 
             Answer rebootAnswer = cmds.getAnswer(RebootAnswer.class);
             if (rebootAnswer != null && rebootAnswer.getResult()) {
-                rebootedVm = vm;
-                return rebootedVm;
+                return;
             }
             s_logger.info("Unable to reboot VM " + vm + " on " + dest.getHost() + " due to " + (rebootAnswer == null ? " no reboot answer" : rebootAnswer.getDetails()));
         } catch (OperationTimedoutException e) {
             s_logger.warn("Unable to send the reboot command to host " + dest.getHost() + " for the vm " + vm + " due to operation timeout", e);
             throw new CloudRuntimeException("Failed to reboot the vm on host " + dest.getHost());
         }
-
-        return rebootedVm;
     }
 
     public Command cleanup(VirtualMachine vm) {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e99a1ef1/server/test/com/cloud/vm/VirtualMachineManagerImplTest.java
----------------------------------------------------------------------
diff --git a/server/test/com/cloud/vm/VirtualMachineManagerImplTest.java b/server/test/com/cloud/vm/VirtualMachineManagerImplTest.java
index 8490301..44a703d 100644
--- a/server/test/com/cloud/vm/VirtualMachineManagerImplTest.java
+++ b/server/test/com/cloud/vm/VirtualMachineManagerImplTest.java
@@ -79,8 +79,10 @@ import com.cloud.network.NetworkManager;
 import com.cloud.server.ConfigurationServer;
 import com.cloud.service.ServiceOfferingVO;
 import com.cloud.storage.DiskOfferingVO;
+import com.cloud.storage.StoragePool;
 import com.cloud.storage.StoragePoolHostVO;
 import com.cloud.storage.VMTemplateVO;
+import com.cloud.storage.Volume;
 import com.cloud.storage.VolumeManager;
 import com.cloud.storage.VolumeVO;
 import com.cloud.storage.dao.DiskOfferingDao;
@@ -104,134 +106,149 @@ import com.cloud.vm.snapshot.VMSnapshotManager;
 
 public class VirtualMachineManagerImplTest {
 
-        @Spy VirtualMachineManagerImpl _vmMgr = new VirtualMachineManagerImpl();
-        @Mock
-        VolumeManager _storageMgr;
-        @Mock
-        Account _account;
-        @Mock
-        AccountManager _accountMgr;
-        @Mock
-        ConfigurationManager _configMgr;
-        @Mock
-        CapacityManager _capacityMgr;
-        @Mock
-        AgentManager _agentMgr;
-        @Mock
-        AccountDao _accountDao;
-        @Mock
-        ConfigurationDao _configDao;
-        @Mock
-        HostDao _hostDao;
-        @Mock
-        UserDao _userDao;
-        @Mock
-        UserVmDao _vmDao;
-        @Mock
-        ItWorkDao _workDao;
-        @Mock
-        VMInstanceDao _vmInstanceDao;
-        @Mock
-        VMTemplateDao _templateDao;
-        @Mock
-        VolumeDao _volsDao;
-        @Mock
-        RestoreVMCmd _restoreVMCmd;
-        @Mock
-        AccountVO _accountMock;
-        @Mock
-        UserVO _userMock;
-        @Mock
-        UserVmVO _vmMock;
-        @Mock
-        VMInstanceVO _vmInstance;
-        @Mock
-        HostVO _host;
-        @Mock
-        VMTemplateVO _templateMock;
-        @Mock
-        VolumeVO _volumeMock;
-        @Mock
-        List<VolumeVO> _rootVols;
-        @Mock
-        ItWorkVO _work;
-        @Mock
-        ConfigurationServer _configServer;
-        @Mock
-        HostVO hostVO;
-        @Mock
-        UserVmDetailVO _vmDetailVO;
-
-        @Mock ClusterDao _clusterDao;
-        @Mock HostPodDao _podDao;
-        @Mock DataCenterDao _dcDao;
-        @Mock DiskOfferingDao _diskOfferingDao;
-        @Mock PrimaryDataStoreDao _storagePoolDao;
-        @Mock UserVmDetailsDao _vmDetailsDao;
-        @Mock StoragePoolHostDao _poolHostDao;
-        @Mock NetworkManager _networkMgr;
-        @Mock HypervisorGuruManager _hvGuruMgr;
-        @Mock VMSnapshotManager _vmSnapshotMgr;
-
-        // Mock objects for vm migration with storage test.
-        @Mock DiskOfferingVO _diskOfferingMock;
-        @Mock StoragePoolVO _srcStoragePoolMock;
-        @Mock StoragePoolVO _destStoragePoolMock;
-        @Mock HostVO _srcHostMock;
-        @Mock HostVO _destHostMock;
-        @Mock Map<VolumeVO, StoragePoolVO> _volumeToPoolMock;
-
-        @Before
-        public void setup(){
-            MockitoAnnotations.initMocks(this);
-
-            _vmMgr._templateDao = _templateDao;
-            _vmMgr._volsDao = _volsDao;
-            _vmMgr.volumeMgr = _storageMgr;
-            _vmMgr._accountDao = _accountDao;
-            _vmMgr._accountMgr = _accountMgr;
-            _vmMgr._configMgr = _configMgr;
-            _vmMgr._capacityMgr = _capacityMgr;
-            _vmMgr._hostDao = _hostDao;
-            _vmMgr._nodeId = 1L;
-            _vmMgr._workDao = _workDao;
-            _vmMgr._agentMgr = _agentMgr;
-            _vmMgr._podDao = _podDao;
-            _vmMgr._clusterDao = _clusterDao;
-            _vmMgr._dcDao = _dcDao;
-            _vmMgr._diskOfferingDao = _diskOfferingDao;
-            _vmMgr._storagePoolDao = _storagePoolDao;
-            _vmMgr._poolHostDao= _poolHostDao;
-            _vmMgr._networkMgr = _networkMgr;
-            _vmMgr._hvGuruMgr = _hvGuruMgr;
-            _vmMgr._vmSnapshotMgr = _vmSnapshotMgr;
-            _vmMgr._vmDao = _vmInstanceDao;
-            _vmMgr._configServer = _configServer;
-            _vmMgr._uservmDetailsDao = _vmDetailsDao;
-
-            when(_vmMock.getId()).thenReturn(314l);
-            when(_vmInstance.getId()).thenReturn(1L);
-            when(_vmInstance.getServiceOfferingId()).thenReturn(2L);
-            when(_vmInstance.getInstanceName()).thenReturn("myVm");
-            when(_vmInstance.getHostId()).thenReturn(2L);
-            when(_vmInstance.getType()).thenReturn(VirtualMachine.Type.User);
-            when(_host.getId()).thenReturn(1L);
-            when(_hostDao.findById(anyLong())).thenReturn(null);
-            when(_configMgr.getServiceOffering(anyLong())).thenReturn(getSvcoffering(512));
-            when(_workDao.persist(_work)).thenReturn(_work);
-            when(_workDao.update("1", _work)).thenReturn(true);
-            when(_work.getId()).thenReturn("1");
-            doNothing().when(_work).setStep(ItWorkVO.Step.Done);
+    @Spy
+    VirtualMachineManagerImpl _vmMgr = new VirtualMachineManagerImpl();
+    @Mock
+    VolumeManager _storageMgr;
+    @Mock
+    Account _account;
+    @Mock
+    AccountManager _accountMgr;
+    @Mock
+    ConfigurationManager _configMgr;
+    @Mock
+    CapacityManager _capacityMgr;
+    @Mock
+    AgentManager _agentMgr;
+    @Mock
+    AccountDao _accountDao;
+    @Mock
+    ConfigurationDao _configDao;
+    @Mock
+    HostDao _hostDao;
+    @Mock
+    UserDao _userDao;
+    @Mock
+    UserVmDao _vmDao;
+    @Mock
+    ItWorkDao _workDao;
+    @Mock
+    VMInstanceDao _vmInstanceDao;
+    @Mock
+    VMTemplateDao _templateDao;
+    @Mock
+    VolumeDao _volsDao;
+    @Mock
+    RestoreVMCmd _restoreVMCmd;
+    @Mock
+    AccountVO _accountMock;
+    @Mock
+    UserVO _userMock;
+    @Mock
+    UserVmVO _vmMock;
+    @Mock
+    VMInstanceVO _vmInstance;
+    @Mock
+    HostVO _host;
+    @Mock
+    VMTemplateVO _templateMock;
+    @Mock
+    VolumeVO _volumeMock;
+    @Mock
+    List<VolumeVO> _rootVols;
+    @Mock
+    ItWorkVO _work;
+    @Mock
+    ConfigurationServer _configServer;
+    @Mock
+    HostVO hostVO;
+    @Mock
+    UserVmDetailVO _vmDetailVO;
+
+    @Mock
+    ClusterDao _clusterDao;
+    @Mock
+    HostPodDao _podDao;
+    @Mock
+    DataCenterDao _dcDao;
+    @Mock
+    DiskOfferingDao _diskOfferingDao;
+    @Mock
+    PrimaryDataStoreDao _storagePoolDao;
+    @Mock
+    UserVmDetailsDao _vmDetailsDao;
+    @Mock
+    StoragePoolHostDao _poolHostDao;
+    @Mock
+    NetworkManager _networkMgr;
+    @Mock
+    HypervisorGuruManager _hvGuruMgr;
+    @Mock
+    VMSnapshotManager _vmSnapshotMgr;
+
+    // Mock objects for vm migration with storage test.
+    @Mock
+    DiskOfferingVO _diskOfferingMock;
+    @Mock
+    StoragePoolVO _srcStoragePoolMock;
+    @Mock
+    StoragePoolVO _destStoragePoolMock;
+    @Mock
+    HostVO _srcHostMock;
+    @Mock
+    HostVO _destHostMock;
+    @Mock
+    Map<Volume, StoragePool> _volumeToPoolMock;
+
+    @Before
+    public void setup() {
+        MockitoAnnotations.initMocks(this);
+
+        _vmMgr._templateDao = _templateDao;
+        _vmMgr._volsDao = _volsDao;
+        _vmMgr.volumeMgr = _storageMgr;
+        _vmMgr._accountDao = _accountDao;
+        _vmMgr._accountMgr = _accountMgr;
+        _vmMgr._configMgr = _configMgr;
+        _vmMgr._capacityMgr = _capacityMgr;
+        _vmMgr._hostDao = _hostDao;
+        _vmMgr._nodeId = 1L;
+        _vmMgr._workDao = _workDao;
+        _vmMgr._agentMgr = _agentMgr;
+        _vmMgr._podDao = _podDao;
+        _vmMgr._clusterDao = _clusterDao;
+        _vmMgr._dcDao = _dcDao;
+        _vmMgr._diskOfferingDao = _diskOfferingDao;
+        _vmMgr._storagePoolDao = _storagePoolDao;
+        _vmMgr._poolHostDao = _poolHostDao;
+        _vmMgr._networkMgr = _networkMgr;
+        _vmMgr._hvGuruMgr = _hvGuruMgr;
+        _vmMgr._vmSnapshotMgr = _vmSnapshotMgr;
+        _vmMgr._vmDao = _vmInstanceDao;
+        _vmMgr._configServer = _configServer;
+        _vmMgr._uservmDetailsDao = _vmDetailsDao;
+
+        when(_vmMock.getId()).thenReturn(314l);
+        when(_vmInstance.getId()).thenReturn(1L);
+        when(_vmInstance.getServiceOfferingId()).thenReturn(2L);
+        when(_vmInstance.getInstanceName()).thenReturn("myVm");
+        when(_vmInstance.getHostId()).thenReturn(2L);
+        when(_vmInstance.getType()).thenReturn(VirtualMachine.Type.User);
+        when(_host.getId()).thenReturn(1L);
+        when(_hostDao.findById(anyLong())).thenReturn(null);
+        when(_configMgr.getServiceOffering(anyLong())).thenReturn(getSvcoffering(512));
+        when(_workDao.persist(_work)).thenReturn(_work);
+        when(_workDao.update("1", _work)).thenReturn(true);
+        when(_work.getId()).thenReturn("1");
+        doNothing().when(_work).setStep(ItWorkVO.Step.Done);
         when(_vmInstanceDao.findByUuid(any(String.class))).thenReturn(_vmMock);
-            //doNothing().when(_volsDao).detachVolume(anyLong());
-            //when(_work.setStep(ItWorkVO.Step.Done)).thenReturn("1");
-
-        }
-
+        //doNothing().when(_volsDao).detachVolume(anyLong());
+        //when(_work.setStep(ItWorkVO.Step.Done)).thenReturn("1");
 
-    @Test(expected=CloudRuntimeException.class)
-    public void testScaleVM1()  throws Exception {
+    }
 
+    @Test(expected = CloudRuntimeException.class)
+    public void testScaleVM1() throws Exception {
 
         DeployDestination dest = new DeployDestination(null, null, null, _host);
         long l = 1L;
@@ -241,8 +258,8 @@ public class VirtualMachineManagerImplTest {
 
     }
 
-    @Test (expected=CloudRuntimeException.class)
-    public void testScaleVM2()  throws Exception {
+    @Test(expected = CloudRuntimeException.class)
+    public void testScaleVM2() throws Exception {
 
         DeployDestination dest = new DeployDestination(null, null, null, _host);
         long l = 1L;
@@ -260,15 +277,16 @@ public class VirtualMachineManagerImplTest {
         when(_configServer.getConfigValue(Config.MemOverprovisioningFactor.key(), Config.ConfigurationParameterScope.cluster.toString(), 1L)).thenReturn("1.0");
         when(_configServer.getConfigValue(Config.CPUOverprovisioningFactor.key(), Config.ConfigurationParameterScope.cluster.toString(), 1L)).thenReturn("1.0");
         ScaleVmCommand reconfigureCmd = new ScaleVmCommand("myVmName", newServiceOffering.getCpu(),
-                newServiceOffering.getSpeed(), newServiceOffering.getSpeed(), newServiceOffering.getRamSize(), newServiceOffering.getRamSize(), newServiceOffering.getLimitCpuUse(), true);
+                newServiceOffering.getSpeed(), newServiceOffering.getSpeed(), newServiceOffering.getRamSize(), newServiceOffering.getRamSize(),
+                newServiceOffering.getLimitCpuUse(), true);
         Answer answer = new ScaleVmAnswer(reconfigureCmd, true, "details");
         when(_agentMgr.send(2l, reconfigureCmd)).thenReturn(null);
         _vmMgr.reConfigureVm(_vmInstance, getSvcoffering(256), false);
 
     }
 
-    @Test (expected=CloudRuntimeException.class)
-    public void testScaleVM3()  throws Exception {
+    @Test(expected = CloudRuntimeException.class)
+    public void testScaleVM3() throws Exception {
 
         /*VirtualMachineProfile profile = new VirtualMachineProfileImpl(vm);
 
@@ -285,10 +303,9 @@ public class VirtualMachineManagerImplTest {
 
     }
 
+    private ServiceOfferingVO getSvcoffering(int ramSize) {
 
-    private ServiceOfferingVO getSvcoffering(int ramSize){
-
-        long id  = 4L;
+        long id = 4L;
         String name = "name";
         String displayText = "displayText";
         int cpu = 1;
@@ -303,7 +320,7 @@ public class VirtualMachineManagerImplTest {
     }
 
     private void initializeMockConfigForMigratingVmWithVolumes() throws OperationTimedoutException,
-        ResourceUnavailableException {
+            ResourceUnavailableException {
 
         // Mock the source and destination hosts.
         when(_srcHostMock.getId()).thenReturn(5L);
@@ -315,7 +332,7 @@ public class VirtualMachineManagerImplTest {
         when(_vmMock.getId()).thenReturn(1L);
         when(_vmMock.getHypervisorType()).thenReturn(HypervisorType.XenServer);
         when(_vmMock.getState()).thenReturn(State.Running).thenReturn(State.Running).thenReturn(State.Migrating)
-            .thenReturn(State.Migrating);
+                .thenReturn(State.Migrating);
         when(_vmMock.getHostId()).thenReturn(5L);
         when(_vmInstance.getId()).thenReturn(1L);
         when(_vmInstance.getServiceOfferingId()).thenReturn(2L);
@@ -323,7 +340,7 @@ public class VirtualMachineManagerImplTest {
         when(_vmInstance.getHostId()).thenReturn(5L);
         when(_vmInstance.getType()).thenReturn(VirtualMachine.Type.User);
         when(_vmInstance.getState()).thenReturn(State.Running).thenReturn(State.Running).thenReturn(State.Migrating)
-            .thenReturn(State.Migrating);
+                .thenReturn(State.Migrating);
 
         // Mock the work item.
         when(_workDao.persist(any(ItWorkVO.class))).thenReturn(_work);
@@ -391,43 +408,43 @@ public class VirtualMachineManagerImplTest {
         when(_agentMgr.send(anyLong(), isA(CheckVirtualMachineCommand.class))).thenReturn(checkVmAnswerMock);
 
         // Mock the state transitions of vm.
-        Pair<Long, Long> opaqueMock = new Pair<Long, Long> (_vmMock.getHostId(), _destHostMock.getId());
+        Pair<Long, Long> opaqueMock = new Pair<Long, Long>(_vmMock.getHostId(), _destHostMock.getId());
         when(_vmSnapshotMgr.hasActiveVMSnapshotTasks(anyLong())).thenReturn(false);
         when(_vmInstanceDao.updateState(State.Running, Event.MigrationRequested, State.Migrating, _vmMock, opaqueMock))
-            .thenReturn(true);
+                .thenReturn(true);
         when(_vmInstanceDao.updateState(State.Migrating, Event.OperationSucceeded, State.Running, _vmMock, opaqueMock))
-            .thenReturn(true);
+                .thenReturn(true);
     }
 
     // Check migration of a vm with its volumes within a cluster.
     @Test
     public void testMigrateWithVolumeWithinCluster() throws ResourceUnavailableException, ConcurrentOperationException,
-        ManagementServerException, VirtualMachineMigrationException, OperationTimedoutException {
+            ManagementServerException, VirtualMachineMigrationException, OperationTimedoutException {
 
         initializeMockConfigForMigratingVmWithVolumes();
         when(_srcHostMock.getClusterId()).thenReturn(3L);
         when(_destHostMock.getClusterId()).thenReturn(3L);
 
-        _vmMgr.migrateWithStorage(_vmInstance, _srcHostMock.getId(), _destHostMock.getId(), _volumeToPoolMock);
+        _vmMgr.migrateWithStorage(_vmInstance.getUuid(), _srcHostMock.getId(), _destHostMock.getId(), _volumeToPoolMock);
     }
 
     // Check migration of a vm with its volumes across a cluster.
     @Test
     public void testMigrateWithVolumeAcrossCluster() throws ResourceUnavailableException, ConcurrentOperationException,
-        ManagementServerException, VirtualMachineMigrationException, OperationTimedoutException {
+            ManagementServerException, VirtualMachineMigrationException, OperationTimedoutException {
 
         initializeMockConfigForMigratingVmWithVolumes();
         when(_srcHostMock.getClusterId()).thenReturn(3L);
         when(_destHostMock.getClusterId()).thenReturn(4L);
 
-        _vmMgr.migrateWithStorage(_vmInstance, _srcHostMock.getId(), _destHostMock.getId(), _volumeToPoolMock);
+        _vmMgr.migrateWithStorage(_vmInstance.getUuid(), _srcHostMock.getId(), _destHostMock.getId(), _volumeToPoolMock);
     }
 
     // Check migration of a vm fails when src and destination pool are not of same type; that is, one is shared and
     // other is local.
-    @Test(expected=CloudRuntimeException.class)
+    @Test(expected = CloudRuntimeException.class)
     public void testMigrateWithVolumeFail1() throws ResourceUnavailableException, ConcurrentOperationException,
-        ManagementServerException, VirtualMachineMigrationException, OperationTimedoutException {
+            ManagementServerException, VirtualMachineMigrationException, OperationTimedoutException {
 
         initializeMockConfigForMigratingVmWithVolumes();
         when(_srcHostMock.getClusterId()).thenReturn(3L);
@@ -436,13 +453,13 @@ public class VirtualMachineManagerImplTest {
         when(_destStoragePoolMock.isLocal()).thenReturn(true);
         when(_diskOfferingMock.getUseLocalStorage()).thenReturn(false);
 
-        _vmMgr.migrateWithStorage(_vmInstance, _srcHostMock.getId(), _destHostMock.getId(), _volumeToPoolMock);
+        _vmMgr.migrateWithStorage(_vmInstance.getUuid(), _srcHostMock.getId(), _destHostMock.getId(), _volumeToPoolMock);
     }
 
     // Check migration of a vm fails when vm is not in Running state.
-    @Test(expected=ConcurrentOperationException.class)
+    @Test(expected = ConcurrentOperationException.class)
     public void testMigrateWithVolumeFail2() throws ResourceUnavailableException, ConcurrentOperationException,
-        ManagementServerException, VirtualMachineMigrationException, OperationTimedoutException {
+            ManagementServerException, VirtualMachineMigrationException, OperationTimedoutException {
 
         initializeMockConfigForMigratingVmWithVolumes();
         when(_srcHostMock.getClusterId()).thenReturn(3L);
@@ -450,6 +467,6 @@ public class VirtualMachineManagerImplTest {
 
         when(_vmMock.getState()).thenReturn(State.Stopped);
 
-        _vmMgr.migrateWithStorage(_vmInstance, _srcHostMock.getId(), _destHostMock.getId(), _volumeToPoolMock);
+        _vmMgr.migrateWithStorage(_vmInstance.getUuid(), _srcHostMock.getId(), _destHostMock.getId(), _volumeToPoolMock);
     }
 }