From 4ffeec6ba45530a19058e400673a99072d88692a Mon Sep 17 00:00:00 2001 From: Wei Zhou Date: Wed, 24 Apr 2024 09:10:52 +0200 Subject: [PATCH] vpc: create vpc tiers with dns server of vpc instead of zone (#8621) * vpc: create vpc tiers with dns server of vpc instead of zone with this change ``` root@r-575-VM:~# cat /etc/dnsmasq.d/cloud.conf dhcp-hostsfile=/etc/dhcphosts.txt listen-address=127.0.0.1,172.17.1.1,172.17.2.1,172.17.3.1 dhcp-range=set:interface-eth2-0,172.17.1.1,static dhcp-option=tag:interface-eth2-0,15,cs2cloud.internal dhcp-option=tag:interface-eth2-0,6,172.17.1.1,10.0.32.1,8.8.8.8 dhcp-option=tag:interface-eth2-0,3,172.17.1.1 dhcp-option=eth2,26,1500 dhcp-option=tag:interface-eth2-0,1,255.255.255.0 dhcp-range=set:interface-eth3-1,172.17.2.1,static dhcp-option=tag:interface-eth3-1,15,cs2cloud.internal dhcp-option=tag:interface-eth3-1,6,172.17.2.1,8.8.8.8,1.1.1.1 dhcp-option=tag:interface-eth3-1,3,172.17.2.1 dhcp-option=eth3,26,1500 dhcp-option=tag:interface-eth3-1,1,255.255.255.0 dhcp-range=set:interface-eth4-2,172.17.3.1,static dhcp-option=tag:interface-eth4-2,15,cs2cloud.internal dhcp-option=tag:interface-eth4-2,6,172.17.3.1,8.8.8.8,1.1.1.1 dhcp-option=tag:interface-eth4-2,3,172.17.3.1 dhcp-option=eth4,26,1500 dhcp-option=tag:interface-eth4-2,1,255.255.255.0 root@r-575-VM:~# ``` * Update PR8621 test:ArgumentMatchers instead of Matchers in test --- .../com/cloud/network/NetworkModelImpl.java | 16 ++++ .../cloud/network/NetworkModelImplTest.java | 82 +++++++++++++------ 2 files changed, 72 insertions(+), 26 deletions(-) diff --git a/server/src/main/java/com/cloud/network/NetworkModelImpl.java b/server/src/main/java/com/cloud/network/NetworkModelImpl.java index 86000205bec..f6824c9477e 100644 --- a/server/src/main/java/com/cloud/network/NetworkModelImpl.java +++ b/server/src/main/java/com/cloud/network/NetworkModelImpl.java @@ -102,8 +102,10 @@ import com.cloud.network.router.VirtualRouter; import com.cloud.network.rules.FirewallRule.Purpose; import com.cloud.network.rules.FirewallRuleVO; import com.cloud.network.rules.dao.PortForwardingRulesDao; +import com.cloud.network.vpc.Vpc; import com.cloud.network.vpc.VpcGatewayVO; import com.cloud.network.vpc.dao.PrivateIpDao; +import com.cloud.network.vpc.dao.VpcDao; import com.cloud.network.vpc.dao.VpcGatewayDao; import com.cloud.offering.NetworkOffering; import com.cloud.offering.NetworkOffering.Detail; @@ -180,6 +182,8 @@ public class NetworkModelImpl extends ManagerBase implements NetworkModel, Confi ProjectDao projectDao; @Inject NetworkPermissionDao _networkPermissionDao; + @Inject + VpcDao vpcDao; private List networkElements; @@ -2715,6 +2719,12 @@ public class NetworkModelImpl extends ManagerBase implements NetworkModel, Confi if (StringUtils.isNotBlank(network.getDns1())) { return new Pair<>(network.getDns1(), network.getDns2()); } + if (network.getVpcId() != null) { + Vpc vpc = vpcDao.findById(network.getVpcId()); + if (vpc != null && StringUtils.isNotBlank(vpc.getIp4Dns1())) { + return new Pair<>(vpc.getIp4Dns1(), vpc.getIp4Dns2()); + } + } return new Pair<>(zone.getDns1(), zone.getDns2()); } @@ -2723,6 +2733,12 @@ public class NetworkModelImpl extends ManagerBase implements NetworkModel, Confi if (StringUtils.isNotBlank(network.getIp6Dns1())) { return new Pair<>(network.getIp6Dns1(), network.getIp6Dns2()); } + if (network.getVpcId() != null) { + Vpc vpc = vpcDao.findById(network.getVpcId()); + if (vpc != null && StringUtils.isNotBlank(vpc.getIp6Dns1())) { + return new Pair<>(vpc.getIp6Dns1(), vpc.getIp6Dns2()); + } + } return new Pair<>(zone.getIp6Dns1(), zone.getIp6Dns2()); } diff --git a/server/src/test/java/com/cloud/network/NetworkModelImplTest.java b/server/src/test/java/com/cloud/network/NetworkModelImplTest.java index 0bbead6a468..d9baa260c68 100644 --- a/server/src/test/java/com/cloud/network/NetworkModelImplTest.java +++ b/server/src/test/java/com/cloud/network/NetworkModelImplTest.java @@ -18,33 +18,48 @@ package com.cloud.network; import com.cloud.dc.DataCenter; import com.cloud.exception.InvalidParameterValueException; +import com.cloud.network.vpc.VpcVO; +import com.cloud.network.vpc.dao.VpcDao; import com.cloud.utils.Pair; import org.junit.Assert; import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentMatchers; import org.mockito.InjectMocks; +import org.mockito.Mock; import org.mockito.Mockito; +import org.mockito.junit.MockitoJUnitRunner; +@RunWith(MockitoJUnitRunner.class) public class NetworkModelImplTest { - final String[] ip4Dns1 = {"5.5.5.5", "6.6.6.6"}; - final String[] ip4Dns2 = {"7.7.7.7", "8.8.8.8"}; - final String[] ip6Dns1 = {"2001:4860:4860::5555", "2001:4860:4860::6666"}; - final String[] ip6Dns2 = {"2001:4860:4860::7777", "2001:4860:4860::8888"}; + final String[] ip4Dns1 = {"5.5.5.5", "6.6.6.6", "9.9.9.9"}; + final String[] ip4Dns2 = {"7.7.7.7", "8.8.8.8", "10.10.10.10"}; + final String[] ip6Dns1 = {"2001:4860:4860::5555", "2001:4860:4860::6666", "2001:4860:4860::9999"}; + final String[] ip6Dns2 = {"2001:4860:4860::7777", "2001:4860:4860::8888", "2001:4860:4860::AAAA"}; + + @Mock + private VpcDao vpcDao; @InjectMocks private NetworkModelImpl networkModel = new NetworkModelImpl(); - private void prepareMocks(boolean isIp6, Network network, DataCenter zone, - String dns1, String dns2, String dns3, String dns4) { + private void prepareMocks(boolean isIp6, Network network, DataCenter zone, VpcVO vpc, + String networkDns1, String zoneDns1, String networkDns2, String zoneDns2, + String vpcDns1, String vpcDns2) { if (isIp6) { - Mockito.when(network.getIp6Dns1()).thenReturn(dns1); - Mockito.when(zone.getIp6Dns1()).thenReturn(dns2); - Mockito.when(network.getIp6Dns2()).thenReturn(dns3); - Mockito.when(zone.getIp6Dns2()).thenReturn(dns4); + Mockito.when(network.getIp6Dns1()).thenReturn(networkDns1); + Mockito.when(zone.getIp6Dns1()).thenReturn(zoneDns1); + Mockito.when(network.getIp6Dns2()).thenReturn(networkDns2); + Mockito.when(zone.getIp6Dns2()).thenReturn(zoneDns2); + Mockito.when(vpc.getIp6Dns1()).thenReturn(vpcDns1); + Mockito.when(vpc.getIp6Dns2()).thenReturn(vpcDns2); } else { - Mockito.when(network.getDns1()).thenReturn(dns1); - Mockito.when(zone.getDns1()).thenReturn(dns2); - Mockito.when(network.getDns2()).thenReturn(dns3); - Mockito.when(zone.getDns2()).thenReturn(dns4); + Mockito.when(network.getDns1()).thenReturn(networkDns1); + Mockito.when(zone.getDns1()).thenReturn(zoneDns1); + Mockito.when(network.getDns2()).thenReturn(networkDns2); + Mockito.when(zone.getDns2()).thenReturn(zoneDns2); + Mockito.when(vpc.getIp4Dns1()).thenReturn(vpcDns1); + Mockito.when(vpc.getIp4Dns2()).thenReturn(vpcDns2); } } @@ -53,38 +68,53 @@ public class NetworkModelImplTest { String[] dns2 = isIp6 ? ip6Dns2 : ip4Dns2; Network network = Mockito.mock(Network.class); DataCenter zone = Mockito.mock(DataCenter.class); - // Both network and zone have valid dns - prepareMocks(isIp6, network, zone, dns1[0], dns1[1], dns2[0], dns1[1]); + VpcVO vpc = Mockito.mock(VpcVO.class); + Mockito.when(network.getVpcId()).thenReturn(1L); + Mockito.doReturn(vpc).when(vpcDao).findById(ArgumentMatchers.anyLong()); + // network, vpc and zone have valid dns + prepareMocks(isIp6, network, zone, vpc, dns1[0], dns1[1], dns2[0], dns2[1], dns1[2], dns2[2]); Pair result = isIp6 ? networkModel.getNetworkIp6Dns(network, zone) : networkModel.getNetworkIp4Dns(network, zone); Assert.assertEquals(dns1[0], result.first()); Assert.assertEquals(dns2[0], result.second()); - // Network has valid dns and zone don't - prepareMocks(isIp6, network, zone, dns1[0], null, dns2[0], null); + // Network has valid dns and vpc/zone don't + prepareMocks(isIp6, network, zone, vpc, dns1[0], null, dns2[0], null, null, null); result = isIp6 ? networkModel.getNetworkIp6Dns(network, zone) : networkModel.getNetworkIp4Dns(network, zone); Assert.assertEquals(dns1[0], result.first()); Assert.assertEquals(dns2[0], result.second()); - // Zone has a valid dns and network don't - prepareMocks(isIp6, network, zone, null, dns1[1], null, dns2[1]); + // Vpc has valid dns and network/zone don't + prepareMocks(isIp6, network, zone, vpc, null, null, null, null, dns1[2], dns2[2]); + result = isIp6 ? networkModel.getNetworkIp6Dns(network, zone) : + networkModel.getNetworkIp4Dns(network, zone); + Assert.assertEquals(dns1[2], result.first()); + Assert.assertEquals(dns2[2], result.second()); + // Zone has a valid dns and network/vpc don't + prepareMocks(isIp6, network, zone, vpc, null, dns1[1], null, dns2[1], null, null); result = isIp6 ? networkModel.getNetworkIp6Dns(network, zone) : networkModel.getNetworkIp4Dns(network, zone); Assert.assertEquals(dns1[1], result.first()); Assert.assertEquals(dns2[1], result.second()); - // Zone has a valid dns and network has only first dns - prepareMocks(isIp6, network, zone, dns1[0], dns1[1], null, dns2[1]); + // Zone/vpc has a valid dns and network has only first dns + prepareMocks(isIp6, network, zone, vpc, dns1[0], dns1[1], null, dns2[1], dns1[2], dns2[2]); result = isIp6 ? networkModel.getNetworkIp6Dns(network, zone) : networkModel.getNetworkIp4Dns(network, zone); Assert.assertEquals(dns1[0], result.first()); Assert.assertNull(result.second()); - // Both network and zone only have the first dns - prepareMocks(isIp6, network, zone, dns1[0], dns1[1], null, null); + // network don't have a valid dns, vpc has only first dns, Zone has a valid dns + prepareMocks(isIp6, network, zone, vpc, null, dns1[1], null, dns2[1], dns1[2], null); + result = isIp6 ? networkModel.getNetworkIp6Dns(network, zone) : + networkModel.getNetworkIp4Dns(network, zone); + Assert.assertEquals(dns1[2], result.first()); + Assert.assertNull(result.second()); + // network/vpc/zone only have the first dns + prepareMocks(isIp6, network, zone, vpc, dns1[0], dns1[1], null, null, dns1[2], null); result = isIp6 ? networkModel.getNetworkIp6Dns(network, zone) : networkModel.getNetworkIp4Dns(network, zone); Assert.assertEquals(dns1[0], result.first()); Assert.assertNull(result.second()); - // Both network and zone dns are null - prepareMocks(isIp6, network, zone, null, null, null, null); + // network/vpc and zone dns are null + prepareMocks(isIp6, network, zone, vpc, null, null, null, null, null, null); result = isIp6 ? networkModel.getNetworkIp6Dns(network, zone) : networkModel.getNetworkIp4Dns(network, zone); Assert.assertNull(result.first());