You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by ah...@apache.org on 2013/06/08 05:26:39 UTC

[2/3] git commit: updated refs/heads/vmsync to ebbd400

Fixed the start


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

Branch: refs/heads/vmsync
Commit: 5e6d2cf559d988a59997f9341fee8ef39f0a08b5
Parents: 90df846
Author: Alex Huang <al...@gmail.com>
Authored: Fri Jun 7 07:53:36 2013 -0700
Committer: Alex Huang <al...@gmail.com>
Committed: Fri Jun 7 10:11:57 2013 -0700

----------------------------------------------------------------------
 api/src/com/cloud/deploy/DataCenterDeployment.java |   54 +++-
 api/src/com/cloud/deploy/DeploymentPlan.java       |   25 +-
 api/src/com/cloud/deploy/DeploymentPlanner.java    |   25 ++
 .../framework/jobs/impl/AsyncJobMonitor.java       |    3 +-
 .../hypervisor/vmware/VmwareServerDiscoverer.java  |    4 +-
 .../vmware/manager/VmwareManagerImpl.java          |    2 +-
 .../vmware/manager/VmwareStorageManagerImpl.java   |    2 +-
 .../hypervisor/vmware/resource/VmwareResource.java |   10 +-
 .../cloud/network/resource/F5BigIpResource.java    |    4 +-
 pom.xml                                            |    2 +-
 .../com/cloud/async/AsyncJobExecutionContext.java  |   10 +-
 .../com/cloud/vm/VirtualMachineManagerImpl.java    |  258 +++++++--------
 server/src/com/cloud/vm/VmWorkJobDispatcher.java   |    2 +-
 .../cloud/async/MockVirtualMachineManagerImpl.java |   15 -
 .../com/cloud/utils/db/GenericSearchBuilder.java   |   90 +++++-
 utils/src/com/cloud/utils/db/SearchCriteria.java   |    6 +
 .../src/com/cloud/hypervisor/vmware/mo/BaseMO.java |    2 +-
 .../com/cloud/hypervisor/vmware/mo/ClusterMO.java  |   40 ++--
 .../cloud/hypervisor/vmware/mo/DatacenterMO.java   |    6 +-
 .../vmware/mo/HostDatastoreBrowserMO.java          |    6 +-
 .../vmware/mo/HostDatastoreSystemMO.java           |    2 +-
 .../src/com/cloud/hypervisor/vmware/mo/HostMO.java |   28 +-
 .../hypervisor/vmware/mo/HypervisorHostHelper.java |    8 +-
 .../hypervisor/vmware/mo/VirtualMachineMO.java     |   26 +-
 .../cloud/hypervisor/vmware/util/VmwareHelper.java |    2 +-
 25 files changed, 388 insertions(+), 244 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5e6d2cf5/api/src/com/cloud/deploy/DataCenterDeployment.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/deploy/DataCenterDeployment.java b/api/src/com/cloud/deploy/DataCenterDeployment.java
index 92bb9b9..d709ce7 100644
--- a/api/src/com/cloud/deploy/DataCenterDeployment.java
+++ b/api/src/com/cloud/deploy/DataCenterDeployment.java
@@ -27,11 +27,15 @@ public class DataCenterDeployment implements DeploymentPlan {
     Long _hostId;
     Long _physicalNetworkId;
     ExcludeList _avoids = null;
-    boolean _recreateDisks;
     ReservationContext _context;
 
-    public DataCenterDeployment() {
-    	_dcId = 0;
+    @SuppressWarnings("unused")
+    private DataCenterDeployment() {  // Hide this constructor
+    }
+    
+    public DataCenterDeployment(DeploymentPlan that) {
+        this(that.getDataCenterId(), that.getPodId(), that.getClusterId(), that.getHostId(), that.getPoolId(), that.getPhysicalNetworkId(), that.getReservationContext());
+        _avoids = new ExcludeList(that.getAvoids());
     }
     
     public DataCenterDeployment(long dataCenterId) {
@@ -77,6 +81,22 @@ public class DataCenterDeployment implements DeploymentPlan {
         return _poolId;
     }
 
+    public void setPoolId(Long poolId) {
+        _poolId = poolId;
+    }
+
+    public void setClusterId(Long clusterId) {
+        _clusterId = clusterId;
+    }
+
+    public void setHostId(Long hostId) {
+        _hostId = hostId;
+    }
+
+    public void setPodId(Long podId) {
+        _podId = podId;
+    }
+
     @Override
     public ExcludeList getAvoids() {
         return _avoids;
@@ -97,4 +117,32 @@ public class DataCenterDeployment implements DeploymentPlan {
         return _context;
     }
 
+    @Override
+    public String toString() {
+        StringBuilder str = new StringBuilder("DeploymentPlan[");
+        if (_hostId != null) {
+            str.append("Host=").append(_hostId);
+        } else if (_clusterId != null) {
+            str.append("Cluster=").append(_clusterId);
+        } else if (_podId != null) {
+            str.append("Pod=").append(_podId);
+        } else {
+            str.append("Zone=").append(_dcId);
+        }
+
+        if (_poolId != null) {
+            str.append(", Storage=").append(_poolId);
+        }
+
+        if (_physicalNetworkId != null) {
+            str.append(", Physical Network = ").append(_physicalNetworkId);
+        }
+
+        if (_avoids != null) {
+            str.append(_avoids.toString());
+        }
+
+        return str.append("]").toString();
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5e6d2cf5/api/src/com/cloud/deploy/DeploymentPlan.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/deploy/DeploymentPlan.java b/api/src/com/cloud/deploy/DeploymentPlan.java
index 456d5b8..4f619a8 100644
--- a/api/src/com/cloud/deploy/DeploymentPlan.java
+++ b/api/src/com/cloud/deploy/DeploymentPlan.java
@@ -20,47 +20,44 @@ import com.cloud.deploy.DeploymentPlanner.ExcludeList;
 import com.cloud.vm.ReservationContext;
 
 /**
+ * DeploymentPlan gives explicit direction on where to deploy a virtual machine.
+ * 
  */
 public interface DeploymentPlan {
-    // TODO: This interface is not fully developed. It really
-    // number of parameters to be specified.
-
     /**
      * @return data center the VM should deploy in.
      */
-    public long getDataCenterId();
+    long getDataCenterId();
 
     /**
      * @return pod the Vm should deploy in; null if no preference.
      */
-    public Long getPodId();
+    Long getPodId();
 
     /**
      * @return cluster the VM should deploy in; null if no preference.
      */
-    public Long getClusterId();
+    Long getClusterId();
 
     /**
      * @return host the VM should deploy in; null if no preference.
      */
-    public Long getHostId();
+    Long getHostId();
 
     /**
      * @return pool the VM should be created in; null if no preference.
      */
-    public Long getPoolId();
+    Long getPoolId();
 
     /**
-     * @param avoids
-     *            Set the ExcludeList to avoid for deployment
+     * @param avoids Set the ExcludeList to avoid for deployment
      */
-    public void setAvoids(ExcludeList avoids);
+    void setAvoids(ExcludeList avoids);
 
     /**
-     * @return
-     *         the ExcludeList to avoid for deployment
+     * @return the ExcludeList to avoid for deployment
      */
-    public ExcludeList getAvoids();
+    ExcludeList getAvoids();
 
     Long getPhysicalNetworkId();
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5e6d2cf5/api/src/com/cloud/deploy/DeploymentPlanner.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/deploy/DeploymentPlanner.java b/api/src/com/cloud/deploy/DeploymentPlanner.java
index 741a804..39edc1b 100644
--- a/api/src/com/cloud/deploy/DeploymentPlanner.java
+++ b/api/src/com/cloud/deploy/DeploymentPlanner.java
@@ -103,6 +103,10 @@ public interface DeploymentPlanner extends Adapter {
         public ExcludeList() {
         }
 
+        public ExcludeList(ExcludeList that) {
+            this(that.getDataCentersToAvoid(), that.getPodsToAvoid(), that.getClustersToAvoid(), that.getHostsToAvoid(), that.getPoolsToAvoid());
+        }
+
         public ExcludeList(Set<Long> _dcIds, Set<Long> _podIds, Set<Long> _clusterIds, Set<Long> _hostIds, Set<Long> _poolIds) {
             if (_dcIds != null) {
                 this._dcIds = new HashSet<Long>(_dcIds);
@@ -312,5 +316,26 @@ public interface DeploymentPlanner extends Adapter {
         public Set<Long> getPoolsToAvoid() {
             return _poolIds;
         }
+
+        @Override
+        public String toString() {
+            StringBuilder str = new StringBuilder("Avoiding[");
+            if (_dcIds != null) {
+                str.append("Zones={").append(_dcIds.toString()).append("}");
+            }
+            if (_podIds != null) {
+                str.append("; Pods={").append(_podIds.toString()).append("}");
+            }
+            if (_clusterIds != null) {
+                str.append("; Clusters={").append(_clusterIds.toString()).append("}");
+            }
+            if (_hostIds != null) {
+                str.append("; Hosts={").append(_hostIds.toString()).append("}");
+            }
+            if (_poolIds != null) {
+                str.append("; DataStore={").append(_poolIds.toString()).append("}");
+            }
+            return str.append("]").toString();
+        }
     }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5e6d2cf5/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/AsyncJobMonitor.java
----------------------------------------------------------------------
diff --git a/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/AsyncJobMonitor.java b/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/AsyncJobMonitor.java
index 7a11195..29a4049 100644
--- a/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/AsyncJobMonitor.java
+++ b/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/AsyncJobMonitor.java
@@ -28,7 +28,6 @@ import org.apache.log4j.Logger;
 
 import org.apache.cloudstack.framework.jobs.AsyncJob;
 import org.apache.cloudstack.framework.jobs.AsyncJobConstants;
-import org.apache.cloudstack.framework.jobs.AsyncJob.Topics;
 import org.apache.cloudstack.framework.messagebus.MessageBus;
 import org.apache.cloudstack.framework.messagebus.MessageDispatcher;
 import org.apache.cloudstack.framework.messagebus.MessageHandler;
@@ -114,7 +113,7 @@ public class AsyncJobMonitor extends ManagerBase {
 			
 			long threadId = Thread.currentThread().getId();
 			boolean fromPoolThread = Thread.currentThread().getName().contains(AsyncJobConstants.JOB_POOL_THREAD_PREFIX);
-			ActiveTaskRecord record = new ActiveTaskRecord(threadId, jobId, fromPoolThread);
+            ActiveTaskRecord record = new ActiveTaskRecord(jobId, threadId, fromPoolThread);
 			_activeTasks.put(jobId, record);
 			if(fromPoolThread)
 				_activePoolThreads++;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5e6d2cf5/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/VmwareServerDiscoverer.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/VmwareServerDiscoverer.java b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/VmwareServerDiscoverer.java
index 2f82b53..07e40ba 100755
--- a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/VmwareServerDiscoverer.java
+++ b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/VmwareServerDiscoverer.java
@@ -345,7 +345,7 @@ public class VmwareServerDiscoverer extends DiscovererBase implements
 				details.put("url", hostMo.getHostName());
 				details.put("username", username);
 				details.put("password", password);
-				String guid = morHost.getType() + ":" + morHost.getValue()
+				String guid = morHost.getType() + ":" + morHost.getPresetParams()
 						+ "@" + url.getHost();
 				details.put("guid", guid);
 
@@ -414,7 +414,7 @@ public class VmwareServerDiscoverer extends DiscovererBase implements
 						"ClusterComputeResource"))
 					return false;
 
-				if (!morParent.getValue().equals(morCluster.getValue()))
+				if (!morParent.getPresetParams().equals(morCluster.getPresetParams()))
 					return false;
 			}
 		}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5e6d2cf5/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java
index 1585070..d35ddcd 100755
--- a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java
+++ b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java
@@ -374,7 +374,7 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw
                 returnedHostList.add(mor);
                 return returnedHostList;
             } else {
-                s_logger.error("Unsupport host type " + mor.getType() + ":" + mor.getValue() + " from inventory path: " + hostInventoryPath);
+                s_logger.error("Unsupport host type " + mor.getType() + ":" + mor.getPresetParams() + " from inventory path: " + hostInventoryPath);
                 return null;
             }
         }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5e6d2cf5/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareStorageManagerImpl.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareStorageManagerImpl.java b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareStorageManagerImpl.java
index 52d781c..0ff27e1 100644
--- a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareStorageManagerImpl.java
+++ b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareStorageManagerImpl.java
@@ -245,7 +245,7 @@ public class VmwareStorageManagerImpl implements VmwareStorageManager {
 		try {
 			VmwareHypervisorHost hyperHost = hostService.getHyperHost(context, cmd);
 
-			String templateUuidName = UUID.nameUUIDFromBytes((templateName + "@" + cmd.getPoolUuid() + "-" + hyperHost.getMor().getValue()).getBytes()).toString();
+			String templateUuidName = UUID.nameUUIDFromBytes((templateName + "@" + cmd.getPoolUuid() + "-" + hyperHost.getMor().getPresetParams()).getBytes()).toString();
 			// truncate template name to 32 chars to ensure they work well with vSphere API's.
 			templateUuidName = templateUuidName.replace("-", "");
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5e6d2cf5/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java
index c763640..3ecf49b 100755
--- a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java
+++ b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java
@@ -515,14 +515,14 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
 
             synchronized (this) {
                 try {
-                    JmxUtil.registerMBean("VMware " + _morHyperHost.getValue(), "Command " + cmdSequence + "-" + cmd.getClass().getSimpleName(), mbean);
+                    JmxUtil.registerMBean("VMware " + _morHyperHost.getPresetParams(), "Command " + cmdSequence + "-" + cmd.getClass().getSimpleName(), mbean);
                     _cmdMBeans.add(mbean);
 
                     if (_cmdMBeans.size() >= MAX_CMD_MBEAN) {
                         PropertyMapDynamicBean mbeanToRemove = _cmdMBeans.get(0);
                         _cmdMBeans.remove(0);
 
-                        JmxUtil.unregisterMBean("VMware " + _morHyperHost.getValue(), "Command " + mbeanToRemove.getProp("Sequence") + "-" + mbeanToRemove.getProp("Name"));
+                        JmxUtil.unregisterMBean("VMware " + _morHyperHost.getPresetParams(), "Command " + mbeanToRemove.getProp("Sequence") + "-" + mbeanToRemove.getProp("Name"));
                     }
                 } catch (Exception e) {
                     if(s_logger.isTraceEnabled())
@@ -4583,7 +4583,7 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
 
                     DatastoreSummary dsSummary = dsMo.getSummary();
                     String address = hostMo.getHostName();
-                    StoragePoolInfo pInfo = new StoragePoolInfo(poolUuid, address, dsMo.getMor().getValue(), "", StoragePoolType.LVM, dsSummary.getCapacity(), dsSummary.getFreeSpace());
+                    StoragePoolInfo pInfo = new StoragePoolInfo(poolUuid, address, dsMo.getMor().getPresetParams(), "", StoragePoolType.LVM, dsSummary.getCapacity(), dsSummary.getFreeSpace());
                     StartupStorageCommand cmd = new StartupStorageCommand();
                     cmd.setName(poolUuid);
                     cmd.setPoolInfo(pInfo);
@@ -5088,11 +5088,11 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
                             int endMs = infos.get(infos.size()-1).getTimestamp().getSecond() * 1000 + infos.get(infos.size()-1).getTimestamp().getMillisecond();
                             int beginMs = infos.get(0).getTimestamp().getSecond() * 1000 + infos.get(0).getTimestamp().getMillisecond();
                             sampleDuration = (endMs - beginMs) /1000;
-                            List<PerfMetricSeries> vals = ((PerfEntityMetric)values.get(i)).getValue();
+                            List<PerfMetricSeries> vals = ((PerfEntityMetric)values.get(i)).getPresetParams();
                             for(int vi = 0; ((vals!= null) && (vi < vals.size())); ++vi){
                                 if(vals.get(vi) instanceof PerfMetricIntSeries) {
                                     PerfMetricIntSeries val = (PerfMetricIntSeries)vals.get(vi);
-                                    List<Long> perfValues = val.getValue();
+                                    List<Long> perfValues = val.getPresetParams();
                                     if (vals.get(vi).getId().getCounterId() == rxPerfCounterInfo.getKey()) {
                                         networkReadKBs = sampleDuration * perfValues.get(3); //get the average RX rate multiplied by sampled duration
                                     }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5e6d2cf5/plugins/network-elements/f5/src/com/cloud/network/resource/F5BigIpResource.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/f5/src/com/cloud/network/resource/F5BigIpResource.java b/plugins/network-elements/f5/src/com/cloud/network/resource/F5BigIpResource.java
index 1733712..51e2733 100644
--- a/plugins/network-elements/f5/src/com/cloud/network/resource/F5BigIpResource.java
+++ b/plugins/network-elements/f5/src/com/cloud/network/resource/F5BigIpResource.java
@@ -985,8 +985,8 @@ public class F5BigIpResource implements ServerResource {
 						continue;
 					}
 					
-					long high = stat.getValue().getHigh(); 
-					long low = stat.getValue().getLow(); 
+					long high = stat.getPresetParams().getHigh(); 
+					long low = stat.getPresetParams().getLow(); 
 					long full = getFullUsage(high, low);
 					
 					

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5e6d2cf5/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 67d9576..97265b5 100644
--- a/pom.xml
+++ b/pom.xml
@@ -56,7 +56,7 @@
     <cs.jasypt.version>1.9.0</cs.jasypt.version>
     <cs.trilead.version>build213-svnkit-1.3-patch</cs.trilead.version>
     <cs.ehcache.version>1.5.0</cs.ehcache.version>
-    <cs.gson.version>1.7.1</cs.gson.version>
+    <cs.gson.version>2.2.4</cs.gson.version>
     <cs.guava.version>14.0-rc1</cs.guava.version>
     <cs.xapi.version>5.6.100-1-SNAPSHOT</cs.xapi.version>
     <cs.httpclient.version>3.1</cs.httpclient.version>

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5e6d2cf5/server/src/com/cloud/async/AsyncJobExecutionContext.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/async/AsyncJobExecutionContext.java b/server/src/com/cloud/async/AsyncJobExecutionContext.java
index 82013e0..0e05a98 100644
--- a/server/src/com/cloud/async/AsyncJobExecutionContext.java
+++ b/server/src/com/cloud/async/AsyncJobExecutionContext.java
@@ -18,6 +18,8 @@ package com.cloud.async;
 
 import javax.inject.Inject;
 
+import org.apache.log4j.Logger;
+
 import org.apache.cloudstack.framework.jobs.AsyncJob;
 import org.apache.cloudstack.framework.jobs.AsyncJobConstants;
 import org.apache.cloudstack.framework.jobs.AsyncJobManager;
@@ -81,12 +83,16 @@ public class AsyncJobExecutionContext  {
     	_jobMgr.updateAsyncJobAttachment(_job.getId(), instanceType, instanceId);
     }
 	
-    public void logJobJournal(AsyncJob.JournalType journalType, String
-	    journalText, String journalObjJson) {
+    public void logJobJournal(AsyncJob.JournalType journalType, String journalText, String journalObjJson) {
 		assert(_job != null);
 		_jobMgr.logJobJournal(_job.getId(), journalType, journalText, journalObjJson);
 	}
 
+    public void log(Logger logger, String journalText) {
+        _jobMgr.logJobJournal(_job.getId(), AsyncJob.JournalType.SUCCESS, journalText, null);
+        logger.debug(journalText);
+    }
+
     public void joinJob(long joinJobId) {
     	assert(_job != null);
     	_jobMgr.joinJob(_job.getId(), joinJobId);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5e6d2cf5/server/src/com/cloud/vm/VirtualMachineManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/vm/VirtualMachineManagerImpl.java b/server/src/com/cloud/vm/VirtualMachineManagerImpl.java
index e3db24c..ec9c3dd 100755
--- a/server/src/com/cloud/vm/VirtualMachineManagerImpl.java
+++ b/server/src/com/cloud/vm/VirtualMachineManagerImpl.java
@@ -39,7 +39,6 @@ import org.apache.cloudstack.context.CallContext;
 import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
 import org.apache.cloudstack.engine.subsystem.api.storage.StoragePoolAllocator;
 import org.apache.cloudstack.engine.subsystem.api.storage.VolumeDataFactory;
-import org.apache.cloudstack.framework.jobs.AsyncJob;
 import org.apache.cloudstack.framework.jobs.AsyncJobConstants;
 import org.apache.cloudstack.framework.jobs.AsyncJobManager;
 import org.apache.cloudstack.framework.messagebus.MessageBus;
@@ -85,6 +84,7 @@ import com.cloud.cluster.ClusterManager;
 import com.cloud.configuration.Config;
 import com.cloud.configuration.ConfigurationManager;
 import com.cloud.configuration.dao.ConfigurationDao;
+import com.cloud.dao.EntityManager;
 import com.cloud.dc.ClusterDetailsDao;
 import com.cloud.dc.ClusterDetailsVO;
 import com.cloud.dc.DataCenter;
@@ -167,6 +167,8 @@ import com.cloud.utils.component.ManagerBase;
 import com.cloud.utils.concurrency.NamedThreadFactory;
 import com.cloud.utils.db.DB;
 import com.cloud.utils.db.GlobalLock;
+import com.cloud.utils.db.SearchBuilder;
+import com.cloud.utils.db.SearchCriteria;
 import com.cloud.utils.db.Transaction;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.utils.exception.ExecutionException;
@@ -187,6 +189,9 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
     private static final Logger s_logger = Logger.getLogger(VirtualMachineManagerImpl.class);
 
     @Inject
+    protected EntityManager _entityMgr;
+
+    @Inject
     protected StorageManager _storageMgr;
     @Inject
     DataStoreManager dataStoreMgr;
@@ -328,6 +333,8 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
     protected int _lockStateRetry;
     protected boolean _forceStop;
 
+    SearchBuilder<VolumeVO> RootVolumeSearch;
+
     @Override
     public void registerGuru(VirtualMachine.Type type, VirtualMachineGuru guru) {
         synchronized (_vmGurus) {
@@ -529,6 +536,13 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
         _nodeId = _clusterMgr.getManagementNodeId();
 
         _agentMgr.registerForHostEvents(this, true, true, true);
+        
+        RootVolumeSearch = _entityMgr.createSearchBuilder(VolumeVO.class);
+        VolumeVO rvsEntity = RootVolumeSearch.entity();
+        RootVolumeSearch.and(rvsEntity.getVolumeType(), SearchCriteria.Op.EQ).values(Volume.Type.ROOT)
+                .and(rvsEntity.getInstanceId(), SearchCriteria.Op.EQ, "instance")
+                .and(rvsEntity.getDeviceId(), SearchCriteria.Op.EQ).values(0)
+                .done();
       
         return true;
     }
@@ -808,175 +822,151 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
         return;
     }
 
-    public void processVmStartWork(String vmUuid, Map<VirtualMachineProfile.Param, Object> params, DeploymentPlan planToDeploy)
+    private Pair<DeploymentPlan, DeployDestination> findDestination(VirtualMachineProfileImpl profile, DeploymentPlan planRequested, boolean reuseVolume,
+            ReservationContext reservation, AsyncJobExecutionContext job) throws InsufficientCapacityException, ResourceUnavailableException {
+        VirtualMachine vm = profile.getVirtualMachine();
+
+        DataCenterDeployment plan = null;
+        if (planRequested != null) {
+            plan = new DataCenterDeployment(planRequested);
+        } else {
+            plan = new DataCenterDeployment(vm.getDataCenterId(), vm.getPodIdToDeployIn(), null, null, null, null, reservation);
+        }
+        
+        job.log(s_logger, "Starting " + vm + " with requested " + plan);
+
+        boolean planChangedByVolume = false;
+        List<VolumeVO> vols = _entityMgr.search(VolumeVO.class, RootVolumeSearch.create("instance", vm.getId()));
+        
+        if (vols.size() > 0 && reuseVolume) {
+            // edit plan if this vm's ROOT volume is in READY state already
+            
+            VolumeVO vol = vols.get(0);
+            // make sure if the templateId is unchanged. If it is changed,
+            // let planner reassign pool for the volume even if it ready.
+            Long volTemplateId = vol.getTemplateId();
+            if (vol.isRecreatable() && volTemplateId != null &&
+                    vm.getTemplateId() != -1 && volTemplateId.longValue() != vm.getTemplateId()) {
+                job.log(s_logger, "Recreating" + vol + " of " + vm + " because its template has changed.");
+            } else {
+                StoragePool pool = (StoragePool)dataStoreMgr.getPrimaryDataStore(vol.getPoolId());
+                Long rootVolPodId = pool.getPodId();
+                Long rootVolClusterId = pool.getClusterId();
+                Long clusterIdSpecified = plan.getClusterId();
+                if (clusterIdSpecified != null && rootVolClusterId != null &&
+                    clusterIdSpecified.longValue() != rootVolClusterId.longValue()) {
+                    job.log(s_logger, "Unable to satisfy the deployment plan because it is requesting cluster " + clusterIdSpecified + " but the root volume is in cluster " + rootVolClusterId);
+                    throw new ResourceUnavailableException("Unable to satisfy the deployment plan because it is requesting cluster " + clusterIdSpecified
+                            + " but the root volume is in cluster " + rootVolClusterId, Cluster.class, clusterIdSpecified);
+                }
+                plan.setPoolId(vol.getPoolId());
+                plan.setClusterId(rootVolClusterId);
+                plan.setPodId(rootVolPodId);
+                planChangedByVolume = true;
+                job.log(s_logger, "Deployment plan has been adjusted to " + plan);
+            }
+        }
+
+        DeployDestination dest = null;
+        try {
+            dest = _dpMgr.planDeployment(profile, plan, plan.getAvoids());
+        } catch (AffinityConflictException e2) {
+            throw new CloudRuntimeException("Unable to create deployment, affinity rules associted to the VM conflict", e2);
+        }
+
+        if (dest == null && planChangedByVolume) {
+            job.log(s_logger, "Unable to find a deploy destination using the adjusted deployment plan.  Replanning with ");
+            return findDestination(profile, planRequested, false, reservation, job);
+        }
+
+        if (dest == null) {
+            throw new InsufficientServerCapacityException("Unable to create a deployment for " + vm,
+                    DataCenter.class, plan.getDataCenterId(), areAffinityGroupsAssociated(profile));
+        }
+
+        plan.getAvoids().addHost(dest.getHost().getId());
+        job.log(s_logger, "Final deploy destination: " + dest);
+        return new Pair<DeploymentPlan, DeployDestination>(plan, dest);
+    }
+
+    /**
+     * orchestrateStart orchestrates the vm start process.  Note that this
+     * method is not in the interface.
+     * 
+     * @param vmUuid uuid for the vm
+     * @param params additional parameters passed
+     * @param planRequested deployment requested
+     * @throws InsufficientCapacityException when there's not enough infrastructure capacity to ensure successful start of a vm.
+     * @throws ConcurrentOperationException when there are multiple operations on the vm.
+     * @throws ResourceUnavailableException when the resource being used to start the vm is not available.
+     */
+    public void orchestrateStart(String vmUuid, Map<VirtualMachineProfile.Param, Object> params, DeploymentPlan planRequested)
             throws InsufficientCapacityException, ConcurrentOperationException, ResourceUnavailableException {
         CallContext context = CallContext.current();
         User caller = context.getCallingUser();
         Account account = context.getCallingAccount();
+        AsyncJobExecutionContext job = AsyncJobExecutionContext.getCurrentExecutionContext();
 
         VMInstanceVO vm = _vmDao.findByUuid(vmUuid);
+        if (vm == null) {
+            throw new ConcurrentOperationException("Unable to find vm by " + vmUuid);
+        }
+
         VirtualMachineGuru vmGuru = getVmGuru(vm);
   
         Ternary<VMInstanceVO, ReservationContext, VmWorkJobVO> start = changeToStartState(vmGuru, vm, caller, account);
         assert(start != null);
 
-        ReservationContext ctx = start.second();
+        ReservationContext reservation = start.second();
         VmWorkJobVO work = start.third();
 
         VMInstanceVO startedVm = null;
         ServiceOfferingVO offering = _offeringDao.findById(vm.getServiceOfferingId());
         VMTemplateVO template = _templateDao.findById(vm.getTemplateId());
 
-        if (s_logger.isDebugEnabled()) {
-            s_logger.debug("Trying to deploy VM, vm has dcId: " + vm.getDataCenterId() + " and podId: " + vm.getPodIdToDeployIn());
-        }
-        DataCenterDeployment plan = new DataCenterDeployment(vm.getDataCenterId(), vm.getPodIdToDeployIn(), null, null, null, null, ctx);
-        if(planToDeploy != null && planToDeploy.getDataCenterId() != 0) {
-            if (s_logger.isDebugEnabled()) {
-                s_logger.debug("advanceStart: DeploymentPlan is provided, using dcId:" + planToDeploy.getDataCenterId() + ", podId: " + planToDeploy.getPodId() + ", clusterId: "
-                        + planToDeploy.getClusterId() + ", hostId: " + planToDeploy.getHostId() + ", poolId: " + planToDeploy.getPoolId());
-            }
-            plan = new DataCenterDeployment(planToDeploy.getDataCenterId(), planToDeploy.getPodId(), planToDeploy.getClusterId(), planToDeploy.getHostId(), planToDeploy.getPoolId(), planToDeploy.getPhysicalNetworkId(), ctx);
-        }
-
         HypervisorGuru hvGuru = _hvGuruMgr.getGuru(vm.getHypervisorType());
 
         boolean canRetry = true;
         try {
-            ExcludeList avoids = null;
-            if (planToDeploy != null) {
-                avoids = planToDeploy.getAvoids();
-            }
-            if (avoids == null) {
-                avoids = new ExcludeList();
-            }
-            if (s_logger.isDebugEnabled()) {
-                s_logger.debug("Deploy avoids pods: " + avoids.getPodsToAvoid() + ", clusters: " + avoids.getClustersToAvoid() + ", hosts: " + avoids.getHostsToAvoid());
-            }
 
-            boolean planChangedByVolume = false;
             boolean reuseVolume = true;
-            DataCenterDeployment originalPlan = plan;
+            DeploymentPlan plan = planRequested;
 
             int retry = _retry;
             while (retry-- != 0) { // It's != so that it can match -1.
 
-                if(reuseVolume){
-                    // edit plan if this vm's ROOT volume is in READY state already
-                    List<VolumeVO> vols = _volsDao.findReadyRootVolumesByInstance(vm.getId());
-                    for (VolumeVO vol : vols) {
-                        // make sure if the templateId is unchanged. If it is changed,
-                        // let planner
-                        // reassign pool for the volume even if it ready.
-                        Long volTemplateId = vol.getTemplateId();
-                        if (volTemplateId != null && volTemplateId.longValue() != template.getId()) {
-                            if (s_logger.isDebugEnabled()) {
-                                s_logger.debug(vol + " of " + vm + " is READY, but template ids don't match, let the planner reassign a new pool");
-                            }
-                            continue;
-                        }
-
-                        StoragePool pool = (StoragePool)dataStoreMgr.getPrimaryDataStore(vol.getPoolId());
-                        if (!pool.isInMaintenance()) {
-                            if (s_logger.isDebugEnabled()) {
-                                s_logger.debug("Root volume is ready, need to place VM in volume's cluster");
-                            }
-                            long rootVolDcId = pool.getDataCenterId();
-                            Long rootVolPodId = pool.getPodId();
-                            Long rootVolClusterId = pool.getClusterId();
-                            if (planToDeploy != null && planToDeploy.getDataCenterId() != 0) {
-                                Long clusterIdSpecified = planToDeploy.getClusterId();
-                                if (clusterIdSpecified != null && rootVolClusterId != null) {
-                                    if (rootVolClusterId.longValue() != clusterIdSpecified.longValue()) {
-                                        // cannot satisfy the plan passed in to the
-                                        // planner
-                                        if (s_logger.isDebugEnabled()) {
-                                            s_logger.debug("Cannot satisfy the deployment plan passed in since the ready Root volume is in different cluster. volume's cluster: " + rootVolClusterId
-                                                    + ", cluster specified: " + clusterIdSpecified);
-                                        }
-                                        throw new ResourceUnavailableException("Root volume is ready in different cluster, Deployment plan provided cannot be satisfied, unable to create a deployment for "
-                                                + vm, Cluster.class, clusterIdSpecified);
-                                    }
-                                }
-                                plan = new DataCenterDeployment(planToDeploy.getDataCenterId(), planToDeploy.getPodId(), planToDeploy.getClusterId(), planToDeploy.getHostId(), vol.getPoolId(), null, ctx);
-                            }else{
-                                plan = new DataCenterDeployment(rootVolDcId, rootVolPodId, rootVolClusterId, null, vol.getPoolId(), null, ctx);
-                                if (s_logger.isDebugEnabled()) {
-                                    s_logger.debug(vol + " is READY, changing deployment plan to use this pool's dcId: " + rootVolDcId + " , podId: " + rootVolPodId + " , and clusterId: " + rootVolClusterId);
-                                }
-                                planChangedByVolume = true;
-                            }
-                        }
-                    }
-                }
-
                 VirtualMachineProfileImpl vmProfile = new VirtualMachineProfileImpl(vm, template, offering, account, params);
-                DeployDestination dest = null;
-                try {
-                    dest = _dpMgr.planDeployment(vmProfile, plan, avoids);
-                } catch (AffinityConflictException e2) {
-                    s_logger.warn("Unable to create deployment, affinity rules associted to the VM conflict", e2);
-                    throw new CloudRuntimeException(
-                            "Unable to create deployment, affinity rules associted to the VM conflict");
-
-                }
-                if (dest == null) {
-                    if (planChangedByVolume) {
-                        plan = originalPlan;
-                        planChangedByVolume = false;
-                        //do not enter volume reuse for next retry, since we want to look for resorces outside the volume's cluster
-                        reuseVolume = false;
-                        continue;
-                    }
-                    throw new InsufficientServerCapacityException("Unable to create a deployment for " + vmProfile,
-                            DataCenter.class, plan.getDataCenterId(), areAffinityGroupsAssociated(vmProfile));
-                }
-
-                if (dest != null) {
-                    avoids.addHost(dest.getHost().getId());
-                    AsyncJobExecutionContext.getCurrentExecutionContext().logJobJournal(
-                            AsyncJob.JournalType.SUCCESS, "Deployment found, dest host: " + dest.getHost().getId(), null);
-                    break;
-                }
+                Pair<DeploymentPlan, DeployDestination> result = findDestination(vmProfile, plan, reuseVolume, reservation, job);
+                plan = result.first();
+                DeployDestination dest = result.second();
 
                 long destHostId = dest.getHost().getId();
                 vm.setPodId(dest.getPod().getId());
                 Long cluster_id = dest.getCluster().getId();
-                ClusterDetailsVO cluster_detail_cpu =  _clusterDetailsDao.findDetail(cluster_id,"cpuOvercommitRatio");
-                ClusterDetailsVO cluster_detail_ram =  _clusterDetailsDao.findDetail(cluster_id,"memoryOvercommitRatio");
+                ClusterDetailsVO cluster_detail_cpu = _clusterDetailsDao.findDetail(cluster_id, "cpuOvercommitRatio");
+                ClusterDetailsVO cluster_detail_ram = _clusterDetailsDao.findDetail(cluster_id, "memoryOvercommitRatio");
                 vmProfile.setCpuOvercommitRatio(Float.parseFloat(cluster_detail_cpu.getValue()));
                 vmProfile.setMemoryOvercommitRatio(Float.parseFloat(cluster_detail_ram.getValue()));
 
-                try {
-                    if (!changeState(vm, Event.OperationRetry, destHostId, work, Step.Prepare)) {
-                        throw new ConcurrentOperationException("Unable to update the state of the Virtual Machine");
-                    }
-                } catch (NoTransitionException e1) {
-                    throw new ConcurrentOperationException(e1.getMessage());
+                if (!changeState(vm, Event.OperationRetry, destHostId, work, Step.Prepare)) {
+                    throw new ConcurrentOperationException("Unable to update the state of the Virtual Machine");
                 }
 
                 try {
-                    if (s_logger.isDebugEnabled()) {
-                        s_logger.debug("VM is being created in podId: " + vm.getPodIdToDeployIn());
-                    }
-                    _networkMgr.prepare(vmProfile, dest, ctx);
-                    if (vm.getHypervisorType() != HypervisorType.BareMetal) {
-                        volumeMgr.prepare(vmProfile, dest);
-                    }
-                    //since StorageMgr succeeded in volume creation, reuse Volume for further tries until current cluster has capacity
-                    if(!reuseVolume){
-                        reuseVolume = true;
-                    }
+                    _networkMgr.prepare(vmProfile, dest, reservation);
+                    volumeMgr.prepare(vmProfile, dest);
+
+                    reuseVolume = true;
 
                     Commands cmds = null;
-                    vmGuru.finalizeVirtualMachineProfile(vmProfile, dest, ctx);
+                    vmGuru.finalizeVirtualMachineProfile(vmProfile, dest, reservation);
 
                     VirtualMachineTO vmTO = hvGuru.implement(vmProfile);
 
                     cmds = new Commands(OnError.Stop);
                     cmds.addCommand(new StartCommand(vmTO, dest.getHost()));
 
-                    vmGuru.finalizeDeployment(cmds, vmProfile, dest, ctx);
+                    vmGuru.finalizeDeployment(cmds, vmProfile, dest, reservation);
 
                     work.setStep(VmWorkJobVO.Step.Starting);
                     _workJobDao.update(work.getId(), work);
@@ -996,7 +986,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
                             }
                             destHostId = finalHost.getId();
                         }
-                        if (vmGuru.finalizeStart(vmProfile, destHostId, cmds, ctx)) {
+                        if (vmGuru.finalizeStart(vmProfile, destHostId, cmds, reservation)) {
                             if (!changeState(vm, Event.OperationSucceeded, destHostId, work, Step.Done)) {
                                 throw new ConcurrentOperationException("Unable to transition to a new state.");
                             }
@@ -1031,7 +1021,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
                     throw new AgentUnavailableException("Unable to start " + vm.getHostName(), destHostId, e);
                 } catch (ResourceUnavailableException e) {
                     s_logger.info("Unable to contact resource.", e);
-                    if (!avoids.add(e)) {
+                    if (!plan.getAvoids().add(e)) {
                         if (e.getScope() == Volume.class || e.getScope() == Nic.class) {
                             throw e;
                         } else {
@@ -1041,7 +1031,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
                     }
                 } catch (InsufficientCapacityException e) {
                     s_logger.info("Insufficient capacity ", e);
-                    if (!avoids.add(e)) {
+                    if (!plan.getAvoids().add(e)) {
                         if (e.getScope() == Volume.class || e.getScope() == Nic.class) {
                             throw e;
                         } else {
@@ -1050,7 +1040,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
                     }
                 } catch (Exception e) {
                     s_logger.error("Failed to start instance " + vm, e);
-                    throw new AgentUnavailableException("Unable to start instance due to " + e.getMessage(), destHostId, e);
+                    throw new CloudRuntimeException("Unable to start instance due to " + e.getMessage(), e);
                 } finally {
                     if (startedVm == null && canRetry) {
                         VmWorkJobVO.Step prevStep = work.getStep();
@@ -1064,14 +1054,14 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
                     }
                 }
             }
+        } catch (NoTransitionException e1) {
+            throw new CloudRuntimeException(e1.getMessage());
         } finally {
             if (startedVm == null) {
-                if (canRetry) {
-                    try {
-                        changeState(vm, Event.OperationFailed, null, work, Step.Done);
-                    } catch (NoTransitionException e) {
-                        throw new ConcurrentOperationException(e.getMessage());
-                    }
+                try {
+                    changeState(vm, Event.OperationFailed, null, work, Step.Done);
+                } catch (NoTransitionException e) {
+                    throw new ConcurrentOperationException(e.getMessage());
                 }
             }
         }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5e6d2cf5/server/src/com/cloud/vm/VmWorkJobDispatcher.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/vm/VmWorkJobDispatcher.java b/server/src/com/cloud/vm/VmWorkJobDispatcher.java
index 04d9204..fa33ecd 100644
--- a/server/src/com/cloud/vm/VmWorkJobDispatcher.java
+++ b/server/src/com/cloud/vm/VmWorkJobDispatcher.java
@@ -69,7 +69,7 @@ public class VmWorkJobDispatcher extends AdapterBase implements AsyncJobDispatch
     
             if (cmd.equals(Start)) {
                 VmWorkStart start = (VmWorkStart)work;
-                _vmMgr.processVmStartWork(vm.getUuid(), start.getParams(), start.getPlan());
+                _vmMgr.orchestrateStart(vm.getUuid(), start.getParams(), start.getPlan());
             } else if (cmd.equals(Stop)) {
                 VmWorkStop stop = (VmWorkStop)work;
                 _vmMgr.processVmStopWork(vm.getUuid(), stop.isForceStop());

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5e6d2cf5/server/test/com/cloud/async/MockVirtualMachineManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/test/com/cloud/async/MockVirtualMachineManagerImpl.java b/server/test/com/cloud/async/MockVirtualMachineManagerImpl.java
index bc25b11..e164d05 100644
--- a/server/test/com/cloud/async/MockVirtualMachineManagerImpl.java
+++ b/server/test/com/cloud/async/MockVirtualMachineManagerImpl.java
@@ -353,21 +353,6 @@ public class MockVirtualMachineManagerImpl implements VirtualMachineManager {
 		return false;
 	}
 
-	public VirtualMachine processVmStartWork(String vmUuid,
-			Map<Param, Object> params, User caller, Account account,
-			DeploymentPlan planToDeploy) throws InsufficientCapacityException,
-			ConcurrentOperationException, ResourceUnavailableException {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	public boolean processVmStopWork(String vmUuid, boolean forced, User user,
-			Account account) throws AgentUnavailableException,
-			OperationTimedoutException, ConcurrentOperationException {
-		// TODO Auto-generated method stub
-		return false;
-	}
-
 	@Override
 	public NicTO toNicTO(NicProfile nic, HypervisorType hypervisorType) {
 		// TODO Auto-generated method stub

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5e6d2cf5/utils/src/com/cloud/utils/db/GenericSearchBuilder.java
----------------------------------------------------------------------
diff --git a/utils/src/com/cloud/utils/db/GenericSearchBuilder.java b/utils/src/com/cloud/utils/db/GenericSearchBuilder.java
index 337d444..4bae344 100755
--- a/utils/src/com/cloud/utils/db/GenericSearchBuilder.java
+++ b/utils/src/com/cloud/utils/db/GenericSearchBuilder.java
@@ -22,6 +22,7 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.UUID;
 
 import javax.persistence.Column;
 import javax.persistence.Transient;
@@ -199,6 +200,16 @@ public class GenericSearchBuilder<T, K> implements MethodInterceptor {
         return this;
     }
     
+    public GenericSearchBuilder<T, K> and(Object useless, Op op, String name) {
+        constructCondition(name, " AND ", _specifiedAttrs.get(0), op);
+        return this;
+    }
+
+    public Preset and(Object useless, Op op) {
+        Condition condition = constructCondition(UUID.randomUUID().toString(), " AND ", _specifiedAttrs.get(0), op);
+        return new Preset(this, condition);
+    }
+
     public GenericSearchBuilder<T, K> and() {
         constructCondition(null, " AND ", null, null);
         return this;
@@ -217,19 +228,53 @@ public class GenericSearchBuilder<T, K> implements MethodInterceptor {
         return and(name, useless, op);
     }
     
+    public GenericSearchBuilder<T, K> where(Object useless, Op op, String name) {
+        return and(name, useless, op);
+    }
+
+    public Preset where(Object useless, Op op) {
+        return and(useless, op);
+    }
+
     public GenericSearchBuilder<T, K> left(String name, Object useless, Op op) {
         constructCondition(name, " ( ", _specifiedAttrs.get(0), op);
         return this;
     }
     
+    public GenericSearchBuilder<T, K> left(Object useless, Op op, String name) {
+        constructCondition(name, " ( ", _specifiedAttrs.get(0), op);
+        return this;
+    }
+
+    public Preset left(Object useless, Op op) {
+        Condition condition = constructCondition(UUID.randomUUID().toString(), " ( ", _specifiedAttrs.get(0), op);
+        return new Preset(this, condition);
+    }
+
+    public GenericSearchBuilder<T, K> op(Object useless, Op op, String name) {
+        return left(useless, op, name);
+    }
+
+    public Preset op(Object useless, Op op) {
+        return left(useless, op);
+    }
+
     public GenericSearchBuilder<T, K> op(String name, Object useless, Op op) {
         return left(name, useless, op);
     }
     
+    public GenericSearchBuilder<T, K> openParen(Object useless, Op op, String name) {
+        return left(name, useless, op);
+    }
+
     public GenericSearchBuilder<T, K> openParen(String name, Object useless, Op op) {
         return left(name, useless, op);
     }
     
+    public Preset openParen(Object useless, Op op) {
+        return left(useless, op);
+    }
+
     public GroupBy<T, K> groupBy(Object... useless) {
         assert _groupBy == null : "Can't do more than one group bys";
         _groupBy = new GroupBy<T, K>(this);
@@ -254,6 +299,16 @@ public class GenericSearchBuilder<T, K> implements MethodInterceptor {
         return this;
     }
     
+    public GenericSearchBuilder<T, K> or(Object useless, Op op, String name) {
+        constructCondition(name, " OR ", _specifiedAttrs.get(0), op);
+        return this;
+    }
+
+    public Preset or(Object useless, Op op) {
+        Condition condition = constructCondition(UUID.randomUUID().toString(), " OR ", _specifiedAttrs.get(0), op);
+        return new Preset(this, condition);
+    }
+
     public GenericSearchBuilder<T, K> join(String name, GenericSearchBuilder<?, ?> builder, Object useless, Object useless2, JoinBuilder.JoinType joinType) {
         assert _entity != null : "SearchBuilder cannot be modified once it has been setup";
         assert _specifiedAttrs.size() == 1 : "You didn't select the attribute.";
@@ -272,7 +327,7 @@ public class GenericSearchBuilder<T, K> implements MethodInterceptor {
         return this;
     }
     
-    protected void constructCondition(String conditionName, String cond, Attribute attr, Op op) {
+    protected Condition constructCondition(String conditionName, String cond, Attribute attr, Op op) {
         assert _entity != null : "SearchBuilder cannot be modified once it has been setup";
         assert op == null || _specifiedAttrs.size() == 1 : "You didn't select the attribute.";
         assert op != Op.SC : "Call join";
@@ -280,6 +335,7 @@ public class GenericSearchBuilder<T, K> implements MethodInterceptor {
         Condition condition = new Condition(conditionName, cond, attr, op);
         _conditions.add(condition);
         _specifiedAttrs.clear();
+        return condition;
     }
 
     /**
@@ -360,6 +416,7 @@ public class GenericSearchBuilder<T, K> implements MethodInterceptor {
         protected final String cond;
         protected final Op op;
         protected final Attribute attr;
+        protected Object[] presets;
         
         protected Condition(String name) {
             this(name, null, null, null);
@@ -370,8 +427,21 @@ public class GenericSearchBuilder<T, K> implements MethodInterceptor {
             this.attr = attr;
             this.cond = cond;
             this.op = op;
+            this.presets = null;
         }
         
+        public boolean isPreset() {
+            return presets != null;
+        }
+
+        public void setPresets(Object... presets) {
+            this.presets = presets;
+        }
+
+        public Object[] getPresets() {
+            return presets;
+        }
+
         public void toSql(StringBuilder sql, Object[] params, int count) {
             if (count > 0) {
                 sql.append(cond);
@@ -445,4 +515,22 @@ public class GenericSearchBuilder<T, K> implements MethodInterceptor {
             this.field = field;
         }
     }
+    
+    public class Preset {
+        GenericSearchBuilder<T, K> builder;
+        Condition condition;
+
+        protected Preset(GenericSearchBuilder<T, K> builder, Condition condition) {
+            this.builder = builder;
+            this.condition = condition;
+        }
+
+        public GenericSearchBuilder<T, K> values(Object... params) {
+            if (condition.op.getParams() > 0 && condition.op.params != params.length) {
+                throw new CloudRuntimeException("The # of parameters set " + params.length + " does not match # of parameters required by " + condition.op);
+            }
+            condition.setPresets(params);
+            return builder;
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5e6d2cf5/utils/src/com/cloud/utils/db/SearchCriteria.java
----------------------------------------------------------------------
diff --git a/utils/src/com/cloud/utils/db/SearchCriteria.java b/utils/src/com/cloud/utils/db/SearchCriteria.java
index 85f7708..22bccd3 100755
--- a/utils/src/com/cloud/utils/db/SearchCriteria.java
+++ b/utils/src/com/cloud/utils/db/SearchCriteria.java
@@ -295,6 +295,9 @@ public class SearchCriteria<K> {
         StringBuilder sql = new StringBuilder();
         int i = 0;
         for (Condition condition : _conditions) {
+            if (condition.isPreset()) {
+                _params.put(condition.name, condition.presets);
+            }
             Object[] params = _params.get(condition.name);
             if ((condition.op == null || condition.op.params == 0) || (params != null)) {
                 condition.toSql(sql, params, i++);
@@ -302,6 +305,9 @@ public class SearchCriteria<K> {
         }
 
         for (Condition condition : _additionals) {
+            if (condition.isPreset()) {
+                _params.put(condition.name, condition.presets);
+            }
             Object[] params = _params.get(condition.name);
             if ((condition.op.params == 0) || (params != null)) {
                 condition.toSql(sql, params, i++);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5e6d2cf5/vmware-base/src/com/cloud/hypervisor/vmware/mo/BaseMO.java
----------------------------------------------------------------------
diff --git a/vmware-base/src/com/cloud/hypervisor/vmware/mo/BaseMO.java b/vmware-base/src/com/cloud/hypervisor/vmware/mo/BaseMO.java
index 0ac93e4..c039d80 100644
--- a/vmware-base/src/com/cloud/hypervisor/vmware/mo/BaseMO.java
+++ b/vmware-base/src/com/cloud/hypervisor/vmware/mo/BaseMO.java
@@ -129,7 +129,7 @@ public class BaseMO {
 		CustomFieldStringValue cfValue = (CustomFieldStringValue)_context.getVimClient().getDynamicProperty(getMor(),
 			String.format("value[%d]", key));
 		if(cfValue != null)
-			return cfValue.getValue();
+			return cfValue.getPresetParams();
 
 		return null;
 	}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5e6d2cf5/vmware-base/src/com/cloud/hypervisor/vmware/mo/ClusterMO.java
----------------------------------------------------------------------
diff --git a/vmware-base/src/com/cloud/hypervisor/vmware/mo/ClusterMO.java b/vmware-base/src/com/cloud/hypervisor/vmware/mo/ClusterMO.java
index d112c34..58afc93 100755
--- a/vmware-base/src/com/cloud/hypervisor/vmware/mo/ClusterMO.java
+++ b/vmware-base/src/com/cloud/hypervisor/vmware/mo/ClusterMO.java
@@ -120,7 +120,7 @@ public class ClusterMO extends BaseMO implements VmwareHypervisorHost {
 	@Override
 	public ObjectContent[] getVmPropertiesOnHyperHost(String[] propertyPaths) throws Exception {
 		if(s_logger.isTraceEnabled())
-			s_logger.trace("vCenter API trace - retrieveProperties() for VM properties. target MOR: " + _mor.getValue() + ", properties: " + new Gson().toJson(propertyPaths));
+			s_logger.trace("vCenter API trace - retrieveProperties() for VM properties. target MOR: " + _mor.getPresetParams() + ", properties: " + new Gson().toJson(propertyPaths));
 
 		PropertySpec pSpec = new PropertySpec();
 		pSpec.setType("VirtualMachine");
@@ -158,7 +158,7 @@ public class ClusterMO extends BaseMO implements VmwareHypervisorHost {
 	@Override
 	public ObjectContent[] getDatastorePropertiesOnHyperHost(String[] propertyPaths) throws Exception {
 		if(s_logger.isTraceEnabled())
-			s_logger.trace("vCenter API trace - retrieveProperties() on Datastore properties. target MOR: " + _mor.getValue() + ", properties: " + new Gson().toJson(propertyPaths));
+			s_logger.trace("vCenter API trace - retrieveProperties() on Datastore properties. target MOR: " + _mor.getPresetParams() + ", properties: " + new Gson().toJson(propertyPaths));
 
 		PropertySpec pSpec = new PropertySpec();
 		pSpec.setType("Datastore");
@@ -190,7 +190,7 @@ public class ClusterMO extends BaseMO implements VmwareHypervisorHost {
 
 	private ObjectContent[] getHostPropertiesOnCluster(String[] propertyPaths) throws Exception {
 		if(s_logger.isTraceEnabled())
-			s_logger.trace("vCenter API trace - retrieveProperties() on Host properties. target MOR: " + _mor.getValue() + ", properties: " + new Gson().toJson(propertyPaths));
+			s_logger.trace("vCenter API trace - retrieveProperties() on Host properties. target MOR: " + _mor.getPresetParams() + ", properties: " + new Gson().toJson(propertyPaths));
 
 		PropertySpec pSpec = new PropertySpec();
 		pSpec.setType("HostSystem");
@@ -224,7 +224,7 @@ public class ClusterMO extends BaseMO implements VmwareHypervisorHost {
 	@Override
 	public boolean createVm(VirtualMachineConfigSpec vmSpec) throws Exception {
 	    if(s_logger.isTraceEnabled())
-			s_logger.trace("vCenter API trace - createVM_Task(). target MOR: " + _mor.getValue() + ", VirtualMachineConfigSpec: " + new Gson().toJson(vmSpec));
+			s_logger.trace("vCenter API trace - createVM_Task(). target MOR: " + _mor.getPresetParams() + ", VirtualMachineConfigSpec: " + new Gson().toJson(vmSpec));
 
 		assert(vmSpec != null);
 		DatacenterMO dcMo = new DatacenterMO(_context, getHyperHostDatacenter());
@@ -252,14 +252,14 @@ public class ClusterMO extends BaseMO implements VmwareHypervisorHost {
 	@Override
 	public void importVmFromOVF(String ovfFilePath, String vmName, DatastoreMO dsMo, String diskOption) throws Exception {
 	    if(s_logger.isTraceEnabled())
-			s_logger.trace("vCenter API trace - importVmFromOVF(). target MOR: " + _mor.getValue() + ", ovfFilePath: " + ovfFilePath + ", vmName: " + vmName
-				+ ", datastore: " + dsMo.getMor().getValue() + ", diskOption: " + diskOption);
+			s_logger.trace("vCenter API trace - importVmFromOVF(). target MOR: " + _mor.getPresetParams() + ", ovfFilePath: " + ovfFilePath + ", vmName: " + vmName
+				+ ", datastore: " + dsMo.getMor().getPresetParams() + ", diskOption: " + diskOption);
 
 		ManagedObjectReference morRp = getHyperHostOwnerResourcePool();
 		assert(morRp != null);
 
 		if(s_logger.isTraceEnabled())
-			s_logger.trace("vCenter API trace - importVmFromOVF(). resource pool: " + morRp.getValue());
+			s_logger.trace("vCenter API trace - importVmFromOVF(). resource pool: " + morRp.getPresetParams());
 
 		HypervisorHostHelper.importVmFromOVF(this, ovfFilePath, vmName, dsMo, diskOption, morRp, null);
 
@@ -272,9 +272,9 @@ public class ClusterMO extends BaseMO implements VmwareHypervisorHost {
 		String guestOsIdentifier, ManagedObjectReference morDs, boolean snapshotDirToParent) throws Exception {
 
 	    if(s_logger.isTraceEnabled())
-			s_logger.trace("vCenter API trace - createBlankVm(). target MOR: " + _mor.getValue() + ", vmName: " + vmName + ", cpuCount: " + cpuCount
+			s_logger.trace("vCenter API trace - createBlankVm(). target MOR: " + _mor.getPresetParams() + ", vmName: " + vmName + ", cpuCount: " + cpuCount
 				+ ", cpuSpeedMhz: " + cpuSpeedMHz + ", cpuReservedMHz: " + cpuReservedMHz + ", limitCpu: " + limitCpuUse + ", memoryMB: " + memoryMB
-				+ ", guestOS: " + guestOsIdentifier + ", datastore: " + morDs.getValue() + ", snapshotDirToParent: " + snapshotDirToParent);
+				+ ", guestOS: " + guestOsIdentifier + ", datastore: " + morDs.getPresetParams() + ", snapshotDirToParent: " + snapshotDirToParent);
 
 		boolean result = HypervisorHostHelper.createBlankVm(this, vmName, cpuCount, cpuSpeedMHz, cpuReservedMHz, limitCpuUse,
 			memoryMB, memoryReserveMB, guestOsIdentifier, morDs, snapshotDirToParent);
@@ -290,7 +290,7 @@ public class ClusterMO extends BaseMO implements VmwareHypervisorHost {
 		int poolHostPort, String poolPath, String poolUuid) throws Exception {
 
 	    if(s_logger.isTraceEnabled())
-			s_logger.trace("vCenter API trace - mountDatastore(). target MOR: " + _mor.getValue() + ", vmfs: " + vmfsDatastore + ", poolHost: " + poolHostAddress
+			s_logger.trace("vCenter API trace - mountDatastore(). target MOR: " + _mor.getPresetParams() + ", vmfs: " + vmfsDatastore + ", poolHost: " + poolHostAddress
 				+ ", poolHostPort: " + poolHostPort + ", poolPath: " + poolPath + ", poolUuid: " + poolUuid);
 
 		ManagedObjectReference morDs = null;
@@ -304,7 +304,7 @@ public class ClusterMO extends BaseMO implements VmwareHypervisorHost {
 					morDsFirst = morDs;
 
 				// assume datastore is in scope of datacenter
-				assert(morDsFirst.getValue().equals(morDs.getValue()));
+				assert(morDsFirst.getPresetParams().equals(morDs.getPresetParams()));
 			}
 		}
 
@@ -326,7 +326,7 @@ public class ClusterMO extends BaseMO implements VmwareHypervisorHost {
 	@Override
 	public void unmountDatastore(String poolUuid) throws Exception {
 	    if(s_logger.isTraceEnabled())
-			s_logger.trace("vCenter API trace - unmountDatastore(). target MOR: " + _mor.getValue() + ", poolUuid: " + poolUuid);
+			s_logger.trace("vCenter API trace - unmountDatastore(). target MOR: " + _mor.getPresetParams() + ", poolUuid: " + poolUuid);
 
 		List<ManagedObjectReference> hosts = (List<ManagedObjectReference>)_context.getVimClient().getDynamicProperty(_mor, "host");
 		if(hosts != null && hosts.size() > 0) {
@@ -344,7 +344,7 @@ public class ClusterMO extends BaseMO implements VmwareHypervisorHost {
 	public ManagedObjectReference findDatastore(String poolUuid) throws Exception {
 
 	    if(s_logger.isTraceEnabled())
-			s_logger.trace("vCenter API trace - findDatastore(). target MOR: " + _mor.getValue() + ", poolUuid: " + poolUuid);
+			s_logger.trace("vCenter API trace - findDatastore(). target MOR: " + _mor.getPresetParams() + ", poolUuid: " + poolUuid);
 
 		CustomFieldsManagerMO cfmMo = new CustomFieldsManagerMO(_context,
 				_context.getServiceContent().getCustomFieldsManager());
@@ -361,7 +361,7 @@ public class ClusterMO extends BaseMO implements VmwareHypervisorHost {
 					DynamicProperty prop = oc.getPropSet().get(1);
 					if(prop != null && prop.getVal() != null) {
 						if(prop.getVal() instanceof CustomFieldStringValue) {
-							String val = ((CustomFieldStringValue)prop.getVal()).getValue();
+							String val = ((CustomFieldStringValue)prop.getVal()).getPresetParams();
 							if(val.equalsIgnoreCase(poolUuid)) {
 
 							    if(s_logger.isTraceEnabled())
@@ -382,7 +382,7 @@ public class ClusterMO extends BaseMO implements VmwareHypervisorHost {
 	@Override
 	public ManagedObjectReference findDatastoreByExportPath(String exportPath) throws Exception {
 	    if(s_logger.isTraceEnabled())
-			s_logger.trace("vCenter API trace - findDatastoreByExportPath(). target MOR: " + _mor.getValue() + ", exportPath: " + exportPath);
+			s_logger.trace("vCenter API trace - findDatastoreByExportPath(). target MOR: " + _mor.getPresetParams() + ", exportPath: " + exportPath);
 
 		ObjectContent[] ocs = getDatastorePropertiesOnHyperHost(new String[] {"info"});
 		if(ocs != null && ocs.length > 0) {
@@ -415,7 +415,7 @@ public class ClusterMO extends BaseMO implements VmwareHypervisorHost {
 	@Override
 	public ManagedObjectReference findMigrationTarget(VirtualMachineMO vmMo) throws Exception {
 	    if(s_logger.isTraceEnabled())
-			s_logger.trace("vCenter API trace - findMigrationTarget(). target MOR: " + _mor.getValue() + ", vm: " + vmMo.getName());
+			s_logger.trace("vCenter API trace - findMigrationTarget(). target MOR: " + _mor.getPresetParams() + ", vm: " + vmMo.getName());
 
 		List<ClusterHostRecommendation> candidates = recommendHostsForVm(vmMo);
 		if(candidates != null && candidates.size() > 0) {
@@ -464,7 +464,7 @@ public class ClusterMO extends BaseMO implements VmwareHypervisorHost {
 	@Override
 	public VmwareHypervisorHostResourceSummary getHyperHostResourceSummary() throws Exception {
 	    if(s_logger.isTraceEnabled())
-			s_logger.trace("vCenter API trace - getHyperHostResourceSummary(). target MOR: " + _mor.getValue());
+			s_logger.trace("vCenter API trace - getHyperHostResourceSummary(). target MOR: " + _mor.getPresetParams());
 
 		VmwareHypervisorHostResourceSummary summary = new VmwareHypervisorHostResourceSummary();
 
@@ -496,7 +496,7 @@ public class ClusterMO extends BaseMO implements VmwareHypervisorHost {
 	public VmwareHypervisorHostNetworkSummary getHyperHostNetworkSummary(String esxServiceConsolePort) throws Exception {
 
 	    if(s_logger.isTraceEnabled())
-			s_logger.trace("vCenter API trace - getHyperHostNetworkSummary(). target MOR: " + _mor.getValue() + ", mgmtPortgroup: " + esxServiceConsolePort);
+			s_logger.trace("vCenter API trace - getHyperHostNetworkSummary(). target MOR: " + _mor.getPresetParams() + ", mgmtPortgroup: " + esxServiceConsolePort);
 
 		List<ManagedObjectReference> hosts = (List<ManagedObjectReference>)_context.getVimClient().getDynamicProperty(_mor, "host");
 		if(hosts != null && hosts.size() > 0) {
@@ -515,7 +515,7 @@ public class ClusterMO extends BaseMO implements VmwareHypervisorHost {
 	@Override
 	public ComputeResourceSummary getHyperHostHardwareSummary() throws Exception {
 	    if(s_logger.isTraceEnabled())
-			s_logger.trace("vCenter API trace - getHyperHostHardwareSummary(). target MOR: " + _mor.getValue());
+			s_logger.trace("vCenter API trace - getHyperHostHardwareSummary(). target MOR: " + _mor.getPresetParams());
 
 		ClusterComputeResourceSummary hardwareSummary = (ClusterComputeResourceSummary)
 			_context.getVimClient().getDynamicProperty(_mor, "summary");
@@ -562,7 +562,7 @@ public class ClusterMO extends BaseMO implements VmwareHypervisorHost {
 		        			name = (String)objProp.getVal();
 		        		} else {
 		        			OptionValue optValue = (OptionValue)objProp.getVal();
-		        			value = (String)optValue.getValue();
+		        			value = (String)optValue.getPresetParams();
 		        		}
 		        	}
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5e6d2cf5/vmware-base/src/com/cloud/hypervisor/vmware/mo/DatacenterMO.java
----------------------------------------------------------------------
diff --git a/vmware-base/src/com/cloud/hypervisor/vmware/mo/DatacenterMO.java b/vmware-base/src/com/cloud/hypervisor/vmware/mo/DatacenterMO.java
index 0a3e20b..0f7bb3a 100755
--- a/vmware-base/src/com/cloud/hypervisor/vmware/mo/DatacenterMO.java
+++ b/vmware-base/src/com/cloud/hypervisor/vmware/mo/DatacenterMO.java
@@ -117,7 +117,7 @@ public class DatacenterMO extends BaseMO {
 									break;		// break out inner loop
 								}
 							} else if(prop.getVal() instanceof CustomFieldStringValue) {
-								String val = ((CustomFieldStringValue)prop.getVal()).getValue();
+								String val = ((CustomFieldStringValue)prop.getVal()).getPresetParams();
 								if(val.equals(vmLabel)) {
 									list.add(new VirtualMachineMO(_context, oc.getObj()));
 									break;		// break out inner loop
@@ -451,7 +451,7 @@ public class DatacenterMO extends BaseMO {
                             dvSwitchMor = (ManagedObjectReference) prop.getVal();
                         }
                     }
-                    if ((dvPortGroupKey != null) && dvPortGroupKey.equals(dvPortGroupMor.getValue())) {
+                    if ((dvPortGroupKey != null) && dvPortGroupKey.equals(dvPortGroupMor.getPresetParams())) {
                         return dvSwitchMor;
                     }
                 }
@@ -474,7 +474,7 @@ public class DatacenterMO extends BaseMO {
         ManagedObjectReference dvsMor = getDvSwitchMor(networkInfo.first());
         String dvSwitchUuid = getDvSwitchUuid(dvsMor);
         dvPortConnection.setSwitchUuid(dvSwitchUuid);
-        dvPortConnection.setPortgroupKey(networkInfo.first().getValue());
+        dvPortConnection.setPortgroupKey(networkInfo.first().getPresetParams());
         dvPortBacking.setPort(dvPortConnection);
         System.out.println("Plugging NIC device into network " + networkInfo.second() + " backed by dvSwitch: "
                 + dvSwitchUuid);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5e6d2cf5/vmware-base/src/com/cloud/hypervisor/vmware/mo/HostDatastoreBrowserMO.java
----------------------------------------------------------------------
diff --git a/vmware-base/src/com/cloud/hypervisor/vmware/mo/HostDatastoreBrowserMO.java b/vmware-base/src/com/cloud/hypervisor/vmware/mo/HostDatastoreBrowserMO.java
index 59e754c..a9d2205 100644
--- a/vmware-base/src/com/cloud/hypervisor/vmware/mo/HostDatastoreBrowserMO.java
+++ b/vmware-base/src/com/cloud/hypervisor/vmware/mo/HostDatastoreBrowserMO.java
@@ -37,7 +37,7 @@ public class HostDatastoreBrowserMO extends BaseMO {
 
 	public void DeleteFile(String datastoreFullPath) throws Exception {
 		if(s_logger.isTraceEnabled())
-			s_logger.trace("vCenter API trace - deleteFile(). target mor: " + _mor.getValue() + ", file datastore path: " + datastoreFullPath);
+			s_logger.trace("vCenter API trace - deleteFile(). target mor: " + _mor.getPresetParams() + ", file datastore path: " + datastoreFullPath);
 
 		_context.getService().deleteFile(_mor, datastoreFullPath);
 
@@ -47,7 +47,7 @@ public class HostDatastoreBrowserMO extends BaseMO {
 
 	public HostDatastoreBrowserSearchResults searchDatastore(String datastorePath, HostDatastoreBrowserSearchSpec searchSpec) throws Exception {
 		if(s_logger.isTraceEnabled())
-			s_logger.trace("vCenter API trace - searchDatastore(). target mor: " + _mor.getValue() + ", file datastore path: " + datastorePath);
+			s_logger.trace("vCenter API trace - searchDatastore(). target mor: " + _mor.getPresetParams() + ", file datastore path: " + datastorePath);
 
 		try {
 			ManagedObjectReference morTask = _context.getService().searchDatastoreTask(_mor, datastorePath, searchSpec);
@@ -78,7 +78,7 @@ public class HostDatastoreBrowserMO extends BaseMO {
 
 	public HostDatastoreBrowserSearchResults searchDatastoreSubFolders(String datastorePath, HostDatastoreBrowserSearchSpec searchSpec) throws Exception {
 		if(s_logger.isTraceEnabled())
-			s_logger.trace("vCenter API trace - searchDatastoreSubFolders(). target mor: " + _mor.getValue() + ", file datastore path: " + datastorePath);
+			s_logger.trace("vCenter API trace - searchDatastoreSubFolders(). target mor: " + _mor.getPresetParams() + ", file datastore path: " + datastorePath);
 
 		try {
 			ManagedObjectReference morTask = _context.getService().searchDatastoreSubFoldersTask(_mor, datastorePath, searchSpec);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5e6d2cf5/vmware-base/src/com/cloud/hypervisor/vmware/mo/HostDatastoreSystemMO.java
----------------------------------------------------------------------
diff --git a/vmware-base/src/com/cloud/hypervisor/vmware/mo/HostDatastoreSystemMO.java b/vmware-base/src/com/cloud/hypervisor/vmware/mo/HostDatastoreSystemMO.java
index 3dcd724..898e82b 100755
--- a/vmware-base/src/com/cloud/hypervisor/vmware/mo/HostDatastoreSystemMO.java
+++ b/vmware-base/src/com/cloud/hypervisor/vmware/mo/HostDatastoreSystemMO.java
@@ -63,7 +63,7 @@ public class HostDatastoreSystemMO extends BaseMO {
 					DynamicProperty prop = oc.getPropSet().get(1);
 					if(prop != null && prop.getVal() != null) {
 						if(prop.getVal() instanceof CustomFieldStringValue) {
-							String val = ((CustomFieldStringValue)prop.getVal()).getValue();
+							String val = ((CustomFieldStringValue)prop.getVal()).getPresetParams();
 							if(val.equalsIgnoreCase(name))
 								return oc.getObj();
 						}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5e6d2cf5/vmware-base/src/com/cloud/hypervisor/vmware/mo/HostMO.java
----------------------------------------------------------------------
diff --git a/vmware-base/src/com/cloud/hypervisor/vmware/mo/HostMO.java b/vmware-base/src/com/cloud/hypervisor/vmware/mo/HostMO.java
index a866fdc..a228fc3 100755
--- a/vmware-base/src/com/cloud/hypervisor/vmware/mo/HostMO.java
+++ b/vmware-base/src/com/cloud/hypervisor/vmware/mo/HostMO.java
@@ -544,7 +544,7 @@ public class HostMO extends BaseMO implements VmwareHypervisorHost {
 		        			name = (String)objProp.getVal();
 		        		} else {
 		        			OptionValue optValue = (OptionValue)objProp.getVal();
-		        			value = (String)optValue.getValue();
+		        			value = (String)optValue.getPresetParams();
 		        		}
 		        	}
 
@@ -561,7 +561,7 @@ public class HostMO extends BaseMO implements VmwareHypervisorHost {
 	@Override
     public ObjectContent[] getVmPropertiesOnHyperHost(String[] propertyPaths) throws Exception {
 		if(s_logger.isTraceEnabled())
-			s_logger.trace("vCenter API trace - retrieveProperties() for VM properties. target MOR: " + _mor.getValue() + ", properties: " + new Gson().toJson(propertyPaths));
+			s_logger.trace("vCenter API trace - retrieveProperties() for VM properties. target MOR: " + _mor.getPresetParams() + ", properties: " + new Gson().toJson(propertyPaths));
 
 		PropertySpec pSpec = new PropertySpec();
 		pSpec.setType("VirtualMachine");
@@ -594,7 +594,7 @@ public class HostMO extends BaseMO implements VmwareHypervisorHost {
 	@Override
 	public ObjectContent[] getDatastorePropertiesOnHyperHost(String[] propertyPaths) throws Exception {
 		if(s_logger.isTraceEnabled())
-			s_logger.trace("vCenter API trace - retrieveProperties() on Datastore properties. target MOR: " + _mor.getValue() + ", properties: " + new Gson().toJson(propertyPaths));
+			s_logger.trace("vCenter API trace - retrieveProperties() on Datastore properties. target MOR: " + _mor.getPresetParams() + ", properties: " + new Gson().toJson(propertyPaths));
 
 		PropertySpec pSpec = new PropertySpec();
 		pSpec.setType("Datastore");
@@ -628,7 +628,7 @@ public class HostMO extends BaseMO implements VmwareHypervisorHost {
 		List<Pair<ManagedObjectReference, String>> mounts = new ArrayList<Pair<ManagedObjectReference, String>>();
 
 		ObjectContent[] ocs = getDatastorePropertiesOnHyperHost(new String[] {
-			String.format("host[\"%s\"].mountInfo.path", _mor.getValue()) });
+			String.format("host[\"%s\"].mountInfo.path", _mor.getPresetParams()) });
 		if(ocs != null) {
 			for(ObjectContent oc : ocs) {
 				Pair<ManagedObjectReference, String> mount = new Pair<ManagedObjectReference, String>(
@@ -659,7 +659,7 @@ public class HostMO extends BaseMO implements VmwareHypervisorHost {
 
 	public void importVmFromOVF(String ovfFilePath, String vmName, String datastoreName, String diskOption) throws Exception {
 	    if(s_logger.isTraceEnabled())
-			s_logger.trace("vCenter API trace - importVmFromOVF(). target MOR: " + _mor.getValue() + ", ovfFilePath: " + ovfFilePath + ", vmName: " + vmName
+			s_logger.trace("vCenter API trace - importVmFromOVF(). target MOR: " + _mor.getPresetParams() + ", ovfFilePath: " + ovfFilePath + ", vmName: " + vmName
 				+ ",datastoreName: " + datastoreName + ", diskOption: " + diskOption);
 
 		DatastoreMO dsMo = getHostDatastoreMO(datastoreName);
@@ -686,9 +686,9 @@ public class HostMO extends BaseMO implements VmwareHypervisorHost {
 		String guestOsIdentifier, ManagedObjectReference morDs, boolean snapshotDirToParent) throws Exception {
 
 		if(s_logger.isTraceEnabled())
-			s_logger.trace("vCenter API trace - createBlankVm(). target MOR: " + _mor.getValue() + ", vmName: " + vmName + ", cpuCount: " + cpuCount
+			s_logger.trace("vCenter API trace - createBlankVm(). target MOR: " + _mor.getPresetParams() + ", vmName: " + vmName + ", cpuCount: " + cpuCount
 				+ ", cpuSpeedMhz: " + cpuSpeedMHz + ", cpuReservedMHz: " + cpuReservedMHz + ", limitCpu: " + limitCpuUse + ", memoryMB: " + memoryMB
-				+ ", guestOS: " + guestOsIdentifier + ", datastore: " + morDs.getValue() + ", snapshotDirToParent: " + snapshotDirToParent);
+				+ ", guestOS: " + guestOsIdentifier + ", datastore: " + morDs.getPresetParams() + ", snapshotDirToParent: " + snapshotDirToParent);
 
 		boolean result = HypervisorHostHelper.createBlankVm(this, vmName, cpuCount, cpuSpeedMHz, cpuReservedMHz, limitCpuUse,
 			memoryMB, memoryReserveMB, guestOsIdentifier, morDs, snapshotDirToParent);
@@ -736,7 +736,7 @@ public class HostMO extends BaseMO implements VmwareHypervisorHost {
 		int poolHostPort, String poolPath, String poolUuid) throws Exception {
 
 	    if(s_logger.isTraceEnabled())
-			s_logger.trace("vCenter API trace - mountDatastore(). target MOR: " + _mor.getValue() + ", vmfs: " + vmfsDatastore + ", poolHost: " + poolHostAddress
+			s_logger.trace("vCenter API trace - mountDatastore(). target MOR: " + _mor.getPresetParams() + ", vmfs: " + vmfsDatastore + ", poolHost: " + poolHostAddress
 				+ ", poolHostPort: " + poolHostPort + ", poolPath: " + poolPath + ", poolUuid: " + poolUuid);
 
     	HostDatastoreSystemMO hostDatastoreSystemMo = getHostDatastoreSystemMO();
@@ -751,7 +751,7 @@ public class HostMO extends BaseMO implements VmwareHypervisorHost {
                             poolUuid);
                 } catch (AlreadyExistsFaultMsg e) {
                     s_logger.info("Creation of NFS datastore on vCenter failed since datastore already exists." +
-                            " Details: vCenter API trace - mountDatastore(). target MOR: " + _mor.getValue() + ", vmfs: " +
+                            " Details: vCenter API trace - mountDatastore(). target MOR: " + _mor.getPresetParams() + ", vmfs: " +
                             vmfsDatastore + ", poolHost: " + poolHostAddress + ", poolHostPort: " + poolHostPort +
                             ", poolPath: " + poolPath + ", poolUuid: " + poolUuid);
                     // Retrieve the morDatastore and return it.
@@ -759,7 +759,7 @@ public class HostMO extends BaseMO implements VmwareHypervisorHost {
                             poolHostPort, poolPath, poolUuid, hostDatastoreSystemMo));
                 } catch (Exception e) {
                     s_logger.info("Creation of NFS datastore on vCenter failed. " +
-                            " Details: vCenter API trace - mountDatastore(). target MOR: " + _mor.getValue() + ", vmfs: " +
+                            " Details: vCenter API trace - mountDatastore(). target MOR: " + _mor.getPresetParams() + ", vmfs: " +
                             vmfsDatastore + ", poolHost: " + poolHostAddress + ", poolHostPort: " + poolHostPort +
                             ", poolPath: " + poolPath + ", poolUuid: " + poolUuid + ". Exception mesg: " + e.getMessage());
                     throw new Exception("Creation of NFS datastore on vCenter failed.");
@@ -800,7 +800,7 @@ public class HostMO extends BaseMO implements VmwareHypervisorHost {
 	public void unmountDatastore(String poolUuid) throws Exception {
 
 	    if(s_logger.isTraceEnabled())
-			s_logger.trace("vCenter API trace - unmountDatastore(). target MOR: " + _mor.getValue() + ", poolUuid: " + poolUuid);
+			s_logger.trace("vCenter API trace - unmountDatastore(). target MOR: " + _mor.getPresetParams() + ", poolUuid: " + poolUuid);
 
     	HostDatastoreSystemMO hostDatastoreSystemMo = getHostDatastoreSystemMO();
     	if(!hostDatastoreSystemMo.deleteDatastore(poolUuid)) {
@@ -836,7 +836,7 @@ public class HostMO extends BaseMO implements VmwareHypervisorHost {
 	@Override
 	public VmwareHypervisorHostResourceSummary getHyperHostResourceSummary() throws Exception {
 	    if(s_logger.isTraceEnabled())
-			s_logger.trace("vCenter API trace - getHyperHostResourceSummary(). target MOR: " + _mor.getValue());
+			s_logger.trace("vCenter API trace - getHyperHostResourceSummary(). target MOR: " + _mor.getPresetParams());
 
 		VmwareHypervisorHostResourceSummary summary = new VmwareHypervisorHostResourceSummary();
 
@@ -854,7 +854,7 @@ public class HostMO extends BaseMO implements VmwareHypervisorHost {
 	@Override
 	public VmwareHypervisorHostNetworkSummary getHyperHostNetworkSummary(String managementPortGroup) throws Exception {
 	    if(s_logger.isTraceEnabled())
-			s_logger.trace("vCenter API trace - getHyperHostNetworkSummary(). target MOR: " + _mor.getValue() + ", mgmtPortgroup: " + managementPortGroup);
+			s_logger.trace("vCenter API trace - getHyperHostNetworkSummary(). target MOR: " + _mor.getPresetParams() + ", mgmtPortgroup: " + managementPortGroup);
 
 		VmwareHypervisorHostNetworkSummary summary = new VmwareHypervisorHostNetworkSummary();
 
@@ -906,7 +906,7 @@ public class HostMO extends BaseMO implements VmwareHypervisorHost {
 	@Override
 	public ComputeResourceSummary getHyperHostHardwareSummary() throws Exception {
 	    if(s_logger.isTraceEnabled())
-			s_logger.trace("vCenter API trace - getHyperHostHardwareSummary(). target MOR: " + _mor.getValue());
+			s_logger.trace("vCenter API trace - getHyperHostHardwareSummary(). target MOR: " + _mor.getPresetParams());
 
 		//
 		// This is to adopt the model when using Cluster as a big host while ComputeResourceSummary is used

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5e6d2cf5/vmware-base/src/com/cloud/hypervisor/vmware/mo/HypervisorHostHelper.java
----------------------------------------------------------------------
diff --git a/vmware-base/src/com/cloud/hypervisor/vmware/mo/HypervisorHostHelper.java b/vmware-base/src/com/cloud/hypervisor/vmware/mo/HypervisorHostHelper.java
index 20f8478..7cabc8a 100755
--- a/vmware-base/src/com/cloud/hypervisor/vmware/mo/HypervisorHostHelper.java
+++ b/vmware-base/src/com/cloud/hypervisor/vmware/mo/HypervisorHostHelper.java
@@ -746,9 +746,9 @@ public class HypervisorHostHelper {
         averageBandwidth.setValue((long) networkRateMbps.intValue() * 1024L * 1024L);
         // We chose 50% higher allocation than average bandwidth.
         // TODO(sateesh): Also let user specify the peak coefficient
-        peakBandwidth.setValue((long) (averageBandwidth.getValue() * 1.5));
+        peakBandwidth.setValue((long) (averageBandwidth.getPresetParams() * 1.5));
         // TODO(sateesh): Also let user specify the burst coefficient
-        burstSize.setValue((long) (5 * averageBandwidth.getValue() / 8));
+        burstSize.setValue((long) (5 * averageBandwidth.getPresetParams() / 8));
 
         shapingPolicy.setEnabled(isEnabled);
         shapingPolicy.setAverageBandwidth(averageBandwidth);
@@ -892,14 +892,14 @@ public class HypervisorHostHelper {
             ManagedObjectReference morParent = hostMo.getParentMor();
             if(morParent != null && morParent.getType().equals("ClusterComputeResource")) {
                 // to be conservative, lock cluster
-                GlobalLock lock = GlobalLock.getInternLock("ClusterLock." + morParent.getValue());
+                GlobalLock lock = GlobalLock.getInternLock("ClusterLock." + morParent.getPresetParams());
                 try {
                     if(lock.lock(DEFAULT_LOCK_TIMEOUT_SECONDS)) {
                         try {
                             List<ManagedObjectReference> hosts = (List<ManagedObjectReference>)hostMo.getContext().getVimClient().getDynamicProperty(morParent, "host");
                             if(hosts != null) {
                                 for(ManagedObjectReference otherHost: hosts) {
-                                    if(!otherHost.getValue().equals(hostMo.getMor().getValue())) {
+                                    if(!otherHost.getPresetParams().equals(hostMo.getMor().getPresetParams())) {
                                         HostMO otherHostMo = new HostMO(hostMo.getContext(), otherHost);
                                         try {
                                             if(s_logger.isDebugEnabled())