#!/usr/bin/env python # ----------------------------------------------------------------------- # Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file # distributed with this work for additional information # regarding copyright ownership. The ASF licenses this file # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. # ----------------------------------------------------------------------- # Intended for cooperative scheduling. # Dumps important information that a "proxy" RM would need to make the # bridge between an external scheduler and DUCC RM. import os import sys import subprocess from ducc_util import DuccUtil class DuccRmQLoad(DuccUtil): def format_array(self, ar): fmt = '' for i in range(0, len(ar)): fmt = fmt + '%4d ' return (fmt % tuple(ar)) def format_classes(self, cls): # print the list of classes; each class is a dictionary for cl in cls: print 'Class', cl['name'], 'policy', cl['policy'] print ' requested', self.format_array(cl['requested']) print ' awarded ', self.format_array(cl['awarded']) print '' def format_nodepools(self, nps): # print the list of nodepools; each nodepool is a dictionary for np in nps: print 'Nodepool', np['name'] print ' online', np['online'], 'dead', np['dead'], 'offline', np['offline'], 'total-shares', np['total-shares'], 'free-shares', np['free-shares'] print ' all machines:', self.format_array(np['all-machines']) print ' online machines:', self.format_array(np['online-machines']) print ' free machines:', self.format_array(np['free-machines']) print ' virtual machines:', self.format_array(np['virtual-machines']) print '' # # The input is structured like this: # A dictionary with these keys: # quantum # value is a single integer # classes # value is a list of dictionaries describing demand # with these keys # name # value is string, the name of the class # policy # value is the scheduling policy # requested # value is a list of integers # awarded # value is a list of integers # nodepools # value is a list of dictionaries describing a node pool # with these keys # name # value is the namne of the nodepool # online # value is an integer # dead # value is an integer # offline # value is an integer # total-shares # value is an integer # free-shares # value is an integer # all-machines # value is a list of integers # online-machines # value is a list of integers # free-machines # value is a list of integers # virtual-machines # value is a list of integers # def format(self, lines): qload = eval(lines) print 'Quantum:', qload['quantum'] print '' self.format_classes(qload['classes']) self.format_nodepools(qload['nodepools']) def main(self, argv): if len(argv) > 0: print 'rm_qload queries and formats the current state of the RM scheduling tables. It takes no parameters.' sys.exit(1); DUCC_JVM_OPTS = ' -Dducc.deploy.configuration=' + self.DUCC_HOME + "/resources/ducc.properties " DUCC_JVM_OPTS = DUCC_JVM_OPTS + ' -DDUCC_HOME=' + self.DUCC_HOME DUCC_JVM_OPTS = DUCC_JVM_OPTS + ' -Dducc.head=' + self.ducc_properties.get('ducc.head') CMD = [self.java(), DUCC_JVM_OPTS, 'org.apache.uima.ducc.common.main.DuccRmAdmin', '--qload'] CMD = ' '.join(CMD) lines = '' proc = subprocess.Popen(CMD, bufsize=0, stdout=subprocess.PIPE, shell=True) for line in proc.stdout: lines = lines + line if 'not yet initialized' in lines: print lines return self.format(lines) return if __name__ == "__main__": query = DuccRmQLoad() query.main(sys.argv[1:])