[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

[Cluster-devel] conga ./conga.spec.in.in luci/site/luci/Extens ...



CVSROOT:	/cvs/cluster
Module name:	conga
Changes by:	rmccabe sourceware org	2008-01-14 20:51:42

Modified files:
	.              : conga.spec.in.in 
	luci/site/luci/Extensions: cluster_adapters.py LuciDB.py 
	luci/cluster   : busy_wait-macro 

Log message:
	Fix bz239387 (RFE: add timeouts for actions that can leave cluster unreachable)

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/conga.spec.in.in.diff?cvsroot=cluster&r1=1.91&r2=1.92
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/cluster_adapters.py.diff?cvsroot=cluster&r1=1.277&r2=1.278
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/LuciDB.py.diff?cvsroot=cluster&r1=1.7&r2=1.8
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/cluster/busy_wait-macro.diff?cvsroot=cluster&r1=1.1&r2=1.2

--- conga/conga.spec.in.in	2008/01/03 16:27:48	1.91
+++ conga/conga.spec.in.in	2008/01/14 20:51:42	1.92
@@ -302,6 +302,7 @@
 - Fixed bz253727 (RFE: graphical view should be default in partiton tables view)
 - Fixed bz337041 (Add option to not fail-back service)
 - Fixed bz264161 (RFE: support setting the "__independent_subtree" attribute on cluster resources)
+- Fixed bz239387 (RFE: add timeouts for actions that can leave cluster unreachable)
 
 * Mon Aug 27 2007 Ryan McCabe <rmccabe redhat com> 0.10.0-6
 - Fixed bz253783
--- conga/luci/site/luci/Extensions/cluster_adapters.py	2008/01/02 21:00:32	1.277
+++ conga/luci/site/luci/Extensions/cluster_adapters.py	2008/01/14 20:51:42	1.278
@@ -40,7 +40,7 @@
 	batch_status, extract_module_status
 
 from LuciDB import manageCluster, createClusterSystems, \
-	setNodeStatus, getStorageNode, getClusterFlags, \
+	setNodeStatus, getStorageNode, getClusterFlags, del_node_flag, \
 	getClusterNode, buildClusterCreateFlags, getClusterDBObj, \
 	resolve_nodename, set_node_flag, getRicciAgent, \
 	CLUSTER_NODE_NEED_AUTH
@@ -1102,6 +1102,30 @@
 	request.RESPONSE.redirect('%s?pagetype=%s&clustername=%s&tab=2&busyfirst=true' \
 		% (baseurl, CLUSTER_CONFIG, clustername))
 
+def validate_stop_waiting(self, request):
+	fvar = GetReqVars(request, [ 'clustername', 'node', 'batchid', 'refreshurl' ])
+
+	batchid = fvar['batchid']
+	node = fvar['node']
+	clustername = fvar['clustername']
+
+	if node is None:
+		if LUCI_DEBUG_MODE is True:
+			luci_log.debug_verbose('VSW0: no node name given')
+
+	if clustername is None:
+		if LUCI_DEBUG_MODE is True:
+			luci_log.debug_verbose('VSW1: no cluster name was given')
+
+	if node and clustername:
+		try:
+			del_node_flag(self, clustername, node, batchid)
+		except Exception, e:
+			if LUCI_DEBUG_MODE is True:
+				luci_log.debug_verbose('VSW2: [%s %s %s] %r %s' \
+					% (node, clustername, batchid, e, str(e)))
+	request.RESPONSE.redirect(fvar['refreshurl'])
+
 def process_cluster_conf_editor(self, req):
 	if req.has_key('clustername'):
 		clustername = req['clustername'].strip() or None
@@ -1181,6 +1205,7 @@
 	57: deleteFenceDevice,
 	58: validateNodeFenceConfig,
 	60: validate_xvm_key_dist,
+	61: validate_stop_waiting,
 	80: process_cluster_conf_editor,
 	1001: validate_clusvc_async 
 }
@@ -1524,6 +1549,7 @@
 	isBusy = False
 	redirect_message = False
 	nodereports = list()
+	report_index = 0
 
 	fvar = GetReqVars(req, [ 'clustername', 'URL' ])
 	busy_map['nodereports'] = nodereports
@@ -1571,13 +1597,21 @@
 	# If complete, report status and remove flag.
 
 	for item in items:
+		node_report = {}
 		tasktype = item[1].getProperty(TASKTYPE)
 		if LUCI_DEBUG_MODE is True:
 			luci_log.debug_verbose('ICB3: task type for %s = %s' \
 				% (item[0], tasktype))
+		
+		ricci = item[0].split('____')[0]
+
+		node_report['node'] = ricci
+		node_report['tasktype'] = tasktype
+		node_report['clustername'] = cluname
+		node_report['report_index'] = report_index
+		report_index += 1
 
 		if tasktype == CLUSTER_ADD or tasktype == NODE_ADD:
-			node_report = {}
 			node_report['isnodecreation'] = True
 			# Default value
 			node_report['iserror'] = False
@@ -1585,14 +1619,13 @@
 
 			batch_xml = None
 			# This removes the 'flag' suffix
-			ricci = item[0].split('____')
 
 			if LUCI_DEBUG_MODE is True:
 				luci_log.debug_verbose('ICB4: using rc host %s for item %s' \
-					% (ricci[0], item[0]))
+					% (ricci, item[0]))
 
 			try:
-				rc = RicciCommunicator(ricci[0])
+				rc = RicciCommunicator(ricci)
 				if not rc:
 					rc = None
 					if LUCI_DEBUG_MODE is True:
@@ -1615,12 +1648,14 @@
 						luci_log.debug_verbose('ICB8: failed to get batch_id from %s: %r %s' % (item[0], e, str(e)))
 
 				if batch_id is not None:
+					node_report['batchid'] = batch_id
 					try:
 						batch_xml = rc.batch_report(batch_id)
 						if batch_xml is not None:
 							if LUCI_DEBUG_MODE is True:
 								luci_log.debug_verbose('ICB9: batch_xml for %s from batch_report is not None -- getting batch status' % batch_id)
 							(creation_status, total) = batch_status(batch_xml)
+
 							try:
 								if LUCI_DEBUG_MODE is True:
 									luci_log.debug_verbose('ICB10: batch status returned (%d,%d)' % (creation_status, total))
@@ -1669,7 +1704,7 @@
 				# an error was encountered
 				if LUCI_DEBUG_MODE is True:
 					luci_log.debug_verbose('ICB17: %s: CS %d for %s' \
-						% (cluname, creation_status, ricci[0]))
+						% (cluname, creation_status, ricci))
 
 				if creation_status == RICCI_CONNECT_FAILURE:
 					laststatus = item[1].getProperty(LAST_STATUS)
@@ -1737,8 +1772,8 @@
 				try:
 					if del_db_obj is True:
 						if LUCI_DEBUG_MODE is True:
-							luci_log.debug_verbose('ICB19: %s node creation failed for %s: %d: deleting DB entry' % (cluname, ricci[0], creation_status))
-						clusterfolder.manage_delObjects([ricci[0]])
+							luci_log.debug_verbose('ICB19: %s node creation failed for %s: %d: deleting DB entry' % (cluname, ricci, creation_status))
+						clusterfolder.manage_delObjects([ricci])
 						clusterfolder.manage_delObjects([item[0]])
 				except Exception, e:
 					if LUCI_DEBUG_MODE is True:
@@ -1764,8 +1799,8 @@
 								% (item[0], e, str(e)))
 					continue
 				else:
-					busy_map['busy'] = 'true'
 					isBusy = True
+					busy_map['busy'] = 'true'
 					node_report['statusmessage'] = 'Node still being created'
 					node_report['statusindex'] = creation_status
 					nodereports.append(node_report)
@@ -1783,13 +1818,11 @@
 							luci_log.debug_verbose('ICB23: last_status err: %s %d: %r %s' % (item[0], creation_status, e, str(e)))
 					continue
 		else:
-			node_report = {}
 			node_report['isnodecreation'] = False
 			# This removes the 'flag' suffix
-			ricci = item[0].split('____')
 
 			try:
-				rc = RicciCommunicator(ricci[0])
+				rc = RicciCommunicator(ricci)
 			except Exception, e:
 				rc = None
 				finished = -1
@@ -1797,7 +1830,7 @@
 
 				if LUCI_DEBUG_MODE is True:
 					luci_log.debug_verbose('ICB24: ricci error: %s: %r %s' \
-						% (ricci[0], e, str(e)))
+						% (ricci, e, str(e)))
 
 			if rc is not None:
 				batch_num = item[1].getProperty(BATCH_ID)
@@ -1825,9 +1858,8 @@
 						% (item[0], e, str(e)))
 				busy_map['busy'] = None
 			else:
-				node_report = {}
-				busy_map['busy'] = 'true'
 				isBusy = True
+				busy_map['busy'] = 'true'
 				node_report['desc'] = item[1].getProperty(FLAG_DESC)
 				nodereports.append(node_report)
 
--- conga/luci/site/luci/Extensions/LuciDB.py	2007/08/20 16:31:13	1.7
+++ conga/luci/site/luci/Extensions/LuciDB.py	2008/01/14 20:51:42	1.8
@@ -84,6 +84,38 @@
 			luci_log.debug_verbose('clearNodeStatus0: %r %s' \
 				% (e, str(e)))
 
+def del_node_flag(self, cluname, agent, batchid=None):
+	path = str('%s%s' % (CLUSTER_FOLDER_PATH, cluname))
+	objname = '%s____flag' % agent
+
+	try:
+		flag_obj = self.restrictedTraverse(str('%s/%s' % (path, objname)))
+		clusterfolder = self.restrictedTraverse(path)
+	except Exception, e:
+		if LUCI_DEBUG_MODE is True:
+			luci_log.debug_verbose('DNF0: %s/%s: %s %r %s' \
+				% (path, objname, flag_obj[0], e, str(e)))
+		return False
+
+	if batchid:
+		try:
+			bid = flag_obj.getProperty(BATCH_ID)
+			if bid != batchid:
+				raise Exception, 'mismatch: got %s, wanted %s' % (bid, batchid)
+		except Exception, e1:
+			if LUCI_DEBUG_MODE is True:
+				luci_log.debug_verbose('DNF1: unable to find flag with bid: %s for %s/%s: %r %s' % (batchid, path, objname, e1, str(e1)))
+			return False
+
+	try:
+		clusterfolder.manage_delObjects([objname])
+	except Exception, e:
+		if LUCI_DEBUG_MODE is True:
+			luci_log.debug_verbose('DNF2: %s/%s: %r %s' \
+				% (path, objname, e, str(e)))
+		return False
+	return True
+
 def set_node_flag(self, cluname, agent, batchid, task, desc):
 	path = str('%s%s' % (CLUSTER_FOLDER_PATH, cluname))
 	batch_id = str(batchid)
@@ -99,8 +131,8 @@
 		flag.manage_addProperty(TASKTYPE, task, 'string')
 		flag.manage_addProperty(FLAG_DESC, desc, 'string')
 	except Exception, e:
-		errmsg = 'SNF0: error creating flag (%s,%s,%s) at %s: %s' \
-					% (batch_id, task, desc, objpath, str(e))
+		errmsg = 'Error creating flag (bid: %s task: %s desc: %s) at %s: %s' \
+			% (batch_id, task, desc, objpath, str(e))
 		if LUCI_DEBUG_MODE is True:
 			luci_log.debug_verbose('SNF0: %r %s' % (e, errmsg))
 		raise Exception, errmsg
--- conga/luci/cluster/busy_wait-macro	2007/11/19 18:22:48	1.1
+++ conga/luci/cluster/busy_wait-macro	2008/01/14 20:51:42	1.2
@@ -1,62 +1,70 @@
 <div metal:define-macro="busywaitpage">
-	<table>
-		<tr><td>
-			<h2>Please be patient - this cluster's configuration is being modified.</h2>
-		</td></tr>
-
-		<tr><td>
-			<img src="100wait.gif" />
-		</td></tr>
+	<h2>Please be patient - this cluster's configuration is being modified.</h2>
 
-		<span tal:define="global nodereports isBusy/nodereports" />
+	<p><img src="100wait.gif" /></p>
+
+	<span tal:define="global nodereports isBusy/nodereports" />
+
+	<div tal:repeat="nodereport nodereports">
+		<tal:block
+			tal:condition="python:nodereport.get('isnodecreation') != True">
+
+			<h3><span tal:replace="nodereport/desc" /></h3>
+		</tal:block>
+
+		<tal:block
+			tal:condition="python:nodereport.get('isnodecreation') == True">
 
-		<tr tal:repeat="nodereport nodereports"><td>
 			<tal:block
-				tal:condition="python:nodereport.get('isnodecreation') != True">
+				tal:condition="python:nodereport.get('iserror') == True">
+
+				<h3><span tal:content="nodereport/desc" /></h3>
 
-				<h2><span tal:replace="nodereport/desc" /></h2>
+				<span class="errmsg" tal:content="nodereport/errormessage" />
 			</tal:block>
 
-			<tal:block
-				tal:condition="python:nodereport.get('isnodecreation') == True">
+			<tal:block tal:condition="python:nodereport.get('iserror') != True">
+				<h3><span tal:content="nodereport/desc" /></h3>
+				<em tal:content="nodereport/statusmessage | nothing" />
+				<br/>
 
-				<tal:block
-					tal:condition="python:nodereport.get('iserror') == True">
+				<tal:block tal:condition="python: nodereport['statusindex'] < 1">
+					<img src="notstarted.png" />
+				</tal:block>
 
-					<h2><span tal:content="nodereport/desc" /></h2>
+				<tal:block tal:condition="python: nodereport['statusindex'] == 1 or nodereport['statusindex'] == 2">
+					<img src="installed.png" alt="[cluster software installed]" />
+				</tal:block>
 
-					<span class="errmsg"
-						tal:content="nodereport/errormessage" />
+				<tal:block tal:condition="python: nodereport['statusindex'] == 3">
+					<img src="rebooted.png" alt="[cluster node rebooted]" />
 				</tal:block>
 
-				<tal:block
-					tal:condition="python:nodereport.get('iserror') != True">
+				<tal:block tal:condition="python: nodereport['statusindex'] == 4 or nodereport['statusindex'] == 5">
+					<img src="configured.png" alt="[cluster node configured]" />
+				</tal:block>
 
-					<h2><span tal:content="nodereport/desc" /></h2>
-					<em tal:content="nodereport/statusmessage | nothing" />
-					<br/>
-
-					<tal:block tal:condition="python: nodereport['statusindex'] < 1">
-						<img src="notstarted.png" />
-					</tal:block>
-
-					<tal:block tal:condition="python: nodereport['statusindex'] == 1 or nodereport['statusindex'] == 2">
-						<img src="installed.png" alt="[cluster software installed]" />
-					</tal:block>
-
-					<tal:block tal:condition="python: nodereport['statusindex'] == 3">
-						<img src="rebooted.png" alt="[cluster node rebooted]" />
-					</tal:block>
-
-					<tal:block tal:condition="python: nodereport['statusindex'] == 4 or nodereport['statusindex'] == 5">
-						<img src="configured.png" alt="[cluster node configured]" />
-					</tal:block>
-
-					<tal:block tal:condition="python: nodereport['statusindex'] == 6">
-						<img src="joined.png" alt="[cluster node joined cluster]" />
-					</tal:block>
+				<tal:block tal:condition="python: nodereport['statusindex'] == 6">
+					<img src="joined.png" alt="[cluster node joined cluster]" />
 				</tal:block>
 			</tal:block>
-		</td></tr>
-	</table>
+		</tal:block>
+
+		<div>
+			<form method="post" action=""
+				tal:attributes="name python:'stop_waiting_form%s' % nodereport.get('report_index')">
+
+				<input type="hidden" name="pagetype" value="61" />
+				<input type="hidden" name="clustername"
+					tal:attributes="value nodereport/clustername | nothing" />
+				<input type="hidden" name="node"
+					tal:attributes="value nodereport/node | nothing" />
+				<input type="hidden" name="refreshurl"
+					tal:attributes="value nodereport/refreshurl | request/URL |string:." />
+				<a href="javascript:void(0)"
+					tal:attributes="onclick python:'javascript:document.stop_waiting_form%s.submit()' % nodereport.get('report_index')">Stop waiting for this job to complete</a>
+			</form>
+		</div>
+	</div>
+	<hr/>
 </div>


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]