From a4e04a7f8be95295324a59c34e6a79c7973af1ee 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 --- 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 5a4f4be3766..99fe71b5381 100644 --- a/neutron/agent/linux/ip_lib.py +++ b/neutron/agent/linux/ip_lib.py @@ -1361,6 +1361,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):