self._format_option(i, 'dns-server',
','.join(subnet.dns_nameservers)))
- host_routes = ["%s,%s" % (hr.destination, hr.nexthop)
- for hr in subnet.host_routes]
+ gateway = subnet.gateway_ip
+ host_routes = []
+ for hr in subnet.host_routes:
+ if hr.destination == "0.0.0.0/0":
+ gateway = hr.nexthop
+ else:
+ host_routes.append("%s,%s" % (hr.destination, hr.nexthop))
# Add host routes for isolated network segments
enable_metadata = (
','.join(host_routes)))
if subnet.ip_version == 4:
- if subnet.gateway_ip:
- options.append(self._format_option(i, 'router',
- subnet.gateway_ip))
+ if gateway:
+ options.append(self._format_option(i, 'router', gateway))
else:
options.append(self._format_option(i, 'router'))
nexthop = '20.0.0.1'
+class FakeV4HostRouteGateway:
+ destination = '0.0.0.0/0'
+ nexthop = '10.0.0.1'
+
+
class FakeV6HostRoute:
destination = 'gdca:3ba5:a17a:4ba3::/64'
nexthop = 'gdca:3ba5:a17a:4ba3::1'
dns_nameservers = ['8.8.8.8']
+class FakeV4SubnetGatewayRoute:
+ id = 'dddddddd-dddd-dddd-dddd-dddddddddddd'
+ ip_version = 4
+ cidr = '192.168.0.0/24'
+ gateway_ip = '192.168.0.1'
+ enable_dhcp = True
+ host_routes = [FakeV4HostRouteGateway]
+ dns_nameservers = ['8.8.8.8']
+
+
class FakeV6Subnet:
id = 'ffffffff-ffff-ffff-ffff-ffffffffffff'
ip_version = 6
ports = [FakePort1(), FakePort2(), FakePort3()]
+class FakeDualNetworkGatewayRoute:
+ id = 'cccccccc-cccc-cccc-cccc-cccccccccccc'
+ subnets = [FakeV4SubnetGatewayRoute(), FakeV6Subnet()]
+ ports = [FakePort1(), FakePort2(), FakePort3()]
+
+
class FakeDualNetworkSingleDHCP:
id = 'cccccccc-cccc-cccc-cccc-cccccccccccc'
subnets = [FakeV4Subnet(), FakeV4SubnetNoDHCP()]
self.safe.assert_called_once_with('/foo/opts', expected)
+ def test_output_opts_file_gateway_route(self):
+ fake_v6 = 'gdca:3ba5:a17a:4ba3::1'
+ fake_v6_cidr = 'gdca:3ba5:a17a:4ba3::/64'
+ expected = """
+tag:tag0,option:dns-server,8.8.8.8
+tag:tag0,option:router,10.0.0.1
+tag:tag1,option:dns-server,%s
+tag:tag1,option:classless-static-route,%s,%s""".lstrip() % (fake_v6,
+ fake_v6_cidr,
+ fake_v6)
+
+ with mock.patch.object(dhcp.Dnsmasq, 'get_conf_file_name') as conf_fn:
+ conf_fn.return_value = '/foo/opts'
+ dm = dhcp.Dnsmasq(self.conf, FakeDualNetworkGatewayRoute(),
+ version=float(2.59))
+ dm._output_opts_file()
+
+ self.safe.assert_called_once_with('/foo/opts', expected)
+
def test_output_opts_file_single_dhcp(self):
expected = """
tag:tag0,option:dns-server,8.8.8.8