def start(self): """Starts the process on the MaxiNet node and returns the remote PID. Returns: True if the process started successfully, False otherwise. """ self.start_time = time.time() # start command as daemonized process logger.debug("Daemonizing \"%s\" on MaxiNet node %s" % (self._command, self._node.nn)) result = self._node.cmd("%s %s %s" % ( transport_api.TransportAPI.get_binary_path("daemonize"), configuration.get_worker_working_directory(), self._command)) pid = result.splitlines()[0] # daemonize is supposed to print ONLY the PID of the started process if not pid.isdigit(): logger.error("Failed to start process:\n{}".format( utils.indent(result, 2))) return False self.pid = int(pid) return True
def start(self): """Starts the process on the MaxiNet node and returns the remote PID. Returns: True if the process started successfully, False otherwise. """ self.start_time = time.time() # start command as daemonized process logger.debug("Daemonizing \"%s\" on MaxiNet node %s" % (self._command, self._node.nn)) result = self._node.cmd( "%s %s %s" % (transport_api.TransportAPI.get_binary_path("daemonize"), configuration.get_worker_working_directory(), self._command)) pid = result.splitlines()[0] # daemonize is supposed to print ONLY the PID of the started process if not pid.isdigit(): logger.error("Failed to start process:\n{}".format( utils.indent(result, 2))) return False self.pid = int(pid) return True
def _get_remote_transport_bin_path(cls): """Returns path to transport binaries on worker nodes. Returns: Path to transport binaries on worker nodes. """ return os.path.join(configuration.get_worker_working_directory(), "transport_bin")
def init(self, nodes): """Initialize the transport API. Instantiate the process manager and all specified MaxiNet nodes. Args: nodes: List of MaxiNet nodes the transport API is used on. """ logger.debug("Initializing transport API") # Copy binaries to workers for worker in {node.worker for node in nodes}: ssh_tools.copy_to_worker( worker, os.path.abspath("./transport_bin"), configuration.get_worker_working_directory()) self._process_manager.start() self._nodes = nodes for node in self._nodes: self._init_node(node)
def run(self): self.__stop.clear() for worker in network_emulator.NetworkEmulator.get_instance( ).cluster.worker: self.__running_processes[worker] = dict() while not self.__stop.isSet(): for worker in network_emulator.NetworkEmulator.get_instance( ).cluster.worker: successful_processes = [] try: successful_processes = self.__worker_get_pids_from_file( worker, os.path.join( configuration.get_worker_working_directory(), "pids_successful")) logger.debug("Successful processes {!s}".format( successful_processes)) except subprocess.CalledProcessError: # This possible, if file pids_successful does not yet exist pass failed_processes = [] try: failed_processes = self.__worker_get_pids_from_file( worker, os.path.join( configuration.get_worker_working_directory(), "pids_failed")) logger.debug( "Failed processes {!s}".format(failed_processes)) except subprocess.CalledProcessError: # This possible, if file pids_failed does not yet exist pass # For every failed process retrieve and print processes's output from worker for pid in failed_processes: try: cat_cmd = "cat {1}".format( worker.hn(), os.path.join( configuration.get_worker_working_directory(), "processes", str(pid))) logfile_content = ssh_tools.worker_ssh(worker, cat_cmd) logfile_formatted = utils.indent(logfile_content, 2) logger.error( "Process with PID {0} failed:\n{1}".format( pid, logfile_formatted)) except subprocess.CalledProcessError, err: logger.error( "Failed to retrieve logfile for process with PID %i" % pid) # Not allowed, as every daemonized process writes to a logfile raise err # post-process successful and failed processes with self.__running_processes_lock: # all successful transmissions for pid in successful_processes: if pid in self.__running_processes[worker]: self.__running_processes[worker][ pid].call_terminated( process.Process.SUCCESSFUL) del self.__running_processes[worker][pid] else: logger.error( "PID of successful transmission not found") # all unsuccessful transmissions for pid in failed_processes: if pid in self.__running_processes[worker]: self.__running_processes[worker][ pid].call_terminated(process.Process.FAILED) del self.__running_processes[worker][pid] time.sleep(self.__interval)
def run(self): self.__stop.clear() for worker in network_emulator.NetworkEmulator.get_instance().cluster.worker: self.__running_processes[worker] = dict() while not self.__stop.isSet(): for worker in network_emulator.NetworkEmulator.get_instance().cluster.worker: successful_processes = [] try: successful_processes = self.__worker_get_pids_from_file( worker, os.path.join(configuration.get_worker_working_directory(), "pids_successful")) logger.debug("Successful processes {!s}".format(successful_processes)) except subprocess.CalledProcessError: # This possible, if file pids_successful does not yet exist pass failed_processes = [] try: failed_processes = self.__worker_get_pids_from_file( worker, os.path.join(configuration.get_worker_working_directory(), "pids_failed")) logger.debug("Failed processes {!s}".format(failed_processes)) except subprocess.CalledProcessError: # This possible, if file pids_failed does not yet exist pass # For every failed process retrieve and print processes's output from worker for pid in failed_processes: try: cat_cmd = "cat {1}".format( worker.hn(), os.path.join(configuration.get_worker_working_directory(), "processes", str(pid))) logfile_content = ssh_tools.worker_ssh(worker, cat_cmd) logfile_formatted = utils.indent(logfile_content, 2) logger.error("Process with PID {0} failed:\n{1}".format( pid, logfile_formatted)) except subprocess.CalledProcessError, err: logger.error("Failed to retrieve logfile for process with PID %i" % pid) # Not allowed, as every daemonized process writes to a logfile raise err # post-process successful and failed processes with self.__running_processes_lock: # all successful transmissions for pid in successful_processes: if pid in self.__running_processes[worker]: self.__running_processes[worker][pid].call_terminated( process.Process.SUCCESSFUL) del self.__running_processes[worker][pid] else: logger.error("PID of successful transmission not found") # all unsuccessful transmissions for pid in failed_processes: if pid in self.__running_processes[worker]: self.__running_processes[worker][pid].call_terminated( process.Process.FAILED) del self.__running_processes[worker][pid] time.sleep(self.__interval)