Process: Add remote_port as new parameter

remote_port defines a custom/additional port for
connections over ssh. It may be used in case several
ssh instances share one IP address.

Change-Id: I2c93fd2ea1c10c333d00eafd3c1066c35796e398
diff --git a/src/osmo_gsm_tester/core/process.py b/src/osmo_gsm_tester/core/process.py
index eaf8de7..0b96f2e 100644
--- a/src/osmo_gsm_tester/core/process.py
+++ b/src/osmo_gsm_tester/core/process.py
@@ -381,12 +381,14 @@
 
 class RemoteProcess(Process):
 
-    def __init__(self, name, run_dir, remote_user, remote_host, remote_cwd, popen_args, remote_env={}, **popen_kwargs):
+    def __init__(self, name, run_dir, remote_user, remote_host, remote_cwd, popen_args,
+                 remote_env={}, remote_port=None, **popen_kwargs):
         super().__init__(name, run_dir, popen_args, **popen_kwargs)
         self.remote_user = remote_user
         self.remote_host = remote_host
         self.remote_cwd = remote_cwd
         self.remote_env = remote_env
+        self.remote_port = remote_port
 
         # hacky: instead of just prepending ssh, i.e. piping stdout and stderr
         # over the ssh link, we should probably run on the remote side,
@@ -402,6 +404,10 @@
                            '%s %s %s' % (cd,
                                          ' '.join(['%s=%r'%(k,v) for k,v in self.remote_env.items()]),
                                          ' '.join(self.popen_args))]
+        if self.remote_port:
+            self.popen_args.insert(1, '-p')
+            self.popen_args.insert(2, self.remote_port)
+
         self.dbg(self.popen_args, dir=self.run_dir, conf=self.popen_kwargs, remote_env=self.remote_env)
 
     def RunError(self, msg_prefix):
diff --git a/src/osmo_gsm_tester/core/remote.py b/src/osmo_gsm_tester/core/remote.py
index 8deb25d..0ea873d 100644
--- a/src/osmo_gsm_tester/core/remote.py
+++ b/src/osmo_gsm_tester/core/remote.py
@@ -28,13 +28,14 @@
 
     WRAPPER_SCRIPT = 'ssh_sigkiller.sh'
 
-    def __init__(self, run_dir, remote_user = 'root', remote_host = 'localhost', remote_cwd=None):
+    def __init__(self, run_dir, remote_user = 'root', remote_host = 'localhost', remote_cwd=None, remote_port=None):
         super().__init__(log.C_RUN, 'host-' + remote_user + '@' + remote_host)
         self.run_dir = util.Dir(run_dir.new_dir(self.name()))
         self.remote_user = remote_user
         self.remote_host = remote_host
         self.remote_cwd = remote_cwd
         self.remote_env = {}
+        self.remote_port = remote_port
 
     def user(self):
         return self.remote_user
@@ -51,9 +52,13 @@
     def get_remote_env(self):
         return self.remote_env
 
+    def get_remote_port(self):
+        return self.remote_port
+
     def RemoteProcess(self, name, popen_args, remote_env={}, **popen_kwargs):
         run_dir = self.run_dir.new_dir(name)
-        return process.RemoteProcess(name, run_dir, self.user(), self.host(), self.cwd(), popen_args, remote_env=remote_env, **popen_kwargs)
+        return process.RemoteProcess(name, run_dir, self.user(), self.host(), self.cwd(), popen_args,
+                                     remote_env=remote_env, remote_port=self.get_remote_port(), **popen_kwargs)
 
     def generate_wrapper_script(self, wait_time_sec):
         wrapper_script = self.run_dir.new_file(RemoteHost.WRAPPER_SCRIPT)