[Cluster-devel] conga/luci/site/luci/Extensions ricci_communic ...
kupcevic at sourceware.org
kupcevic at sourceware.org
Tue Oct 10 21:07:19 UTC 2006
CVSROOT: /cvs/cluster
Module name: conga
Changes by: kupcevic at sourceware.org 2006-10-10 21:07:18
Modified files:
luci/site/luci/Extensions: ricci_communicator.py
Log message:
luci: helper functions to process ricci's response
Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/ricci_communicator.py.diff?cvsroot=cluster&r1=1.6&r2=1.7
--- conga/luci/site/luci/Extensions/ricci_communicator.py 2006/09/29 21:41:43 1.6
+++ conga/luci/site/luci/Extensions/ricci_communicator.py 2006/10/10 21:07:18 1.7
@@ -162,6 +162,9 @@
return batch_node
+
+
+
def __send(self, xml_doc):
buff = xml_doc.toxml() + '\n'
#print buff
@@ -228,3 +231,113 @@
return ricci.auth(password)
def ricci_unauthenticate(self, ricci):
return ricci.unauth()
+
+
+
+
+
+
+
+
+########## helpers to process batch as returned by ricci #############
+
+
+
+
+
+# check the status of batch
+# returns (int num, int total)
+# * total:
+# total number of modules in batch
+# * num:
+# if num == total:
+# all modules in the batch completed successfuly
+# if num > 0:
+# last seq. number of module that successfuly finished
+# if num < 0:
+# module (-num) failed (next module won't be processed)
+def batch_status(batch_xml):
+ if batch_xml.nodeName != 'batch':
+ raise 'not a batch'
+ total = 0
+ last = 0
+ for node in batch_xml.childNodes:
+ if node.nodeType == xml.dom.Node.ELEMENT_NODE:
+ if node.nodeName == 'module':
+ total = total + 1
+ status = node.getAttribute('status')
+ if status == '0':
+ # success
+ last = last + 1
+ elif status == '3' or status == '4':
+ # failure
+ last = last + 1
+ last = last - 2 * last
+ return (last, total)
+
+
+
+# extract error_code from module's response
+# * module_num:
+# 1-based seq. number of module to process
+#
+# returns (int error_code, string error_msg)
+# * error_code: each module defines own error codes, which are >0
+# -101 - in progress
+# -102 - scheduled
+# -103 - removed from schedule
+# -104 - failed to execute module
+#
+# >-3 - module executed. Following codes are defined:
+# -2 - API error
+# -1 - undefined error occured (msg not necesarily very informative)
+# 0 - no error (msg is empty string)
+# >0 - predefined error has occured
+# (check respective API, msg will be fully descriptive)
+# * error_msg: error message
+def extract_module_status(batch_xml, module_num=1):
+ if batch_xml.nodeName != 'batch':
+ raise 'not a batch'
+ c = 0
+ for node in batch_xml.childNodes:
+ if node.nodeType == xml.dom.Node.ELEMENT_NODE:
+ if node.nodeName == 'module':
+ module_xml = node
+ c = c + 1
+ if c == module_num:
+ status = module_xml.getAttribute('status')
+ 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.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.nodeName == 'function_response':
+ code = -11111111
+ msg = 'BUG'
+ for var in node_j.childNodes:
+ if var.nodeType == xml.dom.Node.ELEMENT_NODE:
+ if var.nodeName == 'var':
+ if var.getAttribute('name') == 'success' and var.getAttribute('value') == 'true':
+ return 0, ''
+ elif var.getAttribute('name') == 'error_code':
+ code = int(var.getAttribute('value'))
+ elif var.getAttribute('name') == 'error_description':
+ msg = var.getAttribute('value')
+ return code, msg
+
+ pass
+ elif status == '1':
+ return -102, 'module scheduled for execution'
+ elif status == '2':
+ return -101, 'module is being executed'
+ elif status == '3':
+ return -104, 'failed to locate/execute module'
+ elif status == '5':
+ return -103, 'module removed from schedule'
+
+ raise 'no ' + str(module_num) + 'th module in the batch, or malformed response'
+
More information about the Cluster-devel
mailing list