X-Git-Url: http://git.onelab.eu/?p=monitor.git;a=blobdiff_plain;f=nodequery.py;h=e9001a6e20a57eb62fe9eea1b977d51415e998eb;hp=691ead51d7782bea20e2d48ec3946429978793ab;hb=7e1b0434bd1f865f7e9d8dff1cebd87d07a8d65d;hpb=b548c69db3d1f302b4d0d08377f0231eb3c4fd58 diff --git a/nodequery.py b/nodequery.py index 691ead5..e9001a6 100755 --- a/nodequery.py +++ b/nodequery.py @@ -1,34 +1,25 @@ #!/usr/bin/python -import plc -api = plc.getAuthAPI() import sys -import database -from nodecommon import * -#from policy import Diagnose -from unified_model import Record +from monitor import database +from monitor.common import * +from monitor.model import Record import glob import os -from reboot import pcu_name -import reboot -import util.file import traceback import time import re +import string -import config +from monitor.wrapper import plc, plccache +api = plc.getAuthAPI() -from sqlobject import connectionForURI,sqlhub -connection = connectionForURI(config.sqlobjecturi) -sqlhub.processConnection = connection -from infovacuum.model.findbadrecord import * +from monitor.database.info.model import FindbadNodeRecord, FindbadPCURecord, session +from monitor import util +from monitor import config -#fb = {} -fb = None -fbpcu = None -import string class NoKeyException(Exception): pass @@ -75,14 +66,18 @@ def fb_print_nodeinfo(fbnode, hostname, fields=None): format += "%%(%s)s " % f print format % fbnode +def first(path): + indexes = path.split(".") + return indexes[0] + def get(fb, path): - indexes = path.split("/") + indexes = path.split(".") values = fb for index in indexes: - if index in values: - values = values[index] - else: - raise NoKeyException(index) + if values and index in values: + values = values[index] + else: + raise NoKeyException(index) return values def verifyType(constraints, data): @@ -222,19 +217,18 @@ def verify(constraints, data): for key in con.keys(): #print "looking at key: %s" % key - if key in data: + if first(key) in data: value_re = re.compile(con[key]) - if type([]) == type(data[key]): + if type([]) == type(get(data,key)): local_or_true = False - for val in data[key]: + for val in get(data,key): local_or_true = local_or_true | (value_re.search(val) is not None) con_and_true = con_and_true & local_or_true else: - if data[key] is not None: - con_and_true = con_and_true & (value_re.search(data[key]) is not None) - elif key not in data: - print "missing key %s" % key, - pass + if get(data,key) is not None: + con_and_true = con_and_true & (value_re.search(get(data,key)) is not None) + elif first(key) not in data: + print "missing key %s" % first(key) con_or_true = con_or_true | con_and_true @@ -259,45 +253,54 @@ def query_to_dict(query): return ad def pcu_in(fbdata): - if 'plcnode' in fbdata: - if 'pcu_ids' in fbdata['plcnode']: - if len(fbdata['plcnode']['pcu_ids']) > 0: + #if 'plcnode' in fbdata: + if 'plc_node_stats' in fbdata: + if fbdata['plc_node_stats'] and 'pcu_ids' in fbdata['plc_node_stats']: + if len(fbdata['plc_node_stats']['pcu_ids']) > 0: return True return False def pcu_select(str_query, nodelist=None): - global fb - global fbpcu pcunames = [] nodenames = [] if str_query is None: return (nodenames, pcunames) - if fb is None: - fb = database.dbLoad("findbad") - if fbpcu is None: - fbpcu = database.dbLoad("findbadpcus") + if True: + fbquery = FindbadNodeRecord.get_all_latest() + fb_nodelist = [ n.hostname for n in fbquery ] + if True: + # NOTE: this doesn't work when there are only a few records current. + # pcu_select should apply to all pcus globally, not just the most recent records. + fbpcuquery = FindbadPCURecord.get_all_latest() + fbpcu_list = [ p.plc_pcuid for p in fbpcuquery ] - #print str_query dict_query = query_to_dict(str_query) - #print dict_query - - for node in fb['nodes'].keys(): - if nodelist is not None: - if node not in nodelist: continue - - fb_nodeinfo = fb['nodes'][node]['values'] - if pcu_in(fb_nodeinfo): - pcuinfo = fbpcu['nodes']['id_%s' % fb_nodeinfo['plcnode']['pcu_ids'][0]]['values'] - if verify(dict_query, pcuinfo): - nodenames.append(node) - str = "cmdhttps/locfg.pl -s %s -f iloxml/License.xml -u %s -p '%s' | grep MESSAGE" % \ - (pcu_name(pcuinfo), pcuinfo['username'], pcuinfo['password']) - #pcunames.append(str) - pcunames.append(pcuinfo['pcu_id']) + print "dict_query", dict_query + print 'length %s' % len(fbpcuquery.all()) + + for pcurec in fbpcuquery: + pcuinfo = pcurec.to_dict() + if verify(dict_query, pcuinfo): + #nodenames.append(noderec.hostname) + #print 'appending %s' % pcuinfo['plc_pcuid'] + pcunames.append(pcuinfo['plc_pcuid']) + + #for noderec in fbquery: + # if nodelist is not None: + # if noderec.hostname not in nodelist: continue +# +# fb_nodeinfo = noderec.to_dict() +# if pcu_in(fb_nodeinfo): +# pcurec = FindbadPCURecord.get_latest_by(plc_pcuid=get(fb_nodeinfo, +# 'plc_node_stats.pcu_ids')[0]).first() +# if pcurec: +# pcuinfo = pcurec.to_dict() +# if verify(dict_query, pcuinfo): +# nodenames.append(noderec.hostname) +# pcunames.append(pcuinfo['plc_pcuid']) return (nodenames, pcunames) -def node_select(str_query, nodelist=None, fbdb=None): - global fb +def node_select(str_query, nodelist=None, fb=None): hostnames = [] if str_query is None: return hostnames @@ -306,45 +309,43 @@ def node_select(str_query, nodelist=None, fbdb=None): dict_query = query_to_dict(str_query) #print dict_query - if fbdb is not None: - fb = fbdb - - for node in fb['nodes'].keys(): - if nodelist is not None: - if node not in nodelist: continue + for node in nodelist: + #if nodelist is not None: + # if node not in nodelist: continue try: - fb_noderec = FindbadNodeRecord.select(FindbadNodeRecord.q.hostname==node, - orderBy='date_checked').reversed()[0] + fb_noderec = None + #fb_noderec = FindbadNodeRecord.query.filter(FindbadNodeRecord.hostname==node).order_by(FindbadNodeRecord.date_checked.desc()).first() + fb_noderec = FindbadNodeRecord.get_latest_by(hostname=node) except: + print traceback.print_exc() continue - - fb_nodeinfo = fb_noderec.toDict() + if fb_noderec: + fb_nodeinfo = fb_noderec.to_dict() - #fb_nodeinfo['pcu'] = color_pcu_state(fb_nodeinfo) - #if 'plcnode' in fb_nodeinfo: - # fb_nodeinfo.update(fb_nodeinfo['plcnode']) + #fb_nodeinfo['pcu'] = color_pcu_state(fb_nodeinfo) + #if 'plcnode' in fb_nodeinfo: + # fb_nodeinfo.update(fb_nodeinfo['plcnode']) - #if verifyDBrecord(dict_query, fb_nodeinfo): - if verify(dict_query, fb_nodeinfo): - #print node #fb_nodeinfo - hostnames.append(node) - else: - #print "NO MATCH", node - pass + #if verifyDBrecord(dict_query, fb_nodeinfo): + if verify(dict_query, fb_nodeinfo): + #print fb_nodeinfo.keys() + #print node #fb_nodeinfo + hostnames.append(node) + else: + #print "NO MATCH", node + pass return hostnames def main(): - global fb - global fbpcu - import parser as parsermodule + from monitor import parser as parsermodule parser = parsermodule.getParser() - parser.set_defaults(node=None, fromtime=None, select=None, list=None, + parser.set_defaults(node=None, fromtime=None, select=None, list=None, listkeys=False, pcuselect=None, nodelist=None, daysdown=None, fields=None) parser.add_option("", "--daysdown", dest="daysdown", action="store_true", help="List the node state and days down...") @@ -358,6 +359,8 @@ def main(): help="List all nodes with the given key=value pattern") parser.add_option("", "--nodelist", dest="nodelist", metavar="nodelist.txt", help="A list of nodes to bring out of debug mode.") + parser.add_option("", "--listkeys", dest="listkeys", action="store_true", + help="A list of nodes to bring out of debug mode.") parser.add_option("", "--fromtime", dest="fromtime", metavar="YYYY-MM-DD", help="Specify a starting date from which to begin the query.") @@ -376,16 +379,17 @@ def main(): os.chdir("..") fb = archive.load(file[:-4]) else: - fbnodes = FindbadNodeRecord.select(FindbadNodeRecord.q.hostname, orderBy='date_checked',distinct=True).reversed() - fb = database.dbLoad("findbad") - - fbpcu = database.dbLoad("findbadpcus") - reboot.fb = fbpcu + #fbnodes = FindbadNodeRecord.select(FindbadNodeRecord.q.hostname, orderBy='date_checked',distinct=True).reversed() + fb = None if config.nodelist: nodelist = util.file.getListFromFile(config.nodelist) else: - nodelist = fb['nodes'].keys() + # NOTE: list of nodes should come from findbad db. Otherwise, we + # don't know for sure that there's a record in the db.. + plcnodes = plccache.l_nodes + nodelist = [ node['hostname'] for node in plcnodes ] + #nodelist = ['planetlab-1.cs.princeton.edu'] pculist = None if config.select is not None and config.pcuselect is not None: @@ -403,16 +407,24 @@ def main(): for node in nodelist: config.node = node - if node not in fb['nodes']: + if node not in nodelist: continue try: # Find the most recent record - fb_noderec = FindbadNodeRecord.select(FindbadNodeRecord.q.hostname==node, - orderBy='date_checked').reversed()[0] + fb_noderec = FindbadNodeRecord.get_latest_by(hostname=node) + if not fb_noderec: continue + fb_nodeinfo = fb_noderec.to_dict() except: print traceback.print_exc() - pass #fb_nodeinfo = fb['nodes'][node]['values'] + continue + + if config.listkeys: + print "Primary keys available in the findbad object:" + for key in fb_nodeinfo.keys(): + print "\t",key + sys.exit(0) + if config.list: print node @@ -420,7 +432,6 @@ def main(): if config.daysdown: daysdown_print_nodeinfo(fb_nodeinfo, node) else: - fb_nodeinfo = fb_noderec.toDict() if config.select: if config.fields: fields = config.fields.split(",")