Implement "list_ns_pids" inside Neutron
Instead of using Pyroute2.netns.ns_pids() [1], while [2] is not
solved, a method to list a namespace PIDs is implemented in this
patch.
This implementation is based on the Pyroute2 method.
[1]80f6e7fcdd/pyroute2/netns/__init__.py (L163)
[2]https://github.com/svinota/pyroute2/issues/633
Change-Id: Ic00c02035a0dabf1a1efd1995c84692649c6ad27
Related-Bug: #1841753
This commit is contained in:
parent
f5bcca87d1
commit
085e9d8b3d
@ -11,6 +11,7 @@
|
||||
# under the License.
|
||||
|
||||
import errno
|
||||
import os
|
||||
import socket
|
||||
|
||||
from neutron_lib import constants
|
||||
@ -30,6 +31,8 @@ from neutron import privileged
|
||||
|
||||
_IP_VERSION_FAMILY_MAP = {4: socket.AF_INET, 6: socket.AF_INET6}
|
||||
|
||||
NETNS_RUN_DIR = '/var/run/netns'
|
||||
|
||||
|
||||
def _get_scope_name(scope):
|
||||
"""Return the name of the scope (given as a number), or the scope number
|
||||
@ -189,8 +192,29 @@ def open_namespace(namespace):
|
||||
|
||||
@privileged.default.entrypoint
|
||||
def list_ns_pids(namespace):
|
||||
"""List namespace process PIDs"""
|
||||
return netns.ns_pids().get(namespace, [])
|
||||
"""List namespace process PIDs
|
||||
|
||||
Based on Pyroute2.netns.ns_pids(). Remove when
|
||||
https://github.com/svinota/pyroute2/issues/633 is fixed.
|
||||
"""
|
||||
ns_pids = []
|
||||
try:
|
||||
ns_path = os.path.join(NETNS_RUN_DIR, namespace)
|
||||
ns_inode = os.stat(ns_path).st_ino
|
||||
except OSError:
|
||||
return ns_pids
|
||||
|
||||
for pid in os.listdir('/proc'):
|
||||
if not pid.isdigit():
|
||||
continue
|
||||
try:
|
||||
pid_path = os.path.join('/proc', pid, 'ns', 'net')
|
||||
if os.stat(pid_path).st_ino == ns_inode:
|
||||
ns_pids.append(int(pid))
|
||||
except OSError:
|
||||
continue
|
||||
|
||||
return ns_pids
|
||||
|
||||
|
||||
def _translate_ip_device_exception(e, device=None, namespace=None):
|
||||
|
Loading…
Reference in New Issue
Block a user