All of lore.kernel.org
 help / color / mirror / Atom feed
From: rmccabe@sourceware.org <rmccabe@sourceware.org>
To: cluster-devel.redhat.com
Subject: [Cluster-devel] conga/luci cluster/form-macros cluster/index_h ...
Date: 31 Oct 2006 17:28:08 -0000	[thread overview]
Message-ID: <20061031172808.11207.qmail@sourceware.org> (raw)

CVSROOT:	/cvs/cluster
Module name:	conga
Branch: 	RHEL5
Changes by:	rmccabe at sourceware.org	2006-10-31 17:28:04

Modified files:
	luci/cluster   : form-macros index_html resource-form-macros 
	                 resource_form_handlers.js 
	luci/homebase  : form-macros index_html 
	luci/logs      : index_html 
	luci/site/luci/Extensions: LuciSyslog.py ModelBuilder.py 
	                           cluster_adapters.py 
	                           homebase_adapters.py ricci_bridge.py 
	                           ricci_communicator.py 

Log message:
	fixes (or at least improvements) for bz#s: 212021, 212632, 212006, 212022, 212440, 212991, 212584, 213057

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/cluster/form-macros.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.90.2.1&r2=1.90.2.2
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/cluster/index_html.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.20&r2=1.20.2.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/cluster/resource-form-macros.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.21&r2=1.21.2.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/cluster/resource_form_handlers.js.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.20&r2=1.20.2.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/homebase/form-macros.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.44&r2=1.44.2.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/homebase/index_html.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.18&r2=1.18.2.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/logs/index_html.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.1.2.2&r2=1.1.2.3
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/LuciSyslog.py.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.2.2.1&r2=1.2.2.2
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/ModelBuilder.py.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.8.2.1&r2=1.8.2.2
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.7&r2=1.120.2.8
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.2.2&r2=1.34.2.3
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.4&r2=1.30.2.5
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.2.1&r2=1.9.2.2

--- conga/luci/cluster/form-macros	2006/10/25 01:53:33	1.90.2.1
+++ conga/luci/cluster/form-macros	2006/10/31 17:28:03	1.90.2.2
@@ -21,10 +21,10 @@
     <span tal:define="global nodereports isBusy/nodereports"/>
     <span tal:repeat="nodereport nodereports">
 		 <tr><td>
-      <span tal:condition="python: nodereport['isnodecreation'] == False">
+      <span tal:condition="python: not 'isnodecreation' in nodereport or nodereport['isnodecreation'] == False">
 			  <h2><span tal:content="nodereport/desc" /></h2>
       </span>
-      <span tal:condition="python: nodereport['isnodecreation'] == True">
+      <span tal:condition="python: 'isnodecreation' in nodereport and nodereport['isnodecreation'] == True">
        <span tal:condition="python: nodereport['iserror'] == True">
 			  <h2><span tal:content="nodereport/desc" /></h2>
          <font color="red"><span tal:content="nodereport/errormessage"/></font>
@@ -2060,6 +2060,7 @@
 		set_page_title('Luci ??? cluster ??? services ??? Configure a service');
 	</script>
 	<tal:block metal:use-macro="here/form-macros/macros/service-config-head-macro" />
+
 	<table class="cluster service" width="100%">
 		<tr class="cluster service info_top">
 			<td class="cluster service service_name">
@@ -2070,6 +2071,8 @@
 			</td>
 			<td class="cluster service service_action">
 				<form method="post" onSubmit="return dropdown(this.gourl)">
+					<input type="hidden" name="pagetype" tal:attributes="
+						value request/pagetype | request/form/pagetype | nothing" />
 					<select name="gourl"
 						tal:define="global innermap sinfo/innermap;
 						starturls innermap/links">
--- conga/luci/cluster/index_html	2006/10/16 20:25:33	1.20
+++ conga/luci/cluster/index_html	2006/10/31 17:28:03	1.20.2.1
@@ -212,24 +212,16 @@
 
 
              <metal:main-form-content use-macro="here/form-chooser/macros/main-form">
-                <h1>Future Site of Forms</h1>
              </metal:main-form-content>
-                  </div>
-
-                </div>
-
-              </metal:block>
-
-		<span tal:omit-tag=""
-			tal:define="global ret python: request.SESSION.get('checkRet')"
-		/>
 
+	<tal:block tal:condition="python: request.SESSION.has_key('checkRet')"
+		tal:define="ret python: request.SESSION.get('checkRet')">
 		<div class="retmsgs" id="retmsgsdiv" tal:condition="python:(ret and 'messages' in ret and len(ret['messages']))">
 			<div class="hbclosebox">
 				<a href="javascript:hide_element('retmsgsdiv');"><img src="../homebase/x.png"></a>
 			</div>
 			<ul class="retmsgs">
-				<tal:block repeat="e python:ret['messages']">
+				<tal:block tal:repeat="e python:ret['messages']">
 					<li class="retmsgs" tal:content="python:e" />
 				</tal:block>
 			</ul>
@@ -241,11 +233,17 @@
 			</div>
 			<p class="errmsgs">The following errors occurred:</p>
 			<ul class="errmsgs">
-				<tal:block repeat="e python:ret['errors']">
+				<tal:block tal:repeat="e python:ret['errors']">
 					<li class="errmsgs" tal:content="python:e" />
 				</tal:block>
 			</ul>
 		</div>
+	</tal:block>
+                  </div>
+
+                </div>
+
+              </metal:block>
             </td>
             <tal:comment replace="nothing"> End of main content block </tal:comment>
 
--- conga/luci/cluster/resource-form-macros	2006/10/16 04:26:19	1.21
+++ conga/luci/cluster/resource-form-macros	2006/10/31 17:28:03	1.21.2.1
@@ -199,9 +199,8 @@
 		src="/luci/cluster/resource_form_handlers.js">
 	</script>
 
-	<tal:block
-		tal:define="
-			global res python: here.getResourceInfo(modelb, request);" />
+	<tal:block tal:define="
+		global res python: here.getResourceInfo(modelb, request);" />
 
 	<h2>Add a Resource</h2>
 
--- conga/luci/cluster/resource_form_handlers.js	2006/10/07 20:12:47	1.20
+++ conga/luci/cluster/resource_form_handlers.js	2006/10/31 17:28:03	1.20.2.1
@@ -140,7 +140,7 @@
 function validate_filesystem(form) {
 	var errors = new Array();
 
-	if (!form.fsTypeSelect || str_is_blank(form.fsTypeSelect.value)) {
+	if (!form.fstype || str_is_blank(form.fstype.value)) {
 		errors.push('No file system type was given.');
 		set_form_err(form.fsTypeSelect);
 	} else
--- conga/luci/homebase/form-macros	2006/10/16 20:46:46	1.44
+++ conga/luci/homebase/form-macros	2006/10/31 17:28:04	1.44.2.1
@@ -1,7 +1,7 @@
 <html>
 
 <tal:comment tal:replace="nothing">
-	$Id: form-macros,v 1.44 2006/10/16 20:46:46 rmccabe Exp $
+	$Id: form-macros,v 1.44.2.1 2006/10/31 17:28:04 rmccabe Exp $
 </tal:comment>
 
 <head>
@@ -554,8 +554,11 @@
 		set_page_title('Luci ??? homebase ??? Add a running cluster to be managed by Luci');
 	</script>
 
-	<tal:block tal:define="
-		global sessionObj python:request.SESSION.get('checkRet')" />
+	<tal:block tal:condition="python: request.SESSION.has_key('checkRet')"
+		tal:define="global sessionObj python:request.SESSION.get('checkRet')" />
+
+	<tal:block tal:condition="python: not request.SESSION.has_key('checkRet')"
+		tal:define="global sessionObj python:{}" />
 
 	<h2 class="homebase">Add Cluster</h2>
 
--- conga/luci/homebase/index_html	2006/10/09 16:16:11	1.18
+++ conga/luci/homebase/index_html	2006/10/31 17:28:04	1.18.2.1
@@ -15,7 +15,7 @@
 					xml:lang language">
 
 <tal:comment replace="nothing">
-	$Id: index_html,v 1.18 2006/10/09 16:16:11 rmccabe Exp $
+	$Id: index_html,v 1.18.2.1 2006/10/31 17:28:04 rmccabe Exp $
 </tal:comment>
 
 <head metal:use-macro="here/header/macros/html_header">
@@ -133,16 +133,15 @@
 				Homebase
 			</metal:main_form>
 
-		<span tal:omit-tag=""
-			tal:define="global ret python: request.SESSION.get('checkRet')"
-		/>
+	<tal:block tal:condition="python: request.SESSION.has_key('checkRet')"
+		tal:define="ret python: request.SESSION.get('checkRet')">
 
 		<div class="retmsgs" id="retmsgsdiv" tal:condition="python:(ret and 'messages' in ret and len(ret['messages']))">
 			<div class="hbclosebox">
 				<a href="javascript:hide_element('retmsgsdiv');"><img src="x.png"></a>
 			</div>
 			<ul class="retmsgs">
-				<tal:block repeat="e python:ret['messages']">
+				<tal:block tal:repeat="e python:ret['messages']">
 					<li class="retmsgs" tal:content="python:e" />
 				</tal:block>
 			</ul>
@@ -154,11 +153,12 @@
 			</div>
 			<p class="errmsgs">The following errors occurred:</p>
 			<ul class="errmsgs">
-				<tal:block repeat="e python:ret['errors']">
+				<tal:block tal:repeat="e python:ret['errors']">
 					<li class="errmsgs" tal:content="python:e" />
 				</tal:block>
 			</ul>
 		</div>
+	</tal:block>
 
 
 				  </div>
--- conga/luci/logs/index_html	2006/10/25 16:04:13	1.1.2.2
+++ conga/luci/logs/index_html	2006/10/31 17:28:04	1.1.2.3
@@ -44,18 +44,61 @@
     </metal:javascriptslot>
   </head>
 
-  <script type="text/javascript">
-	function delWaitBox() {
-		var waitbox = document.getElementById('waitbox');
-		if (!waitbox)
-			return (-1);
-		waitbox.parentNode.removeChild(waitbox);
-		return (0);
-	}
-  </script>
 
-  <body onLoad="javascript:delWaitBox()"
-		tal:attributes="class here/getSectionFromURL;
+
+<script language="javascript" type="text/javascript">
+
+var xmlHttp_object = false;
+
+function initiate_async_get(url, funct) {
+  xmlHttp_object = false;
+
+  /*@cc_on @*/
+  /*@if (@_jscript_version >= 5)
+  try {
+    xmlHttp_object = new ActiveXObject("Msxml2.XMLHTTP");
+  } catch (e) {
+    try {
+      xmlHttp_object = new ActiveXObject("Microsoft.XMLHTTP");
+    } catch (e2) {
+      xmlHttp_object = false;
+    }
+  }
+  @end @*/
+
+  if (!xmlHttp_object && typeof XMLHttpRequest != 'undefined') {
+    xmlHttp_object = new XMLHttpRequest();
+  }
+
+  if (xmlHttp_object) {
+    xmlHttp_object.open("GET", url, true);
+    xmlHttp_object.onreadystatechange = funct;
+    xmlHttp_object.send(null);
+  } else {
+    alert("Unable to initiate async GET");
+  }
+}
+
+function replace_loginfo_callback() {
+  if (xmlHttp_object.readyState == 4) {
+    if (xmlHttp_object.status == 200) {
+        var response = xmlHttp_object.responseText;
+        document.getElementById('log_entries').innerHTML = response;
+    } else {
+        alert("Error retrieving data from server");
+    }
+  }
+}
+function replace_loginfo(url) {
+  initiate_async_get(url, replace_loginfo_callback);
+}
+</script>
+
+  <body tal:define="nodename     request/nodename;
+                    log_url      context/logs/log_provider/absolute_url;
+                    log_url_full python:log_url + '?nodename=' + nodename"
+        tal:attributes="onload python:'replace_loginfo(\'' + log_url_full + '\')';
+                        class here/getSectionFromURL;
                         dir python:test(isRTL, 'rtl', 'ltr')">
     <div id="visual-portal-wrapper">
 
@@ -69,16 +112,26 @@
 
       <div class="visualClear"><!-- --></div>
 
-	  <div id="waitbox">
-		<span>
-			Log information for <span tal:replace="request/nodename | string: host"/> is being retrieved...
-		</span>
-	    <img src="/luci/storage/100wait.gif">
-	  </div>
-
       <div id="log_data">
 		<h2>Recent log information for <span tal:replace="request/nodename | string: host"/></h2>
-          <pre tal:content="structure python: here.getLogsForNode(request)" />
+
+		
+  <div id="log_entries">   
+   <table style="width: 100%;">
+    <tr>
+     <td align="center">
+      <img src="../storage/100wait.gif" style="padding-top: 1cm;"/>
+     </td>
+    </tr>
+    <tr>
+     <td align="center">
+      <div style="padding-bottom: 4cm;">Retrieving log info</div>
+     </td>
+    </tr>
+   </table>
+  </div>
+
+
       </div>
 </body>
 </html>
--- conga/luci/site/luci/Extensions/LuciSyslog.py	2006/10/24 16:36:23	1.2.2.1
+++ conga/luci/site/luci/Extensions/LuciSyslog.py	2006/10/31 17:28:04	1.2.2.2
@@ -50,7 +50,7 @@
 		try:
 			syslog(LOG_DEBUG, msg)
 		except:
-			raise LuciSyslogError, 'syslog debug calle failed'
+			raise LuciSyslogError, 'syslog debug call failed'
 
 	def debug(self, msg):
 		if not LUCI_DEBUG_MODE or not self.__init:
@@ -58,7 +58,7 @@
 		try:
 			syslog(LOG_DEBUG, msg)
 		except:
-			raise LuciSyslogError, 'syslog debug calle failed'
+			raise LuciSyslogError, 'syslog debug call failed'
 
 	def close(self):
 		try:
--- conga/luci/site/luci/Extensions/ModelBuilder.py	2006/10/24 01:42:52	1.8.2.1
+++ conga/luci/site/luci/Extensions/ModelBuilder.py	2006/10/31 17:28:04	1.8.2.2
@@ -416,9 +416,9 @@
 
     return True
   
-  def exportModelAsString(self, strbuf):
+  def exportModelAsString(self):
     if self.perform_final_check() == False: # failed
-      return False
+      return None
     
     #check for dual power fences
     self.dual_power_fence_check()
@@ -438,7 +438,7 @@
       #can be used
       self.purgePCDuplicates()
 
-    return True
+    return strbuf
   
   def has_filepath(self):
     if self.filename == None:
--- conga/luci/site/luci/Extensions/cluster_adapters.py	2006/10/30 20:43:25	1.120.2.7
+++ conga/luci/site/luci/Extensions/cluster_adapters.py	2006/10/31 17:28:04	1.120.2.8
@@ -258,7 +258,6 @@
     flag.manage_addProperty(FLAG_DESC,"Creating node " + key + " for cluster " + clusterName, "string")
     flag.manage_addProperty(LAST_STATUS, 0, "int")
 
-
 def validateAddClusterNode(self, request):
 	errors = list()
 	messages = list()
@@ -441,7 +440,7 @@
 			return (False, {'errors': ['An invalid resource type was specified: ' + res_type]})
 
 		try:
-			resObj = resourceAddHandler[res_type](self, dummy_form)
+			resObj = resourceAddHandler[res_type](request, dummy_form)
 		except:
 			luci_log('res type %d is invalid' % res_type)
 			resObj = None
@@ -453,11 +452,32 @@
 	return (True, {'messages': ['This service has been updated.']})
 
 def validateResourceAdd(self, request):
-	return (True, {})
-	
-def validateResourceEdit(self, request):
-	return (True, {})
+	try:
+		res_type = request.form['type'].strip()
+		if not res_type:
+			raise KeyError, 'type is blank'
+	except Exception, e:
+		luci_log.debug_verbose('resourceAdd: type is blank')
+		return (False, {'errors': ['No resource type was given.']})
+
+	errors = list()
+	try:
+		res = resourceAddHandler[res_type](request)
+		if res is None or res[0] is None or res[1] is None:
+			if res and res[2]:
+				errors.extend(res[2])
+			raise Exception, 'An error occurred while adding this resource'
+		modelb = res[1]
+		newres = res[0]
+		addResource(self, request, modelb, newres)
+	except Exception, e:
+		if len(errors) < 1:
+			errors.append('An error occurred while adding this resource')
+		luci_log.debug_verbose('resource error: %s' % str(e))
+		return (False, {'errors': errors})
 
+	return (True, {'messages': ['Resource added successfully']})
+	
 ## Cluster properties form validation routines
 
 def validateMCastConfig(self, form):
@@ -705,7 +725,7 @@
 	21: validateServiceAdd,
 	24: validateServiceAdd,
 	31: validateResourceAdd,
-	33: validateResourceEdit,
+	33: validateResourceAdd,
 	51: validateFenceAdd,
 	50: validateFenceEdit,
 }
@@ -724,9 +744,9 @@
   if request.REQUEST_METHOD == 'POST':
     ret = validatePost(self, request)
     try:
-		request.SESSION.set('checkRet', ret[1])
+      request.SESSION.set('checkRet', ret[1])
     except:
-		request.SESSION.set('checkRet', {})
+      request.SESSION.set('checkRet', {})
   else:
     try: request.SESSION.set('checkRet', {})
     except: pass
@@ -1332,19 +1352,21 @@
 
 def getRicciAgent(self, clustername):
 	#Check cluster permission here! return none if false
-	path = CLUSTER_FOLDER_PATH + clustername
+	path = str(CLUSTER_FOLDER_PATH + clustername)
 
 	try:
 		clusterfolder = self.restrictedTraverse(path)
 		if not clusterfolder:
-			luci_log.debug('cluster folder %s for %s is missing.' \
+			luci_log.debug('GRA: cluster folder %s for %s is missing.' \
 				% (path, clustername))
-			raise
+			raise Exception, 'no cluster folder at %s' % path
 		nodes = clusterfolder.objectItems('Folder')
 		if len(nodes) < 1:
-			luci_log.debug('no cluster nodes for %s found.' % clustername)
-			return None
-	except:
+			luci_log.debug('GRA: no cluster nodes for %s found.' % clustername)
+			raise Exception, 'no cluster nodes were found@%s' % path
+	except Exception, e:
+		luci_log.debug('GRA: cluster folder %s for %s is missing: %s.' \
+			% (path, clustername, str(e)))
 		return None
 
 	cluname = lower(clustername)
@@ -1361,24 +1383,31 @@
 		try:
 			rc = RicciCommunicator(hostname)
 		except RicciError, e:
-			luci_log.debug('ricci error: %s' % str(e))
+			luci_log.debug('GRA: 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' \
+		except Exception, e:
+			luci_log.debug('GRA: cluster_info error: %s' % str(e))
+
+		if cluname != lower(clu_info[0]) and cluname != lower(clu_info[1]):
+			try:
+				luci_log.debug('GRA: %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:
+				setNodeFlag(self, node, CLUSTER_NODE_NOT_MEMBER)
+			except:
+				pass
 			continue
 
 		if rc.authed():
 			return rc
-		setNodeFlag(node[1], CLUSTER_NODE_NEED_AUTH)
+		try:
+			setNodeFlag(node[1], CLUSTER_NODE_NEED_AUTH)
+		except:
+			pass
 
-	luci_log.debug('no ricci agent could be found for cluster %s' % cluname)
+	luci_log.debug('GRA: no ricci agent could be found for cluster %s' % cluname)
 	return None
 
 def getRicciAgentForCluster(self, req):
@@ -1395,23 +1424,14 @@
 	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:
-		return {}
-
-	try:
-		ricci_xml = rc.process_batch(clustatuscmd_xml, async=False)
-	except RicciError, e:
-		luci_log.debug('ricci error: %s', str(e))
-	except:
+	doc = getClusterStatusBatch(rc)
+	if not doc:
+		try:
+			luci_log.debug_verbose('getClusterStatusBatch returned None for %s/%s' % rc.cluster_info())
+		except:
+			pass
 		return {}
 
-	doc = getPayload(ricci_xml)
-	if not doc or not doc.firstChild:
-		return {}
 	results = list()
 
 	vals = {}
@@ -1617,6 +1637,7 @@
 		try:
 			svcname = req.form['servicename']
 		except:
+			luci_log.debug_verbose('serviceStart error: no service name')
 			return None
 
 	try:
@@ -1625,91 +1646,160 @@
 		try:
 			nodename = req.form['nodename']
 		except:
-			return None
+			nodename = None
+
+	cluname = None
 	try:
 		cluname = req['clustername']
 	except KeyError, e:
 		try:
-			cluname = req.form['clusterName']
+			cluname = req.form['clustername']
 		except:
-			return None
+			pass
+
+	if cluname is None:
+		luci_log.debug_verbose('serviceStart error: %s no service name' \
+			% svcname)
+		return None
 
 	ricci_agent = rc.hostname()
 
 	batch_number, result = startService(rc, svcname, nodename)
-	#Now we need to create a DB flag for this system.
+	if batch_number is None or result is None:
+		luci_log.debug_verbose('startService %s call failed' \
+			% svcname)
+		return None
 
-	path = CLUSTER_FOLDER_PATH + cluname
-	clusterfolder = self.restrictedTraverse(path)
+	#Now we need to create a DB flag for this system.
+	path = str(CLUSTER_FOLDER_PATH + cluname)
 	batch_id = str(batch_number)
-	objname = ricci_agent + "____flag"
-	clusterfolder.manage_addProduct['ManagedSystem'].addManagedSystem(objname)
-	#Now we need to annotate the new DB object
-	objpath = path + "/" + objname
-	flag = self.restrictedTraverse(objpath)
-	#flag[BATCH_ID] = batch_id
-	#flag[TASKTYPE] = SERVICE_START
-	#flag[FLAG_DESC] = "Starting service " + svcname
-	flag.manage_addProperty(BATCH_ID,batch_id, "string")
-	flag.manage_addProperty(TASKTYPE,SERVICE_START, "string")
-	flag.manage_addProperty(FLAG_DESC,"Starting service \'" + svcname + "\'", "string")
+	objname = str(ricci_agent + "____flag")
+
+	try:
+		clusterfolder = self.restrictedTraverse(path)
+		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, SERVICE_START, "string")
+		flag.manage_addProperty(FLAG_DESC, "Starting service \'" + svcname + "\'", "string")
+	except Exception, e:
+		luci_log.debug_verbose('Error creating flag at %s: %s' % (objpath, str(e)))
+
 	response = req.RESPONSE
 	response.redirect(req['HTTP_REFERER'] + "&busyfirst=true")
 
 def serviceRestart(self, rc, req):
-  svcname = req['servicename']
-  batch_number, result = restartService(rc, svcname)
+	try:
+		svcname = req['servicename']
+	except KeyError, e:
+		try:
+			svcname = req.form['servicename']
+		except:
+			luci_log.debug_verbose('no service name for serviceRestart')
+			return None
+	except:
+		luci_log.debug_verbose('no service name for serviceRestart')
+		return None
 
-  ricci_agent = rc.hostname()
-  #Now we need to create a DB flag for this system.
-  cluname = req['clustername']
-
-  path = CLUSTER_FOLDER_PATH + cluname
-  clusterfolder = self.restrictedTraverse(path)
-  batch_id = str(batch_number)
-  objname = ricci_agent + "____flag"
-  clusterfolder.manage_addProduct['ManagedSystem'].addManagedSystem(objname)
-  #Now we need to annotate the new DB object
-  objpath = path + "/" + objname
-  flag = self.restrictedTraverse(objpath)
-  #flag[BATCH_ID] = batch_id
-  #flag[TASKTYPE] = SERVICE_RESTART
-  #flag[FLAG_DESC] = "Restarting service " + svcname
-  flag.manage_addProperty(BATCH_ID,batch_id, "string")
-  flag.manage_addProperty(TASKTYPE,SERVICE_RESTART, "string")
-  flag.manage_addProperty(FLAG_DESC,"Restarting service " + svcname, "string")
+	#Now we need to create a DB flag for this system.
+	cluname = None
+	try:
+		cluname = req['clustername']
+	except:
+		try:
+			cluname = req.form['clustername']
+		except:
+			pass
 
-  response = req.RESPONSE
-  response.redirect(req['HTTP_REFERER'] + "&busyfirst=true")
+	if cluname is None:
+		luci_log.debug_verbose('unable to determine cluser name for serviceRestart %s' % svcname)
+		return None
+
+	batch_number, result = restartService(rc, svcname)
+	if batch_number is None or result is None:
+		luci_log.debug_verbose('restartService for %s failed' % svcname)
+		return None
+				
+	ricci_agent = rc.hostname()
+
+	path = str(CLUSTER_FOLDER_PATH + cluname)
+	batch_id = str(batch_number)
+	objname = str(ricci_agent + "____flag")
+
+	try:
+		clusterfolder = self.restrictedTraverse(path)
+		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, SERVICE_RESTART, "string")
+		flag.manage_addProperty(FLAG_DESC, "Restarting service " + svcname, "string")
+	except Exception, e:
+		luci_log.debug_verbose('Error creating flag in restartService %s: %s' \
+			% (svcname, str(e)))
+
+	response = req.RESPONSE
+	response.redirect(req['HTTP_REFERER'] + "&busyfirst=true")
 
 def serviceStop(self, rc, req):
-  svcname = req['servicename']
-  batch_number, result = stopService(rc, svcname)
+	try:
+		svcname = req['servicename']
+	except KeyError, e:
+		try:
+			svcname = req.form['servicename']
+		except:
+			luci_log.debug_verbose('no service name for serviceStop')
+			return None
+	except:
+		luci_log.debug_verbose('no service name for serviceStop')
+		return None
+
+	#Now we need to create a DB flag for this system.
+	cluname = None
+	try:
+		cluname = req['clustername']
+	except:
+		try:
+			cluname = req.form['clustername']
+		except:
+			pass
 
-  #Now we need to create a DB flag for this system.
-  cluname = req['clustername']
+	if cluname is None:
+		luci_log.debug_verbose('unable to determine cluser name for serviceStop %s' % svcname)
+		return None
 
-  ricci_agent = rc.hostname()
+	batch_number, result = stopService(rc, svcname)
+	if batch_number is None or result is None:
+		luci_log.debug_verbose('stopService for %s failed' % svcname)
+		return None
+
+	ricci_agent = rc.hostname()
 
-  path = CLUSTER_FOLDER_PATH + cluname
-  clusterfolder = self.restrictedTraverse(path)
-  batch_id = str(batch_number)
-  objname = ricci_agent + "____flag"
-  clusterfolder.manage_addProduct['ManagedSystem'].addManagedSystem(objname)
-  #Now we need to annotate the new DB object
-  objpath = path + "/" + objname
-  flag = self.restrictedTraverse(objpath)
-  #flag[BATCH_ID] = batch_id
-  #flag[TASKTYPE] = SERVICE_STOP
-  #flag[FLAG_DESC] = "Stopping service " + svcname
-  flag.manage_addProperty(BATCH_ID,batch_id,"string")
-  flag.manage_addProperty(TASKTYPE,SERVICE_STOP, "string")
-  flag.manage_addProperty(FLAG_DESC,"Stopping service " + svcname,"string")
+	path = str(CLUSTER_FOLDER_PATH + cluname)
+	batch_id = str(batch_number)
+	objname = str(ricci_agent + "____flag")
+
+	try:
+		clusterfolder = self.restrictedTraverse(path)
+		clusterfolder.manage_addProduct['ManagedSystem'].addManagedSystem(objname)
+		#Now we need to annotate the new DB object
+		objpath = str(path + "/" + objname)
+		flag = self.restrictedTraverse(objpath)
 
-  time.sleep(2)
+		flag.manage_addProperty(BATCH_ID, batch_id, "string")
+		flag.manage_addProperty(TASKTYPE, SERVICE_STOP, "string")
+		flag.manage_addProperty(FLAG_DESC, "Stopping service " + svcname, "string")
+		time.sleep(2)
+	except Exception, e:
+		luci_log.debug_verbose('Error creating flags for stopService %s: %s' \
+			% (svcname, str(e)))
 
-  response = req.RESPONSE
-  response.redirect(req['HTTP_REFERER'] + "&busyfirst=true")
+	response = req.RESPONSE
+	response.redirect(req['HTTP_REFERER'] + "&busyfirst=true")
 
 def getFdomsInfo(self, modelb, request, clustatus):
   slist = list()
@@ -2008,7 +2098,7 @@
 		clustername = request['clustername']
 	except KeyError, e:
 		try:
-			clustername = request.form['clusterName']
+			clustername = request.form['clustername']
 		except:
 			luci_log.debug('missing cluster name for NTP')
 			return None
@@ -2105,16 +2195,20 @@
 			return None
 
 		batch_number, result = nodeLeaveCluster(rc)
-		batch_id = str(batch_number)
+		if batch_number is None or result is None:
+			luci_log.debug_verbose('nodeLeaveCluster error: batch_number and/or result is None')
+			return None
 
+		batch_id = str(batch_number)
 		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")
+			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)
 
@@ -2123,34 +2217,52 @@
 		response.redirect(request['URL'] + "?pagetype=" + CLUSTER_CONFIG + "&clustername=" + clustername)
 	elif task == NODE_JOIN_CLUSTER:
 		batch_number, result = nodeJoinCluster(rc)
-		path = CLUSTER_FOLDER_PATH + clustername + "/" + nodename_resolved
-		nodefolder = self.restrictedTraverse(path)
+		if batch_number is None or result is None:
+			luci_log.debug_verbose('nodeJoin error: batch_number and/or result is None')
+			return None
+
+		path = str(CLUSTER_FOLDER_PATH + clustername + "/" + nodename_resolved)
 		batch_id = str(batch_number)
-		objname = nodename_resolved + "____flag"
-		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_JOIN_CLUSTER, "string")
-		flag.manage_addProperty(FLAG_DESC,"Node \'" + nodename + "\' joining cluster", "string")
+		objname = str(nodename_resolved + "____flag")
+		objpath = str(path + "/" + objname)
+
+		try:
+			nodefolder = self.restrictedTraverse(path)
+			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_JOIN_CLUSTER, "string")
+			flag.manage_addProperty(FLAG_DESC, "Node \'" + nodename + "\' joining cluster", "string")
+		except Exception, e:
+			luci_log.debug_verbose('nodeJoin error: creating flags at %s: %s' \
+				% (path, str(e)))
 
 		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_REBOOT:
 		batch_number, result = nodeReboot(rc)
-		path = CLUSTER_FOLDER_PATH + clustername + "/" + nodename_resolved
-		nodefolder = self.restrictedTraverse(path)
+		if batch_number is None or result is None:
+			luci_log.debug_verbose('nodeReboot: batch_number and/or result is None')
+			return None
+
+		path = str(CLUSTER_FOLDER_PATH + clustername + "/" + nodename_resolved)
 		batch_id = str(batch_number)
-		objname = nodename_resolved + "____flag"
-		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_REBOOT, "string")
-		flag.manage_addProperty(FLAG_DESC, "Node \'" + nodename + "\' is being rebooted", "string")
+		objname = str(nodename_resolved + "____flag")
+		objpath = str(path + "/" + objname)
+
+		try:
+			nodefolder = self.restrictedTraverse(path)
+			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_REBOOT, "string")
+			flag.manage_addProperty(FLAG_DESC, "Node \'" + nodename + "\' is being rebooted", "string")
+		except Exception, e:
+			luci_log.debug_verbose('nodeReboot err: creating flags at %s: %s' \
+				% (path, str(e)))
 
 		response = request.RESPONSE
 		#Once again, is this correct? Should we re-direct to the cluster page?
@@ -2161,16 +2273,19 @@
 		try:
 			clusterfolder = self.restrictedTraverse(path)
 			if not clusterfolder:
-				raise
-		except:
-			luci_log.debug('The cluster folder for %s could not be found.' \
-				 % clustername)
+				raise Exception, 'no cluster folder at %s' % path
+		except Exception, e:
+			luci_log.debug('The cluster folder for %s could not be found: %s' \
+				 % (clustername, str(e)))
 			return None
 
 		try:
 			nodes = clusterfolder.objectItems('Folder')
-		except:
-			luci_log.debug('No cluster nodes for %s were found' % clustername)
+			if not nodes or len(nodes) < 1:
+				raise Exception, 'no cluster nodes'
+		except Exception, e:
+			luci_log.debug('No cluster nodes for %s were found: %s' \
+				% (clustername, str(e)))
 			return None
 
 		found_one = False
@@ -2210,17 +2325,26 @@
 			return None
 
 		batch_number, result = nodeFence(rc, nodename)
-		path = path + "/" + nodename_resolved
-		nodefolder = self.restrictedTraverse(path)
+		if batch_number is None or result is None:
+			luci_log.debug_verbose('nodeFence: batch_number and/or result is None')
+			return None
+
+		path = str(path + "/" + nodename_resolved)
 		batch_id = str(batch_number)
-		objname = nodename_resolved + "____flag"
-		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_FENCE, "string")
-		flag.manage_addProperty(FLAG_DESC,"Node \'" + nodename + "\' is being fenced", "string")
+		objname = str(nodename_resolved + "____flag")
+		objpath = str(path + "/" + objname)
+
+		try:
+			nodefolder = self.restrictedTraverse(path)
+			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_FENCE, "string")
+			flag.manage_addProperty(FLAG_DESC, "Node \'" + nodename + "\' is being fenced", "string")
+		except Exception, e:
+			luci_log.debug_verbose('nodeFence err: creating flags at %s: %s' \
+				% (path, str(e)))
 
 		response = request.RESPONSE
 		#Once again, is this correct? Should we re-direct to the cluster page?
@@ -2231,17 +2355,25 @@
 		#and propogate it. We will need two ricci agents for this task.
 
 		# Make sure we can find a second node before we hose anything.
-		path = CLUSTER_FOLDER_PATH + clustername
+		path = str(CLUSTER_FOLDER_PATH + clustername)
 		try:
 			clusterfolder = self.restrictedTraverse(path)
 			if not clusterfolder:
-				raise
-		except:
+				raise Exception, 'no cluster folder at %s' % path
+		except Exception, e:
+			luci_log.debug_verbose('node delete error for cluster %s: %s' \
+				% (clustername, str(e)))
 			return None
 
-		nodes = clusterfolder.objectItems('Folder')
-		found_one = False
+		try:
+			nodes = clusterfolder.objectItems('Folder')
+			if not nodes or len(nodes) < 1:
+				raise Exception, 'no cluster nodes in DB'
+		except Exception, e:
+			luci_log.debug_verbose('node delete error for cluster %s: %s' \
+				% (clustername, str(e)))
 
+		found_one = False
 		for node in nodes:
 			if node[1].getId().find(nodename) != (-1):
 				continue
@@ -2250,47 +2382,75 @@
 			# in the cluster we believe it is.
 			try:
 				rc2 = RicciCommunicator(node[1].getId())
-				if not rc2.authed():
-					# set the flag
-					rc2 = None
-				if not rc2:
-					raise
-				found_one = True
-				break
+			except Exception, e:
+				luci_log.info('ricci %s error: %s' % (node[0], str(e)))
+				continue
 			except:
 				continue
 
+			if not rc2.authed():
+				try:
+					setNodeFlag(node[1], CLUSTER_NODE_NEED_AUTH)
+				except:
+					pass
+
+				try:
+					snode = getStorageNode(self, node[0])
+					setNodeFlag(snode, CLUSTER_NODE_NEED_AUTH)
+				except:
+					pass
+
+				luci_log.debug_verbose('%s is not authed' % node[0])
+				rc2 = None
+				continue
+			else:
+				found_one = True
+				break
+
 		if not found_one:
+			luci_log.debug_verbose('unable to find ricci node to delete %s from %s' % (nodename, clustername))
 			return None
 
 		#First, delete cluster.conf from node to be deleted.
 		#next, have node leave cluster.
 		batch_number, result = nodeLeaveCluster(rc, purge=True)
+		if batch_number is None or result is None:
+			luci_log.debug_verbose('nodeDelete: batch_number and/or result is None')
+			return None
 
 		#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
 		#and send out new cluster.conf
 		delete_target = None
-		try:
-			nodelist = model.getNodes()
-			find_node = lower(nodename)
-			for n in nodelist:
+		nodelist = model.getNodes()
+		find_node = lower(nodename)
+		for n in nodelist:
+			try:
 				if lower(n.getName()) == find_node:
 					delete_target = n
 					break
-		except:
-			pass
+			except:
+				continue
 
 		if delete_target is None:
+			luci_log.debug_verbose('unable to find delete target for %s in %s' \
+				% (nodename, clustername))
 			return None
 
 		model.deleteNode(delete_target)
-		str_buf = ""
-		model.exportModelAsString(str_buf)
+
+		try:
+			str_buf = model.exportModelAsString()
+			if not str_buf:
+				raise Exception, 'model string is blank'
+		except Exception, e:
+			luci_log.debug_verbose('NTP exportModelAsString: %s' % str(e))
+			return None
 
 		# propagate the new cluster.conf via the second node
 		batch_number, result = setClusterConf(rc2, str(str_buf))
 		if batch_number is None:
+			luci_log.debug_verbose('batch number is None after del node in NTP')
 			return None
 
 		#Now we need to delete the node from the DB
@@ -2301,19 +2461,24 @@
 			delnode = self.restrictedTraverse(del_path)
 			clusterfolder = self.restrictedTraverse(path)
 			clusterfolder.manage_delObjects(delnode[0])
-		except:
-			# XXX - we need to handle this
-			pass
+		except Exception, e:
+			luci_log.debug_verbose('error deleting %s: %s' % (del_path, str(e)))
 
 		batch_id = str(batch_number)
 		objname = str(nodename_resolved + "____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,NODE_DELETE, "string")
-		flag.manage_addProperty(FLAG_DESC,"Deleting node \'" + nodename + "\'", "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, NODE_DELETE, "string")
+			flag.manage_addProperty(FLAG_DESC, "Deleting node \'" + nodename + "\'", "string")
+		except Exception, e:
+			luci_log.debug_verbose('nodeDelete %s err setting flag at %s: %s' \
+				% (nodename, objpath, str(e)))
+
 		response = request.RESPONSE
 		response.redirect(request['HTTP_REFERER'] + "&busyfirst=true")
 
@@ -2670,12 +2835,28 @@
     xvm.addAttribute("name", req.form['xenvmname'])
     xvm.addAttribute("path", req.form['xenvmpath'])
 
-  stringbuf = ""
-  model.exportModelAsString(stringbuf)
-  setClusterConf(stringbuf)
+  try:
+    stringbuf = model.exportModelAsString()
+    if not stringbuf:
+   	  raise Exception, 'model is blank'
+  except Exception, e:
+    luci_log.debug_verbose('exportModelAsString error: %s' % str(e))
+    return None
 
-  
-    
+  try:
+    clustername = model.getClusterName()
+    if not clustername:
+      raise Exception, 'cluster name from modelb.getClusterName() is blank'
+  except Exception, e:
+    luci_log.debug_verbose('error: getClusterName: %s' % str(e))
+    return None
+
+  rc = getRicciAgent(self, clustername)
+  if not rc:
+    luci_log.debug_verbose('Unable to find a ricci agent for the %s cluster' % clustername)
+    return None
+
+  setClusterConf(rc, stringbuf)
 
 def getXenVMInfo(self, model, request):
 	try:
@@ -2717,31 +2898,35 @@
       try:
         cluname = req.form['clusterName']
       except:
-        luci_log.debug_verbose('No cluster name -- returning empty map')
+        luci_log.debug_verbose('ICB0: No cluster name -- returning empty map')
         return map
 
-  path = CLUSTER_FOLDER_PATH + cluname
+  path = str(CLUSTER_FOLDER_PATH + cluname)
   try:
-    clusterfolder = self.restrictedTraverse(str(path))
+    clusterfolder = self.restrictedTraverse(path)
     if not clusterfolder:
       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)))
+    luci_log.debug_verbose('ICB1: 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))
+    luci_log.debug_verbose('ICB2: cluster %s [%s] folder missing: returning empty map' % (cluname, path))
 
   try:
     items = clusterfolder.objectItems('ManagedSystem')
     if not items or len(items) < 1:
+      luci_log.debug_verbose('ICB3: no flags at %s for cluster %s' \
+          % (cluname, path))
       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)))
+    luci_log.debug('ICB4: 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 at path %s' % (cluname, path))
+    luci_log.debug('ICB5: An error occurred while looking for cluster %s flags@path %s' % (cluname, path))
     return map
-    
+
+  luci_log.debug_verbose('ICB6: isClusterBusy: %s is busy: %d flags' \
+      % (cluname, len(items)))
   map['busy'] = "true"
   #Ok, here is what is going on...if there is an item,
   #we need to call the ricci_bridge and get a batch report.
@@ -2771,31 +2956,58 @@
       batch_xml = None
       ricci = item[0].split("____") #This removes the 'flag' suffix
 
+      luci_log.debug_verbose('ICB6A: using host %s for rc for item %s' \
+          % (ricci[0], item[0]))
       try:
         rc = RicciCommunicator(ricci[0])
+        if not rc:
+          rc = None
+          raise RicciError, 'rc is None for %s' % ricci[0]
       except RicciError, e:
         rc = None
-        luci_log.debug_verbose('ricci returned error in iCB for %s: %s' \
+        luci_log.debug_verbose('ICB7: ricci returned error in iCB for %s: %s' \
           % (cluname, str(e)))
       except:
         rc = None
-        luci_log.info('ricci connection failed for cluster %s' % cluname)
+        luci_log.info('ICB8: ricci connection failed for cluster %s' % cluname)
 
+      batch_id = None
       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:
+          batch_id = item[1].getProperty(BATCH_ID)
+          luci_log.debug_verbose('ICB8A: got batch_id %s from %s' \
+              % (batch_id, item[0]))
+        except Exception, e:
+          try:
+            luci_log.debug_verbose('ICB8B: failed to get batch_id from %s: %s' \
+                % (item[0], str(e)))
+          except:
+            luci_log.debug_verbose('ICB8C: failed to get batch_id from %s' % item[0])
+
+        if batch_id is not None:
+          try:
+            batch_xml = rc.batch_report(batch_id)
+            if batch_xml is not None:
+              luci_log.debug_verbose('ICB8D: batch_xml for %s from batch_report is not None -- getting batch status' % batch_id)
+              (creation_status, total) = batch_status(batch_xml)
+              try:
+                luci_log.debug_verbose('ICB8E: batch status returned (%d,%d)' \
+                    % (creation_status, total))
+              except:
+                luci_log.debug_verbose('ICB8F: error logging batch status return')
+            else:
+              luci_log.debug_verbose('ICB9: batch_xml for cluster is None')
+          except Exception, e:
+            luci_log.debug_verbose('ICB9A: error getting batch_xml from rc.batch_report: %s' % str(e))
+            creation_status = RICCI_CONNECT_FAILURE  #No contact with ricci (-1000)
+            batch_xml = "bloody_failure" #set to avoid next if statement
+
+      if rc is None or batch_id is None:
+          luci_log.debug_verbose('ICB12: unable to connect to a ricci agent for cluster %s to get batch status')
           creation_status = RICCI_CONNECT_FAILURE  #No contact with ricci (-1000)
-          batch_xml = "bloody_failure" #set to avoid next if statement
+          batch_xml = "bloody_bloody_failure" #set to avoid next if statement
 
-      if batch_xml == None:  #The job is done and gone from queue
+      if batch_xml is None:  #The job is done and gone from queue
         if redirect_message == False: #We have not displayed this message yet
           node_report['desc'] = REDIRECT_MSG
           node_report['iserror'] = True 
@@ -2803,7 +3015,7 @@
           nodereports.append(node_report)
           redirect_message = True
 
-        luci_log.debug_verbose('batch job is done -- deleting %s' % item[0])
+        luci_log.debug_verbose('ICB13: batch job is done -- deleting %s' % item[0])
         clusterfolder.manage_delObjects(item[0])
         continue
 
@@ -2857,7 +3069,7 @@
           try:
               clusterfolder.manage_delObjects(item[0])
           except Exception, e:
-              luci_log.info('Unable to delete %s: %s' % (item[0], str(e)))
+              luci_log.info('ICB14: Unable to delete %s: %s' % (item[0], str(e)))
           continue
         else:
           map['busy'] = "true"
@@ -2917,7 +3129,12 @@
 		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())
+		try:
+			luci_log.debug('An error occurred while attempting to get OS/Virt info for %s -- defaulting to rhel5/False' % rc.hostname())
+		except:
+			# this can throw an exception if the original exception
+			# is caused by rc being None or stale.
+			pass
 		map['os'] = 'rhel5'
 		map['isVirtualized'] = False
 	return map
@@ -2949,15 +3166,30 @@
 	return resList
 
 def getResourceInfo(modelb, request):
+	if not modelb:
+		luci_log.debug_verbose('no modelb obj in getResourceInfo')
+		return {}
+
+	name = None
 	try:
 		name = request['resourcename']
 	except KeyError, e:
 		try:
 			name = request.form['resourcename']
 		except:
-			luci_log.debug_verbose('getResourceInfo missing res name')
-			return {}
+			pass
 	except:
+		pass
+
+	if name is None:
+		try:
+			type = request.form['type']
+			if type == 'ip':
+				name = request.form['value'].strip()
+		except:
+			pass
+
+	if name is None:
 		luci_log.debug_verbose('getResourceInfo missing res name')
 		return {}
 
@@ -2998,7 +3230,7 @@
 	try:
 		modelb = request.SESSION.get('model')
 	except:
-		luci_log.debug_verbose('delResource unable to extract model from SESSION')
+		luci_log.debug_verbose('delRes unable to extract model from SESSION')
 		return errstr
 
 	try:
@@ -3007,10 +3239,10 @@
 		try:
 			name = request.form['resourcename']
 		except:
-			luci_log.debug_verbose('delResource missing resname %s' % str(e))
+			luci_log.debug_verbose('delRes missing resname %s' % str(e))
 			return errstr + ': ' + str(e)
 	except:
-		luci_log.debug_verbose('delResource missing resname')
+		luci_log.debug_verbose('delRes missing resname')
 		return errstr + ': ' + str(e)
 
 	try:
@@ -3019,7 +3251,7 @@
 		try:
 			clustername = request.form['clustername']
 		except:
-			luci_log.debug_verbose('delResource missing cluster name')
+			luci_log.debug_verbose('delRes missing cluster name')
 			return errstr + ': could not determine the cluster name.'
 
 	try:
@@ -3040,20 +3272,20 @@
 			break
 
 	if not found:
-		luci_log.debug_verbose('delresource cant find res %s' % name)
+		luci_log.debug_verbose('delRes cant find res %s' % name)
 		return errstr + ': the specified resource was not found.'
 
 	try:
 		conf = modelb.exportModelAsString()
 		if not conf:
-			raise
-	except:
-		luci_log.debug_verbose('exportModelAsString failed')
+			raise Exception, 'model string is blank'
+	except Exception, e:
+		luci_log.debug_verbose('delRes: exportModelAsString failed: %s' % str(e))
 		return errstr
 
-	batch_number, result = setClusterConf(str(conf))
+	batch_number, result = setClusterConf(rc, str(conf))
 	if batch_number is None or result is None:
-		luci_log.debug_verbose('missing batch and/or result from setClusterConf')
+		luci_log.debug_verbose('delRes: missing batch and/or result from setClusterConf')
 		return errstr
 
 	modelstr = ""
@@ -3071,10 +3303,10 @@
 		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' \
+		luci_log.debug('delRes: An error occurred while setting flag %s: %s' \
 			% (objname, str(e)))
 	except:
-		luci_log.debug('An error occurred while setting flag %s' % objname)
+		luci_log.debug('delRes: An error occurred while setting flag %s' % objname)
 
 	response = request.RESPONSE
 	response.redirect(request['HTTP_REFERER'] + "&busyfirst=true")
@@ -3083,99 +3315,142 @@
 	if form is None:
 		form = request.form
 
+	if not form:
+		luci_log.debug_verbose('addIp error: form is missing')
+		return None
+
 	modelb = request.SESSION.get('model')
-	if not modelb or not form:
+	if not modelb:
+		luci_log.debug_verbose('addIp error: modelb is missing')
 		return None
 
 	if form.has_key('edit'):
 		try:
 			oldname = form['oldname'].strip()
 			if not oldname:
-				raise KeyError('oldname is blank.')
+				raise KeyError, 'oldname is blank.'
 			res = getResourceForEdit(modelb, oldname)
-		except KeyError, e:
+		except Exception, e:
+			luci_log.debug_verbose('addIp error: %s' % str(e))
 			return None
 	else:
-		res = apply(Ip)
+		try:
+			res = apply(Ip)
+			if not res:
+				raise Exception, 'apply(Ip) is None'
+		except Exception, e:
+			luci_log.debug_verbose('addIp error: %s' % str(e))
+			return None
 
 	if not res:
+		luci_log.debug_verbose('addIp error: res is none')
 		return None
 
+	errors = list()
 	try:
 		addr = form['ip_address'].strip()
 		if not addr:
-			raise KeyError('ip_address is blank')
+			raise KeyError, 'ip_address is blank'
 		# XXX: validate IP addr
 		res.attr_hash['address'] = addr
 	except KeyError, e:
-		return None
+		err = str(e)
+		errors.append(err)
+		luci_log.debug_verbose('addIp error: %s' % err)
 
 	if 'monitorLink' in form:
 		res.attr_hash['monitor_link'] = '1'
 	else:
 		res.attr_hash['monitor_link'] = '0'
 
-	modelb.getResourcesPtr().addChild(res)
-	return res
+	if len(errors) > 1:
+		return [None, None, errors]
+	return [res, modelb, None]
 
 def addFs(request, form=None):
 	if form is None:
 		form = request.form
-	modelb = request.SESSION.get('model')
 
-	if not modelb or not form:
+	if not form:
+		luci_log.debug_verbose('addFs error: form is missing')
+		return None
+
+	modelb = request.SESSION.get('model')
+	if not modelb:
+		luci_log.debug_verbose('addFs error: modelb is missing')
 		return None
 
 	if form.has_key('edit'):
 		try:
 			oldname = form['oldname'].strip()
 			if not oldname:
-				raise KeyError('oldname is blank.')
+				raise KeyError, 'oldname is blank.'
 			res = getResourceForEdit(modelb, oldname)
-		except KeyError, e:
+		except Exception, e:
+			luci_log.debug_verbose('addFs error: %s' % str(e))
 			return None
 	else:
-		res = apply(Fs)
+		try:
+			res = apply(Fs)
+			if not res:
+				raise Exception, 'apply(Fs) is None'
+		except Exception, e:
+			luci_log.debug_verbose('addFs error: %s' % str(e))
+			return None
 
 	if not res:
+		luci_log.debug_verbose('addFs error: fs obj was not created')
 		return None
 
 	# XXX: sanity check these fields
+	errors = list()
 	try:
 		name = form['resourceName'].strip()
 		res.attr_hash['name'] = name
-	except:
-		return None
+	except Exception, e:
+		err = str(e)
+		errors.append(err)
+		luci_log.debug_verbose('addFs error: %s' % err)
 
 	try:
 		mountpoint = form['mountpoint'].strip()
 		res.attr_hash['mountpoint'] = mountpoint
-	except:
-		return None
+	except Exception, e:
+		err = str(e)
+		errors.append(err)
+		luci_log.debug_verbose('addFs error: %s' % err)
 
 	try:
 		device = form['device'].strip()
 		res.attr_hash['device'] = device
-	except:
-		return None
+	except Exception, e:
+		err = str(e)
+		errors.append(err)
+		luci_log.debug_verbose('addFs error: %s' % err)
 
 	try:
 		options = form['options'].strip()
 		res.attr_hash['options'] = options
-	except:
-		return None
+	except Exception, e:
+		err = str(e)
+		errors.append(err)
+		luci_log.debug_verbose('addFs error: %s' % err)
 
 	try:
 		fstype = form['fstype'].strip()
 		res.attr_hash['fstype'] = fstype
-	except:
-		return None
+	except Exception, e:
+		err = str(e)
+		errors.append(err)
+		luci_log.debug_verbose('addFs error: %s' % err)
 
 	try:
 		fsid = form['fsid'].strip()
 		res.attr_hash['fsid'] = fsid
-	except:
-		return None
+	except Exception, e:
+		err = str(e)
+		errors.append(err)
+		luci_log.debug_verbose('addFs error: %s' % err)
 
 	if form.has_key('forceunmount'):
 		res.attr_hash['force_unmount'] = '1'
@@ -3192,27 +3467,33 @@
 	else:
 		res.attr_hash['force_fsck'] = '0'
 
-	modelb.getResourcesPtr().addChild(res)
-	return res
+	if len(errors) > 1:
+		return [None, None, errors]
+	return [res, modelb, None]
 
 def addGfs(request, form=None):
 	if form is None:
 		form = request.form
 
+	if not form:
+		luci_log.debug_verbose('addGfs error: form is missing')
+		return None
+
 	modelb = request.SESSION.get('model')
 	if not modelb:
+		luci_log.debug_verbose('addGfs error: modelb is missing')
 		return None
 
 	if form.has_key('edit'):
 		try:
 			oldname = form['oldname'].strip()
 			if not oldname:
-				raise KeyError('oldname is blank.')
+				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:
+		except Exception, e:
 			luci_log.debug('resource %s was not found for editing: %s' \
 				% (oldname, str(e)))
 			return None
@@ -3220,286 +3501,387 @@
 		try:
 			res = apply(Clusterfs)
 			if not res:
-				raise
+				raise Exception, 'apply(Clusterfs) is None'
+		except Exception, e:
+			luci_log.debug('addGfs error: %s' % str(e))
+			return None
 		except:
-			luci_log.debug('Error creating node Clusterfs resource')
+			luci_log.debug('addGfs error')
 			return None
 
 	# XXX: sanity check these fields
+	errors = list()
 	try:
 		name = form['resourceName'].strip()
 		if not name:
-			raise
+			raise KeyError, 'resourceName is blank'
 		res.attr_hash['name'] = name
-	except:
-		luci_log.debug_verbose('name is missing in clusterfs res')
-		return None
+	except Exception, e:
+		err = str(e)
+		errors.append(err)
+		luci_log.debug_verbose('addGfs error: %s' % err)
 
 	try:
 		mountpoint = form['mountpoint'].strip()
 		res.attr_hash['mountpoint'] = mountpoint
-	except:
-		luci_log.debug_verbose('mountpoint is missing in clusterfs res')
-		return None
+	except Exception, e:
+		err = str(e)
+		errors.append(err)
+		luci_log.debug_verbose('addGfs error: %s' % err)
 
 	try:
 		device = form['device'].strip()
 		res.attr_hash['device'] = device
-	except:
-		luci_log.debug_verbose('device is missing in clusterfs res')
-		return None
+	except Exception, e:
+		err = str(e)
+		errors.append(err)
+		luci_log.debug_verbose('addGfs error: %s' % err)
 
 	try:
 		options = form['options'].strip()
 		res.attr_hash['options'] = options
-	except:
-		luci_log.debug_verbose('options is missing in clusterfs res')
-		return None
+	except Exception, e:
+		err = str(e)
+		errors.append(err)
+		luci_log.debug_verbose('addGfs error: %s' % err)
 
 	try:
 		fsid = form['fsid'].strip()
 		res.attr_hash['fsid'] = fsid
-	except:
-		luci_log.debug_verbose('fsid is missing in clusterfs res')
-		return None
+	except Exception, e:
+		err = str(e)
+		errors.append(err)
+		luci_log.debug_verbose('addGfs error: %s' % err)
 
 	if form.has_key('forceunmount'):
 		res.attr_hash['force_unmount'] = '1'
 	else:
 		res.attr_hash['force_unmount'] = '0'
 
-	modelb.getResourcesPtr().addChild(res)
-	return res
+	if len(errors) > 1:
+		return [None, None, errors]
+	return [res, modelb, None]
 
 def addNfsm(request, form=None):
 	if form is None:
 		form = request.form
-	modelb = request.SESSION.get('model')
 
-	if not form or not modelb:
+	if not form:
+		luci_log.debug_verbose('addNfsm error: form is missing')
+		return None
+
+	modelb = request.SESSION.get('model')
+	if not modelb:
+		luci_log.debug_verbose('addNfsm error: modelb is missing')
 		return None
 
 	if form.has_key('edit'):
 		try:
 			oldname = form['oldname'].strip()
 			if not oldname:
-				raise KeyError('oldname is blank.')
+				raise KeyError, 'oldname is blank.'
 			res = getResourceForEdit(modelb, oldname)
-		except KeyError, e:
+		except Exception, e:
+			luci_log.debug_verbose('addNfsm error: %s' % str(e))
 			return None
 	else:
-		res = apply(Netfs)
+		try:
+			res = apply(Netfs)
+		except Exception, e:
+			luci_log.debug_verbose('addNfsm error: %s' % str(e))
+			return None
 
 	if not res:
 		return None
 
 	# XXX: sanity check these fields
+	errors = list()
 	try:
 		name = form['resourceName'].strip()
 		if not name:
-			raise
+			raise KeyError, 'resourceName is blank'
 		res.attr_hash['name'] = name
-	except:
-		return None
+	except Exception, e:
+		err = str(e)
+		errors.append(err)
+		luci_log.debug_verbose('addNfsm error: %s' % err)
 
 	try:
 		mountpoint = form['mountpoint'].strip()
 		res.attr_hash['mountpoint'] = mountpoint
-	except:
-		return None
-
+	except Exception, e:
+		err = str(e)
+		errors.append(err)
+		luci_log.debug_verbose('addNfsm error: %s' % err)
+		
 	try:
 		host = form['host'].strip()
 		res.attr_hash['host'] = host
-	except:
-		return None
+	except Exception, e:
+		err = str(e)
+		errors.append(err)
+		luci_log.debug_verbose('addNfsm error: %s' % err)
 
 	try:
 		options = form['options'].strip()
 		res.attr_hash['options'] = options
-	except:
-		return None
+	except Exception, e:
+		err = str(e)
+		errors.append(err)
+		luci_log.debug_verbose('addNfsm error: %s' % err)
 
 	try:
 		exportpath = form['exportpath'].strip()
 		res.attr_hash['exportpath'] = exportpath 
-	except:
-		return None
+	except Exception, e:
+		err = str(e)
+		errors.append(err)
+		luci_log.debug_verbose('addNfsm error: %s' % err)
 
 	try:
 		nfstype = form['nfstype'].strip().lower()
 		if nfstype != 'nfs' and nfstype != 'nfs4':
-			raise
+			raise KeyError, 'invalid nfs type: %s' % nfstype
 		res.attr_hash['nfstype'] = nfstype
-	except:
-		return None
+	except Exception, e:
+		err = str(e)
+		errors.append(err)
+		luci_log.debug_verbose('addNfsm error: %s' % err)
 
 	if form.has_key('forceunmount'):
 		res.attr_hash['force_unmount'] = '1'
 	else:
 		res.attr_hash['force_unmount'] = '0'
 
-	modelb.getResourcesPtr().addChild(res)
-	return res
+	if len(errors) > 1:
+		return [None, None, errors]
+	return [res, modelb, None]
 
 def addNfsc(request, form=None):
 	if form is None:
 		form = request.form
-	modelb = request.SESSION.get('model')
 
-	if not form or not modelb:
+	if not form:
+		luci_log.debug_verbose('addNfsc error: form is missing')
+		return None
+
+	modelb = request.SESSION.get('model')
+	if not modelb:
+		luci_log.debug_verbose('addNfsc error: modelb is missing')
 		return None
 
 	if form.has_key('edit'):
 		try:
 			oldname = form['oldname'].strip()
 			if not oldname:
-				raise KeyError('oldname is blank.')
+				raise KeyError, 'oldname is blank.'
 			res = getResourceForEdit(modelb, oldname)
-		except KeyError, e:
+		except Exception, e:
+			luci_log.debug_verbose('addNfsc error: %s' % str(e))
 			return None
 	else:
-		res = apply(NFSClient)
+		try:
+			res = apply(NFSClient)
+		except:
+			luci_log.debug_verbose('addNfsc error: %s' % str(e))
+			return None
 
 	if not res:
+		luci_log.debug_verbose('addNfsc error: res is none')
 		return None
 
+	errors = list()
 	try:
 		name = form['resourceName'].strip()
 		if not name:
-			raise
+			raise KeyError, 'resourceName is blank'
 		res.attr_hash['name'] = name
-	except:
-		return None
+	except Exception, e:
+		err = str(e)
+		errors.append(err)
+		luci_log.debug_verbose('addNfsc error: %s' % err)
 
 	try:
 		target = form['target'].strip()
 		res.attr_hash['target'] = target 
-	except:
-		return None
+	except Exception, e:
+		err = str(e)
+		errors.append(err)
+		luci_log.debug_verbose('addNfsc error: %s' % err)
 
 	try:
 		options = form['options'].strip()
 		res.attr_hash['options'] = options
-	except:
-		return None
-
-	modelb.getResourcesPtr().addChild(res)
-	return res
+	except Exception, e:
+		err = str(e)
+		errors.append(err)
+		luci_log.debug_verbose('addNfsc error: %s' % err)
+
+	if len(errors) > 1:
+		return [None, None, errors]
+	return [res, modelb, None]
 
 def addNfsx(request, form=None):
 	if form is None:
 		form = request.form
-	modelb = request.SESSION.get('model')
 
-	if not modelb or not form:
+	if not form:
+		luci_log.debug_verbose('addNfsx error: modelb is missing')
+		return None
+
+	modelb = request.SESSION.get('model')
+	if not modelb:
+		luci_log.debug_verbose('addNfsx error: modelb is missing')
 		return None
 
 	if form.has_key('edit'):
 		try:
 			oldname = form['oldname'].strip()
 			if not oldname:
-				raise KeyError('oldname is blank.')
+				raise KeyError, 'oldname is blank.'
 			res = getResourceForEdit(modelb, oldname)
-		except KeyError, e:
+		except Exception, e:
+			luci_log.debug_verbose('addNfsx error: %s', str(e))
 			return None
 	else:
-		res = apply(NFSExport)
+		try:
+			res = apply(NFSExport)
+		except:
+			luci_log.debug_verbose('addNfsx error: %s', str(e))
+			return None
 
 	if not res:
+		luci_log.debug_verbose('addNfsx error: res is None')
 		return None
 
+	errors = list()
 	try:
 		name = form['resourceName'].strip()
 		if not name:
-			raise
+			raise KeyError, 'resourceName is blank'
 		res.attr_hash['name'] = name
-	except:
-		return None
-
-	modelb.getResourcesPtr().addChild(res)
-	return res
+	except Exception, e:
+		err = str(e)
+		errors.append(err)
+		luci_log.debug_verbose('addNfsx error: %s', err)
+
+	if len(errors) > 1:
+		return [None, None, errors]
+	return [res, modelb, None]
 
 def addScr(request, form=None):
 	if form is None:
 		form = request.form
-	modelb = request.SESSION.get('model')
-	form = request.form
 
-	if not modelb or not form:
+	if not form:
+		luci_log.debug_verbose('addScr error: form is missing')
+		return None
+
+	modelb = request.SESSION.get('model')
+	if not modelb:
+		luci_log.debug_verbose('addScr error: modelb is missing')
 		return None
 
 	if form.has_key('edit'):
 		try:
 			oldname = form['oldname'].strip()
 			if not oldname:
-				raise KeyError('oldname is blank.')
+				raise KeyError, 'oldname is blank.'
 			res = getResourceForEdit(modelb, oldname)
-		except KeyError, e:
+		except Exception, e:
+			luci_log.debug_verbose('addScr error: %s' % str(e))
 			return None
 	else:
-		res = apply(Script)
+		try:
+			res = apply(Script)
+		except Exception, e:
+			luci_log.debug_verbose('addScr error: %s' % str(e))
+			return None
 
 	if not res:
+		luci_log.debug_verbose('addScr error: res is None')
 		return None
 
+	errors = list()
 	try:
 		name = form['resourceName'].strip()
 		if not name:
-			raise
+			raise KeyError, 'resourceName is blank'
 		res.attr_hash['name'] = name
-	except:
-		return None
+	except Exception, e:
+		err = str(e)
+		errors.append(err)
+		luci_log.debug_verbose('addScr error: %s' % err)
 
 	try:
 		file = form['file'].strip()
 		if not file:
-			raise
+			raise KeyError, 'file path is blank'
 		res.attr_hash['file'] = file
-	except:
-		return None
-
-	modelb.getResourcesPtr().addChild(res)
-	return res
+	except Exception, e:
+		err = str(e)
+		errors.append(err)
+		luci_log.debug_verbose('addScr error: %s' % err)
+
+	if len(errors) > 1:
+		return [None, None, errors]
+	return [res, modelb, None]
 
 def addSmb(request, form=None):
 	if form is None:
 		form = request.form
-	modelb = request.SESSION.get('model')
 
-	if not modelb or not form:
+	if not form:
+		luci_log.debug_verbose('addSmb error: form is missing')
+		return None
+
+	modelb = request.SESSION.get('model')
+	if not modelb:
+		luci_log.debug_verbose('addSmb error: modelb is missing')
 		return None
 
 	if form.has_key('edit'):
 		try:
 			oldname = form['oldname'].strip()
 			if not oldname:
-				raise KeyError('oldname is blank.')
+				raise KeyError, 'oldname is blank.'
 			res = getResourceForEdit(modelb, oldname)
-		except KeyError, e:
+		except Exception, e:
+			luci_log.debug_verbose('addSmb error: %s' % str(e))
 			return None
 	else:
-		res = apply(Samba)
+		try:
+			res = apply(Samba)
+		except Exception, e:
+			luci_log.debug_verbose('addSmb error: %s' % str(e))
+			return None
 
 	if not res:
+		luci_log.debug_verbose('addSmb error: res is None')
 		return None
 
+	errors = list()
 	try:
 		name = form['resourceName'].strip()
 		if not name:
-			raise
+			raise KeyError, 'resourceName is blank'
 		res.attr_hash['name'] = name
-	except:
-		return None
+	except Exception, e:
+		err = str(e)
+		errors.append(err)
+		luci_log.debug_verbose('addSmb error: %s' % err)
 
 	try:
 		workgroup = form['workgroup'].strip()
 		res.attr_hash['workgroup'] = workgroup
-	except:
-		return None
-
-	modelb.getResourcesPtr().addChild(res)
-	return res
+	except Exception, e:
+		err = str(e)
+		errors.append(err)
+		luci_log.debug_verbose('addSmb error: %s' % err)
+
+	if len(errors) > 1:
+		return [None, None, errors]
+	return [res, modelb, None]
 
 resourceAddHandler = {
 	'ip': addIp,
@@ -3582,48 +3964,37 @@
 	
 	return messages
 
-def addResource(self, rc, request):
-	if not request.form:
-		return (False, {'errors': ['No form was submitted.']})
+def addResource(self, request, modelb, res):
+	clustername = modelb.getClusterName()
+	if not clustername:
+		raise Exception, 'cluster name from modelb.getClusterName() is blank'
+
+	rc = getRicciAgent(self, clustername)
+	if not rc:
+		raise Exception, 'Unable to find a ricci agent for the %s cluster' % clustername
 
-	try:
-		type = request.form['type'].strip()
-		if not type or not type in resourceAddHandler:
-			raise
-	except:
-		return (False, {'errors': ['Form type is missing.']})
-
-	try:
-		resname = request.form['resourceName']
-	except KeyError, e:
-		# For IP, the IP address itself is the name.
-		if request.form['type'] != 'ip':
-			return (False, {'errors': ['No resource name was given.']})
+	modelb.getResourcesPtr().addChild(res)
 
 	try:
-		clustername = request['clustername']
-	except KeyError, e:
-		try:
-			clustername = request.form['clustername']
-		except:
-			return 'unable to determine the current cluster\'s name'
-
-	res = resourceAddHandler[type](request)
-	modelb = request.SESSION.get('model')
-	modelstr = ""
-	conf = modelb.exportModelAsString()
+		conf = modelb.exportModelAsString()
+		if not conf:
+			raise Exception, 'model string for %s is blank' % clustername
+	except Exception, e:
+		luci_log.debug_verbose('addResource: exportModelAsString err: %s' % str(e))
+		return 'An error occurred while adding this resource'
 
 	try:
 		ragent = rc.hostname()
 		if not ragent:
-			luci_log.debug('missing hostname')
-			raise
-		batch_number, result = setClusterConf(str(conf))
+			luci_log.debug_verbose('missing hostname')
+			raise Exception, 'unknown ricci agent hostname'
+		luci_log.debug_verbose('SENDING NEW CLUSTER CONF: %s' % conf)
+		batch_number, result = setClusterConf(rc, 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"
+			luci_log.debug_verbose('missing batch_number or result')
+			raise Exception, 'batch_number or results is None from setClusterConf'
+	except Exception, e:
+		return 'An error occurred while propagating the new cluster.conf: %s' % str(e)
 
 	path = str(CLUSTER_FOLDER_PATH + clustername)
 	clusterfolder = self.restrictedTraverse(path)
@@ -3639,7 +4010,7 @@
 		flag.manage_addProperty(TASKTYPE, RESOURCE_ADD, "string")
 
 		if type != 'ip':
-			flag.manage_addProperty(FLAG_DESC, "Creating New Resource \'" + request.form['resourceName'] + "\'", "string")
+			flag.manage_addProperty(FLAG_DESC, "Creating New Resource \'" + res.attr_hash['name'] + "\'", "string")
 		else:
 			flag.manage_addProperty(FLAG_DESC, "Creating New Resource \'" + res.attr_hash['address'] + "\'", "string")
 	except Exception, e:
@@ -3668,7 +4039,7 @@
 		request.SESSION.set('model', model)
 	except:
 		luci_log.debug_verbose('Appending model to request failed')
-		return False
+		return 'An error occurred while storing the cluster model.' 
 
 def resolve_nodename(self, clustername, nodename):
 	path = str(CLUSTER_FOLDER_PATH + clustername)
@@ -3733,7 +4104,7 @@
 	try:
 		cluster_conf_node = getClusterConf(rc)
 		if not cluster_conf_node:
-			raise;
+			raise
 	except:
 		luci_log.debug('unable to get cluster_conf_node in getModelBuilder')
 		return None
--- conga/luci/site/luci/Extensions/homebase_adapters.py	2006/10/30 20:20:04	1.34.2.2
+++ conga/luci/site/luci/Extensions/homebase_adapters.py	2006/10/31 17:28:04	1.34.2.3
@@ -14,9 +14,6 @@
 from clusterOS import resolveOSType
 from conga_constants import *
 
-class InCluster(Exception):
-	pass
-
 def siteIsSetup(self):
 	try:
 		if os.path.isfile(CERTS_DIR_PATH + 'privkey.pem') and os.path.isfile(CERTS_DIR_PATH + 'cacert.pem'):
@@ -661,23 +658,20 @@
 	except:
 		sessionData = None
 
+	try:
+		request.SESSION.delete('checkRet')
+	except:
+		pass
+
 	if 'ACTUAL_URL' in request:
 		url = request['ACTUAL_URL']
 	else:
 		url = '.'
 
-	if 'pagetype' in request.form:
-		pagetype = int(request.form['pagetype'])
-	else:
-		try: request.SESSION.set('checkRet', {})
-		except: pass
-		return homebasePortal(self, request, '.', '0')
-
 	try:
+		pagetype = int(request.form['pagetype'])
 		validatorFn = formValidators[pagetype - 1]
 	except:
-		try: request.SESSION.set('checkRet', {})
-		except: pass
 		return homebasePortal(self, request, '.', '0')
 
 	if validatorFn == validateAddClusterInitial or validatorFn == validateAddCluster:
@@ -705,7 +699,7 @@
 		return homebaseControlPost(self, request)
 
 	try:
-		request.SESSION.set('checkRet', {})
+		request.SESSION.delete('checkRet')
 	except:
 		pass
 
--- conga/luci/site/luci/Extensions/ricci_bridge.py	2006/10/25 16:00:40	1.30.2.4
+++ conga/luci/site/luci/Extensions/ricci_bridge.py	2006/10/31 17:28:04	1.30.2.5
@@ -2,6 +2,12 @@
 from time import time, ctime
 from xml.dom import minidom
 from ricci_communicator import RicciCommunicator
+from LuciSyslog import LuciSyslog
+
+try:
+	luci_log = LuciSyslog()
+except:
+	pass
 
 def checkBatch(rc, batch_id):
 	try:
@@ -200,20 +206,29 @@
 
 	return minidom.parseString(batch).firstChild
 
-def batchAttemptResult(self, doc):
-	docc = None
-	rc_node = None
+def batchAttemptResult(doc):
+	try:
+		batch = doc.getElementsByTagName('batch')
+		if not batch or len(batch) < 1:
+			raise Exception, 'no batch tag was found'
+	except Exception, e:
+		luci_log.debug_verbose('batchAttemptResult: %s' % str(e))
 
-	for node in doc.firstChild.childNodes:
-		if node.nodeType == xml.dom.Node.ELEMENT_NODE:
-			if node.nodeName == 'batch':
-				#get batch number and status code
-				batch_number = node.getAttribute('batch_id')
-				result = node.getAttribute('status')
-				return (batch_number, result)
-			else:
-				#print "RETURNING NONE!!!"
-				return (None, None)
+	for i in batch:
+		try:
+			batch_number = i.getAttribute('batch_id')
+			result = i.getAttribute('status')
+			return (str(batch_number), str(result))
+		except Exception, e:
+			luci_log.debug_verbose('batchAttemptResult: %s' % str(e))
+
+	try:
+		luci_log.debug_verbose('no batch with batchid and status found in \"%s\"' % doc.toxml())
+	except:
+		pass
+
+	return (None, None)
+	
 
 def getPayload(bt_node):
 	if not bt_node:
@@ -260,6 +275,20 @@
 	doc.appendChild(cl_node)
 	return doc
 
+def getClusterStatusBatch(rc):
+	batch_str ='<module name="cluster"><request API_version="1.0"><function_call name="status"/></request></module>'
+	ricci_xml = rc.batch_run(batch_str, async=False)
+
+	if not ricci_xml or not ricci_xml.firstChild:
+		luci_log.debug_verbose('ricci_xml is None from batch_run')
+		
+	doc = getPayload(ricci_xml.firstChild)
+	if not doc or not doc.firstChild:
+		luci_log.debug_verbose('doc is None from getPayload: %s' % ricci_xml.toxml())
+		return None
+
+	return doc
+
 def setClusterConf(rc, clusterconf, propagate=True):
 	if propagate == True:
 		propg = 'true'
@@ -274,10 +303,7 @@
 	batch_str = '<module name="cluster"><request API_version="1.0"><function_call name="set_cluster.conf"><var type="boolean" name="propagate" mutable="false" value="' + propg + '"/><var type="xml" mutable="false" name="cluster.conf">' + conf + '</var></function_call></request></module>'
 
 	ricci_xml = rc.batch_run(batch_str)
-	doc = getPayload(ricci_xml)
-	if not doc or not doc.firstChild:
-		return (None, None)
-	return batchAttemptResult(doc)
+	return batchAttemptResult(ricci_xml)
 
 def getNodeLogs(rc):
 	errstr = 'log not accessible'
@@ -334,10 +360,7 @@
 	batch_str = '<module name="reboot"><request sequence="111" API_version="1.0"><function_call name="reboot_now"/></request></module>'
 
 	ricci_xml = rc.batch_run(batch_str)
-	doc = getPayload(ricci_xml)
-	if not doc or not doc.firstChild:
-		return (None, None)
-	return batchAttemptResult(doc)
+	return batchAttemptResult(ricci_xml)
 
 def nodeLeaveCluster(rc, cluster_shutdown=False, purge=False):
 	cshutdown = 'false'
@@ -351,19 +374,13 @@
 	batch_str = '<module name="cluster"><request sequence="111" API_version="1.0"><function_call name="stop_node"><var mutable="false" name="cluster_shutdown" type="boolean" value="' + cshutdown + '"/><var mutable="false" name="purge_conf" type="boolean" value="' + purge_conf + '"/></function_call></request></module>'
 
 	ricci_xml = rc.batch_run(batch_str)
-	doc = getPayload(ricci_xml)
-	if not doc or not doc.firstChild:
-		return (None, None)
-	return batchAttemptResult(doc)
+	return batchAttemptResult(ricci_xml)
 
 def nodeFence(rc, nodename):
 	batch_str = '<module name="cluster"><request sequence="111" API_version="1.0"><function_call name="fence_node"><var mutable="false" name="nodename" type="string" value="' + nodename + '"/></function_call></request></module>'
 
 	ricci_xml = rc.batch_run(batch_str)
-	doc = getPayload(ricci_xml)
-	if not doc or not doc.firstChild:
-		return (None, None)
-	return batchAttemptResult(doc)
+	return batchAttemptResult(ricci_xml)
 
 def nodeJoinCluster(rc, cluster_startup=False):
 	cstartup = 'false'
@@ -373,10 +390,7 @@
 	batch_str = '<module name="cluster"><request sequence="111" API_version="1.0"><function_call name="start_node"><var mutable="false" name="cluster_startup" type="boolean" value="' + cstartup + '"/></function_call></request></module>'
 
 	ricci_xml = rc.batch_run(batch_str)
-	doc = getPayload(ricci_xml)
-	if not doc or not doc.firstChild:
-		return (None, None)
-	return batchAttemptResult(doc)
+	return batchAttemptResult(ricci_xml)
 
 def startService(rc, servicename, preferrednode=None):
 	if preferrednode != None:
@@ -385,28 +399,19 @@
 		batch_str = '<module name="cluster"><request sequence="1254" API_version="1.0"><function_call name="start_service"><var mutable="false" name="servicename" type="string" value=\"' + servicename + '\"/></function_call></request></module>'
 
 	ricci_xml = rc.batch_run(batch_str)
-	doc = getPayload(ricci_xml)
-	if not doc or not doc.firstChild:
-		return (None, None)
-	return batchAttemptResult(doc)
+	return batchAttemptResult(ricci_xml)
 
 def restartService(rc, servicename):
 	batch_str = '<module name="cluster"><request sequence="1254" API_version="1.0"><function_call name="restart_service"><var mutable="false" name="servicename" type="string" value=\"' + servicename + '\"/></function_call></request></module>'
 
 	ricci_xml = rc.batch_run(batch_str)
-	doc = getPayload(ricci_xml)
-	if not doc or not doc.firstChild:
-		return (None, None)
-	return batchAttemptResult(doc)
+	return batchAttemptResult(ricci_xml)
 
 def stopService(rc, servicename):
 	batch_str = '<module name="cluster"><request sequence="1254" API_version="1.0"><function_call name="stop_service"><var mutable="false" name="servicename" type="string" value=\"' + servicename + '\"/></function_call></request></module>'
 
 	ricci_xml = rc.batch_run(batch_str)
-	doc = getPayload(ricci_xml)
-	if not doc or not doc.firstChild:
-		return (None, None)
-	return batchAttemptResult(doc)
+	return batchAttemptResult(ricci_xml)
 
 def getDaemonStates(rc, dlist):
 	batch_str = '<module name="service"><request API_version="1.0"><function_call name="query"><var mutable="false" name="search" type="list_xml">'
@@ -417,9 +422,10 @@
 	batch_str += '</var></function_call></request></module>'
 
 	ricci_xml = rc.batch_run(batch_str, async=False)
-	if not ricci_xml:
+	if not ricci_xml or not ricci_xml.firstChild:
+		luci_log.debug_verbose('no ricci_xml in getDaemonStates')
 		return None
-	result = extractDaemonInfo(ricci_xml)
+	result = extractDaemonInfo(ricci_xml.firstChild)
 	return result
 
 def extractDaemonInfo(bt_node):
--- conga/luci/site/luci/Extensions/ricci_communicator.py	2006/10/24 16:36:23	1.9.2.1
+++ conga/luci/site/luci/Extensions/ricci_communicator.py	2006/10/31 17:28:04	1.9.2.2
@@ -216,10 +216,12 @@
             luci_log.debug('An error occurred while trying to process the batch job: %s' % batch_xml_str)
             return None
 
-        return ricci_xml
+        doc = minidom.Document()
+        doc.appendChild(ricci_xml)
+        return doc
 
     def batch_report(self, batch_id):
-        luci_log.debug_verbose('[auth=%d] asking for batchid# %d for host %s' \
+        luci_log.debug_verbose('[auth=%d] asking for batchid# %s for host %s' \
             % (self.__authed, batch_id, self.__hostname))
 
         if not self.authed():
@@ -242,7 +244,7 @@
         if doc.firstChild.getAttribute('success') == '12':
             return None
         if doc.firstChild.getAttribute('success') != '0':
-            raise RicciError, 'Error while retrieving batch report for batch #%s from host %s' % (batch_id, self.__hostname)
+            raise RicciError, 'Error while retrieving batch report for batch #%d from host %s' % (batch_id, self.__hostname)
         batch_node = None
         for node in doc.firstChild.childNodes:
             if node.nodeType == xml.dom.Node.ELEMENT_NODE:
@@ -401,10 +403,10 @@
                     last = last + 1
                     last = last - 2 * last
     try:
-        luci_log.debug_verbose('Returning (%s, %s) for batch_status(\"%s\")' \
+        luci_log.debug_verbose('Returning (%d, %d) for batch_status(\"%s\")' \
             % (last, total, batch_xml.toxml()))
     except:
-        pass
+        luci_log.debug_verbose('Returning last, total')
 
     return (last, total)
 



             reply	other threads:[~2006-10-31 17:28 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-10-31 17:28 rmccabe [this message]
  -- strict thread matches above, loose matches on Subject: below --
2007-07-26  4:16 [Cluster-devel] conga/luci cluster/form-macros cluster/index_h rmccabe
2007-02-20 23:09 rmccabe
2007-02-20 23:07 rmccabe
2006-12-21  5:08 rmccabe
2006-11-07 21:33 rmccabe
2006-11-03 19:13 rmccabe
2006-10-16  4:26 rmccabe
2006-09-08 22:54 rmccabe
2006-07-19 20:20 rmccabe
2006-07-05 20:13 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=20061031172808.11207.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.