From c0aef97c49781f2ce0aa93fd33bfac7e68ea5b97 Mon Sep 17 00:00:00 2001 From: Stephen Finucane Date: Wed, 8 Feb 2017 11:49:12 +0000 Subject: [PATCH] netutils: Ignore 'use_ipv6' for network templates Nova supports file injection of network templates. Putting these in a config drive is the only way to configure networking without DHCP. At present, setting the 'use_ipv6' config option to False prevents the generation of IPv6 network info, even if there are IPv6 networks available. This was fine when using nova-network, where the same config option is used to control generation of these subnets. However, a mismatch between this nova option and equivalent IPv6 options in neutron would result in IPv6 packets being dropped. Seeing as there is apparent reason for not including IPv6 network info when IPv6 capable networks are present, we can ignore this option. Instead, we include info for all available networks in the template, be they IPv4 or IPv6. Change-Id: I188fc2cd1b26fe7a71804f7e7d66b111d6f15e30 Implements: blueprint centralize-config-options-pike --- nova/tests/unit/network/test_network_info.py | 8 +++----- nova/virt/netutils.py | 20 ++++--------------- ...ates-ignore-use_ipv6-6d93c26f52a5b487.yaml | 19 ++++++++++++++++++ 3 files changed, 26 insertions(+), 21 deletions(-) create mode 100644 releasenotes/notes/network-templates-ignore-use_ipv6-6d93c26f52a5b487.yaml diff --git a/nova/tests/unit/network/test_network_info.py b/nova/tests/unit/network/test_network_info.py index ce7d37da7462..41d210b26d99 100644 --- a/nova/tests/unit/network/test_network_info.py +++ b/nova/tests/unit/network/test_network_info.py @@ -573,7 +573,7 @@ class NetworkInfoTests(test.NoDBTestCase): nwinfo = model.NetworkInfo(vifs) return netutils.get_injected_network_template( - nwinfo, use_ipv6=use_ipv6, libvirt_virt_type=libvirt_virt_type) + nwinfo, libvirt_virt_type=libvirt_virt_type) def test_injection_dynamic(self): expected = None @@ -869,8 +869,7 @@ class TestNetworkMetadata(test.NoDBTestCase): def test_get_network_metadata_json(self): - net_metadata = netutils.get_network_metadata(self.netinfo, - use_ipv6=True) + net_metadata = netutils.get_network_metadata(self.netinfo) # Physical Ethernet self.assertEqual( @@ -938,8 +937,7 @@ class TestNetworkMetadata(test.NoDBTestCase): self.netinfo[0]['network']['subnets'][0] = ipv4_subnet self.netinfo[0]['network']['subnets'][1] = ipv6_subnet - net_metadata = netutils.get_network_metadata(self.netinfo, - use_ipv6=True) + net_metadata = netutils.get_network_metadata(self.netinfo) # IPv4 Network self.assertEqual( diff --git a/nova/virt/netutils.py b/nova/virt/netutils.py index 89f2db6c564f..536867d70854 100644 --- a/nova/virt/netutils.py +++ b/nova/virt/netutils.py @@ -56,21 +56,16 @@ def _get_first_network(network, version): pass -def get_injected_network_template(network_info, use_ipv6=None, template=None, +def get_injected_network_template(network_info, template=None, libvirt_virt_type=None): """Returns a rendered network template for the given network_info. :param network_info: :py:meth:`~nova.network.manager.NetworkManager.get_instance_nw_info` - :param use_ipv6: If False, do not return IPv6 template information - even if an IPv6 subnet is present in network_info. :param template: Path to the interfaces template file. :param libvirt_virt_type: The Libvirt `virt_type`, will be `None` for other hypervisors.. """ - if use_ipv6 is None: - use_ipv6 = CONF.use_ipv6 - if not template: template = CONF.injected_network_template @@ -128,8 +123,7 @@ def get_injected_network_template(network_info, use_ipv6=None, template=None, gateway_v6 = '' netmask_v6 = None dns_v6 = None - have_ipv6 = (use_ipv6 and subnet_v6) - if have_ipv6: + if subnet_v6: if subnet_v6.get_meta('dhcp_server') is not None: continue @@ -169,7 +163,7 @@ def get_injected_network_template(network_info, use_ipv6=None, template=None, 'libvirt_virt_type': libvirt_virt_type}) -def get_network_metadata(network_info, use_ipv6=None): +def get_network_metadata(network_info): """Gets a more complete representation of the instance network information. This data is exposed as network_data.json in the metadata service and @@ -177,16 +171,10 @@ def get_network_metadata(network_info, use_ipv6=None): :param network_info: `nova.network.models.NetworkInfo` object describing the network metadata. - :param use_ipv6: If False, do not return IPv6 template information - even if an IPv6 subnet is present in network_info. Defaults to - nova.netconf.use_ipv6. """ if not network_info: return - if use_ipv6 is None: - use_ipv6 = CONF.use_ipv6 - # IPv4 or IPv6 networks nets = [] # VIFs, physical NICs, or VLANs. Physical NICs will have type 'phy'. @@ -221,7 +209,7 @@ def get_network_metadata(network_info, use_ipv6=None): nets.append(_get_nets(vif, subnet_v4, 4, net_num, link['id'])) services += [dns for dns in _get_dns_services(subnet_v4) if dns not in services] - if (use_ipv6 and subnet_v6) and subnet_v6.get('ips'): + if subnet_v6 and subnet_v6.get('ips'): net_num += 1 nets.append(_get_nets(vif, subnet_v6, 6, net_num, link['id'])) services += [dns for dns in _get_dns_services(subnet_v6) diff --git a/releasenotes/notes/network-templates-ignore-use_ipv6-6d93c26f52a5b487.yaml b/releasenotes/notes/network-templates-ignore-use_ipv6-6d93c26f52a5b487.yaml new file mode 100644 index 000000000000..17f3d1ec7853 --- /dev/null +++ b/releasenotes/notes/network-templates-ignore-use_ipv6-6d93c26f52a5b487.yaml @@ -0,0 +1,19 @@ +--- +upgrade: + - | + Injected network templates will now ignore the ``use_ipv6`` config option. + + Nova supports file injection of network templates. Putting these in a + config drive is the only way to configure networking without DHCP. + + Previously, setting the ``use_ipv6`` config option to ``False`` prevented + the generation of IPv6 network info, even if there were IPv6 networks + available. This was fine when using nova-network, where the same config + option is used to control generation of these subnets. However, a mismatch + between this nova option and equivalent IPv6 options in neutron would + have resulted in IPv6 packets being dropped. + + Seeing as there was no apparent reason for not including IPv6 network info + when IPv6 capable networks are present, we now ignore this option. + Instead, we include info for all available networks in the template, be + they IPv4 or IPv6.