From 46435daf5c18af61f8dfaa19859ba863408f5d33 Mon Sep 17 00:00:00 2001 From: Takashi Kajinami Date: Sun, 6 Oct 2024 20:24:45 +0900 Subject: [PATCH] Drop dependency on netifaces The netifaces library was abandoned and retired. Replace it by psutil which is already part of the dependencies. Note that localhost_supports_ipv6 from openstacksdk should be mocked now because it uses psutil in recent versions. Closes-Bug: #2071596 Change-Id: If9268cab8c2b3098d757571c6cab07d13d34a2c2 --- nova/compute/utils.py | 31 +++++++++++++-------------- nova/tests/fixtures/nova.py | 5 ++++- nova/tests/unit/compute/test_utils.py | 12 ----------- requirements.txt | 1 - 4 files changed, 19 insertions(+), 30 deletions(-) diff --git a/nova/compute/utils.py b/nova/compute/utils.py index 982101344e..b8117cdb7b 100644 --- a/nova/compute/utils.py +++ b/nova/compute/utils.py @@ -19,12 +19,13 @@ import functools import inspect import itertools import math +import socket import traceback -import netifaces from oslo_log import log from oslo_serialization import jsonutils from oslo_utils import excutils +import psutil from nova.accelerator import cyborg from nova import block_device @@ -1071,22 +1072,20 @@ def get_machine_ips(): :returns: list of Strings of ip addresses """ addresses = [] - for interface in netifaces.interfaces(): - try: - iface_data = netifaces.ifaddresses(interface) - for family in iface_data: - if family not in (netifaces.AF_INET, netifaces.AF_INET6): - continue - for address in iface_data[family]: - addr = address['addr'] + for interface, ifaddresses in psutil.net_if_addrs().items(): + for ifaddress in ifaddresses: + if ifaddress.family not in (socket.AF_INET, socket.AF_INET6): + continue + + addr = ifaddress.address + + # If we have an ipv6 address remove the + # %ether_interface at the end + if ifaddress.family == socket.AF_INET6: + addr = addr.split('%')[0] + + addresses.append(addr) - # If we have an ipv6 address remove the - # %ether_interface at the end - if family == netifaces.AF_INET6: - addr = addr.split('%')[0] - addresses.append(addr) - except ValueError: - pass return addresses diff --git a/nova/tests/fixtures/nova.py b/nova/tests/fixtures/nova.py index 56ee615104..d33294cfa0 100644 --- a/nova/tests/fixtures/nova.py +++ b/nova/tests/fixtures/nova.py @@ -32,6 +32,7 @@ import warnings import eventlet import fixtures import futurist +from openstack.cloud import _utils from openstack import service_description from oslo_concurrency import lockutils from oslo_config import cfg @@ -1662,6 +1663,8 @@ class OpenStackSDKFixture(fixtures.Fixture): self.useFixture(fixtures.MockPatchObject( service_description.ServiceDescription, '_make_proxy', fake_make_proxy)) + self.useFixture(fixtures.MockPatchObject( + _utils, 'localhost_supports_ipv6', return_value=False)) class HostNameWeigher(weights.BaseHostWeigher): @@ -1716,7 +1719,7 @@ class HostNameWeigherFixture(fixtures.Fixture): class GenericPoisonFixture(fixtures.Fixture): POISON_THESE = ( ( - 'netifaces.interfaces', + 'psutil.net_if_addrs', 'tests should not be inspecting real interfaces on the test node', ), ( diff --git a/nova/tests/unit/compute/test_utils.py b/nova/tests/unit/compute/test_utils.py index dae7850014..2470f3a9a0 100644 --- a/nova/tests/unit/compute/test_utils.py +++ b/nova/tests/unit/compute/test_utils.py @@ -1155,18 +1155,6 @@ class ComputeUtilsTestCase(test.NoDBTestCase): self.assertRaises(test.TestingException, self._test_event_reporter_graceful_exit, error) - @mock.patch('netifaces.interfaces') - def test_get_machine_ips_value_error(self, mock_interfaces): - # Tests that the utility method does not explode if netifaces raises - # a ValueError. - iface = mock.sentinel - mock_interfaces.return_value = [iface] - with mock.patch('netifaces.ifaddresses', - side_effect=ValueError) as mock_ifaddresses: - addresses = compute_utils.get_machine_ips() - self.assertEqual([], addresses) - mock_ifaddresses.assert_called_once_with(iface) - @mock.patch('nova.compute.utils.notify_about_instance_action') @mock.patch('nova.compute.utils.notify_about_instance_usage') @mock.patch('nova.objects.Instance.destroy') diff --git a/requirements.txt b/requirements.txt index 80d4c1ec73..e922e337d2 100644 --- a/requirements.txt +++ b/requirements.txt @@ -18,7 +18,6 @@ Paste>=2.0.2 # MIT PrettyTable>=0.7.1 # BSD alembic>=1.5.0 # MIT netaddr>=0.7.18 # BSD -netifaces>=0.10.4 # MIT paramiko>=2.7.1 # LGPLv2.1+ iso8601>=0.1.11 # MIT jsonschema>=4.0.0 # MIT