From 7ddebd3b2c1e86d3494a114aa544fc6038f431ef Mon Sep 17 00:00:00 2001 From: Abhishek Kumar Date: Thu, 25 Aug 2022 22:27:44 +0530 Subject: [PATCH] server: fix error when dedicating guest vlan range for physical nw without vlan range (#6655) Fixes #6648 If any of the VLAN from the given range is not found in the database (cloud.op_dc_vnet_alloc) then an InvalidParameterValueException will be thrown. Also, refactors and fixes account check. --- .../com/cloud/network/NetworkServiceImpl.java | 27 ++++++++++--------- .../network/DedicateGuestVlanRangesTest.java | 20 +++++++------- 2 files changed, 25 insertions(+), 22 deletions(-) diff --git a/server/src/main/java/com/cloud/network/NetworkServiceImpl.java b/server/src/main/java/com/cloud/network/NetworkServiceImpl.java index a3cb967c8a5..2aca1f7c649 100644 --- a/server/src/main/java/com/cloud/network/NetworkServiceImpl.java +++ b/server/src/main/java/com/cloud/network/NetworkServiceImpl.java @@ -370,6 +370,20 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService, C private Map _configs; + private void verifyDedicatedGuestVlansWithExistingDatacenterVlans(PhysicalNetwork physicalNetwork, Account vlanOwner, int startVlan, int endVlan) { + for (int i = startVlan; i <= endVlan; i++) { + List dataCenterVnet = _dcVnetDao.findVnet(physicalNetwork.getDataCenterId(), physicalNetwork.getId(), Integer.toString(i)); + if (CollectionUtils.isEmpty(dataCenterVnet)) { + throw new InvalidParameterValueException(String.format("Guest vlan %d from this range %d-%d is not present in the system for physical network ID: %s", i, startVlan, endVlan, physicalNetwork.getUuid())); + } + // Verify guest vlans in the range don't belong to a network of a different account + if (dataCenterVnet.get(0).getAccountId() != null && dataCenterVnet.get(0).getAccountId() != vlanOwner.getAccountId()) { + throw new InvalidParameterValueException("Guest vlan from this range " + dataCenterVnet.get(0).getVnet() + " is allocated to a different account." + + " Can only dedicate a range which has no allocated vlans or has vlans allocated to the same account "); + } + } + } + /* Get a list of IPs, classify them by service */ protected Map> getIpToServices(List publicIps, boolean rulesRevoked, boolean includingFirewall) { Map> ipToServices = new HashMap>(); @@ -4073,18 +4087,7 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService, C } } - // Verify guest vlans in the range don't belong to a network of a different account - for (int i = startVlan; i <= endVlan; i++) { - List allocatedVlans = _dcVnetDao.listAllocatedVnetsInRange(physicalNetwork.getDataCenterId(), physicalNetwork.getId(), startVlan, endVlan); - if (allocatedVlans != null && !allocatedVlans.isEmpty()) { - for (DataCenterVnetVO allocatedVlan : allocatedVlans) { - if (allocatedVlan.getAccountId() != vlanOwner.getAccountId()) { - throw new InvalidParameterValueException("Guest vlan from this range " + allocatedVlan.getVnet() + " is allocated to a different account." - + " Can only dedicate a range which has no allocated vlans or has vlans allocated to the same account "); - } - } - } - } + verifyDedicatedGuestVlansWithExistingDatacenterVlans(physicalNetwork, vlanOwner, startVlan, endVlan); List guestVlanMaps = _accountGuestVlanMapDao.listAccountGuestVlanMapsByPhysicalNetwork(physicalNetworkId); // Verify if vlan range is already dedicated diff --git a/server/src/test/java/com/cloud/network/DedicateGuestVlanRangesTest.java b/server/src/test/java/com/cloud/network/DedicateGuestVlanRangesTest.java index 8687465f3c6..726f99e9a01 100644 --- a/server/src/test/java/com/cloud/network/DedicateGuestVlanRangesTest.java +++ b/server/src/test/java/com/cloud/network/DedicateGuestVlanRangesTest.java @@ -29,9 +29,10 @@ import java.util.ArrayList; import java.util.List; import java.util.UUID; -import com.cloud.user.User; -import junit.framework.Assert; - +import org.apache.cloudstack.api.command.admin.network.DedicateGuestVlanRangeCmd; +import org.apache.cloudstack.api.command.admin.network.ListDedicatedGuestVlanRangesCmd; +import org.apache.cloudstack.api.command.admin.network.ReleaseDedicatedGuestVlanRangeCmd; +import org.apache.cloudstack.context.CallContext; import org.apache.log4j.Logger; import org.junit.After; import org.junit.Before; @@ -39,11 +40,6 @@ import org.junit.Test; import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import org.apache.cloudstack.api.command.admin.network.DedicateGuestVlanRangeCmd; -import org.apache.cloudstack.api.command.admin.network.ListDedicatedGuestVlanRangesCmd; -import org.apache.cloudstack.api.command.admin.network.ReleaseDedicatedGuestVlanRangeCmd; -import org.apache.cloudstack.context.CallContext; - import com.cloud.dc.DataCenterVnetVO; import com.cloud.dc.dao.DataCenterVnetDao; import com.cloud.network.dao.AccountGuestVlanMapDao; @@ -54,10 +50,13 @@ import com.cloud.projects.ProjectManager; import com.cloud.user.Account; import com.cloud.user.AccountManager; import com.cloud.user.AccountVO; +import com.cloud.user.User; import com.cloud.user.UserVO; import com.cloud.user.dao.AccountDao; import com.cloud.utils.db.TransactionLegacy; +import junit.framework.Assert; + public class DedicateGuestVlanRangesTest { private static final Logger s_logger = Logger.getLogger(DedicateGuestVlanRangesTest.class); @@ -275,7 +274,7 @@ public class DedicateGuestVlanRangesTest { DataCenterVnetVO dataCenter = new DataCenterVnetVO("2-5", 1L, 1L); dataCenter.setAccountId(1L); dataCenterList.add(dataCenter); - when(networkService._dcVnetDao.listAllocatedVnetsInRange(anyLong(), anyLong(), anyInt(), anyInt())).thenReturn(dataCenterList); + when(networkService._dcVnetDao.findVnet(anyLong(), anyLong(), anyString())).thenReturn(dataCenterList); try { networkService.dedicateGuestVlanRange(dedicateGuestVlanRangesCmd); @@ -298,7 +297,8 @@ public class DedicateGuestVlanRangesTest { when(networkService._physicalNetworkDao.findById(anyLong())).thenReturn(physicalNetwork); - when(networkService._dcVnetDao.listAllocatedVnetsInRange(anyLong(), anyLong(), anyInt(), anyInt())).thenReturn(null); + DataCenterVnetVO dataCenterVnetVO = new DataCenterVnetVO("2-5", 1L, 1L); + when(networkService._dcVnetDao.findVnet(anyLong(), anyLong(), anyString())).thenReturn(List.of(dataCenterVnetVO)); List guestVlanMaps = new ArrayList(); AccountGuestVlanMapVO accountGuestVlanMap = new AccountGuestVlanMapVO(1L, 1L);