Add handlers to run process under a specific netns on a remote host

It will be used later to run iiperf3-cli connected to srsue on another host.

Change-Id: I8d223fc302df42446f5876ba020cfbea94be09b9
diff --git a/src/osmo_gsm_tester/process.py b/src/osmo_gsm_tester/process.py
index 3880630..2735c6a 100644
--- a/src/osmo_gsm_tester/process.py
+++ b/src/osmo_gsm_tester/process.py
@@ -396,6 +396,12 @@
         kill_cmd = ('kill', '-%d' % int(sig), str(self.process_obj.pid))
         run_local_netns_sync(self.run_dir, self.name()+"-kill"+str(sig), self.netns, kill_cmd)
 
+class RemoteNetNSProcess(RemoteProcess):
+    NETNS_EXEC_BIN = 'osmo-gsm-tester_netns_exec.sh'
+    def __init__(self, name, run_dir, remote_user, remote_host, remote_cwd, netns, popen_args, **popen_kwargs):
+        args = ['sudo', self.NETNS_EXEC_BIN, self.netns] + list(popen_args)
+        super().__init__(name, run_dir, remote_user, remote_host, remote_cwd, args, **popen_kwargs)
+        self.netns = netns
 
 def run_local_sync(run_dir, name, popen_args):
     run_dir =run_dir.new_dir(name)
diff --git a/src/osmo_gsm_tester/remote.py b/src/osmo_gsm_tester/remote.py
index 6be0a5e..771f2b8 100644
--- a/src/osmo_gsm_tester/remote.py
+++ b/src/osmo_gsm_tester/remote.py
@@ -93,6 +93,10 @@
         args = (remote_wrapper_script,) + popen_args
         return self.RemoteProcess(name, args, remote_env, **popen_kwargs)
 
+    def RemoteNetNSProcess(self, name, netns, popen_args, **popen_kwargs):
+        run_dir = self.run_dir.new_dir(name)
+        return self.RemoteNetNSProcess(name, run_dir, self.user(), self.host(), self.cwd(), netns, popen_args, **popen_kwargs)
+
     def run_remote_sync(self, name, popen_args):
         proc = self.RemoteProcess(name, popen_args, remote_env=self.remote_env)
         proc.launch_sync()