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 b3e672e2c17d..d463808b79b0 100755 --- a/engine/orchestration/src/main/java/com/cloud/vm/VirtualMachineManagerImpl.java +++ b/engine/orchestration/src/main/java/com/cloud/vm/VirtualMachineManagerImpl.java @@ -1570,7 +1570,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--) { @@ -1766,7 +1768,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 e0e244d53d3c..1332b479a70d 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/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); 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/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..9c421e8a387c 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; @@ -89,16 +90,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 +296,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 +968,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 81970b0f8a79..2b84237fe892 100644 --- a/server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java +++ b/server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java @@ -8210,7 +8210,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 bb165e0529d9..b41b86c1a89b 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; @@ -461,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())) { @@ -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 928107be9cec..5df258cbaaef 100644 --- a/server/src/main/java/com/cloud/hypervisor/HypervisorGuruBase.java +++ b/server/src/main/java/com/cloud/hypervisor/HypervisorGuruBase.java @@ -26,34 +26,9 @@ import javax.inject.Inject; -import com.cloud.agent.api.to.GPUDeviceTO; -import com.cloud.agent.api.to.VirtualMachineMetadataTO; -import com.cloud.cpu.CPU; -import com.cloud.dc.ClusterVO; -import com.cloud.dc.DataCenter; -import com.cloud.dc.DataCenterVO; -import com.cloud.dc.HostPodVO; -import com.cloud.dc.dao.ClusterDao; -import com.cloud.dc.dao.DataCenterDao; -import com.cloud.dc.dao.HostPodDao; -import com.cloud.domain.Domain; -import com.cloud.domain.DomainVO; -import com.cloud.domain.dao.DomainDao; -import com.cloud.gpu.VgpuProfileVO; -import com.cloud.gpu.dao.VgpuProfileDao; -import com.cloud.network.vpc.VpcVO; -import com.cloud.network.vpc.dao.VpcDao; -import com.cloud.projects.ProjectVO; -import com.cloud.projects.dao.ProjectDao; -import com.cloud.server.ResourceTag; -import com.cloud.tags.dao.ResourceTagDao; -import com.cloud.user.Account; -import com.cloud.user.AccountManager; -import com.cloud.utils.exception.CloudRuntimeException; -import com.cloud.vm.UserVmVO; -import com.cloud.vm.dao.UserVmDao; 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; @@ -66,10 +41,25 @@ import com.cloud.agent.api.Command; import com.cloud.agent.api.to.DataStoreTO; import com.cloud.agent.api.to.DiskTO; +import com.cloud.agent.api.to.GPUDeviceTO; import com.cloud.agent.api.to.NicTO; +import com.cloud.agent.api.to.VirtualMachineMetadataTO; import com.cloud.agent.api.to.VirtualMachineTO; import com.cloud.configuration.ConfigurationManager; +import com.cloud.cpu.CPU; +import com.cloud.dc.ClusterVO; +import com.cloud.dc.DataCenter; +import com.cloud.dc.DataCenterVO; +import com.cloud.dc.HostPodVO; +import com.cloud.dc.dao.ClusterDao; +import com.cloud.dc.dao.DataCenterDao; +import com.cloud.dc.dao.HostPodDao; +import com.cloud.domain.Domain; +import com.cloud.domain.DomainVO; +import com.cloud.domain.dao.DomainDao; import com.cloud.gpu.GPU; +import com.cloud.gpu.VgpuProfileVO; +import com.cloud.gpu.dao.VgpuProfileDao; import com.cloud.host.HostVO; import com.cloud.host.dao.HostDao; import com.cloud.network.Network; @@ -78,27 +68,38 @@ import com.cloud.network.dao.NetworkDetailVO; import com.cloud.network.dao.NetworkDetailsDao; import com.cloud.network.dao.NetworkVO; +import com.cloud.network.vpc.VpcVO; +import com.cloud.network.vpc.dao.VpcDao; import com.cloud.offering.NetworkOffering; import com.cloud.offering.ServiceOffering; import com.cloud.offerings.dao.NetworkOfferingDetailsDao; +import com.cloud.projects.ProjectVO; +import com.cloud.projects.dao.ProjectDao; import com.cloud.resource.ResourceManager; +import com.cloud.server.ResourceTag; import com.cloud.service.ServiceOfferingDetailsVO; import com.cloud.service.dao.ServiceOfferingDao; import com.cloud.service.dao.ServiceOfferingDetailsDao; import com.cloud.storage.StoragePool; import com.cloud.storage.Volume; +import com.cloud.tags.dao.ResourceTagDao; +import com.cloud.user.Account; +import com.cloud.user.AccountManager; import com.cloud.utils.Pair; import com.cloud.utils.component.AdapterBase; +import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.vm.NicProfile; import com.cloud.vm.NicVO; import com.cloud.vm.UserVmManager; +import com.cloud.vm.UserVmVO; import com.cloud.vm.VMInstanceVO; import com.cloud.vm.VirtualMachine; import com.cloud.vm.VirtualMachineProfile; import com.cloud.vm.dao.NicDao; import com.cloud.vm.dao.NicSecondaryIpDao; -import com.cloud.vm.dao.VMInstanceDetailsDao; +import com.cloud.vm.dao.UserVmDao; import com.cloud.vm.dao.VMInstanceDao; +import com.cloud.vm.dao.VMInstanceDetailsDao; public abstract class HypervisorGuruBase extends AdapterBase implements HypervisorGuru, Configurable { @@ -210,7 +211,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 0978fcba51b5..af20016156fd 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 b915027e9ab3..3c74e202fef1 100644 --- a/server/src/main/java/com/cloud/network/router/CommandSetupHelper.java +++ b/server/src/main/java/com/cloud/network/router/CommandSetupHelper.java @@ -29,6 +29,7 @@ import javax.inject.Inject; 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; @@ -227,10 +228,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()); @@ -270,7 +276,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); @@ -282,7 +288,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()); @@ -307,7 +313,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()); @@ -318,7 +324,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<>(); @@ -339,7 +345,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()); @@ -406,7 +411,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); } @@ -433,7 +438,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); @@ -535,7 +540,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); @@ -623,7 +628,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); @@ -662,7 +667,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)); @@ -673,7 +678,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()) { @@ -705,7 +710,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); } @@ -714,7 +719,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); } @@ -743,7 +748,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); @@ -751,7 +756,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()) { @@ -772,7 +777,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() @@ -791,7 +796,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()); @@ -913,7 +918,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); @@ -927,7 +932,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); } @@ -1058,7 +1063,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); @@ -1109,7 +1114,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); } @@ -1139,7 +1144,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); } @@ -1180,7 +1185,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); @@ -1201,7 +1206,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())) { @@ -1272,7 +1277,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); @@ -1347,7 +1352,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 @@ -1431,7 +1436,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 df0283ae2d61..40f13641c433 100644 --- a/server/src/main/java/com/cloud/storage/StorageManagerImpl.java +++ b/server/src/main/java/com/cloud/storage/StorageManagerImpl.java @@ -2987,22 +2987,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()))); } 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..2b08eb5d088d 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 { @@ -548,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))); - Assert.assertTrue(result); - verify(networkTopology).applyBgpPeers(any(), any(), any()); + boolean result = virtualRouterElement.applyBgpPeers(vpc, null, bgpPeers); + + Assert.assertTrue(result); + verify(networkTopology).applyBgpPeers(any(), any(), any()); + } } @Test @@ -572,9 +582,15 @@ public void testApplyBgpPeersForNetwork() throws ResourceUnavailableException { when(networkTopologyContext.retrieveNetworkTopology(dc)).thenReturn(networkTopology); doReturn(true).when(networkTopology).applyBgpPeers(any(), any(), any()); - boolean result = virtualRouterElement.applyBgpPeers(null, network, 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))); - Assert.assertTrue(result); - verify(networkTopology).applyBgpPeers(any(), any(), any()); + 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 576c32c08ba2..3ceeab360115 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