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/site/luci/Extensions ModelBuilder.p ...
Date: 26 Oct 2006 22:59:14 -0000	[thread overview]
Message-ID: <20061026225914.26566.qmail@sourceware.org> (raw)

CVSROOT:	/cvs/cluster
Module name:	conga
Changes by:	rmccabe at sourceware.org	2006-10-26 22:59:13

Modified files:
	luci/site/luci/Extensions: ModelBuilder.py cluster_adapters.py 
	                           ricci_bridge.py 

Log message:
	- fix for broken exportModelAsString()
	- fix for broken resource add/edit handler
	- lots more debugging and verbose exception handling

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/ModelBuilder.py.diff?cvsroot=cluster&r1=1.9&r2=1.10
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/cluster_adapters.py.diff?cvsroot=cluster&r1=1.129&r2=1.130
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/ricci_bridge.py.diff?cvsroot=cluster&r1=1.35&r2=1.36

--- conga/luci/site/luci/Extensions/ModelBuilder.py	2006/10/24 15:05:28	1.9
+++ conga/luci/site/luci/Extensions/ModelBuilder.py	2006/10/26 22:59:13	1.10
@@ -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/25 01:11:08	1.129
+++ conga/luci/site/luci/Extensions/cluster_adapters.py	2006/10/26 22:59:13	1.130
@@ -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,
 }
@@ -1331,19 +1351,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)
@@ -1360,24 +1382,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):
@@ -1394,23 +1423,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 = {}
@@ -2284,8 +2304,14 @@
 			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))
@@ -2669,12 +2695,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:
@@ -2916,7 +2958,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
@@ -2948,15 +2995,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 {}
 
@@ -2997,7 +3059,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:
@@ -3006,10 +3068,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:
@@ -3018,7 +3080,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:
@@ -3039,20 +3101,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 = ""
@@ -3070,10 +3132,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")
@@ -3082,99 +3144,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'
@@ -3191,27 +3296,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
@@ -3219,286 +3330,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,
@@ -3581,48 +3793,37 @@
 	
 	return messages
 
-def addResource(self, rc, request):
-	if not request.form:
-		return (False, {'errors': ['No form was submitted.']})
-
-	try:
-		type = request.form['type'].strip()
-		if not type or not type in resourceAddHandler:
-			raise
-	except:
-		return (False, {'errors': ['Form type is missing.']})
+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:
-		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)
@@ -3638,7 +3839,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:
@@ -3667,7 +3868,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)
--- conga/luci/site/luci/Extensions/ricci_bridge.py	2006/10/25 16:01:17	1.35
+++ conga/luci/site/luci/Extensions/ricci_bridge.py	2006/10/26 22:59:13	1.36
@@ -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:
@@ -201,19 +207,28 @@
 	return minidom.parseString(batch).firstChild
 
 def batchAttemptResult(self, doc):
-	docc = None
-	rc_node = None
+	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 (batch_number, 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,17 @@
 	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)
+
+	doc = getPayload(ricci_xml)
+	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 +300,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 +357,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 +371,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 +387,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 +396,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">'



             reply	other threads:[~2006-10-26 22:59 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-10-26 22:59 rmccabe [this message]
  -- strict thread matches above, loose matches on Subject: below --
2007-05-11  2:38 [Cluster-devel] conga/luci/site/luci/Extensions ModelBuilder.p rmccabe
2007-05-11  2:38 rmccabe
2007-05-11  2:36 rmccabe
2007-02-15 18:55 rmccabe
2007-01-23 14:05 rmccabe
2007-01-23 14:01 rmccabe
2007-01-10 21:48 kupcevic
2007-01-10 21:36 jparsons
2006-10-24 15:05 jparsons
2006-10-24  1:42 jparsons
2006-10-06 21:08 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=20061026225914.26566.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.