From ccebded0cbb654be18db5b4e0e7f8b8a3a7cacdb Mon Sep 17 00:00:00 2001 From: Jens Rosenboom Date: Mon, 27 Mar 2017 15:33:25 +0000 Subject: [PATCH] Update network metadata type field for IPv6 Currently it is not possible to decide from looking at the network metadata whether an IPv6 subnet is using slaac, dhcpv6-stateless or dhcpv6-stateful. So we add ipv6_address_mode information into the subnet metadata when it is available and use that to construct the subnet type. As a result, the type for a subnet with mode SLAAC will be "ipv6_slaac" instead of "ipv6_dhcp" and similarly for the other available modes. Change-Id: I751200a354ec9be2bfd5f94d3e4bbf53dab2c8bb Partial-Bug: 1676363 --- nova/network/neutronv2/api.py | 2 + nova/tests/unit/network/test_network_info.py | 40 +++++++++++++++++++ nova/virt/netutils.py | 7 +++- ...ded-network-metadata-7784295884f65c09.yaml | 14 +++++++ 4 files changed, 61 insertions(+), 2 deletions(-) create mode 100644 releasenotes/notes/added-network-metadata-7784295884f65c09.yaml diff --git a/nova/network/neutronv2/api.py b/nova/network/neutronv2/api.py index 9997559364..459731b6bb 100644 --- a/nova/network/neutronv2/api.py +++ b/nova/network/neutronv2/api.py @@ -2259,6 +2259,8 @@ class API(base_api.NetworkAPI): address=subnet['gateway_ip'], type='gateway'), } + if subnet.get('ipv6_address_mode'): + subnet_dict['ipv6_address_mode'] = subnet['ipv6_address_mode'] # attempt to populate DHCP server field search_opts = {'network_id': subnet['network_id'], diff --git a/nova/tests/unit/network/test_network_info.py b/nova/tests/unit/network/test_network_info.py index 8455b00c61..0beea4744d 100644 --- a/nova/tests/unit/network/test_network_info.py +++ b/nova/tests/unit/network/test_network_info.py @@ -963,6 +963,46 @@ class TestNetworkMetadata(test.NoDBTestCase): }, net_metadata['networks'][1]) + def _test_get_network_metadata_json_ipv6_addr_mode(self, mode): + ipv6_subnet = fake_network_cache_model.new_subnet( + subnet_dict=dict(dhcp_server='1234:567::', + ipv6_address_mode=mode), version=6) + + self.netinfo[0]['network']['subnets'][1] = ipv6_subnet + net_metadata = netutils.get_network_metadata(self.netinfo) + + self.assertEqual( + { + 'id': 'network1', + 'link': 'interface0', + 'ip_address': 'fd00::2', + 'netmask': 'ffff:ffff:ffff::', + 'routes': [ + { + 'network': '::', + 'netmask': '::', + 'gateway': 'fd00::1' + }, + { + 'network': '::', + 'netmask': 'ffff:ffff:ffff::', + 'gateway': 'fd00::1:1' + } + ], + 'type': 'ipv6_%s' % mode, + 'network_id': 1 + }, + net_metadata['networks'][1]) + + def test_get_network_metadata_json_ipv6_addr_mode_slaac(self): + self._test_get_network_metadata_json_ipv6_addr_mode('slaac') + + def test_get_network_metadata_json_ipv6_addr_mode_stateful(self): + self._test_get_network_metadata_json_ipv6_addr_mode('dhcpv6-stateful') + + def test_get_network_metadata_json_ipv6_addr_mode_stateless(self): + self._test_get_network_metadata_json_ipv6_addr_mode('dhcpv6-stateless') + def test__get_nets(self): expected_net = { 'id': 'network0', diff --git a/nova/virt/netutils.py b/nova/virt/netutils.py index 8534c06ef2..61710337f8 100644 --- a/nova/virt/netutils.py +++ b/nova/virt/netutils.py @@ -261,7 +261,10 @@ def _get_nets(vif, subnet, version, net_num, link_id): :param link_id: Arbitrary identifier for the link the networks are attached to """ - if subnet.get_meta('dhcp_server') is not None: + net_type = '' + if subnet.get_meta('ipv6_address_mode') is not None: + net_type = '_%s' % subnet.get_meta('ipv6_address_mode') + elif subnet.get_meta('dhcp_server') is not None: net_info = { 'id': 'network%d' % net_num, 'type': 'ipv%d_dhcp' % version, @@ -279,7 +282,7 @@ def _get_nets(vif, subnet, version, net_num, link_id): net_info = { 'id': 'network%d' % net_num, - 'type': 'ipv%d' % version, + 'type': 'ipv%d%s' % (version, net_type), 'link': link_id, 'ip_address': address, 'netmask': netmask, diff --git a/releasenotes/notes/added-network-metadata-7784295884f65c09.yaml b/releasenotes/notes/added-network-metadata-7784295884f65c09.yaml new file mode 100644 index 0000000000..f46fdb0a42 --- /dev/null +++ b/releasenotes/notes/added-network-metadata-7784295884f65c09.yaml @@ -0,0 +1,14 @@ +--- +features: + - | + The network.json metadata format has been amended for IPv6 networks + under Neutron control. The type that is shown has been changed + from being always set to ``ipv6_dhcp`` to correctly reflecting the + ``ipv6_address_mode`` option in Neutron, so the type now will be + ``ipv6_slaac``, ``ipv6_dhcpv6-stateless`` or ``ipv6_dhcpv6-stateful``. +upgrade: + - | + The information in the network.json metadata has been amended, + for IPv6 networks under Neutron control, the ``type`` field has been + changed from being always set to ``ipv6_dhcp`` to correctly reflecting + the ``ipv6_address_mode`` option in Neutron.