Implement namespace creation method
Since [1], Pyroute forks the namespace creation to avoid calling destructive routine "libc.unshare(CLONE_NEWNET)" from the main process. This implementation uses sockets between both processes to return any error feedback sent from the child process. This patch implements the same fork without any communication. If the child process raises an exception other than "OSError(EEXIST)", the child process returns 1 that is read by the the main process, that raises a "RuntimeError" exception. Related-Bug: #1917487 [1]81db2c98a1
Conflicts: neutron/privileged/agent/linux/ip_lib.py Change-Id: I0294586335a71d0757803843f675124bfb450967 (cherry picked from commiteb56747851
)
This commit is contained in:
parent
d8f1f1118d
commit
13275402ce
@ -531,11 +531,19 @@ def create_netns(name, **kwargs):
|
||||
|
||||
:param name: The name of the namespace to create
|
||||
"""
|
||||
try:
|
||||
netns.create(name, libc=_get_cdll())
|
||||
except OSError as e:
|
||||
if e.errno != errno.EEXIST:
|
||||
raise
|
||||
pid = os.fork()
|
||||
if pid == 0:
|
||||
try:
|
||||
netns.create(name, libc=_get_cdll())
|
||||
except OSError as e:
|
||||
if e.errno != errno.EEXIST:
|
||||
os._exit(1)
|
||||
except Exception:
|
||||
os._exit(1)
|
||||
os._exit(0)
|
||||
else:
|
||||
if os.waitpid(pid, 0)[1]:
|
||||
raise RuntimeError(_('Error creating namespace %s') % name)
|
||||
|
||||
|
||||
@privileged.default.entrypoint
|
||||
|
Loading…
Reference in New Issue
Block a user