blob: e104400c4b21f84569e5075f54251c3f06a38149 [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.
# -----------------------------------------------------------------------
import os
import sys
import glob
import subprocess
import string
import binascii
from ducc_util import DuccUtil
class DuccRmQOccupancy(DuccUtil):
def format(self, nodes, shares):
typemap = {'R':'Res', 'M':' AP', 'J':'Job', 'S':'Svc'}
print("%20s %6s %11s %6s %10s %15s %10s %6s %6s %6s %8s %7s %10s %8s" % ("Node", "Status", "Blacklisted", "Online", "Responsive", "Nodepool", "Memory", "Order", "Free", "In-Use", "Np-InUse", "Quantum", "Reservable", "Classes"))
print("%20s %6s %11s %6s %10s %15s %10s %6s %6s %6s %8s %7s %10s %8s" % ("----", "------", "-----------", "------", "----------", "--------", "------", "-----", "----", "------", "--------", "-------", "----------", "-------"))
for n in nodes:
if (n['blacklisted'] == 'False' and n['online'] == 'True' and n['responsive'] == 'True'):
status = 'up'
else:
status = 'down'
print "%20s %6s %11s %6s %10s %15s %10s %3s(Q) %6s %6s %8s %7s %10s %-8s" % (n['name'], status, n['blacklisted'], n['online'], n['responsive'], n['nodepool'],
n['memory'], n['share_order'], n['shares_left'], n['assignments'],
n['np_assignments'], n['quantum'], n['reservable'], n['classes'])
if ( shares.has_key(n['name']) ):
for s in shares[n['name']]:
type = typemap[s['jobtype']]
fmt = '%19s ' + type +':%-8s ShareId:%-8s Shares:%-s InitTime:%-8s Investment:%-8s Evicted:%-5s Purged:%-5s Fixed:%-5s State:%-10s'
state = s['state']
if ( state == 'null' ):
state = "Assigned"
print fmt % ('', s['job_id'], s['ducc_dbid'], s['share_order'], s['init_time'], s['investment'], s['evicted'], s['purged'], s['fixed'], state)
print ''
def parse_header(self, header):
ret = []
parts = header.split('|')
for p in parts:
ret.append(p.strip())
return ret
def parse_node(self, header, line):
parts = line.split('|')
ret = {}
for k, v in zip(header, parts):
ret[k] = v.strip()
return ret
def parse_share(self, header, line):
parts = line.split('|')
ret = {}
for k, v in zip(header, parts):
ret[k] = v.strip()
return ret
def rmnodes(self, lines):
nodes = []
shares = {}
header = []
for l in lines:
if ( l == '' ):
continue
if ( '---' in l ):
continue;
if ( 'rows)' in l ):
continue;
if ( 'assignments' in l ):
doing_nodes = True
doing_shares = False
header = self.parse_header(l)
continue
if ( 'investment' in l ):
doing_nodes = False
doing_shares = True
header = self.parse_header(l)
continue
if ( doing_nodes ):
nodes.append(self.parse_node(header, l))
continue
if ( doing_shares ):
s = self.parse_share(header, l)
k = s['node']
if ( shares.has_key(k) ):
share_list = shares[k]
else:
share_list = []
shares[k] = share_list
share_list.append(s)
continue
return nodes, shares
def main(self, argv):
if len(argv) > 0:
print 'rm_qoccupancy queries and formats the current state of the RM scheduling tables. It takes no parameters.'
sys.exit(1);
DH = self.DUCC_HOME
dbn = self.ducc_properties.get('ducc.database.host')
os.environ['TERM'] = 'dumb' # insure no colors. --no-color isn't inhibiting colors in this shell for some reason.
CMD = [DH + '/cassandra-server/bin/cqlsh', dbn, '-u', 'guest', '-p', 'guest', '-e', '"select * from ducc.rmnodes; select * from ducc.rmshares;"']
CMD = ' '.join(CMD)
lines = []
proc = subprocess.Popen(CMD, bufsize=0, stdout=subprocess.PIPE, shell=True)
for line in proc.stdout:
# print line.strip()
lines.append(line.strip())
nodes, shares = self.rmnodes(lines)
self.format(nodes, shares)
if __name__ == "__main__":
stopper = DuccRmQOccupancy()
stopper.main(sys.argv[1:])