Пример #1
0
    def __init__(self,
                 task_directory,
                 course_factory,
                 task_factory,
                 ssh_manager_location,
                 tmp_dir="./agent_tmp"):
        """
        :param task_directory:
        :param course_factory:
        :param task_factory:
        :param ssh_manager_location: port or filename(unix socket) to bind to. If None, remote debugging is deactivated
        :param tmp_dir:
        :return:
        """
        from inginious.backend.agent._cgroup_helper import CGroupTimeoutWatcher, CGroupMemoryWatcher

        self.logger.info("Starting agent")
        self.image_aliases = []
        self.tmp_dir = tmp_dir
        self.task_directory = task_directory
        self.course_factory = course_factory
        self.task_factory = task_factory

        # Delete tmp_dir, and recreate-it again
        try:
            rmtree(tmp_dir)
        except:
            pass

        try:
            os.mkdir(tmp_dir)
        except OSError:
            pass

        # Assert that the folders are *really* empty
        self._force_directory_empty(tmp_dir)

        if ssh_manager_location is not None:
            self.remote_ssh_manager = RemoteSSHManager(ssh_manager_location)
        else:
            self.remote_ssh_manager = None

        self.logger.debug("Start cgroup helper")
        self._timeout_watcher = CGroupTimeoutWatcher()
        self._memory_watcher = CGroupMemoryWatcher()
        self._timeout_watcher.start()
        self._memory_watcher.start()

        # Init the internal job count, used to name the directories
        self._internal_job_count_lock = threading.Lock()
        self._internal_job_count = 0

        # Dict that stores running container ids for each job id
        self._container_for_job = {}

        # Stores container id of killed containers
        self._killed_containers = set()