blob: 8e8d43eefb9e1fc34b06ec294568f91d4789433b [file] [log] [blame]
#!/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:])