X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=monitor%2Fwrapper%2Fplc.py;h=5e6fb7fcd4c34bc3836da14e0a7bc629cd1100b5;hb=db84a19276e861081756a7daec54aba8a1507abe;hp=15153966ed2e567d78c35f9f77fac0d59be9bf93;hpb=ce9101bfa7720c131a982220f2905e4439b324fc;p=monitor.git diff --git a/monitor/wrapper/plc.py b/monitor/wrapper/plc.py index 1515396..5e6fb7f 100644 --- a/monitor/wrapper/plc.py +++ b/monitor/wrapper/plc.py @@ -14,6 +14,11 @@ import time import traceback from monitor import database +# note: this needs to be consistent with the value in PLEWWW/planetlab/includes/plc_functions.php +PENDING_CONSORTIUM_ID = 0 +# not used in monitor +#APPROVED_CONSORTIUM_ID = 999999 + try: from monitor import config debug = config.debug @@ -116,12 +121,12 @@ class CachedPLC(PLC): except: print "Call %s FAILED: Using old cached data" % cachename load_old_cache = True - + if load_old_cache: values = database.dbLoad(cachename) else: database.dbDump(cachename, values) - + return values else: values = database.dbLoad(cachename) @@ -142,8 +147,11 @@ def getNodeAPI(session): nodeauth = Auth(session=session) return PLC(nodeauth.auth, auth.server) -def getAuthAPI(): - return PLC(auth.auth, auth.server) +def getAuthAPI(url=None): + if url: + return PLC(auth.auth, url) + else: + return PLC(auth.auth, auth.server) def getCachedAuthAPI(): return CachedPLC(auth.auth, auth.server) @@ -240,7 +248,11 @@ Returns dict of PCU info of a given node. def getpcu(nodename): api = xmlrpclib.Server(auth.server, verbose=False, allow_none=True) anon = {'AuthMethod': "anonymous"} - nodeinfo = api.GetNodes(auth.auth, {"hostname": nodename}, ["pcu_ids", "ports"])[0] + try: + nodeinfo = api.GetNodes(auth.auth, {"hostname": nodename}, ["pcu_ids", "ports"])[0] + except IndexError: + logger.info("Can not find node: %s" % nodename) + return False if nodeinfo['pcu_ids']: print nodeinfo sitepcu = api.GetPCUs(auth.auth, nodeinfo['pcu_ids'])[0] @@ -321,6 +333,22 @@ def getNodes(filter=None, fields=None): #'last_updated', 'peer_node_id', 'ssh_rsa_key' ]) return nodes + +# Check if the site is a pending site that needs to be approved. +def isPendingSite(loginbase): + api = xmlrpclib.Server(auth.server, verbose=False) + try: + site = api.GetSites(auth.auth, loginbase)[0] + except Exception, exc: + logger.info("ERROR: No site %s" % loginbase) + return False + + if not site['enabled'] and site['ext_consortium_id'] == PENDING_CONSORTIUM_ID: + return True + + return False + + ''' Sets boot state of a node. ''' @@ -354,6 +382,12 @@ def nodePOD(nodename): Freeze all site slices. ''' def suspendSiteSlices(loginbase): + if isPendingSite(loginbase): + msg = "INFO: suspendSiteSlices: Pending Site (%s)" % loginbase + print msg + logger.info(msg) + return + api = xmlrpclib.Server(auth.server, verbose=False) for slice in slices(loginbase): logger.info("Suspending slice %s" % slice) @@ -367,16 +401,17 @@ def suspendSiteSlices(loginbase): Freeze all site slices. ''' def suspendSlices(nodename): - api = xmlrpclib.Server(auth.server, verbose=False) - for slice in slices(siteId(nodename)): - logger.info("Suspending slice %s" % slice) - try: - if not debug: - api.AddSliceAttribute(auth.auth, slice, "enabled", "0") - except Exception, exc: - logger.info("suspendSlices: %s" % exc) + loginbase = siteId(nodename) + suspendSiteSlices(loginbase) + def enableSiteSlices(loginbase): + if isPendingSite(loginbase): + msg = "INFO: enableSiteSlices: Pending Site (%s)" % loginbase + print msg + logger.info(msg) + return + api = xmlrpclib.Server(auth.server, verbose=False, allow_none=True) for slice in slices(loginbase): logger.info("Enabling slices %s" % slice) @@ -396,23 +431,9 @@ def enableSiteSlices(loginbase): print "exception: %s" % exc def enableSlices(nodename): - 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 debug: - slice_list = api.GetSlices(auth.auth, {'name': slice}, None) - if len(slice_list) == 0: - return - slice_id = slice_list[0]['slice_id'] - l_attr = api.GetSliceAttributes(auth.auth, {'slice_id': slice_id}, None) - for attr in l_attr: - if "enabled" == attr['name'] and attr['value'] == "0": - logger.info("Deleted enable=0 attribute from slice %s" % slice) - api.DeleteSliceAttribute(auth.auth, attr['slice_attribute_id']) - except Exception, exc: - logger.info("enableSlices: %s" % exc) - print "exception: %s" % exc + loginbase = siteId(nodename) + enableSiteSlices(loginbase) + #I'm commenting this because this really should be a manual process. #''' @@ -425,38 +446,45 @@ def enableSlices(nodename): # api.SliceAttributeAdd(auth.auth, slice, "plc_slice_state", {"state" : "suspended"}) # def enableSiteSliceCreation(loginbase): + if isPendingSite(loginbase): + msg = "INFO: enableSiteSliceCreation: Pending Site (%s)" % loginbase + print msg + logger.info(msg) + return + api = xmlrpclib.Server(auth.server, verbose=False, allow_none=True) try: logger.info("Enabling slice creation for site %s" % loginbase) if not debug: - logger.info("\tcalling UpdateSite(%s, enabled=True)" % loginbase) - api.UpdateSite(auth.auth, loginbase, {'enabled': True}) + site = api.GetSites(auth.auth, loginbase)[0] + if site['enabled'] == False: + logger.info("\tcalling UpdateSite(%s, enabled=True)" % loginbase) + api.UpdateSite(auth.auth, loginbase, {'enabled': True}) except Exception, exc: print "ERROR: enableSiteSliceCreation: %s" % exc logger.info("ERROR: enableSiteSliceCreation: %s" % exc) def enableSliceCreation(nodename): - 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 debug: - logger.info("\tcalling UpdateSite(%s, enabled=True)" % loginbase) - api.UpdateSite(auth.auth, loginbase, {'enabled': True}) - except Exception, exc: - print "ERROR: enableSliceCreation: %s" % exc - logger.info("ERROR: enableSliceCreation: %s" % exc) + loginbase = siteId(nodename) + enableSiteSliceCreation(loginbase) ''' Removes site's ability to create slices. Returns previous max_slices ''' -def removeSiteSliceCreation(sitename): - print "removeSiteSliceCreation(%s)" % sitename +def removeSiteSliceCreation(loginbase): + print "removeSiteSliceCreation(%s)" % loginbase + + if isPendingSite(loginbase): + msg = "INFO: removeSiteSliceCreation: Pending Site (%s)" % loginbase + print msg + logger.info(msg) + return + api = xmlrpclib.Server(auth.server, verbose=False) try: - logger.info("Removing slice creation for site %s" % sitename) + logger.info("Removing slice creation for site %s" % loginbase) if not debug: - api.UpdateSite(auth.auth, sitename, {'enabled': False}) + api.UpdateSite(auth.auth, loginbase, {'enabled': False}) except Exception, exc: logger.info("removeSiteSliceCreation: %s" % exc) @@ -464,18 +492,9 @@ def removeSiteSliceCreation(sitename): Removes ability to create slices. Returns previous max_slices ''' def removeSliceCreation(nodename): - 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 debug: - #api.UpdateSite(auth.auth, loginbase, {'max_slices': 0}) - api.UpdateSite(auth.auth, loginbase, {'enabled': False}) - except Exception, exc: - logger.info("removeSliceCreation: %s" % exc) + loginbase = siteId(nodename) + removeSiteSliceCreation(loginbase) + ''' QED