From 7ef57c150eec65b5570e7f45edd7a730bc67309b Mon Sep 17 00:00:00 2001 From: Pearl Dsilva Date: Mon, 8 Jan 2024 09:03:07 -0500 Subject: [PATCH] add checks to backend to prevent creation of l2 and shared networks in nsx zones and filter only nsx offerings when creating isolated networks --- .../com/cloud/network/NetworkServiceImpl.java | 15 +++++++++++++++ .../com/cloud/network/NetworkServiceImplTest.java | 4 ++++ .../views/network/CreateIsolatedNetworkForm.vue | 3 +++ 3 files changed, 22 insertions(+) diff --git a/server/src/main/java/com/cloud/network/NetworkServiceImpl.java b/server/src/main/java/com/cloud/network/NetworkServiceImpl.java index 1b634d5b904..9bdb3305a9c 100644 --- a/server/src/main/java/com/cloud/network/NetworkServiceImpl.java +++ b/server/src/main/java/com/cloud/network/NetworkServiceImpl.java @@ -34,6 +34,7 @@ import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Set; import java.util.UUID; import java.util.stream.Collectors; @@ -43,7 +44,9 @@ import javax.naming.ConfigurationException; import com.cloud.dc.VlanDetailsVO; import com.cloud.dc.dao.VlanDetailsDao; +import com.cloud.network.dao.NsxProviderDao; import com.cloud.network.dao.PublicIpQuarantineDao; +import com.cloud.network.element.NsxProviderVO; import com.cloud.offering.ServiceOffering; import com.cloud.service.dao.ServiceOfferingDao; import org.apache.cloudstack.acl.ControlledEntity.ACLType; @@ -410,6 +413,8 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService, C ServiceOfferingDao serviceOfferingDao; @Inject PublicIpQuarantineDao publicIpQuarantineDao; + @Inject + NsxProviderDao nsxProviderDao; @Autowired @Qualifier("networkHelper") @@ -1472,6 +1477,7 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService, C _accountMgr.checkAccess(owner, ntwkOff, zone); validateZoneAvailability(caller, zone); + validateNetworkCreationSupported(zone.getId(), zone.getName(), ntwkOff.getGuestType()); ACLType aclType = getAclType(caller, cmd.getAclType(), ntwkOff); @@ -1728,6 +1734,15 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService, C return network; } + private void validateNetworkCreationSupported(long zoneId, String zoneName, GuestType guestType) { + NsxProviderVO nsxProviderVO = nsxProviderDao.findByZoneId(zoneId); + if (Objects.nonNull(nsxProviderVO) && List.of(GuestType.L2, GuestType.Shared).contains(guestType)) { + throw new InvalidParameterValueException( + String.format("Creation of %s networks is not supported in NSX enabled zone %s", guestType.name(), zoneName) + ); + } + } + void checkAndSetRouterSourceNatIp(Account owner, CreateNetworkCmd cmd, Network network) throws InsufficientAddressCapacityException, ResourceAllocationException { String sourceNatIp = cmd.getSourceNatIP(); if (sourceNatIp == null) { diff --git a/server/src/test/java/com/cloud/network/NetworkServiceImplTest.java b/server/src/test/java/com/cloud/network/NetworkServiceImplTest.java index c993f7b7095..f2ab2a08ae7 100644 --- a/server/src/test/java/com/cloud/network/NetworkServiceImplTest.java +++ b/server/src/test/java/com/cloud/network/NetworkServiceImplTest.java @@ -40,6 +40,7 @@ import java.util.UUID; import com.cloud.domain.Domain; import com.cloud.domain.DomainVO; import com.cloud.domain.dao.DomainDao; +import com.cloud.network.dao.NsxProviderDao; import com.cloud.network.dao.PublicIpQuarantineDao; import com.cloud.network.vo.PublicIpQuarantineVO; import com.cloud.user.dao.AccountDao; @@ -212,6 +213,8 @@ public class NetworkServiceImplTest { @Mock private Ip ipMock; + @Mock + private NsxProviderDao nsxProviderDao; private static Date beforeDate; @@ -295,6 +298,7 @@ public class NetworkServiceImplTest { service.commandSetupHelper = commandSetupHelper; service.networkHelper = networkHelper; service._ipAddrMgr = ipAddressManagerMock; + service.nsxProviderDao = nsxProviderDao; callContextMocked = Mockito.mockStatic(CallContext.class); CallContext callContextMock = Mockito.mock(CallContext.class); callContextMocked.when(CallContext::current).thenReturn(callContextMock); diff --git a/ui/src/views/network/CreateIsolatedNetworkForm.vue b/ui/src/views/network/CreateIsolatedNetworkForm.vue index 8336277a702..437630e10ea 100644 --- a/ui/src/views/network/CreateIsolatedNetworkForm.vue +++ b/ui/src/views/network/CreateIsolatedNetworkForm.vue @@ -573,6 +573,9 @@ export default { this.selectedNetworkOffering = {} api('listNetworkOfferings', params).then(json => { this.networkOfferings = json.listnetworkofferingsresponse.networkoffering + if (this.selectedZone.isnsxenabled) { + this.networkOfferings = this.networkOfferings.filter(offering => offering.fornsx) + } }).catch(error => { this.$notifyError(error) }).finally(() => {