X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=plc.py;h=5be15c8ea808d9584f036397a47be293a28e463a;hb=refs%2Fheads%2F1.0;hp=ae0ddac0538397951e97612f4553b8fb2d97b505;hpb=488e4b05892813183fb6b6f28d078d2799549f24;p=monitor.git diff --git a/plc.py b/plc.py index ae0ddac..5be15c8 100644 --- a/plc.py +++ b/plc.py @@ -10,22 +10,125 @@ import xml, xmlrpclib import logging -import auth import time -from config import config,XMLRPC_SERVER - +import traceback +try: + import config + debug = config.debug +except: + debug = False logger = logging.getLogger("monitor") + +class Auth: + def __init__(self): + self.auth = {'AuthMethod': "anonymous"} + +# NOTE: this host is used by default when there are no auth files. +XMLRPC_SERVER="https://boot.planet-lab.org/PLCAPI/" + +# NOTE: by default, use anonymous access, but if auth files are +# configured, use them, with their auth definitions. +auth = Auth() +try: + from monitor import config + auth.auth = {'Username' : config.API_AUTH_USER, + 'AuthMethod' : 'password', + 'AuthString' : config.API_AUTH_PASSWORD} + auth.server = config.API_SERVER +except: + try: + import auth + auth.server = auth.plc + except: + auth = Auth() + auth.server = XMLRPC_SERVER + +api = xmlrpclib.Server(auth.server, verbose=False, allow_none=True) + +global_error_count = 0 + +class PLC: + def __init__(self, auth, url): + self.auth = auth + self.url = url + self.api = xmlrpclib.Server(self.url, verbose=False, allow_none=True) + + def __getattr__(self, name): + method = getattr(self.api, name) + if method is None: + raise AssertionError("method does not exist") + + try: + return lambda *params : method(self.auth, *params) + except ProtocolError: + traceback.print_exc() + global_error_count += 1 + if global_error_count >= 10: + print "maximum error count exceeded; exiting..." + sys.exit(1) + else: + print "%s errors have occurred" % global_error_count + raise Exception("ProtocolError continuing") + + def __repr__(self): + return self.api.__repr__() -#XMLRPC_SERVER = config.XMLRPC_SERVER +def getAPI(url): + return xmlrpclib.Server(url, verbose=False, allow_none=True) -config = config() +def getAuthAPI(): + return PLC(auth.auth, auth.server) + + +def getTechEmails(loginbase): + """ + For the given site, return all user email addresses that have the 'tech' role. + """ + api = getAuthAPI() + # get site details. + s = api.GetSites(loginbase)[0] + # get people at site + p = api.GetPersons(s['person_ids']) + # pull out those with the right role. + emails = [ person['email'] for person in filter(lambda x: 'tech' in x['roles'], p) ] + return emails + +def getPIEmails(loginbase): + """ + For the given site, return all user email addresses that have the 'tech' role. + """ + api = getAuthAPI() + # get site details. + s = api.GetSites(loginbase)[0] + # get people at site + p = api.GetPersons(s['person_ids']) + # pull out those with the right role. + emails = [ person['email'] for person in filter(lambda x: 'pi' in x['roles'], p) ] + return emails + +def getSliceUserEmails(loginbase): + """ + For the given site, return all user email addresses that have the 'tech' role. + """ + api = getAuthAPI() + # get site details. + s = api.GetSites(loginbase)[0] + # get people at site + slices = api.GetSlices(s['slice_ids']) + people = [] + for slice in slices: + people += api.GetPersons(slice['person_ids']) + # pull out those with the right role. + emails = [ person['email'] for person in filter(lambda x: 'pi' in x['roles'], people) ] + unique_emails = [ x for x in set(emails) ] + return unique_emails ''' Returns list of nodes in dbg as reported by PLC ''' def nodesDbg(): dbgNodes = [] - api = xmlrpclib.Server(XMLRPC_SERVER, verbose=False) + api = xmlrpclib.Server(auth.server, verbose=False) anon = {'AuthMethod': "anonymous"} for node in api.GetNodes(anon, {"boot_state":"dbg"},["hostname"]): dbgNodes.append(node['hostname']) @@ -37,19 +140,20 @@ def nodesDbg(): Returns loginbase for given nodename ''' def siteId(nodename): - api = xmlrpclib.Server(XMLRPC_SERVER, verbose=False) - anon = {'AuthMethod': "anonymous"} - site_id = api.GetNodes (anon, {"hostname": nodename}, ['site_id']) + api = xmlrpclib.Server(auth.server, verbose=False, allow_none=True) + site_id = api.GetNodes (auth.auth, {"hostname": nodename}, ['site_id']) if len(site_id) == 1: - loginbase = api.GetSites (anon, site_id[0], ["login_base"]) + loginbase = api.GetSites (auth.auth, site_id[0], ["login_base"]) return loginbase[0]['login_base'] + else: + print "Not nodes returned!!!!" ''' Returns list of slices for a site. ''' def slices(loginbase): siteslices = [] - api = xmlrpclib.Server(XMLRPC_SERVER, verbose=False) + api = xmlrpclib.Server(auth.server, verbose=False, allow_none=True) sliceids = api.GetSites (auth.auth, {"login_base" : loginbase}, ["slice_ids"])[0]['slice_ids'] for slice in api.GetSlices(auth.auth, {"slice_id" : sliceids}, ["name"]): siteslices.append(slice['name']) @@ -59,7 +163,7 @@ def slices(loginbase): Returns dict of PCU info of a given node. ''' def getpcu(nodename): - api = xmlrpclib.Server(XMLRPC_SERVER, verbose=False) + api = xmlrpclib.Server(auth.server, verbose=False, allow_none=True) anon = {'AuthMethod': "anonymous"} nodeinfo = api.GetNodes(auth.auth, {"hostname": nodename}, ["pcu_ids", "ports"])[0] if nodeinfo['pcu_ids']: @@ -71,7 +175,7 @@ def getpcu(nodename): return False def GetPCUs(filter=None, fields=None): - api = xmlrpclib.Server(XMLRPC_SERVER, verbose=False, allow_none=True) + api = xmlrpclib.Server(auth.server, verbose=False, allow_none=True) pcu_list = api.GetPCUs(auth.auth, filter, fields) return pcu_list @@ -79,7 +183,7 @@ def GetPCUs(filter=None, fields=None): Returns all site nodes for site id (loginbase). ''' def getSiteNodes(loginbase, fields=None): - api = xmlrpclib.Server(XMLRPC_SERVER, verbose=False) + api = xmlrpclib.Server(auth.server, verbose=False) nodelist = [] anon = {'AuthMethod': "anonymous"} try: @@ -88,10 +192,12 @@ def getSiteNodes(loginbase, fields=None): nodelist.append(node['hostname']) except Exception, exc: logger.info("getSiteNodes: %s" % exc) + print "getSiteNodes: %s" % exc return nodelist + def getPersons(filter=None, fields=None): - api = xmlrpclib.Server(XMLRPC_SERVER, verbose=False, allow_none=True) + api = xmlrpclib.Server(auth.server, verbose=False, allow_none=True) persons = [] try: persons = api.GetPersons(auth.auth, filter, fields) @@ -101,18 +207,20 @@ def getPersons(filter=None, fields=None): return persons def getSites(filter=None, fields=None): - api = xmlrpclib.Server(XMLRPC_SERVER, verbose=False, allow_none=True) + api = xmlrpclib.Server(auth.server, verbose=False, allow_none=True) sites = [] anon = {'AuthMethod': "anonymous"} try: - sites = api.GetSites(anon, filter, fields) + #sites = api.GetSites(anon, filter, fields) + sites = api.GetSites(auth.auth, filter, fields) except Exception, exc: + traceback.print_exc() print "getSites: %s" % exc logger.info("getSites: %s" % exc) return sites def getSiteNodes2(loginbase): - api = xmlrpclib.Server(XMLRPC_SERVER, verbose=False) + api = xmlrpclib.Server(auth.server, verbose=False) nodelist = [] anon = {'AuthMethod': "anonymous"} try: @@ -123,14 +231,15 @@ def getSiteNodes2(loginbase): return nodelist def getNodeNetworks(filter=None): - api = xmlrpclib.Server(XMLRPC_SERVER, verbose=False, allow_none=True) - nodenetworks = api.GetNodeNetworks(auth.auth, filter, None) + api = xmlrpclib.Server(auth.server, verbose=False, allow_none=True) + nodenetworks = api.GetInterfaces(auth.auth, filter, None) return nodenetworks def getNodes(filter=None, fields=None): - api = xmlrpclib.Server(XMLRPC_SERVER, verbose=False, allow_none=True) - nodes = api.GetNodes(auth.auth, filter, fields) #['boot_state', 'hostname', - #'site_id', 'date_created', 'node_id', 'version', 'nodenetwork_ids', + api = xmlrpclib.Server(auth.server, verbose=False, allow_none=True) + nodes = api.GetNodes(auth.auth, filter, fields) + #['boot_state', 'hostname', + #'site_id', 'date_created', 'node_id', 'version', 'interface_ids', #'last_updated', 'peer_node_id', 'ssh_rsa_key' ]) return nodes @@ -138,20 +247,27 @@ def getNodes(filter=None, fields=None): Sets boot state of a node. ''' def nodeBootState(nodename, state): - api = xmlrpclib.Server(XMLRPC_SERVER, verbose=False) + api = xmlrpclib.Server(auth.server, verbose=False) try: return api.UpdateNode(auth.auth, nodename, {'boot_state': state}) except Exception, exc: logger.info("nodeBootState: %s" % exc) +def updateNodeKey(nodename, key): + api = xmlrpclib.Server(auth.server, verbose=False) + try: + return api.UpdateNode(auth.auth, nodename, {'key': key}) + except Exception, exc: + logger.info("updateNodeKey: %s" % exc) + ''' Sends Ping Of Death to node. ''' def nodePOD(nodename): - api = xmlrpclib.Server(XMLRPC_SERVER, verbose=False) + api = xmlrpclib.Server(auth.server, verbose=False) logger.info("Sending POD to %s" % nodename) try: - if not config.debug: + if not debug: return api.RebootNode(auth.auth, nodename) except Exception, exc: logger.info("nodePOD: %s" % exc) @@ -160,21 +276,21 @@ def nodePOD(nodename): Freeze all site slices. ''' def suspendSlices(nodename): - api = xmlrpclib.Server(XMLRPC_SERVER, verbose=False) + api = xmlrpclib.Server(auth.server, verbose=False) for slice in slices(siteId(nodename)): logger.info("Suspending slice %s" % slice) try: - if not config.debug: + if not debug: api.AddSliceAttribute(auth.auth, slice, "enabled", "0") except Exception, exc: logger.info("suspendSlices: %s" % exc) def enableSlices(nodename): - api = xmlrpclib.Server(XMLRPC_SERVER, verbose=False, allow_none=True) + api = xmlrpclib.Server(auth.server, verbose=False, allow_none=True) for slice in slices(siteId(nodename)): logger.info("Enabling slices %s" % slice) try: - if not config.debug: + if not debug: slice_list = api.GetSlices(auth.auth, {'name': slice}, None) if len(slice_list) == 0: return @@ -193,17 +309,17 @@ def enableSlices(nodename): #Enable suspended site slices. #''' #def enableSlices(nodename, slicelist): -# api = xmlrpclib.Server(XMLRPC_SERVER, verbose=False) +# api = xmlrpclib.Server(auth.server, verbose=False) # for slice in slices(siteId(nodename)): # logger.info("Suspending slice %s" % slice) # api.SliceAttributeAdd(auth.auth, slice, "plc_slice_state", {"state" : "suspended"}) # def enableSliceCreation(nodename): - api = xmlrpclib.Server(XMLRPC_SERVER, verbose=False, allow_none=True) + api = xmlrpclib.Server(auth.server, verbose=False, allow_none=True) try: loginbase = siteId(nodename) logger.info("Enabling slice creation for site %s" % loginbase) - if not config.debug: + if not debug: logger.info("\tcalling UpdateSite(%s, enabled=True)" % loginbase) api.UpdateSite(auth.auth, loginbase, {'enabled': True}) except Exception, exc: @@ -214,13 +330,14 @@ def enableSliceCreation(nodename): Removes ability to create slices. Returns previous max_slices ''' def removeSliceCreation(nodename): - api = xmlrpclib.Server(XMLRPC_SERVER, verbose=False) + print "removeSliceCreation(%s)" % nodename + api = xmlrpclib.Server(auth.server, verbose=False) try: loginbase = siteId(nodename) #numslices = api.GetSites(auth.auth, {"login_base": loginbase}, # ["max_slices"])[0]['max_slices'] logger.info("Removing slice creation for site %s" % loginbase) - if not config.debug: + if not debug: #api.UpdateSite(auth.auth, loginbase, {'max_slices': 0}) api.UpdateSite(auth.auth, loginbase, {'enabled': False}) except Exception, exc: @@ -230,13 +347,13 @@ def removeSliceCreation(nodename): QED ''' #def enableSliceCreation(nodename, maxslices): -# api = xmlrpclib.Server(XMLRPC_SERVER, verbose=False) +# api = xmlrpclib.Server(auth.server, verbose=False) # anon = {'AuthMethod': "anonymous"} # siteid = api.AnonAdmQuerySite (anon, {"node_hostname": nodename}) # if len(siteid) == 1: # logger.info("Enabling slice creation for site %s" % siteId(nodename)) # try: -# if not config.debug: +# if not debug: # api.AdmUpdateSite(auth.auth, siteid[0], {"max_slices" : maxslices}) # except Exception, exc: # logger.info("API: %s" % exc) @@ -264,5 +381,4 @@ def main(): #print slices("princeton") if __name__=="__main__": - import reboot main()