diff --git a/server/src/main/java/com/cloud/network/NetworkServiceImpl.java b/server/src/main/java/com/cloud/network/NetworkServiceImpl.java index 6428e064bb1..4ad5b4a6b3c 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); diff --git a/ui/src/components/header/ProjectMenu.vue b/ui/src/components/header/ProjectMenu.vue index 7388f0c1c9c..722bc2877d6 100644 --- a/ui/src/components/header/ProjectMenu.vue +++ b/ui/src/components/header/ProjectMenu.vue @@ -33,7 +33,7 @@ {{ $t('label.projects') }} - + diff --git a/ui/src/components/header/SamlDomainSwitcher.vue b/ui/src/components/header/SamlDomainSwitcher.vue index 269a873f575..9bad8fd52fe 100644 --- a/ui/src/components/header/SamlDomainSwitcher.vue +++ b/ui/src/components/header/SamlDomainSwitcher.vue @@ -36,7 +36,7 @@ {{ $t('label.domain') }} - + diff --git a/ui/src/style/ant-overwrite/ant-form.less b/ui/src/style/ant-overwrite/ant-form.less index 0c838c69941..52a2086fb4f 100644 --- a/ui/src/style/ant-overwrite/ant-form.less +++ b/ui/src/style/ant-overwrite/ant-form.less @@ -18,3 +18,11 @@ .ant-form .ant-form-item { margin-bottom: 6px; } + +.ant-select-arrow .ant-select-suffix svg { + transition: transform .3s, -webkit-transform .3s; +} + +.ant-select-open .ant-select-arrow .ant-select-suffix svg { + transform: rotateZ(-180deg); +} diff --git a/ui/src/views/AutogenView.vue b/ui/src/views/AutogenView.vue index 4b7d47d176f..b9caf632c09 100644 --- a/ui/src/views/AutogenView.vue +++ b/ui/src/views/AutogenView.vue @@ -64,7 +64,7 @@ :filterOption="(input, option) => { return option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0 }" > - + - + - +