[Cluster-devel] conga/luci/site/luci/Extensions ricci_communic ...

rmccabe at sourceware.org rmccabe at sourceware.org
Tue Jul 3 16:56:40 UTC 2007


CVSROOT:	/cvs/cluster
Module name:	conga
Changes by:	rmccabe at sourceware.org	2007-07-03 16:56:39

Modified files:
	luci/site/luci/Extensions: ricci_communicator.py 

Log message:
	Cleanups and better debug messages

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/ricci_communicator.py.diff?cvsroot=cluster&r1=1.27&r2=1.28

--- conga/luci/site/luci/Extensions/ricci_communicator.py	2007/06/27 08:14:13	1.27
+++ conga/luci/site/luci/Extensions/ricci_communicator.py	2007/07/03 16:56:39	1.28
@@ -5,11 +5,10 @@
 # GNU General Public License as published by the
 # Free Software Foundation.
 
-import xml
-import xml.dom
 from xml.dom import minidom
-from LuciSyslog import get_logger
+from xml.dom.Node import ELEMENT_NODE
 from conga_ssl import SSLSocket
+from LuciSyslog import get_logger
 from conga_constants import LUCI_DEBUG_MODE, LUCI_DEBUG_NET
 
 CERTS_DIR_PATH = '/var/lib/luci/var/certs/'
@@ -37,8 +36,8 @@
 								self.__timeout_init)
 			if enforce_trust:
 				if not self.ss.trusted():
-					luci_log.info('The SSL certificate for host "%s" is not trusted. Aborting connection attempt.' % self.__hostname)
-					raise RicciError, 'ricci\'s certificate is not trusted'
+					luci_log.info('The SSL certificate for "%s:%d" is not trusted. Aborting connection attempt.' % (self.__hostname, self.__port))
+					raise RicciError, 'The SSL certificate for %s:%d is not trusted' % (self.__hostname, self.__port)
 		except Exception, e:
 			errmsg = 'Unable to establish an SSL connection to %s:%d: %s' \
 						% ((self.__hostname, self.__port, str(e)))
@@ -49,8 +48,8 @@
 		hello = self.__receive(self.__timeout_init)
 		try:
 			if LUCI_DEBUG_NET is True:
-				luci_log.debug_net('RC:init0: recv header from %s: \"%s\"' \
-					% (self.__hostname, hello.toxml()))
+				luci_log.debug_net('RC:init0: recv header from %s:%d "%s"' \
+					% (self.__hostname, self.__port, hello.toxml()))
 		except:
 			if LUCI_DEBUG_MODE is True:
 				luci_log.debug_verbose('RC:init0: error receiving header from %s:%d: %r %s' % (self.__hostname, self.__port, e, str(e)))
@@ -67,47 +66,47 @@
 
 	def hostname(self):
 		if LUCI_DEBUG_NET is True:
-			luci_log.debug_net('RC:hostname: [auth %d] hostname = %s' \
-				% (self.__authed, self.__hostname))
+			luci_log.debug_net('RC:hostname: [auth=%d] hostname = %s [%d]' \
+				% (self.__authed, self.__hostname, self.__port))
 		return self.__hostname
 
 	def authed(self):
 		if LUCI_DEBUG_NET is True:
-			luci_log.debug_net('RC:authed: reported authed = %d for %s' \
-				% (self.__authed, self.__hostname))
+			luci_log.debug_net('RC:authed: reported authed = %d for %s:%d' \
+				% (self.__authed, self.__hostname, self.__port))
 		return self.__authed
 
 	def system_name(self):
 		if LUCI_DEBUG_NET is True:
-			luci_log.debug_net('RC:SN: [auth %d] system_name = %s for %s' \
-				% (self.__authed, self.__reported_hostname, self.__hostname))
+			luci_log.debug_net('RC:SN: [auth=%d] system_name = %s for %s:%d' \
+				% (self.__authed, self.__reported_hostname, self.__hostname, self.__port))
 		return self.__reported_hostname
 
 	def cluster_info(self):
 		if LUCI_DEBUG_NET is True:
-			luci_log.debug_net('RC:CI: [auth %d] (%s,%s) for %s' \
+			luci_log.debug_net('RC:CI: [auth=%d] (%s,%s) for %s:%d' \
 				% (	self.__authed, self.__cluname,
-					self.__clualias, self.__hostname))
+					self.__clualias, self.__hostname, self.__port))
 
 		return (self.__cluname, self.__clualias)
 
 	def os(self):
 		if LUCI_DEBUG_NET is True:
-			luci_log.debug_net('RC:OS: [auth %d] reported os = %s for %s' \
-				% (self.__authed, self.__os, self.__hostname))
+			luci_log.debug_net('RC:OS: [auth=%d] reported os = %s for %s:%d' \
+				% (self.__authed, self.__os, self.__hostname, self.__port))
 		return self.__os
 
 	def dom0(self):
 		if LUCI_DEBUG_NET is True:
-			luci_log.debug_net('RC:DOM0: [auth %d] dom0 = %s for %s' \
-				% (self.__authed, self.__dom0, self.__hostname))
+			luci_log.debug_net('RC:DOM0: [auth=%d] dom0 = %s for %s:%d' \
+				% (self.__authed, self.__dom0, self.__hostname, self.__port))
 		return self.__dom0
 
 	def fingerprint(self):
 		fp = self.ss.peer_fingerprint()
 		if LUCI_DEBUG_NET is True:
-			luci_log.debug_net('RC:fp: [auth %d] fp for %s = %s' \
-				% (self.__authed, self.__hostname, fp))
+			luci_log.debug_net('RC:fp: [auth=%d] fp for %s:%d = %s' \
+				% (self.__authed, self.__hostname, self.__port, fp))
 		return fp
 
 	def trust(self):
@@ -122,16 +121,16 @@
 	def auth(self, password):
 		if self.authed():
 			if LUCI_DEBUG_MODE is True:
-				luci_log.debug_verbose('RC:AUTH0: already authenticated to %s' \
-					% self.__hostname)
+				luci_log.debug_verbose('RC:AUTH0: already authed to %s:%d' \
+					% (self.__hostname, self.__port))
 			return True
 
 		# send request
 		doc = minidom.Document()
-		ricci = doc.createElement("ricci")
-		ricci.setAttribute("version", "1.0")
-		ricci.setAttribute("function", "authenticate")
-		ricci.setAttribute("password", password)
+		ricci = doc.createElement('ricci')
+		ricci.setAttribute('version', '1.0')
+		ricci.setAttribute('function', 'authenticate')
+		ricci.setAttribute('password', password)
 		doc.appendChild(ricci)
 		self.__send(doc, self.__timeout_auth)
 
@@ -148,12 +147,12 @@
 				self.__dom0 = resp.firstChild.getAttribute('xen_host') == 'true'
 			except Exception, e:
 				if LUCI_DEBUG_MODE is True:
-					luci_log.debug_verbose('RC:AUTH1: %r %s for %s' \
-						% (e, str(e), self.__hostname))
+					luci_log.debug_verbose('RC:AUTH1: %r %s for %s:%d' \
+						% (e, str(e), self.__hostname, self.__port))
 
 		if LUCI_DEBUG_NET is True:
-			luci_log.debug_net('RC:auth1: auth call returning %d' \
-				% self.__authed)
+			luci_log.debug_net('RC:auth1: auth call to %s:%d returning %d' \
+				% (self.__hostname, self.__port, self.__authed))
 		return self.__authed
 
 	def unauth(self):
@@ -168,8 +167,8 @@
 		try:
 			ret = resp.firstChild.getAttribute('success')
 			if LUCI_DEBUG_NET is True:
-				luci_log.debug_net('RC:UNAUTH0: unauthenticate %s for %s' \
-					% (ret, self.__hostname))
+				luci_log.debug_net('RC:UNAUTH0: unauthenticate %s for %s:%d' \
+					% (ret, self.__hostname, self.__port))
 			if ret != '0':
 				raise Exception, 'Invalid response'
 
@@ -178,8 +177,8 @@
 			except:
 				pass
 		except:
-			errstr = 'Error authenticating host %s: %s' \
-						% (self.__hostname, str(ret))
+			errstr = 'Error authenticating to the ricci agent at %s:%d: %s' \
+						% (self.__hostname, self.__port, str(ret))
 			luci_log.info(errstr)
 			raise RicciError, errstr
 		return True
@@ -187,15 +186,16 @@
 	def process_batch(self, batch_xml, async=False):
 		try:
 			if LUCI_DEBUG_NET is True:
-				luci_log.debug_net_priv('RC:PB0: [auth=%d] to %s for batch %s [async=%d]' % (self.__authed, self.__hostname, batch_xml.toxml(), async))
+				luci_log.debug_net_priv('RC:PB0: [auth=%d async=%d] to %s:%d for batch "%s"' % (self.__authed, async, self.__hostname, self.__port, batch_xml.toxml()))
 		except:
 			pass
 
 		if not self.authed():
 			if LUCI_DEBUG_MODE is True:
-				luci_log.debug_verbose('RC:PB1: not authenticated to %s' \
-					% self.__hostname)
-			raise RicciError, 'not authenticated to host %s' % self.__hostname
+				luci_log.debug_verbose('RC:PB1: not authenticated to %s:%d' \
+					% (self.__hostname, self.__port))
+			raise RicciError, 'not authenticated to the ricci agent at %s:%d' \
+				% (self.__hostname, self.__port)
 
 		# construct request
 		doc = minidom.Document()
@@ -218,34 +218,37 @@
 			errstr = 'Error sending XML batch command to %s:%d: %s' \
 						% (self.__hostname, self.__port, str(e))
 			luci_log.info(errstr)
+
 			if LUCI_DEBUG_NET is True:
-				luci_log.debug_net_priv('RC:PB2: Error sending XML \"%s\" to host %s' % (doc.toxml(), self.__hostname))
+				luci_log.debug_net_priv('RC:PB2: sending "%s" to %s:%d: %r %s' \
+					 % (doc.toxml(), self.__hostname, self.__port, e, str(e)))
 			raise RicciError, errstr
 
 		# receive response
 		doc = self.__receive(self.__timeout_long)
 		if LUCI_DEBUG_NET is True:
 			try:
-				luci_log.debug_net_priv('RC:PB3: received from %s XML \"%s\"' \
-					% (self.__hostname, doc.toxml()))
+				luci_log.debug_net_priv('RC:PB3: XML from %s:%d: "%s"' \
+					% (self.__hostname, self.__port, doc.toxml()))
 			except:
 				pass
 
 		if doc.firstChild.getAttribute('success') != '0':
 			if LUCI_DEBUG_MODE is True:
-				luci_log.debug_verbose('RC:PB4: batch command failed')
-			raise RicciError, 'The last ricci command to host %s:%d failed' \
+				luci_log.debug_verbose('RC:PB4: batch command to %s:%d failed' \
+					% (self.__hostname, self.__port))
+			raise RicciError, 'The last ricci command sent to %s:%d failed' \
 					% (self.__hostname, self.__port)
 
 		batch_node = None
 		for node in doc.firstChild.childNodes:
-			if node.nodeType == xml.dom.Node.ELEMENT_NODE:
+			if node.nodeType == ELEMENT_NODE:
 				if node.nodeName == 'batch':
 					batch_node = node#.cloneNode(True)
 		if batch_node is None:
 			if LUCI_DEBUG_MODE is True:
-				luci_log.debug_verbose('RC:PB5: no <batch/> from %s' \
-					% self.__hostname)
+				luci_log.debug_verbose('RC:PB5: no <batch/> from %s:%d' \
+					% (self.__hostname, self.__port))
 			raise RicciError, 'missing <batch/> in ricci response from %s:%d' \
 					% (self.__hostname, self.__port)
 
@@ -256,23 +259,28 @@
 			batch_xml_str = '<?xml version="1.0" ?><batch>%s</batch>' \
 				% batch_str
 			if LUCI_DEBUG_NET is True:
-				luci_log.debug_net_priv('RC:BRun0: attempting batch "%s" for host "%s"' % (batch_xml_str, self.__hostname))
+				luci_log.debug_net_priv('RC:BRun0: run batch "%s" at %s:%d' \
+					% (batch_xml_str, self.__hostname, self.__port))
 			batch_xml = minidom.parseString(batch_xml_str).firstChild
 		except Exception, e:
 			if LUCI_DEBUG_NET is True:
-				luci_log.debug_net_priv('RC:BRun1: received invalid batch XML for %s: "%s": "%s"' % (self.__hostname, batch_xml_str, str(e)))
-			raise RicciError, 'batch XML is malformed'
+				luci_log.debug_net_priv('RC:BRun1: bad XML %s:%d: %r %s: "%s"' \
+					% (self.__hostname, self.__port, e, str(e), batch_xml_str))
+			raise RicciError, 'batch XML from %s:%d is malformed' \
+					% (self.__hostname, self.__port)
 
 		try:
 			ricci_xml = self.process_batch(batch_xml, async)
 			if LUCI_DEBUG_NET is True:
 				try:
-					luci_log.debug_net_priv('RC:BRun2: received XML "%s" from host %s in response to batch command' % (ricci_xml.toxml(), self.__hostname))
+					luci_log.debug_net_priv('RC:BRun2: recv "%s" from %s:%d' \
+						% (ricci_xml.toxml(), self.__hostname, self.__port))
 				except:
 					pass
 		except:
 			if LUCI_DEBUG_NET is True:
-				luci_log.debug_net_priv('RC:BRun3: An error occurred while trying to process the batch job: "%s"' % batch_xml_str)
+				luci_log.debug_net_priv('RC:BRun3: error for "%s" at %s:%d' \
+					% (batch_xml_str, self.__hostname, self.__port))
 			return None
 
 		doc = minidom.Document()
@@ -287,24 +295,26 @@
 			batch = self.batch_report(batch_id)
 			if batch is None:
 				if LUCI_DEBUG_MODE is True:
-					luci_log.debug_verbose('RCCB0: batch id %s not found' \
-						% batch_id)
-				return (True, 'batch id %s was not found' % batch_id)
+					luci_log.debug_verbose('RCCB0: no id %s at %s:%d' \
+						% (batch_id, self.__hostname, self.__port))
+				return (True, 'batch id %s was not found at %s:%d' \
+								% (batch_id, self.__hostname, self.__port))
 		except Exception, e:
 			if LUCI_DEBUG_MODE is True:
-				luci_log.debug_verbose('RCCB1: %s:%d: %r %s' \
+				luci_log.debug_verbose('RCCB1: status: %s:%d: %r %s' \
 					% (self.__hostname, self.__port, e, str(e)))
 			return (-1, err_msg)
 
 		try:
 			code, new_err_msg = extract_module_status(batch, 1)
 			if new_err_msg:
-				err_msg = 'A ricci error occurred on %s:%d: %s' \
-							% (self.__hostname, self.__port, str(new_err_msg))
+				err_msg = 'Unable to retrieve batch %s status from %s:%d: %s' \
+					% (batch_id, self.__hostname, self.__port, str(new_err_msg))
+				luci_log.info(err_msg)
 		except Exception, e:
 			if LUCI_DEBUG_MODE is True:
-				luci_log.debug_verbose('RCCB2: %s:%d %r %s: %s' \
-					% (self.__hostname, self.__port, e, str(e), err_msg))
+				luci_log.debug_verbose('RCCB2: batch %s stat on %s:%d: %r %s' \
+					% (batch_id, self.__hostname, self.__port, e, str(e)))
 			return (-1, err_msg)
 
 		# In progress.
@@ -317,23 +327,25 @@
 
 		# Error
 		if LUCI_DEBUG_MODE is True:
-			luci_log.debug_verbose('RCCB3: %s:%d code %d: %s' \
-				% (self.__hostname, self.__port, code, err_msg))
+			luci_log.debug_verbose('RCCB3: batch %s on %s:%d code %d: %s' \
+				% (batch_id, self.__hostname, self.__port, code, err_msg))
 		return (-1, err_msg)
 
 	def batch_report(self, batch_id):
 		if LUCI_DEBUG_NET is True:
-			luci_log.debug_net('RC:BRep0: [auth=%d] asking for batchid# %s for host %s' % (self.__authed, batch_id, self.__hostname))
+			luci_log.debug_net('RC:BRep0: [auth=%d] report for %s on %s:%d' \
+				% (self.__authed, batch_id, self.__hostname, self.__port))
 
 		if not self.authed():
-			raise RicciError, 'Not authenticated to host %s' % self.__hostname
+			raise RicciError, 'Not authenticated to the ricci agent at %s:%d' \
+				% (self.__hostname, self.__port)
 
 		# construct request
 		doc = minidom.Document()
-		ricci = doc.createElement("ricci")
-		ricci.setAttribute("version", "1.0")
-		ricci.setAttribute("function", "batch_report")
-		ricci.setAttribute("batch_id", str(batch_id))
+		ricci = doc.createElement('ricci')
+		ricci.setAttribute('version', '1.0')
+		ricci.setAttribute('function', 'batch_report')
+		ricci.setAttribute('batch_id', str(batch_id))
 		doc.appendChild(ricci)
 
 		# send request
@@ -344,14 +356,17 @@
 		if doc.firstChild.getAttribute('success') == '12':
 			return None
 		if doc.firstChild.getAttribute('success') != '0':
-			raise RicciError, 'Error while retrieving batch report for batch #%d from host %s' % (batch_id, self.__hostname)
+			raise RicciError, 'Error retrieving batch %s report from %s:%d' \
+				% (batch_id, self.__hostname, self.__port)
+
 		batch_node = None
 		for node in doc.firstChild.childNodes:
-			if node.nodeType == xml.dom.Node.ELEMENT_NODE:
+			if node.nodeType == ELEMENT_NODE:
 				if node.nodeName == 'batch':
 					batch_node = node#.cloneNode(True)
 		if batch_node is None:
-			raise RicciError, 'Missing <batch/> in ricci\'s response from host %s' % self.__hostname
+			raise RicciError, 'Missing <batch/> in ricci response from %s:%d' \
+				% (self.__hostname, self.__port)
 		return batch_node
 
 
@@ -360,18 +375,19 @@
 			self.ss.send(xml_doc.toxml(), timeout)
 			self.ss.send('\n', timeout)
 		except Exception, e:
+			errstr = 'Error sending batch command to %s:%d: %s' \
+				% (self.__hostname, self.__port, str(e))
+			luci_log.info(errstr)
+
 			if LUCI_DEBUG_NET is True:
-				luci_log.debug_net_priv('RC:send0: sending XML "%s" to %s: %s' \
-					% (xml_doc.toxml(), self.__hostname, str(e)))
-			luci_log.info('Error sending batch command to %s:%d: %s' \
-				% (self.__hostname, self.__port, str(e)))
-			raise RicciError, 'Write error while sending XML to host %s' \
-					% self.__hostname
+				luci_log.debug_net_priv('RC:send0: send XML "%s" to %s:%d: %s' \
+					% (xml_doc.toxml(), self.__hostname, self.__port, str(e)))
+			raise RicciError, errstr
 
 		if LUCI_DEBUG_NET is True:
 			try:
-				luci_log.debug_net_priv('RC:send1: Sent XML "%s" to host %s' \
-					% (xml_doc.toxml(), self.__hostname))
+				luci_log.debug_net_priv('RC:send1: Sent XML "%s" to %s:%d' \
+					% (xml_doc.toxml(), self.__hostname, self.__port))
 			except:
 				pass
 		return
@@ -387,35 +403,37 @@
 			raise RicciError, errstr
 
 		if LUCI_DEBUG_NET is True:
-			luci_log.debug_net_priv('RC:recv1: Received XML "%s" from host %s' \
-				% (xml_in, self.__hostname))
+			luci_log.debug_net_priv('RC:recv1: recv XML "%s" from %s:%d' \
+				% (xml_in, self.__hostname, self.__port))
 
 		doc = None
 		try:
 			doc = minidom.parseString(xml_in)
 		except Exception, e:
-			errstr = 'Error parsing XML from host %s:%d: %s' \
+			errstr = 'Error parsing XML from %s:%d: %s' \
 						% (self.__hostname, self.__port, str(e))
 			luci_log.info(errstr)
+
 			if LUCI_DEBUG_NET is True:
-				luci_log.debug_net_priv('RC:recv2: parsing XML "%s" from %s' \
-					% (xml_in, str(e)))
+				luci_log.debug_net_priv('RC:recv2: "%s" from %s:%d: %r %s' \
+					% (xml_in, self.__hostname, self.__port, e, str(e)))
 			raise RicciError, errstr
 
 		if not doc or not doc.firstChild:
 			if LUCI_DEBUG_MODE is True:
-				luci_log.debug_verbose('RC:recv3: empty XML response from %s' \
-					% self.__hostname)
-			raise RicciError, 'Error an empty response was received from host %s' % self.__hostname
+				luci_log.debug_verbose('RC:recv3: empty XML from %s:%d' \
+					% (self.__hostname, self.__port))
+			raise RicciError, 'An empty XML response was received from %s:%d' \
+					% (self.__hostname, self.__port)
 
 		try:
 			if doc.firstChild.nodeName != 'ricci':
 				if LUCI_DEBUG_NET is True:
-					luci_log.debug_net_priv('RC:recv4: Expecting "<ricci>" tag, got XML "%s" from %s' % (xml_in, self.__hostname))
-				raise Exception, 'Expected first XML child node to be "<ricci>"'
+					luci_log.debug_net_priv('RC:recv4: Expecting "<ricci>" tag, got XML "%s" from %s:%d' % (xml_in, self.__hostname, self.__port))
+				raise Exception, 'expected first XML child node to be "<ricci>"'
 		except Exception, e:
-			raise RicciError, 'Invalid XML ricci response from host %s' \
-					% self.__hostname
+			raise RicciError, 'Invalid ricci XML response from %s:%d' \
+					% (self.__hostname, self.__port)
 		return doc
 
 def get_ricci_communicator(self, hostname, allowed_systems):
@@ -424,7 +442,8 @@
 
 	if not self.access_to_host_allowed(hostname, allowed_systems):
 		if LUCI_DEBUG_MODE is True:
-			luci_log.debug_verbose('GRC0: access to host %s is not allowed' % hostname)
+			luci_log.debug_verbose('GRC0: access to host %s is not allowed' \
+				% hostname)
 		return None
 
 	try:
@@ -433,9 +452,9 @@
 			raise Exception, 'initialization failed'
 		return rc
 	except Exception, e:
-		luci_log.info('Error creating a ricci connection to %s: %r %s' \
-			% (hostname, e, str(e)))
-		return None
+		luci_log.info('Error creating a ricci connection to %s: %s' \
+			% (hostname, str(e)))
+	return None
 
 def ricci_get_called_hostname(self, ricci):
 	return ricci.hostname()
@@ -472,7 +491,7 @@
 	if batch_xml.nodeName != 'batch':
 		if LUCI_DEBUG_NET is True:
 			try:
-				luci_log.debug_net_priv('RC:BS0: batch node. Got \"%s\"' \
+				luci_log.debug_net_priv('RC:BS0: batch node. Got "%s"' \
 					% batch_xml.toxml())
 			except:
 				pass
@@ -481,7 +500,7 @@
 	total = 0
 	last  = 0
 	for node in batch_xml.childNodes:
-		if node.nodeType == xml.dom.Node.ELEMENT_NODE:
+		if node.nodeType == ELEMENT_NODE:
 			if node.nodeName == 'module':
 				total = total + 1
 				status = node.getAttribute('status')
@@ -530,7 +549,7 @@
 
 	c = 0
 	for node in batch_xml.childNodes:
-		if node.nodeType == xml.dom.Node.ELEMENT_NODE:
+		if node.nodeType == ELEMENT_NODE:
 			if node.nodeName == 'module':
 				module_xml = node
 				c = c + 1
@@ -539,17 +558,17 @@
 					if status == '0' or status == '4':
 						# module executed, dig deeper into request
 						for node_i in module_xml.childNodes:
-							if node_i.nodeType == xml.dom.Node.ELEMENT_NODE:
+							if node_i.nodeType == ELEMENT_NODE:
 								if node_i.nodeName == 'API_error':
 									return -2, 'API error'
 								elif node_i.nodeName == 'response':
 									for node_j in node_i.childNodes:
-										if node_j.nodeType == xml.dom.Node.ELEMENT_NODE:
+										if node_j.nodeType == ELEMENT_NODE:
 											if node_j.nodeName == 'function_response':
 												code = -11111111
 												msg = 'BUG'
 												for var in node_j.childNodes:
-													if var.nodeType == xml.dom.Node.ELEMENT_NODE:
+													if var.nodeType == ELEMENT_NODE:
 														if var.nodeName == 'var':
 															if var.getAttribute('name') == 'success' and var.getAttribute('value') == 'true':
 																return 0, ''
@@ -568,4 +587,5 @@
 					elif status == '5':
 						return -103, 'module removed from schedule'
 
-	raise RicciError, 'no %dth module in the batch, or malformed response' % module_num
+	raise RicciError, 'no module %d in the batch, or malformed response' \
+			% module_num




More information about the Cluster-devel mailing list