lib: Refactor re_execute_with_namespace

Move and rename re_execute_with_namespace from run_tests.py to
namespaces.py. Add RunAsRootUser() to commandline and call it
from ReExecuteWithName in namespaces.

BUG=b:233635037
TEST=CQ

Change-Id: I109181450d8398d4543f1e74324cddaef095c87e
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/chromite/+/3710477
Tested-by: Cindy Lin <xcl@google.com>
Reviewed-by: Ram Chandrasekar <rchandrasekar@google.com>
Commit-Queue: Cindy Lin <xcl@google.com>
diff --git a/scripts/run_tests.py b/scripts/run_tests.py
index 1ffa6ea..1d48652 100644
--- a/scripts/run_tests.py
+++ b/scripts/run_tests.py
@@ -32,7 +32,6 @@
 from chromite.lib import cros_build_lib
 from chromite.lib import gs
 from chromite.lib import namespaces
-from chromite.lib import osutils
 
 
 def main(argv):
@@ -66,7 +65,8 @@
     # Namespacing is enabled by default because tests may break each other or
     # interfere with parts of the running system if not isolated in a namespace.
     # Disabling namespaces is not recommended for general use.
-    re_execute_with_namespace([sys.argv[0]] + argv, network=opts.network)
+    namespaces.ReExecuteWithNamespace(
+        [sys.argv[0]] + argv, network=opts.network)
 
   # Check the environment.  https://crbug.com/1015450
   st = os.stat('/')
@@ -93,28 +93,6 @@
       compile_build_api_proto.ProtocVersion.CHROMITE)
 
 
-def re_execute_with_namespace(argv, network=False):
-  """Re-execute as root so we can unshare resources."""
-  if osutils.IsNonRootUser():
-    cmd = [
-        'sudo',
-        'HOME=%s' % os.environ['HOME'],
-        'PATH=%s' % os.environ['PATH'],
-        '--',
-    ] + argv
-    os.execvp(cmd[0], cmd)
-  else:
-    namespaces.SimpleUnshare(net=not network, pid=True)
-    # We got our namespaces, so switch back to the user to run the tests.
-    gid = int(os.environ.pop('SUDO_GID'))
-    uid = int(os.environ.pop('SUDO_UID'))
-    user = os.environ.pop('SUDO_USER')
-    os.initgroups(user, gid)
-    os.setresgid(gid, gid, gid)
-    os.setresuid(uid, uid, uid)
-    os.environ['USER'] = user
-
-
 def re_execute_inside_chroot(argv):
   """Re-execute the test wrapper inside the chroot."""
   if cros_build_lib.IsInsideChroot():