| // Licensed to the Apache Software Foundation (ASF) under one |
| // or more contributor license agreements. See the NOTICE file |
| // distributed with this work for additional information |
| // regarding copyright ownership. The ASF licenses this file |
| // to you under the Apache License, Version 2.0 (the |
| // "License"); you may not use this file except in compliance |
| // with the License. You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, |
| // software distributed under the License is distributed on an |
| // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| // KIND, either express or implied. See the License for the |
| // specific language governing permissions and limitations |
| // under the License. |
| package com.cloud.configuration; |
| |
| import com.cloud.dc.dao.DataCenterDao; |
| import com.cloud.domain.Domain; |
| import com.cloud.domain.DomainVO; |
| import com.cloud.domain.dao.DomainDao; |
| import com.cloud.exception.InvalidParameterValueException; |
| import com.cloud.network.Network; |
| import com.cloud.network.Networks; |
| import com.cloud.offering.DiskOffering; |
| import com.cloud.offering.NetworkOffering; |
| import com.cloud.offering.ServiceOffering; |
| import com.cloud.offerings.NetworkOfferingVO; |
| import com.cloud.offerings.dao.NetworkOfferingDao; |
| import com.cloud.offerings.dao.NetworkOfferingServiceMapDao; |
| import com.cloud.service.ServiceOfferingVO; |
| import com.cloud.service.dao.ServiceOfferingDao; |
| import com.cloud.service.dao.ServiceOfferingDetailsDao; |
| import com.cloud.storage.DiskOfferingVO; |
| import com.cloud.storage.Storage; |
| import com.cloud.storage.dao.DiskOfferingDao; |
| import com.cloud.user.Account; |
| import com.cloud.user.AccountVO; |
| import com.cloud.user.User; |
| import com.cloud.user.UserVO; |
| import com.cloud.user.dao.AccountDao; |
| import com.cloud.user.dao.UserDao; |
| import com.cloud.utils.DomainHelper; |
| import com.cloud.utils.db.EntityManager; |
| import com.cloud.vm.VirtualMachine; |
| import com.cloud.gpu.dao.VgpuProfileDao; |
| import org.apache.cloudstack.api.ApiConstants; |
| import org.apache.cloudstack.api.command.admin.network.CloneNetworkOfferingCmd; |
| import org.apache.cloudstack.api.command.admin.offering.CloneDiskOfferingCmd; |
| import org.apache.cloudstack.api.command.admin.offering.CloneServiceOfferingCmd; |
| import org.apache.cloudstack.context.CallContext; |
| import org.apache.cloudstack.resourcedetail.dao.DiskOfferingDetailsDao; |
| import org.apache.cloudstack.vm.lease.VMLeaseManager; |
| import org.junit.After; |
| import org.junit.Assert; |
| import org.junit.Before; |
| 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.Spy; |
| import org.mockito.junit.MockitoJUnitRunner; |
| |
| import java.util.ArrayList; |
| import java.util.Collections; |
| import java.util.HashMap; |
| import java.util.List; |
| import java.util.Map; |
| |
| import static org.mockito.ArgumentMatchers.any; |
| import static org.mockito.ArgumentMatchers.anyBoolean; |
| import static org.mockito.ArgumentMatchers.anyInt; |
| import static org.mockito.ArgumentMatchers.anyList; |
| import static org.mockito.ArgumentMatchers.anyLong; |
| import static org.mockito.ArgumentMatchers.anyMap; |
| import static org.mockito.ArgumentMatchers.anyString; |
| import static org.mockito.ArgumentMatchers.eq; |
| import static org.mockito.Mockito.mock; |
| import static org.mockito.Mockito.verify; |
| import static org.mockito.Mockito.when; |
| |
| @RunWith(MockitoJUnitRunner.Silent.class) |
| public class ConfigurationManagerCloneIntegrationTest { |
| |
| @InjectMocks |
| @Spy |
| private ConfigurationManagerImpl configurationManager; |
| |
| @Mock |
| private ServiceOfferingDao serviceOfferingDao; |
| |
| @Mock |
| private ServiceOfferingDetailsDao serviceOfferingDetailsDao; |
| |
| @Mock |
| private DiskOfferingDao diskOfferingDao; |
| |
| @Mock |
| private DiskOfferingDetailsDao diskOfferingDetailsDao; |
| |
| @Mock |
| private NetworkOfferingDao networkOfferingDao; |
| |
| @Mock |
| private NetworkOfferingServiceMapDao networkOfferingServiceMapDao; |
| |
| @Mock |
| private DomainDao domainDao; |
| |
| @Mock |
| private DataCenterDao dataCenterDao; |
| |
| @Mock |
| private EntityManager entityManager; |
| |
| @Mock |
| private com.cloud.network.NetworkModel _networkModel; |
| |
| @Mock |
| private com.cloud.offerings.dao.NetworkOfferingDetailsDao networkOfferingDetailsDao; |
| |
| @Mock |
| private VgpuProfileDao vgpuProfileDao; |
| |
| @Mock |
| private AccountDao accountDao; |
| |
| @Mock |
| private UserDao userDao; |
| |
| @Mock |
| private DomainHelper domainHelper; |
| |
| private MockedStatic<CallContext> callContextMock; |
| |
| @Before |
| public void setUp() { |
| callContextMock = Mockito.mockStatic(CallContext.class); |
| CallContext callContext = mock(CallContext.class); |
| callContextMock.when(CallContext::current).thenReturn(callContext); |
| |
| AccountVO account = mock(AccountVO.class); |
| User user = mock(User.class); |
| Domain domain = mock(DomainVO.class); |
| UserVO userVO = mock(UserVO.class); |
| |
| Mockito.lenient().when(callContext.getCallingAccount()).thenReturn(account); |
| Mockito.lenient().when(callContext.getCallingUser()).thenReturn(user); |
| Mockito.lenient().when(callContext.getCallingUserId()).thenReturn(1L); |
| Mockito.lenient().when(account.getDomainId()).thenReturn(1L); |
| Mockito.lenient().when(account.getId()).thenReturn(1L); |
| Mockito.lenient().when(user.getId()).thenReturn(1L); |
| Mockito.lenient().when(entityManager.findById(eq(Domain.class), anyLong())).thenReturn(domain); |
| |
| Mockito.doAnswer(invocation -> { |
| DiskOfferingVO d = mock(DiskOfferingVO.class); |
| when(d.getId()).thenReturn(999L); |
| return d; |
| }).when(configurationManager).createDiskOffering( |
| anyLong(), anyList(), anyList(), anyString(), anyString(), anyString(), |
| anyLong(), anyString(), anyBoolean(), anyBoolean(), anyBoolean(), any(), |
| anyLong(), anyLong(), anyLong(), anyLong(), anyLong(), anyLong(), anyLong(), |
| anyLong(), anyLong(), anyLong(), anyLong(), anyLong(), anyLong(), anyLong(), |
| anyInt(), anyString(), any(), anyLong(), anyBoolean(), anyBoolean()); |
| |
| |
| // User/Account DAO stubs used by createDiskOffering |
| Mockito.lenient().when(userDao.findById(anyLong())).thenReturn(userVO); |
| Mockito.lenient().when(userVO.getAccountId()).thenReturn(1L); |
| Mockito.lenient().when(userVO.getRemoved()).thenReturn(null); |
| Mockito.lenient().when(accountDao.findById(anyLong())).thenReturn(account); |
| Mockito.lenient().when(account.getType()).thenReturn(Account.Type.ADMIN); |
| } |
| |
| @After |
| public void tearDown() { |
| if (callContextMock != null) { |
| callContextMock.close(); |
| } |
| } |
| |
| @Test(expected = InvalidParameterValueException.class) |
| public void testCloneServiceOfferingFailsWhenSourceNotFound() { |
| CloneServiceOfferingCmd cmd = mock(CloneServiceOfferingCmd.class); |
| when(cmd.getSourceOfferingId()).thenReturn(999L); |
| when(cmd.getServiceOfferingName()).thenReturn("cloned-offering"); |
| when(serviceOfferingDao.findById(999L)).thenReturn(null); |
| |
| configurationManager.cloneServiceOffering(cmd); |
| } |
| |
| @Test |
| public void testCloneServiceOfferingInheritsAllPropertiesFromSource() { |
| Long sourceId = 1L; |
| |
| ServiceOfferingVO sourceOffering = mock(ServiceOfferingVO.class); |
| when(sourceOffering.getId()).thenReturn(sourceId); |
| when(sourceOffering.getName()).thenReturn("source-offering"); |
| when(sourceOffering.getDisplayText()).thenReturn("Source Display Text"); |
| when(sourceOffering.getCpu()).thenReturn(2); |
| when(sourceOffering.getSpeed()).thenReturn(1000); |
| when(sourceOffering.getRamSize()).thenReturn(2048); |
| when(sourceOffering.isOfferHA()).thenReturn(true); |
| when(sourceOffering.getLimitCpuUse()).thenReturn(false); |
| when(sourceOffering.isVolatileVm()).thenReturn(false); |
| when(sourceOffering.isCustomized()).thenReturn(false); |
| when(sourceOffering.isDynamicScalingEnabled()).thenReturn(true); |
| when(sourceOffering.getDiskOfferingStrictness()).thenReturn(false); |
| when(sourceOffering.getHostTag()).thenReturn("host-tag"); |
| when(sourceOffering.getRateMbps()).thenReturn(100); |
| when(sourceOffering.getDeploymentPlanner()).thenReturn("FirstFitPlanner"); |
| when(sourceOffering.isSystemUse()).thenReturn(false); |
| when(sourceOffering.getVmType()).thenReturn(VirtualMachine.Type.User.toString()); |
| when(sourceOffering.getDiskOfferingId()).thenReturn(null); |
| when(sourceOffering.getVgpuProfileId()).thenReturn(null); |
| when(sourceOffering.getGpuCount()).thenReturn(null); |
| when(sourceOffering.getGpuDisplay()).thenReturn(false); |
| |
| CloneServiceOfferingCmd cmd = mock(CloneServiceOfferingCmd.class); |
| when(cmd.getSourceOfferingId()).thenReturn(sourceId); |
| when(cmd.getServiceOfferingName()).thenReturn("cloned-offering"); |
| when(cmd.getFullUrlParams()).thenReturn(new HashMap<>()); |
| // Ensure no vGPU is specified in the command (explicitly stub to null) |
| when(cmd.getVgpuProfileId()).thenReturn(null); |
| when(cmd.getGpuCount()).thenReturn(null); |
| |
| when(serviceOfferingDao.findById(sourceId)).thenReturn(sourceOffering); |
| |
| ServiceOfferingVO clonedOffering = mock(ServiceOfferingVO.class); |
| when(clonedOffering.getId()).thenReturn(2L); |
| when(clonedOffering.getName()).thenReturn("cloned-offering"); |
| when(clonedOffering.getCpu()).thenReturn(2); |
| when(clonedOffering.getSpeed()).thenReturn(1000); |
| when(clonedOffering.getRamSize()).thenReturn(2048); |
| |
| when(serviceOfferingDao.persist(any(ServiceOfferingVO.class))).thenReturn(clonedOffering); |
| |
| DiskOfferingVO persistedDisk = mock(DiskOfferingVO.class); |
| when(persistedDisk.getId()).thenReturn(999L); |
| when(diskOfferingDao.findById(anyLong())).thenReturn(persistedDisk); |
| when(persistedDisk.getProvisioningType()).thenReturn(Storage.ProvisioningType.THIN); |
| when(diskOfferingDao.persist(any(DiskOfferingVO.class))).thenReturn(persistedDisk); |
| |
| Mockito.doReturn(clonedOffering).when(configurationManager).createServiceOffering( |
| anyLong(), anyBoolean(), any(VirtualMachine.Type.class), anyString(), |
| any(Integer.class), any(Integer.class), any(Integer.class), anyString(), anyString(), anyBoolean(), |
| anyBoolean(), anyBoolean(), anyBoolean(), anyString(), anyList(), anyList(), anyString(), any(Integer.class), |
| anyString(), anyMap(), anyLong(), any(Boolean.class), |
| anyLong(), anyLong(), anyLong(), anyLong(), anyLong(), anyLong(), anyLong(), anyLong(), anyLong(), anyLong(), anyLong(), anyLong(), anyLong(), anyLong(), |
| any(Integer.class), anyString(), anyLong(), anyBoolean(), anyLong(), anyBoolean(), anyBoolean(), anyBoolean(), |
| anyLong(), any(Integer.class), any(Boolean.class), anyBoolean(), any(Integer.class), any(VMLeaseManager.ExpiryAction.class) |
| ); |
| |
| ServiceOffering result = configurationManager.cloneServiceOffering(cmd); |
| |
| Assert.assertNotNull("Cloned offering should not be null", result); |
| verify(serviceOfferingDao).findById(sourceId); |
| Assert.assertEquals("Cloned offering should have correct name", "cloned-offering", result.getName()); |
| Assert.assertEquals("Cloned offering should inherit CPU count", Integer.valueOf(2), result.getCpu()); |
| Assert.assertEquals("Cloned offering should inherit CPU speed", Integer.valueOf(1000), result.getSpeed()); |
| Assert.assertEquals("Cloned offering should inherit RAM", Integer.valueOf(2048), result.getRamSize()); |
| } |
| |
| @Test |
| public void testCloneServiceOfferingOverridesProvidedParameters() { |
| Long sourceId = 1L; |
| |
| ServiceOfferingVO sourceOffering = mock(ServiceOfferingVO.class); |
| when(sourceOffering.getId()).thenReturn(sourceId); |
| when(sourceOffering.getName()).thenReturn("source-offering"); |
| when(sourceOffering.getDisplayText()).thenReturn("Source Display Text"); |
| when(sourceOffering.getCpu()).thenReturn(2); |
| when(sourceOffering.getSpeed()).thenReturn(1000); |
| when(sourceOffering.getRamSize()).thenReturn(2048); |
| when(sourceOffering.isOfferHA()).thenReturn(true); |
| when(sourceOffering.getLimitCpuUse()).thenReturn(false); |
| when(sourceOffering.isVolatileVm()).thenReturn(false); |
| when(sourceOffering.isCustomized()).thenReturn(false); |
| when(sourceOffering.isDynamicScalingEnabled()).thenReturn(true); |
| when(sourceOffering.getDiskOfferingStrictness()).thenReturn(false); |
| when(sourceOffering.isSystemUse()).thenReturn(false); |
| when(sourceOffering.getVmType()).thenReturn(VirtualMachine.Type.User.toString()); |
| when(sourceOffering.getDiskOfferingId()).thenReturn(1L); |
| when(sourceOffering.getVgpuProfileId()).thenReturn(null); |
| when(sourceOffering.getGpuCount()).thenReturn(null); |
| |
| CloneServiceOfferingCmd cmd = mock(CloneServiceOfferingCmd.class); |
| when(cmd.getSourceOfferingId()).thenReturn(sourceId); |
| when(cmd.getServiceOfferingName()).thenReturn("cloned-offering"); |
| when(cmd.getDisplayText()).thenReturn("New Display Text"); |
| when(cmd.getCpuNumber()).thenReturn(4); |
| when(cmd.getCpuSpeed()).thenReturn(2000); |
| when(cmd.getMemory()).thenReturn(4096); |
| when(cmd.getVgpuProfileId()).thenReturn(null); |
| when(cmd.getGpuCount()).thenReturn(null); |
| when(cmd.getDiskOfferingId()).thenReturn(null); |
| |
| DiskOfferingVO diskOffering = mock(DiskOfferingVO.class); |
| when(diskOfferingDao.findById(1L)).thenReturn(diskOffering); |
| when(diskOffering.getProvisioningType()).thenReturn(Storage.ProvisioningType.THIN); |
| |
| Map<String, String> params = new HashMap<>(); |
| params.put(ApiConstants.OFFER_HA, "false"); |
| when(cmd.getFullUrlParams()).thenReturn(params); |
| when(cmd.isOfferHa()).thenReturn(false); |
| |
| when(serviceOfferingDao.findById(sourceId)).thenReturn(sourceOffering); |
| |
| ServiceOfferingVO clonedOffering = mock(ServiceOfferingVO.class); |
| when(clonedOffering.getId()).thenReturn(2L); |
| when(clonedOffering.getName()).thenReturn("cloned-offering"); |
| when(clonedOffering.getDisplayText()).thenReturn("New Display Text"); |
| when(clonedOffering.getCpu()).thenReturn(4); |
| when(clonedOffering.getSpeed()).thenReturn(2000); |
| when(clonedOffering.getRamSize()).thenReturn(4096); |
| when(clonedOffering.isOfferHA()).thenReturn(false); |
| |
| when(serviceOfferingDao.persist(any(ServiceOfferingVO.class))).thenReturn(clonedOffering); |
| |
| Mockito.doReturn(clonedOffering).when(configurationManager).createServiceOffering( |
| anyLong(), anyBoolean(), any(), anyString(), eq(4), eq(4096), eq(2000), |
| anyString(), anyString(), anyBoolean(), eq(false), anyBoolean(), anyBoolean(), |
| anyString(), anyList(), anyList(), anyString(), anyInt(), anyString(), any(), |
| anyLong(), anyBoolean(), anyLong(), anyLong(), anyLong(), anyLong(), anyLong(), |
| anyLong(), anyLong(), anyLong(), anyLong(), anyLong(), anyLong(), anyLong(), |
| anyLong(), anyLong(), anyInt(), anyString(), anyLong(), anyBoolean(), anyLong(), |
| anyBoolean(), anyBoolean(), anyBoolean(), anyLong(), anyInt(), anyBoolean(), |
| anyBoolean(), anyInt(), any()); |
| |
| ServiceOffering result = configurationManager.cloneServiceOffering(cmd); |
| |
| Assert.assertNotNull("Cloned offering should not be null", result); |
| verify(serviceOfferingDao).findById(sourceId); |
| Assert.assertEquals("Cloned offering should override display text", "New Display Text", result.getDisplayText()); |
| Assert.assertEquals("Cloned offering should override CPU count", Integer.valueOf(4), result.getCpu()); |
| Assert.assertEquals("Cloned offering should override CPU speed", Integer.valueOf(2000), result.getSpeed()); |
| Assert.assertEquals("Cloned offering should override RAM", Integer.valueOf(4096), result.getRamSize()); |
| Assert.assertEquals("Cloned offering should override HA", Boolean.FALSE, result.isOfferHA()); |
| } |
| |
| @Test(expected = InvalidParameterValueException.class) |
| public void testCloneDiskOfferingFailsWhenSourceNotFound() { |
| CloneDiskOfferingCmd cmd = mock(CloneDiskOfferingCmd.class); |
| when(cmd.getSourceOfferingId()).thenReturn(999L); |
| when(cmd.getOfferingName()).thenReturn("cloned-disk-offering"); |
| when(diskOfferingDao.findById(999L)).thenReturn(null); |
| |
| configurationManager.cloneDiskOffering(cmd); |
| } |
| |
| @Test |
| public void testCloneDiskOfferingInheritsAllPropertiesFromSource() { |
| Long sourceId = 1L; |
| |
| DiskOfferingVO sourceOffering = mock(DiskOfferingVO.class); |
| when(sourceOffering.getId()).thenReturn(sourceId); |
| when(sourceOffering.getName()).thenReturn("source-disk"); |
| when(sourceOffering.getDisplayText()).thenReturn("Source Disk Display"); |
| when(sourceOffering.getDiskSize()).thenReturn(10L); |
| when(sourceOffering.getTags()).thenReturn("tag1"); |
| when(sourceOffering.isCustomized()).thenReturn(false); |
| when(sourceOffering.getDisplayOffering()).thenReturn(true); |
| when(sourceOffering.isCustomizedIops()).thenReturn(false); |
| when(sourceOffering.getDiskSizeStrictness()).thenReturn(false); |
| when(sourceOffering.getEncrypt()).thenReturn(false); |
| when(sourceOffering.isUseLocalStorage()).thenReturn(false); |
| when(sourceOffering.getProvisioningType()).thenReturn(Storage.ProvisioningType.THIN); |
| when(sourceOffering.getMinIops()).thenReturn(1000L); |
| when(sourceOffering.getMaxIops()).thenReturn(2000L); |
| |
| CloneDiskOfferingCmd cmd = mock(CloneDiskOfferingCmd.class); |
| when(cmd.getSourceOfferingId()).thenReturn(sourceId); |
| when(cmd.getOfferingName()).thenReturn("cloned-disk-offering"); |
| when(cmd.getDiskSize()).thenReturn(null); |
| when(diskOfferingDao.findById(sourceId)).thenReturn(sourceOffering); |
| when(diskOfferingDetailsDao.findDomainIds(sourceId)).thenReturn(Collections.emptyList()); |
| when(diskOfferingDetailsDao.findZoneIds(sourceId)).thenReturn(Collections.emptyList()); |
| when(diskOfferingDetailsDao.getDetail(eq(sourceId), anyString())).thenReturn(null); |
| when(cmd.getMinIops()).thenReturn(null); |
| when(cmd.getMaxIops()).thenReturn(null); |
| |
| DiskOfferingVO clonedOffering = mock(DiskOfferingVO.class); |
| when(clonedOffering.getId()).thenReturn(2L); |
| when(clonedOffering.getName()).thenReturn("cloned-disk-offering"); |
| when(clonedOffering.getDisplayText()).thenReturn("Source Disk Display"); |
| when(clonedOffering.getDiskSize()).thenReturn(10L); |
| when(clonedOffering.getTags()).thenReturn("tag1"); |
| when(diskOfferingDao.persist(any(DiskOfferingVO.class))).thenReturn(clonedOffering); |
| |
| Mockito.doReturn(clonedOffering).when(configurationManager).createDiskOffering( |
| anyLong(), anyList(), anyList(), anyString(), anyString(), anyString(), |
| anyLong(), anyString(), anyBoolean(), anyBoolean(), anyBoolean(), any(), |
| anyLong(), anyLong(), anyLong(), anyLong(), anyLong(), anyLong(), anyLong(), |
| anyLong(), anyLong(), anyLong(), anyLong(), anyLong(), anyLong(), anyLong(), |
| anyInt(), anyString(), any(), anyLong(), anyBoolean(), anyBoolean()); |
| |
| DiskOffering result = configurationManager.cloneDiskOffering(cmd); |
| |
| Assert.assertNotNull("Cloned disk offering should not be null", result); |
| verify(diskOfferingDao).findById(sourceId); |
| Assert.assertEquals("Cloned offering should have correct name", "cloned-disk-offering", result.getName()); |
| Assert.assertEquals("Cloned offering should inherit display text", "Source Disk Display", result.getDisplayText()); |
| Assert.assertEquals("Cloned offering should inherit disk size", 10L, result.getDiskSize()); |
| Assert.assertEquals("Cloned offering should inherit tags", "tag1", result.getTags()); |
| } |
| |
| @Test |
| public void testCloneDiskOfferingOverridesProvidedParameters() { |
| Long sourceId = 1L; |
| |
| DiskOfferingVO sourceOffering = mock(DiskOfferingVO.class); |
| when(sourceOffering.getId()).thenReturn(sourceId); |
| when(sourceOffering.getName()).thenReturn("source-disk"); |
| when(sourceOffering.getDisplayText()).thenReturn("Source Disk Display"); |
| when(sourceOffering.getDiskSize()).thenReturn(100L); |
| when(sourceOffering.getTags()).thenReturn("tag1"); |
| when(sourceOffering.isCustomized()).thenReturn(false); |
| when(sourceOffering.getProvisioningType()).thenReturn(Storage.ProvisioningType.THIN); |
| when(sourceOffering.isUseLocalStorage()).thenReturn(false); |
| |
| CloneDiskOfferingCmd cmd = mock(CloneDiskOfferingCmd.class); |
| when(cmd.getSourceOfferingId()).thenReturn(sourceId); |
| when(cmd.getOfferingName()).thenReturn("cloned-disk-offering"); |
| when(cmd.getDisplayText()).thenReturn("New Disk Display"); |
| when(cmd.getDiskSize()).thenReturn(20L); |
| when(cmd.getTags()).thenReturn("tag1,tag2"); |
| when(cmd.getFullUrlParams()).thenReturn(new HashMap<>()); |
| when(cmd.getMinIops()).thenReturn(100L); |
| when(cmd.getMaxIops()).thenReturn(200L); |
| |
| when(diskOfferingDao.findById(sourceId)).thenReturn(sourceOffering); |
| when(diskOfferingDetailsDao.findDomainIds(sourceId)).thenReturn(Collections.emptyList()); |
| when(diskOfferingDetailsDao.findZoneIds(sourceId)).thenReturn(Collections.emptyList()); |
| when(diskOfferingDetailsDao.getDetail(eq(sourceId), anyString())).thenReturn(null); |
| |
| DiskOfferingVO clonedOffering = mock(DiskOfferingVO.class); |
| when(clonedOffering.getId()).thenReturn(2L); |
| when(clonedOffering.getName()).thenReturn("cloned-disk-offering"); |
| when(clonedOffering.getDisplayText()).thenReturn("New Disk Display"); |
| when(clonedOffering.getDiskSize()).thenReturn(21L); |
| when(clonedOffering.getTags()).thenReturn("tag1,tag2"); |
| |
| // Ensure the real createDiskOffering path will return our mocked offering when it calls persist |
| when(diskOfferingDao.persist(any(DiskOfferingVO.class))).thenReturn(clonedOffering); |
| |
| Mockito.doReturn(clonedOffering).when(configurationManager).createDiskOffering( |
| anyLong(), anyList(), anyList(), eq("cloned-disk-offering"), eq("New Disk Display"), anyString(), |
| anyLong(), eq("tag1,tag2"), anyBoolean(), anyBoolean(), anyBoolean(), any(), |
| eq(100L), anyLong(), anyLong(), anyLong(), anyLong(), anyLong(), anyLong(), |
| anyLong(), anyLong(), anyLong(), anyLong(), anyLong(), anyLong(), anyLong(), |
| anyInt(), anyString(), any(), anyLong(), anyBoolean(), anyBoolean()); |
| |
| DiskOffering result = configurationManager.cloneDiskOffering(cmd); |
| |
| Assert.assertNotNull("Cloned disk offering should not be null", result); |
| verify(diskOfferingDao).findById(sourceId); |
| } |
| |
| @Test |
| public void testCloneDiskOfferingInheritsDomainAndZoneRestrictions() { |
| Long sourceId = 1L; |
| |
| List<Long> domainIds = new ArrayList<>(); |
| domainIds.add(1L); |
| domainIds.add(2L); |
| |
| List<Long> zoneIds = new ArrayList<>(); |
| zoneIds.add(1L); |
| |
| DiskOfferingVO sourceOffering = mock(DiskOfferingVO.class); |
| when(sourceOffering.getId()).thenReturn(sourceId); |
| when(sourceOffering.getName()).thenReturn("source-disk"); |
| when(sourceOffering.getProvisioningType()).thenReturn(Storage.ProvisioningType.THIN); |
| when(sourceOffering.isUseLocalStorage()).thenReturn(false); |
| when(sourceOffering.getDiskSize()).thenReturn(10L); |
| when(sourceOffering.getMinIops()).thenReturn(1000L); |
| when(sourceOffering.getMaxIops()).thenReturn(2000L); |
| |
| CloneDiskOfferingCmd cmd = mock(CloneDiskOfferingCmd.class); |
| when(cmd.getSourceOfferingId()).thenReturn(sourceId); |
| when(cmd.getOfferingName()).thenReturn("cloned-disk-offering"); |
| when(cmd.getFullUrlParams()).thenReturn(new HashMap<>()); |
| when(cmd.getDomainIds()).thenReturn(null); |
| when(cmd.getZoneIds()).thenReturn(null); |
| when(cmd.getDiskSize()).thenReturn(null); |
| when(cmd.getMinIops()).thenReturn(null); |
| when(cmd.getMaxIops()).thenReturn(null); |
| |
| |
| when(diskOfferingDao.findById(sourceId)).thenReturn(sourceOffering); |
| when(diskOfferingDetailsDao.findDomainIds(sourceId)).thenReturn(domainIds); |
| when(diskOfferingDetailsDao.findZoneIds(sourceId)).thenReturn(zoneIds); |
| when(diskOfferingDetailsDao.getDetail(eq(sourceId), anyString())).thenReturn(null); |
| |
| DiskOfferingVO clonedOffering = mock(DiskOfferingVO.class); |
| when(clonedOffering.getId()).thenReturn(2L); |
| when(diskOfferingDao.persist(any(DiskOfferingVO.class))).thenReturn(clonedOffering); |
| |
| Mockito.doReturn(clonedOffering).when(configurationManager).createDiskOffering( |
| anyLong(), eq(domainIds), eq(zoneIds), anyString(), anyString(), anyString(), |
| anyLong(), anyString(), anyBoolean(), anyBoolean(), anyBoolean(), any(), |
| anyLong(), anyLong(), anyLong(), anyLong(), anyLong(), anyLong(), anyLong(), |
| anyLong(), anyLong(), anyLong(), anyLong(), anyLong(), anyLong(), anyLong(), |
| anyInt(), anyString(), any(), anyLong(), anyBoolean(), anyBoolean()); |
| |
| DiskOffering result = configurationManager.cloneDiskOffering(cmd); |
| |
| Assert.assertNotNull("Cloned disk offering should not be null", result); |
| verify(diskOfferingDao).findById(sourceId); |
| verify(diskOfferingDetailsDao).findDomainIds(sourceId); |
| verify(diskOfferingDetailsDao).findZoneIds(sourceId); |
| } |
| |
| @Test |
| public void testCloneServiceOfferingCanInheritDetailsFromSource() { |
| Long sourceId = 1L; |
| |
| ServiceOfferingVO sourceOffering = mock(ServiceOfferingVO.class); |
| when(sourceOffering.getId()).thenReturn(sourceId); |
| when(sourceOffering.getCpu()).thenReturn(2); |
| when(sourceOffering.getSpeed()).thenReturn(1000); |
| when(sourceOffering.getRamSize()).thenReturn(2048); |
| when(sourceOffering.isSystemUse()).thenReturn(false); |
| when(sourceOffering.getVmType()).thenReturn(VirtualMachine.Type.User.toString()); |
| when(sourceOffering.getVgpuProfileId()).thenReturn(null); |
| when(sourceOffering.getGpuCount()).thenReturn(null); |
| |
| CloneServiceOfferingCmd cmd = mock(CloneServiceOfferingCmd.class); |
| when(cmd.getSourceOfferingId()).thenReturn(sourceId); |
| when(cmd.getServiceOfferingName()).thenReturn("cloned-offering"); |
| when(cmd.getFullUrlParams()).thenReturn(new HashMap<>()); |
| when(cmd.getDetails()).thenReturn(null); |
| when(cmd.getVgpuProfileId()).thenReturn(null); |
| when(cmd.getGpuCount()).thenReturn(null); |
| |
| when(serviceOfferingDao.findById(sourceId)).thenReturn(sourceOffering); |
| DiskOfferingVO diskOfferingVO = mock(DiskOfferingVO.class); |
| when(diskOfferingDao.findById(anyLong())).thenReturn(diskOfferingVO); |
| when(diskOfferingVO.getProvisioningType()).thenReturn(Storage.ProvisioningType.THIN); |
| |
| ServiceOfferingVO clonedOffering = mock(ServiceOfferingVO.class); |
| when(clonedOffering.getId()).thenReturn(2L); |
| when(serviceOfferingDao.persist(any(ServiceOfferingVO.class))).thenReturn(clonedOffering); |
| |
| Mockito.doReturn(clonedOffering).when(configurationManager).createServiceOffering( |
| anyLong(), anyBoolean(), any(), anyString(), anyInt(), anyInt(), anyInt(), |
| anyString(), anyString(), anyBoolean(), anyBoolean(), anyBoolean(), anyBoolean(), |
| anyString(), anyList(), anyList(), anyString(), anyInt(), anyString(), any(), |
| anyLong(), anyBoolean(), anyLong(), anyLong(), anyLong(), anyLong(), anyLong(), |
| anyLong(), anyLong(), anyLong(), anyLong(), anyLong(), anyLong(), anyLong(), |
| anyLong(), anyLong(), anyInt(), anyString(), anyLong(), anyBoolean(), anyLong(), |
| anyBoolean(), anyBoolean(), anyBoolean(), anyLong(), anyInt(), anyBoolean(), |
| anyBoolean(), anyInt(), any()); |
| |
| ServiceOffering result = configurationManager.cloneServiceOffering(cmd); |
| |
| Assert.assertNotNull("Cloned offering should not be null", result); |
| verify(serviceOfferingDao).findById(sourceId); |
| } |
| |
| @Test |
| public void testCloneDiskOfferingVerifiesInheritedValues() { |
| Long sourceId = 1L; |
| |
| DiskOfferingVO sourceOffering = new DiskOfferingVO("source-disk", "Source Disk Offering", |
| Storage.ProvisioningType.THIN, 50L, "production,ssd", false, false, 1000L, 5000L); |
| sourceOffering.setDisplayOffering(true); |
| sourceOffering.setDiskSizeStrictness(false); |
| sourceOffering.setEncrypt(true); |
| sourceOffering.setUseLocalStorage(false); |
| sourceOffering.setHypervisorSnapshotReserve(20); |
| |
| CloneDiskOfferingCmd cmd = mock(CloneDiskOfferingCmd.class); |
| when(cmd.getSourceOfferingId()).thenReturn(sourceId); |
| when(cmd.getOfferingName()).thenReturn("cloned-disk-offering"); |
| when(cmd.getFullUrlParams()).thenReturn(new HashMap<>()); |
| when(cmd.getDiskSize()).thenReturn(null); |
| when(cmd.getMinIops()).thenReturn(null); |
| when(cmd.getMaxIops()).thenReturn(null); |
| |
| when(diskOfferingDao.findById(sourceId)).thenReturn(sourceOffering); |
| when(diskOfferingDetailsDao.findDomainIds(sourceId)).thenReturn(Collections.emptyList()); |
| when(diskOfferingDetailsDao.findZoneIds(sourceId)).thenReturn(Collections.emptyList()); |
| when(diskOfferingDetailsDao.getDetail(eq(sourceId), anyString())).thenReturn(null); |
| |
| DiskOfferingVO clonedOffering = new DiskOfferingVO("cloned-disk-offering", "Source Disk Offering", |
| Storage.ProvisioningType.THIN, 50L, "production,ssd", false, false, 1000L, 5000L); |
| clonedOffering.setEncrypt(true); |
| clonedOffering.setHypervisorSnapshotReserve(20); |
| when(diskOfferingDao.persist(any(DiskOfferingVO.class))).thenReturn(clonedOffering); |
| |
| Mockito.doReturn(clonedOffering).when(configurationManager).createDiskOffering( |
| anyLong(), anyList(), anyList(), eq("cloned-disk-offering"), eq("Source Disk Offering"), |
| anyString(), eq(50L), eq("production,ssd"), anyBoolean(), anyBoolean(), |
| anyBoolean(), any(), eq(1000L), eq(5000L), anyLong(), anyLong(), anyLong(), |
| anyLong(), anyLong(), anyLong(), anyLong(), anyLong(), anyLong(), anyLong(), |
| anyLong(), anyLong(), eq(20), anyString(), any(), anyLong(), anyBoolean(), |
| eq(true)); |
| |
| DiskOffering result = configurationManager.cloneDiskOffering(cmd); |
| |
| Assert.assertNotNull("Cloned disk offering should not be null", result); |
| Assert.assertEquals("Should inherit display text", "Source Disk Offering", result.getDisplayText()); |
| Assert.assertEquals("Should inherit disk size", 50L, result.getDiskSize()); |
| Assert.assertEquals("Should inherit tags", "production,ssd", result.getTags()); |
| Assert.assertEquals("Should inherit min IOPS", Long.valueOf(1000L), result.getMinIops()); |
| Assert.assertEquals("Should inherit max IOPS", Long.valueOf(5000L), result.getMaxIops()); |
| Assert.assertEquals("Should inherit hypervisor snapshot reserve", Integer.valueOf(20), result.getHypervisorSnapshotReserve()); |
| verify(diskOfferingDao).findById(sourceId); |
| } |
| |
| @Test |
| public void testCloneDiskOfferingVerifiesOverriddenValues() { |
| Long sourceId = 1L; |
| |
| DiskOfferingVO sourceOffering = new DiskOfferingVO("source-disk", "Source Disk Offering", |
| Storage.ProvisioningType.THIN, 5L, "production", false, false, 1000L, 5000L); |
| sourceOffering.setEncrypt(false); |
| |
| CloneDiskOfferingCmd cmd = mock(CloneDiskOfferingCmd.class); |
| when(cmd.getSourceOfferingId()).thenReturn(sourceId); |
| when(cmd.getOfferingName()).thenReturn("cloned-disk-offering"); |
| when(cmd.getDisplayText()).thenReturn("Cloned Disk Offering - Updated"); |
| when(cmd.getDiskSize()).thenReturn(10L); |
| when(cmd.getTags()).thenReturn("production,high-performance"); |
| when(cmd.getMinIops()).thenReturn(2000L); |
| when(cmd.getMaxIops()).thenReturn(10000L); |
| |
| Map<String, String> params = new HashMap<>(); |
| params.put(ApiConstants.ENCRYPT, "true"); |
| when(cmd.getFullUrlParams()).thenReturn(params); |
| when(cmd.getEncrypt()).thenReturn(true); |
| |
| when(diskOfferingDao.findById(sourceId)).thenReturn(sourceOffering); |
| when(diskOfferingDetailsDao.findDomainIds(sourceId)).thenReturn(Collections.emptyList()); |
| when(diskOfferingDetailsDao.findZoneIds(sourceId)).thenReturn(Collections.emptyList()); |
| when(diskOfferingDetailsDao.getDetail(eq(sourceId), anyString())).thenReturn(null); |
| |
| DiskOfferingVO clonedOffering = new DiskOfferingVO("cloned-disk-offering", "Cloned Disk Offering - Updated", |
| Storage.ProvisioningType.THIN, 10L, "production,high-performance", false, false, 2000L, 10000L); |
| clonedOffering.setEncrypt(true); |
| |
| when(diskOfferingDao.persist(any(DiskOfferingVO.class))).thenReturn(clonedOffering); |
| |
| Mockito.doReturn(clonedOffering).when(configurationManager).createDiskOffering( |
| anyLong(), anyList(), anyList(), eq("cloned-disk-offering"), |
| eq("Cloned Disk Offering - Updated"), anyString(), eq(10L), |
| eq("production,high-performance"), anyBoolean(), anyBoolean(), anyBoolean(), |
| any(), eq(2000L), eq(10000L), anyLong(), anyLong(), anyLong(), anyLong(), |
| anyLong(), anyLong(), anyLong(), anyLong(), anyLong(), anyLong(), anyLong(), |
| anyLong(), anyInt(), anyString(), any(), anyLong(), anyBoolean(), eq(true)); |
| |
| DiskOffering result = configurationManager.cloneDiskOffering(cmd); |
| |
| Assert.assertNotNull("Cloned disk offering should not be null", result); |
| Assert.assertEquals("Should override display text", "Cloned Disk Offering - Updated", result.getDisplayText()); |
| Assert.assertEquals("Should override disk size", 10L, result.getDiskSize()); |
| Assert.assertEquals("Should override tags", "production,high-performance", result.getTags()); |
| Assert.assertEquals("Should override min IOPS", Long.valueOf(2000L), result.getMinIops()); |
| Assert.assertEquals("Should override max IOPS", Long.valueOf(10000L), result.getMaxIops()); |
| Assert.assertTrue("Should override encrypt flag", result.getEncrypt()); |
| verify(diskOfferingDao).findById(sourceId); |
| } |
| |
| @Test |
| public void testCloneDiskOfferingInheritsBytesReadWriteRates() { |
| Long sourceId = 1L; |
| |
| DiskOfferingVO sourceOffering = new DiskOfferingVO("source-disk", "Source Disk", |
| Storage.ProvisioningType.THIN, 53L, "tag1", false, false, null, null); |
| sourceOffering.setBytesReadRate(10485760L); |
| sourceOffering.setBytesReadRateMax(20971520L); |
| sourceOffering.setBytesReadRateMaxLength(60L); |
| sourceOffering.setBytesWriteRate(10485760L); |
| sourceOffering.setBytesWriteRateMax(20971520L); |
| sourceOffering.setBytesWriteRateMaxLength(60L); |
| |
| CloneDiskOfferingCmd cmd = mock(CloneDiskOfferingCmd.class); |
| when(cmd.getSourceOfferingId()).thenReturn(sourceId); |
| when(cmd.getOfferingName()).thenReturn("cloned-disk"); |
| when(cmd.getFullUrlParams()).thenReturn(new HashMap<>()); |
| when(cmd.getDiskSize()).thenReturn(null); |
| when(cmd.getMinIops()).thenReturn(null); |
| when(cmd.getMaxIops()).thenReturn(null); |
| |
| when(diskOfferingDao.findById(sourceId)).thenReturn(sourceOffering); |
| when(diskOfferingDetailsDao.findDomainIds(sourceId)).thenReturn(Collections.emptyList()); |
| when(diskOfferingDetailsDao.findZoneIds(sourceId)).thenReturn(Collections.emptyList()); |
| when(diskOfferingDetailsDao.getDetail(eq(sourceId), anyString())).thenReturn(null); |
| |
| DiskOfferingVO clonedOffering = new DiskOfferingVO("cloned-disk", "Source Disk", |
| Storage.ProvisioningType.THIN, 53L, "tag1", false, false, null, null); |
| clonedOffering.setBytesReadRate(10485760L); |
| clonedOffering.setBytesReadRateMax(20971520L); |
| clonedOffering.setBytesReadRateMaxLength(60L); |
| clonedOffering.setBytesWriteRate(10485760L); |
| clonedOffering.setBytesWriteRateMax(20971520L); |
| clonedOffering.setBytesWriteRateMaxLength(60L); |
| when(diskOfferingDao.persist(any(DiskOfferingVO.class))).thenReturn(clonedOffering); |
| |
| Mockito.doReturn(clonedOffering).when(configurationManager).createDiskOffering( |
| anyLong(), anyList(), anyList(), anyString(), anyString(), anyString(), |
| anyLong(), anyString(), anyBoolean(), anyBoolean(), anyBoolean(), any(), |
| anyLong(), anyLong(), anyLong(), anyLong(), anyLong(), anyLong(), anyLong(), |
| anyLong(), anyLong(), anyLong(), anyLong(), anyLong(), anyLong(), anyLong(), |
| anyInt(), anyString(), any(), anyLong(), anyBoolean(), anyBoolean()); |
| |
| DiskOffering result = configurationManager.cloneDiskOffering(cmd); |
| |
| Assert.assertNotNull("Cloned disk offering should not be null", result); |
| Assert.assertEquals("Should inherit bytes read rate", Long.valueOf(10485760L), result.getBytesReadRate()); |
| Assert.assertEquals("Should inherit bytes read rate max", Long.valueOf(20971520L), result.getBytesReadRateMax()); |
| Assert.assertEquals("Should inherit bytes read rate max length", Long.valueOf(60L), result.getBytesReadRateMaxLength()); |
| Assert.assertEquals("Should inherit bytes write rate", Long.valueOf(10485760L), result.getBytesWriteRate()); |
| Assert.assertEquals("Should inherit bytes write rate max", Long.valueOf(20971520L), result.getBytesWriteRateMax()); |
| Assert.assertEquals("Should inherit bytes write rate max length", Long.valueOf(60L), result.getBytesWriteRateMaxLength()); |
| verify(diskOfferingDao).findById(sourceId); |
| } |
| |
| @Test(expected = InvalidParameterValueException.class) |
| public void testCloneNetworkOfferingFailsWhenSourceNotFound() { |
| CloneNetworkOfferingCmd cmd = mock(CloneNetworkOfferingCmd.class); |
| when(cmd.getSourceOfferingId()).thenReturn(999L); |
| when(cmd.getNetworkOfferingName()).thenReturn("cloned-network-offering"); |
| when(networkOfferingDao.findById(999L)).thenReturn(null); |
| |
| configurationManager.cloneNetworkOffering(cmd); |
| } |
| |
| @Test(expected = InvalidParameterValueException.class) |
| public void testCloneNetworkOfferingFailsWhenNameIsNull() { |
| CloneNetworkOfferingCmd cmd = mock(CloneNetworkOfferingCmd.class); |
| when(cmd.getSourceOfferingId()).thenReturn(1L); |
| when(cmd.getNetworkOfferingName()).thenReturn(null); |
| |
| NetworkOfferingVO sourceOffering = mock(NetworkOfferingVO.class); |
| when(sourceOffering.getId()).thenReturn(1L); |
| when(networkOfferingDao.findById(1L)).thenReturn(sourceOffering); |
| |
| configurationManager.cloneNetworkOffering(cmd); |
| } |
| |
| @Test(expected = InvalidParameterValueException.class) |
| public void testCloneNetworkOfferingFailsWhenNameAlreadyExists() { |
| CloneNetworkOfferingCmd cmd = mock(CloneNetworkOfferingCmd.class); |
| when(cmd.getSourceOfferingId()).thenReturn(1L); |
| when(cmd.getNetworkOfferingName()).thenReturn("existing-offering"); |
| |
| NetworkOfferingVO sourceOffering = mock(NetworkOfferingVO.class); |
| when(sourceOffering.getId()).thenReturn(1L); |
| when(sourceOffering.getName()).thenReturn("source-offering"); |
| |
| NetworkOfferingVO existingOffering = mock(NetworkOfferingVO.class); |
| when(existingOffering.getId()).thenReturn(2L); |
| |
| when(networkOfferingDao.findById(1L)).thenReturn(sourceOffering); |
| when(networkOfferingDao.findByUniqueName("existing-offering")).thenReturn(existingOffering); |
| |
| configurationManager.cloneNetworkOffering(cmd); |
| } |
| |
| @Test |
| public void testCloneNetworkOfferingInheritsAllPropertiesFromSource() { |
| Long sourceId = 1L; |
| |
| NetworkOfferingVO sourceOffering = mock(NetworkOfferingVO.class); |
| when(sourceOffering.getId()).thenReturn(sourceId); |
| when(sourceOffering.getName()).thenReturn("source-network-offering"); |
| when(sourceOffering.getDisplayText()).thenReturn("Source Network Offering"); |
| when(sourceOffering.getGuestType()).thenReturn(Network.GuestType.Isolated); |
| when(sourceOffering.getTrafficType()).thenReturn(Networks.TrafficType.Guest); |
| when(sourceOffering.getAvailability()).thenReturn(NetworkOffering.Availability.Optional); |
| when(sourceOffering.getState()).thenReturn(NetworkOffering.State.Enabled); |
| when(sourceOffering.isDefault()).thenReturn(false); |
| when(sourceOffering.isConserveMode()).thenReturn(true); |
| when(sourceOffering.isEgressDefaultPolicy()).thenReturn(false); |
| when(sourceOffering.isPersistent()).thenReturn(false); |
| |
| CloneNetworkOfferingCmd cmd = mock(CloneNetworkOfferingCmd.class); |
| when(cmd.getSourceOfferingId()).thenReturn(sourceId); |
| when(cmd.getNetworkOfferingName()).thenReturn("cloned-network-offering"); |
| |
| when(networkOfferingDao.findById(sourceId)).thenReturn(sourceOffering); |
| when(networkOfferingDao.findByUniqueName("cloned-network-offering")).thenReturn(null); |
| |
| // Mock the network model to return service provider map |
| Map<Network.Service, java.util.Set<Network.Provider>> serviceProviderMap = new HashMap<>(); |
| when(configurationManager._networkModel.getNetworkOfferingServiceProvidersMap(sourceId)) |
| .thenReturn(serviceProviderMap); |
| |
| NetworkOfferingVO clonedOffering = mock(NetworkOfferingVO.class); |
| when(clonedOffering.getId()).thenReturn(2L); |
| when(clonedOffering.getName()).thenReturn("cloned-network-offering"); |
| when(clonedOffering.getDisplayText()).thenReturn("Source Network Offering"); |
| when(clonedOffering.getGuestType()).thenReturn(Network.GuestType.Isolated); |
| |
| Mockito.doReturn(clonedOffering).when(configurationManager).createNetworkOffering(any()); |
| |
| NetworkOffering result = configurationManager.cloneNetworkOffering(cmd); |
| |
| Assert.assertNotNull("Cloned network offering should not be null", result); |
| verify(networkOfferingDao).findById(sourceId); |
| Assert.assertEquals("Should have correct name", "cloned-network-offering", result.getName()); |
| } |
| |
| @Test |
| public void testCloneNetworkOfferingOverridesDisplayText() { |
| Long sourceId = 1L; |
| |
| NetworkOfferingVO sourceOffering = mock(NetworkOfferingVO.class); |
| when(sourceOffering.getId()).thenReturn(sourceId); |
| when(sourceOffering.getName()).thenReturn("source-network-offering"); |
| when(sourceOffering.getDisplayText()).thenReturn("Source Network Offering"); |
| when(sourceOffering.getGuestType()).thenReturn(Network.GuestType.Isolated); |
| when(sourceOffering.getTrafficType()).thenReturn(Networks.TrafficType.Guest); |
| |
| CloneNetworkOfferingCmd cmd = mock(CloneNetworkOfferingCmd.class); |
| when(cmd.getSourceOfferingId()).thenReturn(sourceId); |
| when(cmd.getNetworkOfferingName()).thenReturn("cloned-network-offering"); |
| when(cmd.getDisplayText()).thenReturn("New Display Text for Network"); |
| |
| when(networkOfferingDao.findById(sourceId)).thenReturn(sourceOffering); |
| when(networkOfferingDao.findByUniqueName("cloned-network-offering")).thenReturn(null); |
| |
| Map<Network.Service, java.util.Set<Network.Provider>> serviceProviderMap = new HashMap<>(); |
| when(configurationManager._networkModel.getNetworkOfferingServiceProvidersMap(sourceId)) |
| .thenReturn(serviceProviderMap); |
| |
| NetworkOfferingVO clonedOffering = mock(NetworkOfferingVO.class); |
| when(clonedOffering.getId()).thenReturn(2L); |
| when(clonedOffering.getName()).thenReturn("cloned-network-offering"); |
| when(clonedOffering.getDisplayText()).thenReturn("New Display Text for Network"); |
| |
| Mockito.doReturn(clonedOffering).when(configurationManager).createNetworkOffering(any()); |
| |
| NetworkOffering result = configurationManager.cloneNetworkOffering(cmd); |
| |
| Assert.assertNotNull("Cloned network offering should not be null", result); |
| Assert.assertEquals("Should override display text", "New Display Text for Network", result.getDisplayText()); |
| verify(networkOfferingDao).findById(sourceId); |
| } |
| |
| @Test |
| public void testCloneNetworkOfferingHandlesAddServices() { |
| Long sourceId = 1L; |
| |
| NetworkOfferingVO sourceOffering = mock(NetworkOfferingVO.class); |
| when(sourceOffering.getId()).thenReturn(sourceId); |
| when(sourceOffering.getName()).thenReturn("source-network-offering"); |
| when(sourceOffering.getDisplayText()).thenReturn("Source Network Offering"); |
| when(sourceOffering.getGuestType()).thenReturn(Network.GuestType.Isolated); |
| when(sourceOffering.getTrafficType()).thenReturn(Networks.TrafficType.Guest); |
| |
| CloneNetworkOfferingCmd cmd = mock(CloneNetworkOfferingCmd.class); |
| when(cmd.getSourceOfferingId()).thenReturn(sourceId); |
| when(cmd.getNetworkOfferingName()).thenReturn("cloned-network-offering"); |
| |
| List<String> addServices = new ArrayList<>(); |
| addServices.add("Vpn"); |
| addServices.add("StaticNat"); |
| when(cmd.getAddServices()).thenReturn(addServices); |
| when(cmd.getSupportedServices()).thenReturn(null); |
| |
| when(networkOfferingDao.findById(sourceId)).thenReturn(sourceOffering); |
| when(networkOfferingDao.findByUniqueName("cloned-network-offering")).thenReturn(null); |
| |
| Map<Network.Service, java.util.Set<Network.Provider>> serviceProviderMap = new HashMap<>(); |
| java.util.Set<Network.Provider> dhcpProviders = new java.util.HashSet<>(); |
| dhcpProviders.add(Network.Provider.VirtualRouter); |
| serviceProviderMap.put(Network.Service.Dhcp, dhcpProviders); |
| |
| when(configurationManager._networkModel.getNetworkOfferingServiceProvidersMap(sourceId)) |
| .thenReturn(serviceProviderMap); |
| |
| NetworkOfferingVO clonedOffering = mock(NetworkOfferingVO.class); |
| when(clonedOffering.getId()).thenReturn(2L); |
| when(clonedOffering.getName()).thenReturn("cloned-network-offering"); |
| |
| Mockito.doReturn(clonedOffering).when(configurationManager).createNetworkOffering(any()); |
| |
| NetworkOffering result = configurationManager.cloneNetworkOffering(cmd); |
| |
| Assert.assertNotNull("Cloned network offering should not be null", result); |
| verify(networkOfferingDao).findById(sourceId); |
| } |
| |
| @Test |
| public void testCloneNetworkOfferingHandlesDropServices() { |
| Long sourceId = 1L; |
| |
| NetworkOfferingVO sourceOffering = mock(NetworkOfferingVO.class); |
| when(sourceOffering.getId()).thenReturn(sourceId); |
| when(sourceOffering.getName()).thenReturn("source-network-offering"); |
| when(sourceOffering.getDisplayText()).thenReturn("Source Network Offering"); |
| when(sourceOffering.getGuestType()).thenReturn(Network.GuestType.Isolated); |
| when(sourceOffering.getTrafficType()).thenReturn(Networks.TrafficType.Guest); |
| |
| CloneNetworkOfferingCmd cmd = mock(CloneNetworkOfferingCmd.class); |
| when(cmd.getSourceOfferingId()).thenReturn(sourceId); |
| when(cmd.getNetworkOfferingName()).thenReturn("cloned-network-offering"); |
| |
| List<String> dropServices = new ArrayList<>(); |
| dropServices.add("Firewall"); |
| when(cmd.getDropServices()).thenReturn(dropServices); |
| when(cmd.getSupportedServices()).thenReturn(null); |
| |
| when(networkOfferingDao.findById(sourceId)).thenReturn(sourceOffering); |
| when(networkOfferingDao.findByUniqueName("cloned-network-offering")).thenReturn(null); |
| |
| Map<Network.Service, java.util.Set<Network.Provider>> serviceProviderMap = new HashMap<>(); |
| java.util.Set<Network.Provider> dhcpProviders = new java.util.HashSet<>(); |
| dhcpProviders.add(Network.Provider.VirtualRouter); |
| serviceProviderMap.put(Network.Service.Dhcp, dhcpProviders); |
| |
| java.util.Set<Network.Provider> firewallProviders = new java.util.HashSet<>(); |
| firewallProviders.add(Network.Provider.VirtualRouter); |
| serviceProviderMap.put(Network.Service.Firewall, firewallProviders); |
| |
| when(configurationManager._networkModel.getNetworkOfferingServiceProvidersMap(sourceId)) |
| .thenReturn(serviceProviderMap); |
| |
| NetworkOfferingVO clonedOffering = mock(NetworkOfferingVO.class); |
| when(clonedOffering.getId()).thenReturn(2L); |
| when(clonedOffering.getName()).thenReturn("cloned-network-offering"); |
| |
| Mockito.doReturn(clonedOffering).when(configurationManager).createNetworkOffering(any()); |
| |
| NetworkOffering result = configurationManager.cloneNetworkOffering(cmd); |
| |
| Assert.assertNotNull("Cloned network offering should not be null", result); |
| verify(networkOfferingDao).findById(sourceId); |
| } |
| |
| @Test |
| public void testCloneNetworkOfferingOverridesSupportedServices() { |
| Long sourceId = 1L; |
| |
| NetworkOfferingVO sourceOffering = mock(NetworkOfferingVO.class); |
| when(sourceOffering.getId()).thenReturn(sourceId); |
| when(sourceOffering.getName()).thenReturn("source-network-offering"); |
| when(sourceOffering.getDisplayText()).thenReturn("Source Network Offering"); |
| when(sourceOffering.getGuestType()).thenReturn(Network.GuestType.Isolated); |
| when(sourceOffering.getTrafficType()).thenReturn(Networks.TrafficType.Guest); |
| |
| CloneNetworkOfferingCmd cmd = mock(CloneNetworkOfferingCmd.class); |
| when(cmd.getSourceOfferingId()).thenReturn(sourceId); |
| when(cmd.getNetworkOfferingName()).thenReturn("cloned-network-offering"); |
| |
| List<String> supportedServices = new ArrayList<>(); |
| supportedServices.add("Dhcp"); |
| supportedServices.add("Dns"); |
| supportedServices.add("SourceNat"); |
| when(cmd.getSupportedServices()).thenReturn(supportedServices); |
| |
| when(networkOfferingDao.findById(sourceId)).thenReturn(sourceOffering); |
| when(networkOfferingDao.findByUniqueName("cloned-network-offering")).thenReturn(null); |
| |
| Map<Network.Service, java.util.Set<Network.Provider>> serviceProviderMap = new HashMap<>(); |
| when(configurationManager._networkModel.getNetworkOfferingServiceProvidersMap(sourceId)) |
| .thenReturn(serviceProviderMap); |
| |
| NetworkOfferingVO clonedOffering = mock(NetworkOfferingVO.class); |
| when(clonedOffering.getId()).thenReturn(2L); |
| when(clonedOffering.getName()).thenReturn("cloned-network-offering"); |
| |
| Mockito.doReturn(clonedOffering).when(configurationManager).createNetworkOffering(any()); |
| |
| NetworkOffering result = configurationManager.cloneNetworkOffering(cmd); |
| |
| Assert.assertNotNull("Cloned network offering should not be null", result); |
| verify(networkOfferingDao).findById(sourceId); |
| } |
| |
| @Test |
| public void testCloneNetworkOfferingInheritsGuestTypeAndTrafficType() { |
| Long sourceId = 1L; |
| |
| NetworkOfferingVO sourceOffering = mock(NetworkOfferingVO.class); |
| when(sourceOffering.getId()).thenReturn(sourceId); |
| when(sourceOffering.getName()).thenReturn("source-network-offering"); |
| when(sourceOffering.getDisplayText()).thenReturn("Source Network Offering"); |
| when(sourceOffering.getGuestType()).thenReturn(Network.GuestType.Shared); |
| when(sourceOffering.getTrafficType()).thenReturn(Networks.TrafficType.Guest); |
| when(sourceOffering.getAvailability()).thenReturn(NetworkOffering.Availability.Required); |
| |
| CloneNetworkOfferingCmd cmd = mock(CloneNetworkOfferingCmd.class); |
| when(cmd.getSourceOfferingId()).thenReturn(sourceId); |
| when(cmd.getNetworkOfferingName()).thenReturn("cloned-network-offering"); |
| when(cmd.getGuestIpType()).thenReturn(null); // Should inherit |
| |
| when(networkOfferingDao.findById(sourceId)).thenReturn(sourceOffering); |
| when(networkOfferingDao.findByUniqueName("cloned-network-offering")).thenReturn(null); |
| |
| Map<Network.Service, java.util.Set<Network.Provider>> serviceProviderMap = new HashMap<>(); |
| when(configurationManager._networkModel.getNetworkOfferingServiceProvidersMap(sourceId)) |
| .thenReturn(serviceProviderMap); |
| |
| NetworkOfferingVO clonedOffering = mock(NetworkOfferingVO.class); |
| when(clonedOffering.getId()).thenReturn(2L); |
| when(clonedOffering.getName()).thenReturn("cloned-network-offering"); |
| when(clonedOffering.getGuestType()).thenReturn(Network.GuestType.Shared); |
| when(clonedOffering.getTrafficType()).thenReturn(Networks.TrafficType.Guest); |
| |
| Mockito.doReturn(clonedOffering).when(configurationManager).createNetworkOffering(any()); |
| |
| NetworkOffering result = configurationManager.cloneNetworkOffering(cmd); |
| |
| Assert.assertNotNull("Cloned network offering should not be null", result); |
| Assert.assertEquals("Should inherit guest type", Network.GuestType.Shared, result.getGuestType()); |
| Assert.assertEquals("Should inherit traffic type", Networks.TrafficType.Guest, result.getTrafficType()); |
| verify(networkOfferingDao).findById(sourceId); |
| } |
| |
| @Test |
| public void testCloneNetworkOfferingInheritsAvailability() { |
| Long sourceId = 1L; |
| |
| NetworkOfferingVO sourceOffering = mock(NetworkOfferingVO.class); |
| when(sourceOffering.getId()).thenReturn(sourceId); |
| when(sourceOffering.getName()).thenReturn("source-network-offering"); |
| when(sourceOffering.getDisplayText()).thenReturn("Source Network Offering"); |
| when(sourceOffering.getGuestType()).thenReturn(Network.GuestType.Isolated); |
| when(sourceOffering.getTrafficType()).thenReturn(Networks.TrafficType.Guest); |
| when(sourceOffering.getAvailability()).thenReturn(NetworkOffering.Availability.Required); |
| |
| CloneNetworkOfferingCmd cmd = mock(CloneNetworkOfferingCmd.class); |
| when(cmd.getSourceOfferingId()).thenReturn(sourceId); |
| when(cmd.getNetworkOfferingName()).thenReturn("cloned-network-offering"); |
| when(cmd.getAvailability()).thenReturn(null); // Should inherit |
| |
| when(networkOfferingDao.findById(sourceId)).thenReturn(sourceOffering); |
| when(networkOfferingDao.findByUniqueName("cloned-network-offering")).thenReturn(null); |
| |
| Map<Network.Service, java.util.Set<Network.Provider>> serviceProviderMap = new HashMap<>(); |
| when(configurationManager._networkModel.getNetworkOfferingServiceProvidersMap(sourceId)) |
| .thenReturn(serviceProviderMap); |
| |
| NetworkOfferingVO clonedOffering = mock(NetworkOfferingVO.class); |
| when(clonedOffering.getId()).thenReturn(2L); |
| when(clonedOffering.getName()).thenReturn("cloned-network-offering"); |
| when(clonedOffering.getAvailability()).thenReturn(NetworkOffering.Availability.Required); |
| |
| Mockito.doReturn(clonedOffering).when(configurationManager).createNetworkOffering(any()); |
| |
| NetworkOffering result = configurationManager.cloneNetworkOffering(cmd); |
| |
| Assert.assertNotNull("Cloned network offering should not be null", result); |
| Assert.assertEquals("Should inherit availability", NetworkOffering.Availability.Required, result.getAvailability()); |
| verify(networkOfferingDao).findById(sourceId); |
| } |
| } |