You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by ke...@apache.org on 2013/12/17 00:15:44 UTC

[1/3] git commit: updated refs/heads/master to 719271b

Updated Branches:
  refs/heads/master 2f5329515 -> 719271b1d


Fix tab and trailing spaces


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

Branch: refs/heads/master
Commit: 719271b1d9d1a716b4724d0af10c9915c435a9ce
Parents: 9d3827e
Author: Kelven Yang <ke...@gmail.com>
Authored: Mon Dec 16 15:15:15 2013 -0800
Committer: Kelven Yang <ke...@gmail.com>
Committed: Mon Dec 16 15:15:30 2013 -0800

----------------------------------------------------------------------
 .../src/com/cloud/vm/VirtualMachineManager.java |   6 +-
 .../components-api/src/com/cloud/vm/VmWork.java |   8 +-
 .../com/cloud/vm/VirtualMachineManagerImpl.java | 642 +++++++++----------
 .../src/com/cloud/vm/VmWorkAddVmToNetwork.java  |  32 +-
 .../src/com/cloud/vm/VmWorkJobDispatcher.java   |  15 +-
 .../src/com/cloud/vm/VmWorkMigrateForScale.java |  24 +-
 .../com/cloud/vm/VmWorkMigrateWithStorage.java  |  28 +-
 .../src/com/cloud/vm/VmWorkReboot.java          |   4 +-
 .../src/com/cloud/vm/VmWorkReconfigure.java     |  24 +-
 .../src/com/cloud/vm/VmWorkRemoveNicFromVm.java |  10 +-
 .../com/cloud/vm/VmWorkRemoveVmFromNetwork.java |  32 +-
 .../src/com/cloud/vm/VmWorkStart.java           | 140 ++--
 .../src/com/cloud/vm/VmWorkStop.java            |   8 +-
 .../com/cloud/vm/VmWorkStorageMigration.java    |   6 +-
 14 files changed, 490 insertions(+), 489 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/719271b1/engine/api/src/com/cloud/vm/VirtualMachineManager.java
----------------------------------------------------------------------
diff --git a/engine/api/src/com/cloud/vm/VirtualMachineManager.java b/engine/api/src/com/cloud/vm/VirtualMachineManager.java
index 05cbfc2..4c2222c 100644
--- a/engine/api/src/com/cloud/vm/VirtualMachineManager.java
+++ b/engine/api/src/com/cloud/vm/VirtualMachineManager.java
@@ -108,9 +108,9 @@ public interface VirtualMachineManager extends Manager {
     void migrateAway(String vmUuid, long hostId) throws InsufficientServerCapacityException;
 
     void migrate(String vmUuid, long srcHostId, DeployDestination dest) throws ResourceUnavailableException, ConcurrentOperationException;
-    
+
     void migrateWithStorage(String vmUuid, long srcId, long destId, Map<Volume, StoragePool> volumeToPool) throws ResourceUnavailableException, ConcurrentOperationException;
-    
+
     void reboot(String vmUuid, Map<VirtualMachineProfile.Param, Object> params) throws InsufficientCapacityException, ResourceUnavailableException;
 
     void advanceReboot(String vmUuid, Map<VirtualMachineProfile.Param, Object> params) throws InsufficientCapacityException, ResourceUnavailableException,
@@ -153,7 +153,7 @@ public interface VirtualMachineManager extends Manager {
      */
     NicProfile addVmToNetwork(VirtualMachine vm, Network network, NicProfile requested) throws ConcurrentOperationException,
         ResourceUnavailableException, InsufficientCapacityException;
-    
+
     /**
      * @param vm
      * @param nic

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/719271b1/engine/components-api/src/com/cloud/vm/VmWork.java
----------------------------------------------------------------------
diff --git a/engine/components-api/src/com/cloud/vm/VmWork.java b/engine/components-api/src/com/cloud/vm/VmWork.java
index 98e46a3..ed9f44c 100644
--- a/engine/components-api/src/com/cloud/vm/VmWork.java
+++ b/engine/components-api/src/com/cloud/vm/VmWork.java
@@ -32,7 +32,7 @@ public class VmWork implements Serializable {
         this.accountId = accountId;
         this.vmId = vmId;
         this.handlerName = handlerName;
-	}
+    }
 
     public long getUserId() {
         return userId;
@@ -42,9 +42,9 @@ public class VmWork implements Serializable {
         return accountId;
     }
 
-	public long getVmId() {
-		return vmId;
-	}
+    public long getVmId() {
+        return vmId;
+    }
 
     public String getHandlerName() {
         return handlerName;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/719271b1/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java b/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
index f89d83c..21b873b 100755
--- a/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
+++ b/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
@@ -734,11 +734,11 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
             }
         }
     }
-    
+
     private void orchestrateStart(String vmUuid, Map<VirtualMachineProfile.Param, Object> params, DeploymentPlan planToDeploy) throws InsufficientCapacityException,
-    	ConcurrentOperationException, ResourceUnavailableException {
-        
-    	CallContext cctxt = CallContext.current();
+            ConcurrentOperationException, ResourceUnavailableException {
+
+        CallContext cctxt = CallContext.current();
         Account account = cctxt.getCallingAccount();
         User caller = cctxt.getCallingUser();
 
@@ -1627,7 +1627,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
             }
         }
     }
-    
+
     private void orchestrateMigrate(String vmUuid, long srcHostId, DeployDestination dest) throws ResourceUnavailableException, ConcurrentOperationException {
         VMInstanceVO vm = _vmDao.findByUuid(vmUuid);
         if (vm == null) {
@@ -1896,10 +1896,10 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
             }
         }
     }
-    
+
     private void orchestrateMigrateWithStorage(String vmUuid, long srcHostId, long destHostId, Map<Volume, StoragePool> volumeToPool) throws ResourceUnavailableException,
-    	ConcurrentOperationException {
-    	
+            ConcurrentOperationException {
+
         VMInstanceVO vm = _vmDao.findByUuid(vmUuid);
 
         HostVO srcHost = _hostDao.findById(srcHostId);
@@ -2177,7 +2177,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
             }
         }
     }
-    
+
     private void orchestrateReboot(String vmUuid, Map<VirtualMachineProfile.Param, Object> params) throws InsufficientCapacityException, ConcurrentOperationException,
     ResourceUnavailableException {
         VMInstanceVO vm = _vmDao.findByUuid(vmUuid);
@@ -3108,7 +3108,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
             }
         }
     }
-    
+
     private NicProfile orchestrateAddVmToNetwork(VirtualMachine vm, Network network, NicProfile requested) throws ConcurrentOperationException, ResourceUnavailableException,
     InsufficientCapacityException {
         CallContext cctx = CallContext.current();
@@ -3448,9 +3448,9 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
     }
 
     private void orchestrateMigrateForScale(String vmUuid, long srcHostId, DeployDestination dest, Long oldSvcOfferingId)
-    	throws ResourceUnavailableException, ConcurrentOperationException {
-        
-    	VMInstanceVO vm = _vmDao.findByUuid(vmUuid);
+            throws ResourceUnavailableException, ConcurrentOperationException {
+
+        VMInstanceVO vm = _vmDao.findByUuid(vmUuid);
         s_logger.info("Migrating " + vm + " to " + dest);
 
         vm.getServiceOfferingId();
@@ -3703,7 +3703,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
             }
         }
     }
-    
+
     private VMInstanceVO orchestrateReConfigureVm(String vmUuid, ServiceOffering oldServiceOffering, boolean reconfiguringOnExistingHost) throws ResourceUnavailableException,
     ConcurrentOperationException {
         VMInstanceVO vm = _vmDao.findByUuid(vmUuid);
@@ -4163,26 +4163,26 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
                     workJob.setUserId(callingUser.getId());
                     workJob.setStep(VmWorkJobVO.Step.Starting);
                     workJob.setVmType(vm.getType());
-    	            workJob.setVmInstanceId(vm.getId());
+                    workJob.setVmInstanceId(vm.getId());
 
-    	            // save work context info (there are some duplications)
+                    // save work context info (there are some duplications)
                     VmWorkStart workInfo = new VmWorkStart(callingUser.getId(), callingAccount.getId(), vm.getId(), VirtualMachineManagerImpl.VM_WORK_JOB_HANDLER);
-    	            workInfo.setPlan(planToDeploy);
-    	            workInfo.setParams(params);
-    	            workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
-
-    	            _jobMgr.submitAsyncJob(workJob, VmWorkJobDispatcher.VM_WORK_QUEUE, vm.getId());
-    	    	}
-    	        
-	            // Transaction syntax sugar has a cost here
-	            context.putContextParameter("workJob", workJob);
-	            context.putContextParameter("jobId", new Long(workJob.getId()));
-    		}
-    	});
-    	
-    	final long jobId = (Long)context.getContextParameter("jobId");
-    	AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(jobId);
-    	
+                    workInfo.setPlan(planToDeploy);
+                    workInfo.setParams(params);
+                    workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
+
+                    _jobMgr.submitAsyncJob(workJob, VmWorkJobDispatcher.VM_WORK_QUEUE, vm.getId());
+                }
+
+                // Transaction syntax sugar has a cost here
+                context.putContextParameter("workJob", workJob);
+                context.putContextParameter("jobId", new Long(workJob.getId()));
+            }
+        });
+
+        final long jobId = (Long)context.getContextParameter("jobId");
+        AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(jobId);
+
         return new VmStateSyncOutcome((VmWorkJobVO)context.getContextParameter("workJob"),
             VirtualMachine.PowerState.PowerOn, vm.getId(), null);
     }
@@ -4207,33 +4207,33 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
                 if (pendingWorkJobs != null && pendingWorkJobs.size() > 0) {
                     assert (pendingWorkJobs.size() == 1);
                     workJob = pendingWorkJobs.get(0);
-		        } else {
-		            workJob = new VmWorkJobVO(context.getContextId());
-		
-		            workJob.setDispatcher(VmWorkJobDispatcher.VM_WORK_JOB_DISPATCHER);
-		            workJob.setCmd(VmWorkStop.class.getName());
-		
-		            workJob.setAccountId(account.getId());
-		            workJob.setUserId(user.getId());
-		            workJob.setStep(VmWorkJobVO.Step.Prepare);
-		            workJob.setVmType(vm.getType());
-		            workJob.setVmInstanceId(vm.getId());
-		
-		            // save work context info (there are some duplications)
+                } else {
+                    workJob = new VmWorkJobVO(context.getContextId());
+
+                    workJob.setDispatcher(VmWorkJobDispatcher.VM_WORK_JOB_DISPATCHER);
+                    workJob.setCmd(VmWorkStop.class.getName());
+
+                    workJob.setAccountId(account.getId());
+                    workJob.setUserId(user.getId());
+                    workJob.setStep(VmWorkJobVO.Step.Prepare);
+                    workJob.setVmType(vm.getType());
+                    workJob.setVmInstanceId(vm.getId());
+
+                    // save work context info (there are some duplications)
                     VmWorkStop workInfo = new VmWorkStop(user.getId(), account.getId(), vm.getId(), VirtualMachineManagerImpl.VM_WORK_JOB_HANDLER, cleanup);
-		            workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
-		
-		            _jobMgr.submitAsyncJob(workJob, VmWorkJobDispatcher.VM_WORK_QUEUE, vm.getId());
-		    	}
-		        
-	            context.putContextParameter("workJob", workJob);
-	            context.putContextParameter("jobId", new Long(workJob.getId()));
-    		}
-		});
-
-    	final long jobId = (Long)context.getContextParameter("jobId");
-    	AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(jobId);
-    	
+                    workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
+
+                    _jobMgr.submitAsyncJob(workJob, VmWorkJobDispatcher.VM_WORK_QUEUE, vm.getId());
+                }
+
+                context.putContextParameter("workJob", workJob);
+                context.putContextParameter("jobId", new Long(workJob.getId()));
+            }
+        });
+
+        final long jobId = (Long)context.getContextParameter("jobId");
+        AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(jobId);
+
         return new VmStateSyncOutcome((VmWorkJobVO)context.getContextParameter("workJob"),
             VirtualMachine.PowerState.PowerOff, vm.getId(), null);
     }
@@ -4265,28 +4265,28 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
 
                     workJob.setDispatcher(VmWorkJobDispatcher.VM_WORK_JOB_DISPATCHER);
                     workJob.setCmd(VmWorkReboot.class.getName());
-		
-		            workJob.setAccountId(account.getId());
-		            workJob.setUserId(user.getId());
-		            workJob.setStep(VmWorkJobVO.Step.Prepare);
-		            workJob.setVmType(vm.getType());
-		            workJob.setVmInstanceId(vm.getId());
-		
-		            // save work context info (there are some duplications)
+
+                    workJob.setAccountId(account.getId());
+                    workJob.setUserId(user.getId());
+                    workJob.setStep(VmWorkJobVO.Step.Prepare);
+                    workJob.setVmType(vm.getType());
+                    workJob.setVmInstanceId(vm.getId());
+
+                    // save work context info (there are some duplications)
                     VmWorkReboot workInfo = new VmWorkReboot(user.getId(), account.getId(), vm.getId(), VirtualMachineManagerImpl.VM_WORK_JOB_HANDLER, params);
-		            workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
-		
-		            _jobMgr.submitAsyncJob(workJob, VmWorkJobDispatcher.VM_WORK_QUEUE, vm.getId());
-		    	}
-		        
-	            context.putContextParameter("workJob", workJob);
-	            context.putContextParameter("jobId", new Long(workJob.getId()));
-    		}
-		});
-
-    	final long jobId = (Long)context.getContextParameter("jobId");
-    	AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(jobId);
-    	
+                    workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
+
+                    _jobMgr.submitAsyncJob(workJob, VmWorkJobDispatcher.VM_WORK_QUEUE, vm.getId());
+                }
+
+                context.putContextParameter("workJob", workJob);
+                context.putContextParameter("jobId", new Long(workJob.getId()));
+            }
+        });
+
+        final long jobId = (Long)context.getContextParameter("jobId");
+        AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(jobId);
+
         return new VmJobSyncOutcome((VmWorkJobVO)context.getContextParameter("workJob"),
             vm.getId());
     }
@@ -4301,42 +4301,42 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
         Transaction.execute(new TransactionCallbackNoReturn() {
             @Override
             public void doInTransactionWithoutResult(TransactionStatus status) {
-		        _vmDao.lockRow(vm.getId(), true);
-		
-		        List<VmWorkJobVO> pendingWorkJobs = _workJobDao.listPendingWorkJobs(
-		        	VirtualMachine.Type.Instance, vm.getId(),
+                _vmDao.lockRow(vm.getId(), true);
+
+                List<VmWorkJobVO> pendingWorkJobs = _workJobDao.listPendingWorkJobs(
+                        VirtualMachine.Type.Instance, vm.getId(),
                         VmWorkMigrate.class.getName());
-		
-		        VmWorkJobVO workJob = null;
-		        if (pendingWorkJobs != null && pendingWorkJobs.size() > 0) {
-		            assert (pendingWorkJobs.size() == 1);
-		            workJob = pendingWorkJobs.get(0);
-		        } else {
-		                    
-		            workJob = new VmWorkJobVO(context.getContextId());
-		
-		            workJob.setDispatcher(VmWorkJobDispatcher.VM_WORK_JOB_DISPATCHER);
-		            workJob.setCmd(VmWorkMigrate.class.getName());
-		
-		            workJob.setAccountId(account.getId());
-		            workJob.setUserId(user.getId());
-		            workJob.setVmType(vm.getType());
-		            workJob.setVmInstanceId(vm.getId());
-		
-		            // save work context info (there are some duplications)
+
+                VmWorkJobVO workJob = null;
+                if (pendingWorkJobs != null && pendingWorkJobs.size() > 0) {
+                    assert (pendingWorkJobs.size() == 1);
+                    workJob = pendingWorkJobs.get(0);
+                } else {
+
+                    workJob = new VmWorkJobVO(context.getContextId());
+
+                    workJob.setDispatcher(VmWorkJobDispatcher.VM_WORK_JOB_DISPATCHER);
+                    workJob.setCmd(VmWorkMigrate.class.getName());
+
+                    workJob.setAccountId(account.getId());
+                    workJob.setUserId(user.getId());
+                    workJob.setVmType(vm.getType());
+                    workJob.setVmInstanceId(vm.getId());
+
+                    // save work context info (there are some duplications)
                     VmWorkMigrate workInfo = new VmWorkMigrate(user.getId(), account.getId(), vm.getId(), VirtualMachineManagerImpl.VM_WORK_JOB_HANDLER, srcHostId, dest);
-		            workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
-		
-		            _jobMgr.submitAsyncJob(workJob, VmWorkJobDispatcher.VM_WORK_QUEUE, vm.getId());
-		        }
-	            context.putContextParameter("workJob", workJob);
-	            context.putContextParameter("jobId", new Long(workJob.getId()));
-	    	}
-    	});
-    	
-    	final long jobId = (Long)context.getContextParameter("jobId");
-    	AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(jobId);
-    	
+                    workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
+
+                    _jobMgr.submitAsyncJob(workJob, VmWorkJobDispatcher.VM_WORK_QUEUE, vm.getId());
+                }
+                context.putContextParameter("workJob", workJob);
+                context.putContextParameter("jobId", new Long(workJob.getId()));
+            }
+        });
+
+        final long jobId = (Long)context.getContextParameter("jobId");
+        AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(jobId);
+
         return new VmStateSyncOutcome((VmWorkJobVO)context.getContextParameter("workJob"),
                 VirtualMachine.PowerState.PowerOn, vm.getId(), vm.getPowerHostId());
     }
@@ -4354,43 +4354,43 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
         Transaction.execute(new TransactionCallbackNoReturn() {
             @Override
             public void doInTransactionWithoutResult(TransactionStatus status) {
-		        _vmDao.lockRow(vm.getId(), true);
-		
-		        List<VmWorkJobVO> pendingWorkJobs = _workJobDao.listPendingWorkJobs(
-		        	VirtualMachine.Type.Instance, vm.getId(),
+                _vmDao.lockRow(vm.getId(), true);
+
+                List<VmWorkJobVO> pendingWorkJobs = _workJobDao.listPendingWorkJobs(
+                        VirtualMachine.Type.Instance, vm.getId(),
                         VmWorkMigrateWithStorage.class.getName());
-		
-		        VmWorkJobVO workJob = null;
-		        if (pendingWorkJobs != null && pendingWorkJobs.size() > 0) {
-		            assert (pendingWorkJobs.size() == 1);
-		            workJob = pendingWorkJobs.get(0);
-		        } else {
-		                    
-		            workJob = new VmWorkJobVO(context.getContextId());
-		
-		            workJob.setDispatcher(VmWorkJobDispatcher.VM_WORK_JOB_DISPATCHER);
-		            workJob.setCmd(VmWorkMigrate.class.getName());
-		
-		            workJob.setAccountId(account.getId());
-		            workJob.setUserId(user.getId());
-		            workJob.setVmType(vm.getType());
-		            workJob.setVmInstanceId(vm.getId());
-		
-		            // save work context info (there are some duplications)
+
+                VmWorkJobVO workJob = null;
+                if (pendingWorkJobs != null && pendingWorkJobs.size() > 0) {
+                    assert (pendingWorkJobs.size() == 1);
+                    workJob = pendingWorkJobs.get(0);
+                } else {
+
+                    workJob = new VmWorkJobVO(context.getContextId());
+
+                    workJob.setDispatcher(VmWorkJobDispatcher.VM_WORK_JOB_DISPATCHER);
+                    workJob.setCmd(VmWorkMigrate.class.getName());
+
+                    workJob.setAccountId(account.getId());
+                    workJob.setUserId(user.getId());
+                    workJob.setVmType(vm.getType());
+                    workJob.setVmInstanceId(vm.getId());
+
+                    // save work context info (there are some duplications)
                     VmWorkMigrateWithStorage workInfo = new VmWorkMigrateWithStorage(user.getId(), account.getId(), vm.getId(),
                             VirtualMachineManagerImpl.VM_WORK_JOB_HANDLER, srcHostId, destHostId, volumeToPool);
-		            workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
-		
-		            _jobMgr.submitAsyncJob(workJob, VmWorkJobDispatcher.VM_WORK_QUEUE, vm.getId());
-		        }
-	            context.putContextParameter("workJob", workJob);
-	            context.putContextParameter("jobId", new Long(workJob.getId()));
-	    	}
-    	});
-    	
-    	final long jobId = (Long)context.getContextParameter("jobId");
-    	AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(jobId);
-    	
+                    workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
+
+                    _jobMgr.submitAsyncJob(workJob, VmWorkJobDispatcher.VM_WORK_QUEUE, vm.getId());
+                }
+                context.putContextParameter("workJob", workJob);
+                context.putContextParameter("jobId", new Long(workJob.getId()));
+            }
+        });
+
+        final long jobId = (Long)context.getContextParameter("jobId");
+        AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(jobId);
+
         return new VmStateSyncOutcome((VmWorkJobVO)context.getContextParameter("workJob"),
                 VirtualMachine.PowerState.PowerOn, vm.getId(), destHostId);
     }
@@ -4407,43 +4407,43 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
         Transaction.execute(new TransactionCallbackNoReturn() {
             @Override
             public void doInTransactionWithoutResult(TransactionStatus status) {
-		        _vmDao.lockRow(vm.getId(), true);
-		
-		        List<VmWorkJobVO> pendingWorkJobs = _workJobDao.listPendingWorkJobs(
-		        	VirtualMachine.Type.Instance, vm.getId(),
+                _vmDao.lockRow(vm.getId(), true);
+
+                List<VmWorkJobVO> pendingWorkJobs = _workJobDao.listPendingWorkJobs(
+                        VirtualMachine.Type.Instance, vm.getId(),
                         VmWorkMigrateForScale.class.getName());
-		
-		        VmWorkJobVO workJob = null;
-		        if (pendingWorkJobs != null && pendingWorkJobs.size() > 0) {
-		            assert (pendingWorkJobs.size() == 1);
-		            workJob = pendingWorkJobs.get(0);
-		        } else {
-		                    
-		            workJob = new VmWorkJobVO(context.getContextId());
-		
-		            workJob.setDispatcher(VmWorkJobDispatcher.VM_WORK_JOB_DISPATCHER);
+
+                VmWorkJobVO workJob = null;
+                if (pendingWorkJobs != null && pendingWorkJobs.size() > 0) {
+                    assert (pendingWorkJobs.size() == 1);
+                    workJob = pendingWorkJobs.get(0);
+                } else {
+
+                    workJob = new VmWorkJobVO(context.getContextId());
+
+                    workJob.setDispatcher(VmWorkJobDispatcher.VM_WORK_JOB_DISPATCHER);
                     workJob.setCmd(VmWorkMigrate.class.getName());
-		
-		            workJob.setAccountId(account.getId());
-		            workJob.setUserId(user.getId());
-		            workJob.setVmType(vm.getType());
-		            workJob.setVmInstanceId(vm.getId());
-		
-		            // save work context info (there are some duplications)
+
+                    workJob.setAccountId(account.getId());
+                    workJob.setUserId(user.getId());
+                    workJob.setVmType(vm.getType());
+                    workJob.setVmInstanceId(vm.getId());
+
+                    // save work context info (there are some duplications)
                     VmWorkMigrateForScale workInfo = new VmWorkMigrateForScale(user.getId(), account.getId(), vm.getId(),
                             VirtualMachineManagerImpl.VM_WORK_JOB_HANDLER, srcHostId, dest, newSvcOfferingId);
-		            workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
-		
-		            _jobMgr.submitAsyncJob(workJob, VmWorkJobDispatcher.VM_WORK_QUEUE, vm.getId());
-		        }
-	            context.putContextParameter("workJob", workJob);
-	            context.putContextParameter("jobId", new Long(workJob.getId()));
-	    	}
-    	});
-    	
-    	final long jobId = (Long)context.getContextParameter("jobId");
-    	AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(jobId);
-    	
+                    workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
+
+                    _jobMgr.submitAsyncJob(workJob, VmWorkJobDispatcher.VM_WORK_QUEUE, vm.getId());
+                }
+                context.putContextParameter("workJob", workJob);
+                context.putContextParameter("jobId", new Long(workJob.getId()));
+            }
+        });
+
+        final long jobId = (Long)context.getContextParameter("jobId");
+        AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(jobId);
+
         return new VmJobSyncOutcome((VmWorkJobVO)context.getContextParameter("workJob"), vm.getId());
     }
 
@@ -4459,43 +4459,43 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
         Transaction.execute(new TransactionCallbackNoReturn() {
             @Override
             public void doInTransactionWithoutResult(TransactionStatus status) {
-		        _vmDao.lockRow(vm.getId(), true);
-		
-		        List<VmWorkJobVO> pendingWorkJobs = _workJobDao.listPendingWorkJobs(
-		        	VirtualMachine.Type.Instance, vm.getId(),
+                _vmDao.lockRow(vm.getId(), true);
+
+                List<VmWorkJobVO> pendingWorkJobs = _workJobDao.listPendingWorkJobs(
+                        VirtualMachine.Type.Instance, vm.getId(),
                         VmWorkStorageMigration.class.getName());
-		
-		        VmWorkJobVO workJob = null;
-		        if (pendingWorkJobs != null && pendingWorkJobs.size() > 0) {
-		            assert (pendingWorkJobs.size() == 1);
-		            workJob = pendingWorkJobs.get(0);
-		        } else {
-		                    
-		            workJob = new VmWorkJobVO(context.getContextId());
-		
-		            workJob.setDispatcher(VmWorkJobDispatcher.VM_WORK_JOB_DISPATCHER);
+
+                VmWorkJobVO workJob = null;
+                if (pendingWorkJobs != null && pendingWorkJobs.size() > 0) {
+                    assert (pendingWorkJobs.size() == 1);
+                    workJob = pendingWorkJobs.get(0);
+                } else {
+
+                    workJob = new VmWorkJobVO(context.getContextId());
+
+                    workJob.setDispatcher(VmWorkJobDispatcher.VM_WORK_JOB_DISPATCHER);
                     workJob.setCmd(VmWorkStorageMigration.class.getName());
-		
-		            workJob.setAccountId(account.getId());
-		            workJob.setUserId(user.getId());
-		            workJob.setVmType(vm.getType());
-		            workJob.setVmInstanceId(vm.getId());
-		
-		            // save work context info (there are some duplications)
+
+                    workJob.setAccountId(account.getId());
+                    workJob.setUserId(user.getId());
+                    workJob.setVmType(vm.getType());
+                    workJob.setVmInstanceId(vm.getId());
+
+                    // save work context info (there are some duplications)
                     VmWorkStorageMigration workInfo = new VmWorkStorageMigration(user.getId(), account.getId(), vm.getId(),
                             VirtualMachineManagerImpl.VM_WORK_JOB_HANDLER, destPool);
-		            workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
-		
-		            _jobMgr.submitAsyncJob(workJob, VmWorkJobDispatcher.VM_WORK_QUEUE, vm.getId());
-		        }
-	            context.putContextParameter("workJob", workJob);
-	            context.putContextParameter("jobId", new Long(workJob.getId()));
-	    	}
-    	});
-    	
-    	final long jobId = (Long)context.getContextParameter("jobId");
-    	AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(jobId);
-    	
+                    workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
+
+                    _jobMgr.submitAsyncJob(workJob, VmWorkJobDispatcher.VM_WORK_QUEUE, vm.getId());
+                }
+                context.putContextParameter("workJob", workJob);
+                context.putContextParameter("jobId", new Long(workJob.getId()));
+            }
+        });
+
+        final long jobId = (Long)context.getContextParameter("jobId");
+        AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(jobId);
+
         return new VmJobSyncOutcome((VmWorkJobVO)context.getContextParameter("workJob"), vm.getId());
     }
 
@@ -4559,42 +4559,42 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
         Transaction.execute(new TransactionCallbackNoReturn() {
             @Override
             public void doInTransactionWithoutResult(TransactionStatus status) {
-		        _vmDao.lockRow(vm.getId(), true);
-		
-		        List<VmWorkJobVO> pendingWorkJobs = _workJobDao.listPendingWorkJobs(
-		        	VirtualMachine.Type.Instance, vm.getId(),
-		        	VmWorkRemoveNicFromVm.class.getName());
-		
-		        VmWorkJobVO workJob = null;
-		        if (pendingWorkJobs != null && pendingWorkJobs.size() > 0) {
-		            assert (pendingWorkJobs.size() == 1);
-		            workJob = pendingWorkJobs.get(0);
-		        } else {
-		                    
-		            workJob = new VmWorkJobVO(context.getContextId());
-		
-		            workJob.setDispatcher(VmWorkJobDispatcher.VM_WORK_JOB_DISPATCHER);
-		            workJob.setCmd(VmWorkRemoveNicFromVm.class.getName());
-		
-		            workJob.setAccountId(account.getId());
-		            workJob.setUserId(user.getId());
-		            workJob.setVmType(vm.getType());
-		            workJob.setVmInstanceId(vm.getId());
-		
-		            // save work context info (there are some duplications)
-		            VmWorkRemoveNicFromVm workInfo = new VmWorkRemoveNicFromVm(user.getId(), account.getId(), vm.getId(),
+                _vmDao.lockRow(vm.getId(), true);
+
+                List<VmWorkJobVO> pendingWorkJobs = _workJobDao.listPendingWorkJobs(
+                        VirtualMachine.Type.Instance, vm.getId(),
+                        VmWorkRemoveNicFromVm.class.getName());
+
+                VmWorkJobVO workJob = null;
+                if (pendingWorkJobs != null && pendingWorkJobs.size() > 0) {
+                    assert (pendingWorkJobs.size() == 1);
+                    workJob = pendingWorkJobs.get(0);
+                } else {
+
+                    workJob = new VmWorkJobVO(context.getContextId());
+
+                    workJob.setDispatcher(VmWorkJobDispatcher.VM_WORK_JOB_DISPATCHER);
+                    workJob.setCmd(VmWorkRemoveNicFromVm.class.getName());
+
+                    workJob.setAccountId(account.getId());
+                    workJob.setUserId(user.getId());
+                    workJob.setVmType(vm.getType());
+                    workJob.setVmInstanceId(vm.getId());
+
+                    // save work context info (there are some duplications)
+                    VmWorkRemoveNicFromVm workInfo = new VmWorkRemoveNicFromVm(user.getId(), account.getId(), vm.getId(),
                             VirtualMachineManagerImpl.VM_WORK_JOB_HANDLER, nic);
-		            workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
-		
-		            _jobMgr.submitAsyncJob(workJob, VmWorkJobDispatcher.VM_WORK_QUEUE, vm.getId());
-		        }
-	            context.putContextParameter("workJob", workJob);
-	            context.putContextParameter("jobId", new Long(workJob.getId()));
-	    	}
-    	});
-    	
-    	final long jobId = (Long)context.getContextParameter("jobId");
-    	AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(jobId);
+                    workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
+
+                    _jobMgr.submitAsyncJob(workJob, VmWorkJobDispatcher.VM_WORK_QUEUE, vm.getId());
+                }
+                context.putContextParameter("workJob", workJob);
+                context.putContextParameter("jobId", new Long(workJob.getId()));
+            }
+        });
+
+        final long jobId = (Long)context.getContextParameter("jobId");
+        AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(jobId);
 
         return new VmJobSyncOutcome((VmWorkJobVO)context.getContextParameter("workJob"), vm.getId());
     }
@@ -4609,43 +4609,43 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
         Transaction.execute(new TransactionCallbackNoReturn() {
             @Override
             public void doInTransactionWithoutResult(TransactionStatus status) {
-		        _vmDao.lockRow(vm.getId(), true);
-		
-		        List<VmWorkJobVO> pendingWorkJobs = _workJobDao.listPendingWorkJobs(
-		        	VirtualMachine.Type.Instance, vm.getId(),
-		        	VmWorkRemoveVmFromNetwork.class.getName());
-		
-		        VmWorkJobVO workJob = null;
-		        if (pendingWorkJobs != null && pendingWorkJobs.size() > 0) {
-		            assert (pendingWorkJobs.size() == 1);
-		            workJob = pendingWorkJobs.get(0);
-		        } else {
-		                    
-		            workJob = new VmWorkJobVO(context.getContextId());
-		
-		            workJob.setDispatcher(VmWorkJobDispatcher.VM_WORK_JOB_DISPATCHER);
-		            workJob.setCmd(VmWorkRemoveVmFromNetwork.class.getName());
-		
-		            workJob.setAccountId(account.getId());
-		            workJob.setUserId(user.getId());
-		            workJob.setVmType(vm.getType());
-		            workJob.setVmInstanceId(vm.getId());
-		
-		            // save work context info (there are some duplications)
-		            VmWorkRemoveVmFromNetwork workInfo = new VmWorkRemoveVmFromNetwork(user.getId(), account.getId(), vm.getId(),
+                _vmDao.lockRow(vm.getId(), true);
+
+                List<VmWorkJobVO> pendingWorkJobs = _workJobDao.listPendingWorkJobs(
+                        VirtualMachine.Type.Instance, vm.getId(),
+                        VmWorkRemoveVmFromNetwork.class.getName());
+
+                VmWorkJobVO workJob = null;
+                if (pendingWorkJobs != null && pendingWorkJobs.size() > 0) {
+                    assert (pendingWorkJobs.size() == 1);
+                    workJob = pendingWorkJobs.get(0);
+                } else {
+
+                    workJob = new VmWorkJobVO(context.getContextId());
+
+                    workJob.setDispatcher(VmWorkJobDispatcher.VM_WORK_JOB_DISPATCHER);
+                    workJob.setCmd(VmWorkRemoveVmFromNetwork.class.getName());
+
+                    workJob.setAccountId(account.getId());
+                    workJob.setUserId(user.getId());
+                    workJob.setVmType(vm.getType());
+                    workJob.setVmInstanceId(vm.getId());
+
+                    // save work context info (there are some duplications)
+                    VmWorkRemoveVmFromNetwork workInfo = new VmWorkRemoveVmFromNetwork(user.getId(), account.getId(), vm.getId(),
                             VirtualMachineManagerImpl.VM_WORK_JOB_HANDLER, network, broadcastUri);
-		            workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
-		
-		            _jobMgr.submitAsyncJob(workJob, VmWorkJobDispatcher.VM_WORK_QUEUE, vm.getId());
-		        }
-	            context.putContextParameter("workJob", workJob);
-	            context.putContextParameter("jobId", new Long(workJob.getId()));
-	    	}
-    	});
-    	
-    	final long jobId = (Long)context.getContextParameter("jobId");
-    	AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(jobId);
-    	
+                    workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
+
+                    _jobMgr.submitAsyncJob(workJob, VmWorkJobDispatcher.VM_WORK_QUEUE, vm.getId());
+                }
+                context.putContextParameter("workJob", workJob);
+                context.putContextParameter("jobId", new Long(workJob.getId()));
+            }
+        });
+
+        final long jobId = (Long)context.getContextParameter("jobId");
+        AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(jobId);
+
         return new VmJobSyncOutcome((VmWorkJobVO)context.getContextParameter("workJob"), vm.getId());
     }
 
@@ -4661,46 +4661,46 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
         Transaction.execute(new TransactionCallbackNoReturn() {
             @Override
             public void doInTransactionWithoutResult(TransactionStatus status) {
-		        _vmDao.lockRow(vm.getId(), true);
-		
-		        List<VmWorkJobVO> pendingWorkJobs = _workJobDao.listPendingWorkJobs(
-		        	VirtualMachine.Type.Instance, vm.getId(),
-		        	VmWorkReconfigure.class.getName());
-		
-		        VmWorkJobVO workJob = null;
-		        if (pendingWorkJobs != null && pendingWorkJobs.size() > 0) {
-		            assert (pendingWorkJobs.size() == 1);
-		            workJob = pendingWorkJobs.get(0);
-		        } else {
-		                    
-		            workJob = new VmWorkJobVO(context.getContextId());
-		
-		            workJob.setDispatcher(VmWorkJobDispatcher.VM_WORK_JOB_DISPATCHER);
-		            workJob.setCmd(VmWorkReconfigure.class.getName());
-		
-		            workJob.setAccountId(account.getId());
-		            workJob.setUserId(user.getId());
-		            workJob.setVmType(vm.getType());
-		            workJob.setVmInstanceId(vm.getId());
-		
-		            // save work context info (there are some duplications)
-		            VmWorkReconfigure workInfo = new VmWorkReconfigure(user.getId(), account.getId(), vm.getId(),
+                _vmDao.lockRow(vm.getId(), true);
+
+                List<VmWorkJobVO> pendingWorkJobs = _workJobDao.listPendingWorkJobs(
+                        VirtualMachine.Type.Instance, vm.getId(),
+                        VmWorkReconfigure.class.getName());
+
+                VmWorkJobVO workJob = null;
+                if (pendingWorkJobs != null && pendingWorkJobs.size() > 0) {
+                    assert (pendingWorkJobs.size() == 1);
+                    workJob = pendingWorkJobs.get(0);
+                } else {
+
+                    workJob = new VmWorkJobVO(context.getContextId());
+
+                    workJob.setDispatcher(VmWorkJobDispatcher.VM_WORK_JOB_DISPATCHER);
+                    workJob.setCmd(VmWorkReconfigure.class.getName());
+
+                    workJob.setAccountId(account.getId());
+                    workJob.setUserId(user.getId());
+                    workJob.setVmType(vm.getType());
+                    workJob.setVmInstanceId(vm.getId());
+
+                    // save work context info (there are some duplications)
+                    VmWorkReconfigure workInfo = new VmWorkReconfigure(user.getId(), account.getId(), vm.getId(),
                             VirtualMachineManagerImpl.VM_WORK_JOB_HANDLER, oldServiceOffering, reconfiguringOnExistingHost);
-		            workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
-		
-		            _jobMgr.submitAsyncJob(workJob, VmWorkJobDispatcher.VM_WORK_QUEUE, vm.getId());
-		        }
-	            context.putContextParameter("workJob", workJob);
-	            context.putContextParameter("jobId", new Long(workJob.getId()));
-	    	}
-    	});
-    	
-    	final long jobId = (Long)context.getContextParameter("jobId");
-    	AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(jobId);
-    	
+                    workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
+
+                    _jobMgr.submitAsyncJob(workJob, VmWorkJobDispatcher.VM_WORK_QUEUE, vm.getId());
+                }
+                context.putContextParameter("workJob", workJob);
+                context.putContextParameter("jobId", new Long(workJob.getId()));
+            }
+        });
+
+        final long jobId = (Long)context.getContextParameter("jobId");
+        AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(jobId);
+
         return new VmJobSyncOutcome((VmWorkJobVO)context.getContextParameter("workJob"), vm.getId());
     }
-   
+
     @Override
     public Pair<JobInfo.Status, String> handleVmWorkJob(AsyncJob job, VmWork work) throws Exception {
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/719271b1/engine/orchestration/src/com/cloud/vm/VmWorkAddVmToNetwork.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/src/com/cloud/vm/VmWorkAddVmToNetwork.java b/engine/orchestration/src/com/cloud/vm/VmWorkAddVmToNetwork.java
index 2a577f3..bb3b496 100644
--- a/engine/orchestration/src/com/cloud/vm/VmWorkAddVmToNetwork.java
+++ b/engine/orchestration/src/com/cloud/vm/VmWorkAddVmToNetwork.java
@@ -21,22 +21,22 @@ import com.cloud.network.Network;
 public class VmWorkAddVmToNetwork extends VmWork {
     private static final long serialVersionUID = 8861516006586736813L;
 
-	Network network;
-	NicProfile requstedNicProfile;
-	
+    Network network;
+    NicProfile requstedNicProfile;
+
     public VmWorkAddVmToNetwork(long userId, long accountId, long vmId, String handlerName,
-		Network network, NicProfile requested) {
+            Network network, NicProfile requested) {
         super(userId, accountId, vmId, handlerName);
-	
-		this.network = network;
-		requstedNicProfile = requested;
-	}
-	
-	public Network getNetwork() {
-		return network;
-	}
-	
-	public NicProfile getRequestedNicProfile() {
-		return requstedNicProfile;
-	}
+
+        this.network = network;
+        requstedNicProfile = requested;
+    }
+
+    public Network getNetwork() {
+        return network;
+    }
+
+    public NicProfile getRequestedNicProfile() {
+        return requstedNicProfile;
+    }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/719271b1/engine/orchestration/src/com/cloud/vm/VmWorkJobDispatcher.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/src/com/cloud/vm/VmWorkJobDispatcher.java b/engine/orchestration/src/com/cloud/vm/VmWorkJobDispatcher.java
index e29a99c..7ed9f39 100644
--- a/engine/orchestration/src/com/cloud/vm/VmWorkJobDispatcher.java
+++ b/engine/orchestration/src/com/cloud/vm/VmWorkJobDispatcher.java
@@ -39,11 +39,12 @@ public class VmWorkJobDispatcher extends AdapterBase implements AsyncJobDispatch
     public static final String VM_WORK_QUEUE = "VmWorkJobQueue";
     public static final String VM_WORK_JOB_DISPATCHER = "VmWorkJobDispatcher";
     public static final String VM_WORK_JOB_WAKEUP_DISPATCHER = "VmWorkJobWakeupDispatcher";
-    
+
     @Inject private VirtualMachineManagerImpl _vmMgr;
-	@Inject private AsyncJobManager _asyncJobMgr;
+    @Inject
+    private AsyncJobManager _asyncJobMgr;
     @Inject private VMInstanceDao _instanceDao;
-    
+
     private Map<String, VmWorkJobHandler> _handlers;
 
     public VmWorkJobDispatcher() {
@@ -57,7 +58,7 @@ public class VmWorkJobDispatcher extends AdapterBase implements AsyncJobDispatch
         _handlers = handlers;
     }
 
-	@Override
+    @Override
     public void runJob(AsyncJob job) {
         VmWork work = null;
         try {
@@ -83,7 +84,7 @@ public class VmWorkJobDispatcher extends AdapterBase implements AsyncJobDispatch
                 _asyncJobMgr.completeAsyncJob(job.getId(), JobInfo.Status.FAILED, 0, "Unable to deserialize VM work");
                 return;
             }
-            
+
             if (_handlers == null || _handlers.isEmpty()) {
                 s_logger.error("Invalid startup configuration, no work job handler is found. cmd: " + job.getCmd() + ", job info: " + job.getCmdInfo());
                 _asyncJobMgr.completeAsyncJob(job.getId(), JobInfo.Status.FAILED, 0, "Invalid startup configuration. no job handler is found");
@@ -91,7 +92,7 @@ public class VmWorkJobDispatcher extends AdapterBase implements AsyncJobDispatch
             }
 
             VmWorkJobHandler handler = _handlers.get(work.getHandlerName());
-            
+
             if (handler == null) {
                 s_logger.error("Unable to find work job handler. handler name: " + work.getHandlerName() + ", job cmd: " + job.getCmd() + ", job info: " + job.getCmdInfo());
                 _asyncJobMgr.completeAsyncJob(job.getId(), JobInfo.Status.FAILED, 0, "Unable to find work job handler");
@@ -99,7 +100,7 @@ public class VmWorkJobDispatcher extends AdapterBase implements AsyncJobDispatch
             }
 
             CallContext.register(work.getUserId(), work.getAccountId(), job.getRelated());
-            
+
             Pair<JobInfo.Status, String> result = handler.handleVmWorkJob(job, work);
             _asyncJobMgr.completeAsyncJob(job.getId(), result.first(), 0, result.second());
         } catch(Throwable e) {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/719271b1/engine/orchestration/src/com/cloud/vm/VmWorkMigrateForScale.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/src/com/cloud/vm/VmWorkMigrateForScale.java b/engine/orchestration/src/com/cloud/vm/VmWorkMigrateForScale.java
index e0ad90e..0dd4d88 100644
--- a/engine/orchestration/src/com/cloud/vm/VmWorkMigrateForScale.java
+++ b/engine/orchestration/src/com/cloud/vm/VmWorkMigrateForScale.java
@@ -19,19 +19,19 @@ package com.cloud.vm;
 import com.cloud.deploy.DeployDestination;
 
 public class VmWorkMigrateForScale extends VmWork {
-	private static final long serialVersionUID = 6854870395568389613L;
+    private static final long serialVersionUID = 6854870395568389613L;
+
+    long srcHostId;
+    DeployDestination deployDestination;
+    Long newSvcOfferingId;
 
-	long srcHostId;
-	DeployDestination deployDestination;
-	Long newSvcOfferingId;
-	
     public VmWorkMigrateForScale(long userId, long accountId, long vmId, String handlerName, long srcHostId,
-    	DeployDestination dest, Long newSvcOfferingId) {
-    	
+            DeployDestination dest, Long newSvcOfferingId) {
+
         super(userId, accountId, vmId, handlerName);
-    	this.srcHostId = srcHostId;
-    	deployDestination = dest;
-    	this.newSvcOfferingId = newSvcOfferingId;
+        this.srcHostId = srcHostId;
+        deployDestination = dest;
+        this.newSvcOfferingId = newSvcOfferingId;
     }
 
     public long getSrcHostId() {
@@ -39,10 +39,10 @@ public class VmWorkMigrateForScale extends VmWork {
     }
 
     public DeployDestination getDeployDestination() {
-    	return deployDestination;
+        return deployDestination;
     }
 
     public Long getNewServiceOfferringId() {
-    	return newSvcOfferingId;
+        return newSvcOfferingId;
     }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/719271b1/engine/orchestration/src/com/cloud/vm/VmWorkMigrateWithStorage.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/src/com/cloud/vm/VmWorkMigrateWithStorage.java b/engine/orchestration/src/com/cloud/vm/VmWorkMigrateWithStorage.java
index 3849556..ee30c74 100644
--- a/engine/orchestration/src/com/cloud/vm/VmWorkMigrateWithStorage.java
+++ b/engine/orchestration/src/com/cloud/vm/VmWorkMigrateWithStorage.java
@@ -22,31 +22,31 @@ import com.cloud.storage.StoragePool;
 import com.cloud.storage.Volume;
 
 public class VmWorkMigrateWithStorage extends VmWork {
-	private static final long serialVersionUID = -5626053872453569165L;
+    private static final long serialVersionUID = -5626053872453569165L;
+
+    long srcHostId;
+    long destHostId;
+    Map<Volume, StoragePool> volumeToPool;
 
-	long srcHostId;
-	long destHostId;
-	Map<Volume, StoragePool> volumeToPool;
-	
     public VmWorkMigrateWithStorage(long userId, long accountId, long vmId, String handlerName, long srcHostId,
-    	long destHostId, Map<Volume, StoragePool> volumeToPool) {
-    	
+            long destHostId, Map<Volume, StoragePool> volumeToPool) {
+
         super(userId, accountId, vmId, handlerName);
-    
-    	this.srcHostId = srcHostId;
-    	this.destHostId = destHostId;
-    	this.volumeToPool = volumeToPool;
+
+        this.srcHostId = srcHostId;
+        this.destHostId = destHostId;
+        this.volumeToPool = volumeToPool;
     }
 
     public long getSrcHostId() {
-    	return srcHostId;
+        return srcHostId;
     }
 
     public long getDestHostId() {
-    	return destHostId;
+        return destHostId;
     }
 
     public Map<Volume, StoragePool> getVolumeToPool() {
-    	return volumeToPool;
+        return volumeToPool;
     }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/719271b1/engine/orchestration/src/com/cloud/vm/VmWorkReboot.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/src/com/cloud/vm/VmWorkReboot.java b/engine/orchestration/src/com/cloud/vm/VmWorkReboot.java
index edecae8..63c7d00 100644
--- a/engine/orchestration/src/com/cloud/vm/VmWorkReboot.java
+++ b/engine/orchestration/src/com/cloud/vm/VmWorkReboot.java
@@ -30,8 +30,8 @@ public class VmWorkReboot extends VmWork {
 
     public VmWorkReboot(long userId, long accountId, long vmId, String handlerName, Map<VirtualMachineProfile.Param, Object> params) {
         super(userId, accountId, vmId, handlerName);
-    	
-    	setParams(params);
+
+        setParams(params);
     }
 
     public Map<VirtualMachineProfile.Param, Object> getParams() {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/719271b1/engine/orchestration/src/com/cloud/vm/VmWorkReconfigure.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/src/com/cloud/vm/VmWorkReconfigure.java b/engine/orchestration/src/com/cloud/vm/VmWorkReconfigure.java
index c7fd310..4c564d5 100644
--- a/engine/orchestration/src/com/cloud/vm/VmWorkReconfigure.java
+++ b/engine/orchestration/src/com/cloud/vm/VmWorkReconfigure.java
@@ -19,25 +19,25 @@ package com.cloud.vm;
 import com.cloud.offering.ServiceOffering;
 
 public class VmWorkReconfigure extends VmWork {
-	private static final long serialVersionUID = -4517030323758086615L;
-	
-	ServiceOffering newServiceOffering;
-	boolean sameHost;
-	
+    private static final long serialVersionUID = -4517030323758086615L;
+
+    ServiceOffering newServiceOffering;
+    boolean sameHost;
+
     public VmWorkReconfigure(long userId, long accountId, long vmId, String handlerName,
-    	ServiceOffering newServiceOffering, boolean sameHost) {
-    	
+            ServiceOffering newServiceOffering, boolean sameHost) {
+
         super(userId, accountId, vmId, handlerName);
-    	
-    	this.newServiceOffering = newServiceOffering;
-    	this.sameHost = sameHost;
+
+        this.newServiceOffering = newServiceOffering;
+        this.sameHost = sameHost;
     }
 
     public ServiceOffering getNewServiceOffering() {
-    	return newServiceOffering;
+        return newServiceOffering;
     }
 
     public boolean isSameHost() {
-    	return sameHost;
+        return sameHost;
     }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/719271b1/engine/orchestration/src/com/cloud/vm/VmWorkRemoveNicFromVm.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/src/com/cloud/vm/VmWorkRemoveNicFromVm.java b/engine/orchestration/src/com/cloud/vm/VmWorkRemoveNicFromVm.java
index 4d400b9..29264e6 100644
--- a/engine/orchestration/src/com/cloud/vm/VmWorkRemoveNicFromVm.java
+++ b/engine/orchestration/src/com/cloud/vm/VmWorkRemoveNicFromVm.java
@@ -19,15 +19,15 @@ package com.cloud.vm;
 public class VmWorkRemoveNicFromVm extends VmWork {
     private static final long serialVersionUID = -4265657031064437923L;
 
-	Nic nic;
-    
+    Nic nic;
+
     public VmWorkRemoveNicFromVm(long userId, long accountId, long vmId, String handlerName, Nic nic) {
         super(userId, accountId, vmId, handlerName);
-    	
-    	this.nic = nic;
+
+        this.nic = nic;
     }
 
     public Nic getNic() {
-    	return nic;
+        return nic;
     }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/719271b1/engine/orchestration/src/com/cloud/vm/VmWorkRemoveVmFromNetwork.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/src/com/cloud/vm/VmWorkRemoveVmFromNetwork.java b/engine/orchestration/src/com/cloud/vm/VmWorkRemoveVmFromNetwork.java
index 0cb02b2..535b8d0 100644
--- a/engine/orchestration/src/com/cloud/vm/VmWorkRemoveVmFromNetwork.java
+++ b/engine/orchestration/src/com/cloud/vm/VmWorkRemoveVmFromNetwork.java
@@ -21,23 +21,23 @@ import java.net.URI;
 import com.cloud.network.Network;
 
 public class VmWorkRemoveVmFromNetwork extends VmWork {
-	private static final long serialVersionUID = -5070392905642149925L;
+    private static final long serialVersionUID = -5070392905642149925L;
+
+    Network network;
+    URI broadcastUri;
 
-	Network network;
-	URI broadcastUri;
-	
     public VmWorkRemoveVmFromNetwork(long userId, long accountId, long vmId, String handlerName, Network network, URI broadcastUri) {
         super(userId, accountId, vmId, handlerName);
-    	
-    	this.network = network;
-    	this.broadcastUri = broadcastUri;
-	}
-	
-	public Network getNetwork() {
-		return network;
-	}
-	
-	public URI getBroadcastUri() {
-		return broadcastUri;
-	}
+
+        this.network = network;
+        this.broadcastUri = broadcastUri;
+    }
+
+    public Network getNetwork() {
+        return network;
+    }
+
+    public URI getBroadcastUri() {
+        return broadcastUri;
+    }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/719271b1/engine/orchestration/src/com/cloud/vm/VmWorkStart.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/src/com/cloud/vm/VmWorkStart.java b/engine/orchestration/src/com/cloud/vm/VmWorkStart.java
index 4f30e5d..f1b2efd 100644
--- a/engine/orchestration/src/com/cloud/vm/VmWorkStart.java
+++ b/engine/orchestration/src/com/cloud/vm/VmWorkStart.java
@@ -52,74 +52,74 @@ public class VmWorkStart extends VmWork {
 
     public VmWorkStart(long userId, long accountId, long vmId, String handlerName) {
         super(userId, accountId, vmId, handlerName);
-	}
-
-	public DeploymentPlan getPlan() {
-		
-		if(podId != null || clusterId != null || hostId != null || poolId != null || physicalNetworkId != null) {
-			// this is ugly, to work with legacy code, we need to re-construct the DeploymentPlan hard-codely
-			// this has to be refactored together with migrating legacy code into the new way
-			ReservationContext context = null;
-			if(reservationId != null) {
-		        Journal journal = new Journal.LogJournal("VmWorkStart", s_logger);
-				context = new ReservationContextImpl(reservationId, journal,
-						CallContext.current().getCallingUser(),
-						CallContext.current().getCallingAccount());
-			}
-			
-			DeploymentPlan plan = new DataCenterDeployment(
-					dcId, podId, clusterId, hostId, poolId, physicalNetworkId,
-					context);
-			return plan;
-		}
-		
-		return null;
-	}
-
-	public void setPlan(DeploymentPlan plan) {
-		if(plan != null) {
-			dcId = plan.getDataCenterId();
-			podId = plan.getPodId();
-			clusterId = plan.getClusterId();
-			hostId = plan.getHostId();
-			poolId = plan.getPoolId();
-			physicalNetworkId = plan.getPhysicalNetworkId();
-			avoids = plan.getAvoids();
-			
-			if(plan.getReservationContext() != null)
-				reservationId = plan.getReservationContext().getReservationId();
-		}
-	}
-
-	public Map<String, String> getRawParams() {
-		return rawParams;
-	}
-
-	public void setRawParams(Map<String, String> params) {
-		rawParams = params;
-	}
-	
-	public Map<VirtualMachineProfile.Param, Object> getParams() {
-		Map<VirtualMachineProfile.Param, Object> map = new HashMap<VirtualMachineProfile.Param, Object>();
-		
-		if(rawParams != null) {
-			for(Map.Entry<String, String> entry : rawParams.entrySet()) {
-				VirtualMachineProfile.Param key = new VirtualMachineProfile.Param(entry.getKey());
-				Object val = JobSerializerHelper.fromObjectSerializedString(entry.getValue());
-				map.put(key, val);
-			}
-		}
-		
-		return map;
-	}
-	
-	public void setParams(Map<VirtualMachineProfile.Param, Object> params) {
-		if(params != null) {
-			rawParams = new HashMap<String, String>();
-			for(Map.Entry<VirtualMachineProfile.Param, Object> entry : params.entrySet()) {
-				rawParams.put(entry.getKey().getName(), JobSerializerHelper.toObjectSerializedString(
-					entry.getValue() instanceof Serializable ? (Serializable)entry.getValue() : entry.getValue().toString()));
-			}
-		}
-	}
+    }
+
+    public DeploymentPlan getPlan() {
+
+        if (podId != null || clusterId != null || hostId != null || poolId != null || physicalNetworkId != null) {
+            // this is ugly, to work with legacy code, we need to re-construct the DeploymentPlan hard-codely
+            // this has to be refactored together with migrating legacy code into the new way
+            ReservationContext context = null;
+            if (reservationId != null) {
+                Journal journal = new Journal.LogJournal("VmWorkStart", s_logger);
+                context = new ReservationContextImpl(reservationId, journal,
+                        CallContext.current().getCallingUser(),
+                        CallContext.current().getCallingAccount());
+            }
+
+            DeploymentPlan plan = new DataCenterDeployment(
+                    dcId, podId, clusterId, hostId, poolId, physicalNetworkId,
+                    context);
+            return plan;
+        }
+
+        return null;
+    }
+
+    public void setPlan(DeploymentPlan plan) {
+        if (plan != null) {
+            dcId = plan.getDataCenterId();
+            podId = plan.getPodId();
+            clusterId = plan.getClusterId();
+            hostId = plan.getHostId();
+            poolId = plan.getPoolId();
+            physicalNetworkId = plan.getPhysicalNetworkId();
+            avoids = plan.getAvoids();
+
+            if (plan.getReservationContext() != null)
+                reservationId = plan.getReservationContext().getReservationId();
+        }
+    }
+
+    public Map<String, String> getRawParams() {
+        return rawParams;
+    }
+
+    public void setRawParams(Map<String, String> params) {
+        rawParams = params;
+    }
+
+    public Map<VirtualMachineProfile.Param, Object> getParams() {
+        Map<VirtualMachineProfile.Param, Object> map = new HashMap<VirtualMachineProfile.Param, Object>();
+
+        if (rawParams != null) {
+            for (Map.Entry<String, String> entry : rawParams.entrySet()) {
+                VirtualMachineProfile.Param key = new VirtualMachineProfile.Param(entry.getKey());
+                Object val = JobSerializerHelper.fromObjectSerializedString(entry.getValue());
+                map.put(key, val);
+            }
+        }
+
+        return map;
+    }
+
+    public void setParams(Map<VirtualMachineProfile.Param, Object> params) {
+        if (params != null) {
+            rawParams = new HashMap<String, String>();
+            for (Map.Entry<VirtualMachineProfile.Param, Object> entry : params.entrySet()) {
+                rawParams.put(entry.getKey().getName(), JobSerializerHelper.toObjectSerializedString(
+                        entry.getValue() instanceof Serializable ? (Serializable)entry.getValue() : entry.getValue().toString()));
+            }
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/719271b1/engine/orchestration/src/com/cloud/vm/VmWorkStop.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/src/com/cloud/vm/VmWorkStop.java b/engine/orchestration/src/com/cloud/vm/VmWorkStop.java
index ff3bfb9..6d41480 100644
--- a/engine/orchestration/src/com/cloud/vm/VmWorkStop.java
+++ b/engine/orchestration/src/com/cloud/vm/VmWorkStop.java
@@ -17,10 +17,10 @@
 package com.cloud.vm;
 
 public class VmWorkStop extends VmWork {
-	private static final long serialVersionUID = 202908740486785251L;
-	
-	private final boolean cleanup;
-	
+    private static final long serialVersionUID = 202908740486785251L;
+
+    private final boolean cleanup;
+
     public VmWorkStop(long userId, long accountId, long vmId, String handlerName, boolean cleanup) {
         super(userId, accountId, vmId, handlerName);
         this.cleanup = cleanup;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/719271b1/engine/orchestration/src/com/cloud/vm/VmWorkStorageMigration.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/src/com/cloud/vm/VmWorkStorageMigration.java b/engine/orchestration/src/com/cloud/vm/VmWorkStorageMigration.java
index bcee88a..2b2f8e8 100644
--- a/engine/orchestration/src/com/cloud/vm/VmWorkStorageMigration.java
+++ b/engine/orchestration/src/com/cloud/vm/VmWorkStorageMigration.java
@@ -25,11 +25,11 @@ public class VmWorkStorageMigration extends VmWork {
 
     public VmWorkStorageMigration(long userId, long accountId, long vmId, String handlerName, StoragePool destPool) {
         super(userId, accountId, vmId, handlerName);
-    	
-    	this.destPool = destPool;
+
+        this.destPool = destPool;
     }
 
     public StoragePool getDestStoragePool() {
-    	return destPool;
+        return destPool;
     }
 }


[2/3] CLOUDSTACK-669: refactor VM work job dispatcher to allow volume/snapshot manager to participate serialized job handling

Posted by ke...@apache.org.
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/9d3827e6/engine/orchestration/src/com/cloud/vm/VmWorkStart.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/src/com/cloud/vm/VmWorkStart.java b/engine/orchestration/src/com/cloud/vm/VmWorkStart.java
index e023801..4f30e5d 100644
--- a/engine/orchestration/src/com/cloud/vm/VmWorkStart.java
+++ b/engine/orchestration/src/com/cloud/vm/VmWorkStart.java
@@ -50,76 +50,76 @@ public class VmWorkStart extends VmWork {
     // use serialization friendly map
     private Map<String, String> rawParams;
 
-    public VmWorkStart(long userId, long accountId, long vmId) {
-        super(userId, accountId, vmId);
-    }
-
-    public DeploymentPlan getPlan() {
-
-        if (podId != null || clusterId != null || hostId != null || poolId != null || physicalNetworkId != null) {
-            // this is ugly, to work with legacy code, we need to re-construct the DeploymentPlan hard-codely
-            // this has to be refactored together with migrating legacy code into the new way
-            ReservationContext context = null;
-            if (reservationId != null) {
-                Journal journal = new Journal.LogJournal("VmWorkStart", s_logger);
-                context = new ReservationContextImpl(reservationId, journal,
-                    CallContext.current().getCallingUser(),
-                    CallContext.current().getCallingAccount());
-            }
-
-            DeploymentPlan plan = new DataCenterDeployment(
-                dcId, podId, clusterId, hostId, poolId, physicalNetworkId,
-                context);
-            return plan;
-        }
-
-        return null;
-    }
-
-    public void setPlan(DeploymentPlan plan) {
-        if (plan != null) {
-            dcId = plan.getDataCenterId();
-            podId = plan.getPodId();
-            clusterId = plan.getClusterId();
-            hostId = plan.getHostId();
-            poolId = plan.getPoolId();
-            physicalNetworkId = plan.getPhysicalNetworkId();
-            avoids = plan.getAvoids();
-
-            if (plan.getReservationContext() != null)
-                reservationId = plan.getReservationContext().getReservationId();
-        }
-    }
-
-    public Map<String, String> getRawParams() {
-        return rawParams;
-    }
-
-    public void setRawParams(Map<String, String> params) {
-        rawParams = params;
-    }
-
-    public Map<VirtualMachineProfile.Param, Object> getParams() {
-        Map<VirtualMachineProfile.Param, Object> map = new HashMap<VirtualMachineProfile.Param, Object>();
-
-        if (rawParams != null) {
-            for (Map.Entry<String, String> entry : rawParams.entrySet()) {
-                VirtualMachineProfile.Param key = new VirtualMachineProfile.Param(entry.getKey());
-                Object val = JobSerializerHelper.fromObjectSerializedString(entry.getValue());
-                map.put(key, val);
-            }
-        }
-
-        return map;
-    }
-
-    public void setParams(Map<VirtualMachineProfile.Param, Object> params) {
-        if (params != null) {
-            rawParams = new HashMap<String, String>();
-            for (Map.Entry<VirtualMachineProfile.Param, Object> entry : params.entrySet()) {
-                rawParams.put(entry.getKey().getName(), JobSerializerHelper.toObjectSerializedString(
-                    entry.getValue() instanceof Serializable ? (Serializable)entry.getValue() : entry.getValue().toString()));
-            }
-        }
-    }
+    public VmWorkStart(long userId, long accountId, long vmId, String handlerName) {
+        super(userId, accountId, vmId, handlerName);
+	}
+
+	public DeploymentPlan getPlan() {
+		
+		if(podId != null || clusterId != null || hostId != null || poolId != null || physicalNetworkId != null) {
+			// this is ugly, to work with legacy code, we need to re-construct the DeploymentPlan hard-codely
+			// this has to be refactored together with migrating legacy code into the new way
+			ReservationContext context = null;
+			if(reservationId != null) {
+		        Journal journal = new Journal.LogJournal("VmWorkStart", s_logger);
+				context = new ReservationContextImpl(reservationId, journal,
+						CallContext.current().getCallingUser(),
+						CallContext.current().getCallingAccount());
+			}
+			
+			DeploymentPlan plan = new DataCenterDeployment(
+					dcId, podId, clusterId, hostId, poolId, physicalNetworkId,
+					context);
+			return plan;
+		}
+		
+		return null;
+	}
+
+	public void setPlan(DeploymentPlan plan) {
+		if(plan != null) {
+			dcId = plan.getDataCenterId();
+			podId = plan.getPodId();
+			clusterId = plan.getClusterId();
+			hostId = plan.getHostId();
+			poolId = plan.getPoolId();
+			physicalNetworkId = plan.getPhysicalNetworkId();
+			avoids = plan.getAvoids();
+			
+			if(plan.getReservationContext() != null)
+				reservationId = plan.getReservationContext().getReservationId();
+		}
+	}
+
+	public Map<String, String> getRawParams() {
+		return rawParams;
+	}
+
+	public void setRawParams(Map<String, String> params) {
+		rawParams = params;
+	}
+	
+	public Map<VirtualMachineProfile.Param, Object> getParams() {
+		Map<VirtualMachineProfile.Param, Object> map = new HashMap<VirtualMachineProfile.Param, Object>();
+		
+		if(rawParams != null) {
+			for(Map.Entry<String, String> entry : rawParams.entrySet()) {
+				VirtualMachineProfile.Param key = new VirtualMachineProfile.Param(entry.getKey());
+				Object val = JobSerializerHelper.fromObjectSerializedString(entry.getValue());
+				map.put(key, val);
+			}
+		}
+		
+		return map;
+	}
+	
+	public void setParams(Map<VirtualMachineProfile.Param, Object> params) {
+		if(params != null) {
+			rawParams = new HashMap<String, String>();
+			for(Map.Entry<VirtualMachineProfile.Param, Object> entry : params.entrySet()) {
+				rawParams.put(entry.getKey().getName(), JobSerializerHelper.toObjectSerializedString(
+					entry.getValue() instanceof Serializable ? (Serializable)entry.getValue() : entry.getValue().toString()));
+			}
+		}
+	}
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/9d3827e6/engine/orchestration/src/com/cloud/vm/VmWorkStop.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/src/com/cloud/vm/VmWorkStop.java b/engine/orchestration/src/com/cloud/vm/VmWorkStop.java
index f0bc885..ff3bfb9 100644
--- a/engine/orchestration/src/com/cloud/vm/VmWorkStop.java
+++ b/engine/orchestration/src/com/cloud/vm/VmWorkStop.java
@@ -17,12 +17,12 @@
 package com.cloud.vm;
 
 public class VmWorkStop extends VmWork {
-    private static final long serialVersionUID = 202908740486785251L;
-
-    private final boolean cleanup;
-
-    public VmWorkStop(long userId, long accountId, long vmId, boolean cleanup) {
-        super(userId, accountId, vmId);
+	private static final long serialVersionUID = 202908740486785251L;
+	
+	private final boolean cleanup;
+	
+    public VmWorkStop(long userId, long accountId, long vmId, String handlerName, boolean cleanup) {
+        super(userId, accountId, vmId, handlerName);
         this.cleanup = cleanup;
     }
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/9d3827e6/engine/orchestration/src/com/cloud/vm/VmWorkStorageMigration.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/src/com/cloud/vm/VmWorkStorageMigration.java b/engine/orchestration/src/com/cloud/vm/VmWorkStorageMigration.java
index 76a35b2..bcee88a 100644
--- a/engine/orchestration/src/com/cloud/vm/VmWorkStorageMigration.java
+++ b/engine/orchestration/src/com/cloud/vm/VmWorkStorageMigration.java
@@ -23,13 +23,13 @@ public class VmWorkStorageMigration extends VmWork {
 
     StoragePool destPool;
 
-    public VmWorkStorageMigration(long userId, long accountId, long vmId, StoragePool destPool) {
-        super(userId, accountId, vmId);
-
-        this.destPool = destPool;
+    public VmWorkStorageMigration(long userId, long accountId, long vmId, String handlerName, StoragePool destPool) {
+        super(userId, accountId, vmId, handlerName);
+    	
+    	this.destPool = destPool;
     }
 
     public StoragePool getDestStoragePool() {
-        return this.destPool;
+    	return destPool;
     }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/9d3827e6/server/resources/META-INF/cloudstack/core/spring-server-core-managers-context.xml
----------------------------------------------------------------------
diff --git a/server/resources/META-INF/cloudstack/core/spring-server-core-managers-context.xml b/server/resources/META-INF/cloudstack/core/spring-server-core-managers-context.xml
index d373034..35683f0 100644
--- a/server/resources/META-INF/cloudstack/core/spring-server-core-managers-context.xml
+++ b/server/resources/META-INF/cloudstack/core/spring-server-core-managers-context.xml
@@ -20,11 +20,16 @@
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:aop="http://www.springframework.org/schema/aop"
+       xmlns:util="http://www.springframework.org/schema/util"
+       
        xsi:schemaLocation="http://www.springframework.org/schema/beans
                       http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
-                      http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
+                      http://www.springframework.org/schema/aop 
+                      http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
                       http://www.springframework.org/schema/context
-                      http://www.springframework.org/schema/context/spring-context-3.0.xsd"
+                      http://www.springframework.org/schema/context/spring-context-3.0.xsd
+                      http://www.springframework.org/schema/util
+                      http://www.springframework.org/schema/util/spring-util-3.0.xsd"
                       >
 
     <bean id="accountManagerImpl" class="com.cloud.user.AccountManagerImpl">
@@ -230,5 +235,4 @@
         class="org.apache.cloudstack.region.gslb.GlobalLoadBalancingRulesServiceImpl" />
 
     <bean id="certServiceImpl" class="org.apache.cloudstack.network.lb.CertServiceImpl" />
-
 </beans>


[3/3] git commit: updated refs/heads/master to 719271b

Posted by ke...@apache.org.
CLOUDSTACK-669: refactor VM work job dispatcher to allow volume/snapshot manager to participate serialized job handling


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

Branch: refs/heads/master
Commit: 9d3827e6fe48b23639392bfe25c4d3bd2c083eac
Parents: 2f53295
Author: Kelven Yang <ke...@gmail.com>
Authored: Fri Dec 13 17:25:56 2013 -0800
Committer: Kelven Yang <ke...@gmail.com>
Committed: Mon Dec 16 15:15:30 2013 -0800

----------------------------------------------------------------------
 .../src/com/cloud/vm/VirtualMachineManager.java |  41 +-
 .../components-api/src/com/cloud/vm/VmWork.java |  15 +-
 ...spring-engine-orchestration-core-context.xml |   7 +-
 .../com/cloud/vm/VirtualMachineManagerImpl.java | 830 ++++++++++---------
 .../src/com/cloud/vm/VmWorkAddVmToNetwork.java  |  36 +-
 .../src/com/cloud/vm/VmWorkJobDispatcher.java   | 118 +--
 .../src/com/cloud/vm/VmWorkJobHandler.java      |  26 +
 .../src/com/cloud/vm/VmWorkMigrate.java         |   5 +-
 .../src/com/cloud/vm/VmWorkMigrateForScale.java |  30 +-
 .../com/cloud/vm/VmWorkMigrateWithStorage.java  |  34 +-
 .../src/com/cloud/vm/VmWorkReboot.java          |  16 +-
 .../src/com/cloud/vm/VmWorkReconfigure.java     |  28 +-
 .../src/com/cloud/vm/VmWorkRemoveNicFromVm.java |  14 +-
 .../com/cloud/vm/VmWorkRemoveVmFromNetwork.java |  38 +-
 .../src/com/cloud/vm/VmWorkStart.java           | 144 ++--
 .../src/com/cloud/vm/VmWorkStop.java            |  12 +-
 .../com/cloud/vm/VmWorkStorageMigration.java    |  10 +-
 .../spring-server-core-managers-context.xml     |  10 +-
 18 files changed, 714 insertions(+), 700 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/9d3827e6/engine/api/src/com/cloud/vm/VirtualMachineManager.java
----------------------------------------------------------------------
diff --git a/engine/api/src/com/cloud/vm/VirtualMachineManager.java b/engine/api/src/com/cloud/vm/VirtualMachineManager.java
index 80497b1..05cbfc2 100644
--- a/engine/api/src/com/cloud/vm/VirtualMachineManager.java
+++ b/engine/api/src/com/cloud/vm/VirtualMachineManager.java
@@ -99,13 +99,8 @@ public interface VirtualMachineManager extends Manager {
     void advanceStart(String vmUuid, Map<VirtualMachineProfile.Param, Object> params, DeploymentPlan planToDeploy) throws InsufficientCapacityException,
         ResourceUnavailableException, ConcurrentOperationException, OperationTimedoutException;
 
-    void orchestrateStart(String vmUuid, Map<VirtualMachineProfile.Param, Object> params, DeploymentPlan planToDeploy) throws InsufficientCapacityException,
-        ResourceUnavailableException, ConcurrentOperationException, OperationTimedoutException;
-
     void advanceStop(String vmUuid, boolean cleanupEvenIfUnableToStop) throws ResourceUnavailableException, OperationTimedoutException, ConcurrentOperationException;
 
-    void orchestrateStop(String vmUuid, boolean cleanupEvenIfUnableToStop) throws ResourceUnavailableException, OperationTimedoutException, ConcurrentOperationException;
-
     void advanceExpunge(String vmUuid) throws ResourceUnavailableException, OperationTimedoutException, ConcurrentOperationException;
 
     void destroy(String vmUuid) throws AgentUnavailableException, OperationTimedoutException, ConcurrentOperationException;
@@ -113,19 +108,11 @@ public interface VirtualMachineManager extends Manager {
     void migrateAway(String vmUuid, long hostId) throws InsufficientServerCapacityException;
 
     void migrate(String vmUuid, long srcHostId, DeployDestination dest) throws ResourceUnavailableException, ConcurrentOperationException;
-
-    void orchestrateMigrate(String vmUuid, long srcHostId, DeployDestination dest) throws ResourceUnavailableException, ConcurrentOperationException;
-
-    void migrateWithStorage(String vmUuid, long srcId, long destId, Map<Volume, StoragePool> volumeToPool) throws ResourceUnavailableException,
-        ConcurrentOperationException;
-
-    void orchestrateMigrateWithStorage(String vmUuid, long srcId, long destId, Map<Volume, StoragePool> volumeToPool) throws ResourceUnavailableException,
-        ConcurrentOperationException;
-
+    
+    void migrateWithStorage(String vmUuid, long srcId, long destId, Map<Volume, StoragePool> volumeToPool) throws ResourceUnavailableException, ConcurrentOperationException;
+    
     void reboot(String vmUuid, Map<VirtualMachineProfile.Param, Object> params) throws InsufficientCapacityException, ResourceUnavailableException;
 
-    void orchestrateReboot(String vmUuid, Map<VirtualMachineProfile.Param, Object> params) throws InsufficientCapacityException, ResourceUnavailableException;
-
     void advanceReboot(String vmUuid, Map<VirtualMachineProfile.Param, Object> params) throws InsufficientCapacityException, ResourceUnavailableException,
         ConcurrentOperationException, OperationTimedoutException;
 
@@ -142,8 +129,6 @@ public interface VirtualMachineManager extends Manager {
 
     void storageMigration(String vmUuid, StoragePool storagePoolId);
 
-    void orchestrateStorageMigration(String vmUuid, StoragePool storagePoolId);
-
     /**
      * @param vmInstance
      * @param newServiceOffering
@@ -166,12 +151,9 @@ public interface VirtualMachineManager extends Manager {
      * @throws ResourceUnavailableException
      * @throws InsufficientCapacityException
      */
-    NicProfile addVmToNetwork(VirtualMachine vm, Network network, NicProfile requested) throws ConcurrentOperationException, ResourceUnavailableException,
-        InsufficientCapacityException;
-
-    NicProfile orchestrateAddVmToNetwork(VirtualMachine vm, Network network, NicProfile requested) throws ConcurrentOperationException,
+    NicProfile addVmToNetwork(VirtualMachine vm, Network network, NicProfile requested) throws ConcurrentOperationException,
         ResourceUnavailableException, InsufficientCapacityException;
-
+    
     /**
      * @param vm
      * @param nic
@@ -181,8 +163,6 @@ public interface VirtualMachineManager extends Manager {
      */
     boolean removeNicFromVm(VirtualMachine vm, Nic nic) throws ConcurrentOperationException, ResourceUnavailableException;
 
-    boolean orchestrateRemoveNicFromVm(VirtualMachine vm, Nic nic) throws ConcurrentOperationException, ResourceUnavailableException;
-
     /**
      * @param vm
      * @param network
@@ -192,9 +172,6 @@ public interface VirtualMachineManager extends Manager {
      * @throws ConcurrentOperationException
      */
     boolean removeVmFromNetwork(VirtualMachine vm, Network network, URI broadcastUri) throws ConcurrentOperationException, ResourceUnavailableException;
-
-    boolean orchestrateRemoveVmFromNetwork(VirtualMachine vm, Network network, URI broadcastUri) throws ConcurrentOperationException, ResourceUnavailableException;
-
     /**
      * @param nic
      * @param hypervisorType
@@ -210,16 +187,8 @@ public interface VirtualMachineManager extends Manager {
     VirtualMachineTO toVmTO(VirtualMachineProfile profile);
 
     VirtualMachine reConfigureVm(String vmUuid, ServiceOffering newServiceOffering, boolean sameHost) throws ResourceUnavailableException, ConcurrentOperationException;
-
-    VirtualMachine orchestrateReConfigureVm(String vmUuid, ServiceOffering newServiceOffering, boolean sameHost) throws ResourceUnavailableException,
-        ConcurrentOperationException;
-
     void findHostAndMigrate(String vmUuid, Long newSvcOfferingId, DeploymentPlanner.ExcludeList excludeHostList) throws InsufficientCapacityException,
         ConcurrentOperationException, ResourceUnavailableException;
 
     void migrateForScale(String vmUuid, long srcHostId, DeployDestination dest, Long newSvcOfferingId) throws ResourceUnavailableException, ConcurrentOperationException;
-
-    void orchestrateMigrateForScale(String vmUuid, long srcHostId, DeployDestination dest, Long newSvcOfferingId) throws ResourceUnavailableException,
-        ConcurrentOperationException;
-
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/9d3827e6/engine/components-api/src/com/cloud/vm/VmWork.java
----------------------------------------------------------------------
diff --git a/engine/components-api/src/com/cloud/vm/VmWork.java b/engine/components-api/src/com/cloud/vm/VmWork.java
index 751db99..98e46a3 100644
--- a/engine/components-api/src/com/cloud/vm/VmWork.java
+++ b/engine/components-api/src/com/cloud/vm/VmWork.java
@@ -25,11 +25,14 @@ public class VmWork implements Serializable {
     long accountId;
     long vmId;
 
-    public VmWork(long userId, long accountId, long vmId) {
+    String handlerName;
+
+    public VmWork(long userId, long accountId, long vmId, String handlerName) {
         this.userId = userId;
         this.accountId = accountId;
         this.vmId = vmId;
-    }
+        this.handlerName = handlerName;
+	}
 
     public long getUserId() {
         return userId;
@@ -39,7 +42,11 @@ public class VmWork implements Serializable {
         return accountId;
     }
 
-    public long getVmId() {
-        return vmId;
+	public long getVmId() {
+		return vmId;
+	}
+
+    public String getHandlerName() {
+        return handlerName;
     }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/9d3827e6/engine/orchestration/resources/META-INF/cloudstack/core/spring-engine-orchestration-core-context.xml
----------------------------------------------------------------------
diff --git a/engine/orchestration/resources/META-INF/cloudstack/core/spring-engine-orchestration-core-context.xml b/engine/orchestration/resources/META-INF/cloudstack/core/spring-engine-orchestration-core-context.xml
index fc3bae3..49cb9cd 100644
--- a/engine/orchestration/resources/META-INF/cloudstack/core/spring-engine-orchestration-core-context.xml
+++ b/engine/orchestration/resources/META-INF/cloudstack/core/spring-engine-orchestration-core-context.xml
@@ -60,7 +60,6 @@
 
     <bean id="clusteredAgentManagerImpl" class="com.cloud.agent.manager.ClusteredAgentManagerImpl" />
 
-
     <bean id="cloudOrchestrator"
         class="org.apache.cloudstack.engine.orchestration.CloudOrchestrator" />
     <bean id="dataCenterResourceManagerImpl"
@@ -73,10 +72,16 @@
     <bean id="virtualMachineEntityImpl" class="org.apache.cloudstack.engine.cloud.entity.api.VirtualMachineEntityImpl" />
     
     <bean id="virtualMachinePowerStateSyncImpl" class="com.cloud.vm.VirtualMachinePowerStateSyncImpl" />
+      
     <bean id= "vmWorkJobDispatcher" class="com.cloud.vm.VmWorkJobDispatcher">
         <property name="name">
             <util:constant static-field="com.cloud.vm.VmWorkJobDispatcher.VM_WORK_JOB_DISPATCHER"/>
         </property>
+        <property name="handlers">
+            <map>
+                <entry key="VirtualMachineManagerImpl" value-ref="clusteredVirtualMachineManagerImpl" />
+            </map>
+        </property>
     </bean>
     <bean id= "vmWorkJobWakeupDispatcher" class="com.cloud.vm.VmWorkJobWakeupDispatcher">
         <property name="name">

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/9d3827e6/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java b/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
index 7201569..f89d83c 100755
--- a/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
+++ b/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
@@ -205,9 +205,11 @@ import com.cloud.vm.snapshot.VMSnapshotVO;
 import com.cloud.vm.snapshot.dao.VMSnapshotDao;
 
 @Local(value = VirtualMachineManager.class)
-public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMachineManager, Listener, Configurable {
+public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMachineManager, VmWorkJobHandler, Listener, Configurable {
     private static final Logger s_logger = Logger.getLogger(VirtualMachineManagerImpl.class);
 
+    public static final String VM_WORK_JOB_HANDLER = VirtualMachineManagerImpl.class.getSimpleName();
+
     private static final String VM_SYNC_ALERT_SUBJECT = "VM state sync alert";
 
     @Inject
@@ -270,6 +272,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
     protected AffinityGroupVMMapDao _affinityGroupVMMapDao;
     @Inject
     protected EntityManager _entityMgr;
+
     @Inject
     ConfigDepot _configDepot;
 
@@ -731,12 +734,11 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
             }
         }
     }
-
-    @Override
-    public void orchestrateStart(String vmUuid, Map<VirtualMachineProfile.Param, Object> params, DeploymentPlan planToDeploy) throws InsufficientCapacityException,
-        ConcurrentOperationException, ResourceUnavailableException {
-
-        CallContext cctxt = CallContext.current();
+    
+    private void orchestrateStart(String vmUuid, Map<VirtualMachineProfile.Param, Object> params, DeploymentPlan planToDeploy) throws InsufficientCapacityException,
+    	ConcurrentOperationException, ResourceUnavailableException {
+        
+    	CallContext cctxt = CallContext.current();
         Account account = cctxt.getCallingAccount();
         User caller = cctxt.getCallingUser();
 
@@ -1254,9 +1256,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
         }
     }
 
-    @Override
-    public void orchestrateStop(String vmUuid, boolean cleanUpEvenIfUnableToStop) throws AgentUnavailableException, OperationTimedoutException,
-        ConcurrentOperationException {
+    private void orchestrateStop(String vmUuid, boolean cleanUpEvenIfUnableToStop) throws AgentUnavailableException, OperationTimedoutException, ConcurrentOperationException {
         VMInstanceVO vm = _vmDao.findByUuid(vmUuid);
 
         advanceStop(vm, cleanUpEvenIfUnableToStop);
@@ -1542,8 +1542,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
         }
     }
 
-    @Override
-    public void orchestrateStorageMigration(String vmUuid, StoragePool destPool) {
+    private void orchestrateStorageMigration(String vmUuid, StoragePool destPool) {
         VMInstanceVO vm = _vmDao.findByUuid(vmUuid);
 
         try {
@@ -1628,9 +1627,8 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
             }
         }
     }
-
-    @Override
-    public void orchestrateMigrate(String vmUuid, long srcHostId, DeployDestination dest) throws ResourceUnavailableException, ConcurrentOperationException {
+    
+    private void orchestrateMigrate(String vmUuid, long srcHostId, DeployDestination dest) throws ResourceUnavailableException, ConcurrentOperationException {
         VMInstanceVO vm = _vmDao.findByUuid(vmUuid);
         if (vm == null) {
             if (s_logger.isDebugEnabled()) {
@@ -1898,11 +1896,10 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
             }
         }
     }
-
-    @Override
-    public void orchestrateMigrateWithStorage(String vmUuid, long srcHostId, long destHostId, Map<Volume, StoragePool> volumeToPool) throws ResourceUnavailableException,
-        ConcurrentOperationException {
-
+    
+    private void orchestrateMigrateWithStorage(String vmUuid, long srcHostId, long destHostId, Map<Volume, StoragePool> volumeToPool) throws ResourceUnavailableException,
+    	ConcurrentOperationException {
+    	
         VMInstanceVO vm = _vmDao.findByUuid(vmUuid);
 
         HostVO srcHost = _hostDao.findById(srcHostId);
@@ -2180,10 +2177,9 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
             }
         }
     }
-
-    @Override
-    public void orchestrateReboot(String vmUuid, Map<VirtualMachineProfile.Param, Object> params) throws InsufficientCapacityException, ConcurrentOperationException,
-        ResourceUnavailableException {
+    
+    private void orchestrateReboot(String vmUuid, Map<VirtualMachineProfile.Param, Object> params) throws InsufficientCapacityException, ConcurrentOperationException,
+    ResourceUnavailableException {
         VMInstanceVO vm = _vmDao.findByUuid(vmUuid);
 
         DataCenter dc = _entityMgr.findById(DataCenter.class, vm.getDataCenterId());
@@ -3112,11 +3108,9 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
             }
         }
     }
-
-    @Override
-    public NicProfile orchestrateAddVmToNetwork(VirtualMachine vm, Network network, NicProfile requested) throws ConcurrentOperationException,
-        ResourceUnavailableException,
-        InsufficientCapacityException {
+    
+    private NicProfile orchestrateAddVmToNetwork(VirtualMachine vm, Network network, NicProfile requested) throws ConcurrentOperationException, ResourceUnavailableException,
+    InsufficientCapacityException {
         CallContext cctx = CallContext.current();
 
         s_logger.debug("Adding vm " + vm + " to network " + network + "; requested nic profile " + requested);
@@ -3221,8 +3215,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
         }
     }
 
-    @Override
-    public boolean orchestrateRemoveNicFromVm(VirtualMachine vm, Nic nic) throws ConcurrentOperationException, ResourceUnavailableException {
+    private boolean orchestrateRemoveNicFromVm(VirtualMachine vm, Nic nic) throws ConcurrentOperationException, ResourceUnavailableException {
         CallContext cctx = CallContext.current();
         VMInstanceVO vmVO = _vmDao.findById(vm.getId());
         NetworkVO network = _networkDao.findById(nic.getNetworkId());
@@ -3287,10 +3280,8 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
         // TODO will serialize on the VM object later to resolve operation conflicts
         return orchestrateRemoveVmFromNetwork(vm, network, broadcastUri);
     }
-
-    @Override
     @DB
-    public boolean orchestrateRemoveVmFromNetwork(VirtualMachine vm, Network network, URI broadcastUri) throws ConcurrentOperationException, ResourceUnavailableException {
+    private boolean orchestrateRemoveVmFromNetwork(VirtualMachine vm, Network network, URI broadcastUri) throws ConcurrentOperationException, ResourceUnavailableException {
         CallContext cctx = CallContext.current();
         VMInstanceVO vmVO = _vmDao.findById(vm.getId());
         ReservationContext context = new ReservationContextImpl(null, null, cctx.getCallingUser(), cctx.getCallingAccount());
@@ -3456,11 +3447,10 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
         }
     }
 
-    @Override
-    public void orchestrateMigrateForScale(String vmUuid, long srcHostId, DeployDestination dest, Long oldSvcOfferingId)
-        throws ResourceUnavailableException, ConcurrentOperationException {
-
-        VMInstanceVO vm = _vmDao.findByUuid(vmUuid);
+    private void orchestrateMigrateForScale(String vmUuid, long srcHostId, DeployDestination dest, Long oldSvcOfferingId)
+    	throws ResourceUnavailableException, ConcurrentOperationException {
+        
+    	VMInstanceVO vm = _vmDao.findByUuid(vmUuid);
         s_logger.info("Migrating " + vm + " to " + dest);
 
         vm.getServiceOfferingId();
@@ -3713,11 +3703,9 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
             }
         }
     }
-
-    @Override
-    public VMInstanceVO orchestrateReConfigureVm(String vmUuid, ServiceOffering oldServiceOffering, boolean reconfiguringOnExistingHost)
-        throws ResourceUnavailableException,
-        ConcurrentOperationException {
+    
+    private VMInstanceVO orchestrateReConfigureVm(String vmUuid, ServiceOffering oldServiceOffering, boolean reconfiguringOnExistingHost) throws ResourceUnavailableException,
+    ConcurrentOperationException {
         VMInstanceVO vm = _vmDao.findByUuid(vmUuid);
 
         long newServiceofferingId = vm.getServiceOfferingId();
@@ -4160,7 +4148,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
 
                 _vmDao.lockRow(vm.getId(), true);
                 List<VmWorkJobVO> pendingWorkJobs = _workJobDao.listPendingWorkJobs(VirtualMachine.Type.Instance,
-                    vm.getId(), VmWorkStart.class.getName());
+                        vm.getId(), VmWorkStart.class.getName());
 
                 if (pendingWorkJobs.size() > 0) {
                     assert (pendingWorkJobs.size() == 1);
@@ -4175,26 +4163,26 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
                     workJob.setUserId(callingUser.getId());
                     workJob.setStep(VmWorkJobVO.Step.Starting);
                     workJob.setVmType(vm.getType());
-                    workJob.setVmInstanceId(vm.getId());
-
-                    // save work context info (there are some duplications)
-                    VmWorkStart workInfo = new VmWorkStart(callingUser.getId(), callingAccount.getId(), vm.getId());
-                    workInfo.setPlan(planToDeploy);
-                    workInfo.setParams(params);
-                    workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
-
-                    _jobMgr.submitAsyncJob(workJob, VmWorkJobDispatcher.VM_WORK_QUEUE, vm.getId());
-                }
-
-                // Transaction syntax sugar has a cost here
-                context.putContextParameter("workJob", workJob);
-                context.putContextParameter("jobId", new Long(workJob.getId()));
-            }
-        });
-
-        final long jobId = (Long)context.getContextParameter("jobId");
-        AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(jobId);
-
+    	            workJob.setVmInstanceId(vm.getId());
+
+    	            // save work context info (there are some duplications)
+                    VmWorkStart workInfo = new VmWorkStart(callingUser.getId(), callingAccount.getId(), vm.getId(), VirtualMachineManagerImpl.VM_WORK_JOB_HANDLER);
+    	            workInfo.setPlan(planToDeploy);
+    	            workInfo.setParams(params);
+    	            workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
+
+    	            _jobMgr.submitAsyncJob(workJob, VmWorkJobDispatcher.VM_WORK_QUEUE, vm.getId());
+    	    	}
+    	        
+	            // Transaction syntax sugar has a cost here
+	            context.putContextParameter("workJob", workJob);
+	            context.putContextParameter("jobId", new Long(workJob.getId()));
+    		}
+    	});
+    	
+    	final long jobId = (Long)context.getContextParameter("jobId");
+    	AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(jobId);
+    	
         return new VmStateSyncOutcome((VmWorkJobVO)context.getContextParameter("workJob"),
             VirtualMachine.PowerState.PowerOn, vm.getId(), null);
     }
@@ -4212,40 +4200,40 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
                 _vmDao.lockRow(vm.getId(), true);
 
                 List<VmWorkJobVO> pendingWorkJobs = _workJobDao.listPendingWorkJobs(
-                    VirtualMachine.Type.Instance, vm.getId(),
-                    VmWorkStop.class.getName());
+                        VirtualMachine.Type.Instance, vm.getId(),
+                        VmWorkStop.class.getName());
 
                 VmWorkJobVO workJob = null;
                 if (pendingWorkJobs != null && pendingWorkJobs.size() > 0) {
                     assert (pendingWorkJobs.size() == 1);
                     workJob = pendingWorkJobs.get(0);
-                } else {
-                    workJob = new VmWorkJobVO(context.getContextId());
-
-                    workJob.setDispatcher(VmWorkJobDispatcher.VM_WORK_JOB_DISPATCHER);
-                    workJob.setCmd(VmWorkStop.class.getName());
-
-                    workJob.setAccountId(account.getId());
-                    workJob.setUserId(user.getId());
-                    workJob.setStep(VmWorkJobVO.Step.Prepare);
-                    workJob.setVmType(vm.getType());
-                    workJob.setVmInstanceId(vm.getId());
-
-                    // save work context info (there are some duplications)
-                    VmWorkStop workInfo = new VmWorkStop(user.getId(), account.getId(), vm.getId(), cleanup);
-                    workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
-
-                    _jobMgr.submitAsyncJob(workJob, VmWorkJobDispatcher.VM_WORK_QUEUE, vm.getId());
-                }
-
-                context.putContextParameter("workJob", workJob);
-                context.putContextParameter("jobId", new Long(workJob.getId()));
-            }
-        });
-
-        final long jobId = (Long)context.getContextParameter("jobId");
-        AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(jobId);
-
+		        } else {
+		            workJob = new VmWorkJobVO(context.getContextId());
+		
+		            workJob.setDispatcher(VmWorkJobDispatcher.VM_WORK_JOB_DISPATCHER);
+		            workJob.setCmd(VmWorkStop.class.getName());
+		
+		            workJob.setAccountId(account.getId());
+		            workJob.setUserId(user.getId());
+		            workJob.setStep(VmWorkJobVO.Step.Prepare);
+		            workJob.setVmType(vm.getType());
+		            workJob.setVmInstanceId(vm.getId());
+		
+		            // save work context info (there are some duplications)
+                    VmWorkStop workInfo = new VmWorkStop(user.getId(), account.getId(), vm.getId(), VirtualMachineManagerImpl.VM_WORK_JOB_HANDLER, cleanup);
+		            workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
+		
+		            _jobMgr.submitAsyncJob(workJob, VmWorkJobDispatcher.VM_WORK_QUEUE, vm.getId());
+		    	}
+		        
+	            context.putContextParameter("workJob", workJob);
+	            context.putContextParameter("jobId", new Long(workJob.getId()));
+    		}
+		});
+
+    	final long jobId = (Long)context.getContextParameter("jobId");
+    	AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(jobId);
+    	
         return new VmStateSyncOutcome((VmWorkJobVO)context.getContextParameter("workJob"),
             VirtualMachine.PowerState.PowerOff, vm.getId(), null);
     }
@@ -4265,8 +4253,8 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
                 _vmDao.lockRow(vm.getId(), true);
 
                 List<VmWorkJobVO> pendingWorkJobs = _workJobDao.listPendingWorkJobs(
-                    VirtualMachine.Type.Instance, vm.getId(),
-                    VmWorkReboot.class.getName());
+                        VirtualMachine.Type.Instance, vm.getId(),
+                        VmWorkReboot.class.getName());
 
                 VmWorkJobVO workJob = null;
                 if (pendingWorkJobs != null && pendingWorkJobs.size() > 0) {
@@ -4277,28 +4265,28 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
 
                     workJob.setDispatcher(VmWorkJobDispatcher.VM_WORK_JOB_DISPATCHER);
                     workJob.setCmd(VmWorkReboot.class.getName());
-
-                    workJob.setAccountId(account.getId());
-                    workJob.setUserId(user.getId());
-                    workJob.setStep(VmWorkJobVO.Step.Prepare);
-                    workJob.setVmType(vm.getType());
-                    workJob.setVmInstanceId(vm.getId());
-
-                    // save work context info (there are some duplications)
-                    VmWorkReboot workInfo = new VmWorkReboot(user.getId(), account.getId(), vm.getId(), params);
-                    workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
-
-                    _jobMgr.submitAsyncJob(workJob, VmWorkJobDispatcher.VM_WORK_QUEUE, vm.getId());
-                }
-
-                context.putContextParameter("workJob", workJob);
-                context.putContextParameter("jobId", new Long(workJob.getId()));
-            }
-        });
-
-        final long jobId = (Long)context.getContextParameter("jobId");
-        AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(jobId);
-
+		
+		            workJob.setAccountId(account.getId());
+		            workJob.setUserId(user.getId());
+		            workJob.setStep(VmWorkJobVO.Step.Prepare);
+		            workJob.setVmType(vm.getType());
+		            workJob.setVmInstanceId(vm.getId());
+		
+		            // save work context info (there are some duplications)
+                    VmWorkReboot workInfo = new VmWorkReboot(user.getId(), account.getId(), vm.getId(), VirtualMachineManagerImpl.VM_WORK_JOB_HANDLER, params);
+		            workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
+		
+		            _jobMgr.submitAsyncJob(workJob, VmWorkJobDispatcher.VM_WORK_QUEUE, vm.getId());
+		    	}
+		        
+	            context.putContextParameter("workJob", workJob);
+	            context.putContextParameter("jobId", new Long(workJob.getId()));
+    		}
+		});
+
+    	final long jobId = (Long)context.getContextParameter("jobId");
+    	AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(jobId);
+    	
         return new VmJobSyncOutcome((VmWorkJobVO)context.getContextParameter("workJob"),
             vm.getId());
     }
@@ -4313,50 +4301,49 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
         Transaction.execute(new TransactionCallbackNoReturn() {
             @Override
             public void doInTransactionWithoutResult(TransactionStatus status) {
-
-                _vmDao.lockRow(vm.getId(), true);
-
-                List<VmWorkJobVO> pendingWorkJobs = _workJobDao.listPendingWorkJobs(
-                    VirtualMachine.Type.Instance, vm.getId(),
-                    VmWorkMigrate.class.getName());
-
-                VmWorkJobVO workJob = null;
-                if (pendingWorkJobs != null && pendingWorkJobs.size() > 0) {
-                    assert (pendingWorkJobs.size() == 1);
-                    workJob = pendingWorkJobs.get(0);
-                } else {
-
-                    workJob = new VmWorkJobVO(context.getContextId());
-
-                    workJob.setDispatcher(VmWorkJobDispatcher.VM_WORK_JOB_DISPATCHER);
-                    workJob.setCmd(VmWorkMigrate.class.getName());
-
-                    workJob.setAccountId(account.getId());
-                    workJob.setUserId(user.getId());
-                    workJob.setVmType(vm.getType());
-                    workJob.setVmInstanceId(vm.getId());
-
-                    // save work context info (there are some duplications)
-                    VmWorkMigrate workInfo = new VmWorkMigrate(user.getId(), account.getId(), vm.getId(), srcHostId, dest);
-                    workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
-
-                    _jobMgr.submitAsyncJob(workJob, VmWorkJobDispatcher.VM_WORK_QUEUE, vm.getId());
-                }
-                context.putContextParameter("workJob", workJob);
-                context.putContextParameter("jobId", new Long(workJob.getId()));
-            }
-        });
-
-        final long jobId = (Long)context.getContextParameter("jobId");
-        AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(jobId);
-
+		        _vmDao.lockRow(vm.getId(), true);
+		
+		        List<VmWorkJobVO> pendingWorkJobs = _workJobDao.listPendingWorkJobs(
+		        	VirtualMachine.Type.Instance, vm.getId(),
+                        VmWorkMigrate.class.getName());
+		
+		        VmWorkJobVO workJob = null;
+		        if (pendingWorkJobs != null && pendingWorkJobs.size() > 0) {
+		            assert (pendingWorkJobs.size() == 1);
+		            workJob = pendingWorkJobs.get(0);
+		        } else {
+		                    
+		            workJob = new VmWorkJobVO(context.getContextId());
+		
+		            workJob.setDispatcher(VmWorkJobDispatcher.VM_WORK_JOB_DISPATCHER);
+		            workJob.setCmd(VmWorkMigrate.class.getName());
+		
+		            workJob.setAccountId(account.getId());
+		            workJob.setUserId(user.getId());
+		            workJob.setVmType(vm.getType());
+		            workJob.setVmInstanceId(vm.getId());
+		
+		            // save work context info (there are some duplications)
+                    VmWorkMigrate workInfo = new VmWorkMigrate(user.getId(), account.getId(), vm.getId(), VirtualMachineManagerImpl.VM_WORK_JOB_HANDLER, srcHostId, dest);
+		            workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
+		
+		            _jobMgr.submitAsyncJob(workJob, VmWorkJobDispatcher.VM_WORK_QUEUE, vm.getId());
+		        }
+	            context.putContextParameter("workJob", workJob);
+	            context.putContextParameter("jobId", new Long(workJob.getId()));
+	    	}
+    	});
+    	
+    	final long jobId = (Long)context.getContextParameter("jobId");
+    	AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(jobId);
+    	
         return new VmStateSyncOutcome((VmWorkJobVO)context.getContextParameter("workJob"),
-            VirtualMachine.PowerState.PowerOn, vm.getId(), vm.getPowerHostId());
+                VirtualMachine.PowerState.PowerOn, vm.getId(), vm.getPowerHostId());
     }
 
     public Outcome<VirtualMachine> migrateVmWithStorageThroughJobQueue(
-        final String vmUuid, final long srcHostId, final long destHostId,
-        final Map<Volume, StoragePool> volumeToPool) {
+            final String vmUuid, final long srcHostId, final long destHostId,
+            final Map<Volume, StoragePool> volumeToPool) {
 
         final CallContext context = CallContext.current();
         final User user = context.getCallingUser();
@@ -4367,50 +4354,49 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
         Transaction.execute(new TransactionCallbackNoReturn() {
             @Override
             public void doInTransactionWithoutResult(TransactionStatus status) {
-
-                _vmDao.lockRow(vm.getId(), true);
-
-                List<VmWorkJobVO> pendingWorkJobs = _workJobDao.listPendingWorkJobs(
-                    VirtualMachine.Type.Instance, vm.getId(),
-                    VmWorkMigrateWithStorage.class.getName());
-
-                VmWorkJobVO workJob = null;
-                if (pendingWorkJobs != null && pendingWorkJobs.size() > 0) {
-                    assert (pendingWorkJobs.size() == 1);
-                    workJob = pendingWorkJobs.get(0);
-                } else {
-
-                    workJob = new VmWorkJobVO(context.getContextId());
-
-                    workJob.setDispatcher(VmWorkJobDispatcher.VM_WORK_JOB_DISPATCHER);
-                    workJob.setCmd(VmWorkMigrate.class.getName());
-
-                    workJob.setAccountId(account.getId());
-                    workJob.setUserId(user.getId());
-                    workJob.setVmType(vm.getType());
-                    workJob.setVmInstanceId(vm.getId());
-
-                    // save work context info (there are some duplications)
+		        _vmDao.lockRow(vm.getId(), true);
+		
+		        List<VmWorkJobVO> pendingWorkJobs = _workJobDao.listPendingWorkJobs(
+		        	VirtualMachine.Type.Instance, vm.getId(),
+                        VmWorkMigrateWithStorage.class.getName());
+		
+		        VmWorkJobVO workJob = null;
+		        if (pendingWorkJobs != null && pendingWorkJobs.size() > 0) {
+		            assert (pendingWorkJobs.size() == 1);
+		            workJob = pendingWorkJobs.get(0);
+		        } else {
+		                    
+		            workJob = new VmWorkJobVO(context.getContextId());
+		
+		            workJob.setDispatcher(VmWorkJobDispatcher.VM_WORK_JOB_DISPATCHER);
+		            workJob.setCmd(VmWorkMigrate.class.getName());
+		
+		            workJob.setAccountId(account.getId());
+		            workJob.setUserId(user.getId());
+		            workJob.setVmType(vm.getType());
+		            workJob.setVmInstanceId(vm.getId());
+		
+		            // save work context info (there are some duplications)
                     VmWorkMigrateWithStorage workInfo = new VmWorkMigrateWithStorage(user.getId(), account.getId(), vm.getId(),
-                        srcHostId, destHostId, volumeToPool);
-                    workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
-
-                    _jobMgr.submitAsyncJob(workJob, VmWorkJobDispatcher.VM_WORK_QUEUE, vm.getId());
-                }
-                context.putContextParameter("workJob", workJob);
-                context.putContextParameter("jobId", new Long(workJob.getId()));
-            }
-        });
-
-        final long jobId = (Long)context.getContextParameter("jobId");
-        AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(jobId);
-
+                            VirtualMachineManagerImpl.VM_WORK_JOB_HANDLER, srcHostId, destHostId, volumeToPool);
+		            workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
+		
+		            _jobMgr.submitAsyncJob(workJob, VmWorkJobDispatcher.VM_WORK_QUEUE, vm.getId());
+		        }
+	            context.putContextParameter("workJob", workJob);
+	            context.putContextParameter("jobId", new Long(workJob.getId()));
+	    	}
+    	});
+    	
+    	final long jobId = (Long)context.getContextParameter("jobId");
+    	AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(jobId);
+    	
         return new VmStateSyncOutcome((VmWorkJobVO)context.getContextParameter("workJob"),
-            VirtualMachine.PowerState.PowerOn, vm.getId(), destHostId);
+                VirtualMachine.PowerState.PowerOn, vm.getId(), destHostId);
     }
 
     public Outcome<VirtualMachine> migrateVmForScaleThroughJobQueue(
-        final String vmUuid, final long srcHostId, final DeployDestination dest, final Long newSvcOfferingId) {
+            final String vmUuid, final long srcHostId, final DeployDestination dest, final Long newSvcOfferingId) {
 
         final CallContext context = CallContext.current();
         final User user = context.getCallingUser();
@@ -4421,49 +4407,48 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
         Transaction.execute(new TransactionCallbackNoReturn() {
             @Override
             public void doInTransactionWithoutResult(TransactionStatus status) {
-
-                _vmDao.lockRow(vm.getId(), true);
-
-                List<VmWorkJobVO> pendingWorkJobs = _workJobDao.listPendingWorkJobs(
-                    VirtualMachine.Type.Instance, vm.getId(),
-                    VmWorkMigrateForScale.class.getName());
-
-                VmWorkJobVO workJob = null;
-                if (pendingWorkJobs != null && pendingWorkJobs.size() > 0) {
-                    assert (pendingWorkJobs.size() == 1);
-                    workJob = pendingWorkJobs.get(0);
-                } else {
-
-                    workJob = new VmWorkJobVO(context.getContextId());
-
-                    workJob.setDispatcher(VmWorkJobDispatcher.VM_WORK_JOB_DISPATCHER);
+		        _vmDao.lockRow(vm.getId(), true);
+		
+		        List<VmWorkJobVO> pendingWorkJobs = _workJobDao.listPendingWorkJobs(
+		        	VirtualMachine.Type.Instance, vm.getId(),
+                        VmWorkMigrateForScale.class.getName());
+		
+		        VmWorkJobVO workJob = null;
+		        if (pendingWorkJobs != null && pendingWorkJobs.size() > 0) {
+		            assert (pendingWorkJobs.size() == 1);
+		            workJob = pendingWorkJobs.get(0);
+		        } else {
+		                    
+		            workJob = new VmWorkJobVO(context.getContextId());
+		
+		            workJob.setDispatcher(VmWorkJobDispatcher.VM_WORK_JOB_DISPATCHER);
                     workJob.setCmd(VmWorkMigrate.class.getName());
-
-                    workJob.setAccountId(account.getId());
-                    workJob.setUserId(user.getId());
-                    workJob.setVmType(vm.getType());
-                    workJob.setVmInstanceId(vm.getId());
-
-                    // save work context info (there are some duplications)
+		
+		            workJob.setAccountId(account.getId());
+		            workJob.setUserId(user.getId());
+		            workJob.setVmType(vm.getType());
+		            workJob.setVmInstanceId(vm.getId());
+		
+		            // save work context info (there are some duplications)
                     VmWorkMigrateForScale workInfo = new VmWorkMigrateForScale(user.getId(), account.getId(), vm.getId(),
-                        srcHostId, dest, newSvcOfferingId);
-                    workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
-
-                    _jobMgr.submitAsyncJob(workJob, VmWorkJobDispatcher.VM_WORK_QUEUE, vm.getId());
-                }
-                context.putContextParameter("workJob", workJob);
-                context.putContextParameter("jobId", new Long(workJob.getId()));
-            }
-        });
-
-        final long jobId = (Long)context.getContextParameter("jobId");
-        AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(jobId);
-
+                            VirtualMachineManagerImpl.VM_WORK_JOB_HANDLER, srcHostId, dest, newSvcOfferingId);
+		            workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
+		
+		            _jobMgr.submitAsyncJob(workJob, VmWorkJobDispatcher.VM_WORK_QUEUE, vm.getId());
+		        }
+	            context.putContextParameter("workJob", workJob);
+	            context.putContextParameter("jobId", new Long(workJob.getId()));
+	    	}
+    	});
+    	
+    	final long jobId = (Long)context.getContextParameter("jobId");
+    	AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(jobId);
+    	
         return new VmJobSyncOutcome((VmWorkJobVO)context.getContextParameter("workJob"), vm.getId());
     }
 
     public Outcome<VirtualMachine> migrateVmStorageThroughJobQueue(
-        final String vmUuid, final StoragePool destPool) {
+            final String vmUuid, final StoragePool destPool) {
 
         final CallContext context = CallContext.current();
         final User user = context.getCallingUser();
@@ -4474,49 +4459,48 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
         Transaction.execute(new TransactionCallbackNoReturn() {
             @Override
             public void doInTransactionWithoutResult(TransactionStatus status) {
-
-                _vmDao.lockRow(vm.getId(), true);
-
-                List<VmWorkJobVO> pendingWorkJobs = _workJobDao.listPendingWorkJobs(
-                    VirtualMachine.Type.Instance, vm.getId(),
-                    VmWorkStorageMigration.class.getName());
-
-                VmWorkJobVO workJob = null;
-                if (pendingWorkJobs != null && pendingWorkJobs.size() > 0) {
-                    assert (pendingWorkJobs.size() == 1);
-                    workJob = pendingWorkJobs.get(0);
-                } else {
-
-                    workJob = new VmWorkJobVO(context.getContextId());
-
-                    workJob.setDispatcher(VmWorkJobDispatcher.VM_WORK_JOB_DISPATCHER);
+		        _vmDao.lockRow(vm.getId(), true);
+		
+		        List<VmWorkJobVO> pendingWorkJobs = _workJobDao.listPendingWorkJobs(
+		        	VirtualMachine.Type.Instance, vm.getId(),
+                        VmWorkStorageMigration.class.getName());
+		
+		        VmWorkJobVO workJob = null;
+		        if (pendingWorkJobs != null && pendingWorkJobs.size() > 0) {
+		            assert (pendingWorkJobs.size() == 1);
+		            workJob = pendingWorkJobs.get(0);
+		        } else {
+		                    
+		            workJob = new VmWorkJobVO(context.getContextId());
+		
+		            workJob.setDispatcher(VmWorkJobDispatcher.VM_WORK_JOB_DISPATCHER);
                     workJob.setCmd(VmWorkStorageMigration.class.getName());
-
-                    workJob.setAccountId(account.getId());
-                    workJob.setUserId(user.getId());
-                    workJob.setVmType(vm.getType());
-                    workJob.setVmInstanceId(vm.getId());
-
-                    // save work context info (there are some duplications)
+		
+		            workJob.setAccountId(account.getId());
+		            workJob.setUserId(user.getId());
+		            workJob.setVmType(vm.getType());
+		            workJob.setVmInstanceId(vm.getId());
+		
+		            // save work context info (there are some duplications)
                     VmWorkStorageMigration workInfo = new VmWorkStorageMigration(user.getId(), account.getId(), vm.getId(),
-                        destPool);
-                    workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
-
-                    _jobMgr.submitAsyncJob(workJob, VmWorkJobDispatcher.VM_WORK_QUEUE, vm.getId());
-                }
-                context.putContextParameter("workJob", workJob);
-                context.putContextParameter("jobId", new Long(workJob.getId()));
-            }
-        });
-
-        final long jobId = (Long)context.getContextParameter("jobId");
-        AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(jobId);
-
+                            VirtualMachineManagerImpl.VM_WORK_JOB_HANDLER, destPool);
+		            workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
+		
+		            _jobMgr.submitAsyncJob(workJob, VmWorkJobDispatcher.VM_WORK_QUEUE, vm.getId());
+		        }
+	            context.putContextParameter("workJob", workJob);
+	            context.putContextParameter("jobId", new Long(workJob.getId()));
+	    	}
+    	});
+    	
+    	final long jobId = (Long)context.getContextParameter("jobId");
+    	AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(jobId);
+    	
         return new VmJobSyncOutcome((VmWorkJobVO)context.getContextParameter("workJob"), vm.getId());
     }
 
     public Outcome<VirtualMachine> addVmToNetworkThroughJobQueue(
-        final VirtualMachine vm, final Network network, final NicProfile requested) {
+            final VirtualMachine vm, final Network network, final NicProfile requested) {
 
         final CallContext context = CallContext.current();
         final User user = context.getCallingUser();
@@ -4525,12 +4509,11 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
         Transaction.execute(new TransactionCallbackNoReturn() {
             @Override
             public void doInTransactionWithoutResult(TransactionStatus status) {
-
                 _vmDao.lockRow(vm.getId(), true);
 
                 List<VmWorkJobVO> pendingWorkJobs = _workJobDao.listPendingWorkJobs(
-                    VirtualMachine.Type.Instance, vm.getId(),
-                    VmWorkAddVmToNetwork.class.getName());
+                        VirtualMachine.Type.Instance, vm.getId(),
+                        VmWorkAddVmToNetwork.class.getName());
 
                 VmWorkJobVO workJob = null;
                 if (pendingWorkJobs != null && pendingWorkJobs.size() > 0) {
@@ -4550,7 +4533,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
 
                     // save work context info (there are some duplications)
                     VmWorkAddVmToNetwork workInfo = new VmWorkAddVmToNetwork(user.getId(), account.getId(), vm.getId(),
-                        network, requested);
+                            VirtualMachineManagerImpl.VM_WORK_JOB_HANDLER, network, requested);
                     workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
 
                     _jobMgr.submitAsyncJob(workJob, VmWorkJobDispatcher.VM_WORK_QUEUE, vm.getId());
@@ -4567,7 +4550,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
     }
 
     public Outcome<VirtualMachine> removeNicFromVmThroughJobQueue(
-        final VirtualMachine vm, final Nic nic) {
+            final VirtualMachine vm, final Nic nic) {
 
         final CallContext context = CallContext.current();
         final User user = context.getCallingUser();
@@ -4576,49 +4559,48 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
         Transaction.execute(new TransactionCallbackNoReturn() {
             @Override
             public void doInTransactionWithoutResult(TransactionStatus status) {
-
-                _vmDao.lockRow(vm.getId(), true);
-
-                List<VmWorkJobVO> pendingWorkJobs = _workJobDao.listPendingWorkJobs(
-                    VirtualMachine.Type.Instance, vm.getId(),
-                    VmWorkRemoveNicFromVm.class.getName());
-
-                VmWorkJobVO workJob = null;
-                if (pendingWorkJobs != null && pendingWorkJobs.size() > 0) {
-                    assert (pendingWorkJobs.size() == 1);
-                    workJob = pendingWorkJobs.get(0);
-                } else {
-
-                    workJob = new VmWorkJobVO(context.getContextId());
-
-                    workJob.setDispatcher(VmWorkJobDispatcher.VM_WORK_JOB_DISPATCHER);
-                    workJob.setCmd(VmWorkRemoveNicFromVm.class.getName());
-
-                    workJob.setAccountId(account.getId());
-                    workJob.setUserId(user.getId());
-                    workJob.setVmType(vm.getType());
-                    workJob.setVmInstanceId(vm.getId());
-
-                    // save work context info (there are some duplications)
-                    VmWorkRemoveNicFromVm workInfo = new VmWorkRemoveNicFromVm(user.getId(), account.getId(), vm.getId(),
-                        nic);
-                    workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
-
-                    _jobMgr.submitAsyncJob(workJob, VmWorkJobDispatcher.VM_WORK_QUEUE, vm.getId());
-                }
-                context.putContextParameter("workJob", workJob);
-                context.putContextParameter("jobId", new Long(workJob.getId()));
-            }
-        });
-
-        final long jobId = (Long)context.getContextParameter("jobId");
-        AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(jobId);
+		        _vmDao.lockRow(vm.getId(), true);
+		
+		        List<VmWorkJobVO> pendingWorkJobs = _workJobDao.listPendingWorkJobs(
+		        	VirtualMachine.Type.Instance, vm.getId(),
+		        	VmWorkRemoveNicFromVm.class.getName());
+		
+		        VmWorkJobVO workJob = null;
+		        if (pendingWorkJobs != null && pendingWorkJobs.size() > 0) {
+		            assert (pendingWorkJobs.size() == 1);
+		            workJob = pendingWorkJobs.get(0);
+		        } else {
+		                    
+		            workJob = new VmWorkJobVO(context.getContextId());
+		
+		            workJob.setDispatcher(VmWorkJobDispatcher.VM_WORK_JOB_DISPATCHER);
+		            workJob.setCmd(VmWorkRemoveNicFromVm.class.getName());
+		
+		            workJob.setAccountId(account.getId());
+		            workJob.setUserId(user.getId());
+		            workJob.setVmType(vm.getType());
+		            workJob.setVmInstanceId(vm.getId());
+		
+		            // save work context info (there are some duplications)
+		            VmWorkRemoveNicFromVm workInfo = new VmWorkRemoveNicFromVm(user.getId(), account.getId(), vm.getId(),
+                            VirtualMachineManagerImpl.VM_WORK_JOB_HANDLER, nic);
+		            workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
+		
+		            _jobMgr.submitAsyncJob(workJob, VmWorkJobDispatcher.VM_WORK_QUEUE, vm.getId());
+		        }
+	            context.putContextParameter("workJob", workJob);
+	            context.putContextParameter("jobId", new Long(workJob.getId()));
+	    	}
+    	});
+    	
+    	final long jobId = (Long)context.getContextParameter("jobId");
+    	AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(jobId);
 
         return new VmJobSyncOutcome((VmWorkJobVO)context.getContextParameter("workJob"), vm.getId());
     }
 
     public Outcome<VirtualMachine> removeVmFromNetworkThroughJobQueue(
-        final VirtualMachine vm, final Network network, final URI broadcastUri) {
+            final VirtualMachine vm, final Network network, final URI broadcastUri) {
 
         final CallContext context = CallContext.current();
         final User user = context.getCallingUser();
@@ -4627,44 +4609,43 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
         Transaction.execute(new TransactionCallbackNoReturn() {
             @Override
             public void doInTransactionWithoutResult(TransactionStatus status) {
-
-                _vmDao.lockRow(vm.getId(), true);
-
-                List<VmWorkJobVO> pendingWorkJobs = _workJobDao.listPendingWorkJobs(
-                    VirtualMachine.Type.Instance, vm.getId(),
-                    VmWorkRemoveVmFromNetwork.class.getName());
-
-                VmWorkJobVO workJob = null;
-                if (pendingWorkJobs != null && pendingWorkJobs.size() > 0) {
-                    assert (pendingWorkJobs.size() == 1);
-                    workJob = pendingWorkJobs.get(0);
-                } else {
-
-                    workJob = new VmWorkJobVO(context.getContextId());
-
-                    workJob.setDispatcher(VmWorkJobDispatcher.VM_WORK_JOB_DISPATCHER);
-                    workJob.setCmd(VmWorkRemoveVmFromNetwork.class.getName());
-
-                    workJob.setAccountId(account.getId());
-                    workJob.setUserId(user.getId());
-                    workJob.setVmType(vm.getType());
-                    workJob.setVmInstanceId(vm.getId());
-
-                    // save work context info (there are some duplications)
-                    VmWorkRemoveVmFromNetwork workInfo = new VmWorkRemoveVmFromNetwork(user.getId(), account.getId(), vm.getId(),
-                        network, broadcastUri);
-                    workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
-
-                    _jobMgr.submitAsyncJob(workJob, VmWorkJobDispatcher.VM_WORK_QUEUE, vm.getId());
-                }
-                context.putContextParameter("workJob", workJob);
-                context.putContextParameter("jobId", new Long(workJob.getId()));
-            }
-        });
-
-        final long jobId = (Long)context.getContextParameter("jobId");
-        AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(jobId);
-
+		        _vmDao.lockRow(vm.getId(), true);
+		
+		        List<VmWorkJobVO> pendingWorkJobs = _workJobDao.listPendingWorkJobs(
+		        	VirtualMachine.Type.Instance, vm.getId(),
+		        	VmWorkRemoveVmFromNetwork.class.getName());
+		
+		        VmWorkJobVO workJob = null;
+		        if (pendingWorkJobs != null && pendingWorkJobs.size() > 0) {
+		            assert (pendingWorkJobs.size() == 1);
+		            workJob = pendingWorkJobs.get(0);
+		        } else {
+		                    
+		            workJob = new VmWorkJobVO(context.getContextId());
+		
+		            workJob.setDispatcher(VmWorkJobDispatcher.VM_WORK_JOB_DISPATCHER);
+		            workJob.setCmd(VmWorkRemoveVmFromNetwork.class.getName());
+		
+		            workJob.setAccountId(account.getId());
+		            workJob.setUserId(user.getId());
+		            workJob.setVmType(vm.getType());
+		            workJob.setVmInstanceId(vm.getId());
+		
+		            // save work context info (there are some duplications)
+		            VmWorkRemoveVmFromNetwork workInfo = new VmWorkRemoveVmFromNetwork(user.getId(), account.getId(), vm.getId(),
+                            VirtualMachineManagerImpl.VM_WORK_JOB_HANDLER, network, broadcastUri);
+		            workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
+		
+		            _jobMgr.submitAsyncJob(workJob, VmWorkJobDispatcher.VM_WORK_QUEUE, vm.getId());
+		        }
+	            context.putContextParameter("workJob", workJob);
+	            context.putContextParameter("jobId", new Long(workJob.getId()));
+	    	}
+    	});
+    	
+    	final long jobId = (Long)context.getContextParameter("jobId");
+    	AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(jobId);
+    	
         return new VmJobSyncOutcome((VmWorkJobVO)context.getContextParameter("workJob"), vm.getId());
     }
 
@@ -4680,45 +4661,114 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
         Transaction.execute(new TransactionCallbackNoReturn() {
             @Override
             public void doInTransactionWithoutResult(TransactionStatus status) {
-
-                _vmDao.lockRow(vm.getId(), true);
-
-                List<VmWorkJobVO> pendingWorkJobs = _workJobDao.listPendingWorkJobs(
-                    VirtualMachine.Type.Instance, vm.getId(),
-                    VmWorkReconfigure.class.getName());
-
-                VmWorkJobVO workJob = null;
-                if (pendingWorkJobs != null && pendingWorkJobs.size() > 0) {
-                    assert (pendingWorkJobs.size() == 1);
-                    workJob = pendingWorkJobs.get(0);
-                } else {
-
-                    workJob = new VmWorkJobVO(context.getContextId());
-
-                    workJob.setDispatcher(VmWorkJobDispatcher.VM_WORK_JOB_DISPATCHER);
-                    workJob.setCmd(VmWorkReconfigure.class.getName());
-
-                    workJob.setAccountId(account.getId());
-                    workJob.setUserId(user.getId());
-                    workJob.setVmType(vm.getType());
-                    workJob.setVmInstanceId(vm.getId());
-
-                    // save work context info (there are some duplications)
-                    VmWorkReconfigure workInfo = new VmWorkReconfigure(user.getId(), account.getId(), vm.getId(),
-                        oldServiceOffering, reconfiguringOnExistingHost);
-                    workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
-
-                    _jobMgr.submitAsyncJob(workJob, VmWorkJobDispatcher.VM_WORK_QUEUE, vm.getId());
-                }
-                context.putContextParameter("workJob", workJob);
-                context.putContextParameter("jobId", new Long(workJob.getId()));
-            }
-        });
-
-        final long jobId = (Long)context.getContextParameter("jobId");
-        AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(jobId);
-
+		        _vmDao.lockRow(vm.getId(), true);
+		
+		        List<VmWorkJobVO> pendingWorkJobs = _workJobDao.listPendingWorkJobs(
+		        	VirtualMachine.Type.Instance, vm.getId(),
+		        	VmWorkReconfigure.class.getName());
+		
+		        VmWorkJobVO workJob = null;
+		        if (pendingWorkJobs != null && pendingWorkJobs.size() > 0) {
+		            assert (pendingWorkJobs.size() == 1);
+		            workJob = pendingWorkJobs.get(0);
+		        } else {
+		                    
+		            workJob = new VmWorkJobVO(context.getContextId());
+		
+		            workJob.setDispatcher(VmWorkJobDispatcher.VM_WORK_JOB_DISPATCHER);
+		            workJob.setCmd(VmWorkReconfigure.class.getName());
+		
+		            workJob.setAccountId(account.getId());
+		            workJob.setUserId(user.getId());
+		            workJob.setVmType(vm.getType());
+		            workJob.setVmInstanceId(vm.getId());
+		
+		            // save work context info (there are some duplications)
+		            VmWorkReconfigure workInfo = new VmWorkReconfigure(user.getId(), account.getId(), vm.getId(),
+                            VirtualMachineManagerImpl.VM_WORK_JOB_HANDLER, oldServiceOffering, reconfiguringOnExistingHost);
+		            workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
+		
+		            _jobMgr.submitAsyncJob(workJob, VmWorkJobDispatcher.VM_WORK_QUEUE, vm.getId());
+		        }
+	            context.putContextParameter("workJob", workJob);
+	            context.putContextParameter("jobId", new Long(workJob.getId()));
+	    	}
+    	});
+    	
+    	final long jobId = (Long)context.getContextParameter("jobId");
+    	AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(jobId);
+    	
         return new VmJobSyncOutcome((VmWorkJobVO)context.getContextParameter("workJob"), vm.getId());
     }
+   
+    @Override
+    public Pair<JobInfo.Status, String> handleVmWorkJob(AsyncJob job, VmWork work) throws Exception {
 
+        VMInstanceVO vm = _entityMgr.findById(VMInstanceVO.class, work.getVmId());
+        if (vm == null) {
+            s_logger.info("Unable to find vm " + work.getVmId());
+        }
+        assert (vm != null);
+        if (work instanceof VmWorkStart) {
+            VmWorkStart workStart = (VmWorkStart)work;
+            orchestrateStart(vm.getUuid(), workStart.getParams(), workStart.getPlan());
+            return new Pair<JobInfo.Status, String>(JobInfo.Status.SUCCEEDED, null);
+        } else if (work instanceof VmWorkStop) {
+            VmWorkStop workStop = (VmWorkStop)work;
+            orchestrateStop(vm.getUuid(), workStop.isCleanup());
+            return new Pair<JobInfo.Status, String>(JobInfo.Status.SUCCEEDED, null);
+        } else if (work instanceof VmWorkMigrate) {
+            VmWorkMigrate workMigrate = (VmWorkMigrate)work;
+            orchestrateMigrate(vm.getUuid(), workMigrate.getSrcHostId(), workMigrate.getDeployDestination());
+            return new Pair<JobInfo.Status, String>(JobInfo.Status.SUCCEEDED, null);
+        } else if (work instanceof VmWorkMigrateWithStorage) {
+            VmWorkMigrateWithStorage workMigrateWithStorage = (VmWorkMigrateWithStorage)work;
+            orchestrateMigrateWithStorage(vm.getUuid(),
+                    workMigrateWithStorage.getSrcHostId(),
+                    workMigrateWithStorage.getDestHostId(),
+                    workMigrateWithStorage.getVolumeToPool());
+            return new Pair<JobInfo.Status, String>(JobInfo.Status.SUCCEEDED, null);
+        } else if (work instanceof VmWorkMigrateForScale) {
+            VmWorkMigrateForScale workMigrateForScale = (VmWorkMigrateForScale)work;
+            orchestrateMigrateForScale(vm.getUuid(),
+                    workMigrateForScale.getSrcHostId(),
+                    workMigrateForScale.getDeployDestination(),
+                    workMigrateForScale.getNewServiceOfferringId());
+            return new Pair<JobInfo.Status, String>(JobInfo.Status.SUCCEEDED, null);
+        } else if (work instanceof VmWorkReboot) {
+            VmWorkReboot workReboot = (VmWorkReboot)work;
+            orchestrateReboot(vm.getUuid(), workReboot.getParams());
+            return new Pair<JobInfo.Status, String>(JobInfo.Status.SUCCEEDED, null);
+        } else if (work instanceof VmWorkAddVmToNetwork) {
+            VmWorkAddVmToNetwork workAddVmToNetwork = (VmWorkAddVmToNetwork)work;
+            NicProfile nic = orchestrateAddVmToNetwork(vm, workAddVmToNetwork.getNetwork(),
+                    workAddVmToNetwork.getRequestedNicProfile());
+            return new Pair<JobInfo.Status, String>(JobInfo.Status.SUCCEEDED, JobSerializerHelper.toObjectSerializedString(nic));
+        } else if (work instanceof VmWorkRemoveNicFromVm) {
+            VmWorkRemoveNicFromVm workRemoveNicFromVm = (VmWorkRemoveNicFromVm)work;
+            boolean result = orchestrateRemoveNicFromVm(vm, workRemoveNicFromVm.getNic());
+            return new Pair<JobInfo.Status, String>(JobInfo.Status.SUCCEEDED,
+                    JobSerializerHelper.toObjectSerializedString(new Boolean(result)));
+        } else if (work instanceof VmWorkRemoveVmFromNetwork) {
+            VmWorkRemoveVmFromNetwork workRemoveVmFromNetwork = (VmWorkRemoveVmFromNetwork)work;
+            boolean result = orchestrateRemoveVmFromNetwork(vm,
+                    workRemoveVmFromNetwork.getNetwork(), workRemoveVmFromNetwork.getBroadcastUri());
+            return new Pair<JobInfo.Status, String>(JobInfo.Status.SUCCEEDED,
+                    JobSerializerHelper.toObjectSerializedString(new Boolean(result)));
+        } else if (work instanceof VmWorkReconfigure) {
+            VmWorkReconfigure workReconfigure = (VmWorkReconfigure)work;
+            reConfigureVm(vm.getUuid(), workReconfigure.getNewServiceOffering(),
+                    workReconfigure.isSameHost());
+            return new Pair<JobInfo.Status, String>(JobInfo.Status.SUCCEEDED, null);
+        } else if (work instanceof VmWorkStorageMigration) {
+            VmWorkStorageMigration workStorageMigration = (VmWorkStorageMigration)work;
+            orchestrateStorageMigration(vm.getUuid(), workStorageMigration.getDestStoragePool());
+            return new Pair<JobInfo.Status, String>(JobInfo.Status.SUCCEEDED, null);
+        } else {
+            RuntimeException e = new RuntimeException("Unsupported VM work command: " + job.getCmd());
+            String exceptionJson = JobSerializerHelper.toSerializedString(e);
+            s_logger.error("Serialize exception object into json: " + exceptionJson);
+            return new Pair<JobInfo.Status, String>(JobInfo.Status.FAILED, exceptionJson);
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/9d3827e6/engine/orchestration/src/com/cloud/vm/VmWorkAddVmToNetwork.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/src/com/cloud/vm/VmWorkAddVmToNetwork.java b/engine/orchestration/src/com/cloud/vm/VmWorkAddVmToNetwork.java
index 97396f1..2a577f3 100644
--- a/engine/orchestration/src/com/cloud/vm/VmWorkAddVmToNetwork.java
+++ b/engine/orchestration/src/com/cloud/vm/VmWorkAddVmToNetwork.java
@@ -21,22 +21,22 @@ import com.cloud.network.Network;
 public class VmWorkAddVmToNetwork extends VmWork {
     private static final long serialVersionUID = 8861516006586736813L;
 
-    Network network;
-    NicProfile requstedNicProfile;
-
-    public VmWorkAddVmToNetwork(long userId, long accountId, long vmId,
-            Network network, NicProfile requested) {
-        super(userId, accountId, vmId);
-
-        this.network = network;
-        this.requstedNicProfile = requested;
-    }
-
-    public Network getNetwork() {
-        return this.network;
-    }
-
-    public NicProfile getRequestedNicProfile() {
-        return this.requstedNicProfile;
-    }
+	Network network;
+	NicProfile requstedNicProfile;
+	
+    public VmWorkAddVmToNetwork(long userId, long accountId, long vmId, String handlerName,
+		Network network, NicProfile requested) {
+        super(userId, accountId, vmId, handlerName);
+	
+		this.network = network;
+		requstedNicProfile = requested;
+	}
+	
+	public Network getNetwork() {
+		return network;
+	}
+	
+	public NicProfile getRequestedNicProfile() {
+		return requstedNicProfile;
+	}
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/9d3827e6/engine/orchestration/src/com/cloud/vm/VmWorkJobDispatcher.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/src/com/cloud/vm/VmWorkJobDispatcher.java b/engine/orchestration/src/com/cloud/vm/VmWorkJobDispatcher.java
index 7534363..e29a99c 100644
--- a/engine/orchestration/src/com/cloud/vm/VmWorkJobDispatcher.java
+++ b/engine/orchestration/src/com/cloud/vm/VmWorkJobDispatcher.java
@@ -16,9 +16,12 @@
 // under the License.
 package com.cloud.vm;
 
+import java.util.Map;
+
 import javax.inject.Inject;
 
 import org.apache.log4j.Logger;
+
 import org.apache.cloudstack.context.CallContext;
 import org.apache.cloudstack.framework.jobs.AsyncJob;
 import org.apache.cloudstack.framework.jobs.AsyncJobDispatcher;
@@ -26,6 +29,7 @@ import org.apache.cloudstack.framework.jobs.AsyncJobManager;
 import org.apache.cloudstack.framework.jobs.impl.JobSerializerHelper;
 import org.apache.cloudstack.jobs.JobInfo;
 
+import com.cloud.utils.Pair;
 import com.cloud.utils.component.AdapterBase;
 import com.cloud.vm.dao.VMInstanceDao;
 
@@ -35,15 +39,25 @@ public class VmWorkJobDispatcher extends AdapterBase implements AsyncJobDispatch
     public static final String VM_WORK_QUEUE = "VmWorkJobQueue";
     public static final String VM_WORK_JOB_DISPATCHER = "VmWorkJobDispatcher";
     public static final String VM_WORK_JOB_WAKEUP_DISPATCHER = "VmWorkJobWakeupDispatcher";
+    
+    @Inject private VirtualMachineManagerImpl _vmMgr;
+	@Inject private AsyncJobManager _asyncJobMgr;
+    @Inject private VMInstanceDao _instanceDao;
+    
+    private Map<String, VmWorkJobHandler> _handlers;
+
+    public VmWorkJobDispatcher() {
+    }
 
-    @Inject
-    private VirtualMachineManagerImpl _vmMgr;
-    @Inject
-    private AsyncJobManager _asyncJobMgr;
-    @Inject
-    private VMInstanceDao _instanceDao;
+    public Map<String, VmWorkJobHandler> getHandlers() {
+        return _handlers;
+    }
+
+    public void setHandlers(Map<String, VmWorkJobHandler> handlers) {
+        _handlers = handlers;
+    }
 
-    @Override
+	@Override
     public void runJob(AsyncJob job) {
         VmWork work = null;
         try {
@@ -69,80 +83,26 @@ public class VmWorkJobDispatcher extends AdapterBase implements AsyncJobDispatch
                 _asyncJobMgr.completeAsyncJob(job.getId(), JobInfo.Status.FAILED, 0, "Unable to deserialize VM work");
                 return;
             }
-
-            CallContext.register(work.getUserId(), work.getAccountId(), job.getRelated());
-
-            VMInstanceVO vm = _instanceDao.findById(work.getVmId());
-            if (vm == null) {
-                s_logger.info("Unable to find vm " + work.getVmId());
+            
+            if (_handlers == null || _handlers.isEmpty()) {
+                s_logger.error("Invalid startup configuration, no work job handler is found. cmd: " + job.getCmd() + ", job info: " + job.getCmdInfo());
+                _asyncJobMgr.completeAsyncJob(job.getId(), JobInfo.Status.FAILED, 0, "Invalid startup configuration. no job handler is found");
+                return;
             }
-            assert (vm != null);
-            if (work instanceof VmWorkStart) {
-                VmWorkStart workStart = (VmWorkStart)work;
-                _vmMgr.orchestrateStart(vm.getUuid(), workStart.getParams(), workStart.getPlan());
-                _asyncJobMgr.completeAsyncJob(job.getId(), JobInfo.Status.SUCCEEDED, 0, null);
-            } else if (work instanceof VmWorkStop) {
-                VmWorkStop workStop = (VmWorkStop)work;
-                _vmMgr.orchestrateStop(vm.getUuid(), workStop.isCleanup());
-                _asyncJobMgr.completeAsyncJob(job.getId(), JobInfo.Status.SUCCEEDED, 0, null);
-            } else if (work instanceof VmWorkMigrate) {
-                VmWorkMigrate workMigrate = (VmWorkMigrate)work;
-                _vmMgr.orchestrateMigrate(vm.getUuid(), workMigrate.getSrcHostId(), workMigrate.getDeployDestination());
-                _asyncJobMgr.completeAsyncJob(job.getId(), JobInfo.Status.SUCCEEDED, 0, null);
-            } else if (work instanceof VmWorkMigrateWithStorage) {
-                VmWorkMigrateWithStorage workMigrateWithStorage = (VmWorkMigrateWithStorage)work;
-                _vmMgr.orchestrateMigrateWithStorage(vm.getUuid(),
-                    workMigrateWithStorage.getSrcHostId(),
-                    workMigrateWithStorage.getDestHostId(),
-                    workMigrateWithStorage.getVolumeToPool());
-                _asyncJobMgr.completeAsyncJob(job.getId(), JobInfo.Status.SUCCEEDED, 0, null);
-            } else if (work instanceof VmWorkMigrateForScale) {
-                VmWorkMigrateForScale workMigrateForScale = (VmWorkMigrateForScale)work;
-                _vmMgr.orchestrateMigrateForScale(vm.getUuid(),
-                    workMigrateForScale.getSrcHostId(),
-                    workMigrateForScale.getDeployDestination(),
-                    workMigrateForScale.getNewServiceOfferringId());
-                _asyncJobMgr.completeAsyncJob(job.getId(), JobInfo.Status.SUCCEEDED, 0, null);
-            } else if (work instanceof VmWorkReboot) {
-                VmWorkReboot workReboot = (VmWorkReboot)work;
-                _vmMgr.orchestrateReboot(vm.getUuid(), workReboot.getParams());
-                _asyncJobMgr.completeAsyncJob(job.getId(), JobInfo.Status.SUCCEEDED, 0, null);
-            } else if (work instanceof VmWorkAddVmToNetwork) {
-                VmWorkAddVmToNetwork workAddVmToNetwork = (VmWorkAddVmToNetwork)work;
-                NicProfile nic = _vmMgr.orchestrateAddVmToNetwork(vm, workAddVmToNetwork.getNetwork(),
-                    workAddVmToNetwork.getRequestedNicProfile());
-                _asyncJobMgr.completeAsyncJob(job.getId(), JobInfo.Status.SUCCEEDED, 0,
-                    JobSerializerHelper.toObjectSerializedString(nic));
-            } else if (work instanceof VmWorkRemoveNicFromVm) {
-                VmWorkRemoveNicFromVm workRemoveNicFromVm = (VmWorkRemoveNicFromVm)work;
-                boolean result = _vmMgr.orchestrateRemoveNicFromVm(vm, workRemoveNicFromVm.getNic());
-                _asyncJobMgr.completeAsyncJob(job.getId(), JobInfo.Status.SUCCEEDED, 0,
-                    JobSerializerHelper.toObjectSerializedString(new Boolean(result)));
-            } else if (work instanceof VmWorkRemoveVmFromNetwork) {
-                VmWorkRemoveVmFromNetwork workRemoveVmFromNetwork = (VmWorkRemoveVmFromNetwork)work;
-                boolean result = _vmMgr.orchestrateRemoveVmFromNetwork(vm,
-                    workRemoveVmFromNetwork.getNetwork(), workRemoveVmFromNetwork.getBroadcastUri());
-                _asyncJobMgr.completeAsyncJob(job.getId(), JobInfo.Status.SUCCEEDED, 0,
-                    JobSerializerHelper.toObjectSerializedString(new Boolean(result)));
-            } else if (work instanceof VmWorkReconfigure) {
-                VmWorkReconfigure workReconfigure = (VmWorkReconfigure)work;
-                _vmMgr.reConfigureVm(vm.getUuid(), workReconfigure.getNewServiceOffering(),
-                    workReconfigure.isSameHost());
-                _asyncJobMgr.completeAsyncJob(job.getId(), JobInfo.Status.SUCCEEDED, 0, null);
-            } else if (work instanceof VmWorkStorageMigration) {
-                VmWorkStorageMigration workStorageMigration = (VmWorkStorageMigration)work;
-                _vmMgr.orchestrateStorageMigration(vm.getUuid(), workStorageMigration.getDestStoragePool());
-                _asyncJobMgr.completeAsyncJob(job.getId(), JobInfo.Status.SUCCEEDED, 0, null);
-            } else {
-                assert (false);
-                s_logger.error("Unhandled VM work command: " + job.getCmd());
-
-                RuntimeException e = new RuntimeException("Unsupported VM work command: " + job.getCmd());
-                String exceptionJson = JobSerializerHelper.toSerializedString(e);
-                s_logger.error("Serialize exception object into json: " + exceptionJson);
-                _asyncJobMgr.completeAsyncJob(job.getId(), JobInfo.Status.FAILED, 0, exceptionJson);
+
+            VmWorkJobHandler handler = _handlers.get(work.getHandlerName());
+            
+            if (handler == null) {
+                s_logger.error("Unable to find work job handler. handler name: " + work.getHandlerName() + ", job cmd: " + job.getCmd() + ", job info: " + job.getCmdInfo());
+                _asyncJobMgr.completeAsyncJob(job.getId(), JobInfo.Status.FAILED, 0, "Unable to find work job handler");
+                return;
             }
-        } catch (Throwable e) {
+
+            CallContext.register(work.getUserId(), work.getAccountId(), job.getRelated());
+            
+            Pair<JobInfo.Status, String> result = handler.handleVmWorkJob(job, work);
+            _asyncJobMgr.completeAsyncJob(job.getId(), result.first(), 0, result.second());
+        } catch(Throwable e) {
             s_logger.error("Unable to complete " + job, e);
 
             String exceptionJson = JobSerializerHelper.toSerializedString(e);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/9d3827e6/engine/orchestration/src/com/cloud/vm/VmWorkJobHandler.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/src/com/cloud/vm/VmWorkJobHandler.java b/engine/orchestration/src/com/cloud/vm/VmWorkJobHandler.java
new file mode 100644
index 0000000..6ab1bbc
--- /dev/null
+++ b/engine/orchestration/src/com/cloud/vm/VmWorkJobHandler.java
@@ -0,0 +1,26 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+package com.cloud.vm;
+
+import org.apache.cloudstack.framework.jobs.AsyncJob;
+import org.apache.cloudstack.jobs.JobInfo;
+
+import com.cloud.utils.Pair;
+
+public interface VmWorkJobHandler {
+    Pair<JobInfo.Status, String> handleVmWorkJob(AsyncJob job, VmWork work) throws Exception;
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/9d3827e6/engine/orchestration/src/com/cloud/vm/VmWorkMigrate.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/src/com/cloud/vm/VmWorkMigrate.java b/engine/orchestration/src/com/cloud/vm/VmWorkMigrate.java
index 107f5fe..5bcea9a 100644
--- a/engine/orchestration/src/com/cloud/vm/VmWorkMigrate.java
+++ b/engine/orchestration/src/com/cloud/vm/VmWorkMigrate.java
@@ -38,8 +38,9 @@ public class VmWorkMigrate extends VmWork {
     private Map<String, String> storage;
     long srcHostId;
 
-    public VmWorkMigrate(long userId, long accountId, long vmId, long srcHostId, DeployDestination dst) {
-        super(userId, accountId, vmId);
+    public VmWorkMigrate(long userId, long accountId, long vmId, String handlerName,
+            long srcHostId, DeployDestination dst) {
+        super(userId, accountId, vmId, handlerName);
         this.srcHostId = srcHostId;
         zoneId = dst.getDataCenter() != null ? dst.getDataCenter().getId() : null;
         podId = dst.getPod() != null ? dst.getPod().getId() : null;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/9d3827e6/engine/orchestration/src/com/cloud/vm/VmWorkMigrateForScale.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/src/com/cloud/vm/VmWorkMigrateForScale.java b/engine/orchestration/src/com/cloud/vm/VmWorkMigrateForScale.java
index 399ea91..e0ad90e 100644
--- a/engine/orchestration/src/com/cloud/vm/VmWorkMigrateForScale.java
+++ b/engine/orchestration/src/com/cloud/vm/VmWorkMigrateForScale.java
@@ -19,19 +19,19 @@ package com.cloud.vm;
 import com.cloud.deploy.DeployDestination;
 
 public class VmWorkMigrateForScale extends VmWork {
-    private static final long serialVersionUID = 6854870395568389613L;
-
-    long srcHostId;
-    DeployDestination deployDestination;
-    Long newSvcOfferingId;
-
-    public VmWorkMigrateForScale(long userId, long accountId, long vmId, long srcHostId,
-            DeployDestination dest, Long newSvcOfferingId) {
-
-        super(userId, accountId, vmId);
-        this.srcHostId = srcHostId;
-        this.deployDestination = dest;
-        this.newSvcOfferingId = newSvcOfferingId;
+	private static final long serialVersionUID = 6854870395568389613L;
+
+	long srcHostId;
+	DeployDestination deployDestination;
+	Long newSvcOfferingId;
+	
+    public VmWorkMigrateForScale(long userId, long accountId, long vmId, String handlerName, long srcHostId,
+    	DeployDestination dest, Long newSvcOfferingId) {
+    	
+        super(userId, accountId, vmId, handlerName);
+    	this.srcHostId = srcHostId;
+    	deployDestination = dest;
+    	this.newSvcOfferingId = newSvcOfferingId;
     }
 
     public long getSrcHostId() {
@@ -39,10 +39,10 @@ public class VmWorkMigrateForScale extends VmWork {
     }
 
     public DeployDestination getDeployDestination() {
-        return this.deployDestination;
+    	return deployDestination;
     }
 
     public Long getNewServiceOfferringId() {
-        return this.newSvcOfferingId;
+    	return newSvcOfferingId;
     }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/9d3827e6/engine/orchestration/src/com/cloud/vm/VmWorkMigrateWithStorage.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/src/com/cloud/vm/VmWorkMigrateWithStorage.java b/engine/orchestration/src/com/cloud/vm/VmWorkMigrateWithStorage.java
index 75024db..3849556 100644
--- a/engine/orchestration/src/com/cloud/vm/VmWorkMigrateWithStorage.java
+++ b/engine/orchestration/src/com/cloud/vm/VmWorkMigrateWithStorage.java
@@ -22,31 +22,31 @@ import com.cloud.storage.StoragePool;
 import com.cloud.storage.Volume;
 
 public class VmWorkMigrateWithStorage extends VmWork {
-    private static final long serialVersionUID = -5626053872453569165L;
-
-    long srcHostId;
-    long destHostId;
-    Map<Volume, StoragePool> volumeToPool;
-
-    public VmWorkMigrateWithStorage(long userId, long accountId, long vmId, long srcHostId,
-            long destHostId, Map<Volume, StoragePool> volumeToPool) {
-
-        super(userId, accountId, vmId);
-
-        this.srcHostId = srcHostId;
-        this.destHostId = destHostId;
-        this.volumeToPool = volumeToPool;
+	private static final long serialVersionUID = -5626053872453569165L;
+
+	long srcHostId;
+	long destHostId;
+	Map<Volume, StoragePool> volumeToPool;
+	
+    public VmWorkMigrateWithStorage(long userId, long accountId, long vmId, String handlerName, long srcHostId,
+    	long destHostId, Map<Volume, StoragePool> volumeToPool) {
+    	
+        super(userId, accountId, vmId, handlerName);
+    
+    	this.srcHostId = srcHostId;
+    	this.destHostId = destHostId;
+    	this.volumeToPool = volumeToPool;
     }
 
     public long getSrcHostId() {
-        return this.srcHostId;
+    	return srcHostId;
     }
 
     public long getDestHostId() {
-        return this.destHostId;
+    	return destHostId;
     }
 
     public Map<Volume, StoragePool> getVolumeToPool() {
-        return this.volumeToPool;
+    	return volumeToPool;
     }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/9d3827e6/engine/orchestration/src/com/cloud/vm/VmWorkReboot.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/src/com/cloud/vm/VmWorkReboot.java b/engine/orchestration/src/com/cloud/vm/VmWorkReboot.java
index fecaaef..edecae8 100644
--- a/engine/orchestration/src/com/cloud/vm/VmWorkReboot.java
+++ b/engine/orchestration/src/com/cloud/vm/VmWorkReboot.java
@@ -28,18 +28,10 @@ public class VmWorkReboot extends VmWork {
     // use serialization friendly map
     private Map<String, String> rawParams;
 
-    public VmWorkReboot(long userId, long accountId, long vmId, Map<VirtualMachineProfile.Param, Object> params) {
-        super(userId, accountId, vmId);
-
-        setParams(params);
-    }
-
-    public Map<String, String> getRawParams() {
-        return rawParams;
-    }
-
-    public void setRawParams(Map<String, String> params) {
-        rawParams = params;
+    public VmWorkReboot(long userId, long accountId, long vmId, String handlerName, Map<VirtualMachineProfile.Param, Object> params) {
+        super(userId, accountId, vmId, handlerName);
+    	
+    	setParams(params);
     }
 
     public Map<VirtualMachineProfile.Param, Object> getParams() {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/9d3827e6/engine/orchestration/src/com/cloud/vm/VmWorkReconfigure.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/src/com/cloud/vm/VmWorkReconfigure.java b/engine/orchestration/src/com/cloud/vm/VmWorkReconfigure.java
index 6e2b6d8..c7fd310 100644
--- a/engine/orchestration/src/com/cloud/vm/VmWorkReconfigure.java
+++ b/engine/orchestration/src/com/cloud/vm/VmWorkReconfigure.java
@@ -19,25 +19,25 @@ package com.cloud.vm;
 import com.cloud.offering.ServiceOffering;
 
 public class VmWorkReconfigure extends VmWork {
-    private static final long serialVersionUID = -4517030323758086615L;
-
-    ServiceOffering newServiceOffering;
-    boolean sameHost;
-
-    public VmWorkReconfigure(long userId, long accountId, long vmId,
-            ServiceOffering newServiceOffering, boolean sameHost) {
-
-        super(userId, accountId, vmId);
-
-        this.newServiceOffering = newServiceOffering;
-        this.sameHost = sameHost;
+	private static final long serialVersionUID = -4517030323758086615L;
+	
+	ServiceOffering newServiceOffering;
+	boolean sameHost;
+	
+    public VmWorkReconfigure(long userId, long accountId, long vmId, String handlerName,
+    	ServiceOffering newServiceOffering, boolean sameHost) {
+    	
+        super(userId, accountId, vmId, handlerName);
+    	
+    	this.newServiceOffering = newServiceOffering;
+    	this.sameHost = sameHost;
     }
 
     public ServiceOffering getNewServiceOffering() {
-        return this.newServiceOffering;
+    	return newServiceOffering;
     }
 
     public boolean isSameHost() {
-        return this.sameHost;
+    	return sameHost;
     }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/9d3827e6/engine/orchestration/src/com/cloud/vm/VmWorkRemoveNicFromVm.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/src/com/cloud/vm/VmWorkRemoveNicFromVm.java b/engine/orchestration/src/com/cloud/vm/VmWorkRemoveNicFromVm.java
index 8efe77b..4d400b9 100644
--- a/engine/orchestration/src/com/cloud/vm/VmWorkRemoveNicFromVm.java
+++ b/engine/orchestration/src/com/cloud/vm/VmWorkRemoveNicFromVm.java
@@ -19,15 +19,15 @@ package com.cloud.vm;
 public class VmWorkRemoveNicFromVm extends VmWork {
     private static final long serialVersionUID = -4265657031064437923L;
 
-    Nic nic;
-
-    public VmWorkRemoveNicFromVm(long userId, long accountId, long vmId, Nic nic) {
-        super(userId, accountId, vmId);
-
-        this.nic = nic;
+	Nic nic;
+    
+    public VmWorkRemoveNicFromVm(long userId, long accountId, long vmId, String handlerName, Nic nic) {
+        super(userId, accountId, vmId, handlerName);
+    	
+    	this.nic = nic;
     }
 
     public Nic getNic() {
-        return this.nic;
+    	return nic;
     }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/9d3827e6/engine/orchestration/src/com/cloud/vm/VmWorkRemoveVmFromNetwork.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/src/com/cloud/vm/VmWorkRemoveVmFromNetwork.java b/engine/orchestration/src/com/cloud/vm/VmWorkRemoveVmFromNetwork.java
index 0e94c2f..0cb02b2 100644
--- a/engine/orchestration/src/com/cloud/vm/VmWorkRemoveVmFromNetwork.java
+++ b/engine/orchestration/src/com/cloud/vm/VmWorkRemoveVmFromNetwork.java
@@ -21,23 +21,23 @@ import java.net.URI;
 import com.cloud.network.Network;
 
 public class VmWorkRemoveVmFromNetwork extends VmWork {
-    private static final long serialVersionUID = -5070392905642149925L;
-
-    Network network;
-    URI broadcastUri;
-
-    public VmWorkRemoveVmFromNetwork(long userId, long accountId, long vmId, Network network, URI broadcastUri) {
-        super(userId, accountId, vmId);
-
-        this.network = network;
-        this.broadcastUri = broadcastUri;
-    }
-
-    public Network getNetwork() {
-        return this.network;
-    }
-
-    public URI getBroadcastUri() {
-        return this.broadcastUri;
-    }
+	private static final long serialVersionUID = -5070392905642149925L;
+
+	Network network;
+	URI broadcastUri;
+	
+    public VmWorkRemoveVmFromNetwork(long userId, long accountId, long vmId, String handlerName, Network network, URI broadcastUri) {
+        super(userId, accountId, vmId, handlerName);
+    	
+    	this.network = network;
+    	this.broadcastUri = broadcastUri;
+	}
+	
+	public Network getNetwork() {
+		return network;
+	}
+	
+	public URI getBroadcastUri() {
+		return broadcastUri;
+	}
 }