diff --git a/neutron/agent/linux/dhcp.py b/neutron/agent/linux/dhcp.py index f3d8e814609..84a0ff592ab 100644 --- a/neutron/agent/linux/dhcp.py +++ b/neutron/agent/linux/dhcp.py @@ -420,16 +420,22 @@ class Dnsmasq(DhcpLocalProcess): name = 'host-%s.%s' % (r.sub('-', alloc.ip_address), self.conf.dhcp_domain) set_tag = '' + # (dzyu) Check if it is legal ipv6 address, if so, need wrap + # it with '[]' to let dnsmasq to distinguish MAC address from + # IPv6 address. + ip_address = alloc.ip_address + if netaddr.valid_ipv6(ip_address): + ip_address = '[%s]' % ip_address if getattr(port, 'extra_dhcp_opts', False): if self.version >= self.MINIMUM_VERSION: set_tag = 'set:' buf.write('%s,%s,%s,%s%s\n' % - (port.mac_address, name, alloc.ip_address, + (port.mac_address, name, ip_address, set_tag, port.id)) else: buf.write('%s,%s,%s\n' % - (port.mac_address, name, alloc.ip_address)) + (port.mac_address, name, ip_address)) name = self.get_conf_file_name('host') utils.replace_file(name, buf.getvalue()) diff --git a/neutron/tests/unit/test_linux_dhcp.py b/neutron/tests/unit/test_linux_dhcp.py index 146043341de..7086a7b7fee 100644 --- a/neutron/tests/unit/test_linux_dhcp.py +++ b/neutron/tests/unit/test_linux_dhcp.py @@ -966,11 +966,11 @@ tag:44444444-4444-4444-4444-444444444444,option:bootfile-name,pxelinux3.0""" exp_host_data = ('00:00:80:aa:bb:cc,host-192-168-0-2.openstacklocal,' '192.168.0.2\n' '00:00:f3:aa:bb:cc,host-fdca-3ba5-a17a-4ba3--2.' - 'openstacklocal,fdca:3ba5:a17a:4ba3::2\n' + 'openstacklocal,[fdca:3ba5:a17a:4ba3::2]\n' '00:00:0f:aa:bb:cc,host-192-168-0-3.openstacklocal,' '192.168.0.3\n' '00:00:0f:aa:bb:cc,host-fdca-3ba5-a17a-4ba3--3.' - 'openstacklocal,fdca:3ba5:a17a:4ba3::3\n' + 'openstacklocal,[fdca:3ba5:a17a:4ba3::3]\n' '00:00:0f:rr:rr:rr,host-192-168-0-1.openstacklocal,' '192.168.0.1\n').lstrip() exp_opt_name = '/dhcp/cccccccc-cccc-cccc-cccc-cccccccccccc/opts' @@ -1015,11 +1015,11 @@ tag:tag1,249,%s,%s""".lstrip() % (fake_v6, exp_host_data = ('00:00:80:aa:bb:cc,host-192-168-0-2.openstacklocal,' '192.168.0.2\n' '00:00:f3:aa:bb:cc,host-fdca-3ba5-a17a-4ba3--2.' - 'openstacklocal,fdca:3ba5:a17a:4ba3::2\n' + 'openstacklocal,[fdca:3ba5:a17a:4ba3::2]\n' '00:00:0f:aa:bb:cc,host-192-168-0-3.openstacklocal,' '192.168.0.3\n' '00:00:0f:aa:bb:cc,host-fdca-3ba5-a17a-4ba3--3.' - 'openstacklocal,fdca:3ba5:a17a:4ba3::3\n' + 'openstacklocal,[fdca:3ba5:a17a:4ba3::3]\n' '00:00:0f:rr:rr:rr,host-192-168-0-1.openstacklocal,' '192.168.0.1\n').lstrip() exp_host_data.replace('\n', '')