From: rmccabe@sourceware.org <rmccabe@sourceware.org>
To: cluster-devel.redhat.com
Subject: [Cluster-devel] conga/luci/site/luci/Extensions LuciSyslog.py ...
Date: 24 Oct 2006 16:36:24 -0000 [thread overview]
Message-ID: <20061024163624.28087.qmail@sourceware.org> (raw)
CVSROOT: /cvs/cluster
Module name: conga
Branch: RHEL5
Changes by: rmccabe at sourceware.org 2006-10-24 16:36:23
Modified files:
luci/site/luci/Extensions: LuciSyslog.py cluster_adapters.py
conga_constants.py
homebase_adapters.py ricci_bridge.py
ricci_communicator.py
Log message:
see bz# 211375
These patches add verbose logging that'll allow QE to better
debug defects (in a lot of places, there was no useful output
for them to check).
Two new global variables are introduced:
LUCI_DEBUG_MODE = 1
LUCI_DEBUG_VERBOSITY = 2
Both of these need to be set to 0 for GA. LUCI_DEBUG_VERBOSITY > 1 will
cause ricci_xml input and output to be logged using using syslog
LOG_DAEMON/LOG_DEBUG. syslogd is not configured to log this severity by default,
so an entry along the lines of *.debug /var/log/debug should be added if this
facility is used.
Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/LuciSyslog.py.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.2&r2=1.2.2.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/cluster_adapters.py.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.120.2.4&r2=1.120.2.5
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/conga_constants.py.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.19&r2=1.19.2.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/homebase_adapters.py.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.34&r2=1.34.2.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/ricci_bridge.py.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.30.2.1&r2=1.30.2.2
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/ricci_communicator.py.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.9&r2=1.9.2.1
--- conga/luci/site/luci/Extensions/LuciSyslog.py 2006/10/16 04:59:52 1.2
+++ conga/luci/site/luci/Extensions/LuciSyslog.py 2006/10/24 16:36:23 1.2.2.1
@@ -1,3 +1,4 @@
+from conga_constants import LUCI_DEBUG_MODE, LUCI_DEBUG_VERBOSITY
from syslog import openlog, closelog, syslog, \
LOG_DAEMON, LOG_PID, LOG_NDELAY, LOG_INFO, \
LOG_WARNING, LOG_AUTH, LOG_DEBUG
@@ -12,34 +13,55 @@
"""
class LuciSyslog:
def __init__(self):
+ self.__init = 0
try:
- openlog('luci', LOG_DAEMON, LOG_PID | LOG_NDELAY)
+ openlog('luci', LOG_PID | LOG_NDELAY, LOG_DAEMON)
+ self.__init = 1
except:
raise LuciSyslogError, 'unable to setup syslog functionality.'
def info(self, msg):
+ if not self.__init:
+ return
try:
syslog(LOG_INFO, msg)
except:
raise LuciSyslogError, 'syslog info call failed'
def warn(self, msg):
+ if not self.__init:
+ return
try:
syslog(LOG_WARNING, msg)
except:
raise LuciSyslogError, 'syslog warn call failed'
def private(self, msg):
+ if not self.__init:
+ return
try:
syslog(LOG_AUTH, msg)
except:
raise LuciSyslogError, 'syslog private call failed'
+ def debug_verbose(self, msg):
+ if not LUCI_DEBUG_MODE or LUCI_DEBUG_VERBOSITY < 2 or not self.__init:
+ return
+ try:
+ syslog(LOG_DEBUG, msg)
+ except:
+ raise LuciSyslogError, 'syslog debug calle failed'
+
def debug(self, msg):
+ if not LUCI_DEBUG_MODE or not self.__init:
+ return
try:
syslog(LOG_DEBUG, msg)
except:
raise LuciSyslogError, 'syslog debug calle failed'
def close(self):
- closelog()
+ try:
+ closelog()
+ except:
+ pass
--- conga/luci/site/luci/Extensions/cluster_adapters.py 2006/10/24 01:42:52 1.120.2.4
+++ conga/luci/site/luci/Extensions/cluster_adapters.py 2006/10/24 16:36:23 1.120.2.5
@@ -22,7 +22,8 @@
from clusterOS import resolveOSType
from GeneralError import GeneralError
from UnknownClusterError import UnknownClusterError
-from homebase_adapters import nodeUnauth, nodeAuth, manageCluster, createClusterSystems, havePermCreateCluster, setNodeFlag, delNodeFlag, userAuthenticated
+from homebase_adapters import nodeUnauth, nodeAuth, manageCluster, createClusterSystems, havePermCreateCluster, setNodeFlag, delNodeFlag, userAuthenticated, getStorageNode, getClusterNode
+from LuciSyslog import LuciSyslogError, LuciSyslog
#Policy for showing the cluster chooser menu:
#1) If there are no clusters in the ManagedClusterSystems
@@ -34,6 +35,11 @@
CLUSTER_FOLDER_PATH = '/luci/systems/cluster/'
+try:
+ luci_log = LuciSyslog()
+except LuciSyslogError, e:
+ pass
+
def validateClusterNodes(request, sessionData, clusterName, numStorage):
nodeList = list()
nodeHash = {}
@@ -205,11 +211,24 @@
batch_id_map = {}
rc = None
for i in nodeList:
+ success = True
try:
rc = RicciCommunicator(i['ricci_host'])
- resultNode = rc.process_batch(batchNode, async=True)
- batch_id_map[i['ricci_host']] = resultNode.getAttribute('batch_id')
+ except RicciError, e:
+ luci_log.debug('Unable to connect to the ricci agent on %s: %s'\
+ % (i['ricci_host'], str(e)))
+ success = False
except:
+ success = False
+
+ if success == True:
+ try:
+ resultNode = rc.process_batch(batchNode, async=True)
+ batch_id_map[i['ricci_host']] = resultNode.getAttribute('batch_id')
+ except:
+ success = False
+
+ if not success:
nodeUnauth(nodeList)
cluster_properties['isComplete'] = False
errors.append('An error occurred while attempting to add cluster node \"' + i['ricci_host'] + '\"')
@@ -294,6 +313,7 @@
clusterObj = self.restrictedTraverse(PLONE_ROOT + '/systems/cluster/' + clusterName)
cluster_os = clusterObj.manage_getProperty('cluster_os')
if not cluster_os:
+ luci_log.debug('The cluster OS property is missing for cluster ' + clusterName)
raise Exception, 'no cluster OS was found.'
try:
if len(filter(lambda x: x['os'] != cluster_os, nodeList)) > 0:
@@ -342,17 +362,28 @@
batch_id_map = {}
for i in nodeList:
clunode = nodeList[i]
+ success = True
try:
rc = RicciCommunicator(clunode['ricci_host'])
- resultNode = rc.process_batch(batchNode, async=True)
- batch_id_map[clunode['ricci_host']] = resultNode.getAttribute('batch_id')
- messages.append('Cluster join initiated for host \"' + clunode['ricci_host'] + '\"')
except:
+ luci_log.info('Unable to connect to the ricci daemon on host ' + clunode['ricci_host'])
+ success = False
+
+ if success:
+ try:
+ resultNode = rc.process_batch(batchNode, async=True)
+ batch_id_map[clunode['ricci_host']] = resultNode.getAttribute('batch_id')
+ except:
+ success = False
+
+ if not success:
nodeUnauth(nodeList)
cluster_properties['isComplete'] = False
errors.append('An error occurred while attempting to add cluster node \"' + clunode['ricci_host'] + '\"')
return (False, {'errors': errors, 'requestResults': cluster_properties})
+ messages.append('Cluster join initiated for host \"' + clunode['ricci_host'] + '\"')
+
buildClusterCreateFlags(self, batch_id_map, clusterName)
return (True, {'errors': errors, 'messages': messages})
@@ -412,6 +443,7 @@
try:
resObj = resourceAddHandler[res_type](self, dummy_form)
except:
+ luci_log('res type %d is invalid' % res_type)
resObj = None
if resObj is None:
@@ -1304,9 +1336,12 @@
try:
clusterfolder = self.restrictedTraverse(path)
if not clusterfolder:
+ luci_log.debug('cluster folder %s for %s is missing.' \
+ % (path, clustername))
raise
nodes = clusterfolder.objectItems('Folder')
if len(nodes) < 1:
+ luci_log.debug('no cluster nodes for %s found.' % clustername)
return None
except:
return None
@@ -1324,15 +1359,15 @@
try:
rc = RicciCommunicator(hostname)
- if not rc:
- raise
- except:
- #raise Exception, ('unable to communicate with the ricci agent on %s', hostname)
+ except RicciError, e:
+ luci_log.debug('ricci error: %s' % str(e))
continue
try:
clu_info = rc.cluster_info()
if cluname != lower(clu_info[0]) and cluname != lower(clu_info[1]):
+ luci_log.debug('%s reports it\'s in cluster %s:%s; we expect %s' \
+ % (hostname, clu_info[0], clu_info[1], cluname))
# node reports it's in a different cluster
raise
except:
@@ -1340,7 +1375,9 @@
if rc.authed():
return rc
- setNodeFlag(self, node[1], CLUSTER_NODE_NEED_AUTH)
+ setNodeFlag(node[1], CLUSTER_NODE_NEED_AUTH)
+
+ luci_log.debug('no ricci agent could be found for cluster %s' % cluname)
return None
def getRicciAgentForCluster(self, req):
@@ -1352,11 +1389,13 @@
if not clustername:
raise
except:
+ luci_log.debug('no cluster name was specified in getRicciAgentForCluster')
return None
return getRicciAgent(self, clustername)
def getClusterStatus(self, rc):
clustatus_batch ='<?xml version="1.0" ?><batch><module name="cluster"><request API_version="1.0"><function_call name="status"/></request></module></batch>'
+
try:
clustatuscmd_xml = minidom.parseString(clustatus_batch).firstChild
except:
@@ -1364,6 +1403,8 @@
try:
ricci_xml = rc.process_batch(clustatuscmd_xml, async=False)
+ except RicciError, e:
+ luci_log.debug('ricci error: %s', str(e))
except:
return {}
@@ -1968,6 +2009,7 @@
try:
clustername = request.form['clusterName']
except:
+ luci_log.debug('missing cluster name for NTP')
return None
try:
@@ -1976,20 +2018,21 @@
try:
nodename = request.form['nodename']
except:
+ luci_log.debug('missing nodename name for NTP')
return None
try:
task = request['task']
- if not task:
- raise
except KeyError, e:
try:
task = request.form['task']
except:
+ luci_log.debug('missing task for NTP')
return None
nodename_resolved = resolve_nodename(self, clustername, nodename)
if not nodename_resolved or not nodename or not task or not clustername:
+ luci_log.debug('resolve_nodename failed for NTP')
return None
if task != NODE_FENCE:
@@ -1998,33 +2041,81 @@
# to be performed.
try:
rc = RicciCommunicator(nodename_resolved)
- # XXX - check the cluster
- if not rc.authed():
- # set the flag
- rc = None
-
- if not rc:
- raise
+ except RicciError, e:
+ luci_log.debug('ricci error from %s: %s' \
+ % (nodename_resolved, str(e)))
+ return None
except:
return None
+ cluinfo = rc.cluster_info()
+ if not cluinfo[0] and not cluinfo[1]:
+ luci_log.debug('host %s not in a cluster (expected %s)' \
+ % (nodename_resolved, clustername))
+ return None
+
+ cname = lower(clustername)
+ if cname != lower(cluinfo[0]) and cname != lower(cluinfo[1]):
+ luci_log.debug('host %s in unknown cluster %s:%s (expected %s)' \
+ % (nodename_resolved, cluinfo[0], cluinfo[1], clustername))
+ return None
+
+ if not rc.authed():
+ rc = None
+ try:
+ snode = getStorageNode(self, nodename)
+ setNodeFlag(snode, CLUSTER_NODE_NEED_AUTH)
+ except:
+ # we'll hit it again, and try again then
+ pass
+
+ try:
+ cnode = getClusterNode(self, nodename, clustername)
+ setNodeFlag(cnode, CLUSTER_NODE_NEED_AUTH)
+ except:
+ # we'll hit it again, and try again then
+ pass
+
+ if rc is None:
+ return None
+
if task == NODE_LEAVE_CLUSTER:
- batch_number, result = nodeLeaveCluster(rc)
+ path = str(CLUSTER_FOLDER_PATH + clustername + "/" + nodename_resolved)
- path = CLUSTER_FOLDER_PATH + clustername + "/" + nodename_resolved
- nodefolder = self.restrictedTraverse(path)
+ try:
+ nodefolder = self.restrictedTraverse(path)
+ if not nodefolder:
+ raise Exception, 'cannot find directory at %s' % path
+ except Exception, e:
+ luci_log.debug('node_leave_cluster err: %s' % str(e))
+ return None
+
+ objname = str(nodename_resolved + "____flag")
+
+ fnpresent = noNodeFlagsPresent(self, nodefolder, objname, nodename_resolved)
+ if fnpresent is None:
+ luci_log.debug('An error occurred while checking flags for %s' \
+ % nodename_resolved)
+ return None
+
+ if fnpresent == False:
+ luci_log.debug('flags are still present for %s -- bailing out' \
+ % nodename_resolved)
+ return None
+
+ batch_number, result = nodeLeaveCluster(rc)
batch_id = str(batch_number)
- objname = nodename_resolved + "____flag"
- if noNodeFlagsPresent(self, nodefolder, objname, nodename_resolved) == False:
- raise UnknownClusterError("Fatal", "An unfinished task flag exists for node %s" % nodename)
- nodefolder.manage_addProduct['ManagedSystem'].addManagedSystem(objname)
- #Now we need to annotate the new DB object
- objpath = path + "/" + objname
- flag = self.restrictedTraverse(objpath)
- flag.manage_addProperty(BATCH_ID,batch_id, "string")
- flag.manage_addProperty(TASKTYPE,NODE_LEAVE_CLUSTER, "string")
- flag.manage_addProperty(FLAG_DESC,"Node \'" + nodename + "\' leaving cluster", "string")
+ objpath = str(path + "/" + objname)
+ try:
+ nodefolder.manage_addProduct['ManagedSystem'].addManagedSystem(objname)
+ #Now we need to annotate the new DB object
+ flag = self.restrictedTraverse(objpath)
+ flag.manage_addProperty(BATCH_ID, batch_id, "string")
+ flag.manage_addProperty(TASKTYPE,NODE_LEAVE_CLUSTER, "string")
+ flag.manage_addProperty(FLAG_DESC,"Node \'" + nodename + "\' leaving cluster", "string")
+ except:
+ luci_log.debug('An error occurred while setting flag %s' % objpath)
response = request.RESPONSE
#Is this correct? Should we re-direct to the cluster page?
@@ -2056,40 +2147,64 @@
#Now we need to annotate the new DB object
objpath = path + "/" + objname
flag = self.restrictedTraverse(objpath)
- flag.manage_addProperty(BATCH_ID,batch_id, "string")
- flag.manage_addProperty(TASKTYPE,NODE_REBOOT, "string")
- flag.manage_addProperty(FLAG_DESC,"Node \'" + nodename + "\' is being rebooted", "string")
+ flag.manage_addProperty(BATCH_ID, batch_id, "string")
+ flag.manage_addProperty(TASKTYPE, NODE_REBOOT, "string")
+ flag.manage_addProperty(FLAG_DESC, "Node \'" + nodename + "\' is being rebooted", "string")
response = request.RESPONSE
#Once again, is this correct? Should we re-direct to the cluster page?
response.redirect(request['URL'] + "?pagetype=" + CLUSTER_CONFIG + "&clustername=" + clustername)
elif task == NODE_FENCE:
#here, we DON'T want to open connection to node to be fenced.
- path = CLUSTER_FOLDER_PATH + clustername
+ path = str(CLUSTER_FOLDER_PATH + clustername)
try:
clusterfolder = self.restrictedTraverse(path)
if not clusterfolder:
raise
except:
+ luci_log.debug('The cluster folder for %s could not be found.' \
+ % clustername)
+ return None
+
+ try:
+ nodes = clusterfolder.objectItems('Folder')
+ except:
+ luci_log.debug('No cluster nodes for %s were found' % clustername)
return None
- nodes = clusterfolder.objectItems('Folder')
found_one = False
for node in nodes:
- if node[1].getID().find(nodename) != (-1):
+ if node[1].getId().find(nodename) != (-1):
continue
try:
rc = RicciCommunicator(node[1].getId())
- if not rc.authed():
- # set the node flag
- rc = None
if not rc:
- raise
- found_one = True
- break
+ continue
+ except RicciError, e:
+ luci_log.debug('ricci error for host %s: %s' \
+ % (node[0], str(e)))
+ continue
except:
continue
+
+ if not rc.authed():
+ rc = None
+ try:
+ snode = getStorageNode(self, node[1].getId())
+ setNodeFlag(snode, CLUSTER_NODE_NEED_AUTH)
+ except:
+ pass
+
+ try:
+ setNodeFlag(node[1], CLUSTER_NODE_NEED_AUTH)
+ except:
+ pass
+
+ continue
+ found_one = True
+ break
+
if not found_one:
return None
@@ -2149,7 +2264,7 @@
#First, delete cluster.conf from node to be deleted.
#next, have node leave cluster.
- batch_number, result = nodeLeaveCluster(rc)
+ batch_number, result = nodeLeaveCluster(rc, purge=True)
#It is not worth flagging this node in DB, as we are going
#to delete it anyway. Now, we need to delete node from model
@@ -2501,13 +2616,21 @@
except:
return "Unable to resolve node name %s to retrieve logging information" % nodename_resolved
+ if not rc.authed():
+ try:
+ snode = getStorageNode(self, nodename)
+ setNodeFlag(snode, CLUSTER_NODE_NEED_AUTH)
+ except:
+ pass
+ return "Luci is not authenticated to node %s. Please reauthenticate first." % nodename
+
return getNodeLogs(rc)
def processXenVM(self, req):
model = req.SESSION.get('model')
isNew = False
try:
- xenvmname = req ['servicename']
+ xenvmname = req['servicename']
except KeyError, e:
isNew = True
@@ -2530,14 +2653,27 @@
def getXenVMInfo(self, model, request):
- try:
- xenvmname = request['servicename']
- except KeyError, e:
- return {}
-
- xenvm = model.retrieveXenVMsByName(xenvmname)
- map = xenvm.getAttributes()
- return map
+ try:
+ xenvmname = request['servicename']
+ except KeyError, e:
+ try:
+ xenvmname = request.form['servicename']
+ except:
+ luci_log.debug_verbose('servicename is missing from request')
+ return {}
+ except:
+ luci_log.debug_verbose('servicename is missing from request')
+ return {}
+
+ try:
+ xenvm = model.retrieveXenVMsByName(xenvmname)
+ except:
+ luci_log.debug('An error occurred while attempting to get VM %s' \
+ % xenvmname)
+ return {}
+
+ map = xenvm.getAttributes()
+ return map
def isClusterBusy(self, req):
items = None
@@ -2556,21 +2692,29 @@
try:
cluname = req.form['clusterName']
except:
+ luci_log.debug_verbose('No cluster name -- returning empty map')
return map
path = CLUSTER_FOLDER_PATH + cluname
try:
clusterfolder = self.restrictedTraverse(str(path))
if not clusterfolder:
- raise
- except:
+ raise Exception, 'clusterfolder is None'
+ except Exception, e:
+ luci_log.debug_verbose('cluster %s [%s] folder missing: %s -- returning empty map' % (cluname, path, str(e)))
return map
+ except:
+ luci_log.debug_verbose('cluster %s [%s] folder missing: returning empty map' % (cluname, path))
try:
items = clusterfolder.objectItems('ManagedSystem')
- if len(items) == 0:
+ if not items or len(items) < 1:
return map #This returns an empty map, and should indicate not busy
+ except Exception, e:
+ luci_log.debug('An error occurred while looking for cluster %s flags at path %s: %s' % (cluname, path, str(e)))
+ return map
except:
+ luci_log.debug('An error occurred while looking for cluster %s flags@path %s' % (cluname, path))
return map
map['busy'] = "true"
@@ -2601,14 +2745,30 @@
node_report['desc'] = item[1].getProperty(FLAG_DESC)
batch_xml = None
ricci = item[0].split("____") #This removes the 'flag' suffix
+
try:
rc = RicciCommunicator(ricci[0])
- batch_xml = rc.batch_report(item[1].getProperty(BATCH_ID))
- if batch_xml != None:
- (creation_status, total) = batch_status(batch_xml)
+ except RicciError, e:
+ rc = None
+ luci_log.debug_verbose('ricci returned error in iCB for %s: %s' \
+ % (cluname, str(e)))
except:
- creation_status = RICCI_CONNECT_FAILURE #No contact with ricci (-1000)
- batch_xml = "bloody_failure" #set to avoid next if statement
+ rc = None
+ luci_log.info('ricci connection failed for cluster %s' % cluname)
+
+ if rc is not None:
+ try:
+ batch_xml = rc.batch_report(item[1].getProperty(BATCH_ID))
+ if batch_xml != None:
+ (creation_status, total) = batch_status(batch_xml)
+ else:
+ luci_log.debug_verbose('batch report for cluster %s, item %s is None' % (cluname, item[0]))
+ except:
+ creation_status = RICCI_CONNECT_FAILURE #No contact with ricci (-1000)
+ batch_xml = "bloody_failure" #set to avoid next if statement
+ else:
+ creation_status = RICCI_CONNECT_FAILURE #No contact with ricci (-1000)
+ batch_xml = "bloody_failure" #set to avoid next if statement
if batch_xml == None: #The job is done and gone from queue
if redirect_message == False: #We have not displayed this message yet
@@ -2617,6 +2777,8 @@
node_report['errormessage'] = ""
nodereports.append(node_report)
redirect_message = True
+
+ luci_log.debug_verbose('batch job is done -- deleting %s' % item[0])
clusterfolder.manage_delObjects(item[0])
continue
@@ -2667,7 +2829,10 @@
node_report['statusmessage'] = "Node created successfully" + REDIRECT_MSG
node_report['statusindex'] = creation_status
nodereports.append(node_report)
- clusterfolder.manage_delObjects(item[0])
+ try:
+ clusterfolder.manage_delObjects(item[0])
+ except Exception, e:
+ luci_log.info('Unable to delete %s: %s' % (item[0], str(e)))
continue
else:
map['busy'] = "true"
@@ -2690,13 +2855,17 @@
if finished == True:
node_report['desc'] = item[1].getProperty(FLAG_DESC) + REDIRECT_MSG
nodereports.append(node_report)
- clusterfolder.manage_delObjects(item[0])
+ try:
+ clusterfolder.manage_delObjects(item[0])
+ except Exception, e:
+ luci_log.info('Unable to delete %s: %s' % (item[0], str(e)))
else:
node_report = {}
map['busy'] = "true"
isBusy = True
node_report['desc'] = item[1].getProperty(FLAG_DESC)
nodereports.append(node_report)
+
if isBusy:
part1 = req['ACTUAL_URL']
part2 = req['QUERY_STRING']
@@ -2716,12 +2885,14 @@
def getClusterOS(self, rc):
map = {}
+
try:
os_str = resolveOSType(rc.os())
map['os'] = os_str
map['isVirtualized'] = rc.dom0()
except:
# default to rhel5 if something crazy happened.
+ luci_log.debug('An error occurred while attempting to get OS/Virt info for %s -- defaulting to rhel5/False' % rc.hostname())
map['os'] = 'rhel5'
map['isVirtualized'] = False
return map
@@ -2736,8 +2907,10 @@
try:
cluname = request.form['clustername']
except:
+ luci_log.debug_verbose('getResourcesInfo missing cluster name')
return resList
except:
+ luci_log.debug_verbose('getResourcesInfo missing cluster name')
return resList
for item in modelb.getResources():
@@ -2757,8 +2930,10 @@
try:
name = request.form['resourcename']
except:
+ luci_log.debug_verbose('getResourceInfo missing res name')
return {}
except:
+ luci_log.debug_verbose('getResourceInfo missing res name')
return {}
try:
@@ -2767,19 +2942,22 @@
try:
cluname = request.form['clustername']
except:
+ luci_log.debug_verbose('getResourceInfo missing cluster name')
return {}
except:
+ luci_log.debug_verbose('getResourceInfo missing cluster name')
return {}
try:
baseurl = request['URL']
except:
+ luci_log.debug_verbose('getResourceInfo missing URL')
return {}
for res in modelb.getResources():
if res.getName() == name:
- resMap = {}
try:
+ resMap = {}
resMap['name'] = res.getName()
resMap['type'] = res.resource_type
resMap['tag_name'] = res.TAG_NAME
@@ -2787,7 +2965,7 @@
resMap['cfgurl'] = baseurl + "?" + "clustername=" + cluname + "&resourcename=" + res.getName() + "&pagetype=" + RESOURCE_CONFIG
return resMap
except:
- return {}
+ continue
def delResource(self, rc, request):
errstr = 'An error occurred in while attempting to set the cluster.conf'
@@ -2795,11 +2973,19 @@
try:
modelb = request.SESSION.get('model')
except:
+ luci_log.debug_verbose('delResource unable to extract model from SESSION')
return errstr
try:
name = request['resourcename']
except KeyError, e:
+ try:
+ name = request.form['resourcename']
+ except:
+ luci_log.debug_verbose('delResource missing resname %s' % str(e))
+ return errstr + ': ' + str(e)
+ except:
+ luci_log.debug_verbose('delResource missing resname')
return errstr + ': ' + str(e)
try:
@@ -2808,6 +2994,7 @@
try:
clustername = request.form['clustername']
except:
+ luci_log.debug_verbose('delResource missing cluster name')
return errstr + ': could not determine the cluster name.'
try:
@@ -2828,6 +3015,7 @@
break
if not found:
+ luci_log.debug_verbose('delresource cant find res %s' % name)
return errstr + ': the specified resource was not found.'
try:
@@ -2835,10 +3023,12 @@
if not conf:
raise
except:
+ luci_log.debug_verbose('exportModelAsString failed')
return errstr
batch_number, result = setClusterConf(str(conf))
if batch_number is None or result is None:
+ luci_log.debug_verbose('missing batch and/or result from setClusterConf')
return errstr
modelstr = ""
@@ -2846,13 +3036,20 @@
clusterfolder = self.restrictedTraverse(path)
batch_id = str(batch_number)
objname = str(ragent) + '____flag'
- clusterfolder.manage_addProduct['ManagedSystem'].addManagedSystem(objname)
- #Now we need to annotate the new DB object
objpath = str(path + '/' + objname)
- flag = self.restrictedTraverse(objpath)
- flag.manage_addProperty(BATCH_ID, batch_id, "string")
- flag.manage_addProperty(TASKTYPE, RESOURCE_REMOVE, "string")
- flag.manage_addProperty(FLAG_DESC, "Removing Resource \'" + request['resourcename'] + "\'", "string")
+
+ try:
+ clusterfolder.manage_addProduct['ManagedSystem'].addManagedSystem(objname)
+ #Now we need to annotate the new DB object
+ flag = self.restrictedTraverse(objpath)
+ flag.manage_addProperty(BATCH_ID, batch_id, "string")
+ flag.manage_addProperty(TASKTYPE, RESOURCE_REMOVE, "string")
+ flag.manage_addProperty(FLAG_DESC, "Removing Resource \'" + request['resourcename'] + "\'", "string")
+ except Exception, e:
+ luci_log.debug('An error occurred while setting flag %s: %s' \
+ % (objname, str(e)))
+ except:
+ luci_log.debug('An error occurred while setting flag %s' % objname)
response = request.RESPONSE
response.redirect(request['HTTP_REFERER'] + "&busyfirst=true")
@@ -2860,8 +3057,8 @@
def addIp(request, form=None):
if form is None:
form = request.form
- modelb = request.SESSION.get('model')
+ modelb = request.SESSION.get('model')
if not modelb or not form:
return None
@@ -2976,6 +3173,7 @@
def addGfs(request, form=None):
if form is None:
form = request.form
+
modelb = request.SESSION.get('model')
if not modelb:
return None
@@ -2986,13 +3184,21 @@
if not oldname:
raise KeyError('oldname is blank.')
res = getResourceForEdit(modelb, oldname)
+ if not res:
+ luci_log.debug('resource %s was not found for editing' % oldname)
+ return None
except KeyError, e:
+ luci_log.debug('resource %s was not found for editing: %s' \
+ % (oldname, str(e)))
return None
else:
- res = apply(Clusterfs)
-
- if not res:
- return None
+ try:
+ res = apply(Clusterfs)
+ if not res:
+ raise
+ except:
+ luci_log.debug('Error creating node Clusterfs resource')
+ return None
# XXX: sanity check these fields
try:
@@ -3001,30 +3207,35 @@
raise
res.attr_hash['name'] = name
except:
+ luci_log.debug_verbose('name is missing in clusterfs res')
return None
try:
mountpoint = form['mountpoint'].strip()
res.attr_hash['mountpoint'] = mountpoint
except:
+ luci_log.debug_verbose('mountpoint is missing in clusterfs res')
return None
try:
device = form['device'].strip()
res.attr_hash['device'] = device
except:
+ luci_log.debug_verbose('device is missing in clusterfs res')
return None
try:
options = form['options'].strip()
res.attr_hash['options'] = options
except:
+ luci_log.debug_verbose('options is missing in clusterfs res')
return None
try:
fsid = form['fsid'].strip()
res.attr_hash['fsid'] = fsid
except:
+ luci_log.debug_verbose('fsid is missing in clusterfs res')
return None
if form.has_key('forceunmount'):
@@ -3280,16 +3491,20 @@
try:
mb_nodes = modelb.getNodes()
if not mb_nodes or not len(mb_nodes):
- raise
- except:
- return 'Unable to find cluster nodes for ' + clusterName
+ raise Exception, 'node list is empty'
+ except Exception, e:
+ luci_log.debug_verbose('no model builder nodes found for %s: %s' \
+ % (str(e), clusterName))
+ return 'Unable to find cluster nodes for %s' % clusterName
try:
cluster_node = self.restrictedTraverse(PLONE_ROOT + '/systems/cluster/' + clusterName)
if not cluster_node:
- raise
- except:
- return 'Unable to find an entry for ' + clusterName + ' in the Luci database.'
+ raise Exception, 'cluster node is none'
+ except Exception, e:
+ luci_log.debug('cant find cluster node for %s: %s'
+ % (clusterName, str(e)))
+ return 'Unable to find an entry for %s in the Luci database.' % clusterName
try:
db_nodes = map(lambda x: x[0], cluster_node.objectItems('Folder'))
@@ -3376,9 +3591,11 @@
try:
ragent = rc.hostname()
if not ragent:
+ luci_log.debug('missing hostname')
raise
batch_number, result = setClusterConf(str(conf))
if batch_number is None or result is None:
+ luci_log.debug('missing batch_number or result')
raise
except:
return "Some error occured in setClusterConf\n"
@@ -3387,17 +3604,24 @@
clusterfolder = self.restrictedTraverse(path)
batch_id = str(batch_number)
objname = str(ragent + '____flag')
- clusterfolder.manage_addProduct['ManagedSystem'].addManagedSystem(objname)
- #Now we need to annotate the new DB object
objpath = str(path + '/' + objname)
- flag = self.restrictedTraverse(objpath)
- flag.manage_addProperty(BATCH_ID, batch_id, "string")
- flag.manage_addProperty(TASKTYPE, RESOURCE_ADD, "string")
- if type != 'ip':
- flag.manage_addProperty(FLAG_DESC, "Creating New Resource \'" + request.form['resourceName'] + "\'", "string")
- else:
- flag.manage_addProperty(FLAG_DESC, "Creating New Resource \'" + res.attr_hash['address'] + "\'", "string")
+ try:
+ clusterfolder.manage_addProduct['ManagedSystem'].addManagedSystem(objname)
+ #Now we need to annotate the new DB object
+ flag = self.restrictedTraverse(objpath)
+ flag.manage_addProperty(BATCH_ID, batch_id, "string")
+ flag.manage_addProperty(TASKTYPE, RESOURCE_ADD, "string")
+
+ if type != 'ip':
+ flag.manage_addProperty(FLAG_DESC, "Creating New Resource \'" + request.form['resourceName'] + "\'", "string")
+ else:
+ flag.manage_addProperty(FLAG_DESC, "Creating New Resource \'" + res.attr_hash['address'] + "\'", "string")
+ except Exception, e:
+ try:
+ luci_log.info('Unable to create flag %s: %s' % (objpath, str(e)))
+ except:
+ pass
response = request.RESPONSE
response.redirect(request['HTTP_REFERER'] + "&busyfirst=true")
@@ -3410,48 +3634,92 @@
if res.getName() == name:
resPtr.removeChild(res)
return res
+
+ luci_log.debug_verbose('unable to find resource \"%s\"' % name)
raise KeyError, name
def appendModel(request, model):
try:
request.SESSION.set('model', model)
except:
- pass
-
- return False
+ luci_log.debug_verbose('Appending model to request failed')
+ return False
def resolve_nodename(self, clustername, nodename):
- path = CLUSTER_FOLDER_PATH + clustername
- clusterfolder = self.restrictedTraverse(path)
- objs = clusterfolder.objectItems('Folder')
+ path = str(CLUSTER_FOLDER_PATH + clustername)
+
+ try:
+ clusterfolder = self.restrictedTraverse(path)
+ objs = clusterfolder.objectItems('Folder')
+ except Exception, e:
+ luci_log.info('resolve_nodename failed for %s/%s: %s' \
+ % (nodename, clustername, str(e)))
+
for obj in objs:
if obj[0].find(nodename) != (-1):
return obj[0]
- raise
+
+ luci_log.info('resolve_nodename failed for %s/%s' % (nodename, clustername))
+ return None
def noNodeFlagsPresent(self, nodefolder, flagname, hostname):
- items = nodefolder.objectItems('ManagedSystem')
+ try:
+ items = nodefolder.objectItems('ManagedSystem')
+ except:
+ luci_log.debug('An error occurred while trying to list flags for cluster ' + nodefolder[0])
+ return None
for item in items:
if item[0] != flagname:
continue
#a flag already exists... try to delete it
- rc = RicciCommunicator(hostname)
+ try:
+ rc = RicciCommunicator(hostname)
+ except RicciError, e:
+ luci_log.info('Unable to connect to the ricci daemon: %s' % str(e))
+ return None
+
+ if not rc.authed():
+ try:
+ snode = getStorageNode(self, hostname)
+ setNodeFlag(snode, CLUSTER_NODE_NEED_AUTH)
+ except:
+ pass
+ luci_log.info('Node %s is not authenticated' % item[0])
+ return None
+
finished = checkBatch(rc, item[1].getProperty(BATCH_ID))
if finished == True:
try:
nodefolder.manage_delObjects(item[0])
- except:
- return False
+ except Exception, e:
+ luci_log.info('manage_delObjects for %s failed: %s' \
+ % (item[0], str(e)))
+ return None
return True
else:
#Not finished, so cannot remove flag
return False
+
return True
-def getModelBuilder(rc,isVirtualized):
- cluster_conf_node = getClusterConf(rc)
- modelb = ModelBuilder(0, None, None, cluster_conf_node)
+def getModelBuilder(rc, isVirtualized):
+ try:
+ cluster_conf_node = getClusterConf(rc)
+ if not cluster_conf_node:
+ raise;
+ except:
+ luci_log.debug('unable to get cluster_conf_node in getModelBuilder')
+ return None
+
+ try:
+ modelb = ModelBuilder(0, None, None, cluster_conf_node)
+ except Exception, e:
+ try:
+ luci_log.debug('An error occurred while trying to get modelb for conf \"%s\": %s' % (cluster_conf_node.toxml(), str(e)))
+ except:
+ pass
+
modelb.setIsVirtualized(isVirtualized)
return modelb
--- conga/luci/site/luci/Extensions/conga_constants.py 2006/10/16 20:46:46 1.19
+++ conga/luci/site/luci/Extensions/conga_constants.py 2006/10/24 16:36:23 1.19.2.1
@@ -113,3 +113,6 @@
CLUSTER_NODE_ADDED = 0x04
PLONE_ROOT='luci'
+
+LUCI_DEBUG_MODE = 1
+LUCI_DEBUG_VERBOSITY = 2
--- conga/luci/site/luci/Extensions/homebase_adapters.py 2006/10/16 20:46:46 1.34
+++ conga/luci/site/luci/Extensions/homebase_adapters.py 2006/10/24 16:36:23 1.34.2.1
@@ -1367,7 +1367,7 @@
pass
return False
-def setNodeFlag(self, node, flag_mask):
+def setNodeFlag(node, flag_mask):
try:
flags = node.getProperty('flags')
node.manage_changeProperties({ 'flags': flags | flag_mask })
@@ -1377,7 +1377,7 @@
except:
pass
-def delNodeFlag(self, node, flag_mask):
+def delNodeFlag(node, flag_mask):
try:
flags = node.getProperty('flags')
if flags & flag_mask != 0:
--- conga/luci/site/luci/Extensions/ricci_bridge.py 2006/10/23 19:31:15 1.30.2.1
+++ conga/luci/site/luci/Extensions/ricci_bridge.py 2006/10/24 16:36:23 1.30.2.2
@@ -298,7 +298,7 @@
return (None, None)
return batchAttemptResult(doc)
-def nodeLeaveCluster(rc, cluster_shutdown=False, purge=True):
+def nodeLeaveCluster(rc, cluster_shutdown=False, purge=False):
cshutdown = 'false'
if cluster_shutdown == True:
cshutdown = 'true'
--- conga/luci/site/luci/Extensions/ricci_communicator.py 2006/10/16 07:39:27 1.9
+++ conga/luci/site/luci/Extensions/ricci_communicator.py 2006/10/24 16:36:23 1.9.2.1
@@ -1,17 +1,21 @@
-
-
from time import *
from socket import *
import xml
import xml.dom
from xml.dom import minidom
-
-
+from LuciSyslog import LuciSyslog
from HelperFunctions import access_to_host_allowed
-
CERTS_DIR_PATH = '/var/lib/luci/var/certs/'
+try:
+ luci_log = LuciSyslog()
+except:
+ pass
+
+class RicciError(Exception):
+ pass
+
class RicciCommunicator:
def __init__(self, hostname, port=11111):
self.__hostname = hostname
@@ -21,16 +25,32 @@
self.__cert_file = CERTS_DIR_PATH + 'cacert.pem'
# socket
- sock = socket(AF_INET, SOCK_STREAM)
- sock.settimeout(2.0)
- sock.connect((self.__hostname, self.__port))
- self.ss = ssl(sock, self.__privkey_file, self.__cert_file)
- sock.settimeout(600.0) # 10 minutes
- # TODO: data transfer timeout should be much less,
- # leave until all calls are async ricci calls
+ try:
+ sock = socket(AF_INET, SOCK_STREAM)
+ sock.settimeout(2.0)
+ sock.connect((self.__hostname, self.__port))
+ except Exception, e:
+ raise RicciError, 'Error connecting to %s:%d: %s' \
+ % (self.__hostname, self.__port, str(e))
+ luci_log.debug_verbose('Connected to %s:%d' \
+ % (self.__hostname, self.__port))
+ try:
+ self.ss = ssl(sock, self.__privkey_file, self.__cert_file)
+ # TODO: data transfer timeout should be much less,
+ # leave until all calls are async ricci calls
+ sock.settimeout(600.0) # 10 minutes
+ except Exception, e:
+ raise RicciError, 'Error setting up SSL for connection to %s: %s' \
+ % (self.__hostname, str(e))
# receive ricci header
hello = self.__receive()
+ try:
+ luci_log.debug_verbose('Received header from %s: \"%s\"' \
+ % (self.__hostname, hello.toxml()))
+ except:
+ pass
+
self.__authed = hello.firstChild.getAttribute('authenticated') == 'true'
self.__cluname = hello.firstChild.getAttribute('clustername')
self.__clualias = hello.firstChild.getAttribute('clusteralias')
@@ -42,21 +62,35 @@
def hostname(self):
+ luci_log.debug_verbose('[auth %d] reported hostname = %s' \
+ % (self.__authed, self.__hostname))
return self.__hostname
def authed(self):
+ luci_log.debug_verbose('reported authed = %d for %s' \
+ % (self.__authed, self.__hostname))
return self.__authed
def system_name(self):
+ luci_log.debug_verbose('[auth %d] reported system_name = %s for %s' \
+ % (self.__authed, self.__reported_hostname, self.__hostname))
return self.__reported_hostname
def cluster_info(self):
+ luci_log.debug_verbose('[auth %d] reported cluster_info = (%s,%s) for %s' \
+ % (self.__authed, self.__cluname, self.__clualias, self.__hostname))
return (self.__cluname, self.__clualias)
def os(self):
+ luci_log.debug_verbose('[auth %d] reported system_name = %s for %s' \
+ % (self.__authed, self.__os, self.__hostname))
return self.__os
def dom0(self):
+ luci_log.debug_verbose('[auth %d] reported system_name = %s for %s' \
+ % (self.__authed, self.__dom0, self.__hostname))
return self.__dom0
def auth(self, password):
if self.authed():
+ luci_log.debug_verbose('already authenticated to %s' \
+ % self.__hostname)
return True
# send request
@@ -71,8 +105,9 @@
# receive response
resp = self.__receive()
self.__authed = resp.firstChild.getAttribute('authenticated') == 'true'
-
- return self.authed()
+
+ luci_log.debug_verbose('auth call returning %d' % self.__authed)
+ return self.__authed
def unauth(self):
@@ -83,15 +118,33 @@
doc.appendChild(ricci)
self.__send(doc)
resp = self.__receive()
- ret = resp.firstChild.getAttribute('success')
- if ret != '0':
- raise Exception(str(ret))
+
+ luci_log.debug_verbose('trying to unauthenticate to %s' \
+ % self.__hostname)
+
+ try:
+ ret = resp.firstChild.getAttribute('success')
+ luci_log.debug_verbose('unauthenticate returned %s for %s' \
+ % (ret, self.__hostname))
+ if ret != '0':
+ raise Exception, 'Invalid response'
+ except:
+ errstr = 'Error authenticating to host %s: %s' \
+ % (self.__hostname, str(ret))
+ luci_log.debug(errstr)
+ raise RicciError, errstr
return True
def process_batch(self, batch_xml, async=False):
+ try:
+ luci_log.debug_verbose('auth=%d to %s for batch %s [async=%d]' \
+ % (self.__authed, self.__hostname, batch_xml.toxml(), async))
+ except:
+ pass
+
if not self.authed():
- raise 'not authenticated'
+ raise RicciError, 'not authenticated to host %s', self.__hostname
# construct request
doc = minidom.Document()
@@ -108,13 +161,26 @@
ricci.appendChild(batch_xml.cloneNode(True))
# send request
- self.__send(doc)
-
+ try:
+ self.__send(doc)
+ except Exception, e:
+ luci_log.debug('Error sending XML \"%s\" to host %s' \
+ % (doc.toxml(), self.__hostname))
+ raise RicciError, 'Error sending XML to host %s: %s' \
+ % (self.__hostname, str(e))
# receive response
doc = self.__receive()
+ try:
+ luci_log.debug_verbose('received from %s XML \"%s\"' \
+ % (self.__hostname, doc.toxml()))
+ except:
+ pass
+
if doc.firstChild.getAttribute('success') != '0':
- raise 'ricci reported error'
+ luci_log.debug_verbose('batch command failed')
+ raise RicciError, 'The last ricci command to host %s failed' \
+ % self.__hostname
batch_node = None
for node in doc.firstChild.childNodes:
@@ -122,26 +188,42 @@
if node.nodeName == 'batch':
batch_node = node.cloneNode(True)
if batch_node == None:
- raise 'missing <batch/> in ricci\'s response'
+ luci_log.debug_verbose('batch node missing <batch/>')
+ raise RicciError, 'missing <batch/> in ricci\'s response from %s' \
+ % self.__hostname
return batch_node
def batch_run(self, batch_str, async=True):
try:
batch_xml_str = '<?xml version="1.0" ?><batch>' + batch_str + '</batch>'
+ luci_log.debug_verbose('attempting batch \"%s\" for host %s' \
+ % (batch_xml_str, self.__hostname))
batch_xml = minidom.parseString(batch_xml_str).firstChild
- except:
- return None
+ except Exception, e:
+ luci_log.debug('received invalid batch XML for %s: \"%s\"' \
+ % (self.__hostname, batch_xml_str))
+ raise RicciError, 'batch XML is malformed'
try:
ricci_xml = self.process_batch(batch_xml, async)
+ try:
+ luci_log.debug_verbose('received XML \"%s\" from host %s in response to batch command.' \
+ % (ricci_xml.toxml(), self.__hostname))
+ except:
+ pass
except:
+ luci_log.debug('An error occurred while trying to process the batch job: %s' % batch_xml_str)
return None
+
return ricci_xml
def batch_report(self, batch_id):
+ luci_log.debug_verbose('[auth=%d] asking for batchid# %d for host %s' \
+ % (self.__authed, batch_id, self.__hostname))
+
if not self.authed():
- raise 'not authenticated'
+ raise RicciError, 'Not authenticated to host %s' % self.__hostname
# construct request
doc = minidom.Document()
@@ -153,22 +235,21 @@
# send request
self.__send(doc)
-
-
+
+
# receive response
doc = self.__receive()
if doc.firstChild.getAttribute('success') == '12':
return None
if doc.firstChild.getAttribute('success') != '0':
- raise 'ricci reported error'
-
+ raise RicciError, 'Error while retrieving batch report for batch #%s from host %s' % (batch_id, self.__hostname)
batch_node = None
for node in doc.firstChild.childNodes:
if node.nodeType == xml.dom.Node.ELEMENT_NODE:
if node.nodeName == 'batch':
batch_node = node.cloneNode(True)
if batch_node == None:
- raise 'missing <batch/> in ricci\'s response'
+ raise RicciError, 'Missing <batch/> in ricci\'s response from host %s' % self.__hostname
return batch_node
@@ -177,13 +258,22 @@
def __send(self, xml_doc):
buff = xml_doc.toxml() + '\n'
- #print buff
while len(buff) != 0:
- pos = self.ss.write(buff)
+ try:
+ pos = self.ss.write(buff)
+ except Exception, e:
+ luci_log.debug('Error sending XML \"%s\" to %s' \
+ % (buff, self.__hostname))
+ raise RicciError, 'write error while sending XML to host %s' \
+ % self.__hostname
buff = buff[pos:]
+ try:
+ luci_log.debug_verbose('Sent XML \"%s\" to host %s' \
+ % (xml_doc.toxml(), self.__hostname))
+ except:
+ pass
return
-
def __receive(self):
doc = None
xml_in = ''
@@ -197,18 +287,38 @@
doc = minidom.parseString(xml_in)
break
except:
- pass
- except:
- pass
+ # we haven't received all of the XML data yet.
+ continue
+ except Exception, e:
+ luci_log.debug('Error reading data from %s: %s' \
+ % (self.__hostname, str(e)))
+ raise RicciError, 'Error reading data from host %s' \
+ % self.__hostname
+ luci_log.debug_verbose('Received XML \"%s\" from host %s' \
+ % (xml_in, self.__hostname))
+
try:
if doc == None:
doc = minidom.parseString(xml_in)
- if doc.firstChild.nodeName != 'ricci':
- raise ''
- except:
- raise 'invalid ricci response'
+ except Exception, e:
+ luci_log.debug('Error parsing XML \"%s" from %s' \
+ % (xml_in, str(e)))
+ raise RicciError, 'Error parsing XML from host %s: %s' \
+ % (self.__hostname, str(e))
+
+ if not doc or not doc.firstChild:
+ raise RicciError, \
+ 'Error an empty response was received from host %s' \
+ % self.__hostname
- #print doc.toxml()
+ try:
+ if doc.firstChild.nodeName != 'ricci':
+ luci_log.debug('Expecting \"ricci\" got XML \"%s\" from %s' %
+ (xml_in, self.__hostname))
+ raise Exception, 'Expecting first XML child node to be \"ricci\"'
+ except Exception, e:
+ raise RicciError, 'Invalid XML ricci response from host %s' \
+ % self.__hostname
return doc
@@ -220,7 +330,9 @@
try:
return RicciCommunicator(hostname)
- except:
+ except Exception, e:
+ luci_log.debug('Error creating a ricci connection to %s: %s' \
+ % (hostname, str(e)))
return None
pass
@@ -268,7 +380,12 @@
# module (-num) failed (next module won't be processed)
def batch_status(batch_xml):
if batch_xml.nodeName != 'batch':
- raise 'not a batch'
+ try:
+ luci_log.debug('Expecting an XML batch node. Got \"%s\"' \
+ % batch_xml.toxml())
+ except:
+ pass
+ raise RicciError, 'Not an XML batch node'
total = 0
last = 0
for node in batch_xml.childNodes:
@@ -283,6 +400,12 @@
# failure
last = last + 1
last = last - 2 * last
+ try:
+ luci_log.debug_verbose('Returning (%s, %s) for batch_status(\"%s\")' \
+ % (last, total, batch_xml.toxml()))
+ except:
+ pass
+
return (last, total)
@@ -307,7 +430,9 @@
# * error_msg: error message
def extract_module_status(batch_xml, module_num=1):
if batch_xml.nodeName != 'batch':
- raise 'not a batch'
+ luci_log.debug('Expecting \"batch\" got \"%s\"' % batch_xml.toxml())
+ raise RicciError, 'Invalid XML node; expecting a batch node'
+
c = 0
for node in batch_xml.childNodes:
if node.nodeType == xml.dom.Node.ELEMENT_NODE:
@@ -349,5 +474,5 @@
elif status == '5':
return -103, 'module removed from schedule'
- raise Exception, str('no ' + str(module_num) + 'th module in the batch, or malformed response')
+ raise RicciError, str('no ' + str(module_num) + 'th module in the batch, or malformed response')
next reply other threads:[~2006-10-24 16:36 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-10-24 16:36 rmccabe [this message]
-- strict thread matches above, loose matches on Subject: below --
2006-11-29 18:15 [Cluster-devel] conga/luci/site/luci/Extensions LuciSyslog.py rmccabe
2006-11-06 20:21 rmccabe
2006-10-27 18:24 rmccabe
2006-10-20 22:29 rmccabe
2006-10-20 22:20 rmccabe
2006-10-20 20:00 rmccabe
2006-10-20 18:41 rmccabe
2006-10-18 21:59 rmccabe
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20061024163624.28087.qmail@sourceware.org \
--to=rmccabe@sourceware.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.