cloudstack-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From ni...@apache.org
Subject git commit: refs/heads/scaleupvm - CLOUDSTACK-658 - Adding capacity related changes
Date Mon, 18 Mar 2013 14:39:46 GMT
Updated Branches:
  refs/heads/scaleupvm 6bf8ff623 -> bffc09c61


CLOUDSTACK-658 - Adding capacity related changes


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

Branch: refs/heads/scaleupvm
Commit: bffc09c61aec8dd59788c1cb7c89474fdee60991
Parents: 6bf8ff6
Author: Nitin Mehta <nitin.mehta@citrix.com>
Authored: Mon Mar 18 20:09:23 2013 +0530
Committer: Nitin Mehta <nitin.mehta@citrix.com>
Committed: Mon Mar 18 20:09:23 2013 +0530

----------------------------------------------------------------------
 api/src/com/cloud/agent/api/ScaleVmCommand.java    |    6 +-
 api/src/com/cloud/vm/VirtualMachine.java           |    5 -
 server/src/com/cloud/vm/UserVmManagerImpl.java     |   39 +++---
 server/src/com/cloud/vm/VirtualMachineManager.java |    2 +-
 .../com/cloud/vm/VirtualMachineManagerImpl.java    |  104 ++++++++-------
 5 files changed, 81 insertions(+), 75 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/bffc09c6/api/src/com/cloud/agent/api/ScaleVmCommand.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/agent/api/ScaleVmCommand.java b/api/src/com/cloud/agent/api/ScaleVmCommand.java
index e5078d5..35d22ad 100644
--- a/api/src/com/cloud/agent/api/ScaleVmCommand.java
+++ b/api/src/com/cloud/agent/api/ScaleVmCommand.java
@@ -40,14 +40,14 @@ public class ScaleVmCommand extends Command {
 	}
 
 	public ScaleVmCommand(String vmName, int cpus,
-			Integer speed, long minRam, long maxRam) {
+			Integer speed, long minRam, long maxRam, boolean limitCpuUse) {
 		super();
 		this.vmName = vmName;
 		this.cpus = cpus;
-		//this.speed = speed;
+		this.speed = speed;
 		this.minRam = minRam;
 		this.maxRam = maxRam;
-		this.vm = new VirtualMachineTO(1L, vmName, null, cpus, null, minRam, maxRam, null, null,
false, false, null);
+		this.vm = new VirtualMachineTO(1L, vmName, null, cpus, speed, minRam, maxRam, null, null,
false, false, null);
 		/*vm.setName(vmName);
 		vm.setCpus(cpus);
 		vm.setRam(minRam, maxRam);*/

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/bffc09c6/api/src/com/cloud/vm/VirtualMachine.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/vm/VirtualMachine.java b/api/src/com/cloud/vm/VirtualMachine.java
index ef22672..8f807d4 100755
--- a/api/src/com/cloud/vm/VirtualMachine.java
+++ b/api/src/com/cloud/vm/VirtualMachine.java
@@ -41,7 +41,6 @@ public interface VirtualMachine extends RunningOn, ControlledEntity, Identity,
I
         Destroyed(false, "VM is marked for destroy."),
         Expunging(true, "VM is being   expunged."),
         Migrating(true, "VM is being migrated.  host id holds to from host"),
-        Reconfiguring(true, "VM is being reconfigured to a new service offering"),
         Error(false, "VM is in error"),
         Unknown(false, "VM state is unknown."),
         Shutdowned(false, "VM is shutdowned from inside");
@@ -96,9 +95,6 @@ public interface VirtualMachine extends RunningOn, ControlledEntity, Identity,
I
             s_fsm.addTransition(State.Running, VirtualMachine.Event.StopRequested, State.Stopping);
             s_fsm.addTransition(State.Running, VirtualMachine.Event.AgentReportShutdowned,
State.Stopped);
             s_fsm.addTransition(State.Running, VirtualMachine.Event.AgentReportMigrated,
State.Running);
-            s_fsm.addTransition(State.Running, VirtualMachine.Event.ReconfiguringRequested,
State.Reconfiguring);
-            s_fsm.addTransition(State.Reconfiguring, VirtualMachine.Event.OperationSucceeded,
State.Running);
-            s_fsm.addTransition(State.Reconfiguring, VirtualMachine.Event.OperationFailed,
State.Running);
             s_fsm.addTransition(State.Migrating, VirtualMachine.Event.MigrationRequested,
State.Migrating);
             s_fsm.addTransition(State.Migrating, VirtualMachine.Event.OperationSucceeded,
State.Running);
             s_fsm.addTransition(State.Migrating, VirtualMachine.Event.OperationFailed, State.Running);
@@ -181,7 +177,6 @@ public interface VirtualMachine extends RunningOn, ControlledEntity, Identity,
I
         AgentReportMigrated,
         RevertRequested,
         SnapshotRequested,
-        ReconfiguringRequested
     };
 
     public enum Type {

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/bffc09c6/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 e38231c..6e9cd43 100755
--- a/server/src/com/cloud/vm/UserVmManagerImpl.java
+++ b/server/src/com/cloud/vm/UserVmManagerImpl.java
@@ -339,7 +339,7 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager,
Use
     @Inject
     protected SecurityGroupDao _securityGroupDao;
     @Inject
-    protected CapacityManager _capacityMgr;;
+    protected CapacityManager _capacityMgr;
     @Inject
     protected VMInstanceDao _vmInstanceDao;
     @Inject
@@ -1043,7 +1043,7 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager,
Use
     public UserVm
     upgradeVirtualMachine(ScaleVMCmd cmd) throws InvalidParameterValueException {
         Long vmId = cmd.getId();
-        Long newSvcOffId = cmd.getServiceOfferingId();
+        Long newServiceOfferingId = cmd.getServiceOfferingId();
         Account caller = UserContext.current().getCaller();
 
         // Verify input parameters
@@ -1055,14 +1055,14 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager,
Use
         _accountMgr.checkAccess(caller, null, true, vmInstance);
 
         // Check that the specified service offering ID is valid
-        _itMgr.checkIfCanUpgrade(vmInstance, newSvcOffId);
+        _itMgr.checkIfCanUpgrade(vmInstance, newServiceOfferingId);
 
         //Check if its a scale "up"
-        ServiceOffering newServiceOffering = _configMgr.getServiceOffering(newSvcOffId);
+        ServiceOffering newServiceOffering = _configMgr.getServiceOffering(newServiceOfferingId);
         ServiceOffering oldServiceOffering = _configMgr.getServiceOffering(vmInstance.getServiceOfferingId());
         if(newServiceOffering.getSpeed() <= oldServiceOffering.getSpeed()
                 && newServiceOffering.getRamSize() <= oldServiceOffering.getRamSize()){
-            throw new InvalidParameterValueException("Only scaling up the vm is supported");
+            throw new InvalidParameterValueException("Only scaling up the vm is supported,
new service offering should have both cpu and memory greater than the old values");
         }
 
         // Dynamically upgrade the running vms
@@ -1073,38 +1073,41 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager,
Use
                 try{
                     // #1 Check existing host has capacity
                     boolean existingHostHasCapacity = _capacityMgr.checkIfHostHasCapacity(vmInstance.getHostId(),
newServiceOffering.getSpeed() - oldServiceOffering.getSpeed(),
-                            (newServiceOffering.getRamSize() - oldServiceOffering.getRamSize())
* 1024L * 1024L, false, ApiDBUtils.getCpuOverprovisioningFactor(), 1f,  false);
+                            (newServiceOffering.getRamSize() - oldServiceOffering.getRamSize())
* 1024L * 1024L, false, ApiDBUtils.getCpuOverprovisioningFactor(), 1f,  false); // TO DO fill
it with mem.
 
                     // #2 migrate the vm if host doesn't have capacity
                     if (!existingHostHasCapacity){
-                        vmInstance = _itMgr.scale(vmInstance.getType(), vmInstance, newSvcOffId);
-                    }else{
-                        vmInstance.setSameHost(existingHostHasCapacity);
+                        vmInstance = _itMgr.findHostAndMigrate(vmInstance.getType(), vmInstance,
newServiceOfferingId);
                     }
 
                     // #3 scale the vm now
-                    vmInstance = _itMgr.reConfigureVm(vmInstance, newServiceOffering, existingHostHasCapacity);
+                    _itMgr.upgradeVmDb(vmId, newServiceOfferingId);
+                    vmInstance = _vmInstanceDao.findById(vmId);
+                    vmInstance = _itMgr.reConfigureVm(vmInstance, oldServiceOffering, existingHostHasCapacity);
                     success = true;
+                    return _vmDao.findById(vmInstance.getId());
                 }catch(InsufficientCapacityException e ){
-                    s_logger.warn("Recieved exception while scaling ",e);
+                    s_logger.warn("Received exception while scaling ",e);
                 } catch (ResourceUnavailableException e) {
-                    s_logger.warn("Recieved exception while scaling ",e);
+                    s_logger.warn("Received exception while scaling ",e);
                 } catch (ConcurrentOperationException e) {
-                    s_logger.warn("Recieved exception while scaling ",e);
+                    s_logger.warn("Received exception while scaling ",e);
                 } catch (VirtualMachineMigrationException e) {
-                    s_logger.warn("Recieved exception while scaling ",e);
+                    s_logger.warn("Received exception while scaling ",e);
                 } catch (ManagementServerException e) {
-                    s_logger.warn("Recieved exception while scaling ",e);
+                    s_logger.warn("Received exception while scaling ",e);
+                }finally{
+                    if(!success){
+                        _itMgr.upgradeVmDb(vmId, oldServiceOffering.getId()); // rollback
+                    }
                 }
             }
             if (!success)
                 return null;
         }
 
-        //Update the DB.
-        _itMgr.upgradeVmDb(vmId, newSvcOffId);
-
         return _vmDao.findById(vmInstance.getId());
+
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/bffc09c6/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 b81d533..4a30d97 100644
--- a/server/src/com/cloud/vm/VirtualMachineManager.java
+++ b/server/src/com/cloud/vm/VirtualMachineManager.java
@@ -190,7 +190,7 @@ public interface VirtualMachineManager extends Manager {
     VMInstanceVO reConfigureVm(VMInstanceVO vm, ServiceOffering newServiceOffering, boolean
sameHost)
             throws ResourceUnavailableException, ConcurrentOperationException;
 
-    VMInstanceVO scale(VirtualMachine.Type vmType, VMInstanceVO vm, Long newSvcOfferingId)
throws InsufficientCapacityException,
+    VMInstanceVO findHostAndMigrate(VirtualMachine.Type vmType, VMInstanceVO vm, Long newSvcOfferingId)
throws InsufficientCapacityException,
             ConcurrentOperationException, ResourceUnavailableException,
             VirtualMachineMigrationException, ManagementServerException;
 

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/bffc09c6/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 7631c2d..c845830 100755
--- a/server/src/com/cloud/vm/VirtualMachineManagerImpl.java
+++ b/server/src/com/cloud/vm/VirtualMachineManagerImpl.java
@@ -36,6 +36,7 @@ import javax.ejb.Local;
 import javax.inject.Inject;
 import javax.naming.ConfigurationException;
 
+import com.cloud.capacity.CapacityManager;
 import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
 import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
 
@@ -175,6 +176,8 @@ public class VirtualMachineManagerImpl extends ManagerBase implements
VirtualMac
     @Inject
     protected UserVmDao _userVmDao;
     @Inject
+    protected CapacityManager _capacityMgr;
+    @Inject
     protected NicDao _nicsDao;
     @Inject
     protected AccountManager _accountMgr;
@@ -2659,7 +2662,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements
VirtualMac
     }
 
     @Override
-    public VMInstanceVO scale(VirtualMachine.Type vmType, VMInstanceVO vm, Long newSvcOfferingId)
+    public VMInstanceVO findHostAndMigrate(VirtualMachine.Type vmType, VMInstanceVO vm, Long
newSvcOfferingId)
             throws InsufficientCapacityException, ConcurrentOperationException, ResourceUnavailableException,
VirtualMachineMigrationException, ManagementServerException {
 
         VirtualMachineProfile<VMInstanceVO> profile = new VirtualMachineProfileImpl<VMInstanceVO>(vm);
@@ -2730,53 +2733,6 @@ public class VirtualMachineManagerImpl extends ManagerBase implements
VirtualMac
     }
 
         @Override
-        public VMInstanceVO reConfigureVm(VMInstanceVO vm , ServiceOffering newServiceOffering,
boolean sameHost) throws ResourceUnavailableException, ConcurrentOperationException {
-            ScaleVmCommand reconfigureCmd = new ScaleVmCommand(vm.getInstanceName(), newServiceOffering.getCpu(),
-                    newServiceOffering.getSpeed(), newServiceOffering.getRamSize(), newServiceOffering.getRamSize());
-
-            Long dstHostId = vm.getHostId();
-            ItWorkVO work = new ItWorkVO(UUID.randomUUID().toString(), _nodeId, State.Reconfiguring,
vm.getType(), vm.getId());
-            work.setStep(Step.Prepare);
-            work.setResourceType(ItWorkVO.ResourceType.Host);
-            work.setResourceId(vm.getHostId());
-            work = _workDao.persist(work);
-            boolean success = false;
-            try {
-                vm.setNewSvcOfferingId(newServiceOffering.getId()); // Capacity update should
be delta (new - old) offering
-                changeState(vm, Event.ReconfiguringRequested, dstHostId, work, Step.Reconfiguring);
-
-                Answer reconfigureAnswer = _agentMgr.send(vm.getHostId(), reconfigureCmd);
-                if (!reconfigureAnswer.getResult()) {
-                    s_logger.error("Unable to reconfigure due to " + reconfigureAnswer.getDetails());
-                    return null;
-                }
-
-                changeState(vm, VirtualMachine.Event.OperationSucceeded, dstHostId, work,
Step.Done);
-                success = true;
-            } catch (OperationTimedoutException e) {
-                throw new AgentUnavailableException("Operation timed out on reconfiguring
" + vm, dstHostId);
-            } catch (AgentUnavailableException e) {
-                throw e;
-            } catch (NoTransitionException e) {
-                s_logger.info("Unable to change the state : " + e.getMessage());
-                throw new ConcurrentOperationException("Unable to change the state : " +
e.getMessage());
-            }finally{
-                work.setStep(Step.Done);
-                _workDao.update(work.getId(), work);
-                if(!success){
-                    try {
-                        stateTransitTo(vm, Event.OperationFailed, vm.getHostId());
-                    } catch (NoTransitionException e) {
-                        s_logger.warn(e.getMessage());
-                    }
-                }
-            }
-
-            return vm;
-
-        }
-
-        @Override
         public <T extends VMInstanceVO> T migrateForScale(T vm, long srcHostId, DeployDestination
dest, Long oldSvcOfferingId) throws ResourceUnavailableException, ConcurrentOperationException,
ManagementServerException,
                 VirtualMachineMigrationException {
             s_logger.info("Migrating " + vm + " to " + dest);
@@ -2881,10 +2837,12 @@ public class VirtualMachineManagerImpl extends ManagerBase implements
VirtualMac
                 }
 
                 try {
+                    long newServiceOfferingId = vm.getServiceOfferingId();
                     vm.setServiceOfferingId(oldSvcOfferingId); // release capacity for the
old service offering only
                     if (!changeState(vm, VirtualMachine.Event.OperationSucceeded, dstHostId,
work, Step.Started)) {
                         throw new ConcurrentOperationException("Unable to change the state
for " + vm);
                     }
+                    vm.setServiceOfferingId(newServiceOfferingId);
                 } catch (NoTransitionException e1) {
                     throw new ConcurrentOperationException("Unable to change state due to
" + e1.getMessage());
                 }
@@ -2928,6 +2886,56 @@ public class VirtualMachineManagerImpl extends ManagerBase implements
VirtualMac
                 _workDao.update(work.getId(), work);
             }
         }
+    @Override
+    public VMInstanceVO reConfigureVm(VMInstanceVO vm , ServiceOffering oldServiceOffering,
boolean reconfiguringOnExistingHost) throws ResourceUnavailableException, ConcurrentOperationException
{
+
+        long newServiceofferingId = vm.getServiceOfferingId();
+        ServiceOffering newServiceOffering = _configMgr.getServiceOffering(newServiceofferingId);
+        ScaleVmCommand reconfigureCmd = new ScaleVmCommand(vm.getInstanceName(), newServiceOffering.getCpu(),
+                newServiceOffering.getSpeed(), newServiceOffering.getRamSize(), newServiceOffering.getRamSize(),
newServiceOffering.getLimitCpuUse());
+
+        Long dstHostId = vm.getHostId();
+        ItWorkVO work = new ItWorkVO(UUID.randomUUID().toString(), _nodeId, State.Running,
vm.getType(), vm.getId());
+        work.setStep(Step.Prepare);
+        work.setResourceType(ItWorkVO.ResourceType.Host);
+        work.setResourceId(vm.getHostId());
+        work = _workDao.persist(work);
+        boolean success = false;
+        try {
+            if(reconfiguringOnExistingHost){
+                vm.setServiceOfferingId(oldServiceOffering.getId());
+                _capacityMgr.releaseVmCapacity(vm, false, false, vm.getHostId()); //release
the old capacity
+                vm.setServiceOfferingId(newServiceofferingId);
+                _capacityMgr.allocateVmCapacity(vm, false); // lock the new capacity
+            }
+            //vm.setNewSvcOfferingId(newServiceOffering.getId()); // Capacity update should
be delta (new - old) offering
+            //changeState(vm, Event.ReconfiguringRequested, dstHostId, work, Step.Reconfiguring);
+
+            Answer reconfigureAnswer = _agentMgr.send(vm.getHostId(), reconfigureCmd);
+            if (!reconfigureAnswer.getResult()) {
+                s_logger.error("Unable to reconfigure due to " + reconfigureAnswer.getDetails());
+                return null;
+            }
+
+            //changeState(vm, VirtualMachine.Event.OperationSucceeded, dstHostId, work, Step.Done);
+            success = true;
+        } catch (OperationTimedoutException e) {
+            throw new AgentUnavailableException("Operation timed out on reconfiguring " +
vm, dstHostId);
+        } catch (AgentUnavailableException e) {
+            throw e;
+        } finally{
+            work.setStep(Step.Done);
+            _workDao.update(work.getId(), work);
+            if(!success){
+                _capacityMgr.releaseVmCapacity(vm, false, false, vm.getHostId()); // release
the new capacity
+                vm.setServiceOfferingId(oldServiceOffering.getId());
+                _capacityMgr.allocateVmCapacity(vm, false); // allocate the old capacity
+            }
+        }
+
+        return vm;
+
+    }
 
 
     }


Mime
View raw message