From ef6c0c443d61c7619ae1f5663286a339701b31ed Mon Sep 17 00:00:00 2001 From: Abhisar Sinha <63767682+abh1sar@users.noreply.github.com> Date: Tue, 3 Dec 2024 12:06:00 +0530 Subject: [PATCH] Prepend VPC name to VPC network tier name (#9780) * Fix `updateTemplatePermission` when the UI is set to a language other than English (#9766) * Fix updateTemplatePermission UI in non-english language * Improve fix --------- Co-authored-by: Lucas Martins * Prepend vpc name to vpc tier network name based on global setting * Added UT for createVpcGuestNetwork * rename connector to delimiter and add configKey.Category.Network * Move setting the name to a new method --------- Co-authored-by: Daan Hoogland Co-authored-by: Lucas Martins <56271185+lucas-a-martins@users.noreply.github.com> Co-authored-by: Lucas Martins --- .../com/cloud/network/vpc/VpcManager.java | 18 ++++++++++ .../com/cloud/network/NetworkServiceImpl.java | 12 +++++++ .../com/cloud/network/vpc/VpcManagerImpl.java | 17 ++++++++- .../cloud/network/NetworkServiceImplTest.java | 35 +++++++++++++++++++ 4 files changed, 81 insertions(+), 1 deletion(-) diff --git a/engine/components-api/src/main/java/com/cloud/network/vpc/VpcManager.java b/engine/components-api/src/main/java/com/cloud/network/vpc/VpcManager.java index a340f49c13f..e7f02e62045 100644 --- a/engine/components-api/src/main/java/com/cloud/network/vpc/VpcManager.java +++ b/engine/components-api/src/main/java/com/cloud/network/vpc/VpcManager.java @@ -37,8 +37,26 @@ import com.cloud.network.PhysicalNetwork; import com.cloud.network.addr.PublicIp; import com.cloud.offering.NetworkOffering; import com.cloud.user.Account; +import org.apache.cloudstack.framework.config.ConfigKey; public interface VpcManager { + ConfigKey VpcTierNamePrepend = new ConfigKey<>(Boolean.class, + "vpc.tier.name.prepend", + ConfigKey.CATEGORY_NETWORK, + "false", + "Whether to prepend the VPC name to the VPC tier network name", + true, + ConfigKey.Scope.Global, + null); + ConfigKey VpcTierNamePrependDelimiter = new ConfigKey<>(String.class, + "vpc.tier.name.prepend.delimiter", + ConfigKey.CATEGORY_NETWORK, + " ", + "Delimiter string to use between the VPC and the VPC tier name", + true, + ConfigKey.Scope.Global, + null); + /** * Returns all the Guest networks that are part of VPC * diff --git a/server/src/main/java/com/cloud/network/NetworkServiceImpl.java b/server/src/main/java/com/cloud/network/NetworkServiceImpl.java index 2ccd5fdd820..49970a8c1db 100644 --- a/server/src/main/java/com/cloud/network/NetworkServiceImpl.java +++ b/server/src/main/java/com/cloud/network/NetworkServiceImpl.java @@ -1476,6 +1476,11 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService, C } } + private String getVpcPrependedNetworkName(String networkName, Vpc vpc) { + final String delimiter = VpcManager.VpcTierNamePrependDelimiter.value(); + return vpc.getName() + delimiter + networkName; + } + @Override @DB @ActionEvent(eventType = EventTypes.EVENT_NETWORK_CREATE, eventDescription = "creating network") @@ -1788,6 +1793,13 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService, C checkNetworkDns(ipv6, ntwkOff, vpcId, ip4Dns1, ip4Dns2, ip6Dns1, ip6Dns2); + if (vpcId != null && VpcManager.VpcTierNamePrepend.value()) { + Vpc vpc = _vpcDao.findById(vpcId); + if (vpc != null) { + name = getVpcPrependedNetworkName(name, vpc); + } + } + Network network = commitNetwork(networkOfferingId, gateway, startIP, endIP, netmask, networkDomain, vlanId, bypassVlanOverlapCheck, name, displayText, caller, physicalNetworkId, zone.getId(), domainId, isDomainSpecific, subdomainAccess, vpcId, startIPv6, endIPv6, ip6Gateway, ip6Cidr, displayNetwork, aclId, secondaryVlanId, privateVlanType, ntwkOff, pNtwk, aclType, owner, cidr, createVlan, externalId, routerIPv4, routerIPv6, associatedNetwork, ip4Dns1, ip4Dns2, ip6Dns1, ip6Dns2, interfaceMTUs, networkCidrSize); diff --git a/server/src/main/java/com/cloud/network/vpc/VpcManagerImpl.java b/server/src/main/java/com/cloud/network/vpc/VpcManagerImpl.java index b956ccc16ed..e20795f1df5 100644 --- a/server/src/main/java/com/cloud/network/vpc/VpcManagerImpl.java +++ b/server/src/main/java/com/cloud/network/vpc/VpcManagerImpl.java @@ -71,6 +71,8 @@ import org.apache.cloudstack.api.command.user.vpc.RestartVPCCmd; import org.apache.cloudstack.api.command.user.vpc.UpdateVPCCmd; 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; import org.apache.cloudstack.framework.config.dao.ConfigurationDao; import org.apache.cloudstack.managed.context.ManagedContextRunnable; import org.apache.cloudstack.network.Ipv4GuestSubnetNetworkMap; @@ -195,7 +197,7 @@ import com.cloud.vm.dao.NicDao; import static com.cloud.offering.NetworkOffering.RoutingMode.Dynamic; -public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvisioningService, VpcService { +public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvisioningService, VpcService, Configurable { public static final String SERVICE = "service"; public static final String CAPABILITYTYPE = "capabilitytype"; @@ -3115,6 +3117,19 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis } } + @Override + public String getConfigComponentName() { + return VpcManager.class.getSimpleName(); + } + + @Override + public ConfigKey[] getConfigKeys() { + return new ConfigKey[]{ + VpcTierNamePrepend, + VpcTierNamePrependDelimiter + }; + } + protected class VpcCleanupTask extends ManagedContextRunnable { @Override protected void runInContext() { diff --git a/server/src/test/java/com/cloud/network/NetworkServiceImplTest.java b/server/src/test/java/com/cloud/network/NetworkServiceImplTest.java index 64d813c9ba8..ce3283752c2 100644 --- a/server/src/test/java/com/cloud/network/NetworkServiceImplTest.java +++ b/server/src/test/java/com/cloud/network/NetworkServiceImplTest.java @@ -777,6 +777,41 @@ public class NetworkServiceImplTest { Mockito.verify(routedIpv4Manager).assignIpv4SubnetToNetwork(nullable(Network.class)); } + @Test + public void testCreateVpcTier() throws InsufficientCapacityException, ResourceAllocationException, NoSuchFieldException, IllegalAccessException { + Integer privateMtu = 1200; + Long networkOfferingId = 1L; + Long vpcId = 2L; + + ReflectionTestUtils.setField(createNetworkCmd, "name", "testNetwork"); + ReflectionTestUtils.setField(createNetworkCmd, "displayText", "Test Network"); + ReflectionTestUtils.setField(createNetworkCmd, "networkOfferingId", networkOfferingId); + ReflectionTestUtils.setField(createNetworkCmd, "zoneId", zoneId); + ReflectionTestUtils.setField(createNetworkCmd, "privateMtu", privateMtu); + ReflectionTestUtils.setField(createNetworkCmd, "vpcId", vpcId); + + dc = Mockito.mock(DataCenterVO.class); + Mockito.when(dcDao.findById(zoneId)).thenReturn(dc); + Mockito.when(dc.getId()).thenReturn(zoneId); + vpc = Mockito.mock(VpcVO.class); + Mockito.when(vpc.getName()).thenReturn("Vpc 1"); + Mockito.when(vpcDao.findById(vpcId)).thenReturn(vpc); + networkOfferingVO = Mockito.mock(NetworkOfferingVO.class); + Mockito.when(networkOfferingDao.findById(networkOfferingId)).thenReturn(networkOfferingVO); + Mockito.when(configMgr.isOfferingForVpc(networkOfferingVO)).thenReturn(true); + + overrideDefaultConfigValue(VpcManager.VpcTierNamePrepend, "_defaultValue", "true"); + overrideDefaultConfigValue(VpcManager.VpcTierNamePrependDelimiter, "_defaultValue", " -- "); + + service.createGuestNetwork(createNetworkCmd); + + overrideDefaultConfigValue(VpcManager.VpcTierNamePrepend, "_defaultValue", "false"); + + Mockito.verify(vpcMgr, times(1)).createVpcGuestNetwork(networkOfferingId, "Vpc 1 -- testNetwork", "Test Network", null, null, + null, null, accountMock, null, phyNet, zoneId, null, null, vpcId, null, accountMock, true, + null, null, null, null, null, null, null, new Pair<>(0, privateMtu), null); + } + @Test public void testCheckAndUpdateNetworkResetSuccess() { NetworkVO networkVO = new NetworkVO();