diff options
Diffstat (limited to 'docker/storperf-master/storperf/fio/fio_invoker.py')
-rw-r--r-- | docker/storperf-master/storperf/fio/fio_invoker.py | 45 |
1 files changed, 34 insertions, 11 deletions
diff --git a/docker/storperf-master/storperf/fio/fio_invoker.py b/docker/storperf-master/storperf/fio/fio_invoker.py index 0360ea2..bb81eef 100644 --- a/docker/storperf-master/storperf/fio/fio_invoker.py +++ b/docker/storperf-master/storperf/fio/fio_invoker.py @@ -11,6 +11,7 @@ import json import logging from threading import Thread import paramiko +from storperf.utilities import ip_helper class FIOInvoker(object): @@ -23,6 +24,7 @@ class FIOInvoker(object): self.callback_id = None self.terminated = False self.metadata = var_dict + self.stderr = [] @property def remote_host(self): @@ -44,6 +46,8 @@ class FIOInvoker(object): self.json_body = "" try: for line in iter(stdout.readline, b''): + if type(line) == bytes: + line = line.decode('utf=8') if line.startswith("fio"): line = "" continue @@ -60,13 +64,13 @@ class FIOInvoker(object): "Event listener callback") event_listener( self.callback_id, json_metric) - except Exception, e: + except Exception as e: self.logger.exception( "Notifying listener %s: %s", self.callback_id, e) self.logger.debug( "Event listener callback complete") - except Exception, e: + except Exception as e: self.logger.error("Error parsing JSON: %s", e) except IOError: pass # We might have read from the closed socket, ignore it @@ -77,7 +81,9 @@ class FIOInvoker(object): def stderr_handler(self, stderr): self.logger.debug("Started") for line in iter(stderr.readline, b''): - self.logger.error("FIO Error: %s", line.rstrip()) + if len(line) > 0: + self.logger.error("FIO Error: %s", line.rstrip()) + self.stderr.append(line.rstrip()) # Sometime, FIO gets stuck and will give us this message: # fio: job 'sequential_read' hasn't exited in 60 seconds, @@ -125,6 +131,9 @@ class FIOInvoker(object): self.logger.debug("Joining stdout handler") tout.join() self.logger.debug("Ended") + if exit_status != 0: + return self.stderr + return None def terminate(self): self.logger.debug("Terminating fio on " + self.remote_host) @@ -132,10 +141,12 @@ class FIOInvoker(object): ssh = self._ssh_client() - command = "sudo killall fio" - - self.logger.debug("Executing on %s: %s" % (self.remote_host, command)) - (_, stdout, stderr) = ssh.exec_command(command) + kill_commands = ['sudo killall fio', + 'sudo pkill fio'] + for command in kill_commands: + self.logger.debug("Executing on %s: %s" % + (self.remote_host, command)) + (_, stdout, stderr) = ssh.exec_command(command) for line in stdout.readlines(): self.logger.debug(line.strip()) @@ -148,13 +159,25 @@ class FIOInvoker(object): def _ssh_client(self): ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) + address, port = ip_helper.parse_address_and_port(self.remote_host) if 'username' in self.metadata and 'password' in self.metadata: - ssh.connect(self.remote_host, + ssh.connect(address, + port=port, + username=self.metadata['username'], + password=self.metadata['password'], + timeout=5) + return ssh + elif 'username' in self.metadata and 'ssh_key' in self.metadata: + ssh.connect(address, + port=port, username=self.metadata['username'], - password=self.metadata['password']) + pkey=self.metadata['ssh_key'], + timeout=5) return ssh else: - ssh.connect(self.remote_host, username='storperf', + ssh.connect(address, + port=port, + username='storperf', key_filename='storperf/resources/ssh/storperf_rsa', - timeout=2) + timeout=5) return ssh |