Skip to content
Snippets Groups Projects
cluster_resource.py 2.31 KiB
Newer Older
'''
Created on 04/04/2016

@author: MMPE
'''
from wetb.utils.cluster_tools.ssh_client import SSHClient
from wetb.utils.cluster_tools import pbswrap
import multiprocessing
import psutil

class Resource(object):
    pass




class PBSClusterResource(Resource, SSHClient):
    def __init__(self, host, username, password, port=22):
        SSHClient.__init__(self, host, username, password, port=port)
        self.no_users = 20

    def new_ssh_connection(self):
        return SSHClient(self.host, self.username, self.password, self.port)

    def check_resources(self):
        with self:
            _, output, _ = self.execute('pbsnodes -l all')
            pbsnodes, nodes = pbswrap.parse_pbsnode_lall(output.split("\n"))

            _, output, _ = self.execute('qstat -n1')
            users, host, nodesload = pbswrap.parse_qstat_n1(output.split("\n"))


        # if the user does not have any jobs, this will not exist
        try:
            cpu_user = users[self.username]['cpus']
            cpu_user += users[self.username]['Q']
        except KeyError:
            cpu_user = 0
        cpu_free, nodeSum = pbswrap.count_cpus(users, host, pbsnodes)

        return nodeSum['used_cpu'] + cpu_free, cpu_free, cpu_user

    def ok2submit(self):

        total, free, user = self.check_resources()
        minimum_cpus = total * 1 / self.no_users
        if user < minimum_cpus:
            return True
        elif free > minimum_cpus * 4:
            return True
        else:
            return False
mads's avatar
mads committed

class LocalResource(Resource):
    def __init__(self, process_name):
        self.process_name = process_name
        self.no_users = 1
        self.host = 'Localhost'

    def check_resources(self):
        def name(i):
            try:
                return psutil.Process(i).name
            except psutil._error.AccessDenied:
                pass


        no_cpu = multiprocessing.cpu_count()
        cpu_free = (1 - psutil.cpu_percent(.5) / 100) * no_cpu
        no_current_process = len([i for i in psutil.get_pid_list() if name(i) == self.process_name])
        return no_cpu, cpu_free, no_current_process

    def ok2submit(self):

        total, free, user = self.check_resources()
        minimum_cpus = total * 1 / self.no_users
        if user < minimum_cpus and free > 2:
            return True
        else:
            return False