Esempio n. 1
0
    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
Esempio n. 2
0
    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
Esempio n. 3
0
    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")
Esempio n. 4
0
    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)
Esempio n. 5
0
    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)
Esempio n. 6
0
    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)