Skip to content

Commit 059d20f

Browse files
NSX: Fix DNS resolver for guest NSX networks (#23)
* 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:~# ``` * NSX: Fix DNS resolver for guest NSX networks * rename variable --------- Co-authored-by: Wei Zhou <weizhou@apache.org>
1 parent fb178c0 commit 059d20f

File tree

7 files changed

+96
-28
lines changed

7 files changed

+96
-28
lines changed

core/src/main/java/com/cloud/agent/api/SetupGuestNetworkCommand.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ public class SetupGuestNetworkCommand extends NetworkElementCommand {
3535
String routerIpv6 = null;
3636
String routerIpv6Gateway = null;
3737
String routerIpv6Cidr = null;
38+
boolean isVrGuestGateway = false;
3839

3940
public NicTO getNic() {
4041
return nic;
@@ -114,4 +115,12 @@ public void setDefaultIp6Dns1(String defaultIp6Dns1) {
114115
public void setDefaultIp6Dns2(String defaultIp6Dns2) {
115116
this.defaultIp6Dns2 = defaultIp6Dns2;
116117
}
118+
119+
public boolean isVrGuestGateway() {
120+
return isVrGuestGateway;
121+
}
122+
123+
public void setVrGuestGateway(boolean vrGuestGateway) {
124+
isVrGuestGateway = vrGuestGateway;
125+
}
117126
}

core/src/main/java/com/cloud/agent/resource/virtualnetwork/facade/SetGuestNetworkConfigItem.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ public List<ConfigItem> generateConfig(final NetworkElementCommand cmd) {
7575
guestNetwork.setRouterIp6(command.getRouterIpv6());
7676
guestNetwork.setRouterIp6Gateway(command.getRouterIpv6Gateway());
7777
guestNetwork.setRouterIp6Cidr(command.getRouterIpv6Cidr());
78+
guestNetwork.setVrGuestGateway(command.isVrGuestGateway());
7879

7980
return generateConfigItems(guestNetwork);
8081
}

core/src/main/java/com/cloud/agent/resource/virtualnetwork/model/GuestNetwork.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ public class GuestNetwork extends ConfigBase {
3737
private String routerIp6;
3838
private String routerIp6Gateway;
3939
private String routerIp6Cidr;
40+
private boolean isVrGuestGateway;
4041

4142
private Integer mtu;
4243

@@ -202,4 +203,12 @@ public void setMtu(Integer mtu) {
202203
public Integer getMtu() {
203204
return mtu;
204205
}
206+
207+
public boolean isVrGuestGateway() {
208+
return isVrGuestGateway;
209+
}
210+
211+
public void setVrGuestGateway(boolean vrGuestGateway) {
212+
isVrGuestGateway = vrGuestGateway;
213+
}
205214
}

server/src/main/java/com/cloud/network/NetworkModelImpl.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,8 +101,10 @@
101101
import com.cloud.network.rules.FirewallRule.Purpose;
102102
import com.cloud.network.rules.FirewallRuleVO;
103103
import com.cloud.network.rules.dao.PortForwardingRulesDao;
104+
import com.cloud.network.vpc.Vpc;
104105
import com.cloud.network.vpc.VpcGatewayVO;
105106
import com.cloud.network.vpc.dao.PrivateIpDao;
107+
import com.cloud.network.vpc.dao.VpcDao;
106108
import com.cloud.network.vpc.dao.VpcGatewayDao;
107109
import com.cloud.offering.NetworkOffering;
108110
import com.cloud.offering.NetworkOffering.Detail;
@@ -178,6 +180,8 @@ public class NetworkModelImpl extends ManagerBase implements NetworkModel, Confi
178180
ProjectDao projectDao;
179181
@Inject
180182
NetworkPermissionDao _networkPermissionDao;
183+
@Inject
184+
VpcDao vpcDao;
181185

182186
private List<NetworkElement> networkElements;
183187

@@ -2713,6 +2717,12 @@ public Pair<String, String> getNetworkIp4Dns(final Network network, final DataCe
27132717
if (StringUtils.isNotBlank(network.getDns1())) {
27142718
return new Pair<>(network.getDns1(), network.getDns2());
27152719
}
2720+
if (network.getVpcId() != null) {
2721+
Vpc vpc = vpcDao.findById(network.getVpcId());
2722+
if (vpc != null && StringUtils.isNotBlank(vpc.getIp4Dns1())) {
2723+
return new Pair<>(vpc.getIp4Dns1(), vpc.getIp4Dns2());
2724+
}
2725+
}
27162726
return new Pair<>(zone.getDns1(), zone.getDns2());
27172727
}
27182728

@@ -2721,6 +2731,12 @@ public Pair<String, String> getNetworkIp6Dns(final Network network, final DataCe
27212731
if (StringUtils.isNotBlank(network.getIp6Dns1())) {
27222732
return new Pair<>(network.getIp6Dns1(), network.getIp6Dns2());
27232733
}
2734+
if (network.getVpcId() != null) {
2735+
Vpc vpc = vpcDao.findById(network.getVpcId());
2736+
if (vpc != null && StringUtils.isNotBlank(vpc.getIp6Dns1())) {
2737+
return new Pair<>(vpc.getIp6Dns1(), vpc.getIp6Dns2());
2738+
}
2739+
}
27242740
return new Pair<>(zone.getIp6Dns1(), zone.getIp6Dns2());
27252741
}
27262742

server/src/main/java/com/cloud/network/router/CommandSetupHelper.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1160,7 +1160,7 @@ public void createVpcAssociatePrivateIPCommands(final VirtualRouter router, fina
11601160

11611161
public SetupGuestNetworkCommand createSetupGuestNetworkCommand(final DomainRouterVO router, final boolean add, final NicProfile guestNic) {
11621162
final Network network = _networkModel.getNetwork(guestNic.getNetworkId());
1163-
1163+
final NetworkOfferingVO networkOfferingVO = _networkOfferingDao.findById(network.getNetworkOfferingId());
11641164
String defaultDns1 = null;
11651165
String defaultDns2 = null;
11661166
String defaultIp6Dns1 = null;
@@ -1197,6 +1197,7 @@ public SetupGuestNetworkCommand createSetupGuestNetworkCommand(final DomainRoute
11971197
final SetupGuestNetworkCommand setupCmd = new SetupGuestNetworkCommand(dhcpRange, networkDomain, router.getIsRedundantRouter(), defaultDns1, defaultDns2, add, _itMgr.toNicTO(nicProfile,
11981198
router.getHypervisorType()));
11991199

1200+
setupCmd.setVrGuestGateway(networkOfferingVO.isForNsx());
12001201
NicVO publicNic = _nicDao.findDefaultNicForVM(router.getId());
12011202
if (publicNic != null) {
12021203
updateSetupGuestNetworkCommandIpv6(setupCmd, network, publicNic, defaultIp6Dns1, defaultIp6Dns2);

server/src/test/java/com/cloud/network/NetworkModelImplTest.java

Lines changed: 58 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,19 @@
2828
import com.cloud.network.element.VpcVirtualRouterElement;
2929
import com.cloud.offerings.NetworkOfferingVO;
3030
import com.cloud.offerings.dao.NetworkOfferingDao;
31+
import com.cloud.network.vpc.VpcVO;
32+
import com.cloud.network.vpc.dao.VpcDao;
3133
import com.cloud.utils.Pair;
3234
import com.cloud.utils.net.Ip;
3335
import org.junit.Assert;
3436
import org.junit.Before;
3537
import org.junit.Test;
38+
3639
import org.mockito.ArgumentMatchers;
40+
import org.junit.runner.RunWith;
3741
import org.mockito.InjectMocks;
42+
import org.mockito.Matchers;
43+
import org.mockito.Mock;
3844
import org.mockito.Mockito;
3945
import org.springframework.test.util.ReflectionTestUtils;
4046

@@ -44,12 +50,17 @@
4450
import java.util.List;
4551
import java.util.Map;
4652
import java.util.Set;
53+
import org.mockito.junit.MockitoJUnitRunner;
4754

55+
@RunWith(MockitoJUnitRunner.class)
4856
public class NetworkModelImplTest {
49-
final String[] ip4Dns1 = {"5.5.5.5", "6.6.6.6"};
50-
final String[] ip4Dns2 = {"7.7.7.7", "8.8.8.8"};
51-
final String[] ip6Dns1 = {"2001:4860:4860::5555", "2001:4860:4860::6666"};
52-
final String[] ip6Dns2 = {"2001:4860:4860::7777", "2001:4860:4860::8888"};
57+
final String[] ip4Dns1 = {"5.5.5.5", "6.6.6.6", "9.9.9.9"};
58+
final String[] ip4Dns2 = {"7.7.7.7", "8.8.8.8", "10.10.10.10"};
59+
final String[] ip6Dns1 = {"2001:4860:4860::5555", "2001:4860:4860::6666", "2001:4860:4860::9999"};
60+
final String[] ip6Dns2 = {"2001:4860:4860::7777", "2001:4860:4860::8888", "2001:4860:4860::AAAA"};
61+
62+
@Mock
63+
private VpcDao vpcDao;
5364

5465
@InjectMocks
5566
private NetworkModelImpl networkModel = new NetworkModelImpl();
@@ -63,18 +74,24 @@ public void setUp() {
6374
networkModel._networkOfferingDao = networkOfferingDao;
6475
networkModel._ntwkSrvcDao = networkServiceMapDao;
6576
}
66-
private void prepareMocks(boolean isIp6, Network network, DataCenter zone,
67-
String dns1, String dns2, String dns3, String dns4) {
77+
78+
private void prepareMocks(boolean isIp6, Network network, DataCenter zone, VpcVO vpc,
79+
String networkDns1, String zoneDns1, String networkDns2, String zoneDns2,
80+
String vpcDns1, String vpcDns2) {
6881
if (isIp6) {
69-
Mockito.when(network.getIp6Dns1()).thenReturn(dns1);
70-
Mockito.when(zone.getIp6Dns1()).thenReturn(dns2);
71-
Mockito.when(network.getIp6Dns2()).thenReturn(dns3);
72-
Mockito.when(zone.getIp6Dns2()).thenReturn(dns4);
82+
Mockito.when(network.getIp6Dns1()).thenReturn(networkDns1);
83+
Mockito.when(zone.getIp6Dns1()).thenReturn(zoneDns1);
84+
Mockito.when(network.getIp6Dns2()).thenReturn(networkDns2);
85+
Mockito.when(zone.getIp6Dns2()).thenReturn(zoneDns2);
86+
Mockito.when(vpc.getIp6Dns1()).thenReturn(vpcDns1);
87+
Mockito.when(vpc.getIp6Dns2()).thenReturn(vpcDns2);
7388
} else {
74-
Mockito.when(network.getDns1()).thenReturn(dns1);
75-
Mockito.when(zone.getDns1()).thenReturn(dns2);
76-
Mockito.when(network.getDns2()).thenReturn(dns3);
77-
Mockito.when(zone.getDns2()).thenReturn(dns4);
89+
Mockito.when(network.getDns1()).thenReturn(networkDns1);
90+
Mockito.when(zone.getDns1()).thenReturn(zoneDns1);
91+
Mockito.when(network.getDns2()).thenReturn(networkDns2);
92+
Mockito.when(zone.getDns2()).thenReturn(zoneDns2);
93+
Mockito.when(vpc.getIp4Dns1()).thenReturn(vpcDns1);
94+
Mockito.when(vpc.getIp4Dns2()).thenReturn(vpcDns2);
7895
}
7996
}
8097

@@ -83,38 +100,53 @@ private void testDnsCases(boolean isIp6) {
83100
String[] dns2 = isIp6 ? ip6Dns2 : ip4Dns2;
84101
Network network = Mockito.mock(Network.class);
85102
DataCenter zone = Mockito.mock(DataCenter.class);
86-
// Both network and zone have valid dns
87-
prepareMocks(isIp6, network, zone, dns1[0], dns1[1], dns2[0], dns1[1]);
103+
VpcVO vpc = Mockito.mock(VpcVO.class);
104+
Mockito.when(network.getVpcId()).thenReturn(1L);
105+
Mockito.doReturn(vpc).when(vpcDao).findById(Matchers.anyLong());
106+
// network, vpc and zone have valid dns
107+
prepareMocks(isIp6, network, zone, vpc, dns1[0], dns1[1], dns2[0], dns2[1], dns1[2], dns2[2]);
88108
Pair<String, String> result = isIp6 ? networkModel.getNetworkIp6Dns(network, zone) :
89109
networkModel.getNetworkIp4Dns(network, zone);
90110
Assert.assertEquals(dns1[0], result.first());
91111
Assert.assertEquals(dns2[0], result.second());
92-
// Network has valid dns and zone don't
93-
prepareMocks(isIp6, network, zone, dns1[0], null, dns2[0], null);
112+
// Network has valid dns and vpc/zone don't
113+
prepareMocks(isIp6, network, zone, vpc, dns1[0], null, dns2[0], null, null, null);
94114
result = isIp6 ? networkModel.getNetworkIp6Dns(network, zone) :
95115
networkModel.getNetworkIp4Dns(network, zone);
96116
Assert.assertEquals(dns1[0], result.first());
97117
Assert.assertEquals(dns2[0], result.second());
98-
// Zone has a valid dns and network don't
99-
prepareMocks(isIp6, network, zone, null, dns1[1], null, dns2[1]);
118+
// Vpc has valid dns and network/zone don't
119+
prepareMocks(isIp6, network, zone, vpc, null, null, null, null, dns1[2], dns2[2]);
120+
result = isIp6 ? networkModel.getNetworkIp6Dns(network, zone) :
121+
networkModel.getNetworkIp4Dns(network, zone);
122+
Assert.assertEquals(dns1[2], result.first());
123+
Assert.assertEquals(dns2[2], result.second());
124+
// Zone has a valid dns and network/vpc don't
125+
prepareMocks(isIp6, network, zone, vpc, null, dns1[1], null, dns2[1], null, null);
100126
result = isIp6 ? networkModel.getNetworkIp6Dns(network, zone) :
101127
networkModel.getNetworkIp4Dns(network, zone);
102128
Assert.assertEquals(dns1[1], result.first());
103129
Assert.assertEquals(dns2[1], result.second());
104-
// Zone has a valid dns and network has only first dns
105-
prepareMocks(isIp6, network, zone, dns1[0], dns1[1], null, dns2[1]);
130+
// Zone/vpc has a valid dns and network has only first dns
131+
prepareMocks(isIp6, network, zone, vpc, dns1[0], dns1[1], null, dns2[1], dns1[2], dns2[2]);
106132
result = isIp6 ? networkModel.getNetworkIp6Dns(network, zone) :
107133
networkModel.getNetworkIp4Dns(network, zone);
108134
Assert.assertEquals(dns1[0], result.first());
109135
Assert.assertNull(result.second());
110-
// Both network and zone only have the first dns
111-
prepareMocks(isIp6, network, zone, dns1[0], dns1[1], null, null);
136+
// network don't have a valid dns, vpc has only first dns, Zone has a valid dns
137+
prepareMocks(isIp6, network, zone, vpc, null, dns1[1], null, dns2[1], dns1[2], null);
138+
result = isIp6 ? networkModel.getNetworkIp6Dns(network, zone) :
139+
networkModel.getNetworkIp4Dns(network, zone);
140+
Assert.assertEquals(dns1[2], result.first());
141+
Assert.assertNull(result.second());
142+
// network/vpc/zone only have the first dns
143+
prepareMocks(isIp6, network, zone, vpc, dns1[0], dns1[1], null, null, dns1[2], null);
112144
result = isIp6 ? networkModel.getNetworkIp6Dns(network, zone) :
113145
networkModel.getNetworkIp4Dns(network, zone);
114146
Assert.assertEquals(dns1[0], result.first());
115147
Assert.assertNull(result.second());
116-
// Both network and zone dns are null
117-
prepareMocks(isIp6, network, zone, null, null, null, null);
148+
// network/vpc and zone dns are null
149+
prepareMocks(isIp6, network, zone, vpc, null, null, null, null, null, null);
118150
result = isIp6 ? networkModel.getNetworkIp6Dns(network, zone) :
119151
networkModel.getNetworkIp4Dns(network, zone);
120152
Assert.assertNull(result.first());

systemvm/debian/opt/cloud/bin/cs/CsGuestNetwork.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ def get_dns(self):
4040
return self.config.get_dns()
4141

4242
dns = []
43-
if 'router_guest_gateway' in self.data and not self.config.use_extdns():
43+
if 'router_guest_gateway' in self.data and not self.config.use_extdns() and 'is_vr_guest_gateway' not in self.data:
4444
dns.append(self.data['router_guest_gateway'])
4545

4646
if 'dns' in self.data:

0 commit comments

Comments
 (0)