You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by da...@apache.org on 2022/07/15 08:01:42 UTC
[cloudstack] branch main updated: add global setting to allow parallel execution on vmware (#6413)
This is an automated email from the ASF dual-hosted git repository.
dahn pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/cloudstack.git
The following commit(s) were added to refs/heads/main by this push:
new 731a83babf add global setting to allow parallel execution on vmware (#6413)
731a83babf is described below
commit 731a83babfb371b9ee9bb18af9bd33ade7f2c774
Author: dahn <da...@onecht.net>
AuthorDate: Fri Jul 15 10:01:35 2022 +0200
add global setting to allow parallel execution on vmware (#6413)
* add global setting to allow parallel execution on vmware
* cleanup setting distribution for vmware.create.full.clone
* query setting in vmware guru
* donĀ“t touch other hypervisor's commands
* guru hierarchy cleanup
---
.../java/com/cloud/hypervisor/HypervisorGuru.java | 4 +-
.../java/com/cloud/capacity/CapacityManager.java | 95 ++++++++++++++--------
.../java/com/cloud/storage/StorageManager.java | 38 +++++++++
.../com/cloud/vm/VirtualMachineManagerImpl.java | 3 +-
.../engine/orchestration/VolumeOrchestrator.java | 3 +-
.../cloud/vm/VirtualMachineManagerImplTest.java | 18 +++-
.../java/com/cloud/network/dao/NetworkDao.java | 4 -
.../storage/motion/AncientDataMotionStrategy.java | 3 +-
.../motion/AncientDataMotionStrategyTest.java | 2 +-
.../com/cloud/baremetal/manager/BareMetalGuru.java | 8 +-
.../cloud/hypervisor/hyperv/guru/HypervGuru.java | 4 +-
.../java/com/cloud/hypervisor/guru/VMwareGuru.java | 76 +++++++++--------
.../manager/CleanupFullyClonedTemplatesTask.java | 4 +-
.../vmware/manager/VmwareManagerImpl.java | 7 +-
.../java/com/cloud/hypervisor/XenServerGuru.java | 15 ++--
.../com/cloud/hypervisor/XenServerGuruTest.java | 31 +++++--
.../com/cloud/capacity/CapacityManagerImpl.java | 2 +-
.../main/java/com/cloud/configuration/Config.java | 8 --
.../com/cloud/hypervisor/HypervisorGuruBase.java | 22 +++--
.../main/java/com/cloud/hypervisor/KVMGuru.java | 12 +--
.../main/java/com/cloud/hypervisor/LXCGuru.java | 5 +-
.../java/com/cloud/storage/StorageManagerImpl.java | 4 +-
.../java/com/cloud/hypervisor/KVMGuruTest.java | 4 +-
23 files changed, 223 insertions(+), 149 deletions(-)
diff --git a/api/src/main/java/com/cloud/hypervisor/HypervisorGuru.java b/api/src/main/java/com/cloud/hypervisor/HypervisorGuru.java
index 96518ac176..c7dc0bba10 100644
--- a/api/src/main/java/com/cloud/hypervisor/HypervisorGuru.java
+++ b/api/src/main/java/com/cloud/hypervisor/HypervisorGuru.java
@@ -20,7 +20,6 @@ import java.util.List;
import java.util.Map;
import org.apache.cloudstack.backup.Backup;
-import org.apache.cloudstack.framework.config.ConfigKey;
import com.cloud.agent.api.Command;
import com.cloud.agent.api.to.NicTO;
@@ -35,8 +34,7 @@ import com.cloud.vm.VirtualMachine;
import com.cloud.vm.VirtualMachineProfile;
public interface HypervisorGuru extends Adapter {
- ConfigKey<Boolean> VmwareFullClone = new ConfigKey<Boolean>("Advanced", Boolean.class, "vmware.create.full.clone", "true",
- "If set to true, creates guest VMs as full clones on ESX", false);
+
HypervisorType getHypervisorType();
/**
diff --git a/engine/components-api/src/main/java/com/cloud/capacity/CapacityManager.java b/engine/components-api/src/main/java/com/cloud/capacity/CapacityManager.java
index 44de85edee..e9a37ae7f4 100644
--- a/engine/components-api/src/main/java/com/cloud/capacity/CapacityManager.java
+++ b/engine/components-api/src/main/java/com/cloud/capacity/CapacityManager.java
@@ -40,57 +40,86 @@ public interface CapacityManager {
static final String StorageCapacityDisableThresholdCK = "pool.storage.capacity.disablethreshold";
static final String StorageOverprovisioningFactorCK = "storage.overprovisioning.factor";
static final String StorageAllocatedCapacityDisableThresholdCK = "pool.storage.allocated.capacity.disablethreshold";
- static final String VmwareCreateCloneFullCK = "vmware.create.full.clone";
-
- static final ConfigKey<Float> CpuOverprovisioningFactor = new ConfigKey<Float>(Float.class, CpuOverprovisioningFactorCK, "Advanced", "1.0",
- "Used for CPU overprovisioning calculation; available CPU will be (actualCpuCapacity * cpu.overprovisioning.factor)", true, ConfigKey.Scope.Cluster, null);
- static final ConfigKey<Float> MemOverprovisioningFactor = new ConfigKey<Float>(Float.class, MemOverprovisioningFactorCK, "Advanced", "1.0",
- "Used for memory overprovisioning calculation", true, ConfigKey.Scope.Cluster, null);
- static final ConfigKey<Double> StorageCapacityDisableThreshold = new ConfigKey<Double>("Alert", Double.class, StorageCapacityDisableThresholdCK, "0.85",
- "Percentage (as a value between 0 and 1) of storage utilization above which allocators will disable using the pool for low storage available.", true,
- ConfigKey.Scope.Zone);
- static final ConfigKey<Double> StorageOverprovisioningFactor = new ConfigKey<Double>("Storage", Double.class, StorageOverprovisioningFactorCK, "2",
- "Used for storage overprovisioning calculation; available storage will be (actualStorageSize * storage.overprovisioning.factor)", true, ConfigKey.Scope.StoragePool);
+
+ static final String CATEGORY_ADVANCED = "Advanced";
+ static final String CATEGORY_ALERT = "Alert";
+
+ static final ConfigKey<Float> CpuOverprovisioningFactor =
+ new ConfigKey<>(
+ Float.class,
+ CpuOverprovisioningFactorCK,
+ CATEGORY_ADVANCED,
+ "1.0",
+ "Used for CPU overprovisioning calculation; available CPU will be (actualCpuCapacity * cpu.overprovisioning.factor)",
+ true,
+ ConfigKey.Scope.Cluster,
+ null);
+ static final ConfigKey<Float> MemOverprovisioningFactor =
+ new ConfigKey<>(
+ Float.class,
+ MemOverprovisioningFactorCK,
+ CATEGORY_ADVANCED,
+ "1.0",
+ "Used for memory overprovisioning calculation",
+ true,
+ ConfigKey.Scope.Cluster,
+ null);
+ static final ConfigKey<Double> StorageCapacityDisableThreshold =
+ new ConfigKey<>(
+ CATEGORY_ALERT,
+ Double.class,
+ StorageCapacityDisableThresholdCK,
+ "0.85",
+ "Percentage (as a value between 0 and 1) of storage utilization above which allocators will disable using the pool for low storage available.",
+ true,
+ ConfigKey.Scope.Zone);
+ static final ConfigKey<Double> StorageOverprovisioningFactor =
+ new ConfigKey<>(
+ "Storage",
+ Double.class,
+ StorageOverprovisioningFactorCK,
+ "2",
+ "Used for storage overprovisioning calculation; available storage will be (actualStorageSize * storage.overprovisioning.factor)",
+ true,
+ ConfigKey.Scope.StoragePool);
static final ConfigKey<Double> StorageAllocatedCapacityDisableThreshold =
- new ConfigKey<Double>(
- "Alert",
- Double.class,
- StorageAllocatedCapacityDisableThresholdCK,
- "0.85",
- "Percentage (as a value between 0 and 1) of allocated storage utilization above which allocators will disable using the pool for low allocated storage available.",
- true, ConfigKey.Scope.Zone);
+ new ConfigKey<>(
+ CATEGORY_ALERT,
+ Double.class,
+ StorageAllocatedCapacityDisableThresholdCK,
+ "0.85",
+ "Percentage (as a value between 0 and 1) of allocated storage utilization above which allocators will disable using the pool for low allocated storage available.",
+ true,
+ ConfigKey.Scope.Zone);
static final ConfigKey<Boolean> StorageOperationsExcludeCluster =
- new ConfigKey<Boolean>(
+ new ConfigKey<>(
Boolean.class,
"cluster.storage.operations.exclude",
- "Advanced",
+ CATEGORY_ADVANCED,
"false",
"Exclude cluster from storage operations",
true,
ConfigKey.Scope.Cluster,
null);
- static final ConfigKey<Boolean> VmwareCreateCloneFull =
- new ConfigKey<Boolean>(
- "Storage",
- Boolean.class,
- VmwareCreateCloneFullCK,
- "false",
- "If set to true, creates VMs as full clones on ESX hypervisor",
- true,
- ConfigKey.Scope.StoragePool);
static final ConfigKey<String> ImageStoreNFSVersion =
- new ConfigKey<String>(
+ new ConfigKey<>(
String.class,
"secstorage.nfs.version",
- "Advanced",
+ CATEGORY_ADVANCED,
null,
"Enforces specific NFS version when mounting Secondary Storage. If NULL default selection is performed",
true,
ConfigKey.Scope.ImageStore,
null);
- static final ConfigKey<Float> SecondaryStorageCapacityThreshold = new ConfigKey<Float>("Advanced", Float.class, "secondary.storage.capacity.threshold", "0.90",
- "Percentage (as a value between 0 and 1) of secondary storage capacity threshold.", true);
+ static final ConfigKey<Float> SecondaryStorageCapacityThreshold =
+ new ConfigKey<>(
+ CATEGORY_ADVANCED,
+ Float.class,
+ "secondary.storage.capacity.threshold",
+ "0.90",
+ "Percentage (as a value between 0 and 1) of secondary storage capacity threshold.",
+ true);
public boolean releaseVmCapacity(VirtualMachine vm, boolean moveFromReserved, boolean moveToReservered, Long hostId);
diff --git a/engine/components-api/src/main/java/com/cloud/storage/StorageManager.java b/engine/components-api/src/main/java/com/cloud/storage/StorageManager.java
index 1b69d72300..130b160776 100644
--- a/engine/components-api/src/main/java/com/cloud/storage/StorageManager.java
+++ b/engine/components-api/src/main/java/com/cloud/storage/StorageManager.java
@@ -163,6 +163,44 @@ public interface StorageManager extends StorageService {
true,
ConfigKey.Scope.Cluster,
null);
+ ConfigKey<Boolean> VmwareCreateCloneFull = new ConfigKey<>(Boolean.class,
+ "vmware.create.full.clone",
+ "Storage",
+ "false",
+ "If set to true, creates VMs as full clones on ESX hypervisor",
+ true,
+ ConfigKey.Scope.StoragePool,
+ null);
+ ConfigKey<Boolean> VmwareAllowParallelExecution = new ConfigKey<>(Boolean.class,
+ "vmware.allow.parallel.command.execution",
+ "Advanced",
+ "false",
+ "allow commands to be executed in parallel in spite of 'vmware.create.full.clone' being set to true.",
+ true,
+ ConfigKey.Scope.Global,
+ null);
+
+ /**
+ * should we execute in sequence not involving any storages?
+ * @return tru if commands should execute in sequence
+ */
+ static boolean shouldExecuteInSequenceOnVmware() {
+ return shouldExecuteInSequenceOnVmware(null, null);
+ }
+
+ static boolean shouldExecuteInSequenceOnVmware(Long srcStoreId, Long dstStoreId) {
+ final Boolean fullClone = getFullCloneConfiguration(srcStoreId) || getFullCloneConfiguration(dstStoreId);
+ final Boolean allowParallel = getAllowParallelExecutionConfiguration();
+ return fullClone && !allowParallel;
+ }
+
+ static Boolean getAllowParallelExecutionConfiguration() {
+ return VmwareAllowParallelExecution.value();
+ }
+
+ static Boolean getFullCloneConfiguration(Long storeId) {
+ return VmwareCreateCloneFull.valueIn(storeId);
+ }
/**
* Returns a comma separated list of tags for the specified storage pool
diff --git a/engine/orchestration/src/main/java/com/cloud/vm/VirtualMachineManagerImpl.java b/engine/orchestration/src/main/java/com/cloud/vm/VirtualMachineManagerImpl.java
index 64e4ad8915..a1831a5cac 100755
--- a/engine/orchestration/src/main/java/com/cloud/vm/VirtualMachineManagerImpl.java
+++ b/engine/orchestration/src/main/java/com/cloud/vm/VirtualMachineManagerImpl.java
@@ -1557,8 +1557,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
case LXC:
return false;
case VMware:
- final Boolean fullClone = HypervisorGuru.VmwareFullClone.value();
- return fullClone;
+ return StorageManager.shouldExecuteInSequenceOnVmware();
default:
return ExecuteInSequence.value();
}
diff --git a/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/VolumeOrchestrator.java b/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/VolumeOrchestrator.java
index 476ecf23cb..4cd4d786c7 100644
--- a/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/VolumeOrchestrator.java
+++ b/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/VolumeOrchestrator.java
@@ -85,7 +85,6 @@ import com.cloud.agent.api.to.DatadiskTO;
import com.cloud.agent.api.to.DiskTO;
import com.cloud.agent.api.to.VirtualMachineTO;
import com.cloud.agent.manager.allocator.PodAllocator;
-import com.cloud.capacity.CapacityManager;
import com.cloud.cluster.ClusterManager;
import com.cloud.configuration.Resource.ResourceType;
import com.cloud.dc.DataCenter;
@@ -1704,7 +1703,7 @@ public class VolumeOrchestrator extends ManagerBase implements VolumeOrchestrati
if (vm.getHypervisorType().equals(HypervisorType.VMware)) {
// retrieve clone flag.
UserVmCloneType cloneType = UserVmCloneType.linked;
- Boolean value = CapacityManager.VmwareCreateCloneFull.valueIn(vol.getPoolId());
+ Boolean value = StorageManager.VmwareCreateCloneFull.valueIn(vol.getPoolId());
if (value != null && value) {
cloneType = UserVmCloneType.full;
}
diff --git a/engine/orchestration/src/test/java/com/cloud/vm/VirtualMachineManagerImplTest.java b/engine/orchestration/src/test/java/com/cloud/vm/VirtualMachineManagerImplTest.java
index 86b0ea4a96..cb3a6b77b8 100644
--- a/engine/orchestration/src/test/java/com/cloud/vm/VirtualMachineManagerImplTest.java
+++ b/engine/orchestration/src/test/java/com/cloud/vm/VirtualMachineManagerImplTest.java
@@ -32,6 +32,7 @@ import java.util.List;
import java.util.Map;
import com.cloud.exception.InvalidParameterValueException;
+import com.cloud.storage.StorageManager;
import org.apache.cloudstack.engine.subsystem.api.storage.StoragePoolAllocator;
import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
@@ -56,7 +57,6 @@ import com.cloud.deploy.DeploymentPlanner;
import com.cloud.deploy.DeploymentPlanner.ExcludeList;
import com.cloud.host.HostVO;
import com.cloud.hypervisor.Hypervisor.HypervisorType;
-import com.cloud.hypervisor.HypervisorGuru;
import com.cloud.service.ServiceOfferingVO;
import com.cloud.service.dao.ServiceOfferingDao;
import com.cloud.storage.DiskOfferingVO;
@@ -209,9 +209,23 @@ public class VirtualMachineManagerImplTest {
public void testExeceuteInSequence() {
assertTrue(virtualMachineManagerImpl.getExecuteInSequence(HypervisorType.XenServer) == false);
assertTrue(virtualMachineManagerImpl.getExecuteInSequence(HypervisorType.KVM) == false);
- assertTrue(virtualMachineManagerImpl.getExecuteInSequence(HypervisorType.VMware) == HypervisorGuru.VmwareFullClone.value());
assertTrue(virtualMachineManagerImpl.getExecuteInSequence(HypervisorType.Ovm3) == VirtualMachineManager.ExecuteInSequence.value());
}
+ @Test
+ public void testExeceuteInSequenceVmware() {
+ when(StorageManager.getFullCloneConfiguration(anyLong())).thenReturn(Boolean.FALSE);
+ when(StorageManager.getAllowParallelExecutionConfiguration()).thenReturn(Boolean.FALSE);
+ assertFalse("no full clones so no need to execute in sequence", virtualMachineManagerImpl.getExecuteInSequence(HypervisorType.VMware));
+ when(StorageManager.getFullCloneConfiguration(anyLong())).thenReturn(Boolean.TRUE);
+ when(StorageManager.getAllowParallelExecutionConfiguration()).thenReturn(Boolean.FALSE);
+ assertTrue("full clones and no explicit parallel execution allowed, should execute in sequence", virtualMachineManagerImpl.getExecuteInSequence(HypervisorType.VMware));
+ when(StorageManager.getFullCloneConfiguration(anyLong())).thenReturn(Boolean.TRUE);
+ when(StorageManager.getAllowParallelExecutionConfiguration()).thenReturn(Boolean.TRUE);
+ assertFalse("execute in sequence should not be needed as parallel is allowed", virtualMachineManagerImpl.getExecuteInSequence(HypervisorType.VMware));
+ when(StorageManager.getFullCloneConfiguration(anyLong())).thenReturn(Boolean.FALSE);
+ when(StorageManager.getAllowParallelExecutionConfiguration()).thenReturn(Boolean.TRUE);
+ assertFalse("double reasons to allow parallel execution", virtualMachineManagerImpl.getExecuteInSequence(HypervisorType.VMware));
+ }
@Test
public void testCheckIfCanUpgrade() throws Exception {
diff --git a/engine/schema/src/main/java/com/cloud/network/dao/NetworkDao.java b/engine/schema/src/main/java/com/cloud/network/dao/NetworkDao.java
index dfd2a046bb..0861a424eb 100644
--- a/engine/schema/src/main/java/com/cloud/network/dao/NetworkDao.java
+++ b/engine/schema/src/main/java/com/cloud/network/dao/NetworkDao.java
@@ -47,10 +47,6 @@ public interface NetworkDao extends GenericDao<NetworkVO, Long>, StateDao<State,
int getOtherPersistentNetworksCount(long id, String broadcastURI, boolean isPersistent);
- @Override
- @Deprecated
- NetworkVO persist(NetworkVO vo);
-
/**
* Retrieves the next available mac address in this network configuration.
*
diff --git a/engine/storage/datamotion/src/main/java/org/apache/cloudstack/storage/motion/AncientDataMotionStrategy.java b/engine/storage/datamotion/src/main/java/org/apache/cloudstack/storage/motion/AncientDataMotionStrategy.java
index a49612138a..2639968f26 100644
--- a/engine/storage/datamotion/src/main/java/org/apache/cloudstack/storage/motion/AncientDataMotionStrategy.java
+++ b/engine/storage/datamotion/src/main/java/org/apache/cloudstack/storage/motion/AncientDataMotionStrategy.java
@@ -62,7 +62,6 @@ import com.cloud.agent.api.to.DataStoreTO;
import com.cloud.agent.api.to.DataTO;
import com.cloud.agent.api.to.NfsTO;
import com.cloud.agent.api.to.VirtualMachineTO;
-import com.cloud.capacity.CapacityManager;
import com.cloud.configuration.Config;
import com.cloud.host.Host;
import com.cloud.hypervisor.Hypervisor;
@@ -226,7 +225,7 @@ public class AncientDataMotionStrategy implements DataMotionStrategy {
DataStoreTO dataStoreTO = dataTO.getDataStore();
if (dataStoreTO != null && dataStoreTO instanceof PrimaryDataStoreTO){
PrimaryDataStoreTO primaryDataStoreTO = (PrimaryDataStoreTO) dataStoreTO;
- primaryDataStoreTO.setFullCloneFlag(CapacityManager.VmwareCreateCloneFull.valueIn(primaryDataStoreTO.getId()));
+ primaryDataStoreTO.setFullCloneFlag(StorageManager.VmwareCreateCloneFull.valueIn(primaryDataStoreTO.getId()));
StoragePool pool = storageManager.getStoragePool(primaryDataStoreTO.getId());
primaryDataStoreTO.setDiskProvisioningStrictnessFlag(storageManager.DiskProvisioningStrictness.valueIn(pool.getDataCenterId()));
}
diff --git a/engine/storage/datamotion/src/test/java/org/apache/cloudstack/storage/motion/AncientDataMotionStrategyTest.java b/engine/storage/datamotion/src/test/java/org/apache/cloudstack/storage/motion/AncientDataMotionStrategyTest.java
index cd46fc511f..92b6b5b225 100755
--- a/engine/storage/datamotion/src/test/java/org/apache/cloudstack/storage/motion/AncientDataMotionStrategyTest.java
+++ b/engine/storage/datamotion/src/test/java/org/apache/cloudstack/storage/motion/AncientDataMotionStrategyTest.java
@@ -82,7 +82,7 @@ public class AncientDataMotionStrategyTest {
}
private void replaceVmwareCreateCloneFullField() throws Exception {
- Field field = CapacityManager.class.getDeclaredField("VmwareCreateCloneFull");
+ Field field = StorageManager.class.getDeclaredField("VmwareCreateCloneFull");
field.setAccessible(true);
// remove final modifier from field
Field modifiersField = Field.class.getDeclaredField("modifiers");
diff --git a/plugins/hypervisors/baremetal/src/main/java/com/cloud/baremetal/manager/BareMetalGuru.java b/plugins/hypervisors/baremetal/src/main/java/com/cloud/baremetal/manager/BareMetalGuru.java
index 3213198e3f..f82ad489b8 100644
--- a/plugins/hypervisors/baremetal/src/main/java/com/cloud/baremetal/manager/BareMetalGuru.java
+++ b/plugins/hypervisors/baremetal/src/main/java/com/cloud/baremetal/manager/BareMetalGuru.java
@@ -30,7 +30,6 @@ import javax.inject.Inject;
import org.apache.log4j.Logger;
import com.cloud.agent.api.to.VirtualMachineTO;
-import com.cloud.host.dao.HostDao;
import com.cloud.hypervisor.Hypervisor.HypervisorType;
import com.cloud.hypervisor.HypervisorGuru;
import com.cloud.hypervisor.HypervisorGuruBase;
@@ -38,16 +37,11 @@ import com.cloud.storage.GuestOSVO;
import com.cloud.storage.dao.GuestOSDao;
import com.cloud.vm.VMInstanceVO;
import com.cloud.vm.VirtualMachineProfile;
-import com.cloud.vm.dao.VMInstanceDao;
public class BareMetalGuru extends HypervisorGuruBase implements HypervisorGuru {
private static final Logger s_logger = Logger.getLogger(BareMetalGuru.class);
@Inject
GuestOSDao _guestOsDao;
- @Inject
- HostDao _hostDao;
- @Inject
- VMInstanceDao _vmDao;
protected BareMetalGuru() {
super();
@@ -62,7 +56,7 @@ public class BareMetalGuru extends HypervisorGuruBase implements HypervisorGuru
public VirtualMachineTO implement(VirtualMachineProfile vm) {
VirtualMachineTO to = toVirtualMachineTO(vm);
- VMInstanceVO vo = _vmDao.findById(vm.getId());
+ VMInstanceVO vo = virtualMachineDao.findById(vm.getId());
if (vo.getLastHostId() == null) {
to.setBootArgs(BaremetalManager.DO_PXE);
}
diff --git a/plugins/hypervisors/hyperv/src/main/java/com/cloud/hypervisor/hyperv/guru/HypervGuru.java b/plugins/hypervisors/hyperv/src/main/java/com/cloud/hypervisor/hyperv/guru/HypervGuru.java
index 716fdc2289..9c586619b2 100644
--- a/plugins/hypervisors/hyperv/src/main/java/com/cloud/hypervisor/hyperv/guru/HypervGuru.java
+++ b/plugins/hypervisors/hyperv/src/main/java/com/cloud/hypervisor/hyperv/guru/HypervGuru.java
@@ -34,7 +34,6 @@ import com.cloud.hypervisor.hyperv.manager.HypervManager;
import com.cloud.network.NetworkModel;
import com.cloud.network.Networks.BroadcastDomainType;
import com.cloud.network.Networks.TrafficType;
-import com.cloud.network.dao.NetworkDao;
import com.cloud.network.dao.NetworkVO;
import com.cloud.storage.GuestOSVO;
import com.cloud.storage.dao.GuestOSDao;
@@ -51,7 +50,6 @@ public class HypervGuru extends HypervisorGuruBase implements HypervisorGuru {
@Inject
private GuestOSDao _guestOsDao;
@Inject HypervManager _hypervMgr;
- @Inject NetworkDao _networkDao;
@Inject NetworkModel _networkMgr;
int MaxNicSupported = 8;
@Override
@@ -109,7 +107,7 @@ public class HypervGuru extends HypervisorGuruBase implements HypervisorGuru {
profile = controlNicProfile;
}
- NetworkVO network = _networkDao.findById(networkId);
+ NetworkVO network = networkDao.findById(networkId);
// for Hyperv Hot Nic plug is not supported and it will support upto 8 nics.
// creating the VR with extra nics (actual nics(3) + extra nics) will be 8
for(; i < MaxNicSupported; i++) {
diff --git a/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/guru/VMwareGuru.java b/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/guru/VMwareGuru.java
index 5d29be9ebc..70e068e76b 100644
--- a/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/guru/VMwareGuru.java
+++ b/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/guru/VMwareGuru.java
@@ -27,6 +27,7 @@ import java.util.UUID;
import javax.inject.Inject;
+import com.cloud.storage.StorageManager;
import com.cloud.storage.StoragePoolHostVO;
import com.cloud.storage.dao.StoragePoolHostDao;
import org.apache.cloudstack.acl.ControlledEntity;
@@ -78,7 +79,6 @@ import com.cloud.event.UsageEventUtils;
import com.cloud.exception.InvalidParameterValueException;
import com.cloud.host.Host;
import com.cloud.host.HostVO;
-import com.cloud.host.dao.HostDao;
import com.cloud.host.dao.HostDetailsDao;
import com.cloud.hypervisor.Hypervisor.HypervisorType;
import com.cloud.hypervisor.HypervisorGuru;
@@ -99,7 +99,6 @@ import com.cloud.network.Network;
import com.cloud.network.Networks;
import com.cloud.network.Networks.BroadcastDomainType;
import com.cloud.network.Networks.TrafficType;
-import com.cloud.network.dao.NetworkDao;
import com.cloud.network.dao.NetworkVO;
import com.cloud.network.dao.PhysicalNetworkDao;
import com.cloud.network.dao.PhysicalNetworkTrafficTypeDao;
@@ -108,7 +107,6 @@ import com.cloud.network.dao.PhysicalNetworkVO;
import com.cloud.secstorage.CommandExecLogDao;
import com.cloud.secstorage.CommandExecLogVO;
import com.cloud.service.ServiceOfferingVO;
-import com.cloud.service.dao.ServiceOfferingDao;
import com.cloud.storage.DataStoreRole;
import com.cloud.storage.DiskOfferingVO;
import com.cloud.storage.GuestOSVO;
@@ -140,9 +138,7 @@ import com.cloud.vm.VirtualMachine;
import com.cloud.vm.VirtualMachine.Type;
import com.cloud.vm.VirtualMachineManager;
import com.cloud.vm.VirtualMachineProfile;
-import com.cloud.vm.dao.NicDao;
import com.cloud.vm.dao.UserVmDao;
-import com.cloud.vm.dao.VMInstanceDao;
import com.google.gson.Gson;
import com.vmware.vim25.ManagedObjectReference;
import com.vmware.vim25.VirtualDevice;
@@ -160,18 +156,13 @@ public class VMwareGuru extends HypervisorGuruBase implements HypervisorGuru, Co
@Inject VmwareVmImplementer vmwareVmImplementer;
-
- @Inject NetworkDao _networkDao;
@Inject GuestOSDao _guestOsDao;
- @Inject HostDao _hostDao;
@Inject HostDetailsDao _hostDetailsDao;
@Inject ClusterDetailsDao _clusterDetailsDao;
@Inject CommandExecLogDao _cmdExecLogDao;
@Inject VmwareManager _vmwareMgr;
@Inject SecondaryStorageVmManager _secStorageMgr;
- @Inject NicDao _nicDao;
@Inject PhysicalNetworkTrafficTypeDao _physicalNetworkTrafficTypeDao;
- @Inject VMInstanceDao _vmDao;
@Inject VirtualMachineManager vmManager;
@Inject ClusterManager _clusterMgr;
@Inject VolumeDao _volumeDao;
@@ -180,7 +171,6 @@ public class VMwareGuru extends HypervisorGuruBase implements HypervisorGuru, Co
@Inject VolumeDataFactory _volFactory;
@Inject VmwareDatacenterDao vmwareDatacenterDao;
@Inject VmwareDatacenterZoneMapDao vmwareDatacenterZoneMapDao;
- @Inject ServiceOfferingDao serviceOfferingDao;
@Inject VMTemplatePoolDao templateStoragePoolDao;
@Inject VMTemplateDao vmTemplateDao;
@Inject UserVmDao userVmDao;
@@ -215,11 +205,14 @@ public class VMwareGuru extends HypervisorGuruBase implements HypervisorGuru, Co
}
@Override @DB public Pair<Boolean, Long> getCommandHostDelegation(long hostId, Command cmd) {
+ if (s_logger.isTraceEnabled()) {
+ s_logger.trace(String.format("Finding delegation for command of type %s to host %d.", cmd.getClass(), hostId));
+ }
+
boolean needDelegation = false;
if (cmd instanceof StorageSubSystemCommand) {
- Boolean fullCloneEnabled = VmwareFullClone.value();
StorageSubSystemCommand c = (StorageSubSystemCommand)cmd;
- c.setExecuteInSequence(fullCloneEnabled);
+ c.setExecuteInSequence(StorageManager.shouldExecuteInSequenceOnVmware());
}
if (cmd instanceof DownloadCommand) {
cmd.setContextParam(VmwareManager.s_vmwareOVAPackageTimeout.key(), String.valueOf(VmwareManager.s_vmwareOVAPackageTimeout.value()));
@@ -234,11 +227,7 @@ public class VMwareGuru extends HypervisorGuruBase implements HypervisorGuru, Co
DataStoreTO destStoreTO = destData.getDataStore();
boolean inSeq = true;
- if ((srcData.getObjectType() == DataObjectType.SNAPSHOT) || (destData.getObjectType() == DataObjectType.SNAPSHOT)) {
- inSeq = false;
- } else if ((destStoreTO.getRole() == DataStoreRole.Image) || (destStoreTO.getRole() == DataStoreRole.ImageCache)) {
- inSeq = false;
- } else if (!VmwareFullClone.value()) {
+ if (parallelExecutionAllowed(srcData, destData, srcStoreTO, destStoreTO)) {
inSeq = false;
}
cpyCommand.setExecuteInSequence(inSeq);
@@ -273,10 +262,15 @@ public class VMwareGuru extends HypervisorGuruBase implements HypervisorGuru, Co
}
}
+ if (s_logger.isTraceEnabled()) {
+ s_logger.trace(String.format("Command of type %s is going to be executed in sequence? %b", cmd.getClass(), cmd.executeInSequence()));
+ s_logger.trace(String.format("Command of type %s is going to need delegation? %b", cmd.getClass(), needDelegation));
+ }
+
if (!needDelegation) {
return new Pair<Boolean, Long>(Boolean.FALSE, new Long(hostId));
}
- HostVO host = _hostDao.findById(hostId);
+ HostVO host = hostDao.findById(hostId);
long dcId = host.getDataCenterId();
Pair<HostVO, SecondaryStorageVmVO> cmdTarget = _secStorageMgr.assignSecStorageVm(dcId, cmd);
if (cmdTarget != null) {
@@ -322,6 +316,16 @@ public class VMwareGuru extends HypervisorGuruBase implements HypervisorGuru, Co
return new Pair<Boolean, Long>(Boolean.FALSE, new Long(hostId));
}
+ private boolean parallelExecutionAllowed(DataTO srcData, DataTO destData, DataStoreTO srcStoreTO, DataStoreTO destStoreTO) {
+ Long srcId = srcStoreTO == null || srcStoreTO.getUuid() == null ? null : _storagePoolDao.findByUuid(srcStoreTO.getUuid()).getId();
+ Long dstId = destStoreTO == null || destStoreTO.getUuid() == null ? null : _storagePoolDao.findByUuid(destStoreTO.getUuid()).getId();
+ return (srcData.getObjectType() == DataObjectType.SNAPSHOT)
+ || (destData.getObjectType() == DataObjectType.SNAPSHOT)
+ || (destStoreTO != null && destStoreTO.getRole() == DataStoreRole.Image)
+ || (destStoreTO != null && destStoreTO.getRole() == DataStoreRole.ImageCache)
+ || !StorageManager.shouldExecuteInSequenceOnVmware(srcId, dstId);
+ }
+
@Override
public boolean trackVmHostChange() {
return true;
@@ -345,12 +349,12 @@ public class VMwareGuru extends HypervisorGuruBase implements HypervisorGuru, Co
@Override public List<Command> finalizeExpungeNics(VirtualMachine vm, List<NicProfile> nics) {
List<Command> commands = new ArrayList<Command>();
- List<NicVO> nicVOs = _nicDao.listByVmId(vm.getId());
+ List<NicVO> nicVOs = nicDao.listByVmId(vm.getId());
for (NicVO nic : nicVOs) {
- NetworkVO network = _networkDao.findById(nic.getNetworkId());
+ NetworkVO network = networkDao.findById(nic.getNetworkId());
if (network.getBroadcastDomainType() == BroadcastDomainType.Lswitch) {
s_logger.debug("Nic " + nic.toString() + " is connected to an lswitch, cleanup required");
- NetworkVO networkVO = _networkDao.findById(nic.getNetworkId());
+ NetworkVO networkVO = networkDao.findById(nic.getNetworkId());
// We need the traffic label to figure out which vSwitch has the
// portgroup
PhysicalNetworkTrafficTypeVO trafficTypeVO = _physicalNetworkTrafficTypeDao.findBy(networkVO.getPhysicalNetworkId(), networkVO.getTrafficType());
@@ -488,7 +492,7 @@ public class VMwareGuru extends HypervisorGuruBase implements HypervisorGuru, Co
}
VolumeVO volumeVO = disksMapping.get(disk);
if (volumeVO == null) {
- final VMInstanceVO vm = _vmDao.findByIdIncludingRemoved(backup.getVmId());
+ final VMInstanceVO vm = virtualMachineDao.findByIdIncludingRemoved(backup.getVmId());
if (vm == null) {
throw new CloudRuntimeException("Failed to find the volumes details from the VM backup");
}
@@ -655,18 +659,18 @@ public class VMwareGuru extends HypervisorGuruBase implements HypervisorGuru, Co
private VMInstanceVO getVM(String vmInternalName, long templateId, long guestOsId, long serviceOfferingId, long zoneId, long accountId, long userId, long domainId) {
s_logger.debug(String.format("Trying to get VM with specs: [vmInternalName: %s, templateId: %s, guestOsId: %s, serviceOfferingId: %s].", vmInternalName,
templateId, guestOsId, serviceOfferingId));
- VMInstanceVO vm = _vmDao.findVMByInstanceNameIncludingRemoved(vmInternalName);
+ VMInstanceVO vm = virtualMachineDao.findVMByInstanceNameIncludingRemoved(vmInternalName);
if (vm != null) {
s_logger.debug(String.format("Found an existing VM [id: %s, removed: %s] with internalName: [%s].", vm.getUuid(), vm.getRemoved() != null ? "yes" : "no", vmInternalName));
vm.setState(VirtualMachine.State.Stopped);
vm.setPowerState(VirtualMachine.PowerState.PowerOff);
- _vmDao.update(vm.getId(), vm);
+ virtualMachineDao.update(vm.getId(), vm);
if (vm.getRemoved() != null) {
- _vmDao.unremove(vm.getId());
+ virtualMachineDao.unremove(vm.getId());
UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VM_CREATE, accountId, vm.getDataCenterId(), vm.getId(), vm.getHostName(), vm.getServiceOfferingId(), vm.getTemplateId(),
vm.getHypervisorType().toString(), VirtualMachine.class.getName(), vm.getUuid(), vm.isDisplayVm());
}
- return _vmDao.findById(vm.getId());
+ return virtualMachineDao.findById(vm.getId());
} else {
long id = userVmDao.getNextInSequence(Long.class, "id");
s_logger.debug(String.format("Can't find an existing VM with internalName: [%s]. Creating a new VM with: [id: %s, name: %s, templateId: %s, guestOsId: %s, serviceOfferingId: %s].",
@@ -783,7 +787,7 @@ public class VMwareGuru extends HypervisorGuruBase implements HypervisorGuru, Co
}
private VolumeVO createVolume(VirtualDisk disk, VirtualMachineMO vmToImport, long domainId, long zoneId, long accountId, long instanceId, Long poolId, long templateId, Backup backup, boolean isImport) throws Exception {
- VMInstanceVO vm = _vmDao.findByIdIncludingRemoved(backup.getVmId());
+ VMInstanceVO vm = virtualMachineDao.findByIdIncludingRemoved(backup.getVmId());
if (vm == null) {
throw new CloudRuntimeException("Failed to find the backup volume information from the VM backup");
}
@@ -832,13 +836,13 @@ public class VMwareGuru extends HypervisorGuruBase implements HypervisorGuru, Co
*/
private NetworkVO createNetworkRecord(Long zoneId, String tag, String vlan, long accountId, long domainId) {
Long physicalNetworkId = getPhysicalNetworkId(zoneId, tag);
- final long id = _networkDao.getNextInSequence(Long.class, "id");
+ final long id = networkDao.getNextInSequence(Long.class, "id");
NetworkVO networkVO = new NetworkVO(id, TrafficType.Guest, Networks.Mode.Dhcp, BroadcastDomainType.Vlan, 9L, domainId, accountId, id, "Imported-network-" + id,
"Imported-network-" + id, null, Network.GuestType.Isolated, zoneId, physicalNetworkId, ControlledEntity.ACLType.Account, false, null, false);
networkVO.setBroadcastUri(BroadcastDomainType.Vlan.toUri(vlan));
networkVO.setGuruName("ExternalGuestNetworkGuru");
networkVO.setState(Network.State.Implemented);
- return _networkDao.persist(networkVO);
+ return networkDao.persist(networkVO);
}
/**
@@ -852,7 +856,7 @@ public class VMwareGuru extends HypervisorGuruBase implements HypervisorGuru, Co
String tag = parts[parts.length - 1];
String[] tagSplit = tag.split("-");
tag = tagSplit[tagSplit.length - 1];
- NetworkVO networkVO = _networkDao.findByVlan(vlan);
+ NetworkVO networkVO = networkDao.findByVlan(vlan);
if (networkVO == null) {
networkVO = createNetworkRecord(zoneId, tag, vlan, accountId, domainId);
}
@@ -894,13 +898,13 @@ public class VMwareGuru extends HypervisorGuruBase implements HypervisorGuru, Co
private void syncVMNics(VirtualDevice[] nicDevices, DatacenterMO dcMo, Map<String, NetworkVO> networksMapping, VMInstanceVO vm) throws Exception {
VmwareContext context = dcMo.getContext();
- List<NicVO> allNics = _nicDao.listByVmId(vm.getId());
+ List<NicVO> allNics = nicDao.listByVmId(vm.getId());
for (VirtualDevice nicDevice : nicDevices) {
Pair<String, String> pair = getNicMacAddressAndNetworkName(nicDevice, context);
String macAddress = pair.first();
String networkName = pair.second();
NetworkVO networkVO = networksMapping.get(networkName);
- NicVO nicVO = _nicDao.findByNetworkIdAndMacAddress(networkVO.getId(), macAddress);
+ NicVO nicVO = nicDao.findByNetworkIdAndMacAddress(networkVO.getId(), macAddress);
if (nicVO != null) {
allNics.remove(nicVO);
}
@@ -911,7 +915,7 @@ public class VMwareGuru extends HypervisorGuruBase implements HypervisorGuru, Co
}
private Map<VirtualDisk, VolumeVO> getDisksMapping(Backup backup, List<VirtualDisk> virtualDisks) {
- final VMInstanceVO vm = _vmDao.findByIdIncludingRemoved(backup.getVmId());
+ final VMInstanceVO vm = virtualMachineDao.findByIdIncludingRemoved(backup.getVmId());
if (vm == null) {
throw new CloudRuntimeException("Failed to find the volumes details from the VM backup");
}
@@ -1076,7 +1080,7 @@ public class VMwareGuru extends HypervisorGuruBase implements HypervisorGuru, Co
private String getHostGuidForLocalStorage(StoragePool pool) {
List<StoragePoolHostVO> storagePoolHostVOs = storagePoolHostDao.listByPoolId(pool.getId());
StoragePoolHostVO storagePoolHostVO = storagePoolHostVOs.get(0);
- HostVO hostVO = _hostDao.findById(storagePoolHostVO.getHostId());
+ HostVO hostVO = hostDao.findById(storagePoolHostVO.getHostId());
return hostVO.getGuid();
}
@@ -1087,7 +1091,7 @@ public class VMwareGuru extends HypervisorGuruBase implements HypervisorGuru, Co
// Without host vMotion might fail between non-shared storages with error similar to,
// https://kb.vmware.com/s/article/1003795
// As this is offline migration VM won't be started on this host
- List<HostVO> hosts = _hostDao.findHypervisorHostInCluster(destClusterId);
+ List<HostVO> hosts = hostDao.findHypervisorHostInCluster(destClusterId);
if (CollectionUtils.isNotEmpty(hosts)) {
hostInTargetCluster = hosts.get(0);
}
diff --git a/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/manager/CleanupFullyClonedTemplatesTask.java b/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/manager/CleanupFullyClonedTemplatesTask.java
index 41bbcb027a..1437e057b8 100644
--- a/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/manager/CleanupFullyClonedTemplatesTask.java
+++ b/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/manager/CleanupFullyClonedTemplatesTask.java
@@ -19,7 +19,7 @@ package com.cloud.hypervisor.vmware.manager;
import com.cloud.api.query.dao.TemplateJoinDao;
import com.cloud.api.query.vo.TemplateJoinVO;
import com.cloud.hypervisor.Hypervisor;
-import com.cloud.hypervisor.HypervisorGuru;
+import com.cloud.storage.StorageManager;
import com.cloud.storage.VMTemplateStoragePoolVO;
import com.cloud.storage.dao.VMTemplatePoolDao;
import com.cloud.template.TemplateManager;
@@ -74,7 +74,7 @@ public class CleanupFullyClonedTemplatesTask extends ManagedContextRunnable {
mine = Thread.currentThread();
s_logger.info("running job to mark fully cloned templates for gc in thread " + mine.getName());
- if (HypervisorGuru.VmwareFullClone.value()) { // only run if full cloning is being used (might need to be more fine grained)
+ if (StorageManager.VmwareCreateCloneFull.value()) { // only run if full cloning is being used (might need to be more fine grained)
try {
queryAllPools();
} catch (Throwable t) {
diff --git a/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java b/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java
index 44702dca11..d9a01203a0 100644
--- a/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java
+++ b/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java
@@ -331,12 +331,7 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw
_storage.configure("StorageLayer", params);
}
- value = _configDao.getValue(Config.VmwareCreateFullClone.key());
- if (value == null) {
- _fullCloneFlag = false;
- } else {
- _fullCloneFlag = Boolean.parseBoolean(value);
- }
+ _fullCloneFlag = StorageManager.VmwareCreateCloneFull.value();
value = _configDao.getValue(Config.SetVmInternalNameUsingDisplayName.key());
if (value == null) {
diff --git a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/XenServerGuru.java b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/XenServerGuru.java
index 65eba99ba4..a8d7a6e268 100644
--- a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/XenServerGuru.java
+++ b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/XenServerGuru.java
@@ -44,7 +44,6 @@ import com.cloud.agent.api.to.DiskTO;
import com.cloud.agent.api.to.NfsTO;
import com.cloud.agent.api.to.VirtualMachineTO;
import com.cloud.host.HostVO;
-import com.cloud.host.dao.HostDao;
import com.cloud.hypervisor.Hypervisor.HypervisorType;
import com.cloud.storage.GuestOSHypervisorVO;
import com.cloud.storage.GuestOSVO;
@@ -68,8 +67,6 @@ public class XenServerGuru extends HypervisorGuruBase implements HypervisorGuru,
@Inject
private GuestOSHypervisorDao guestOsHypervisorDao;
@Inject
- private HostDao hostDao;
- @Inject
private VolumeDao volumeDao;
@Inject
private PrimaryDataStoreDao storagePoolDao;
@@ -178,10 +175,6 @@ public class XenServerGuru extends HypervisorGuruBase implements HypervisorGuru,
@Override
public Pair<Boolean, Long> getCommandHostDelegation(long hostId, Command cmd) {
- if (cmd instanceof StorageSubSystemCommand) {
- StorageSubSystemCommand c = (StorageSubSystemCommand)cmd;
- c.setExecuteInSequence(true);
- }
boolean isCopyCommand = cmd instanceof CopyCommand;
Pair<Boolean, Long> defaultHostToExecuteCommands = super.getCommandHostDelegation(hostId, cmd);
if (!isCopyCommand) {
@@ -197,6 +190,14 @@ public class XenServerGuru extends HypervisorGuruBase implements HypervisorGuru,
logger.debug("We are returning the default host to execute commands because the target hypervisor of the source data is not XenServer.");
return defaultHostToExecuteCommands;
}
+ // only now can we decide, now we now we're only deciding for ourselves
+ if (cmd instanceof StorageSubSystemCommand) {
+ if (s_logger.isTraceEnabled()) {
+ s_logger.trace(String.format("XenServer StrorageSubSystemCommand re always executed in sequence (command of type %s to host %l).", cmd.getClass(), hostId));
+ }
+ StorageSubSystemCommand c = (StorageSubSystemCommand)cmd;
+ c.setExecuteInSequence(true);
+ }
DataStoreTO srcStore = srcData.getDataStore();
DataStoreTO destStore = destData.getDataStore();
boolean isSourceAndDestinationNfsObjects = srcStore instanceof NfsTO && destStore instanceof NfsTO;
diff --git a/plugins/hypervisors/xenserver/src/test/java/com/cloud/hypervisor/XenServerGuruTest.java b/plugins/hypervisors/xenserver/src/test/java/com/cloud/hypervisor/XenServerGuruTest.java
index cc6621452c..f5169ae5dd 100644
--- a/plugins/hypervisors/xenserver/src/test/java/com/cloud/hypervisor/XenServerGuruTest.java
+++ b/plugins/hypervisors/xenserver/src/test/java/com/cloud/hypervisor/XenServerGuruTest.java
@@ -19,7 +19,6 @@ package com.cloud.hypervisor;
import org.apache.cloudstack.hypervisor.xenserver.XenserverConfigs;
import org.apache.cloudstack.storage.command.CopyCommand;
-import org.apache.cloudstack.storage.command.StorageSubSystemCommand;
import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
import org.apache.commons.lang3.StringUtils;
import org.junit.Assert;
@@ -41,6 +40,8 @@ import com.cloud.host.dao.HostDao;
import com.cloud.hypervisor.Hypervisor.HypervisorType;
import com.cloud.utils.Pair;
+import static org.mockito.Mockito.times;
+
@RunWith(MockitoJUnitRunner.class)
public class XenServerGuruTest {
@@ -102,13 +103,33 @@ public class XenServerGuruTest {
}
@Test
- public void getCommandHostDelegationTestCommanIsStorageSubSystemCommand() {
- StorageSubSystemCommand storageSubSystemCommandMock = Mockito.mock(StorageSubSystemCommand.class);
- Pair<Boolean, Long> pairHostToExecuteCommand = xenServerGuru.getCommandHostDelegation(defaultHostId, storageSubSystemCommandMock);
+ public void getCommandHostDelegationTestCommandIsStorageSubSystemCommand() {
+ CopyCommand copyCommand = Mockito.mock(CopyCommand.class);
+ DataTO srcData = Mockito.mock(DataTO.class);
+ DataTO dstData = Mockito.mock(DataTO.class);
+ Mockito.when(copyCommand.getSrcTO()).thenReturn(srcData);
+ Mockito.when(copyCommand.getDestTO()).thenReturn(dstData);
+ Mockito.when(srcData.getHypervisorType()).thenReturn(HypervisorType.XenServer);
+
+ Pair<Boolean, Long> pairHostToExecuteCommand = xenServerGuru.getCommandHostDelegation(defaultHostId, copyCommand);
+
+ assertPairOfHostToExecuteCommandIsTheDefaultHostId(pairHostToExecuteCommand);
+
+ Mockito.verify(copyCommand).setExecuteInSequence(true);
+ }
+
+ @Test
+ public void getCommandHostDelegationTestCommandIsNotForXenHypervisor() {
+ CopyCommand copyCommand = Mockito.mock(CopyCommand.class);
+ DataTO srcData = Mockito.mock(DataTO.class);
+ Mockito.when(copyCommand.getSrcTO()).thenReturn(srcData);
+ Mockito.when(srcData.getHypervisorType()).thenReturn(HypervisorType.Any);
+
+ Pair<Boolean, Long> pairHostToExecuteCommand = xenServerGuru.getCommandHostDelegation(defaultHostId, copyCommand);
assertPairOfHostToExecuteCommandIsTheDefaultHostId(pairHostToExecuteCommand);
- Mockito.verify(storageSubSystemCommandMock).setExecuteInSequence(true);
+ Mockito.verify(copyCommand, times(0)).setExecuteInSequence(true);
}
@Test
diff --git a/server/src/main/java/com/cloud/capacity/CapacityManagerImpl.java b/server/src/main/java/com/cloud/capacity/CapacityManagerImpl.java
index a6aa9fb3bb..726161740c 100644
--- a/server/src/main/java/com/cloud/capacity/CapacityManagerImpl.java
+++ b/server/src/main/java/com/cloud/capacity/CapacityManagerImpl.java
@@ -1256,6 +1256,6 @@ public class CapacityManagerImpl extends ManagerBase implements CapacityManager,
@Override
public ConfigKey<?>[] getConfigKeys() {
return new ConfigKey<?>[] {CpuOverprovisioningFactor, MemOverprovisioningFactor, StorageCapacityDisableThreshold, StorageOverprovisioningFactor,
- StorageAllocatedCapacityDisableThreshold, StorageOperationsExcludeCluster, VmwareCreateCloneFull, ImageStoreNFSVersion, SecondaryStorageCapacityThreshold};
+ StorageAllocatedCapacityDisableThreshold, StorageOperationsExcludeCluster, ImageStoreNFSVersion, SecondaryStorageCapacityThreshold};
}
}
diff --git a/server/src/main/java/com/cloud/configuration/Config.java b/server/src/main/java/com/cloud/configuration/Config.java
index 1fedad4306..67fe9ad19a 100644
--- a/server/src/main/java/com/cloud/configuration/Config.java
+++ b/server/src/main/java/com/cloud/configuration/Config.java
@@ -1087,14 +1087,6 @@ public enum Config {
"false",
"Enable/Disable Nexus/Vmware dvSwitch in VMware environment",
null),
- VmwareCreateFullClone(
- "Advanced",
- ManagementServer.class,
- Boolean.class,
- "vmware.create.full.clone",
- "true",
- "If set to true, creates guest VMs as full clones on ESX",
- null),
VmwareServiceConsole(
"Advanced",
ManagementServer.class,
diff --git a/server/src/main/java/com/cloud/hypervisor/HypervisorGuruBase.java b/server/src/main/java/com/cloud/hypervisor/HypervisorGuruBase.java
index fe37e67030..20b7a2b67d 100644
--- a/server/src/main/java/com/cloud/hypervisor/HypervisorGuruBase.java
+++ b/server/src/main/java/com/cloud/hypervisor/HypervisorGuruBase.java
@@ -71,13 +71,16 @@ public abstract class HypervisorGuruBase extends AdapterBase implements Hypervis
public static final Logger s_logger = Logger.getLogger(HypervisorGuruBase.class);
@Inject
- private NicDao _nicDao;
+ protected
+ NicDao nicDao;
@Inject
- private NetworkDao _networkDao;
+ protected
+ NetworkDao networkDao;
@Inject
private NetworkOfferingDetailsDao networkOfferingDetailsDao;
@Inject
- private VMInstanceDao _virtualMachineDao;
+ protected
+ VMInstanceDao virtualMachineDao;
@Inject
private UserVmDetailsDao _userVmDetailsDao;
@Inject
@@ -87,11 +90,12 @@ public abstract class HypervisorGuruBase extends AdapterBase implements Hypervis
@Inject
protected ServiceOfferingDetailsDao _serviceOfferingDetailsDao;
@Inject
- private ServiceOfferingDao _serviceOfferingDao;
+ protected ServiceOfferingDao serviceOfferingDao;
@Inject
private NetworkDetailsDao networkDetailsDao;
@Inject
- private HostDao hostDao;
+ protected
+ HostDao hostDao;
public static ConfigKey<Boolean> VmMinMemoryEqualsMemoryDividedByMemOverprovisioningFactor = new ConfigKey<Boolean>("Advanced", Boolean.class, "vm.min.memory.equals.memory.divided.by.mem.overprovisioning.factor", "true",
"If we set this to 'true', a minimum memory (memory/ mem.overprovisioning.factor) will be set to the VM, independent of using a scalable service offering or not.", true, ConfigKey.Scope.Cluster);
@@ -140,11 +144,11 @@ public abstract class HypervisorGuruBase extends AdapterBase implements Hypervis
to.setIp6Gateway(profile.getIPv6Gateway());
to.setIp6Cidr(profile.getIPv6Cidr());
- NetworkVO network = _networkDao.findById(profile.getNetworkId());
+ NetworkVO network = networkDao.findById(profile.getNetworkId());
to.setNetworkUuid(network.getUuid());
// Workaround to make sure the TO has the UUID we need for Nicira integration
- NicVO nicVO = _nicDao.findById(profile.getId());
+ NicVO nicVO = nicDao.findById(profile.getId());
if (nicVO != null) {
to.setUuid(nicVO.getUuid());
// disable pxe on system vm nics to speed up boot time
@@ -199,7 +203,7 @@ public abstract class HypervisorGuruBase extends AdapterBase implements Hypervis
}
protected VirtualMachineTO toVirtualMachineTO(VirtualMachineProfile vmProfile) {
- ServiceOffering offering = _serviceOfferingDao.findById(vmProfile.getId(), vmProfile.getServiceOfferingId());
+ ServiceOffering offering = serviceOfferingDao.findById(vmProfile.getId(), vmProfile.getServiceOfferingId());
VirtualMachine vm = vmProfile.getVirtualMachine();
Long clusterId = findClusterOfVm(vm);
boolean divideMemoryByOverprovisioning = true;
@@ -268,7 +272,7 @@ public abstract class HypervisorGuruBase extends AdapterBase implements Hypervis
}
// Workaround to make sure the TO has the UUID we need for Niciri integration
- VMInstanceVO vmInstance = _virtualMachineDao.findById(to.getId());
+ VMInstanceVO vmInstance = virtualMachineDao.findById(to.getId());
to.setEnableDynamicallyScaleVm(vmInstance.isDynamicallyScalable());
to.setUuid(vmInstance.getUuid());
diff --git a/server/src/main/java/com/cloud/hypervisor/KVMGuru.java b/server/src/main/java/com/cloud/hypervisor/KVMGuru.java
index c18f39a3a6..b69953c9ed 100644
--- a/server/src/main/java/com/cloud/hypervisor/KVMGuru.java
+++ b/server/src/main/java/com/cloud/hypervisor/KVMGuru.java
@@ -22,11 +22,9 @@ import com.cloud.agent.api.to.NicTO;
import com.cloud.agent.api.to.VirtualMachineTO;
import com.cloud.configuration.ConfigurationManagerImpl;
import com.cloud.host.HostVO;
-import com.cloud.host.dao.HostDao;
import com.cloud.hypervisor.Hypervisor.HypervisorType;
import com.cloud.hypervisor.kvm.dpdk.DpdkHelper;
import com.cloud.service.ServiceOfferingVO;
-import com.cloud.service.dao.ServiceOfferingDao;
import com.cloud.storage.DataStoreRole;
import com.cloud.storage.GuestOSHypervisorVO;
import com.cloud.storage.GuestOSVO;
@@ -56,12 +54,8 @@ public class KVMGuru extends HypervisorGuruBase implements HypervisorGuru {
@Inject
GuestOSHypervisorDao _guestOsHypervisorDao;
@Inject
- HostDao _hostDao;
- @Inject
DpdkHelper dpdkHelper;
- @Inject
- ServiceOfferingDao serviceOfferingDao;
public static final Logger s_logger = Logger.getLogger(KVMGuru.class);
@@ -93,7 +87,7 @@ public class KVMGuru extends HypervisorGuruBase implements HypervisorGuru {
protected void setVmQuotaPercentage(VirtualMachineTO to, VirtualMachineProfile vmProfile) {
if (to.getLimitCpuUse()) {
VirtualMachine vm = vmProfile.getVirtualMachine();
- HostVO host = _hostDao.findById(vm.getHostId());
+ HostVO host = hostDao.findById(vm.getHostId());
if (host == null) {
throw new CloudRuntimeException("Host with id: " + vm.getHostId() + " not found");
}
@@ -126,7 +120,7 @@ public class KVMGuru extends HypervisorGuruBase implements HypervisorGuru {
VirtualMachine virtualMachine = vm.getVirtualMachine();
Long hostId = virtualMachine.getHostId();
- HostVO host = hostId == null ? null : _hostDao.findById(hostId);
+ HostVO host = hostId == null ? null : hostDao.findById(hostId);
// Determine the VM's OS description
configureVmOsDescription(virtualMachine, to, host);
@@ -206,7 +200,7 @@ public class KVMGuru extends HypervisorGuruBase implements HypervisorGuru {
Long lastHostId = virtualMachine.getLastHostId();
s_logger.info(String.format("%s is not running; therefore, we use the last host [%s] that the VM was running on to derive the unconstrained service offering max CPU and memory.", vmDescription, lastHostId));
- HostVO lastHost = lastHostId == null ? null : _hostDao.findById(lastHostId);
+ HostVO lastHost = lastHostId == null ? null : hostDao.findById(lastHostId);
if (lastHost != null) {
maxHostMemory = lastHost.getTotalMemory();
maxHostCpuCore = lastHost.getCpus();
diff --git a/server/src/main/java/com/cloud/hypervisor/LXCGuru.java b/server/src/main/java/com/cloud/hypervisor/LXCGuru.java
index 285f9628d8..7f155a7c17 100644
--- a/server/src/main/java/com/cloud/hypervisor/LXCGuru.java
+++ b/server/src/main/java/com/cloud/hypervisor/LXCGuru.java
@@ -22,7 +22,6 @@ import javax.inject.Inject;
import com.cloud.agent.api.to.VirtualMachineTO;
import com.cloud.host.HostVO;
-import com.cloud.host.dao.HostDao;
import com.cloud.hypervisor.Hypervisor.HypervisorType;
import com.cloud.storage.GuestOSHypervisorVO;
import com.cloud.storage.GuestOSVO;
@@ -35,8 +34,6 @@ public class LXCGuru extends HypervisorGuruBase implements HypervisorGuru {
GuestOSDao _guestOsDao;
@Inject
GuestOSHypervisorDao _guestOsHypervisorDao;
- @Inject
- HostDao _hostDao;
@Override
public HypervisorType getHypervisorType() {
@@ -55,7 +52,7 @@ public class LXCGuru extends HypervisorGuruBase implements HypervisorGuru {
GuestOSVO guestOS = _guestOsDao.findByIdIncludingRemoved(vm.getVirtualMachine().getGuestOSId());
to.setOs(guestOS.getDisplayName());
- HostVO host = _hostDao.findById(vm.getVirtualMachine().getHostId());
+ HostVO host = hostDao.findById(vm.getVirtualMachine().getHostId());
GuestOSHypervisorVO guestOsMapping = null;
if (host != null) {
guestOsMapping = _guestOsHypervisorDao.findByOsIdAndHypervisor(guestOS.getId(), getHypervisorType().toString(), host.getHypervisorVersion());
diff --git a/server/src/main/java/com/cloud/storage/StorageManagerImpl.java b/server/src/main/java/com/cloud/storage/StorageManagerImpl.java
index de4eb55bc9..140f62d14b 100644
--- a/server/src/main/java/com/cloud/storage/StorageManagerImpl.java
+++ b/server/src/main/java/com/cloud/storage/StorageManagerImpl.java
@@ -3374,7 +3374,9 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C
DiskProvisioningStrictness,
PreferredStoragePool,
SecStorageVMAutoScaleDown,
- MountDisabledStoragePool
+ MountDisabledStoragePool,
+ VmwareCreateCloneFull,
+ VmwareAllowParallelExecution
};
}
diff --git a/server/src/test/java/com/cloud/hypervisor/KVMGuruTest.java b/server/src/test/java/com/cloud/hypervisor/KVMGuruTest.java
index 1f88173df2..0999cd0390 100644
--- a/server/src/test/java/com/cloud/hypervisor/KVMGuruTest.java
+++ b/server/src/test/java/com/cloud/hypervisor/KVMGuruTest.java
@@ -274,7 +274,7 @@ public class KVMGuruTest {
public void validateGetHostMaxMemoryAndCpuCoresHostNullAndLastHostIdNotNullAndLastHostNull(){
Long maxMemory = Long.MAX_VALUE;
Integer maxCpuCores = Integer.MAX_VALUE;
- guru._hostDao = hostDao;
+ guru.hostDao = hostDao;
Mockito.when(virtualMachineMock.getLastHostId()).thenReturn(1l);
Mockito.doReturn(null).when(hostDao).findById(Mockito.any());
@@ -288,7 +288,7 @@ public class KVMGuruTest {
public void validateGetHostMaxMemoryAndCpuCoresHostNullAndLastHostIdNotNullAndLastHostNotNull(){
Long maxMemory = 2048l;
Integer maxCpuCores = 16;
- guru._hostDao = hostDao;
+ guru.hostDao = hostDao;
Mockito.when(virtualMachineMock.getLastHostId()).thenReturn(1l);
Mockito.doReturn(host).when(hostDao).findById(Mockito.any());