From 78d1799492a9c9f0bffa260ca825a8658b98217a Mon Sep 17 00:00:00 2001 From: Abhishek Kumar Date: Tue, 5 Aug 2025 10:56:47 +0530 Subject: [PATCH 1/5] framework/db: add log for GenericDaoBase.findById Signed-off-by: Abhishek Kumar --- .../com/cloud/utils/db/GenericDaoBase.java | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/framework/db/src/main/java/com/cloud/utils/db/GenericDaoBase.java b/framework/db/src/main/java/com/cloud/utils/db/GenericDaoBase.java index 560cb4494ee4..21d522dbaa27 100644 --- a/framework/db/src/main/java/com/cloud/utils/db/GenericDaoBase.java +++ b/framework/db/src/main/java/com/cloud/utils/db/GenericDaoBase.java @@ -984,6 +984,27 @@ protected List listIncludingRemovedBy(final SearchCriteria sc) { @DB() @SuppressWarnings("unchecked") public T findById(final ID id) { + StackTraceElement[] stack = Thread.currentThread().getStackTrace(); + String callerClass = "unknown"; + String callerMethod = "unknown"; + for (int i = 2; i < stack.length; i++) { + String className = stack[i].getClassName(); + String classNameLower = className.toLowerCase(); + String methodName = stack[i].getMethodName(); + String methodNameLower = methodName.toLowerCase(); + if (!classNameLower.contains("reflect") && + !classNameLower.contains("intercept") && + !classNameLower.contains("proxy") && + !methodNameLower.contains("reflect") && + !methodNameLower.contains("intercept") && + !methodNameLower.contains("invoke")){ + callerClass = className; + callerMethod = stack[i].getMethodName(); + break; + } + } + logger.info("@@@findById {}: {} from: {}.{}", + _entityBeanType.getSimpleName(), id, callerClass, callerMethod); T result = null; if (_cache != null) { final Element element = _cache.get(id); From 0c7d9b1010938cc722001fc79030194a5c4f693b Mon Sep 17 00:00:00 2001 From: Abhishek Kumar Date: Sun, 31 Aug 2025 21:08:34 +0530 Subject: [PATCH 2/5] optimize: cache common entity lookups in CallContext during VM deployment This change introduces caching of frequently accessed entities in CallContext to reduce repeated database lookups during VM deployment. By reusing cached values for common entries, the deployment workflow becomes more efficient, reducing overhead and improving overall performance. Signed-off-by: Abhishek Kumar --- .../cloudstack/context/CallContext.java | 6 ++ .../context/RequestEntityCache.java | 61 ++++++++++++++++ .../java/com/cloud/event/UsageEventUtils.java | 5 +- .../manager/ClusteredAgentManagerImpl.java | 4 +- .../cloud/vm/VirtualMachineManagerImpl.java | 7 +- .../com/cloud/dc/ClusterDetailsDaoImpl.java | 4 +- .../AbstractStoragePoolAllocator.java | 69 +++++++++---------- .../storage/volume/VolumeObject.java | 61 ++++++++-------- .../tungsten/service/TungstenServiceImpl.java | 4 +- .../cloud/capacity/CapacityManagerImpl.java | 18 +++-- .../ConfigurationManagerImpl.java | 3 +- .../deploy/DeploymentPlanningManagerImpl.java | 69 ++++++++++++++----- .../com/cloud/deploy/FirstFitPlanner.java | 10 +-- .../cloud/hypervisor/HypervisorGuruBase.java | 5 +- .../network/element/VirtualRouterElement.java | 40 ++++++----- .../guru/ExternalGuestNetworkGuru.java | 5 +- .../cloud/network/guru/GuestNetworkGuru.java | 20 ++++-- .../network/router/CommandSetupHelper.java | 69 ++++++++++--------- .../com/cloud/storage/StorageManagerImpl.java | 27 +++++--- 19 files changed, 316 insertions(+), 171 deletions(-) create mode 100644 api/src/main/java/org/apache/cloudstack/context/RequestEntityCache.java diff --git a/api/src/main/java/org/apache/cloudstack/context/CallContext.java b/api/src/main/java/org/apache/cloudstack/context/CallContext.java index 69376e4f6d7d..339ac6edb884 100644 --- a/api/src/main/java/org/apache/cloudstack/context/CallContext.java +++ b/api/src/main/java/org/apache/cloudstack/context/CallContext.java @@ -16,6 +16,7 @@ // under the License. package org.apache.cloudstack.context; +import java.time.Duration; import java.util.HashMap; import java.util.Map; import java.util.Stack; @@ -65,6 +66,7 @@ protected Stack initialValue() { private final Map context = new HashMap(); private Project project; private String apiName; + private final RequestEntityCache requestEntityCache = new RequestEntityCache(Duration.ofSeconds(60)); static EntityManager s_entityMgr; @@ -423,4 +425,8 @@ public String toString() { .append("]") .toString(); } + + public RequestEntityCache getRequestEntityCache() { + return requestEntityCache; + } } diff --git a/api/src/main/java/org/apache/cloudstack/context/RequestEntityCache.java b/api/src/main/java/org/apache/cloudstack/context/RequestEntityCache.java new file mode 100644 index 000000000000..2cdae50bc725 --- /dev/null +++ b/api/src/main/java/org/apache/cloudstack/context/RequestEntityCache.java @@ -0,0 +1,61 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package org.apache.cloudstack.context; + +import java.time.Duration; +import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Supplier; + +public final class RequestEntityCache { + private static final class Key { + final Class type; + final long id; + Key(Class type, long id) { this.type = type; this.id = id; } + @Override public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof Key)) return false; + Key k = (Key) o; return id == k.id && type.equals(k.type); + } + @Override public int hashCode() { return 31 * type.hashCode() + Long.hashCode(id); } + } + private static final class Entry { + final Object value; final long expireAtNanos; // 0 = never expires + Entry(Object v, long exp) { value = v; expireAtNanos = exp; } + } + + private final ConcurrentHashMap map = new ConcurrentHashMap<>(); + private final long ttlNanos; // 0 = no TTL + + public RequestEntityCache(Duration ttl) { this.ttlNanos = ttl == null ? 0 : ttl.toNanos(); } + + @SuppressWarnings("unchecked") + public T get(Class type, long id, Supplier loader) { + final long now = System.nanoTime(); + final Key key = new Key(type, id); + Entry e = map.get(key); + if (e != null && (e.expireAtNanos == 0 || now < e.expireAtNanos)) { + return (T) e.value; + } + T loaded = loader.get(); + long exp = ttlNanos == 0 ? 0 : now + ttlNanos; + if (loaded != null) map.put(key, new Entry(loaded, exp)); + return loaded; + } + + public void clear() { map.clear(); } +} diff --git a/engine/components-api/src/main/java/com/cloud/event/UsageEventUtils.java b/engine/components-api/src/main/java/com/cloud/event/UsageEventUtils.java index 94fbb7a80af8..33f9cfc84bba 100644 --- a/engine/components-api/src/main/java/com/cloud/event/UsageEventUtils.java +++ b/engine/components-api/src/main/java/com/cloud/event/UsageEventUtils.java @@ -26,6 +26,8 @@ import javax.inject.Inject; import com.cloud.network.Network; + +import org.apache.cloudstack.context.CallContext; import org.apache.commons.collections.MapUtils; import org.springframework.beans.factory.NoSuchBeanDefinitionException; @@ -215,7 +217,8 @@ private static void publishUsageEvent(String usageEventType, Long accountId, Lon } Account account = s_accountDao.findById(accountId); - DataCenterVO dc = s_dcDao.findById(zoneId); + DataCenterVO dc = CallContext.current().getRequestEntityCache().get(DataCenterVO.class, zoneId, + () -> s_dcDao.findById(zoneId)); // if account has been deleted, this might be called during cleanup of resources and results in null pointer if (account == null) diff --git a/engine/orchestration/src/main/java/com/cloud/agent/manager/ClusteredAgentManagerImpl.java b/engine/orchestration/src/main/java/com/cloud/agent/manager/ClusteredAgentManagerImpl.java index c64489828033..b84e52543d2a 100644 --- a/engine/orchestration/src/main/java/com/cloud/agent/manager/ClusteredAgentManagerImpl.java +++ b/engine/orchestration/src/main/java/com/cloud/agent/manager/ClusteredAgentManagerImpl.java @@ -44,6 +44,7 @@ import com.cloud.resource.ResourceState; import org.apache.cloudstack.ca.CAManager; +import org.apache.cloudstack.context.CallContext; import org.apache.cloudstack.framework.config.ConfigDepot; import org.apache.cloudstack.framework.config.ConfigKey; import org.apache.cloudstack.framework.config.dao.ConfigurationDao; @@ -573,7 +574,8 @@ public SocketChannel connectToPeer(final long hostId, final SocketChannel prevCh @Override protected AgentAttache getAttache(final Long hostId) throws AgentUnavailableException { assert hostId != null : "Who didn't check their id value?"; - final HostVO host = _hostDao.findById(hostId); + final HostVO host = CallContext.current().getRequestEntityCache() + .get(HostVO.class, hostId, () -> _hostDao.findById(hostId)); if (host == null) { throw new AgentUnavailableException("Can't find the host ", hostId); } 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 3a6e1b622774..e79f3d3fad5e 100755 --- a/engine/orchestration/src/main/java/com/cloud/vm/VirtualMachineManagerImpl.java +++ b/engine/orchestration/src/main/java/com/cloud/vm/VirtualMachineManagerImpl.java @@ -1552,7 +1552,9 @@ public void orchestrateStart(final String vmUuid, final Map _hostDao.findById(finalDestHostId)); if (vmHost != null && (VirtualMachine.Type.ConsoleProxy.equals(vm.getType()) || VirtualMachine.Type.SecondaryStorageVm.equals(vm.getType())) && caManager.canProvisionCertificates()) { for (int retries = 3; retries > 0; retries--) { @@ -1748,7 +1750,8 @@ private void addToNetworkNameMap(long networkId, long dataCenterId, Map _dcDao.findById(dataCenterId)); if (Objects.isNull(zone)) { throw new CloudRuntimeException(String.format("Failed to find zone with ID: %s", dataCenterId)); } diff --git a/engine/schema/src/main/java/com/cloud/dc/ClusterDetailsDaoImpl.java b/engine/schema/src/main/java/com/cloud/dc/ClusterDetailsDaoImpl.java index 4c752ff9b4ff..3b8b6d8d3bba 100644 --- a/engine/schema/src/main/java/com/cloud/dc/ClusterDetailsDaoImpl.java +++ b/engine/schema/src/main/java/com/cloud/dc/ClusterDetailsDaoImpl.java @@ -24,6 +24,7 @@ import javax.inject.Inject; +import org.apache.cloudstack.context.CallContext; import org.apache.cloudstack.framework.config.ConfigKey; import org.apache.cloudstack.framework.config.ConfigKey.Scope; import org.apache.cloudstack.framework.config.ScopedConfigStorage; @@ -197,7 +198,8 @@ private String getCpuMemoryOvercommitRatio(String name) { @Override public Pair getParentScope(long id) { - Cluster cluster = clusterDao.findById(id); + Cluster cluster = CallContext.current().getRequestEntityCache().get(ClusterVO.class, id, + () -> clusterDao.findById(id)); if (cluster == null) { return null; } diff --git a/engine/storage/src/main/java/org/apache/cloudstack/storage/allocator/AbstractStoragePoolAllocator.java b/engine/storage/src/main/java/org/apache/cloudstack/storage/allocator/AbstractStoragePoolAllocator.java index 4b259760915d..cd1f3cc0d773 100644 --- a/engine/storage/src/main/java/org/apache/cloudstack/storage/allocator/AbstractStoragePoolAllocator.java +++ b/engine/storage/src/main/java/org/apache/cloudstack/storage/allocator/AbstractStoragePoolAllocator.java @@ -16,62 +16,61 @@ // under the License. package org.apache.cloudstack.storage.allocator; -import com.cloud.api.query.dao.StoragePoolJoinDao; -import com.cloud.dc.dao.HostPodDao; -import com.cloud.exception.StorageUnavailableException; -import com.cloud.host.HostVO; -import com.cloud.host.dao.HostDao; -import com.cloud.storage.ScopeType; -import com.cloud.storage.StoragePoolStatus; -import org.apache.cloudstack.storage.datastore.db.StoragePoolDetailVO; -import org.apache.cloudstack.storage.datastore.db.StoragePoolDetailsDao; -import org.apache.cloudstack.storage.datastore.db.StoragePoolVO; -import org.apache.commons.lang3.StringUtils; -import org.apache.cloudstack.utils.reflectiontostringbuilderutils.ReflectionToStringBuilderUtils; -import org.apache.commons.collections.CollectionUtils; +import java.math.BigDecimal; +import java.security.SecureRandom; +import java.text.DecimalFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; -import com.cloud.utils.Pair; +import javax.inject.Inject; +import javax.naming.ConfigurationException; + +import org.apache.cloudstack.context.CallContext; +import org.apache.cloudstack.engine.orchestration.service.VolumeOrchestrationService; import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager; import org.apache.cloudstack.engine.subsystem.api.storage.StoragePoolAllocator; import org.apache.cloudstack.framework.config.dao.ConfigurationDao; import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao; +import org.apache.cloudstack.storage.datastore.db.StoragePoolDetailVO; +import org.apache.cloudstack.storage.datastore.db.StoragePoolDetailsDao; +import org.apache.cloudstack.storage.datastore.db.StoragePoolVO; +import org.apache.cloudstack.utils.reflectiontostringbuilderutils.ReflectionToStringBuilderUtils; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import com.cloud.api.query.dao.StoragePoolJoinDao; import com.cloud.capacity.Capacity; import com.cloud.capacity.dao.CapacityDao; import com.cloud.dc.ClusterVO; import com.cloud.dc.dao.ClusterDao; import com.cloud.deploy.DeploymentPlan; import com.cloud.deploy.DeploymentPlanner.ExcludeList; +import com.cloud.exception.StorageUnavailableException; +import com.cloud.host.HostVO; +import com.cloud.host.dao.HostDao; import com.cloud.hypervisor.Hypervisor.HypervisorType; +import com.cloud.storage.ScopeType; import com.cloud.storage.Storage; import com.cloud.storage.StorageManager; import com.cloud.storage.StoragePool; +import com.cloud.storage.StoragePoolStatus; import com.cloud.storage.StorageUtil; import com.cloud.storage.Volume; import com.cloud.storage.dao.VolumeDao; import com.cloud.user.Account; import com.cloud.utils.NumbersUtil; +import com.cloud.utils.Pair; import com.cloud.utils.component.AdapterBase; import com.cloud.vm.DiskProfile; import com.cloud.vm.VirtualMachineProfile; -import org.apache.cloudstack.engine.orchestration.service.VolumeOrchestrationService; - -import javax.inject.Inject; -import javax.naming.ConfigurationException; -import java.math.BigDecimal; -import java.security.SecureRandom; -import java.text.DecimalFormat; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.Comparator; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - public abstract class AbstractStoragePoolAllocator extends AdapterBase implements StoragePoolAllocator { protected BigDecimal storageOverprovisioningFactor = new BigDecimal(1); @@ -88,8 +87,6 @@ public abstract class AbstractStoragePoolAllocator extends AdapterBase implement @Inject private StoragePoolDetailsDao storagePoolDetailsDao; @Inject protected HostDao hostDao; - @Inject - protected HostPodDao podDao; /** * make sure shuffled lists of Pools are really shuffled @@ -304,7 +301,8 @@ protected boolean filter(ExcludeList avoid, StoragePool pool, DiskProfile dskCh, Long clusterId = pool.getClusterId(); if (clusterId != null) { - ClusterVO cluster = clusterDao.findById(clusterId); + ClusterVO cluster = CallContext.current().getRequestEntityCache() + .get(ClusterVO.class, clusterId, () -> clusterDao.findById(clusterId)); if (!(cluster.getHypervisorType() == dskCh.getHypervisorType())) { if (logger.isDebugEnabled()) { logger.debug("StoragePool's Cluster does not have required hypervisorType, skipping this pool"); @@ -329,7 +327,8 @@ protected boolean filter(ExcludeList avoid, StoragePool pool, DiskProfile dskCh, } if (plan.getHostId() != null) { - HostVO plannedHost = hostDao.findById(plan.getHostId()); + HostVO plannedHost = CallContext.current().getRequestEntityCache() + .get(HostVO.class, plan.getHostId(), () -> hostDao.findById(plan.getHostId())); if (!storageMgr.checkIfHostAndStoragePoolHasCommonStorageAccessGroups(plannedHost, pool)) { if (logger.isDebugEnabled()) { logger.debug(String.format("StoragePool %s and host %s does not have matching storage access groups", pool, plannedHost)); diff --git a/engine/storage/volume/src/main/java/org/apache/cloudstack/storage/volume/VolumeObject.java b/engine/storage/volume/src/main/java/org/apache/cloudstack/storage/volume/VolumeObject.java index 31aaf7dc856a..329c85c93933 100644 --- a/engine/storage/volume/src/main/java/org/apache/cloudstack/storage/volume/VolumeObject.java +++ b/engine/storage/volume/src/main/java/org/apache/cloudstack/storage/volume/VolumeObject.java @@ -16,77 +16,77 @@ // under the License. package org.apache.cloudstack.storage.volume; +import java.util.Arrays; import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.function.Function; import javax.inject.Inject; -import com.cloud.configuration.Resource.ResourceType; -import com.cloud.dc.VsphereStoragePolicyVO; -import com.cloud.dc.dao.VsphereStoragePolicyDao; -import com.cloud.storage.StorageManager; -import com.cloud.utils.Pair; -import com.cloud.utils.db.Transaction; -import com.cloud.utils.db.TransactionCallbackNoReturn; -import com.cloud.utils.db.TransactionStatus; -import org.apache.cloudstack.engine.orchestration.service.VolumeOrchestrationService; -import org.apache.cloudstack.secret.dao.PassphraseDao; -import org.apache.cloudstack.secret.PassphraseVO; -import com.cloud.service.dao.ServiceOfferingDetailsDao; -import com.cloud.storage.MigrationOptions; -import com.cloud.storage.VMTemplateVO; -import com.cloud.storage.VolumeDetailVO; -import com.cloud.storage.dao.VMTemplateDao; -import com.cloud.storage.dao.VolumeDetailsDao; -import com.cloud.user.ResourceLimitService; -import com.cloud.vm.VmDetailConstants; - -import org.apache.cloudstack.resourcedetail.dao.DiskOfferingDetailsDao; import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.context.CallContext; +import org.apache.cloudstack.engine.orchestration.service.VolumeOrchestrationService; import org.apache.cloudstack.engine.subsystem.api.storage.DataObjectInStore; import org.apache.cloudstack.engine.subsystem.api.storage.DataStore; import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine; import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo; +import org.apache.cloudstack.resourcedetail.dao.DiskOfferingDetailsDao; +import org.apache.cloudstack.secret.PassphraseVO; +import org.apache.cloudstack.secret.dao.PassphraseDao; import org.apache.cloudstack.storage.command.CopyCmdAnswer; import org.apache.cloudstack.storage.command.CreateObjectAnswer; import org.apache.cloudstack.storage.datastore.ObjectInDataStoreManager; import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreDao; import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreVO; import org.apache.cloudstack.storage.to.VolumeObjectTO; +import org.apache.cloudstack.utils.reflectiontostringbuilderutils.ReflectionToStringBuilderUtils; import org.apache.commons.lang3.StringUtils; -import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import com.cloud.agent.api.Answer; import com.cloud.agent.api.storage.DownloadAnswer; import com.cloud.agent.api.to.DataObjectType; import com.cloud.agent.api.to.DataTO; +import com.cloud.configuration.Resource.ResourceType; +import com.cloud.dc.VsphereStoragePolicyVO; +import com.cloud.dc.dao.VsphereStoragePolicyDao; import com.cloud.exception.ConcurrentOperationException; import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.offering.DiskOffering.DiskCacheMode; +import com.cloud.service.dao.ServiceOfferingDetailsDao; import com.cloud.storage.DataStoreRole; import com.cloud.storage.DiskOfferingVO; +import com.cloud.storage.MigrationOptions; import com.cloud.storage.Storage; import com.cloud.storage.Storage.ImageFormat; import com.cloud.storage.Storage.ProvisioningType; +import com.cloud.storage.StorageManager; +import com.cloud.storage.VMTemplateVO; import com.cloud.storage.Volume; +import com.cloud.storage.VolumeDetailVO; import com.cloud.storage.VolumeVO; import com.cloud.storage.dao.DiskOfferingDao; +import com.cloud.storage.dao.VMTemplateDao; import com.cloud.storage.dao.VolumeDao; +import com.cloud.storage.dao.VolumeDetailsDao; +import com.cloud.user.ResourceLimitService; +import com.cloud.utils.Pair; import com.cloud.utils.component.ComponentContext; +import com.cloud.utils.db.Transaction; +import com.cloud.utils.db.TransactionCallbackNoReturn; +import com.cloud.utils.db.TransactionStatus; import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.utils.fsm.NoTransitionException; import com.cloud.utils.fsm.StateMachine2; import com.cloud.utils.storage.encoding.EncodingType; import com.cloud.vm.VMInstanceVO; import com.cloud.vm.VirtualMachine; +import com.cloud.vm.VmDetailConstants; import com.cloud.vm.dao.VMInstanceDao; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.function.Function; -import org.apache.cloudstack.utils.reflectiontostringbuilderutils.ReflectionToStringBuilderUtils; public class VolumeObject implements VolumeInfo { protected Logger logger = LogManager.getLogger(getClass()); @@ -255,7 +255,8 @@ public boolean stateTransit(Volume.Event event) { protected DiskOfferingVO getDiskOfferingVO() { Long diskOfferingId = getDiskOfferingId(); - return diskOfferingId == null ? null : diskOfferingDao.findById(diskOfferingId); + return diskOfferingId == null ? null : CallContext.current().getRequestEntityCache() + .get(DiskOfferingVO.class, diskOfferingId, () -> diskOfferingDao.findById(diskOfferingId)); } @Override diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/service/TungstenServiceImpl.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/service/TungstenServiceImpl.java index 60b5b7290a90..ca124d7bcf88 100644 --- a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/service/TungstenServiceImpl.java +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/service/TungstenServiceImpl.java @@ -23,6 +23,7 @@ import com.cloud.configuration.ConfigurationManager; import com.cloud.dc.DataCenter; import com.cloud.dc.DataCenterIpAddressVO; +import com.cloud.dc.DataCenterVO; import com.cloud.dc.HostPodVO; import com.cloud.dc.Pod; import com.cloud.dc.Vlan; @@ -2221,7 +2222,8 @@ private boolean setupVrouter(Network network, List qualifiedName) { @Override public boolean addTungstenVmSecurityGroup(VMInstanceVO vm) { - DataCenter dataCenter = dataCenterDao.findById(vm.getDataCenterId()); + DataCenter dataCenter = CallContext.current().getRequestEntityCache() + .get(DataCenterVO.class, vm.getDataCenterId(), () -> dataCenterDao.findById(vm.getDataCenterId())); if (!dataCenter.isSecurityGroupEnabled()) { return true; } diff --git a/server/src/main/java/com/cloud/capacity/CapacityManagerImpl.java b/server/src/main/java/com/cloud/capacity/CapacityManagerImpl.java index 2de9abc827ec..f896d51f3c3d 100644 --- a/server/src/main/java/com/cloud/capacity/CapacityManagerImpl.java +++ b/server/src/main/java/com/cloud/capacity/CapacityManagerImpl.java @@ -28,6 +28,7 @@ import javax.inject.Inject; import javax.naming.ConfigurationException; +import org.apache.cloudstack.context.CallContext; import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreDriver; import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreProvider; import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreProviderManager; @@ -55,6 +56,7 @@ import com.cloud.configuration.Config; import com.cloud.dc.ClusterDetailsDao; import com.cloud.dc.ClusterDetailsVO; +import com.cloud.dc.DataCenterVO; import com.cloud.dc.dao.ClusterDao; import com.cloud.deploy.DeploymentClusterPlanner; import com.cloud.event.UsageEventVO; @@ -89,16 +91,16 @@ import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.utils.fsm.StateListener; import com.cloud.utils.fsm.StateMachine2; -import com.cloud.vm.VMInstanceDetailVO; import com.cloud.vm.UserVmVO; +import com.cloud.vm.VMInstanceDetailVO; import com.cloud.vm.VMInstanceVO; import com.cloud.vm.VirtualMachine; import com.cloud.vm.VirtualMachine.Event; import com.cloud.vm.VirtualMachine.State; import com.cloud.vm.VmDetailConstants; import com.cloud.vm.dao.UserVmDao; -import com.cloud.vm.dao.VMInstanceDetailsDao; import com.cloud.vm.dao.VMInstanceDao; +import com.cloud.vm.dao.VMInstanceDetailsDao; import com.cloud.vm.snapshot.dao.VMSnapshotDao; public class CapacityManagerImpl extends ManagerBase implements CapacityManager, StateListener, Listener, ResourceListener, @@ -295,7 +297,8 @@ public void doInTransactionWithoutResult(TransactionStatus status) { public void allocateVmCapacity(VirtualMachine vm, final boolean fromLastHost) { final long hostId = vm.getHostId(); - final HostVO host = _hostDao.findById(hostId); + final HostVO host = CallContext.current().getRequestEntityCache().get(HostVO.class, hostId, + () -> _hostDao.findById(hostId)); if (HypervisorType.External.equals(host.getHypervisorType())) { return; } @@ -966,9 +969,12 @@ public boolean postStateTransitionEvent(StateMachine2.Transition t State oldState = transition.getCurrentState(); State newState = transition.getToState(); Event event = transition.getEvent(); - Host lastHost = _hostDao.findById(vm.getLastHostId()); - Host oldHost = _hostDao.findById(oldHostId); - Host newHost = _hostDao.findById(vm.getHostId()); + Host lastHost = vm.getLastHostId() == null ? null : CallContext.current().getRequestEntityCache() + .get(HostVO.class, vm.getLastHostId(), () -> _hostDao.findById(vm.getLastHostId())); + Host oldHost = oldHostId == null ? null : CallContext.current().getRequestEntityCache() + .get(HostVO.class, oldHostId, () -> _hostDao.findById(oldHostId)); + Host newHost = vm.getHostId() == null ? null : CallContext.current().getRequestEntityCache() + .get(HostVO.class, vm.getHostId(), () -> _hostDao.findById(vm.getHostId())); logger.debug(String.format("%s state transited from [%s] to [%s] with event [%s]. VM's original host: %s, new host: %s, host before state transition: %s", vm, oldState, newState, event, lastHost, newHost, oldHost)); diff --git a/server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java b/server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java index 300a96b27b50..7ab4eba07533 100644 --- a/server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java +++ b/server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java @@ -8198,7 +8198,8 @@ public Long getDefaultPageSize() { public Integer getServiceOfferingNetworkRate(final long serviceOfferingId, final Long dataCenterId) { // validate network offering information - final ServiceOffering offering = _serviceOfferingDao.findById(serviceOfferingId); + final ServiceOffering offering = CallContext.current().getRequestEntityCache() + .get(ServiceOfferingVO.class, serviceOfferingId, () -> _serviceOfferingDao.findById(serviceOfferingId)); if (offering == null) { throw new InvalidParameterValueException("Unable to find service offering by id=" + serviceOfferingId); } diff --git a/server/src/main/java/com/cloud/deploy/DeploymentPlanningManagerImpl.java b/server/src/main/java/com/cloud/deploy/DeploymentPlanningManagerImpl.java index daaebb42a340..6ddfdd962098 100644 --- a/server/src/main/java/com/cloud/deploy/DeploymentPlanningManagerImpl.java +++ b/server/src/main/java/com/cloud/deploy/DeploymentPlanningManagerImpl.java @@ -36,6 +36,7 @@ import javax.inject.Inject; import javax.naming.ConfigurationException; +import com.cloud.dc.HostPodVO; import com.cloud.gpu.dao.VgpuProfileDao; import org.apache.cloudstack.affinity.AffinityGroupDomainMapVO; import org.apache.cloudstack.affinity.AffinityGroupProcessor; @@ -45,6 +46,7 @@ import org.apache.cloudstack.affinity.dao.AffinityGroupDao; import org.apache.cloudstack.affinity.dao.AffinityGroupDomainMapDao; import org.apache.cloudstack.affinity.dao.AffinityGroupVMMapDao; +import org.apache.cloudstack.context.CallContext; import org.apache.cloudstack.engine.cloud.entity.api.db.VMReservationVO; import org.apache.cloudstack.engine.cloud.entity.api.db.dao.VMReservationDao; import org.apache.cloudstack.engine.subsystem.api.storage.DataStore; @@ -276,6 +278,38 @@ public void setAffinityGroupProcessors(List affinityProc private static final List clusterArchTypes = Arrays.asList(CPU.CPUArch.amd64, CPU.CPUArch.arm64); + private DataCenterVO findDataCenter(final Long dataCenterId) { + if (dataCenterId == null) { + return null; + } + return CallContext.current().getRequestEntityCache().get(DataCenterVO.class, dataCenterId, + () -> _dcDao.findById(dataCenterId)); + } + + private HostPodVO findPod(final Long podId) { + if (podId == null) { + return null; + } + return CallContext.current().getRequestEntityCache().get(HostPodVO.class, podId, + () -> _podDao.findById(podId)); + } + + private ClusterVO findCluster(final Long clusterId) { + if (clusterId == null) { + return null; + } + return CallContext.current().getRequestEntityCache().get(ClusterVO.class, clusterId, + () -> _clusterDao.findById(clusterId)); + } + + private HostVO findHost(final Long hostId) { + if (hostId == null) { + return null; + } + return CallContext.current().getRequestEntityCache().get(HostVO.class, hostId, + () -> _hostDao.findById(hostId)); + } + protected void avoidOtherClustersForDeploymentIfMigrationDisabled(VirtualMachine vm, Host lastHost, ExcludeList avoids) { if (lastHost == null || lastHost.getClusterId() == null || ConfigurationManagerImpl.MIGRATE_VM_ACROSS_CLUSTERS.valueIn(vm.getDataCenterId())) { @@ -314,7 +348,7 @@ public DeployDestination planDeployment(VirtualMachineProfile vmProfile, Deploym int cpuRequested = offering.getCpu() * offering.getSpeed(); long ramRequested = offering.getRamSize() * 1024L * 1024L; VirtualMachine vm = vmProfile.getVirtualMachine(); - DataCenter dc = _dcDao.findById(vm.getDataCenterId()); + DataCenter dc = findDataCenter(vm.getDataCenterId()); boolean volumesRequireEncryption = anyVolumeRequiresEncryption(_volsDao.findByInstance(vm.getId())); if (vm.getType() == VirtualMachine.Type.User || vm.getType() == VirtualMachine.Type.DomainRouter) { @@ -324,7 +358,7 @@ public DeployDestination planDeployment(VirtualMachineProfile vmProfile, Deploym logger.debug("Trying to allocate a host and storage pools from datacenter [{}], " + "pod [{}], cluster [{}], to deploy VM [{}] with requested CPU [{}] and requested RAM [{}].", - dc::toString, () -> _podDao.findById(plan.getPodId()), () -> _clusterDao.findById(plan.getClusterId()), + dc::toString, () -> findPod(plan.getPodId()), () -> findCluster(plan.getClusterId()), vm::toString, () -> cpuRequested, () -> toHumanReadableSize(ramRequested)); logger.debug("ROOT volume [{}] {} to deploy VM [{}].", @@ -360,7 +394,6 @@ public DeployDestination planDeployment(VirtualMachineProfile vmProfile, Deploym // call planners - // DataCenter dc = _dcDao.findById(vm.getDataCenterId()); // check if datacenter is in avoid set if (avoids.shouldAvoid(dc)) { if (logger.isDebugEnabled()) { @@ -389,7 +422,7 @@ public DeployDestination planDeployment(VirtualMachineProfile vmProfile, Deploym boolean considerLastHost = vm.getLastHostId() != null && haVmTag == null && (considerLastHostStr == null || Boolean.TRUE.toString().equalsIgnoreCase(considerLastHostStr)); if (considerLastHost) { - HostVO host = _hostDao.findById(vm.getLastHostId()); + HostVO host = findHost(vm.getLastHostId()); logger.debug("This VM has last host_id specified, trying to choose the same host: " + host); lastHost = host; @@ -480,7 +513,7 @@ private void avoidDifferentArchResources(VirtualMachineProfile vmProfile, DataCe private DeployDestination deployInVmLastHost(VirtualMachineProfile vmProfile, DeploymentPlan plan, ExcludeList avoids, DeploymentPlanner planner, VirtualMachine vm, DataCenter dc, ServiceOffering offering, int cpuRequested, long ramRequested, boolean volumesRequireEncryption) throws InsufficientServerCapacityException { - HostVO host = _hostDao.findById(vm.getLastHostId()); + HostVO host = findHost(vm.getLastHostId()); if (canUseLastHost(host, avoids, plan, vm, offering, volumesRequireEncryption)) { _hostDao.loadHostTags(host); _hostDao.loadDetails(host); @@ -513,8 +546,8 @@ private DeployDestination deployInVmLastHost(VirtualMachineProfile vmProfile, De logger.debug("Cannot deploy VM [{}] to the last host [{}] because this host does not have enough capacity to deploy this VM.", vm, host); return null; } - Pod pod = _podDao.findById(host.getPodId()); - Cluster cluster = _clusterDao.findById(host.getClusterId()); + Pod pod = findPod(host.getPodId()); + Cluster cluster = findCluster(host.getClusterId()); logger.debug("Last host [{}] of VM [{}] is UP and has enough capacity. Checking for suitable pools for this host under zone [{}], pod [{}] and cluster [{}].", host, vm, dc, pod, cluster); @@ -606,7 +639,7 @@ private DeployDestination deployInSpecifiedHostWithoutHA(VirtualMachineProfile v Long hostIdSpecified = plan.getHostId(); logger.debug("DeploymentPlan [{}] has specified host [{}] without HA flag. Choosing this host to deploy VM [{}].", plan.getClass().getSimpleName(), hostIdSpecified, vm); - HostVO host = _hostDao.findById(hostIdSpecified); + HostVO host = findHost(hostIdSpecified); if (host != null && StringUtils.isNotBlank(uefiFlag) && "yes".equalsIgnoreCase(uefiFlag)) { _hostDao.loadDetails(host); if (MapUtils.isNotEmpty(host.getDetails()) && host.getDetails().containsKey(Host.HOST_UEFI_ENABLE) && "false".equalsIgnoreCase(host.getDetails().get(Host.HOST_UEFI_ENABLE))) { @@ -623,8 +656,8 @@ private DeployDestination deployInSpecifiedHostWithoutHA(VirtualMachineProfile v return null; } - Pod pod = _podDao.findById(host.getPodId()); - Cluster cluster = _clusterDao.findById(host.getClusterId()); + Pod pod = findPod(host.getPodId()); + Cluster cluster = findCluster(host.getClusterId()); logger.debug("Trying to find suitable pools for host [{}] under pod [{}], cluster [{}] and zone [{}], to deploy VM [{}].", host, dc, pod, cluster, vm); @@ -1237,7 +1270,7 @@ public boolean configure(final String name, final Map params) th @Override public void onPublishMessage(String senderAddress, String subject, Object obj) { VMInstanceVO vm = ((VMInstanceVO)obj); - Host host = _hostDao.findById(vm.getLastHostId()); + Host host = findHost(vm.getLastHostId()); logger.debug("MessageBus message: host reserved capacity released for VM: {}, checking if host reservation can be released for host:{}", vm, host); checkHostReservationRelease(host); } @@ -1301,7 +1334,7 @@ private DeployDestination checkClustersforDestination(List clusterList, Vi } for (Long clusterId : clusterList) { - ClusterVO clusterVO = _clusterDao.findById(clusterId); + ClusterVO clusterVO = findCluster(clusterId); if (clusterVO.getHypervisorType() != vmProfile.getHypervisorType()) { logger.debug("Adding cluster [{}] to the avoid set because the cluster's hypervisor [{}] does not match the VM [{}] hypervisor: [{}]. Skipping this cluster.", @@ -1310,7 +1343,7 @@ private DeployDestination checkClustersforDestination(List clusterList, Vi continue; } - Pod pod = _podDao.findById(clusterVO.getPodId()); + Pod pod = findPod(clusterVO.getPodId()); logger.debug("Checking resources in Cluster: " + clusterVO + " under Pod: " + pod); // search for resources(hosts and storage) under this zone, pod, // cluster. @@ -1611,7 +1644,7 @@ public int compare(Volume v1, Volume v2) { } } - HostVO potentialHostVO = _hostDao.findById(potentialHost.getId()); + HostVO potentialHostVO = findHost(potentialHost.getId()); _hostDao.loadDetails(potentialHostVO); boolean hostHasEncryption = Boolean.parseBoolean(potentialHostVO.getDetail(Host.HOST_VOLUME_ENCRYPTION)); @@ -1786,7 +1819,7 @@ protected Pair>, List> findSuitablePoolsFo DiskProfile diskProfile = new DiskProfile(toBeCreated, diskOffering, vmProfile.getHypervisorType()); boolean useLocalStorage = false; if (vmProfile.getType() != VirtualMachine.Type.User) { - DataCenterVO zone = _dcDao.findById(plan.getDataCenterId()); + DataCenterVO zone = findDataCenter(plan.getDataCenterId()); assert (zone != null) : "Invalid zone in deployment plan"; Boolean useLocalStorageForSystemVM = ConfigurationManagerImpl.SystemVMUseLocalStorage.valueIn(zone.getId()); if (useLocalStorageForSystemVM != null) { @@ -1942,19 +1975,19 @@ private Optional getPreferredStoragePool(List poolList private boolean isEnabledForAllocation(long zoneId, Long podId, Long clusterId) { // Check if the zone exists in the system - DataCenterVO zone = _dcDao.findById(zoneId); + DataCenterVO zone = findDataCenter(zoneId); if (zone != null && Grouping.AllocationState.Disabled == zone.getAllocationState()) { logger.info("Zone is currently disabled, cannot allocate to this zone: {}", zone); return false; } - Pod pod = _podDao.findById(podId); + Pod pod = findPod(podId); if (pod != null && Grouping.AllocationState.Disabled == pod.getAllocationState()) { logger.info("Pod is currently disabled, cannot allocate to this pod: {}", pod); return false; } - Cluster cluster = _clusterDao.findById(clusterId); + Cluster cluster = findCluster(clusterId); if (cluster != null && Grouping.AllocationState.Disabled == cluster.getAllocationState()) { logger.info("Cluster is currently disabled, cannot allocate to this cluster: {}", cluster); return false; diff --git a/server/src/main/java/com/cloud/deploy/FirstFitPlanner.java b/server/src/main/java/com/cloud/deploy/FirstFitPlanner.java index 3aab852ba7fc..c40f0dba1b2a 100644 --- a/server/src/main/java/com/cloud/deploy/FirstFitPlanner.java +++ b/server/src/main/java/com/cloud/deploy/FirstFitPlanner.java @@ -31,8 +31,10 @@ import com.cloud.capacity.CapacityVO; import com.cloud.configuration.ConfigurationManager; import com.cloud.dc.ClusterDetailsVO; +import com.cloud.dc.DataCenterVO; import com.cloud.utils.exception.CloudRuntimeException; import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.context.CallContext; import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager; import org.apache.cloudstack.framework.config.ConfigKey; import org.apache.cloudstack.framework.config.Configurable; @@ -133,7 +135,8 @@ public class FirstFitPlanner extends AdapterBase implements DeploymentClusterPla @Override public List orderClusters(VirtualMachineProfile vmProfile, DeploymentPlan plan, ExcludeList avoid) throws InsufficientServerCapacityException { VirtualMachine vm = vmProfile.getVirtualMachine(); - DataCenter dc = dcDao.findById(vm.getDataCenterId()); + DataCenter dc = CallContext.current().getRequestEntityCache().get(DataCenterVO.class, vm.getDataCenterId(), + () -> dcDao.findById(vm.getDataCenterId())); //check if datacenter is in avoid set if (avoid.shouldAvoid(dc)) { @@ -181,7 +184,7 @@ public List orderClusters(VirtualMachineProfile vmProfile, DeploymentPlan return null; } } else { - logger.debug("Searching all possible resources under this Zone: {}", dcDao.findById(plan.getDataCenterId())); + logger.debug("Searching all possible resources under this Zone: {}", dc); boolean applyAllocationAtPods = Boolean.parseBoolean(configDao.getValue(Config.ApplyAllocationAlgorithmToPods.key())); if (applyAllocationAtPods) { @@ -392,10 +395,7 @@ protected void removeClustersCrossingThreshold(List clusterListForVmAlloca } private List scanClustersForDestinationInZoneOrPod(long id, boolean isZone, VirtualMachineProfile vmProfile, DeploymentPlan plan, ExcludeList avoid) { - - VirtualMachine vm = vmProfile.getVirtualMachine(); ServiceOffering offering = vmProfile.getServiceOffering(); - DataCenter dc = dcDao.findById(vm.getDataCenterId()); int requiredCpu = offering.getCpu() * offering.getSpeed(); long requiredRam = offering.getRamSize() * 1024L * 1024L; diff --git a/server/src/main/java/com/cloud/hypervisor/HypervisorGuruBase.java b/server/src/main/java/com/cloud/hypervisor/HypervisorGuruBase.java index 1aa9a1af3faa..7e865db0a19d 100644 --- a/server/src/main/java/com/cloud/hypervisor/HypervisorGuruBase.java +++ b/server/src/main/java/com/cloud/hypervisor/HypervisorGuruBase.java @@ -25,6 +25,7 @@ import com.cloud.agent.api.to.GPUDeviceTO; import com.cloud.dc.DataCenter; +import com.cloud.dc.DataCenterVO; import com.cloud.dc.dao.DataCenterDao; import com.cloud.domain.Domain; import com.cloud.domain.dao.DomainDao; @@ -37,6 +38,7 @@ import com.cloud.utils.exception.CloudRuntimeException; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.backup.Backup; +import org.apache.cloudstack.context.CallContext; import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService; import org.apache.cloudstack.framework.config.ConfigKey; import org.apache.cloudstack.framework.config.Configurable; @@ -181,7 +183,8 @@ public NicTO toNicTO(NicProfile profile) { to.setNetworkUuid(network.getUuid()); Account account = accountManager.getAccount(network.getAccountId()); Domain domain = domainDao.findById(network.getDomainId()); - DataCenter zone = dcDao.findById(network.getDataCenterId()); + DataCenter zone = CallContext.current().getRequestEntityCache().get(DataCenterVO.class, network.getDataCenterId(), + () -> dcDao.findById(network.getDataCenterId())); if (Objects.isNull(zone)) { throw new CloudRuntimeException(String.format("Failed to find zone with ID: %s", network.getDataCenterId())); } diff --git a/server/src/main/java/com/cloud/network/element/VirtualRouterElement.java b/server/src/main/java/com/cloud/network/element/VirtualRouterElement.java index 430d4757944c..6d583a7e4097 100644 --- a/server/src/main/java/com/cloud/network/element/VirtualRouterElement.java +++ b/server/src/main/java/com/cloud/network/element/VirtualRouterElement.java @@ -24,6 +24,7 @@ import javax.inject.Inject; +import org.apache.cloudstack.context.CallContext; import org.apache.cloudstack.network.BgpPeer; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.ObjectUtils; @@ -183,6 +184,11 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl @Qualifier("networkHelper") protected NetworkHelper _networkHelper; + private DataCenterVO findDataCenter(final long dataCenterId) { + return CallContext.current().getRequestEntityCache().get(DataCenterVO.class, dataCenterId, + () -> _dcDao.findById(dataCenterId)); + } + protected boolean canHandle(final Network network, final Service service) { final Long physicalNetworkId = _networkMdl.getPhysicalNetworkId(network); if (physicalNetworkId == null) { @@ -294,7 +300,7 @@ public boolean applyFWRules(final Network network, final List return true; } - final DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId()); + final DataCenterVO dcVO = findDataCenter(network.getDataCenterId()); final NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO); for (final DomainRouterVO domainRouterVO : routers) { @@ -356,7 +362,7 @@ public String[] applyVpnUsers(final RemoteAccessVpn vpn, final List b boolean result = true; long dataCenterId = vpc != null ? vpc.getZoneId() : network.getDataCenterId(); - final DataCenterVO dcVO = _dcDao.findById(dataCenterId); + final DataCenterVO dcVO = findDataCenter(dataCenterId); final NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO); for (final DomainRouterVO domainRouterVO : routers) { diff --git a/server/src/main/java/com/cloud/network/guru/ExternalGuestNetworkGuru.java b/server/src/main/java/com/cloud/network/guru/ExternalGuestNetworkGuru.java index 3b4af537feb4..38dd0555ccee 100644 --- a/server/src/main/java/com/cloud/network/guru/ExternalGuestNetworkGuru.java +++ b/server/src/main/java/com/cloud/network/guru/ExternalGuestNetworkGuru.java @@ -27,7 +27,6 @@ import com.cloud.dc.DataCenter; import com.cloud.dc.DataCenter.NetworkType; -import com.cloud.dc.dao.DataCenterDao; import com.cloud.deploy.DeployDestination; import com.cloud.deploy.DeploymentPlan; import com.cloud.event.ActionEventUtils; @@ -76,8 +75,6 @@ public class ExternalGuestNetworkGuru extends GuestNetworkGuru { @Inject NetworkDao _networkDao; @Inject - DataCenterDao _zoneDao; - @Inject PortForwardingRulesDao _pfRulesDao; @Inject IPAddressDao _ipAddressDao; @@ -303,7 +300,7 @@ public void reserve(NicProfile nic, Network config, VirtualMachineProfile vm, De throws InsufficientVirtualNetworkCapacityException, InsufficientAddressCapacityException { assert (nic.getReservationStrategy() == ReservationStrategy.Start) : "What can I do for nics that are not allocated at start? "; - DataCenter dc = _dcDao.findById(config.getDataCenterId()); + DataCenter dc = findDataCenter(config.getDataCenterId()); if (_networkModel.networkIsConfiguredForExternalNetworking(config.getDataCenterId(), config.getId())) { nic.setBroadcastUri(config.getBroadcastUri()); diff --git a/server/src/main/java/com/cloud/network/guru/GuestNetworkGuru.java b/server/src/main/java/com/cloud/network/guru/GuestNetworkGuru.java index 7e09501a15e8..4e8fb9af6efe 100644 --- a/server/src/main/java/com/cloud/network/guru/GuestNetworkGuru.java +++ b/server/src/main/java/com/cloud/network/guru/GuestNetworkGuru.java @@ -23,9 +23,6 @@ import javax.inject.Inject; -import com.cloud.domain.dao.DomainDao; -import com.cloud.offerings.dao.NetworkOfferingServiceMapDao; -import com.cloud.user.dao.AccountDao; import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.context.CallContext; import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService; @@ -39,10 +36,12 @@ import com.cloud.configuration.Config; import com.cloud.dc.DataCenter; import com.cloud.dc.DataCenter.NetworkType; +import com.cloud.dc.DataCenterVO; import com.cloud.dc.dao.DataCenterDao; import com.cloud.dc.dao.VlanDao; import com.cloud.deploy.DeployDestination; import com.cloud.deploy.DeploymentPlan; +import com.cloud.domain.dao.DomainDao; import com.cloud.event.ActionEventUtils; import com.cloud.event.EventTypes; import com.cloud.event.EventVO; @@ -75,8 +74,10 @@ import com.cloud.network.vpc.dao.VpcDao; import com.cloud.offering.NetworkOffering; import com.cloud.offerings.dao.NetworkOfferingDao; +import com.cloud.offerings.dao.NetworkOfferingServiceMapDao; import com.cloud.server.ConfigurationServer; import com.cloud.user.Account; +import com.cloud.user.dao.AccountDao; import com.cloud.utils.Pair; import com.cloud.utils.component.AdapterBase; import com.cloud.utils.db.DB; @@ -155,6 +156,11 @@ public abstract class GuestNetworkGuru extends AdapterBase implements NetworkGur String _defaultGateway; String _defaultCidr; + protected DataCenterVO findDataCenter(final long dataCenterId) { + return CallContext.current().getRequestEntityCache().get(DataCenterVO.class, dataCenterId, + () -> _dcDao.findById(dataCenterId)); + } + protected GuestNetworkGuru() { super(); _isolationMethods = null; @@ -237,7 +243,7 @@ public IsolationMethod[] getIsolationMethods() { @Override public Network design(final NetworkOffering offering, final DeploymentPlan plan, final Network userSpecified, String name, Long vpcId, final Account owner) { - final DataCenter dc = _dcDao.findById(plan.getDataCenterId()); + final DataCenter dc = findDataCenter(plan.getDataCenterId()); final PhysicalNetworkVO physnet = _physicalNetworkDao.findById(plan.getPhysicalNetworkId()); if (!canHandle(offering, dc.getNetworkType(), physnet)) { @@ -417,7 +423,7 @@ public NicProfile allocate(final Network network, NicProfile nic, final VirtualM nic = new NicProfile(ReservationStrategy.Start, null, null, null, null); } - final DataCenter dc = _dcDao.findById(network.getDataCenterId()); + final DataCenter dc = findDataCenter(network.getDataCenterId()); boolean isGateway = false; //if Vm is router vm and source nat is enabled in the network, set ip4 to the network gateway @@ -496,7 +502,7 @@ public NicProfile allocate(final Network network, NicProfile nic, final VirtualM @Override public void updateNicProfile(final NicProfile profile, final Network network) { - final DataCenter dc = _dcDao.findById(network.getDataCenterId()); + final DataCenter dc = findDataCenter(network.getDataCenterId()); Pair dns = _networkModel.getNetworkIp4Dns(network, dc); Pair ip6Dns = _networkModel.getNetworkIp6Dns(network, dc); if (profile != null) { @@ -552,7 +558,7 @@ public boolean trash(final Network network, final NetworkOffering offering) { @Override public void updateNetworkProfile(final NetworkProfile networkProfile) { - final DataCenter dc = _dcDao.findById(networkProfile.getDataCenterId()); + final DataCenter dc = findDataCenter(networkProfile.getDataCenterId()); Network network = _networkModel.getNetwork(networkProfile.getId()); Pair dns = _networkModel.getNetworkIp4Dns(network, dc); networkProfile.setDns1(dns.first()); diff --git a/server/src/main/java/com/cloud/network/router/CommandSetupHelper.java b/server/src/main/java/com/cloud/network/router/CommandSetupHelper.java index 10da04d04ca6..5fdc718a2b0f 100644 --- a/server/src/main/java/com/cloud/network/router/CommandSetupHelper.java +++ b/server/src/main/java/com/cloud/network/router/CommandSetupHelper.java @@ -31,6 +31,7 @@ import com.cloud.agent.api.HandleCksIsoCommand; import com.cloud.network.rules.PortForwardingRuleVO; import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.context.CallContext; import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService; import org.apache.cloudstack.framework.config.dao.ConfigurationDao; import org.apache.cloudstack.network.BgpPeer; @@ -226,10 +227,15 @@ public class CommandSetupHelper { @Qualifier("networkHelper") protected NetworkHelper _networkHelper; + private DataCenterVO findDataCenter(final long dataCenterId) { + return CallContext.current().getRequestEntityCache().get(DataCenterVO.class, dataCenterId, + () -> _dcDao.findById(dataCenterId)); + } + public void createVmDataCommand(final VirtualRouter router, final UserVm vm, final NicVO nic, final String publicKey, final Commands cmds) { if (vm != null && router != null && nic != null) { final String serviceOffering = _serviceOfferingDao.findByIdIncludingRemoved(vm.getId(), vm.getServiceOfferingId()).getDisplayText(); - final String zoneName = _dcDao.findById(router.getDataCenterId()).getName(); + final String zoneName = findDataCenter(router.getDataCenterId()).getName(); final IPAddressVO staticNatIp = _ipAddressDao.findByVmIdAndNetworkId(nic.getNetworkId(), vm.getId()); Host host = _hostDao.findById(vm.getHostId()); @@ -269,7 +275,7 @@ public void createApplyVpnUsersCommand(final List users, fina cmd.setAccessDetail(NetworkElementCommand.ACCOUNT_ID, String.valueOf(router.getAccountId())); cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, _routerControlHelper.getRouterControlIp(router.getId())); cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName()); - final DataCenterVO dcVo = _dcDao.findById(router.getDataCenterId()); + final DataCenterVO dcVo = findDataCenter(router.getDataCenterId()); cmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, dcVo.getNetworkType().toString()); cmds.addCommand("users", cmd); @@ -281,7 +287,7 @@ public void createDhcpEntryCommand(final VirtualRouter router, final UserVm vm, String gatewayIp = nic.getIPv4Gateway(); - final DataCenterVO dcVo = _dcDao.findById(router.getDataCenterId()); + final DataCenterVO dcVo = findDataCenter(router.getDataCenterId()); dhcpCommand.setDefaultRouter(gatewayIp); dhcpCommand.setIp6Gateway(nic.getIPv6Gateway()); @@ -306,7 +312,7 @@ public void createDhcpEntryCommand(final VirtualRouter router, final UserVm vm, public void createIpAlias(final VirtualRouter router, final List ipAliasTOs, final Long networkid, final Commands cmds) { final String routerip = _routerControlHelper.getRouterIpInNetwork(networkid, router.getId()); - final DataCenterVO dcVo = _dcDao.findById(router.getDataCenterId()); + final DataCenterVO dcVo = findDataCenter(router.getDataCenterId()); final CreateIpAliasCommand ipaliasCmd = new CreateIpAliasCommand(routerip, ipAliasTOs); ipaliasCmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, _routerControlHelper.getRouterControlIp(router.getId())); ipaliasCmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName()); @@ -317,7 +323,7 @@ public void createIpAlias(final VirtualRouter router, final List ipAl } public void configDnsMasq(final VirtualRouter router, final Network network, final Commands cmds) { - final DataCenterVO dcVo = _dcDao.findById(router.getDataCenterId()); + final DataCenterVO dcVo = findDataCenter(router.getDataCenterId()); final List ipAliasVOList = _nicIpAliasDao.listByNetworkIdAndState(network.getId(), NicIpAlias.State.active); final List ipList = new ArrayList(); @@ -338,7 +344,6 @@ public void configDnsMasq(final VirtualRouter router, final Network network, fin ipList.add(DhcpTO); ipAliasVO.setVmId(router.getId()); } - _dcDao.findById(router.getDataCenterId()); final DnsMasqConfigCommand dnsMasqConfigCmd = new DnsMasqConfigCommand(ipList); dnsMasqConfigCmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, _routerControlHelper.getRouterControlIp(router.getId())); dnsMasqConfigCmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName()); @@ -401,7 +406,7 @@ public void createApplyLoadBalancingRulesCommands(final List cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, _routerControlHelper.getRouterControlIp(router.getId())); cmd.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, _routerControlHelper.getRouterIpInNetwork(guestNetworkId, router.getId())); cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName()); - final DataCenterVO dcVo = _dcDao.findById(router.getDataCenterId()); + final DataCenterVO dcVo = findDataCenter(router.getDataCenterId()); cmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, dcVo.getNetworkType().toString()); cmds.addCommand(cmd); } @@ -428,7 +433,7 @@ public void createApplyPortForwardingRulesCommands(final List cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, _routerControlHelper.getRouterControlIp(router.getId())); cmd.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, _routerControlHelper.getRouterIpInNetwork(guestNetworkId, router.getId())); cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName()); - final DataCenterVO dcVo = _dcDao.findById(router.getDataCenterId()); + final DataCenterVO dcVo = findDataCenter(router.getDataCenterId()); cmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, dcVo.getNetworkType().toString()); if (systemRule != null) { cmd.setAccessDetail(NetworkElementCommand.FIREWALL_EGRESS_DEFAULT, systemRule); @@ -530,7 +535,7 @@ public void createApplyIpv6FirewallRulesCommands(final List rules cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, _routerControlHelper.getRouterControlIp(router.getId())); cmd.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, _routerControlHelper.getRouterIpInNetwork(guestNetworkId, router.getId())); cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName()); - final DataCenterVO dcVo = _dcDao.findById(router.getDataCenterId()); + final DataCenterVO dcVo = findDataCenter(router.getDataCenterId()); cmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, dcVo.getNetworkType().toString()); if (systemRule != null) { cmd.setAccessDetail(NetworkElementCommand.FIREWALL_EGRESS_DEFAULT, systemRule); @@ -619,7 +624,7 @@ public void createIpv6FirewallRulesCommands(final List r cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, _routerControlHelper.getRouterControlIp(router.getId())); cmd.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, _routerControlHelper.getRouterIpInNetwork(guestNetworkId, router.getId())); cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName()); - final DataCenterVO dcVo = _dcDao.findById(router.getDataCenterId()); + final DataCenterVO dcVo = findDataCenter(router.getDataCenterId()); cmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, dcVo.getNetworkType().toString()); if (systemRule != null) { cmd.setAccessDetail(NetworkElementCommand.FIREWALL_EGRESS_DEFAULT, systemRule); @@ -658,7 +663,7 @@ public void createNetworkACLsCommands(final List rules cmd.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, _routerControlHelper.getRouterIpInNetwork(guestNetworkId, router.getId())); cmd.setAccessDetail(NetworkElementCommand.GUEST_VLAN_TAG, guestVlan); cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName()); - final DataCenterVO dcVo = _dcDao.findById(router.getDataCenterId()); + final DataCenterVO dcVo = findDataCenter(router.getDataCenterId()); cmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, dcVo.getNetworkType().toString()); if (privateGateway) { cmd.setAccessDetail(NetworkElementCommand.VPC_PRIVATE_GATEWAY, String.valueOf(VpcGateway.Type.Private)); @@ -669,7 +674,7 @@ public void createNetworkACLsCommands(final List rules public void createPasswordCommand(final VirtualRouter router, final VirtualMachineProfile profile, final NicVO nic, final Commands cmds) { final String password = (String) profile.getParameter(VirtualMachineProfile.Param.VmPassword); - final DataCenterVO dcVo = _dcDao.findById(router.getDataCenterId()); + final DataCenterVO dcVo = findDataCenter(router.getDataCenterId()); // password should be set only on default network element if (password != null && nic.isDefaultNic()) { @@ -701,7 +706,7 @@ public void createApplyStaticNatCommands(final List rules, cmd.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, _routerControlHelper.getRouterIpInNetwork(guestNetworkId, router.getId())); cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName()); - final DataCenterVO dcVo = _dcDao.findById(router.getDataCenterId()); + final DataCenterVO dcVo = findDataCenter(router.getDataCenterId()); cmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, dcVo.getNetworkType().toString()); cmds.addCommand(cmd); } @@ -710,7 +715,7 @@ public void createStaticRouteCommands(final List staticRoute final SetStaticRouteCommand cmd = new SetStaticRouteCommand(staticRoutes); cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, _routerControlHelper.getRouterControlIp(router.getId())); cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName()); - final DataCenterVO dcVo = _dcDao.findById(router.getDataCenterId()); + final DataCenterVO dcVo = findDataCenter(router.getDataCenterId()); cmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, dcVo.getNetworkType().toString()); cmds.addCommand(cmd); } @@ -739,7 +744,7 @@ public void createApplyVpnCommands(final boolean isCreate, final RemoteAccessVpn startVpnCmd.setLocalCidr(cidr); startVpnCmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, _routerControlHelper.getRouterControlIp(router.getId())); startVpnCmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName()); - final DataCenterVO dcVo = _dcDao.findById(router.getDataCenterId()); + final DataCenterVO dcVo = findDataCenter(router.getDataCenterId()); startVpnCmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, dcVo.getNetworkType().toString()); cmds.addCommand("startVpn", startVpnCmd); @@ -747,7 +752,7 @@ public void createApplyVpnCommands(final boolean isCreate, final RemoteAccessVpn public void createVmDataCommandForVMs(final DomainRouterVO router, final Commands cmds, final long guestNetworkId) { final List vms = _userVmDao.listByNetworkIdAndStates(guestNetworkId, VirtualMachine.State.Running, VirtualMachine.State.Migrating, VirtualMachine.State.Stopping); - final DataCenterVO dc = _dcDao.findById(router.getDataCenterId()); + final DataCenterVO dc = findDataCenter(router.getDataCenterId()); for (final UserVmVO vm : vms) { boolean createVmData = true; if (dc.getNetworkType() == NetworkType.Basic && router.getPodIdToDeployIn().longValue() != vm.getPodIdToDeployIn().longValue()) { @@ -768,7 +773,7 @@ public void createVmDataCommandForVMs(final DomainRouterVO router, final Command public void createDhcpEntryCommandsForVMs(final DomainRouterVO router, final Commands cmds, final long guestNetworkId) { final List vms = _userVmDao.listByNetworkIdAndStates(guestNetworkId, VirtualMachine.State.Running, VirtualMachine.State.Migrating, VirtualMachine.State.Stopping); - final DataCenterVO dc = _dcDao.findById(router.getDataCenterId()); + final DataCenterVO dc = findDataCenter(router.getDataCenterId()); String dnsBasicZoneUpdates = _configDao.getValue(Config.DnsBasicZoneUpdates.key()); for (final UserVmVO vm : vms) { if (dc.getNetworkType() == NetworkType.Basic && router.getPodIdToDeployIn().longValue() != vm.getPodIdToDeployIn().longValue() @@ -787,7 +792,7 @@ public void createDhcpEntryCommandsForVMs(final DomainRouterVO router, final Com public void createDeleteIpAliasCommand(final DomainRouterVO router, final List deleteIpAliasTOs, final List createIpAliasTos, final long networkId, final Commands cmds) { final String routerip = _routerControlHelper.getRouterIpInNetwork(networkId, router.getId()); - final DataCenterVO dcVo = _dcDao.findById(router.getDataCenterId()); + final DataCenterVO dcVo = findDataCenter(router.getDataCenterId()); final DeleteIpAliasCommand deleteIpaliasCmd = new DeleteIpAliasCommand(routerip, deleteIpAliasTOs, createIpAliasTos); deleteIpaliasCmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, _routerControlHelper.getRouterControlIp(router.getId())); deleteIpaliasCmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName()); @@ -909,7 +914,7 @@ public int compare(final PublicIpAddress o1, final PublicIpAddress o2) { cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, _routerControlHelper.getRouterControlIp(router.getId())); cmd.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, _routerControlHelper.getRouterIpInNetwork(ipAddrList.get(0).getNetworkId(), router.getId())); cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName()); - final DataCenterVO dcVo = _dcDao.findById(router.getDataCenterId()); + final DataCenterVO dcVo = findDataCenter(router.getDataCenterId()); cmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, dcVo.getNetworkType().toString()); setAccessDetailNetworkLastPublicIp(vlanLastIpMap, vlanTagKey, cmd); @@ -923,7 +928,7 @@ public int compare(final PublicIpAddress o1, final PublicIpAddress o2) { final SetSourceNatCommand cmd = new SetSourceNatCommand(sourceNatIp, addSourceNat); cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, _routerControlHelper.getRouterControlIp(router.getId())); cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName()); - final DataCenterVO dcVo = _dcDao.findById(router.getDataCenterId()); + final DataCenterVO dcVo = findDataCenter(router.getDataCenterId()); cmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, dcVo.getNetworkType().toString()); cmds.addCommand("SetSourceNatCommand", cmd); } @@ -1054,7 +1059,7 @@ public int compare(final PublicIpAddress o1, final PublicIpAddress o2) { cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, _routerControlHelper.getRouterControlIp(router.getId())); cmd.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, _routerControlHelper.getRouterIpInNetwork(ipAddrList.get(0).getNetworkId(), router.getId())); cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName()); - final DataCenterVO dcVo = _dcDao.findById(router.getDataCenterId()); + final DataCenterVO dcVo = findDataCenter(router.getDataCenterId()); cmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, dcVo.getNetworkType().toString()); setAccessDetailNetworkLastPublicIp(vlanLastIpMap, vlanTagKey, cmd); @@ -1105,7 +1110,7 @@ public void createStaticRouteCommands(final List staticRoute final SetStaticRouteCommand cmd = new SetStaticRouteCommand(staticRoutes); cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, _routerControlHelper.getRouterControlIp(router.getId())); cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName()); - final DataCenterVO dcVo = _dcDao.findById(router.getDataCenterId()); + final DataCenterVO dcVo = findDataCenter(router.getDataCenterId()); cmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, dcVo.getNetworkType().toString()); cmds.addCommand(cmd); } @@ -1135,7 +1140,7 @@ public void createSite2SiteVpnCfgCommands(final Site2SiteVpnConnection conn, fin cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, _routerControlHelper.getRouterControlIp(router.getId())); cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, _routerControlHelper.getRouterControlIp(router.getId())); cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName()); - final DataCenterVO dcVo = _dcDao.findById(router.getDataCenterId()); + final DataCenterVO dcVo = findDataCenter(router.getDataCenterId()); cmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, dcVo.getNetworkType().toString()); cmds.addCommand("applyS2SVpn", cmd); } @@ -1176,7 +1181,7 @@ public void createVpcAssociatePrivateIPCommands(final VirtualRouter router, fina cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, _routerControlHelper.getRouterControlIp(router.getId())); cmd.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, _routerControlHelper.getRouterIpInNetwork(ipAddrList.get(0).getNetworkId(), router.getId())); cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName()); - final DataCenterVO dcVo = _dcDao.findById(router.getDataCenterId()); + final DataCenterVO dcVo = findDataCenter(router.getDataCenterId()); cmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, dcVo.getNetworkType().toString()); cmds.addCommand("IPAssocVpcCommand", cmd); @@ -1197,7 +1202,7 @@ public SetupGuestNetworkCommand createSetupGuestNetworkCommand(final DomainRoute final boolean setupDns = dnsProvided || dhcpProvided; if (setupDns) { - final DataCenterVO dcVo = _dcDao.findById(router.getDataCenterId()); + final DataCenterVO dcVo = findDataCenter(router.getDataCenterId()); defaultDns1 = guestNic.getIPv4Dns1(); defaultDns2 = guestNic.getIPv4Dns2(); if (org.apache.commons.lang3.StringUtils.isAllBlank(guestNic.getIPv4Dns1(), guestNic.getIPv4Dns2())) { @@ -1268,7 +1273,7 @@ private VmDataCommand generateVmDataCommand(final VirtualRouter router, final St cmd.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, _routerControlHelper.getRouterIpInNetwork(guestNetworkId, router.getId())); cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName()); - final DataCenterVO dcVo = _dcDao.findById(router.getDataCenterId()); + final DataCenterVO dcVo = findDataCenter(router.getDataCenterId()); cmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, dcVo.getNetworkType().toString()); cmd.addVmData("userdata", "user-data", userData); @@ -1343,7 +1348,7 @@ private NicVO findDefaultDnsIp(final long userVmId) { return findGatewayIp(userVmId); } - final DataCenter dc = _dcDao.findById(_networkModel.getNetwork(defaultNic.getNetworkId()).getDataCenterId()); + final DataCenter dc = findDataCenter(_networkModel.getNetwork(defaultNic.getNetworkId()).getDataCenterId()); final boolean isZoneBasic = dc.getNetworkType() == NetworkType.Basic; // find domR's nic in the network @@ -1427,7 +1432,7 @@ public void setupUpdateNetworkCommands(final VirtualRouter router, final Set bgpPeers, final final SetBgpPeersCommand cmd = new SetBgpPeersCommand(bgpPeerTOs); cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, _routerControlHelper.getRouterControlIp(router.getId())); cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName()); - final DataCenterVO dcVo = _dcDao.findById(router.getDataCenterId()); + final DataCenterVO dcVo = findDataCenter(router.getDataCenterId()); cmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, dcVo.getNetworkType().toString()); cmds.addCommand("bgpPeersCommand", cmd); } diff --git a/server/src/main/java/com/cloud/storage/StorageManagerImpl.java b/server/src/main/java/com/cloud/storage/StorageManagerImpl.java index e1833397e991..f0b7413fc695 100644 --- a/server/src/main/java/com/cloud/storage/StorageManagerImpl.java +++ b/server/src/main/java/com/cloud/storage/StorageManagerImpl.java @@ -2978,22 +2978,31 @@ public Pair checkIfReadyVolumeFitsInStoragePoolWithStorageAcces public String[] getStorageAccessGroups(Long zoneId, Long podId, Long clusterId, Long hostId) { List storageAccessGroups = new ArrayList<>(); if (hostId != null) { - HostVO host = _hostDao.findById(hostId); - ClusterVO cluster = _clusterDao.findById(host.getClusterId()); - HostPodVO pod = _podDao.findById(cluster.getPodId()); - DataCenterVO zone = _dcDao.findById(pod.getDataCenterId()); + HostVO host = CallContext.current().getRequestEntityCache().get(HostVO.class, hostId, + () -> _hostDao.findById(hostId)); + ClusterVO cluster = CallContext.current().getRequestEntityCache().get(ClusterVO.class, host.getClusterId(), + () -> _clusterDao.findById(host.getClusterId())); + HostPodVO pod = CallContext.current().getRequestEntityCache().get(HostPodVO.class, cluster.getPodId(), + () -> _podDao.findById(cluster.getPodId())); + DataCenterVO zone = CallContext.current().getRequestEntityCache().get(DataCenterVO.class, pod.getDataCenterId(), + () -> _dcDao.findById(pod.getDataCenterId())); storageAccessGroups.addAll(List.of(com.cloud.utils.StringUtils.splitCommaSeparatedStrings(host.getStorageAccessGroups(), cluster.getStorageAccessGroups(), pod.getStorageAccessGroups(), zone.getStorageAccessGroups()))); } else if (clusterId != null) { - ClusterVO cluster = _clusterDao.findById(clusterId); + ClusterVO cluster = CallContext.current().getRequestEntityCache().get(ClusterVO.class, clusterId, + () -> _clusterDao.findById(clusterId)); HostPodVO pod = _podDao.findById(cluster.getPodId()); - DataCenterVO zone = _dcDao.findById(pod.getDataCenterId()); + DataCenterVO zone = CallContext.current().getRequestEntityCache().get(DataCenterVO.class, pod.getDataCenterId(), + () -> _dcDao.findById(pod.getDataCenterId())); storageAccessGroups.addAll(List.of(com.cloud.utils.StringUtils.splitCommaSeparatedStrings(cluster.getStorageAccessGroups(), pod.getStorageAccessGroups(), zone.getStorageAccessGroups()))); } else if (podId != null) { - HostPodVO pod = _podDao.findById(podId); - DataCenterVO zone = _dcDao.findById(pod.getDataCenterId()); + HostPodVO pod = CallContext.current().getRequestEntityCache().get(HostPodVO.class, podId, + () -> _podDao.findById(podId)); + DataCenterVO zone = CallContext.current().getRequestEntityCache().get(DataCenterVO.class, pod.getDataCenterId(), + () -> _dcDao.findById(pod.getDataCenterId())); storageAccessGroups.addAll(List.of(com.cloud.utils.StringUtils.splitCommaSeparatedStrings(pod.getStorageAccessGroups(), zone.getStorageAccessGroups()))); } else if (zoneId != null) { - DataCenterVO zone = _dcDao.findById(zoneId); + DataCenterVO zone = CallContext.current().getRequestEntityCache().get(DataCenterVO.class, zoneId, + () -> _dcDao.findById(zoneId)); storageAccessGroups.addAll(List.of(com.cloud.utils.StringUtils.splitCommaSeparatedStrings(zone.getStorageAccessGroups()))); } From 7a235004f8f16383ec4f9d21e6bffd0a0c29d713 Mon Sep 17 00:00:00 2001 From: Abhishek Kumar Date: Fri, 5 Sep 2025 00:12:14 +0530 Subject: [PATCH 3/5] fix tests Signed-off-by: Abhishek Kumar --- .../service/NsxGuestNetworkGuruTest.java | 83 +-- .../deploy/DeploymentPlanningManagerImpl.java | 2 +- .../DeploymentPlanningManagerImplTest.java | 524 ++++-------------- .../element/VirtualRouterElementTest.java | 80 +-- .../guru/ExternalGuestNetworkGuruTest.java | 62 ++- .../router/CommandSetupHelperTest.java | 61 +- .../cloud/storage/StorageManagerImplTest.java | 41 +- 7 files changed, 307 insertions(+), 546 deletions(-) diff --git a/plugins/network-elements/nsx/src/test/java/org/apache/cloudstack/service/NsxGuestNetworkGuruTest.java b/plugins/network-elements/nsx/src/test/java/org/apache/cloudstack/service/NsxGuestNetworkGuruTest.java index cb79873f364d..7a143b77a357 100644 --- a/plugins/network-elements/nsx/src/test/java/org/apache/cloudstack/service/NsxGuestNetworkGuruTest.java +++ b/plugins/network-elements/nsx/src/test/java/org/apache/cloudstack/service/NsxGuestNetworkGuruTest.java @@ -16,6 +16,43 @@ // under the License. package org.apache.cloudstack.service; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.ArgumentMatchers.nullable; +import static org.mockito.Mockito.lenient; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.time.Duration; +import java.util.List; + +import org.apache.cloudstack.NsxAnswer; +import org.apache.cloudstack.agent.api.CreateNsxDhcpRelayConfigCommand; +import org.apache.cloudstack.agent.api.CreateNsxSegmentCommand; +import org.apache.cloudstack.agent.api.CreateNsxTier1GatewayCommand; +import org.apache.cloudstack.agent.api.NsxCommand; +import org.apache.cloudstack.context.CallContext; +import org.apache.cloudstack.context.RequestEntityCache; +import org.apache.cloudstack.utils.NsxControllerUtils; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentMatchers; +import org.mockito.Mock; +import org.mockito.MockedStatic; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.mockito.junit.MockitoJUnitRunner; +import org.springframework.test.util.ReflectionTestUtils; + import com.cloud.dc.DataCenter; import com.cloud.dc.DataCenterVO; import com.cloud.dc.dao.DataCenterDao; @@ -48,38 +85,6 @@ import com.cloud.vm.ReservationContext; import com.cloud.vm.VirtualMachine; import com.cloud.vm.VirtualMachineProfile; -import org.apache.cloudstack.NsxAnswer; -import org.apache.cloudstack.agent.api.CreateNsxDhcpRelayConfigCommand; -import org.apache.cloudstack.agent.api.CreateNsxSegmentCommand; -import org.apache.cloudstack.agent.api.CreateNsxTier1GatewayCommand; -import org.apache.cloudstack.agent.api.NsxCommand; -import org.apache.cloudstack.utils.NsxControllerUtils; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.ArgumentMatchers; -import org.mockito.Mock; -import org.mockito.Mockito; -import org.mockito.MockitoAnnotations; -import org.mockito.junit.MockitoJUnitRunner; -import org.springframework.test.util.ReflectionTestUtils; - -import java.util.List; - -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertSame; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyLong; -import static org.mockito.ArgumentMatchers.nullable; -import static org.mockito.Mockito.when; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.lenient; @RunWith(MockitoJUnitRunner.class) public class NsxGuestNetworkGuruTest { @@ -187,10 +192,16 @@ public void testNsxNetworkDesign() { when(physicalNetworkDao.findById(ArgumentMatchers.anyLong())).thenReturn(physicalNetwork); when(dcDao.findById(ArgumentMatchers.anyLong())).thenReturn(dataCenterVO); - Network designedNetwork = guru.design(offering, plan, network, "", 1L, account); - assertNotNull(designedNetwork); - assertSame(Networks.BroadcastDomainType.NSX, designedNetwork.getBroadcastDomainType()); - assertSame(Network.State.Allocated, designedNetwork.getState()); + + try (MockedStatic callContextMocked = Mockito.mockStatic(CallContext.class)) { + CallContext callContextMock = Mockito.mock(CallContext.class); + callContextMocked.when(CallContext::current).thenReturn(callContextMock); + Mockito.when(callContextMock.getRequestEntityCache()).thenReturn(new RequestEntityCache(Duration.ofSeconds(60))); + Network designedNetwork = guru.design(offering, plan, network, "", 1L, account); + assertNotNull(designedNetwork); + assertSame(Networks.BroadcastDomainType.NSX, designedNetwork.getBroadcastDomainType()); + assertSame(Network.State.Allocated, designedNetwork.getState()); + } } @Test diff --git a/server/src/main/java/com/cloud/deploy/DeploymentPlanningManagerImpl.java b/server/src/main/java/com/cloud/deploy/DeploymentPlanningManagerImpl.java index 6ddfdd962098..0987163ba44d 100644 --- a/server/src/main/java/com/cloud/deploy/DeploymentPlanningManagerImpl.java +++ b/server/src/main/java/com/cloud/deploy/DeploymentPlanningManagerImpl.java @@ -494,7 +494,7 @@ public DeployDestination planDeployment(VirtualMachineProfile vmProfile, Deploym return dest; } - private void avoidDifferentArchResources(VirtualMachineProfile vmProfile, DataCenter dc, ExcludeList avoids) { + protected void avoidDifferentArchResources(VirtualMachineProfile vmProfile, DataCenter dc, ExcludeList avoids) { VirtualMachineTemplate template = vmProfile.getTemplate(); for (CPU.CPUArch arch : clusterArchTypes) { if (arch.equals(template.getArch())) { diff --git a/server/src/test/java/com/cloud/deploy/DeploymentPlanningManagerImplTest.java b/server/src/test/java/com/cloud/deploy/DeploymentPlanningManagerImplTest.java index 5b03260d2d66..756d6cd39cc8 100644 --- a/server/src/test/java/com/cloud/deploy/DeploymentPlanningManagerImplTest.java +++ b/server/src/test/java/com/cloud/deploy/DeploymentPlanningManagerImplTest.java @@ -17,9 +17,48 @@ package com.cloud.deploy; -import com.cloud.agent.AgentManager; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +import java.lang.reflect.Field; +import java.time.Duration; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.apache.cloudstack.affinity.dao.AffinityGroupVMMapDao; +import org.apache.cloudstack.context.CallContext; +import org.apache.cloudstack.context.RequestEntityCache; +import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager; +import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStore; +import org.apache.cloudstack.engine.subsystem.api.storage.StoragePoolAllocator; +import org.apache.cloudstack.framework.config.ConfigKey; +import org.apache.cloudstack.framework.config.dao.ConfigurationDao; +import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao; +import org.apache.cloudstack.storage.datastore.db.StoragePoolVO; +import org.apache.commons.collections.CollectionUtils; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentMatchers; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.MockedStatic; +import org.mockito.Mockito; +import org.mockito.Spy; +import org.mockito.junit.MockitoJUnitRunner; +import org.springframework.test.util.ReflectionTestUtils; + import com.cloud.capacity.CapacityManager; -import com.cloud.capacity.dao.CapacityDao; import com.cloud.configuration.ConfigurationManagerImpl; import com.cloud.cpu.CPU; import com.cloud.dc.ClusterDetailsDao; @@ -37,15 +76,10 @@ import com.cloud.deploy.dao.PlannerHostReservationDao; import com.cloud.exception.AffinityConflictException; import com.cloud.exception.InsufficientServerCapacityException; -import com.cloud.gpu.GPU; -import com.cloud.gpu.dao.HostGpuGroupsDao; -import com.cloud.gpu.dao.VgpuProfileDao; import com.cloud.host.Host; import com.cloud.host.HostVO; import com.cloud.host.Status; import com.cloud.host.dao.HostDao; -import com.cloud.host.dao.HostDetailsDao; -import com.cloud.host.dao.HostTagsDao; import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.org.Grouping.AllocationState; import com.cloud.resource.ResourceManager; @@ -54,16 +88,12 @@ import com.cloud.storage.DiskOfferingVO; import com.cloud.storage.ScopeType; import com.cloud.storage.Storage; -import com.cloud.storage.StorageManager; import com.cloud.storage.StoragePool; import com.cloud.storage.StoragePoolStatus; import com.cloud.storage.VMTemplateVO; import com.cloud.storage.Volume; import com.cloud.storage.VolumeVO; import com.cloud.storage.dao.DiskOfferingDao; -import com.cloud.storage.dao.GuestOSCategoryDao; -import com.cloud.storage.dao.GuestOSDao; -import com.cloud.storage.dao.StoragePoolHostDao; import com.cloud.storage.dao.VMTemplateDao; import com.cloud.storage.dao.VolumeDao; import com.cloud.template.VirtualMachineTemplate; @@ -72,145 +102,80 @@ import com.cloud.user.AccountVO; import com.cloud.user.dao.AccountDao; import com.cloud.utils.Pair; -import com.cloud.utils.component.ComponentContext; -import com.cloud.vm.DiskProfile; import com.cloud.vm.VMInstanceVO; import com.cloud.vm.VirtualMachine; import com.cloud.vm.VirtualMachine.Type; import com.cloud.vm.VirtualMachineProfile; import com.cloud.vm.VirtualMachineProfileImpl; -import com.cloud.vm.dao.UserVmDao; -import com.cloud.vm.dao.VMInstanceDetailsDao; import com.cloud.vm.dao.VMInstanceDao; -import org.apache.cloudstack.affinity.AffinityGroupProcessor; -import org.apache.cloudstack.affinity.AffinityGroupService; -import org.apache.cloudstack.affinity.dao.AffinityGroupDao; -import org.apache.cloudstack.affinity.dao.AffinityGroupDomainMapDao; -import org.apache.cloudstack.affinity.dao.AffinityGroupVMMapDao; -import org.apache.cloudstack.engine.cloud.entity.api.db.dao.VMReservationDao; -import org.apache.cloudstack.engine.subsystem.api.storage.DataStore; -import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager; -import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStore; -import org.apache.cloudstack.engine.subsystem.api.storage.StoragePoolAllocator; -import org.apache.cloudstack.framework.config.ConfigKey; -import org.apache.cloudstack.framework.config.dao.ConfigurationDao; -import org.apache.cloudstack.framework.messagebus.MessageBus; -import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao; -import org.apache.cloudstack.storage.datastore.db.StoragePoolVO; -import org.apache.cloudstack.test.utils.SpringUtils; -import org.apache.commons.collections.CollectionUtils; -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.ArgumentMatchers; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Mockito; -import org.mockito.MockitoAnnotations; -import org.mockito.Spy; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.ComponentScan.Filter; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.FilterType; -import org.springframework.core.type.classreading.MetadataReader; -import org.springframework.core.type.classreading.MetadataReaderFactory; -import org.springframework.core.type.filter.TypeFilter; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.test.context.support.AnnotationConfigContextLoader; - -import javax.inject.Inject; -import javax.naming.ConfigurationException; -import java.io.IOException; -import java.lang.reflect.Field; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; +import com.cloud.vm.dao.VMInstanceDetailsDao; -@RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(loader = AnnotationConfigContextLoader.class) +@RunWith(MockitoJUnitRunner.class) public class DeploymentPlanningManagerImplTest { @Spy @InjectMocks DeploymentPlanningManagerImpl _dpm; - @Inject + @Mock PlannerHostReservationDao _plannerHostReserveDao; - @Inject + @Mock VirtualMachineProfileImpl vmProfile; - @Inject + @Mock private AccountDao accountDao; - @Inject + @Mock private VMInstanceDao vmInstanceDao; - @Inject + @Mock AffinityGroupVMMapDao _affinityGroupVMMapDao; - @Inject + @Mock ExcludeList avoids; - @Inject + @Mock DataCenterVO dc; - @Inject + @Mock DataCenterDao _dcDao; @Mock FirstFitPlanner _planner; - @Inject + @Mock ClusterDao _clusterDao; - @Inject + @Mock DedicatedResourceDao _dedicatedDao; - @Inject + @Mock VMInstanceDetailsDao vmDetailsDao; - @Inject + @Mock VMTemplateDao templateDao; - @Inject - HostPodDao hostPodDao; - - @Inject + @Mock VolumeDao volDao; - @Inject + @Mock HostDao hostDao; - @Inject + @Mock CapacityManager capacityMgr; - @Inject + @Mock ServiceOfferingDetailsDao serviceOfferingDetailsDao; - @Inject + @Mock ClusterDetailsDao clusterDetailsDao; - @Inject + @Mock PrimaryDataStoreDao primaryDataStoreDao; @Mock - Host host; + HostVO host; @Mock ConfigurationDao configDao; @@ -218,36 +183,35 @@ public class DeploymentPlanningManagerImplTest { @Mock AccountManager _accountMgr; - @Inject + @Mock DiskOfferingDao _diskOfferingDao; @Mock DataStoreManager _dataStoreManager; - @Inject + @Mock HostPodDao _podDao; + @Mock + CallContext callContextMock; + + @Mock + ResourceManager resourceManager; + private static final long dataCenterId = 1L; private static final long instanceId = 123L; private static final long hostId = 0L; private static final long podId = 2L; private static final long clusterId = 3L; private static final long ADMIN_ACCOUNT_ROLE_ID = 1L; - private AutoCloseable closeable; - @BeforeClass - public static void setUp() throws ConfigurationException { - } + MockedStatic callContextMocked; @Before public void testSetUp() { - closeable = MockitoAnnotations.openMocks(this); - - ComponentContext.initComponentsLifeCycle(); - - PlannerHostReservationVO reservationVO = new PlannerHostReservationVO(hostId, dataCenterId, podId, clusterId, PlannerResourceUsage.Shared); - Mockito.when(_plannerHostReserveDao.persist(ArgumentMatchers.any(PlannerHostReservationVO.class))).thenReturn(reservationVO); - Mockito.when(_plannerHostReserveDao.findById(ArgumentMatchers.anyLong())).thenReturn(reservationVO); + callContextMocked = Mockito.mockStatic(CallContext.class); + callContextMocked.when(CallContext::current).thenReturn(callContextMock); + Mockito.when(callContextMock.getRequestEntityCache()).thenReturn(new RequestEntityCache(Duration.ofSeconds(60))); Mockito.when(_affinityGroupVMMapDao.countAffinityGroupsForVm(ArgumentMatchers.anyLong())).thenReturn(0L); VMTemplateVO template = Mockito.mock(VMTemplateVO.class); @@ -255,16 +219,16 @@ public void testSetUp() { Mockito.when(templateDao.findById(Mockito.anyLong())).thenReturn(template); VMInstanceVO vm = Mockito.mock(VMInstanceVO.class); + Mockito.when(vm.getId()).thenReturn(instanceId); Mockito.when(vm.getType()).thenReturn(Type.Instance); Mockito.when(vm.getLastHostId()).thenReturn(null); Mockito.when(vmProfile.getVirtualMachine()).thenReturn(vm); + Mockito.when(vmProfile.getTemplate()).thenReturn(template); Mockito.when(vmProfile.getId()).thenReturn(instanceId); - Mockito.when(vmDetailsDao.listDetailsKeyPairs(ArgumentMatchers.anyLong())).thenReturn(null); - Mockito.when(volDao.findByInstance(ArgumentMatchers.anyLong())).thenReturn(new ArrayList<>()); - Mockito.when(_dcDao.findById(ArgumentMatchers.anyLong())).thenReturn(dc); + Mockito.when(_dcDao.findById(Mockito.anyLong())).thenReturn(dc); Mockito.when(dc.getId()).thenReturn(dataCenterId); ClusterVO clusterVO = new ClusterVO(); @@ -282,11 +246,6 @@ public void testSetUp() { Mockito.doNothing().when(_dpm).avoidDisabledResources(vmProfile, dc, avoids); } - @After - public void tearDown() throws Exception { - closeable.close(); - } - @Test public void dataCenterAvoidTest() throws InsufficientServerCapacityException, AffinityConflictException { ServiceOfferingVO svcOffering = @@ -301,15 +260,21 @@ public void dataCenterAvoidTest() throws InsufficientServerCapacityException, Af Mockito.when(template.getArch()).thenReturn(CPU.CPUArch.amd64); Mockito.when(vmProfile.getTemplate()).thenReturn(template); Mockito.when(_clusterDao.listClustersByArchAndZoneId(dataCenterId, CPU.CPUArch.arm64)).thenReturn(null); + Mockito.doNothing().when(_dpm).avoidDisabledResources(vmProfile, dc, avoids); DeployDestination dest = _dpm.planDeployment(vmProfile, plan, avoids, null); assertNull("DataCenter is in avoid set, destination should be null! ", dest); } + @After + public void tearDown() throws Exception { + callContextMocked.close(); + } + @Test public void plannerCannotHandleTest() throws InsufficientServerCapacityException, AffinityConflictException { ServiceOfferingVO svcOffering = new ServiceOfferingVO("testOffering", 1, 512, 500, 1, 1, false, false, false, "test dpm", - false, VirtualMachine.Type.User, null, "UserDispersingPlanner", true, false); + false, VirtualMachine.Type.User, null, "FirstFitPlanner", true, false); Mockito.when(vmProfile.getServiceOffering()).thenReturn(svcOffering); DataCenterDeployment plan = new DataCenterDeployment(dataCenterId); @@ -317,7 +282,6 @@ public void plannerCannotHandleTest() throws InsufficientServerCapacityException Mockito.when(_planner.canHandle(vmProfile, plan, avoids)).thenReturn(false); VirtualMachineTemplate template = Mockito.mock(VirtualMachineTemplate.class); - Mockito.when(template.getArch()).thenReturn(CPU.CPUArch.amd64); Mockito.when(vmProfile.getTemplate()).thenReturn(template); Mockito.when(_clusterDao.listClustersByArchAndZoneId(dataCenterId, CPU.CPUArch.arm64)).thenReturn(null); DeployDestination dest = _dpm.planDeployment(vmProfile, plan, avoids, null); @@ -340,6 +304,7 @@ public void emptyClusterListTest() throws InsufficientServerCapacityException, A Mockito.when(template.getArch()).thenReturn(CPU.CPUArch.amd64); Mockito.when(vmProfile.getTemplate()).thenReturn(template); Mockito.when(_clusterDao.listClustersByArchAndZoneId(dataCenterId, CPU.CPUArch.arm64)).thenReturn(null); + Mockito.doNothing().when(_dpm).avoidDisabledResources(vmProfile, dc, avoids); DeployDestination dest = _dpm.planDeployment(vmProfile, plan, avoids, null); assertNull("Planner cannot handle, destination should be null! ", dest); } @@ -457,7 +422,7 @@ public void avoidDisabledDataCentersTest() { ExcludeList avoids = new ExcludeList(); AllocationState[] allocationStates = AllocationState.values(); - for (int i = 0; i < allocationStates.length - 1; ++i) { + for (int i = 0; i < allocationStates.length; ++i) { Mockito.when(dc.getAllocationState()).thenReturn(allocationStates[i]); _dpm.avoidDisabledDataCenters(dc, avoids); @@ -478,7 +443,7 @@ public void avoidDisabledPodsTestNoDisabledPod() { List podIds = new ArrayList<>(); long expectedPodId = 123l; podIds.add(expectedPodId); - Mockito.doReturn(new ArrayList<>()).when(hostPodDao).listDisabledPods(Mockito.anyLong()); + Mockito.doReturn(new ArrayList<>()).when(_podDao).listDisabledPods(Mockito.anyLong()); ExcludeList avoids = new ExcludeList(); _dpm.avoidDisabledPods(dc, avoids); @@ -491,7 +456,7 @@ public void avoidDisabledPodsTestHasDisabledPod() { List podIds = new ArrayList<>(); long expectedPodId = 123l; podIds.add(expectedPodId); - Mockito.doReturn(podIds).when(hostPodDao).listDisabledPods(Mockito.anyLong()); + Mockito.doReturn(podIds).when(_podDao).listDisabledPods(Mockito.anyLong()); ExcludeList avoids = new ExcludeList(); @@ -627,7 +592,7 @@ public void passNoEncRootProvidedHostNotSupportingEncryptionTest() { */ @Test public void passNoEncRootProvidedHostSupportingEncryptionTest() { - HostVO host = new HostVO("host"); + ReflectionTestUtils.setField(host, "id", 1L); Map hostDetails = new HashMap<>() {{ put(Host.HOST_VOLUME_ENCRYPTION, "true"); }}; @@ -641,7 +606,7 @@ public void passNoEncRootProvidedHostSupportingEncryptionTest() { try { DeployDestination dest = _dpm.planDeployment(vmProfile, plan, avoids, null); Assert.assertEquals(dest.getHost(), host); - } catch (Exception ex) { + } catch (InsufficientServerCapacityException | AffinityConflictException ex) { ex.printStackTrace(); } } @@ -664,15 +629,16 @@ public void passEncRootLastHostSupportingEncryptionTest() { setupMocksForPlanDeploymentHostTests(host, vol1); VMInstanceVO vm = (VMInstanceVO) vmProfile.getVirtualMachine(); - vm.setLastHostId(hostId); + Mockito.when(vm.getLastHostId()).thenReturn(hostId); // host id is null here so we pick up last host id DataCenterDeployment plan = new DataCenterDeployment(dataCenterId, podId, clusterId, null, null, null); try { DeployDestination dest = _dpm.planDeployment(vmProfile, plan, avoids, null); - Assert.assertEquals(dest.getHost(), host); - } catch (Exception ex) { - ex.printStackTrace(); + Assert.assertNotNull(dest); + Assert.assertEquals(host, dest.getHost()); + } catch (InsufficientServerCapacityException | AffinityConflictException ex) { + Assert.fail(ex.getMessage()); } } @@ -686,7 +652,6 @@ public void failEncRootLastHostNotSupportingEncryptionTest() { put(Host.HOST_VOLUME_ENCRYPTION, "false"); }}; host.setDetails(hostDetails); - Mockito.when(host.getStatus()).thenReturn(Status.Up); VolumeVO vol1 = new VolumeVO("vol1", dataCenterId, podId, 1L, 1L, instanceId, "folder", "path", Storage.ProvisioningType.THIN, (long) 10 << 30, Volume.Type.ROOT); vol1.setPassphraseId(1L); @@ -694,14 +659,14 @@ public void failEncRootLastHostNotSupportingEncryptionTest() { setupMocksForPlanDeploymentHostTests(host, vol1); VMInstanceVO vm = (VMInstanceVO) vmProfile.getVirtualMachine(); - vm.setLastHostId(hostId); + Mockito.when(vm.getLastHostId()).thenReturn(hostId); // host id is null here so we pick up last host id DataCenterDeployment plan = new DataCenterDeployment(dataCenterId, podId, clusterId, null, null, null); try { DeployDestination dest = _dpm.planDeployment(vmProfile, plan, avoids, null); Assert.assertNull("Destination should be null since last host doesn't support encryption and root requires it", dest); } catch (Exception ex) { - ex.printStackTrace(); + Assert.fail(ex.getMessage()); } } @@ -712,7 +677,6 @@ public void passEncRootPlannerHostSupportingEncryptionTest() { put(Host.HOST_VOLUME_ENCRYPTION, "true"); }}; host.setDetails(hostDetails); - Mockito.when(host.getStatus()).thenReturn(Status.Up); VolumeVO vol1 = new VolumeVO("vol1", dataCenterId, podId, 1L, 1L, instanceId, "folder", "path", Storage.ProvisioningType.THIN, (long) 10 << 30, Volume.Type.ROOT); vol1.setPassphraseId(1L); @@ -737,7 +701,6 @@ public void failEncRootPlannerHostSupportingEncryptionTest() { put(Host.HOST_VOLUME_ENCRYPTION, "false"); }}; host.setDetails(hostDetails); - Mockito.when(host.getStatus()).thenReturn(Status.Up); VolumeVO vol1 = new VolumeVO("vol1", dataCenterId, podId, 1L, 1L, instanceId, "folder", "path", Storage.ProvisioningType.THIN, (long) 10 << 30, Volume.Type.ROOT); vol1.setPassphraseId(1L); @@ -755,18 +718,13 @@ public void failEncRootPlannerHostSupportingEncryptionTest() { } } + /** + * Test that when `findSuitablePoolsForVolumes` fails to find suitable pools for a volume, + * the volume's poolId is cleared to avoid incorrect pool assignment in subsequent deployment attempts. + */ @Test - public void findSuitablePoolsForVolumesTest() throws Exception { + public void testFailedFindSuitablePoolsForVolumesTestClearsVolumePoolId() { Long diskOfferingId = 1L; - HostVO host = Mockito.spy(new HostVO("host")); - Map hostDetails = new HashMap<>() { - { - put(Host.HOST_VOLUME_ENCRYPTION, "true"); - } - }; - host.setDetails(hostDetails); - Mockito.when(host.getStatus()).thenReturn(Status.Up); - VolumeVO vol1 = Mockito.spy(new VolumeVO("vol1", dataCenterId, podId, 1L, 1L, instanceId, "folder", "path", Storage.ProvisioningType.THIN, (long) 10 << 30, Volume.Type.ROOT)); Mockito.when(vol1.getId()).thenReturn(1L); @@ -774,63 +732,37 @@ public void findSuitablePoolsForVolumesTest() throws Exception { vol1.setPassphraseId(1L); vol1.setPoolId(1L); vol1.setDiskOfferingId(diskOfferingId); - StoragePoolVO storagePool = new StoragePoolVO(); storagePool.setStatus(StoragePoolStatus.Maintenance); storagePool.setId(vol1.getPoolId()); storagePool.setDataCenterId(dataCenterId); storagePool.setPodId(podId); storagePool.setClusterId(clusterId); - - DiskProfile diskProfile = Mockito.mock(DiskProfile.class); - - StoragePoolAllocator allocator = Mockito.mock(StoragePoolAllocator.class); - - DataCenterDeployment plan = new DataCenterDeployment(dataCenterId, podId, clusterId, null, null, null); - + DataCenterDeployment plan = new DataCenterDeployment(dataCenterId, podId, clusterId, null, 1L, null); Account account = Mockito.mock(Account.class); Mockito.when(account.getId()).thenReturn(1L); Mockito.when(vmProfile.getOwner()).thenReturn(account); Mockito.when(_accountMgr.isRootAdmin(account.getId())).thenReturn(Boolean.FALSE); - Mockito.when(_dcDao.findById(dataCenterId)).thenReturn(dc); Mockito.when(dc.getAllocationState()).thenReturn(AllocationState.Enabled); - HostPodVO podVo = Mockito.mock(HostPodVO.class); Mockito.when(podVo.getAllocationState()).thenReturn(AllocationState.Enabled); - Mockito.doReturn(podVo).when(_podDao).findById(podId); - + Mockito.when(_podDao.findById(podId)).thenReturn(podVo); ClusterVO cluster = Mockito.mock(ClusterVO.class); Mockito.when(cluster.getAllocationState()).thenReturn(AllocationState.Enabled); Mockito.when(_clusterDao.findById(clusterId)).thenReturn(cluster); - DiskOfferingVO diskOffering = Mockito.mock(DiskOfferingVO.class); - Mockito.when(_diskOfferingDao.findById(vol1.getDiskOfferingId())).thenReturn(diskOffering); - VirtualMachineTemplate vmt = Mockito.mock(VirtualMachineTemplate.class); - - ServiceOfferingVO serviceOffering = Mockito.mock(ServiceOfferingVO.class); - Mockito.when(vmProfile.getServiceOffering()).thenReturn(serviceOffering); - - PrimaryDataStore primaryDataStore = Mockito.mock(PrimaryDataStore.class); - - Mockito.when(vmt.getFormat()).thenReturn(Storage.ImageFormat.ISO); - Mockito.when(vmProfile.getTemplate()).thenReturn(vmt); - Mockito.when(vmProfile.getId()).thenReturn(1L); Mockito.when(vmProfile.getType()).thenReturn(VirtualMachine.Type.User); Mockito.when(volDao.findUsableVolumesForInstance(1L)).thenReturn(Arrays.asList(vol1)); Mockito.when(volDao.findByInstanceAndType(1L, Volume.Type.ROOT)).thenReturn(Arrays.asList(vol1)); - Mockito.when(_dataStoreManager.getPrimaryDataStore(vol1.getPoolId())).thenReturn((DataStore) primaryDataStore); - Mockito.when(avoids.shouldAvoid(storagePool)).thenReturn(Boolean.FALSE); - - Mockito.doReturn(Arrays.asList(storagePool)).when(allocator).allocateToPool(diskProfile, vmProfile, plan, - avoids, 10); + PrimaryDataStore primaryDataStore = Mockito.mock(PrimaryDataStore.class); + Mockito.when(_dataStoreManager.getPrimaryDataStore(vol1.getPoolId())).thenReturn(primaryDataStore); Mockito.when(volDao.update(vol1.getId(), vol1)).thenReturn(true); _dpm.findSuitablePoolsForVolumes(vmProfile, plan, avoids, 10); verify(vol1, times(1)).setPoolId(null); - assertTrue(vol1.getPoolId() == null); - + Assert.assertNull(vol1.getPoolId()); } // This is so ugly but everything is so intertwined... @@ -900,11 +832,13 @@ private DeploymentClusterPlanner setupMocksForPlanDeploymentHostTests(HostVO hos ArgumentMatchers.anyFloat(), ArgumentMatchers.anyBoolean() )).thenReturn(true); - Mockito.when(serviceOfferingDetailsDao.findDetail(vmProfile.getServiceOfferingId(), GPU.Keys.vgpuType.toString())).thenReturn(null); Mockito.doReturn(true).when(_dpm).checkVmProfileAndHost(vmProfile, host); Mockito.doReturn(true).when(_dpm).checkIfHostFitsPlannerUsage(ArgumentMatchers.any(Host.class), ArgumentMatchers.nullable(PlannerResourceUsage.class)); Mockito.when(clusterDetailsDao.findDetail(ArgumentMatchers.anyLong(), ArgumentMatchers.anyString())).thenReturn(new ClusterDetailsVO(clusterId, "mock", "1")); + Mockito.doNothing().when(_dpm).avoidDifferentArchResources(Mockito.any(), Mockito.any(), Mockito.any()); + + Mockito.when(resourceManager.isGPUDeviceAvailable(svcOffering, host, instanceId)).thenReturn(true); DeploymentClusterPlanner planner = Mockito.spy(new FirstFitPlanner()); try { @@ -913,8 +847,8 @@ private DeploymentClusterPlanner setupMocksForPlanDeploymentHostTests(HostVO hos ArgumentMatchers.any(DeploymentPlan.class), ArgumentMatchers.any(ExcludeList.class) ); - } catch (Exception ex) { - ex.printStackTrace(); + } catch (InsufficientServerCapacityException ex) { + Assert.fail(ex.getMessage()); } return planner; @@ -925,7 +859,7 @@ private DataCenter prepareAvoidDisabledTests() { Mockito.when(dc.getId()).thenReturn(123l); List podIds = new ArrayList<>(); podIds.add(1l); - Mockito.doReturn(podIds).when(hostPodDao).listAllPods(Mockito.anyLong()); + Mockito.doReturn(podIds).when(_podDao).listAllPods(Mockito.anyLong()); return dc; } @@ -937,238 +871,6 @@ private void assertAvoidIsEmpty(ExcludeList avoids, boolean isDcEmpty, boolean i Assert.assertEquals(isHostsEmpty, CollectionUtils.isEmpty(avoids.getHostsToAvoid())); } - @Configuration - @ComponentScan(basePackageClasses = {DeploymentPlanningManagerImpl.class}, - includeFilters = {@Filter(value = TestConfiguration.Library.class, - type = FilterType.CUSTOM)}, useDefaultFilters = false) - public static class TestConfiguration extends SpringUtils.CloudStackTestConfiguration { - - @Bean - public FirstFitPlanner firstFitPlanner() { - return Mockito.mock(FirstFitPlanner.class); - } - - @Bean - public DeploymentPlanner deploymentPlanner() { - return Mockito.mock(DeploymentPlanner.class); - } - - @Bean - public DataCenterVO dataCenter() { - return Mockito.mock(DataCenterVO.class); - } - - @Bean - public ExcludeList excludeList() { - return Mockito.mock(ExcludeList.class); - } - - @Bean - public VirtualMachineProfileImpl virtualMachineProfileImpl() { - return Mockito.mock(VirtualMachineProfileImpl.class); - } - - @Bean - public HostTagsDao hostTagsDao() { - return Mockito.mock(HostTagsDao.class); - } - - @Bean - public HostDetailsDao hostDetailsDao() { - return Mockito.mock(HostDetailsDao.class); - } - - - @Bean - public ClusterDetailsDao clusterDetailsDao() { - return Mockito.mock(ClusterDetailsDao.class); - } - - @Bean - public ResourceManager resourceManager() { - return Mockito.mock(ResourceManager.class); - } - - @Bean - public ServiceOfferingDetailsDao serviceOfferingDetailsDao() { - return Mockito.mock(ServiceOfferingDetailsDao.class); - } - - @Bean - public AffinityGroupDomainMapDao affinityGroupDomainMapDao() { - return Mockito.mock(AffinityGroupDomainMapDao.class); - } - - @Bean - public DataStoreManager cataStoreManager() { - return Mockito.mock(DataStoreManager.class); - } - - @Bean - public StorageManager storageManager() { - return Mockito.mock(StorageManager.class); - } - - @Bean - public HostDao hostDao() { - return Mockito.mock(HostDao.class); - } - - @Bean - public HostPodDao hostPodDao() { - return Mockito.mock(HostPodDao.class); - } - - @Bean - public ClusterDao clusterDao() { - return Mockito.mock(ClusterDao.class); - } - - @Bean - public DedicatedResourceDao dedicatedResourceDao() { - return Mockito.mock(DedicatedResourceDao.class); - } - - @Bean - public GuestOSDao guestOSDao() { - return Mockito.mock(GuestOSDao.class); - } - - @Bean - public GuestOSCategoryDao guestOSCategoryDao() { - return Mockito.mock(GuestOSCategoryDao.class); - } - - @Bean - public CapacityManager capacityManager() { - return Mockito.mock(CapacityManager.class); - } - - @Bean - public StoragePoolHostDao storagePoolHostDao() { - return Mockito.mock(StoragePoolHostDao.class); - } - - @Bean - public VolumeDao volumeDao() { - return Mockito.mock(VolumeDao.class); - } - - @Bean - public ConfigurationDao configurationDao() { - return Mockito.mock(ConfigurationDao.class); - } - - @Bean - public DiskOfferingDao diskOfferingDao() { - return Mockito.mock(DiskOfferingDao.class); - } - - @Bean - public PrimaryDataStoreDao primaryDataStoreDao() { - return Mockito.mock(PrimaryDataStoreDao.class); - } - - @Bean - public CapacityDao capacityDao() { - return Mockito.mock(CapacityDao.class); - } - - @Bean - public PlannerHostReservationDao plannerHostReservationDao() { - return Mockito.mock(PlannerHostReservationDao.class); - } - - @Bean - public AffinityGroupProcessor affinityGroupProcessor() { - return Mockito.mock(AffinityGroupProcessor.class); - } - - @Bean - public AffinityGroupDao affinityGroupDao() { - return Mockito.mock(AffinityGroupDao.class); - } - - @Bean - public AffinityGroupVMMapDao affinityGroupVMMapDao() { - return Mockito.mock(AffinityGroupVMMapDao.class); - } - - @Bean - public AccountManager accountManager() { - return Mockito.mock(AccountManager.class); - } - - @Bean - public AgentManager agentManager() { - return Mockito.mock(AgentManager.class); - } - - @Bean - public MessageBus messageBus() { - return Mockito.mock(MessageBus.class); - } - - @Bean - public UserVmDao userVMDao() { - return Mockito.mock(UserVmDao.class); - } - - @Bean - public VMInstanceDetailsDao vmInstanceDetailsDao() { - return Mockito.mock(VMInstanceDetailsDao.class); - } - - @Bean - public VMInstanceDao vmInstanceDao() { - return Mockito.mock(VMInstanceDao.class); - } - - @Bean - public DataCenterDao dataCenterDao() { - return Mockito.mock(DataCenterDao.class); - } - - @Bean - public VMReservationDao reservationDao() { - return Mockito.mock(VMReservationDao.class); - } - - @Bean - public AffinityGroupService affinityGroupService() { - return Mockito.mock(AffinityGroupService.class); - } - - @Bean - public HostGpuGroupsDao hostGpuGroupsDao() { - return Mockito.mock(HostGpuGroupsDao.class); - } - - @Bean - public AccountDao accountDao() { - return Mockito.mock(AccountDao.class); - } - - @Bean - public VMTemplateDao vmTemplateDao() { - return Mockito.mock(VMTemplateDao.class); - } - - @Bean - public VgpuProfileDao vgpuProfileDao() { - return Mockito.mock(VgpuProfileDao.class); - } - - public static class Library implements TypeFilter { - - @Override - public boolean match(MetadataReader mdr, MetadataReaderFactory arg1) throws IOException { - ComponentScan cs = TestConfiguration.class.getAnnotation(ComponentScan.class); - return SpringUtils.includedInBasePackageClasses(mdr.getClassMetadata().getClassName(), cs); - } - } - } - @Test public void testReorderHostsByPriority() { Map priorities = new LinkedHashMap<>(); diff --git a/server/src/test/java/com/cloud/network/element/VirtualRouterElementTest.java b/server/src/test/java/com/cloud/network/element/VirtualRouterElementTest.java index ba6aa55169b6..1300e11bb134 100644 --- a/server/src/test/java/com/cloud/network/element/VirtualRouterElementTest.java +++ b/server/src/test/java/com/cloud/network/element/VirtualRouterElementTest.java @@ -16,6 +16,44 @@ // under the License. package com.cloud.network.element; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyBoolean; +import static org.mockito.ArgumentMatchers.anyList; +import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.lenient; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.time.Duration; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import org.apache.cloudstack.context.CallContext; +import org.apache.cloudstack.context.RequestEntityCache; +import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService; +import org.apache.cloudstack.framework.config.dao.ConfigurationDao; +import org.apache.cloudstack.network.BgpPeerVO; +import org.apache.cloudstack.network.router.deployment.RouterDeploymentDefinitionBuilder; +import org.apache.cloudstack.network.topology.NetworkTopology; +import org.apache.cloudstack.network.topology.NetworkTopologyContext; +import org.junit.Assert; +import org.junit.Ignore; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentMatchers; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.MockedStatic; +import org.mockito.Mockito; +import org.mockito.invocation.InvocationOnMock; +import org.mockito.junit.MockitoJUnitRunner; +import org.mockito.stubbing.Answer; + import com.cloud.cluster.dao.ManagementServerHostDao; import com.cloud.configuration.ConfigurationManager; import com.cloud.dc.DataCenter; @@ -95,42 +133,8 @@ import com.cloud.vm.dao.NicDao; import com.cloud.vm.dao.NicIpAliasDao; import com.cloud.vm.dao.UserVmDao; -import com.cloud.vm.dao.VMInstanceDetailsDao; import com.cloud.vm.dao.VMInstanceDao; - -import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService; -import org.apache.cloudstack.framework.config.dao.ConfigurationDao; -import org.apache.cloudstack.network.BgpPeerVO; -import org.apache.cloudstack.network.router.deployment.RouterDeploymentDefinitionBuilder; -import org.apache.cloudstack.network.topology.NetworkTopology; -import org.apache.cloudstack.network.topology.NetworkTopologyContext; -import org.junit.Assert; -import org.junit.Ignore; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.InjectMocks; -import org.mockito.ArgumentMatchers; -import org.mockito.Mock; -import org.mockito.Mockito; -import org.mockito.invocation.InvocationOnMock; -import org.mockito.junit.MockitoJUnitRunner; -import org.mockito.stubbing.Answer; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.stream.Collectors; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyBoolean; -import static org.mockito.ArgumentMatchers.anyList; -import static org.mockito.ArgumentMatchers.anyLong; -import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.lenient; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; +import com.cloud.vm.dao.VMInstanceDetailsDao; @RunWith(MockitoJUnitRunner.class) public class VirtualRouterElementTest { @@ -572,9 +576,15 @@ public void testApplyBgpPeersForNetwork() throws ResourceUnavailableException { when(networkTopologyContext.retrieveNetworkTopology(dc)).thenReturn(networkTopology); doReturn(true).when(networkTopology).applyBgpPeers(any(), any(), any()); + try (MockedStatic callContextMocked = Mockito.mockStatic(CallContext.class)) { + CallContext callContextMock = Mockito.mock(CallContext.class); + callContextMocked.when(CallContext::current).thenReturn(callContextMock); + Mockito.when(callContextMock.getRequestEntityCache()).thenReturn(new RequestEntityCache(Duration.ofSeconds(60))); + boolean result = virtualRouterElement.applyBgpPeers(null, network, bgpPeers); Assert.assertTrue(result); verify(networkTopology).applyBgpPeers(any(), any(), any()); + } } } diff --git a/server/src/test/java/com/cloud/network/guru/ExternalGuestNetworkGuruTest.java b/server/src/test/java/com/cloud/network/guru/ExternalGuestNetworkGuruTest.java index bcb39b6b3b5f..233e722fac75 100644 --- a/server/src/test/java/com/cloud/network/guru/ExternalGuestNetworkGuruTest.java +++ b/server/src/test/java/com/cloud/network/guru/ExternalGuestNetworkGuruTest.java @@ -16,6 +16,22 @@ // under the License. package com.cloud.network.guru; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; + +import java.time.Duration; + +import org.apache.cloudstack.context.CallContext; +import org.apache.cloudstack.context.RequestEntityCache; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.MockedStatic; +import org.mockito.Mockito; +import org.mockito.junit.MockitoJUnitRunner; + import com.cloud.dc.DataCenter; import com.cloud.dc.DataCenterVO; import com.cloud.dc.dao.DataCenterDao; @@ -30,16 +46,6 @@ import com.cloud.user.Account; import com.cloud.utils.Pair; import com.cloud.vm.NicProfile; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Mockito; -import org.mockito.junit.MockitoJUnitRunner; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; @RunWith(MockitoJUnitRunner.class) public class ExternalGuestNetworkGuruTest { @@ -91,12 +97,18 @@ public void testUpdateNicProfile() { Mockito.when(dataCenterDao.findById(Mockito.anyLong())).thenReturn(zone); Mockito.when(networkModel.getNetworkIp4Dns(network, zone)).thenReturn(new Pair<>(ip4Dns[0], ip4Dns[1])); Mockito.when(networkModel.getNetworkIp6Dns(network, zone)).thenReturn(new Pair<>(ip6Dns[0], ip6Dns[1])); - guru.updateNicProfile(nicProfile, network); - assertNotNull(nicProfile); - assertEquals(ip4Dns[0], nicProfile.getIPv4Dns1()); - assertEquals(ip4Dns[1], nicProfile.getIPv4Dns2()); - assertEquals(ip6Dns[0], nicProfile.getIPv6Dns1()); - assertEquals(ip6Dns[1], nicProfile.getIPv6Dns2()); + + try (MockedStatic callContextMocked = Mockito.mockStatic(CallContext.class)) { + CallContext callContextMock = Mockito.mock(CallContext.class); + callContextMocked.when(CallContext::current).thenReturn(callContextMock); + Mockito.when(callContextMock.getRequestEntityCache()).thenReturn(new RequestEntityCache(Duration.ofSeconds(60))); + guru.updateNicProfile(nicProfile, network); + assertNotNull(nicProfile); + assertEquals(ip4Dns[0], nicProfile.getIPv4Dns1()); + assertEquals(ip4Dns[1], nicProfile.getIPv4Dns2()); + assertEquals(ip6Dns[0], nicProfile.getIPv6Dns1()); + assertEquals(ip6Dns[1], nicProfile.getIPv6Dns2()); + } } @Test @@ -108,11 +120,17 @@ public void testUpdateNetworkProfile() { Mockito.when(networkModel.getNetwork(Mockito.anyLong())).thenReturn(network); Mockito.when(networkModel.getNetworkIp4Dns(network, zone)).thenReturn(new Pair<>(ip4Dns[0], null)); Mockito.when(networkModel.getNetworkIp6Dns(network, zone)).thenReturn(new Pair<>(ip6Dns[0], null)); - guru.updateNetworkProfile(profile); - assertNotNull(profile); - assertEquals(ip4Dns[0], profile.getDns1()); - assertNull(profile.getDns2()); - assertEquals(ip6Dns[0], profile.getIp6Dns1()); - assertNull(profile.getIp6Dns2()); + + try (MockedStatic callContextMocked = Mockito.mockStatic(CallContext.class)) { + CallContext callContextMock = Mockito.mock(CallContext.class); + callContextMocked.when(CallContext::current).thenReturn(callContextMock); + Mockito.when(callContextMock.getRequestEntityCache()).thenReturn(new RequestEntityCache(Duration.ofSeconds(60))); + guru.updateNetworkProfile(profile); + assertNotNull(profile); + assertEquals(ip4Dns[0], profile.getDns1()); + assertNull(profile.getDns2()); + assertEquals(ip6Dns[0], profile.getIp6Dns1()); + assertNull(profile.getIp6Dns2()); + } } } diff --git a/server/src/test/java/com/cloud/network/router/CommandSetupHelperTest.java b/server/src/test/java/com/cloud/network/router/CommandSetupHelperTest.java index bdd905841f92..4eda891e6a1c 100644 --- a/server/src/test/java/com/cloud/network/router/CommandSetupHelperTest.java +++ b/server/src/test/java/com/cloud/network/router/CommandSetupHelperTest.java @@ -16,6 +16,31 @@ // under the License. package com.cloud.network.router; +import static org.mockito.Mockito.when; + +import java.time.Duration; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.cloudstack.context.CallContext; +import org.apache.cloudstack.context.RequestEntityCache; +import org.apache.cloudstack.network.BgpPeerVO; +import org.apache.cloudstack.network.dao.BgpPeerDetailsDao; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentMatchers; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.MockedStatic; +import org.mockito.Mockito; +import org.mockito.junit.MockitoJUnitRunner; +import org.springframework.test.util.ReflectionTestUtils; + import com.cloud.agent.api.Command; import com.cloud.agent.api.routing.SetBgpPeersCommand; import com.cloud.agent.api.routing.VmDataCommand; @@ -46,26 +71,6 @@ import com.cloud.vm.NicVO; import com.cloud.vm.VirtualMachine; import com.cloud.vm.dao.NicDao; -import org.apache.cloudstack.network.BgpPeerVO; -import org.apache.cloudstack.network.dao.BgpPeerDetailsDao; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.ArgumentMatchers; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Mockito; -import org.mockito.junit.MockitoJUnitRunner; -import org.springframework.test.util.ReflectionTestUtils; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import static org.mockito.Mockito.when; @RunWith(MockitoJUnitRunner.class) public class CommandSetupHelperTest { @@ -226,12 +231,18 @@ public void testCreateBgpPeersCommandsForNetwork() { when(dcDao.findById(zoneId)).thenReturn(dc); when(dc.getNetworkType()).thenReturn(DataCenter.NetworkType.Advanced); - commandSetupHelper.createBgpPeersCommands(bgpPeers, router, cmds, network); - Assert.assertEquals(1, cmds.size()); - Command cmd = cmds.toCommands()[0]; - Assert.assertTrue(cmd instanceof SetBgpPeersCommand); - Assert.assertEquals(2, ((SetBgpPeersCommand) cmd).getBpgPeers().length); + try (MockedStatic callContextMocked = Mockito.mockStatic(CallContext.class)) { + CallContext callContextMock = Mockito.mock(CallContext.class); + callContextMocked.when(CallContext::current).thenReturn(callContextMock); + Mockito.when(callContextMock.getRequestEntityCache()).thenReturn(new RequestEntityCache(Duration.ofSeconds(60))); + commandSetupHelper.createBgpPeersCommands(bgpPeers, router, cmds, network); + + Assert.assertEquals(1, cmds.size()); + Command cmd = cmds.toCommands()[0]; + Assert.assertTrue(cmd instanceof SetBgpPeersCommand); + Assert.assertEquals(2, ((SetBgpPeersCommand) cmd).getBpgPeers().length); + } } @Test diff --git a/server/src/test/java/com/cloud/storage/StorageManagerImplTest.java b/server/src/test/java/com/cloud/storage/StorageManagerImplTest.java index 6eb8bd04f46d..ea2bb6f82024 100644 --- a/server/src/test/java/com/cloud/storage/StorageManagerImplTest.java +++ b/server/src/test/java/com/cloud/storage/StorageManagerImplTest.java @@ -16,7 +16,14 @@ // under the License. package com.cloud.storage; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertThrows; +import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.doReturn; + import java.lang.reflect.Field; +import java.time.Duration; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; @@ -24,15 +31,11 @@ import java.util.Map; import java.util.Optional; -import com.cloud.dc.HostPodVO; -import com.cloud.dc.dao.HostPodDao; -import com.cloud.host.HostVO; -import com.cloud.host.dao.HostDao; -import com.cloud.resource.ResourceManager; -import com.cloud.storage.dao.StoragePoolAndAccessGroupMapDao; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.command.admin.storage.ChangeStoragePoolScopeCmd; import org.apache.cloudstack.api.command.admin.storage.ConfigureStorageAccessCmd; +import org.apache.cloudstack.context.CallContext; +import org.apache.cloudstack.context.RequestEntityCache; import org.apache.cloudstack.engine.subsystem.api.storage.DataStore; import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreLifeCycle; import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager; @@ -57,6 +60,7 @@ import org.junit.runner.RunWith; import org.mockito.InjectMocks; import org.mockito.Mock; +import org.mockito.MockedStatic; import org.mockito.Mockito; import org.mockito.Spy; import org.mockito.junit.MockitoJUnitRunner; @@ -72,9 +76,11 @@ import com.cloud.dc.ClusterVO; import com.cloud.dc.DataCenter; import com.cloud.dc.DataCenterVO; +import com.cloud.dc.HostPodVO; import com.cloud.dc.VsphereStoragePolicyVO; import com.cloud.dc.dao.ClusterDao; import com.cloud.dc.dao.DataCenterDao; +import com.cloud.dc.dao.HostPodDao; import com.cloud.dc.dao.VsphereStoragePolicyDao; import com.cloud.exception.AgentUnavailableException; import com.cloud.exception.ConnectionException; @@ -83,8 +89,12 @@ import com.cloud.exception.PermissionDeniedException; import com.cloud.exception.StorageUnavailableException; import com.cloud.host.Host; +import com.cloud.host.HostVO; +import com.cloud.host.dao.HostDao; import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.hypervisor.HypervisorGuruManager; +import com.cloud.resource.ResourceManager; +import com.cloud.storage.dao.StoragePoolAndAccessGroupMapDao; import com.cloud.storage.dao.VolumeDao; import com.cloud.user.AccountManagerImpl; import com.cloud.utils.Pair; @@ -93,12 +103,6 @@ import com.cloud.vm.VMInstanceVO; import com.cloud.vm.dao.VMInstanceDao; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertThrows; -import static org.junit.Assert.assertTrue; -import static org.mockito.Mockito.doReturn; - @RunWith(MockitoJUnitRunner.class) public class StorageManagerImplTest { @@ -933,11 +937,16 @@ public void testGetSingleStorageAccessGroupOnHost() { Mockito.when(cluster.getStorageAccessGroups()).thenReturn("sag2"); Mockito.when(pod.getStorageAccessGroups()).thenReturn(null); - String[] sags = storageManagerImpl.getStorageAccessGroups(null, null, null, hostId); + try (MockedStatic callContextMocked = Mockito.mockStatic(CallContext.class)) { + CallContext callContextMock = Mockito.mock(CallContext.class); + callContextMocked.when(CallContext::current).thenReturn(callContextMock); + Mockito.when(callContextMock.getRequestEntityCache()).thenReturn(new RequestEntityCache(Duration.ofSeconds(60))); + String[] sags = storageManagerImpl.getStorageAccessGroups(null, null, null, hostId); - assertNotNull(sags); - assertEquals(1, sags.length); - assertEquals("sag2", sags[0]); + assertNotNull(sags); + assertEquals(1, sags.length); + assertEquals("sag2", sags[0]); + } } @Test From 7fd04c474f31ec8b52b4e0153770b7408cefa9b5 Mon Sep 17 00:00:00 2001 From: Abhishek Kumar Date: Fri, 5 Sep 2025 15:01:03 +0530 Subject: [PATCH 4/5] fix checkstyle Signed-off-by: Abhishek Kumar --- server/src/main/java/com/cloud/capacity/CapacityManagerImpl.java | 1 - 1 file changed, 1 deletion(-) diff --git a/server/src/main/java/com/cloud/capacity/CapacityManagerImpl.java b/server/src/main/java/com/cloud/capacity/CapacityManagerImpl.java index f896d51f3c3d..9c421e8a387c 100644 --- a/server/src/main/java/com/cloud/capacity/CapacityManagerImpl.java +++ b/server/src/main/java/com/cloud/capacity/CapacityManagerImpl.java @@ -56,7 +56,6 @@ import com.cloud.configuration.Config; import com.cloud.dc.ClusterDetailsDao; import com.cloud.dc.ClusterDetailsVO; -import com.cloud.dc.DataCenterVO; import com.cloud.dc.dao.ClusterDao; import com.cloud.deploy.DeploymentClusterPlanner; import com.cloud.event.UsageEventVO; From 7f3a394e7789e48517eab3aff558afa5e844c573 Mon Sep 17 00:00:00 2001 From: Abhishek Kumar Date: Fri, 5 Sep 2025 17:12:48 +0530 Subject: [PATCH 5/5] missing fix Signed-off-by: Abhishek Kumar --- .../element/VirtualRouterElementTest.java | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/server/src/test/java/com/cloud/network/element/VirtualRouterElementTest.java b/server/src/test/java/com/cloud/network/element/VirtualRouterElementTest.java index 1300e11bb134..2b08eb5d088d 100644 --- a/server/src/test/java/com/cloud/network/element/VirtualRouterElementTest.java +++ b/server/src/test/java/com/cloud/network/element/VirtualRouterElementTest.java @@ -552,10 +552,16 @@ public void testApplyBgpPeersForVpc() throws ResourceUnavailableException { when(networkTopologyContext.retrieveNetworkTopology(dc)).thenReturn(networkTopology); doReturn(true).when(networkTopology).applyBgpPeers(any(), any(), any()); - boolean result = virtualRouterElement.applyBgpPeers(vpc, null, bgpPeers); + try (MockedStatic callContextMocked = Mockito.mockStatic(CallContext.class)) { + CallContext callContextMock = Mockito.mock(CallContext.class); + callContextMocked.when(CallContext::current).thenReturn(callContextMock); + Mockito.when(callContextMock.getRequestEntityCache()).thenReturn(new RequestEntityCache(Duration.ofSeconds(60))); + + boolean result = virtualRouterElement.applyBgpPeers(vpc, null, bgpPeers); - Assert.assertTrue(result); - verify(networkTopology).applyBgpPeers(any(), any(), any()); + Assert.assertTrue(result); + verify(networkTopology).applyBgpPeers(any(), any(), any()); + } } @Test @@ -581,10 +587,10 @@ public void testApplyBgpPeersForNetwork() throws ResourceUnavailableException { callContextMocked.when(CallContext::current).thenReturn(callContextMock); Mockito.when(callContextMock.getRequestEntityCache()).thenReturn(new RequestEntityCache(Duration.ofSeconds(60))); - boolean result = virtualRouterElement.applyBgpPeers(null, network, bgpPeers); + boolean result = virtualRouterElement.applyBgpPeers(null, network, bgpPeers); - Assert.assertTrue(result); - verify(networkTopology).applyBgpPeers(any(), any(), any()); + Assert.assertTrue(result); + verify(networkTopology).applyBgpPeers(any(), any(), any()); } } }