From 3f3e5d619f2f8c3877b4bef8a173324fae938a30 Mon Sep 17 00:00:00 2001 From: Slawek Kaplonski Date: Fri, 21 Aug 2020 15:06:01 +0200 Subject: [PATCH] Fix get_ipv6_llas method in the interface driver This method is using ip_lib.get_devices_with_ip function to get IP addresses with scope "link". Unfortunatelly this method wasn't translating scope names to the pyrout2 values and due to that wasn't returning correct IP addresses. Now this is fixed and correctl link local IPv6 addresses are returned. Change-Id: Ia41c1bc627ad2ce89d658ff1fdedee802f6dfa15 Closes-Bug: #1892489 (cherry picked from commit a4e04a7f8be95295324a59c34e6a79c7973af1ee) --- neutron/agent/linux/ip_lib.py | 3 +++ .../functional/agent/linux/test_interface.py | 16 ++++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/neutron/agent/linux/ip_lib.py b/neutron/agent/linux/ip_lib.py index 820ed8aa0db..0d4b47a0ce7 100644 --- a/neutron/agent/linux/ip_lib.py +++ b/neutron/agent/linux/ip_lib.py @@ -1422,6 +1422,9 @@ def get_devices_with_ip(namespace, name=None, **kwargs): link_args = {} if name: link_args['ifname'] = name + scope = kwargs.pop('scope', None) + if scope: + kwargs['scope'] = IP_ADDRESS_SCOPE_NAME[scope] devices = privileged.get_link_devices(namespace, **link_args) retval = [] for parsed_ips in (_parse_link_device(namespace, device, **kwargs) diff --git a/neutron/tests/functional/agent/linux/test_interface.py b/neutron/tests/functional/agent/linux/test_interface.py index 8121e238e48..d6b5dd26d75 100644 --- a/neutron/tests/functional/agent/linux/test_interface.py +++ b/neutron/tests/functional/agent/linux/test_interface.py @@ -69,6 +69,22 @@ class InterfaceDriverTestCaseMixin(object): self.interface.set_mtu, device_name=device_name, namespace=namespace)) + def test_ipv6_lla_create_and_get(self): + lla_address = "fe80::f816:3eff:fe66:73bf/64" + global_address = "2001::1/64" + device_name = utils.get_rand_name() + namespace = self.useFixture(net_helpers.NamespaceFixture()) + namespace.ip_wrapper.add_dummy(device_name) + self.interface.add_ipv6_addr( + device_name, lla_address, namespace.name, 'link') + self.interface.add_ipv6_addr( + device_name, global_address, namespace.name, 'global') + existing_addresses = [ + a['cidr'] for a in self.interface.get_ipv6_llas( + device_name, namespace.name)] + self.assertIn(lla_address, existing_addresses) + self.assertNotIn(global_address, existing_addresses) + class OVSInterfaceDriverTestCase(linux_base.BaseOVSLinuxTestCase, InterfaceDriverTestCaseMixin):