Esempio n. 1
0
def get_node_reservations():
    """
    Return a dictionary where node is the key and RsvParent 
    is the value.  Reservation must be Type == User and 
    have a SubType of StandingReservation.
    """
    s = Scheduler()
    # Dictionary where 
    node_reservations = {}

    # Command to execute that returns some xml, initializes element tree.
    r = et.fromstring(
        s.doCommand( [ "mdiag", "--xml", '-r', ] )
    )

    # Element tree has data at the root, and likely 1 or more rsv children.
    for q in r.findall( 'rsv' ):
        # Instantiate a Reservation, where xml attributes map to object properties.
        # q.attrib is a dictionary of attributes and their values.
        rsv = Reservation( q.attrib )
        #if rsv.Type == "User" and rsv.SubType == "StandingReservation" and rsv.RsvGroup != "iactive":
        #if not is_private( rsv ):
        if is_private( rsv ):
            logging.debug( "Found reservation: %s", rsv.Name )
            for n in rsv.AllocNodeList:
                # Question here, any chance more than one reservation
                # could include the same node, but with different 
                # RsvParents?  Last in wins?
                node_reservations[ n ] = rsv.RsvParent
                logging.debug( "Added node %s to reserved node list", n )

    return node_reservations
Esempio n. 2
0
def get_jobs(all_jobs=False):
    """
    Build up a dictionary of jobs.  Key is job_id, value is
    a list containing AllocNodeList, User and Account.
    """
    s = Scheduler()
    r = et.fromstring(
        s.doCommand( [ "mdiag", "--xml", '-j', ] )
    )

    jobs = {}
    for j in r.findall( 'job' ):
        job = Job( dict( j.attrib.items() + j.find('req').items() ))
        # Add all running jobs if --all, otherwise filter out preemptees.
        if (job.State == 'Running' and all_jobs) or \
           (job.State == 'Running' and "PREEMPTEE" not in job.Flags and not
           all_jobs): 
            jobs[ job.JobID ] = [
                job.AllocNodeList,
                job.User,
                job.Account,
            ]
    return jobs
Esempio n. 3
0
def get_counts(node_reservations, jobs):
    """
    Provide counts for total public core usage and 
    broken down by user and account.
    """
    s = Scheduler()

    # create count of public nodes in campus class
    r = et.fromstring(
        s.doCommand( [ "mdiag", "--xml", '-n', ] )
    )

    public_nodes = []
    public_cores = 0
    logging.debug( "Looking for public nodes" )
    for n in r.findall( 'node' ):
        node = Node( n.attrib )
        # When node.CFGCLASS does not contain 'campus', this is not a public
        # node. Also skip if node has an associated reservation. Node 
        # is added to public_nodes list in all other cases.
        if node.NODESTATE == 'Drained' or node.NODESTATE == 'Down':
            logging.debug( "node %s is %s", node.NODEID, node.NODESTATE )
            continue
        if 'campus' not in node.CFGCLASS:
            logging.debug( "node %s not in campus class", node.NODEID )
            continue
        if node.NODEID in node_reservations:
            logging.debug( "node %s in private reservation %s", node.NODEID, node_reservations[ node.NODEID ] )
            continue

        public_nodes.append( node.NODEID )
        logging.debug( "node %s added to public list",  node.NODEID )
        public_cores += node.RCPROC
        logging.debug( "added %s cores from node %s added to public core total", node.RCPROC, node.NODEID )

    cred_totals = {}
    # { 'cred':cores }
    # Copy the list to later subtract in-use nodes.
    public_nodes_free = public_nodes[:]
    for job in jobs.values():
        logging.debug( "Counting job with creds %s", job )
        for node in job[0]:
            job_cred = job[1] + " (" + job[2] + ")"
            if node in public_nodes:
                logging.debug( "node %s is public", node )
                o = [
                    job[0][node],
                    node,
                    'public',
                    job_cred,
                ]
                # Remove public nodes that have at least one 
                # core in use from public_nodes_free
                if node in public_nodes_free: 
                    del public_nodes_free[public_nodes_free.index(node)]
                try:
                    cred_totals[ job_cred ] = (
                        cred_totals[ job_cred ] + job[0][node]
                    )
                except KeyError:
                    cred_totals[ job_cred ] = job[0][node]

    logging.debug( "Nodes Free: %s", public_nodes_free )
    logging.debug( "Cred totals: %s", cred_totals )
    return cred_totals, public_cores, len(public_nodes), len(public_nodes_free)
Esempio n. 4
0
    logging.basicConfig( level=logging.WARNING )

try:
    from mwm.scheduler import Scheduler
    from mwm.mtypes import Reservation, Job, Node
except ImportError:
    logging.exception( "Moab client libraries not found" )
    sys.exit(1)

s = Scheduler()

# Collect reservations
# { reservation name:mwm.Reservation.Name }
reservations = {}
r = et.fromstring(
    s.doCommand( [ "mdiag", "--xml", '-r', ] )
)

for q in r.findall( 'rsv' ):
    rsv = Reservation( q.attrib )
    reservations[ rsv.Name ] = rsv
    logging.debug( "Added reservation: %s", rsv.Name )

# Collect jobs
# { jobid:mwm.Job.JobID }
jobs = {}
r = et.fromstring(
    s.doCommand( [ "mdiag", "--xml", '-j', ] )
)

for q in r.findall( 'job' ):