From a78ab130e5e344989e2de9c62e061180416bae12 Mon Sep 17 00:00:00 2001 From: Yaroslav Brustinov Date: Thu, 9 Jun 2016 19:42:50 +0300 Subject: fix TRex output not redirected --- .../server/trex_launch_thread.py | 88 +++++++++++----------- .../trex_control_plane/server/trex_server.py | 5 +- 2 files changed, 47 insertions(+), 46 deletions(-) (limited to 'scripts/automation/trex_control_plane/server') diff --git a/scripts/automation/trex_control_plane/server/trex_launch_thread.py b/scripts/automation/trex_control_plane/server/trex_launch_thread.py index 82a7f996..22606753 100755 --- a/scripts/automation/trex_control_plane/server/trex_launch_thread.py +++ b/scripts/automation/trex_control_plane/server/trex_launch_thread.py @@ -30,49 +30,51 @@ class AsynchronousTRexSession(threading.Thread): self.trexObj.zmq_dump = {} def run (self): - - with open(os.devnull, 'w') as DEVNULL: - self.time_stamps['start'] = self.time_stamps['run_time'] = time.time() - self.session = subprocess.Popen(shlex.split(self.cmd), cwd = self.launch_path, stdin = DEVNULL, stderr = subprocess.PIPE, preexec_fn=os.setsid, close_fds = True) - logger.info("TRex session initialized successfully, Parent process pid is {pid}.".format( pid = self.session.pid )) - while self.session.poll() is None: # subprocess is NOT finished - time.sleep(0.5) - if self.stoprequest.is_set(): - logger.debug("Abort request received by handling thread. Terminating TRex session." ) - os.killpg(self.session.pid, signal.SIGUSR1) - self.trexObj.set_status(TRexStatus.Idle) - self.trexObj.set_verbose_status("TRex is Idle") - break - - self.time_stamps['run_time'] = time.time() - self.time_stamps['start'] - - try: - if self.time_stamps['run_time'] < 5: - logger.error("TRex run failed due to wrong input parameters, or due to readability issues.") - self.trexObj.set_verbose_status("TRex run failed due to wrong input parameters, or due to readability issues.\n\nTRex command: {cmd}\n\nRun output:\n{output}".format( - cmd = self.cmd, output = self.load_trex_output(self.export_path))) - self.trexObj.errcode = -11 - elif (self.session.returncode is not None and self.session.returncode != 0) or ( (self.time_stamps['run_time'] < self.duration) and (not self.stoprequest.is_set()) ): - if (self.session.returncode is not None and self.session.returncode != 0): - logger.debug("Failed TRex run due to session return code ({ret_code})".format( ret_code = self.session.returncode ) ) - elif ( (self.time_stamps['run_time'] < self.duration) and not self.stoprequest.is_set()): - logger.debug("Failed TRex run due to running time ({runtime}) combined with no-stopping request.".format( runtime = self.time_stamps['run_time'] ) ) - - logger.warning("TRex run was terminated unexpectedly by outer process or by the hosting OS") - self.trexObj.set_verbose_status("TRex run was terminated unexpectedly by outer process or by the hosting OS.\n\nRun output:\n{output}".format( - output = self.load_trex_output(self.export_path))) - self.trexObj.errcode = -15 - else: - logger.info("TRex run session finished.") - self.trexObj.set_verbose_status('TRex finished.') - self.trexObj.errcode = None - - finally: - self.trexObj.set_status(TRexStatus.Idle) - logger.info("TRex running state changed to 'Idle'.") - self.trexObj.expect_trex.clear() - logger.debug("Finished handling a single run of TRex.") - self.trexObj.zmq_dump = None + try: + with open(self.export_path, 'w') as output_file: + self.time_stamps['start'] = self.time_stamps['run_time'] = time.time() + self.session = subprocess.Popen(shlex.split(self.cmd), cwd = self.launch_path, stdout = output_file, preexec_fn=os.setsid, close_fds = True) + logger.info("TRex session initialized successfully, Parent process pid is {pid}.".format( pid = self.session.pid )) + while self.session.poll() is None: # subprocess is NOT finished + time.sleep(0.5) + if self.stoprequest.is_set(): + logger.debug("Abort request received by handling thread. Terminating TRex session." ) + os.killpg(self.session.pid, signal.SIGUSR1) + self.trexObj.set_status(TRexStatus.Idle) + self.trexObj.set_verbose_status("TRex is Idle") + break + except Exception as e: + logger.error(e) + + self.time_stamps['run_time'] = time.time() - self.time_stamps['start'] + + try: + if self.time_stamps['run_time'] < 5: + logger.error("TRex run failed due to wrong input parameters, or due to readability issues.") + self.trexObj.set_verbose_status("TRex run failed due to wrong input parameters, or due to readability issues.\n\nTRex command: {cmd}\n\nRun output:\n{output}".format( + cmd = self.cmd, output = self.load_trex_output(self.export_path))) + self.trexObj.errcode = -11 + elif (self.session.returncode is not None and self.session.returncode != 0) or ( (self.time_stamps['run_time'] < self.duration) and (not self.stoprequest.is_set()) ): + if (self.session.returncode is not None and self.session.returncode != 0): + logger.debug("Failed TRex run due to session return code ({ret_code})".format( ret_code = self.session.returncode ) ) + elif ( (self.time_stamps['run_time'] < self.duration) and not self.stoprequest.is_set()): + logger.debug("Failed TRex run due to running time ({runtime}) combined with no-stopping request.".format( runtime = self.time_stamps['run_time'] ) ) + + logger.warning("TRex run was terminated unexpectedly by outer process or by the hosting OS") + self.trexObj.set_verbose_status("TRex run was terminated unexpectedly by outer process or by the hosting OS.\n\nRun output:\n{output}".format( + output = self.load_trex_output(self.export_path))) + self.trexObj.errcode = -15 + else: + logger.info("TRex run session finished.") + self.trexObj.set_verbose_status('TRex finished.') + self.trexObj.errcode = None + + finally: + self.trexObj.set_status(TRexStatus.Idle) + logger.info("TRex running state changed to 'Idle'.") + self.trexObj.expect_trex.clear() + logger.debug("Finished handling a single run of TRex.") + self.trexObj.zmq_dump = None def join (self, timeout = None): self.stoprequest.set() diff --git a/scripts/automation/trex_control_plane/server/trex_server.py b/scripts/automation/trex_control_plane/server/trex_server.py index 8f7e99f0..5e278a74 100755 --- a/scripts/automation/trex_control_plane/server/trex_server.py +++ b/scripts/automation/trex_control_plane/server/trex_server.py @@ -466,12 +466,11 @@ class CTRexServer(object): if 'd' not in kwargs: raise Exception('Argument -d should be specified in stateful command') - cmd = "{nice}{run_command} --iom {io} {cmd_options} --no-key > {export}".format( # -- iom 0 disables the periodic log to the screen (not needed) + cmd = "{nice}{run_command} --iom {io} {cmd_options} --no-key".format( # -- iom 0 disables the periodic log to the screen (not needed) nice = '' if self.trex_nice == 0 else 'nice -n %s ' % self.trex_nice, run_command = self.TREX_START_CMD, cmd_options = trex_cmd_options, - io = iom, - export = export_path ) + io = iom) logger.info("TREX FULL COMMAND: {command}".format(command = cmd) ) -- cgit 1.2.3-korg