[Cluster-devel] conga/luci cluster/form-macros cluster/validat ...

rmccabe at sourceware.org rmccabe at sourceware.org
Fri Feb 16 05:26:18 UTC 2007


CVSROOT:	/cvs/cluster
Module name:	conga
Changes by:	rmccabe at sourceware.org	2007-02-16 05:26:18

Modified files:
	luci/cluster   : form-macros validate_config_qdisk.js 
	luci/site/luci/Extensions: cluster_adapters.py 

Log message:
	- Only set the totem params cman actually reads
	- Fix a bunch of bugs relating to qdisk properties

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/cluster/form-macros.diff?cvsroot=cluster&r1=1.190&r2=1.191
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/cluster/validate_config_qdisk.js.diff?cvsroot=cluster&r1=1.5&r2=1.6
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/cluster_adapters.py.diff?cvsroot=cluster&r1=1.240&r2=1.241

--- conga/luci/cluster/form-macros	2007/02/16 02:06:08	1.190
+++ conga/luci/cluster/form-macros	2007/02/16 05:26:18	1.191
@@ -640,12 +640,56 @@
 					<table class="systemsTable">
 						<tr class="systemsTable">
 							<td class="systemsTable">
+								<a class="cluster_help" href="javascript:popup_window('/luci/doc/config_rhel5#token', 55, 65);">Token Timeout</a> (ms)
+							</td>
+							<td class="systemsTable">
+								<input type="text" size="10" name="token"
+									tal:attributes="value clusterinfo/totem/token | string:10000" />
+							</td>
+						</tr>
+
+						<tr class="systemsTable">
+							<td class="systemsTable">
+								<a class="cluster_help" href="javascript:popup_window('/luci/doc/config_rhel5#retransmits_before_loss', 55, 65);">Number of token retransmits before loss</a>
+							</td>
+							<td class="systemsTable">
+								<input type="text" size="10"
+									name="token_retransmits_before_loss_const"
+									tal:attributes="value clusterinfo/totem/token_retransmits_before_loss_const | string:20" />
+							</td>
+						</tr>
+
+						<tr class="systemsTable">
+							<td class="systemsTable">
+								<a class="cluster_help" href="javascript:popup_window('/luci/doc/config_rhel5#join', 55, 65);">Join Timeout</a> (ms)
+							</td>
+							<td class="systemsTable">
+								<input type="text" size="10" name="join"
+									tal:attributes="value clusterinfo/totem/join | string:60" />
+							</td>
+						</tr>
+
+						<tr class="systemsTable">
+							<td class="systemsTable">
+								<a class="cluster_help" href="javascript:popup_window('/luci/doc/config_rhel5#consensus', 55, 65);">Consensus Timeout</a> (ms)
+							</td>
+							<td class="systemsTable">
+								<input type="text" size="10"
+									name="consensus"
+									tal:attributes="value clusterinfo/totem/consensus | string:4800" />
+							</td>
+						</tr>
+
+<tal:comment tal:replace="nothing">
+						<tr class="systemsTable">
+							<td class="systemsTable">
 								<a class="cluster_help" href="javascript:popup_window('/luci/doc/config_rhel5#secauth', 55, 65);">Secure Authentication</a>
 							</td>
 							<td class="systemsTable">
 								<input type="checkbox" name="secauth" checked="checked" />
 						</tr>
 
+
 						<tr class="systemsTable">
 							<td class="systemsTable">
 								<a class="cluster_help" href="javascript:popup_window('/luci/doc/config_rhel5#rrp_mode', 55, 65);">Redundant Ring Protocol Mode</a>
@@ -703,16 +747,6 @@
 
 						<tr class="systemsTable">
 							<td class="systemsTable">
-								<a class="cluster_help" href="javascript:popup_window('/luci/doc/config_rhel5#token', 55, 65);">Token Timeout</a> (ms)
-							</td>
-							<td class="systemsTable">
-								<input type="text" size="10" name="token"
-									tal:attributes="value string:5000" />
-							</td>
-						</tr>
-
-						<tr class="systemsTable">
-							<td class="systemsTable">
 								<a class="cluster_help" href="javascript:popup_window('/luci/doc/config_rhel5#token_retransmit', 55, 65);">Token Retransmit</a> (ms)
 							</td>
 							<td class="systemsTable">
@@ -734,27 +768,6 @@
 
 						<tr class="systemsTable">
 							<td class="systemsTable">
-								<a class="cluster_help" href="javascript:popup_window('/luci/doc/config_rhel5#retransmits_before_loss', 55, 65);">Number of retransmits before loss</a>
-							</td>
-							<td class="systemsTable">
-								<input type="text" size="10"
-									name="retransmits_before_loss"
-									tal:attributes="value string:4" />
-							</td>
-						</tr>
-
-						<tr class="systemsTable">
-							<td class="systemsTable">
-								<a class="cluster_help" href="javascript:popup_window('/luci/doc/config_rhel5#join', 55, 65);">Join Timeout</a> (ms)
-							</td>
-							<td class="systemsTable">
-								<input type="text" size="10" name="join"
-									tal:attributes="value string:100" />
-							</td>
-						</tr>
-
-						<tr class="systemsTable">
-							<td class="systemsTable">
 								<a class="cluster_help" href="javascript:popup_window('/luci/doc/config_rhel5#send_join', 55, 65);">Maximum time to wait before sending a join message</a> (ms)
 							</td>
 							<td class="systemsTable">
@@ -765,17 +778,6 @@
 
 						<tr class="systemsTable">
 							<td class="systemsTable">
-								<a class="cluster_help" href="javascript:popup_window('/luci/doc/config_rhel5#consensus', 55, 65);">Consensus Timeout</a> (ms)
-							</td>
-							<td class="systemsTable">
-								<input type="text" size="10"
-									name="consensus"
-									tal:attributes="value string:100" />
-							</td>
-						</tr>
-
-						<tr class="systemsTable">
-							<td class="systemsTable">
 								<a class="cluster_help" href="javascript:popup_window('/luci/doc/config_rhel5#merge', 55, 65);">Merge Detection Timeout</a> (ms)
 							</td>
 							<td class="systemsTable">
@@ -894,6 +896,7 @@
 									tal:attributes="value string:47" />
 							</td>
 						</tr>
+</tal:comment>
 					</table>
 				</td></tr>
 			</table>
@@ -1092,14 +1095,14 @@
 				<tr class="systemsTable" id="st_row"><td class="systemsTable" id="st_col">
 					<input type="radio" name="quorumd" value="False"
 						onClick="disableChildrenInput('quorumdisk');"
-						tal:attributes="checked python: clusterinfo['is_quorumd'] != 'True'"/>
+						tal:attributes="checked python: (not clusterinfo['is_quorumd']) and 'checked' or ''" />
 					Do not use a Quorum Partition
 				</td></tr>
 
 				<tr class="systemsTable"><td class="systemsTable">
 					<input type="radio" name="quorumd" value="True"
 						onClick="enableChildrenInput('quorumdisk');"
-						tal:attributes="checked python: clusterinfo['is_quorumd'] == 'True'"/>
+						tal:attributes="checked python: (clusterinfo['is_quorumd']) and 'checked' or ''" />
 						Use a Quorum Partition
 				</td></tr>
 			</tbody>
@@ -1114,48 +1117,48 @@
 			<tr class="systemsTable">
 				<td class="systemsTable">Interval</td>
 				<td class="systemsTable">
-					<input type="text" name="interval" value=""
-						tal:attributes="value clusterinfo/interval"/>
+					<input type="text" name="interval"
+						tal:attributes="value clusterinfo/interval | nothing" />
 				</td>
 			</tr>
 
 			<tr class="systemsTable">
 				<td class="systemsTable">Votes</td>
 				<td class="systemsTable">
-					<input type="text" name="votes" value=""
-						tal:attributes="value clusterinfo/votes"/>
+					<input type="text" name="votes"
+						tal:attributes="value clusterinfo/votes | nothing" />
 				</td>
 			</tr>
 
 			<tr class="systemsTable">
 				<td class="systemsTable">TKO</td>
 				<td class="systemsTable">
-					<input type="text" name="tko" value=""
-						tal:attributes="value clusterinfo/tko"/>
+					<input type="text" name="tko"
+						tal:attributes="value clusterinfo/tko | nothing" />
 				</td>
 			</tr>
 
 			<tr class="systemsTable">
 				<td class="systemsTable">Minimum Score</td>
 				<td class="systemsTable">
-					<input type="text" name="min_score" value=""
-						tal:attributes="value clusterinfo/min_score"/>
+					<input type="text" name="min_score"
+						tal:attributes="value clusterinfo/min_score | nothing" />
 				</td>
 			</tr>
 
 			<tr class="systemsTable">
 				<td class="systemsTable">Device</td>
 				<td class="systemsTable">
-					<input type="text" name="device" value=""
-						tal:attributes="value clusterinfo/device"/>
+					<input type="text" name="device"
+						tal:attributes="value clusterinfo/device | nothing" />
 				</td>
 			</tr>
 
 			<tr class="systemsTable">
 				<td class="systemsTable">Label</td>
 				<td class="systemsTable">
-					<input type="text" name="label" value=""
-						tal:attributes="value clusterinfo/label"/>
+					<input type="text" name="label"
+						tal:attributes="value clusterinfo/label | nothing" />
 				</td>
 			</tr>
 		</table>
@@ -1172,9 +1175,6 @@
 
 				<tr class="systemsTable">
 					<th class="systemsTable">
-						<div class="systemsTableTop">Name</div>
-					</th>
-					<th class="systemsTable">
 						<div class="systemsTableTop">Path to Program</div>
 					</th>
 					<th class="systemsTable">
@@ -1190,22 +1190,22 @@
 			</thead>
 
 			<tbody class="systemsTable" id="heuristicList"
-				tal:define="global heuristics clusterinfo/hlist">
+				tal:define="global heuristics clusterinfo/hlist | nothing">
 
-				<tal:block tal:condition="python: not len(heuristics)">
+				<tal:block tal:condition="python: not heuristics or not len(heuristics)">
 				<input type="hidden" name="num_heuristics" id="num_heuristics" value="0">
 				<tr class="systemsTable" id="heuristic0">
 					<td class="systemsTable">
-						<input class="qdname qdisk" type="text" name="heuristic0:hname" id="heuristic0:hname" value="">
-					</td>
-					<td class="systemsTable">
-						<input class="qdpath qdisk" type="text" name="heuristic0:hprog" id="heuristic0:hprog" value="">
+						<input class="qdpath qdisk" type="text"
+							name="heuristic0:hprog" id="heuristic0:hprog" />
 					</td>
 					<td class="systemsTable">
-						<input class="qdint qdisk" type="text" name="heuristic0:hinterval" id="heuristic0:hinterval" value="">
+						<input class="qdint qdisk" type="text"
+							name="heuristic0:hinterval" id="heuristic0:hinterval" />
 					</td>
 					<td class="systemsTable">
-						<input class="qdscore qdisk" type="text" name="heuristic0:hscore" id="heuristic0:hscore" value="">
+						<input class="qdscore qdisk" type="text"
+							name="heuristic0:hscore" id="heuristic0:hscore" />
 					</td>
 					<td class="systemsTable">
 						<img class="qdisk deleteRow"
@@ -1230,32 +1230,27 @@
 					tal:define="global curHeur python: curHeur + 1">
 
 					<td class="systemsTable">
-						<input class="qdname qdisk" type="text"
-							tal:attributes="
-								value heuristic/hname;
-								id python: 'heuristic' + str(curHeur) + ':hname';
-								name python: 'heuristic' + str(curHeur) + ':hname';"/>
-					</td>
-					<td class="systemsTable">
 						<input class="qdpath qdisk" type="text"
 							tal:attributes="
 								value heuristic/hprog;
 								id python: 'heuristic' + str(curHeur) + ':hprog';
-								name python: 'heuristic' + str(curHeur) + ':hprog';"/>
+								name python: 'heuristic' + str(curHeur) + ':hprog'" />
 					</td>
+
 					<td class="systemsTable">
 						<input class="qdint qdisk" type="text"
 							tal:attributes="
 								value heuristic/hinterval;
 								id python: 'heuristic' + str(curHeur) + ':hinterval';
-								name python: 'heuristic' + str(curHeur) + ':hinterval';"/>
+								name python: 'heuristic' + str(curHeur) + ':hinterval'" />
 					</td>
+
 					<td class="systemsTable">
 						<input class="qdscore qdisk" type="text"
 							tal:attributes="
 								value heuristic/hscore;
 								id python: 'heuristic' + str(curHeur) + ':hscore';
-								name python: 'heuristic' + str(curHeur) + ':hscore';"/>
+								name python: 'heuristic' + str(curHeur) + ':hscore'" />
 					</td>
 					<td class="systemsTable">
 						<img class="qdisk deleteRow"
@@ -1264,14 +1259,15 @@
 							onClick="delete_qdisk_heur(this, document.quorum_partition);"
 							tal:attributes="
 								id python: 'heuristic' + str(curHeur) + ':hdel';
-								name python: 'heuristic' + str(curHeur) + ':hdel';"/>
+								name python: 'heuristic' + str(curHeur) + ':hdel'" />
 					</td>
 				</tr>
 				</tal:block>
 			</tbody>
+
 			<tfoot>
 				<tr class="systemsTable"><td class="systemsTable">
-					<input class="addrow" type="button" value="Add another heuristic" onClick="addHeuristic('heuristicList');">
+					<input class="addrow" type="button" value="Add another heuristic" onClick="addHeuristic('heuristicList')">
 				</td></tr>
 			</tfoot>
 		</table>
@@ -1281,10 +1277,9 @@
 		<div class="spacing configTabContent"></div>
 		<div class="hbSubmit spacing configTabContent">
 			<input type="button" value="Apply"
-				onClick="validate_form(this.form);"
-			>
+				onClick="validate_form(this.form)" />
 		</div>
-		<script tal:condition="python: clusterinfo['is_quorumd'] != 'True'">
+		<script tal:condition="not: clusterinfo/is_quorumd">
 			disableChildrenInput('quorumdisk');
 		</script>
 		</form>
--- conga/luci/cluster/validate_config_qdisk.js	2006/12/21 05:08:48	1.5
+++ conga/luci/cluster/validate_config_qdisk.js	2007/02/16 05:26:18	1.6
@@ -1,4 +1,4 @@
-var heuristic_names = [ ':hname', ':hprog', ':hinterval', ':hscore', ':hdel' ];
+var heuristic_names = [ ':hprog', ':hinterval', ':hscore', ':hdel' ];
 
 function clear_heuristic(form, heur_num) {
 	var str_prefix = 'heuristic' + heur_num;
@@ -82,26 +82,14 @@
 
 	var hstr = 'heuristic' + hnum;
 
-	var hname = document.getElementById(hstr + ':hname');
-	if (!hname || str_is_blank(hname.value)) {
-		++blank;
-		errors.push('No name was given for heuristic ' + (hnum + 1));
-		set_form_err(hname);
-	} else {
-		/* XXX sanity check the name */
-		hname = hname.value;
-		clr_form_err(hname);
-	}
-
-	var hpath = document.getElementById(hstr + ':hpath');
-	if (!hpath || str_is_blank(hpath.value)) {
+	var hprog = document.getElementById(hstr + ':hprog');
+	if (!hprog || str_is_blank(hprog.value)) {
 		++blank;
 		errors.push('No path was given for heuristic ' + (hnum + 1));
-		set_form_err(hpath);
+		set_form_err(hprog);
 	} else {
 		/* XXX sanity check the path */
-		hpath = hpath.value;
-		clr_form_err(hpath);
+		clr_form_err(hprog);
 	}
 
 	var hint = document.getElementById(hstr + ':hinterval');
@@ -110,8 +98,7 @@
 		errors.push('No interval was given for heuristic ' + (hnum + 1));
 		set_form_err(hint);
 	} else {
-		hint = hint.value;
-		if (!is_valid_int(hint, 1, null)) {
+		if (!is_valid_int(hint.value, 1, null)) {
 			errors.push('Heuristic interval values must be greater than 0.');
 			set_form_err(hint);
 		} else
@@ -124,18 +111,16 @@
 		errors.push('No score was given for heuristic ' + (hnum + 1));
 		set_form_err(hscore);
 	} else {
-		hscore = hscore.value;
-		if (!is_valid_int(hscore, 0, null)) {
+		if (!is_valid_int(hscore.value, 0, null)) {
 			errors.push('Heuristic score values must be 0 or greater.');
 			set_form_err(hscore);
 		} else
 			clr_form_err(hscore);
 	}
 
-	if (blank == 4) {
+	if (blank == 3) {
 		/* The entry is blank -- ignore it. */
-		clr_form_err(hname);
-		clr_form_err(hpath);
+		clr_form_err(hprog);
 		clr_form_err(hint);
 		clr_form_err(hscore);
 		return (null);
@@ -219,30 +204,15 @@
 				clr_form_err(form.min_score);
 		}
 
-		if (!form.device || str_is_blank(form.device.value)) {
-			errors.push('No device setting was given.');
-			set_form_err(form.device);
-		} else {
-			/* TODO: check this */
-			var device = form.device.value;
-			clr_form_err(form.device);
-		}
-
-		if (!form.label || str_is_blank(form.label.value)) {
-			errors.push('No label setting was given.');
-			set_form_err(form.label);
-		} else {
-			/* TODO: check this */
-			var label = form.device.label;
-			clr_form_err(form.label);
-		}
+		var no_dev = !form.device || str_is_blank(form.device.value);
+		var no_label = !form.label || str_is_blank(form.label.value);
+		if (no_dev && no_label)
+			errors.push('You must give either a label or a device.');
 
 		var hnum = document.getElementById('num_heuristics');
 		if (hnum) {
-			hnum = Number(hnum.value);
-			if (hnum === 0)
-				hnum++;
-			for (var i = 0 ; i < hnum ; i++) {
+			hnum = Number(hnum.value) + 1;
+			for (var i = 0 ; i <= hnum ; i++) {
 				var err = check_heuristic(i, form);
 				if (err)
 					errors = errors.concat(err);
@@ -252,6 +222,7 @@
 
 	if (error_dialog(errors))
 		return (-1);
+
 	if (confirm('Update quorum partition properties?'))
 		form.submit();
 }
@@ -275,15 +246,6 @@
 
 	var hstr = 'heuristic' + cur_hnum;
 
-	var name_td = document.createElement('td');
-	name_td.className = 'systemsTable';
-	var name_input = document.createElement('input');
-	name_input.className = 'qdname qdisk';
-	name_input.setAttribute('name', hstr + ':hname');
-	name_input.setAttribute('id', hstr + ':hname');
-	name_input.setAttribute('type', 'text');
-	name_td.appendChild(name_input);
-
 	var path_td = document.createElement('td');
 	path_td.className = 'systemsTable';
 	var path_input = document.createElement('input');
@@ -325,7 +287,6 @@
 	var tr = document.createElement('tr');
 	tr.className = 'systemsTable';
 	tr.setAttribute('id', 'heuristic' + cur_hnum);
-	tr.appendChild(name_td);
 	tr.appendChild(path_td);
 	tr.appendChild(interval_td);
 	tr.appendChild(score_td);
--- conga/luci/site/luci/Extensions/cluster_adapters.py	2007/02/16 02:06:09	1.240
+++ conga/luci/site/luci/Extensions/cluster_adapters.py	2007/02/16 05:26:18	1.241
@@ -1013,8 +1013,16 @@
 	except KeyError, e:
 		return (False, {'errors': ['An invalid quorum partition selection was made']})
 
+	cp = model.getClusterPtr()
+	qdp = model.getQuorumdPtr()
+
 	if not qdisk_val:
-		return (True, {'messages': ['Changes accepted. - FILL ME IN']})
+		if qdp:
+			try:
+				cp.removeChild(qdp)
+			except Exception, e:
+				return (False, {'errors': [ 'Error disabling quorum partition: %s' % str(e) ] })
+		return (True, {})
 
 	try:
 		interval = int(form['interval'])
@@ -1054,22 +1062,25 @@
 
 	#Either device or label must be present
 	device = None
-	label = None
 	try:
 		device = form['device'].strip()
+	except:
+		device = None
+
+	label = None
+	try:
 		label = form['label'].strip()
-		if not device and not label:
-			raise KeyError, 'device and label are both none'
-	except KeyError, e:
+	except:
+		label = None
+
+	if not device and not label:
 		errors.append('No Device or Label value was given')
 
 	num_heuristics = 0
 	try:
-		num_heuristics = int(form['num_heuristics'])
-		if num_heuristics < 0:
-			raise ValueError, 'invalid number of heuristics: %s' % form['num_heuristics']
-		if num_heuristics == 0:
-			num_heuristics = 1
+		num_heuristics = int(form['num_heuristics']) + 1
+		if num_heuristics < 1:
+			raise ValueError, form['num_heuristics']
 	except KeyError, e:
 		errors.append('No number of heuristics was given.')
 	except ValueError, e:
@@ -1077,65 +1088,67 @@
 
 	heuristics = list()
 	for i in xrange(num_heuristics):
-		prefix = 'heuristic' + str(i) + ':'
 		try:
-			hname = form[prefix + 'hname'].strip()
-			if not hname:
-				raise KeyError(prefix + 'hname')
-		except KeyError, e:
-			if ((not prefix + 'hpath' in form or not form['hpath'].strip()) and
-				(not prefix + 'hint' in form or not form['hint'].strip()) and
-				(not prefix + 'hscore' in form or not form['hscore'].strip())):
-				# The row is blank; ignore it.
+			h = form['heuristic%d' % i]
+			if not h or len(h) != 3:
 				continue
-			errors.append('No heuristic name was given for heuristic #%d' % i + 1)
+		except:
+			continue
 
 		try:
-			hpath = form[prefix + 'hpath']
-		except KeyError, e:
-			errors.append('No heuristic path was given for heuristic #%d' % i + 1)
-
+			hprog = h[0]
+			if not hprog:
+				raise Exception, 'no hprog'
+		except Exception, e:
+			errors.append('No program was given for heuristic %d' % i + 1)
 		try:
-			hint = int(form[prefix + 'hint'])
+			hint = int(h[1])
 			if hint < 1:
 				raise ValueError, 'Heuristic interval values must be greater than 0'
 		except KeyError, e:
-			errors.append('No heuristic interval was given for heuristic #%d' % i + 1)
+			errors.append('No interval was given for heuristic #%d' % i + 1)
 		except ValueError, e:
-			errors.append('An invalid heuristic interval was given for heuristic #%d: %s' % (i + 1, str(e)))
+			errors.append('An invalid interval was given for heuristic %d: %s' \
+				% (i + 1, str(e)))
 
 		try:
-			hscore = int(form[prefix + 'score'])
+			hscore = int(h[2])
 			if hscore < 1:
 				raise ValueError, 'Heuristic scores must be greater than 0'
 		except KeyError, e:
-			errors.append('No heuristic score was given for heuristic #%d' % i + 1)
+			errors.append('No score was given for heuristic %d' % i + 1)
 		except ValueError, e:
-			errors.append('An invalid heuristic score was given for heuristic #%d: %s' % (i + 1, str(e)))
-		heuristics.append([ hname, hpath, hint, hscore ])
+			errors.append('An invalid score was given for heuristic %d: %s' \
+				% (i + 1, str(e)))
+
+		heuristics.append([ hprog, hint, hscore ])
 
 	if len(errors) > 0:
 		return (False, {'errors': errors })
 
 	qd = QuorumD()
-	qd.addAttribute('interval', interval)
-	qd.addAttribute('votes', votes)
-	qd.addAttribute('tko', tko)
-	qd.addAttribute('min_score', min_score)
+	qd.addAttribute('interval', str(interval))
+	qd.addAttribute('votes', str(votes))
+	qd.addAttribute('tko', str(tko))
+	qd.addAttribute('min_score', str(min_score))
 
 	if device:
-		qd.addAttribute('device', device)
+		qd.addAttribute('device', str(device))
 	else:
-		qd.addAttribute('label', label)
+		qd.addAttribute('label', str(label))
 
-	cp = model.getClusterPtr()
+	if qdp:
+		try:
+			cp.removeChild(qdp)
+		except:
+			pass
 	cp.addChild(qd)
 
 	for h in heuristics:
 		new_h = Heuristic()
-		new_h.addAttribute('program', h[1])
-		new_h.addAttribute('interval', h[2])
-		new_h.addAttribute('score', h[3])
+		new_h.addAttribute('program', str(h[0]))
+		new_h.addAttribute('interval', str(h[1]))
+		new_h.addAttribute('score', str(h[2]))
 		qd.addChild(new_h)
 
 	if len(errors) > 0:
@@ -1169,8 +1182,9 @@
 		version_num = int(form['cfgver'])
 		if version_num < old_ver:
 			raise ValueError, 'configuration version number must be %d or greater.' % old_ver
-		# we'll increment the cluster version before propagating it.
-		version_num -= 1
+		if version_num != old_ver:
+			# we'll increment the cluster version before propagating it.
+			version_num -= 1
 	except KeyError, e:
 		errors.append('No cluster configuration version was given.')
 	except ValueError, e:
@@ -1200,73 +1214,6 @@
 		totem = Totem()
 		cp.addChild(totem)
 
-	if form.has_key('secauth'):
-		totem.addAttribute('secauth', '1')
-	else:
-		totem.addAttribute('secauth', '0')
-
-	try:
-		rrp_mode = form['rrp_mode'].strip().lower()
-		if not rrp_mode:
-			raise KeyError, 'rrp_mode'
-		if rrp_mode != 'none' and rrp_mode != 'active' and 'rrp_mode' != 'passive':
-			raise Exception, '%s is an invalid value for redundant ring protocol mode' % rrp_mode
-		totem.addAttribute('rrp_mode', str(rrp_mode))
-	except KeyError, e:
-		try:
-			totem.removeAttribute('rrp_mode')
-		except:
-			pass
-	except Exception, e:
-		errors.append(str(e))
-
-	try:
-		net_mtu = form['net_mtu'].strip()
-		if not net_mtu:
-			raise KeyError, 'net_mtu'
-		net_mtu = int(net_mtu)
-		if net_mtu < 1:
-			raise ValueError, '%d is an invalid value for network MTU' % net_mtu
-		totem.addAttribute('net_mtu', str(net_mtu))
-	except KeyError, e:
-		try:
-			totem.removeAttribute('net_mtu')
-		except:
-			pass
-	except Exception, e:
-		errors.append(str(e))
-
-	try:
-		threads = form['threads'].strip()
-		if not threads:
-			raise KeyError, 'threads'
-		threads = int(threads)
-		if threads < 0:
-			raise ValueError, '%d is an invalid value for number of threads' % threads
-		totem.addAttribute('threads', str(threads))
-	except KeyError, e:
-		try:
-			totem.removeAttribute('threads')
-		except:
-			pass
-	except Exception, e:
-		errors.append(str(e))
-
-	try:
-		vsftype = form['vsftype'].strip().lower()
-		if not vsftype:
-			raise KeyError, 'vsftype'
-		if vsftype != 'none' and vsftype != 'ykd':
-			raise ValueError, '%s is an invalid value for virtual synchrony type' % vsftype
-		totem.addAttribute('vsftype', str(vsftype))
-	except KeyError, e:
-		try:
-			totem.removeAttribute('vsftype')
-		except:
-			pass
-	except Exception, e:
-		errors.append(str(e))
-
 	try:
 		token = form['token'].strip()
 		if not token:
@@ -1284,48 +1231,16 @@
 		errors.append(str(e))
 
 	try:
-		token_retransmit = form['token_retransmit'].strip()
-		if not token_retransmit:
-			raise KeyError, 'token_retransmit'
-		token_retransmit = int(token_retransmit)
-		if token_retransmit < 1:
-			raise ValueError, '%d is an invalid value for token retransmit' % token_retransmit
-		totem.addAttribute('token_retransmit', str(token_retransmit))
+		token_retransmits_before_loss_const = form['token_retransmits_before_loss_const'].strip()
+		if not token_retransmits_before_loss_const:
+			raise KeyError, 'token_retransmits_before_loss_const'
+		token_retransmits_before_loss_const = int(token_retransmits_before_loss_const)
+		if token_retransmits_before_loss_const < 1:
+			raise ValueError, '%d is an invalid value for number of token retransmits before loss' % token_retransmits_before_loss_const
+		totem.addAttribute('token_retransmits_before_loss_const', str(token_retransmits_before_loss_const))
 	except KeyError, e:
 		try:
-			totem.removeAttribute('token_retransmit')
-		except:
-			pass
-	except Exception, e:
-		errors.append(str(e))
-
-	try:
-		hold = form['hold'].strip()
-		if not hold:
-			raise KeyError, 'hold'
-		hold = int(hold)
-		if hold < 1:
-			raise ValueError, '%d is not a valid value for hold token timeout' % hold
-		totem.addAttribute('hold', str(hold))
-	except KeyError, e:
-		try:
-			totem.removeAttribute('hold')
-		except:
-			pass
-	except Exception, e:
-		errors.append(str(e))
-
-	try:
-		retransmits_before_loss = form['retransmits_before_loss'].strip()
-		if not retransmits_before_loss:
-			raise KeyError, 'retransmits_before_loss'
-		retransmits_before_loss = int(retransmits_before_loss)
-		if retransmits_before_loss < 1:
-			raise ValueError, '%d is an invalid value for number of retransmits before loss' % retransmits_before_loss
-		totem.addAttribute('retransmits_before_loss', str(retransmits_before_loss))
-	except KeyError, e:
-		try:
-			totem.removeAttribute('retransmits_before_loss')
+			totem.removeAttribute('token_retransmits_before_loss_const')
 		except:
 			pass
 	except Exception, e:
@@ -1348,22 +1263,6 @@
 		errors.append(str(e))
 
 	try:
-		send_join = form['send_join'].strip()
-		if not send_join:
-			raise KeyError, 'send_join'
-		send_join = int(send_join)
-		if send_join < 0:
-			raise ValueError, '%d is an invalid value for time to wait before sending a join message' % send_join
-		totem.addAttribute('send_join', str(send_join))
-	except KeyError, e:
-		try:
-			totem.removeAttribute('send_join')
-		except:
-			pass
-	except Exception, e:
-		errors.append(str(e))
-
-	try:
 		consensus = form['consensus'].strip()
 		if not consensus:
 			raise KeyError, 'consensus'
@@ -1379,182 +1278,6 @@
 	except Exception, e:
 		errors.append(str(e))
 
-	try:
-		merge = form['merge'].strip()
-		if not merge:
-			raise KeyError, 'merge'
-		merge = int(merge)
-		if merge < 1:
-			raise ValueError, '%d is an invalid value for merge detection timeout' % merge
-		totem.addAttribute('merge', str(merge))
-	except KeyError, e:
-		try:
-			totem.removeAttribute('merge')
-		except:
-			pass
-	except Exception, e:
-		errors.append(str(e))
-
-	try:
-		downcheck = form['downcheck'].strip()
-		if not downcheck:
-			raise KeyError, 'downcheck'
-		downcheck = int(downcheck)
-		if downcheck < 1:
-			raise ValueError, '%d is an invalid value for interface down check timeout' % downcheck
-		totem.addAttribute('downcheck', str(downcheck))
-	except KeyError, e:
-		try:
-			totem.removeAttribute('downcheck')
-		except:
-			pass
-	except Exception, e:
-		errors.append(str(e))
-
-	try:
-		fail_to_recv_const = form['fail_to_recv_const'].strip()
-		if not fail_to_recv_const:
-			raise KeyError, 'fail_to_recv_const'
-		fail_to_recv_const = int(fail_to_recv_const)
-		if fail_to_recv_const < 1:
-			raise ValueError, '%d is an invalid value for fail to receive constant' % fail_to_recv_const
-		totem.addAttribute('fail_to_recv_const', str(fail_to_recv_const))
-	except KeyError, e:
-		try:
-			totem.removeAttribute('fail_to_recv_const')
-		except:
-			pass
-	except Exception, e:
-		errors.append(str(e))
-
-	try:
-		seqno_unchanged_const = form['seqno_unchanged_const'].strip()
-		if not seqno_unchanged_const:
-			raise KeyError, 'seqno_unchanged_const'
-		seqno_unchanged_const = int(seqno_unchanged_const)
-		if seqno_unchanged_const < 1:
-			raise ValueError, '%d is an invalid value for rotations with no multicast traffic before merge detection timeout started' % seqno_unchanged_const
-		totem.addAttribute('seqno_unchanged_const', str(seqno_unchanged_const))
-	except KeyError, e:
-		try:
-			totem.removeAttribute('seqno_unchanged_const')
-		except:
-			pass
-	except Exception, e:
-		errors.append(str(e))
-
-	try:
-		heartbeat_failures_allowed = form['heartbeat_failures_allowed'].strip()
-		if not heartbeat_failures_allowed:
-			raise KeyError, 'heartbeat_failures_allowed'
-		heartbeat_failures_allowed = int(heartbeat_failures_allowed)
-		if heartbeat_failures_allowed < 0:
-			raise ValueError, '%d is an invalid value for number of heartbeat failures allowed' % heartbeat_failures_allowed
-		totem.addAttribute('heartbeat_failures_allowed', str(heartbeat_failures_allowed))
-	except KeyError, e:
-		try:
-			totem.removeAttribute('heartbeat_failures_allowed')
-		except:
-			pass
-	except Exception, e:
-		errors.append(str(e))
-
-	try:
-		max_network_delay = form['max_network_delay'].strip()
-		if not max_network_delay:
-			raise KeyError, 'max_network_delay'
-		max_network_delay = int(max_network_delay)
-		if max_network_delay < 1:
-			raise ValueError, '%d is an invalid value for maximum network delay' % max_network_delay
-		totem.addAttribute('max_network_delay', str(max_network_delay))
-	except KeyError, e:
-		try:
-			totem.removeAttribute('max_network_delay')
-		except:
-			pass
-	except Exception, e:
-		errors.append(str(e))
-
-	try:
-		window_size = form['window_size'].strip()
-		if not window_size:
-			raise KeyError, 'window_size'
-		window_size = int(window_size)
-		if window_size < 1:
-			raise ValueError, '%d is an invalid value for window size' % window_size
-		totem.addAttribute('window_size', str(window_size))
-	except KeyError, e:
-		try:
-			totem.removeAttribute('window_size')
-		except:
-			pass
-	except Exception, e:
-		errors.append(str(e))
-
-	try:
-		max_messages = form['max_messages'].strip()
-		if not max_messages:
-			raise KeyError, 'max_messages'
-		max_messages = int(max_messages)
-		if max_messages < 1:
-			raise ValueError, '%d is an invalid value for maximum messages' % max_messages
-		totem.addAttribute('max_messages', str(max_messages))
-	except KeyError, e:
-		try:
-			totem.removeAttribute('max_messages')
-		except:
-			pass
-	except Exception, e:
-		errors.append(str(e))
-
-	try:
-		rrp_problem_count_timeout = form['rrp_problem_count_timeout'].strip()
-		if not rrp_problem_count_timeout:
-			raise KeyError, 'rrp_problem_count_timeout'
-		rrp_problem_count_timeout = int(rrp_problem_count_timeout)
-		if rrp_problem_count_timeout < 1:
-			raise ValueError, '%d is an invalid value for RRP problem count timeout' % rrp_problem_count_timeout
-		totem.addAttribute('rrp_problem_count_timeout', str(rrp_problem_count_timeout))
-	except KeyError, e:
-		try:
-			totem.removeAttribute('rrp_problem_count_timeout')
-		except:
-			pass
-	except Exception, e:
-		errors.append(str(e))
-
-	try:
-		rrp_problem_count_threshold = form['rrp_problem_count_threshold'].strip()
-		if not rrp_problem_count_threshold:
-			raise KeyError, 'rrp_problem_count_threshold'
-		rrp_problem_count_threshold = int(rrp_problem_count_threshold)
-		if rrp_problem_count_threshold < 1:
-			raise ValueError, '%d is an invalid value for RRP problem count threshold' % rrp_problem_count_threshold
-		totem.addAttribute('rrp_problem_count_threshold', str(rrp_problem_count_threshold))
-	except KeyError, e:
-		try:
-			totem.removeAttribute('rrp_problem_count_threshold')
-		except:
-			pass
-	except Exception, e:
-		errors.append(str(e))
-
-	try:
-		rrp_token_expired_timeout = form['rrp_token_expired_timeout'].strip()
-		if not rrp_token_expired_timeout:
-			raise KeyError, 'rrp_token_expired_timeout'
-		rrp_token_expired_timeout = int(rrp_token_expired_timeout)
-		if rrp_token_expired_timeout < 1:
-			raise ValueError, '%d is an invalid value for RRP token expired timeout' % rrp_token_expired_timeout
-		totem.addAttribute('rrp_token_expired_timeout', str(rrp_token_expired_timeout))
-	except KeyError, e:
-		try:
-			totem.removeAttribute('rrp_token_expired_timeout')
-		except:
-			pass
-	except Exception, e:
-		errors.append(str(e))
-
 	if len(errors) > 0:
 		return (False, {'errors': errors})
 	return (True, {})
@@ -4172,6 +3895,7 @@
         luci_log.debug_verbose('GCI0: unable to determine cluster name')
         return {}
 
+  clumap = {}
   if model is None:
     try:
       model = getModelForCluster(self, cluname)
@@ -4181,9 +3905,12 @@
     except Exception, e:
       luci_log.debug_verbose('GCI1: unable to get model for cluster %s: %s' % (cluname, str(e)))
       return {}
+  else:
+    totem = model.getTotemPtr()
+    if totem:
+      clumap['totem'] = totem.getAttributes()
 
   prop_baseurl = req['URL'] + '?' + PAGETYPE + '=' + CLUSTER_CONFIG + '&' + CLUNAME + '=' + cluname + '&'
-  clumap = {}
   basecluster_url = prop_baseurl + PROPERTIES_TAB + "=" + PROP_GENERAL_TAB
   #needed:
   clumap['basecluster_url'] = basecluster_url
@@ -4285,27 +4012,21 @@
       clumap['label'] = label
 
     heuristic_kids = qdp.getChildren()
-    h_ctr = 0
+
     for kid in heuristic_kids:
       hmap = {}
-      hname = kid.getAttribute('name')
-      if hname is None:
-        hname = h_ctr
-        h_ctr = h_ctr + 1
       hprog = kid.getAttribute('program')
-      hscore = kid.getAttribute('score')
-      hinterval = kid.getAttribute('interval')
       if hprog is None:
         continue
-      if hname is not None:
-        hmap['hname'] = hname
-      else:
-        hmap['hname'] = ""
+
+      hscore = kid.getAttribute('score')
       hmap['hprog'] = hprog
       if hscore is not None:
         hmap['hscore'] = hscore
       else:
         hmap['hscore'] = ""
+
+      hinterval = kid.getAttribute('interval')
       if hinterval is not None:
         hmap['hinterval'] = hinterval
       else:




More information about the Cluster-devel mailing list