From b2af92298736be447558d27c2562cd0d001995e3 Mon Sep 17 00:00:00 2001 From: Rodolfo Alonso Hernandez Date: Mon, 9 Dec 2019 16:13:10 +0000 Subject: [PATCH] Load the glibc library only once for Pyroute2 Load the glibc library only once, needed in the Pyroute2 methods to create and delete a network namespace. Conflicts: neutron/privileged/agent/linux/ip_lib.py Change-Id: I95b7b7008f4788a98ef871c4b7aecea839ff2310 Closes-Bug: #1854462 (cherry picked from commit af8a8122407331c70e11b0fe02ad0178fa5181f6) --- neutron/privileged/agent/linux/ip_lib.py | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/neutron/privileged/agent/linux/ip_lib.py b/neutron/privileged/agent/linux/ip_lib.py index a47c7bfee9d..e67342fdfe6 100644 --- a/neutron/privileged/agent/linux/ip_lib.py +++ b/neutron/privileged/agent/linux/ip_lib.py @@ -10,6 +10,8 @@ # License for the specific language governing permissions and limitations # under the License. +import ctypes +from ctypes import util as ctypes_util import errno import socket @@ -27,6 +29,15 @@ from neutron import privileged _IP_VERSION_FAMILY_MAP = {4: socket.AF_INET, 6: socket.AF_INET6} +_CDLL = None + + +def _get_cdll(): + global _CDLL + if not _CDLL: + _CDLL = ctypes.CDLL(ctypes_util.find_library('c'), use_errno=True) + return _CDLL + def _get_scope_name(scope): """Return the name of the scope (given as a number), or the scope number @@ -417,7 +428,7 @@ def create_netns(name, **kwargs): :param name: The name of the namespace to create """ try: - netns.create(name, **kwargs) + netns.create(name, libc=_get_cdll()) except OSError as e: if e.errno != errno.EEXIST: raise @@ -430,7 +441,7 @@ def remove_netns(name, **kwargs): :param name: The name of the namespace to remove """ try: - netns.remove(name, **kwargs) + netns.remove(name, libc=_get_cdll()) except OSError as e: if e.errno != errno.ENOENT: raise