From: rmccabe@sourceware.org <rmccabe@sourceware.org>
To: cluster-devel.redhat.com
Subject: [Cluster-devel] conga/luci cluster/fence_device.js cluster/for ...
Date: 10 Jan 2007 22:53:58 -0000 [thread overview]
Message-ID: <20070110225358.16117.qmail@sourceware.org> (raw)
CVSROOT: /cvs/cluster
Module name: conga
Branch: RHEL5
Changes by: rmccabe at sourceware.org 2007-01-10 22:53:56
Modified files:
luci/cluster : fence_device.js form-macros
luci/homebase : luci_homebase.css
luci/site/luci/Extensions: cluster_adapters.py
conga_constants.py
homebase_adapters.py
Log message:
fixes related to bz212021
Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/cluster/fence_device.js.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/cluster/form-macros.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.90.2.13&r2=1.90.2.14
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/homebase/luci_homebase.css.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.28.2.3&r2=1.28.2.4
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.16&r2=1.120.2.17
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/conga_constants.py.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.19.2.5&r2=1.19.2.6
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.10&r2=1.34.2.11
--- conga/luci/cluster/fence_device.js 2006/12/12 13:37:24 1.2.2.1
+++ conga/luci/cluster/fence_device.js 2007/01/10 22:53:56 1.2.2.2
@@ -1,3 +1,46 @@
+var num_fences_level = Array(0, 0)
+var num_fence_instances = new Array()
+
+function del_fence_instance(fi_div_id) {
+ delete_element_id(fi_div_id);
+}
+
+function del_fence(fence_id) {
+ delete_element_id(fence_id);
+}
+
+function add_fence_instance(fi_cont_id, fence_type) {
+ var instance_div = document.getElementById(fi_cont_id + '_instances');
+ if (!instance_div)
+ return (-1);
+
+ var fi_form = document.getElementById(fence_type + '_instance');
+ if (fi_form) {
+ var cloned_iform = fi_form.cloneNode(1);
+ var fencei_name = fi_cont_id + '_' + num_fence_instances[fi_cont_id]++;
+ cloned_iform.id = fencei_name;
+ cloned_iform.name = fencei_name;
+ cloned_iform.className = 'fence_instance';
+
+ var form_elem = document.createElement('form');
+ form_elem.name = cloned_iform.id;
+ form_elem.appendChild(cloned_iform);
+ var ielem = cloned_iform.getElementsByTagName('input');
+ for (var i = 0 ; i < ielem.length ; i++) {
+ if (ielem[i].name == 'parent_fencedev') {
+ ielem[i].value = fi_cont_id;
+ } else if ( ielem[i].type == 'button' &&
+ ielem[i].name == 'remove_fence')
+ {
+ ielem[i].setAttribute('onclick',
+ 'del_fence_instance(\'' + cloned_iform.id + '\')');
+ }
+ }
+
+ instance_div.appendChild(form_elem);
+ }
+}
+
function swap_fence_div(container_id, element_id) {
var container_element = document.getElementById(container_id);
if (!container_element) {
@@ -25,14 +68,13 @@
var fence_id = fence_opt.value;
var child_element = document.getElementById(fence_id);
- if (container_element.firstChild)
- container_element.removeChild(container_element.firstChild);
-
if (!child_element)
return (-1);
+ if (container_element.firstChild)
+ container_element.removeChild(container_element.firstChild);
var target = child_element.cloneNode(1);
- target.id = null;
+ target.id = '';
var fence_type = fence_id;
if (fence_opt.className.match(/shared_fencedev/)) {
@@ -46,13 +88,66 @@
}
}
+ var target_form = document.createElement('form');
+ target_form.name = container_element.id;
+ target_form.appendChild(target);
+ container_element.appendChild(target_form);
+
var fi_form = document.getElementById(fence_type + '_instance');
- if (fi_form)
- target.appendChild(fi_form.cloneNode(1));
- container_element.appendChild(target);
-}
+ var sharable = 0;
+ if (fi_form) {
+ var idiv = document.createElement('div');
+ idiv.id = container_id + '_instances';
+ idiv.name = idiv.id;
+
+ var cloned_iform = fi_form.cloneNode(1);
+ cloned_iform.id = container_id + '_0';
+ cloned_iform.name = cloned_iform.id;
+ cloned_iform.className = 'fence_instance';
+
+ var form_elem = document.createElement('form');
+ form_elem.name = cloned_iform.id;
+ form_elem.appendChild(cloned_iform);
+ var ielem = cloned_iform.getElementsByTagName('input');
+ for (var i = 0 ; i < ielem.length ; i++) {
+ if (ielem[i].name == 'parent_fencedev') {
+ ielem[i].value = container_id;
+ } else if ( ielem[i].type == 'button'
+ && ielem[i].name == 'remove_fence')
+ {
+ ielem[i].setAttribute('onclick',
+ 'del_fence_instance(\'' + cloned_iform.id + '\')');
+ }
+ }
+ idiv.appendChild(form_elem);
+ container_element.appendChild(idiv);
+ num_fence_instances[container_id] = 1;
+ sharable++;
+ }
-var num_fences_level = Array(0, 0)
+ var remove_div = document.createElement('div');
+ remove_div.className = 'hbSubmit';
+
+ var remove_button = document.createElement('input');
+ remove_button.setAttribute('type', 'button');
+ remove_button.setAttribute('value', 'Remove this device');
+ remove_button.setAttribute('onclick', "del_fence('" + container_element.id + "');");
+
+ if (sharable) {
+ var add_instance_button = document.createElement('input');
+ add_instance_button.setAttribute('type', 'button');
+ add_instance_button.setAttribute('name', 'add_fence_inst');
+ add_instance_button.setAttribute('value', 'Add an instance');
+ add_instance_button.setAttribute('onclick', "add_fence_instance('" + container_element.id + "','" + fence_type + "');");
+ add_instance_button.className = 'pad_left';
+ }
+
+ var remove_form = document.createElement('form');
+ remove_form.appendChild(remove_button);
+ remove_form.appendChild(add_instance_button);
+ remove_div.appendChild(remove_form);
+ container_element.appendChild(remove_div);
+}
function add_node_fence_device(fence_level) {
var cont_name = 'fence_list_level' + fence_level;
@@ -67,9 +162,10 @@
var div_elem = document.createElement('div');
if (!div_elem)
return (-1);
- var level_num_fences = num_fences_level[fence_level];
+ var level_num_fences = num_fences_level[fence_level - 1];
div_elem.id = 'fence' + fence_level + '_' + level_num_fences;
+ div_elem.className = 'fence_level';
chooser_elem = chooser_elem.cloneNode(1);
chooser_elem.id = null;
chooser_elem.className = null;
@@ -91,5 +187,44 @@
div_elem.appendChild(chooser_elem);
container.appendChild(div_elem);
- num_fences_level[fence_level]++;
+ num_fences_level[fence_level - 1]++;
+}
+
+function validate_fence(master_form, container_id) {
+ var errors = new Array();
+ var div_elem = document.getElementById(container_id);
+ if (!div_elem)
+ return (-1);
+ var form_xml = '';
+
+ var form = div_elem.getElementsByTagName('form');
+ for (var i = 0 ; i < form.length ; i++) {
+ var input_elem = form[i].getElementsByTagName('input');
+ var temp = '';
+ for (var j = 0 ; j < input_elem.length ; j++) {
+ var res_type = input_elem[j].type;
+ if (res_type == 'hidden' || res_type == 'text' ||
+ res_type == 'password')
+ {
+ temp += '<input type="' + res_type + '" name="' + input_elem[j].name + '" value="' + input_elem[j].value + '" />';
+ } else if (res_type == 'checkbox' || res_type == 'radio') {
+ if (input_elem[j].checked)
+ temp += '<input type="' + res_type + '" name="' + input_elem[j].name + '" checked="checked"';
+ if (res_type == 'radio')
+ temp += ' value="' + input_elem[j].value + '"';
+ temp += ' />';
+ }
+ }
+ var select_elem = form[i].getElementsByTagName('select');
+ for (var j = 0 ; j < select_elem.length ; j++) {
+ temp += '<input type="text" name="' + select_elem[j].name + '" value="' + select_elem[j].options[select_elem[j].options.selectedIndex].value + '" />';
+ }
+
+ form_xml += '<form id="' + form[i].getAttribute('name') + '">' + temp + '</form>';
+ }
+
+ master_form.fence_xml.value = '<formlist>' + form_xml + '</formlist>';
+
+ if (confirm('Update this node\'s fence configuration?'))
+ master_form.submit();
}
--- conga/luci/cluster/form-macros 2007/01/04 00:22:13 1.90.2.13
+++ conga/luci/cluster/form-macros 2007/01/10 22:53:56 1.90.2.14
@@ -1166,6 +1166,7 @@
</div>
<div metal:define-macro="shared-fence-option-list">
+ <option>Select a shared fence device</option>
<option name="fence_apc" value="fence_apc">APC Power Switch</option>
<option name="fence_wti" value="fence_wti">WTI Power Switch</option>
<option name="fence_brocade" value="fence_brocade">Brocade Fabric Switch</option>
@@ -1182,6 +1183,7 @@
</div>
<div metal:define-macro="fence-option-list">
+ <option>Select a fence device</option>
<option name="fence_apc" value="fence_apc">APC Power Switch</option>
<option name="fence_wti" value="fence_wti">WTI Power Switch</option>
<option name="fence_brocade" value="fence_brocade">Brocade Fabric Switch</option>
@@ -1202,6 +1204,31 @@
<option name="fence_manual" value="fence_manual">Manual Fencing</option>
</div>
+<div metal:define-macro="fence-form-unknown"
+ tal:attributes="id cur_fencedev/name | nothing">
+
+ <div id="fence_unknown" class="fencedev">
+ <table>
+ <tr>
+ <td><strong class="cluster">Fence Type</strong></td>
+ <td>[unknown]</td>
+ </tr>
+ <tr>
+ <td>Name</td>
+ <td>
+ <span tal:replace="cur_fencedev/name | nothing" />
+ </td>
+ </tr>
+ </table>
+
+ <tal:block tal:condition="exists: cur_fencedev">
+ <input type="hidden" name="existing_device" value="1" />
+ <input type="hidden" name="old_name"
+ tal:attributes="value cur_fencedev/name | nothing" />
+ </tal:block>
+ </div>
+</div>
+
<div metal:define-macro="fence-form-apc"
tal:attributes="id cur_fencedev/name | nothing">
@@ -1223,7 +1250,7 @@
<tr>
<td>IP Address</td>
<td>
- <input name="ip_addr" type="text"
+ <input name="ipaddr" type="text"
tal:attributes="
disabled cur_fencedev/isShared | nothing;
value cur_fencedev/ipaddr | nothing" />
@@ -1241,7 +1268,7 @@
<tr>
<td>Password</td>
<td>
- <input name="password" type="password" autocomplete="off"
+ <input name="passwd" type="password" autocomplete="off"
tal:attributes="
disabled cur_fencedev/isShared | nothing;
value cur_fencedev/passwd | nothing" />
@@ -1249,15 +1276,6 @@
</tr>
</table>
- <div name="instances">
- <tal:block tal:condition="exists: cur_fence_instances">
- <tal:block tal:repeat="cur_instance cur_fence_instances">
- <tal:block
- metal:use-macro="here/form-macros/macros/fence-instance-form-apc" />
- </tal:block>
- </tal:block>
- </div>
-
<tal:block tal:condition="exists: cur_fencedev">
<input type="hidden" name="existing_device" value="1" />
<input type="hidden" name="old_name"
@@ -1290,7 +1308,7 @@
<tr>
<td>IP Address</td>
<td>
- <input name="ip_addr" type="text"
+ <input name="ipaddr" type="text"
tal:attributes="
disabled cur_fencedev/isShared | nothing;
value cur_fendev/ipaddr | nothing" />
@@ -1308,7 +1326,7 @@
<tr>
<td>Password</td>
<td>
- <input name="password" type="password" autocomplete="off"
+ <input name="passwd" type="password" autocomplete="off"
tal:attributes="
disabled cur_fencedev/isShared | nothing;
value cur_fencedev/passwd | nothing" />
@@ -1316,15 +1334,6 @@
</tr>
</table>
- <div name="instances">
- <tal:block tal:condition="exists: cur_fence_instances">
- <tal:block tal:repeat="cur_instance cur_fence_instances">
- <tal:block
- metal:use-macro="here/form-macros/macros/fence-instance-form-mcdata" />
- </tal:block>
- </tal:block>
- </div>
-
<tal:block tal:condition="exists: cur_fencedev">
<input type="hidden" name="existing_device" value="1" />
<input type="hidden" name="old_name"
@@ -1357,7 +1366,7 @@
<tr>
<td>IP Address</td>
<td>
- <input name="ip_addr" type="text"
+ <input name="ipaddr" type="text"
tal:attributes="
disabled cur_fencedev/isShared | nothing;
value cur_fencedev/ipaddr | nothing" />
@@ -1366,7 +1375,7 @@
<tr>
<td>Password</td>
<td>
- <input name="password" type="password" autocomplete="off"
+ <input name="passwd" type="password" autocomplete="off"
tal:attributes="
disabled cur_fencedev/isShared | nothing;
value cur_fencedev/passwd | nothing" />
@@ -1374,15 +1383,6 @@
</tr>
</table>
- <div name="instances">
- <tal:block tal:condition="exists: cur_fence_instances">
- <tal:block tal:repeat="cur_instance cur_fence_instances">
- <tal:block
- metal:use-macro="here/form-macros/macros/fence-instance-form-wti" />
- </tal:block>
- </tal:block>
- </div>
-
<tal:block tal:condition="exists: cur_fencedev">
<input type="hidden" name="existing_device" value="1" />
<input type="hidden" name="old_name"
@@ -1427,7 +1427,7 @@
<tr>
<td>Password</td>
<td>
- <input name="password" type="password" autocomplete="off"
+ <input name="passwd" type="password" autocomplete="off"
tal:attributes="value cur_fencedev/passwd | nothing" />
</td>
</tr>
@@ -1462,7 +1462,7 @@
<tr>
<td>IP Address</td>
<td>
- <input name="ip_addr" type="text"
+ <input name="ipaddr" type="text"
tal:attributes="value cur_fencedev/ipaddr | nothing" />
</td>
</tr>
@@ -1476,7 +1476,7 @@
<tr>
<td>Password</td>
<td>
- <input name="password" type="password" autocomplete="off"
+ <input name="passwd" type="password" autocomplete="off"
tal:attributes="value cur_fencedev/passwd | nothing" />
</td>
</table>
@@ -1524,7 +1524,7 @@
<tr>
<td>Password</td>
<td>
- <input name="password" type="password" autocomplete="off"
+ <input name="passwd" type="password" autocomplete="off"
tal:attributes="value cur_fencedev/passwd | nothing" />
</td>
</tr>
@@ -1561,7 +1561,7 @@
<tr>
<td>IP Address</td>
<td>
- <input name="ip_addr" type="text"
+ <input name="ipaddr" type="text"
tal:attributes="
disabled cur_fencedev/isShared | nothing;
value cur_fencedev/ipaddr | nothing" />
@@ -1579,7 +1579,7 @@
<tr>
<td>Password</td>
<td>
- <input name="password" type="password" autocomplete="off"
+ <input name="passwd" type="password" autocomplete="off"
tal:attributes="
disabled cur_fencedev/isShared | nothing;
value cur_fencedev/passwd | nothing" />
@@ -1587,15 +1587,6 @@
</tr>
</table>
- <div name="instances">
- <tal:block tal:condition="exists: cur_fence_instances">
- <tal:block tal:repeat="cur_instance cur_fence_instances">
- <tal:block
- metal:use-macro="here/form-macros/macros/fence-instance-form-brocade" />
- </tal:block>
- </tal:block>
- </div>
-
<tal:block tal:condition="exists: cur_fencedev">
<input type="hidden" name="existing_device" value="1" />
<input type="hidden" name="old_name"
@@ -1627,7 +1618,12 @@
</tr>
<tr>
<td>IP Address</td>
- <td><input name="hostname" type="text"/></td>
+ <td>
+ <input name="hostname" type="text"
+ tal:attributes="
+ disabled cur_fencedev/isShared | nothing;
+ value cur_fencedev/hostname | nothing" />
+ </td>
</tr>
<tr>
<td>Login</td>
@@ -1641,7 +1637,7 @@
<tr>
<td>Password</td>
<td>
- <input name="password" type="password" autocomplete="off"
+ <input name="passwd" type="password" autocomplete="off"
tal:attributes="
disabled cur_fencedev/isShared | nothing;
value cur_fencedev/passwd | nothing" />
@@ -1649,15 +1645,6 @@
</tr>
</table>
- <div name="instances">
- <tal:block tal:condition="exists: cur_fence_instances">
- <tal:block tal:repeat="cur_instance cur_fence_instances">
- <tal:block
- metal:use-macro="here/form-macros/macros/fence-instance-form-sanbox2" />
- </tal:block>
- </tal:block>
- </div>
-
<tal:block tal:condition="exists: cur_fencedev">
<input type="hidden" name="existing_device" value="1" />
<input type="hidden" name="old_name"
@@ -1690,7 +1677,7 @@
<tr>
<td>IP Address</td>
<td>
- <input name="ip_addr" type="text"
+ <input name="ipaddr" type="text"
tal:attributes="
disabled cur_fencedev/isShared | nothing;
value cur_fencedev/ipaddr | nothing" />
@@ -1699,7 +1686,7 @@
<tr>
<td>Password</td>
<td>
- <input name="password" type="password" autocomplete="off"
+ <input name="passwd" type="password" autocomplete="off"
tal:attributes="
disabled cur_fencedev/isShared | nothing;
value cur_fencedev/passwd | nothing" />
@@ -1707,15 +1694,6 @@
</tr>
</table>
- <div name="instances">
- <tal:block tal:condition="exists: cur_fence_instances">
- <tal:block tal:repeat="cur_instance cur_fence_instances">
- <tal:block
- metal:use-macro="here/form-macros/macros/fence-instance-form-brocade" />
- </tal:block>
- </tal:block>
- </div>
-
<tal:block tal:condition="exists: cur_fencedev">
<input type="hidden" name="existing_device" value="1" />
<input type="hidden" name="old_name"
@@ -1756,15 +1734,6 @@
</tr>
</table>
- <div name="instances">
- <tal:block tal:condition="exists: cur_fence_instances">
- <tal:block tal:repeat="cur_instance cur_fence_instances">
- <tal:block
- metal:use-macro="here/form-macros/macros/fence-instance-form-gnbd" />
- </tal:block>
- </tal:block>
- </div>
-
<tal:block tal:condition="exists: cur_fencedev">
<input type="hidden" name="existing_device" value="1" />
<input type="hidden" name="old_name"
@@ -1814,15 +1783,6 @@
</tr>
</table>
- <div name="instances">
- <tal:block tal:condition="exists: cur_fence_instances">
- <tal:block tal:repeat="cur_instance cur_fence_instances">
- <tal:block
- metal:use-macro="here/form-macros/macros/fence-instance-form-egenera" />
- </tal:block>
- </tal:block>
- </div>
-
<tal:block tal:condition="exists: cur_fencedev">
<input type="hidden" name="existing_device" value="1" />
<input type="hidden" name="old_name"
@@ -1853,7 +1813,7 @@
<tr>
<td>IP Address</td>
<td>
- <input name="ip_addr" type="text"
+ <input name="ipaddr" type="text"
tal:attributes="value cur_fencedev/ipaddr | nothing" />
</td>
</tr>
@@ -1867,7 +1827,7 @@
<tr>
<td>Password</td>
<td>
- <input name="password" type="password" autocomplete="off"
+ <input name="passwd" type="password" autocomplete="off"
tal:attributes="value cur_fencedev/passwd | nothing" />
</td>
</tr>
@@ -1879,6 +1839,7 @@
tal:attributes="value cur_fencedev/name | nothing" />
</tal:block>
+ <input type="hidden" name="sharable" value="1" />
<input type="hidden" name="fence_type" value="fence_bladecenter" />
</div>
</div>
@@ -1904,7 +1865,7 @@
<tr>
<td>IP Address</td>
<td>
- <input name="ip_addr" type="text"
+ <input name="ipaddr" type="text"
tal:attributes="
disabled cur_fencedev/isShared | nothing;
value cur_fencedev/ipaddr | nothing" />
@@ -1922,7 +1883,7 @@
<tr>
<td>Password</td>
<td>
- <input name="password" type="password" autocomplete="off"
+ <input name="passwd" type="password" autocomplete="off"
tal:attributes="
disabled cur_fencedev/isShared | nothing;
value cur_fencedev/passwd | nothing" />
@@ -1930,15 +1891,6 @@
</tr>
</table>
- <div name="instances">
- <tal:block tal:condition="exists: cur_fence_instances">
- <tal:block tal:repeat="cur_instance cur_fence_instances">
- <tal:block
- metal:use-macro="here/form-macros/macros/fence-instance-form-bullpap" />
- </tal:block>
- </tal:block>
- </div>
-
<tal:block tal:condition="exists: cur_fencedev">
<input type="hidden" name="existing_device" value="1" />
<input type="hidden" name="old_name"
@@ -2012,15 +1964,6 @@
</tr>
</table>
- <div name="instances">
- <tal:block tal:condition="exists: cur_fence_instances">
- <tal:block tal:repeat="cur_instance cur_fence_instances">
- <tal:block
- metal:use-macro="here/form-macros/macros/fence-instance-form-xvm" />
- </tal:block>
- </tal:block>
- </div>
-
<tal:block tal:condition="exists: cur_fencedev">
<input type="hidden" name="existing_device" value="1" />
<input type="hidden" name="old_name"
@@ -2082,7 +2025,7 @@
<tr>
<td>IP Address</td>
<td>
- <input name="ip_addr" type="text"
+ <input name="ipaddr" type="text"
tal:attributes="value cur_fencedev/ipaddr | nothing" />
</td>
</tr>
@@ -2104,6 +2047,14 @@
<td>Authentication Type</td>
<td><input name="auth_type" type="text" Title="Options are to leave blank for none, password, md2, or md5"/></td>
</tr>
+ <tr>
+ <td>Use Lanplus</td>
+ <td>
+ <input name="lanplus" type="checkbox"
+ tal:attributes="checked cur_fencedev/lanplus | nothing"
+ />
+ </td>
+ </tr>
</table>
<tal:block tal:condition="exists: cur_fencedev">
@@ -2219,8 +2170,11 @@
</tal:block>
</div>
-<div metal:define-macro="fence-instance-form-apc">
- <div id="fence_apc_instance" name="fence_apc" class="fencedev_instance">
+<div metal:define-macro="fence-instance-form-apc"
+ tal:omit-tag="exists: cur_fence_dev_id">
+
+ <div id="fence_apc_instance" name="fence_apc" class="fencedev_instance"
+ tal:omit-tag="exists: cur_fence_dev_id">
<table>
<tr>
<td>Port</td>
@@ -2230,21 +2184,39 @@
</td>
</tr>
<tr>
- <td>Switch</td>
+ <td>Switch (optional)</td>
<td>
<input name="switch" type="text"
tal:attributes="value cur_instance/switch | nothing" />
</td>
</tr>
- <input tal:condition="exists: cur_instance"
- type="hidden" name="existing_instance" value="1" />
- <input type="hidden" name="parent_fencedev" value="" />
+ <tr><td colspan="2">
+ <div class="hbSubmit">
+ <tal:block tal:condition="exists:cur_fence_instance_id">
+ <input type="button" name="remove_fence"
+ value="Remove this instance"
+ tal:attributes="onclick python: 'del_fence_instance(\'' + cur_fence_instance_id + '\')'" />
+ </tal:block>
+ <tal:block tal:condition="not:exists:cur_fence_instance_id">
+ <input type="button" name="remove_fence"
+ value="Remove this instance" />
+ </tal:block>
+ </div>
+ </td></tr>
</table>
+
+ <input type="hidden" name="fence_instance" value="1" />
+ <input tal:condition="exists: cur_instance"
+ type="hidden" name="existing_instance" value="1" />
+ <input type="hidden" name="parent_fencedev"
+ tal:attributes="value cur_fence_dev_id | nothing" />
</div>
</div>
-<div metal:define-macro="fence-instance-form-egenera">
- <div id="fence_egenera_instance" name="fence_egenera" class="fencedev_instance">
+<div metal:define-macro="fence-instance-form-egenera"
+ tal:omit-tag="exists: cur_fence_dev_id">
+ <div id="fence_egenera_instance" name="fence_egenera" class="fencedev_instance"
+ tal:omit-tag="exists: cur_fence_dev_id">
<table>
<tr>
<td>lpan</td>
@@ -2260,15 +2232,33 @@
tal:attributes="value cur_instance/pserver | nothing" />
</td>
</tr>
- <input tal:condition="exists: cur_instance"
- type="hidden" name="existing_instance" value="1" />
- <input type="hidden" name="parent_fencedev" value="" />
+ <tr><td colspan="2">
+ <div class="hbSubmit">
+ <tal:block tal:condition="exists:cur_fence_instance_id">
+ <input type="button" name="remove_fence"
+ value="Remove this instance"
+ tal:attributes="onclick python: 'del_fence_instance(\'' + cur_fence_instance_id + '\')'" />
+ </tal:block>
+ <tal:block tal:condition="not:exists:cur_fence_instance_id">
+ <input type="button" name="remove_fence"
+ value="Remove this instance" />
+ </tal:block>
+ </div>
+ </td></tr>
</table>
+
+ <input type="hidden" name="fence_instance" value="1" />
+ <input tal:condition="exists: cur_instance"
+ type="hidden" name="existing_instance" value="1" />
+ <input type="hidden" name="parent_fencedev"
+ tal:attributes="value cur_fence_dev_id | nothing" />
</div>
</div>
-<div metal:define-macro="fence-instance-form-wti">
- <div id="fence_wti_instance" name="fence_wti" class="fencedev_instance">
+<div metal:define-macro="fence-instance-form-wti"
+ tal:omit-tag="exists: cur_fence_dev_id">
+ <div id="fence_wti_instance" name="fence_wti" class="fencedev_instance"
+ tal:omit-tag="exists: cur_fence_dev_id">
<table>
<tr>
<td>Port</td>
@@ -2277,15 +2267,33 @@
tal:attributes="value cur_instance/port | nothing" />
</td>
</tr>
- <input tal:condition="exists: cur_instance"
- type="hidden" name="existing_instance" value="1" />
- <input type="hidden" name="parent_fencedev" value="" />
+ <tr><td colspan="2">
+ <div class="hbSubmit">
+ <tal:block tal:condition="exists:cur_fence_instance_id">
+ <input type="button" name="remove_fence"
+ value="Remove this instance"
+ tal:attributes="onclick python: 'del_fence_instance(\'' + cur_fence_instance_id + '\')'" />
+ </tal:block>
+ <tal:block tal:condition="not:exists:cur_fence_instance_id">
+ <input type="button" name="remove_fence"
+ value="Remove this instance" />
+ </tal:block>
+ </div>
+ </td></tr>
</table>
+
+ <input type="hidden" name="fence_instance" value="1" />
+ <input tal:condition="exists: cur_instance"
+ type="hidden" name="existing_instance" value="1" />
+ <input type="hidden" name="parent_fencedev"
+ tal:attributes="value cur_fence_dev_id | nothing" />
</div>
</div>
-<div metal:define-macro="fence-instance-form-brocade">
- <div id="fence_brocade_instance" name="fence_brocade" class="fencedev_instance">
+<div metal:define-macro="fence-instance-form-brocade"
+ tal:omit-tag="exists: cur_fence_dev_id">
+ <div id="fence_brocade_instance" name="fence_brocade" class="fencedev_instance"
+ tal:omit-tag="exists: cur_fence_dev_id">
<table>
<tr>
<td>Port</td>
@@ -2294,15 +2302,33 @@
tal:attributes="value cur_instance/port | nothing" />
</td>
</tr>
- <input tal:condition="exists: cur_instance"
- type="hidden" name="existing_instance" value="1" />
- <input type="hidden" name="parent_fencedev" value="" />
+ <tr><td colspan="2">
+ <div class="hbSubmit">
+ <tal:block tal:condition="exists:cur_fence_instance_id">
+ <input type="button" name="remove_fence"
+ value="Remove this instance"
+ tal:attributes="onclick python: 'del_fence_instance(\'' + cur_fence_instance_id + '\')'" />
+ </tal:block>
+ <tal:block tal:condition="not:exists:cur_fence_instance_id">
+ <input type="button" name="remove_fence"
+ value="Remove this instance" />
+ </tal:block>
+ </div>
+ </td></tr>
</table>
+
+ <input type="hidden" name="fence_instance" value="1" />
+ <input tal:condition="exists: cur_instance"
+ type="hidden" name="existing_instance" value="1" />
+ <input type="hidden" name="parent_fencedev"
+ tal:attributes="value cur_fence_dev_id | nothing" />
</div>
</div>
-<div metal:define-macro="fence-instance-form-vixel">
- <div id="fence_vixel_instance" name="fence_vixel" class="fencedev_instance">
+<div metal:define-macro="fence-instance-form-vixel"
+ tal:omit-tag="exists: cur_fence_dev_id">
+ <div id="fence_vixel_instance" name="fence_vixel" class="fencedev_instance"
+ tal:omit-tag="exists: cur_fence_dev_id">
<table>
<tr>
<td>Port</td>
@@ -2311,15 +2337,33 @@
tal:attributes="value cur_instance/port | nothing" />
</td>
</tr>
- <input tal:condition="exists: cur_instance"
- type="hidden" name="existing_instance" value="1" />
- <input type="hidden" name="parent_fencedev" value="" />
+ <tr><td colspan="2">
+ <div class="hbSubmit">
+ <tal:block tal:condition="exists:cur_fence_instance_id">
+ <input type="button" name="remove_fence"
+ value="Remove this instance"
+ tal:attributes="onclick python: 'del_fence_instance(\'' + cur_fence_instance_id + '\')'" />
+ </tal:block>
+ <tal:block tal:condition="not:exists:cur_fence_instance_id">
+ <input type="button" name="remove_fence"
+ value="Remove this instance" />
+ </tal:block>
+ </div>
+ </td></tr>
</table>
+
+ <input type="hidden" name="fence_instance" value="1" />
+ <input tal:condition="exists: cur_instance"
+ type="hidden" name="existing_instance" value="1" />
+ <input type="hidden" name="parent_fencedev"
+ tal:attributes="value cur_fence_dev_id | nothing" />
</div>
</div>
-<div metal:define-macro="fence-instance-form-sanbox2">
- <div id="fence_sanbox2_instance" name="fence_sanbox2" class="fencedev_instance">
+<div metal:define-macro="fence-instance-form-sanbox2"
+ tal:omit-tag="exists: cur_fence_dev_id">
+ <div id="fence_sanbox2_instance" name="fence_sanbox2" class="fencedev_instance"
+ tal:omit-tag="exists: cur_fence_dev_id">
<table>
<tr>
<td>Port</td>
@@ -2328,15 +2372,33 @@
tal:attributes="value cur_instance/port | nothing" />
</td>
</tr>
- <input tal:condition="exists: cur_instance"
- type="hidden" name="existing_instance" value="1" />
- <input type="hidden" name="parent_fencedev" value="" />
+ <tr><td colspan="2">
+ <div class="hbSubmit">
+ <tal:block tal:condition="exists:cur_fence_instance_id">
+ <input type="button" name="remove_fence"
+ value="Remove this instance"
+ tal:attributes="onclick python: 'del_fence_instance(\'' + cur_fence_instance_id + '\')'" />
+ </tal:block>
+ <tal:block tal:condition="not:exists:cur_fence_instance_id">
+ <input type="button" name="remove_fence"
+ value="Remove this instance" />
+ </tal:block>
+ </div>
+ </td></tr>
</table>
+
+ <input type="hidden" name="fence_instance" value="1" />
+ <input tal:condition="exists: cur_instance"
+ type="hidden" name="existing_instance" value="1" />
+ <input type="hidden" name="parent_fencedev"
+ tal:attributes="value cur_fence_dev_id | nothing" />
</div>
</div>
-<div metal:define-macro="fence-instance-form-mcdata">
- <div id="fence_mcdata_instance" name="fence_mcdata" class="fencedev_instance">
+<div metal:define-macro="fence-instance-form-mcdata"
+ tal:omit-tag="exists: cur_fence_dev_id">
+ <div id="fence_mcdata_instance" name="fence_mcdata" class="fencedev_instance"
+ tal:omit-tag="exists: cur_fence_dev_id">
<table>
<tr>
<td>Port</td>
@@ -2345,15 +2407,33 @@
tal:attributes="value cur_instance/port | nothing" />
</td>
</tr>
- <input tal:condition="exists: cur_instance"
- type="hidden" name="existing_instance" value="1" />
- <input type="hidden" name="parent_fencedev" value="" />
+ <tr><td colspan="2">
+ <div class="hbSubmit">
+ <tal:block tal:condition="exists:cur_fence_instance_id">
+ <input type="button" name="remove_fence"
+ value="Remove this instance"
+ tal:attributes="onclick python: 'del_fence_instance(\'' + cur_fence_instance_id + '\')'" />
+ </tal:block>
+ <tal:block tal:condition="not:exists:cur_fence_instance_id">
+ <input type="button" name="remove_fence"
+ value="Remove this instance" />
+ </tal:block>
+ </div>
+ </td></tr>
</table>
+
+ <input type="hidden" name="fence_instance" value="1" />
+ <input tal:condition="exists: cur_instance"
+ type="hidden" name="existing_instance" value="1" />
+ <input type="hidden" name="parent_fencedev"
+ tal:attributes="value cur_fence_dev_id | nothing" />
</div>
</div>
-<div metal:define-macro="fence-instance-form-gndb">
- <div id="fence_gnbd_instance" name="fence_gnbd" class="fencedev_instance">
+<div metal:define-macro="fence-instance-form-gndb"
+ tal:omit-tag="exists: cur_fence_dev_id">
+ <div id="fence_gnbd_instance" name="fence_gnbd" class="fencedev_instance"
+ tal:omit-tag="exists: cur_fence_dev_id">
<table>
<tr>
<td>IP Address</td>
@@ -2362,32 +2442,68 @@
tal:attributes="value cur_instance/ipaddress | nothing" />
</td>
</tr>
- <input tal:condition="exists: cur_instance"
- type="hidden" name="existing_instance" value="1" />
- <input type="hidden" name="parent_fencedev" value="" />
+ <tr><td colspan="2">
+ <div class="hbSubmit">
+ <tal:block tal:condition="exists:cur_fence_instance_id">
+ <input type="button" name="remove_fence"
+ value="Remove this instance"
+ tal:attributes="onclick python: 'del_fence_instance(\'' + cur_fence_instance_id + '\')'" />
+ </tal:block>
+ <tal:block tal:condition="not:exists:cur_fence_instance_id">
+ <input type="button" name="remove_fence"
+ value="Remove this instance" />
+ </tal:block>
+ </div>
+ </td></tr>
</table>
+
+ <input type="hidden" name="fence_instance" value="1" />
+ <input tal:condition="exists: cur_instance"
+ type="hidden" name="existing_instance" value="1" />
+ <input type="hidden" name="parent_fencedev"
+ tal:attributes="value cur_fence_dev_id | nothing" />
</div>
</div>
-<div metal:define-macro="fence-instance-form-bladecenter">
- <div id="fence_bladecenter_instance" name="fence_bladecenter" class="fencedev_instance">
+<div metal:define-macro="fence-instance-form-bladecenter"
+ tal:omit-tag="exists: cur_fence_dev_id">
+ <div id="fence_bladecenter_instance" name="fence_bladecenter" class="fencedev_instance"
+ tal:omit-tag="exists: cur_fence_dev_id">
<table>
<tr>
<td>Blade</td>
<td>
- <input name="ipaddress" type="text"
- tal:attributes="value cur_instance/ipaddress | nothing" />
+ <input name="blade" type="text"
+ tal:attributes="value cur_instance/blade | nothing" />
</td>
</tr>
- <input tal:condition="exists: cur_instance"
- type="hidden" name="existing_instance" value="1" />
- <input type="hidden" name="parent_fencedev" value="" />
+ <tr><td colspan="2">
+ <div class="hbSubmit">
+ <tal:block tal:condition="exists:cur_fence_instance_id">
+ <input type="button" name="remove_fence"
+ value="Remove this instance"
+ tal:attributes="onclick python: 'del_fence_instance(\'' + cur_fence_instance_id + '\')'" />
+ </tal:block>
+ <tal:block tal:condition="not:exists:cur_fence_instance_id">
+ <input type="button" name="remove_fence"
+ value="Remove this instance" />
+ </tal:block>
+ </div>
+ </td></tr>
</table>
+
+ <input type="hidden" name="fence_instance" value="1" />
+ <input tal:condition="exists: cur_instance"
+ type="hidden" name="existing_instance" value="1" />
+ <input type="hidden" name="parent_fencedev"
+ tal:attributes="value cur_fence_dev_id | nothing" />
</div>
</div>
-<div metal:define-macro="fence-instance-form-bullpap">
- <div id="fence_bullpap_instance" name="fence_bullpap" class="fencedev_instance">
+<div metal:define-macro="fence-instance-form-bullpap"
+ tal:omit-tag="exists: cur_fence_dev_id">
+ <div id="fence_bullpap_instance" name="fence_bullpap" class="fencedev_instance"
+ tal:omit-tag="exists: cur_fence_dev_id">
<table>
<tr>
<td>Domain</td>
@@ -2396,15 +2512,55 @@
tal:attributes="value cur_instance/domain | nothing" />
</td>
</tr>
- <input tal:condition="exists: cur_instance"
- type="hidden" name="existing_instance" value="1" />
- <input type="hidden" name="parent_fencedev" value="" />
+ <tr><td colspan="2">
+ <div class="hbSubmit">
+ <tal:block tal:condition="exists:cur_fence_instance_id">
+ <input type="button" name="remove_fence"
+ value="Remove this instance"
+ tal:attributes="onclick python: 'del_fence_instance(\'' + cur_fence_instance_id + '\')'" />
+ </tal:block>
+ <tal:block tal:condition="not:exists:cur_fence_instance_id">
+ <input type="button" name="remove_fence"
+ value="Remove this instance" />
+ </tal:block>
+ </div>
+ </td></tr>
+ </table>
+
+ <input type="hidden" name="fence_instance" value="1" />
+ <input tal:condition="exists: cur_instance"
+ type="hidden" name="existing_instance" value="1" />
+ <input type="hidden" name="parent_fencedev"
+ tal:attributes="value cur_fence_dev_id | nothing" />
+ </div>
+</div>
+
+<div metal:define-macro="fence-instance-form-scsi"
+ tal:omit-tag="exists: cur_fence_dev_id">
+ <div id="fence_scsi_instance" name="fence_scsi" class="fencedev_instance"
+ tal:omit-tag="exists: cur_fence_dev_id">
+ <table>
+ <tr>
+ <td>Node name</td>
+ <td>
+ <input type="text" name="nodename" disabled="disabled"
+ tal:attributes="value request/nodename | nothing" />
+ </td>
+ </tr>
</table>
+
+ <input type="hidden" name="fence_instance" value="1" />
+ <input tal:condition="exists: cur_instance"
+ type="hidden" name="existing_instance" value="1" />
+ <input type="hidden" name="parent_fencedev"
+ tal:attributes="value cur_fence_dev_id | nothing" />
</div>
</div>
-<div metal:define-macro="fence-instance-form-xvm">
- <div id="fence_xvm_instance" name="fence_xvm" class="fencedev_instance">
+<div metal:define-macro="fence-instance-form-xvm"
+ tal:omit-tag="exists: cur_fence_dev_id">
+ <div id="fence_xvm_instance" name="fence_xvm" class="fencedev_instance"
+ tal:omit-tag="exists: cur_fence_dev_id">
<table>
<tr>
<td>Domain</td>
@@ -2413,10 +2569,26 @@
tal:attributes="value cur_instance/domain | nothing" />
</td>
</tr>
- <input tal:condition="exists: cur_instance"
- type="hidden" name="existing_instance" value="1" />
- <input type="hidden" name="parent_fencedev" value="" />
+ <tr><td colspan="2">
+ <div class="hbSubmit">
+ <tal:block tal:condition="exists:cur_fence_instance_id">
+ <input type="button" name="remove_fence"
+ value="Remove this instance"
+ tal:attributes="onclick python: 'del_fence_instance(\'' + cur_fence_instance_id + '\')'" />
+ </tal:block>
+ <tal:block tal:condition="not:exists:cur_fence_instance_id">
+ <input type="button" name="remove_fence"
+ value="Remove this instance" />
+ </tal:block>
+ </div>
+ </td></tr>
</table>
+
+ <input type="hidden" name="fence_instance" value="1" />
+ <input tal:condition="exists: cur_instance"
+ type="hidden" name="existing_instance" value="1" />
+ <input type="hidden" name="parent_fencedev"
+ tal:attributes="value cur_fence_dev_id | nothing" />
</div>
</div>
@@ -2440,13 +2612,82 @@
<tal:block
metal:use-macro="here/form-macros/macros/fence-instance-form-bullpap" />
<tal:block
+ metal:use-macro="here/form-macros/macros/fence-instance-form-scsi" />
+ <tal:block
metal:use-macro="here/form-macros/macros/fence-instance-form-xvm" />
<tal:block
metal:use-macro="here/form-macros/macros/fence-instance-form-bladecenter" />
</div>
+<div metal:define-macro="fencedev-instance-cond-ladder"
+ tal:condition="exists: cur_fence_type">
+
+ <tal:block tal:condition="python: cur_fence_type == 'fence_apc'">
+ <tal:block
+ metal:use-macro="here/form-macros/macros/fence-instance-form-apc" />
+ </tal:block>
+
+ <tal:block tal:condition="python: cur_fence_type == 'fence_mcdata'">
+ <tal:block
+ metal:use-macro="here/form-macros/macros/fence-instance-form-mcdata" />
+ </tal:block>
+
+ <tal:block tal:condition="python: cur_fence_type == 'fence_wti'">
+ <tal:block
+ metal:use-macro="here/form-macros/macros/fence-instance-form-wti" />
+ </tal:block>
+
+ <tal:block tal:condition="python: cur_fence_type == 'fence_brocade'">
+ <tal:block
+ metal:use-macro="here/form-macros/macros/fence-instance-form-brocade" />
+ </tal:block>
+
+ <tal:block tal:condition="python: cur_fence_type == 'fence_sanbox2'">
+ <tal:block
+ metal:use-macro="here/form-macros/macros/fence-instance-form-sanbox2" />
+ </tal:block>
+
+ <tal:block tal:condition="python: cur_fence_type == 'fence_vixel'">
+ <tal:block
+ metal:use-macro="here/form-macros/macros/fence-instance-form-vixel" />
+ </tal:block>
+
+ <tal:block tal:condition="python: cur_fence_type == 'fence_gnbd'">
+ <tal:block
+ metal:use-macro="here/form-macros/macros/fence-instance-form-gnbd" />
+ </tal:block>
+
+ <tal:block tal:condition="python: cur_fence_type == 'fence_egenera'">
+ <tal:block
+ metal:use-macro="here/form-macros/macros/fence-instance-form-egenera" />
+ </tal:block>
+
+ <tal:block tal:condition="python: cur_fence_type == 'fence_bullpap'">
+ <tal:block
+ metal:use-macro="here/form-macros/macros/fence-instance-form-bullpap" />
+ </tal:block>
+
+ <tal:block tal:condition="python: cur_fence_type == 'fence_scsi'">
+ <tal:block
+ metal:use-macro="here/form-macros/macros/fence-instance-form-scsi" />
+ </tal:block>
+
+ <tal:block tal:condition="python: cur_fence_type == 'fence_xvm'">
+ <tal:block
+ metal:use-macro="here/form-macros/macros/fence-instance-form-xvm" />
+ </tal:block>
+
+ <tal:block tal:condition="python: cur_fence_type == 'fence_bladecenter'">
+ <tal:block
+ metal:use-macro="here/form-macros/macros/fence-instance-form-bladecenter" />
+ </tal:block>
+</div>
+
<div metal:define-macro="node-form">
<script type="text/javascript"
+ src="/luci/homebase/homebase_common.js">
+ </script>
+ <script type="text/javascript"
src="/luci/cluster/fence_device.js">
</script>
<script type="text/javascript">
@@ -2647,13 +2888,6 @@
</div>
<table id="fence_devices" class="cluster node fence">
- <tfoot class="fence">
- <tr class="cluster node fence"><td class="cluster node fence">
- <input type="button" value="Update fence properties"
- onClick="validate_fence_properties('fence_devices')" />
- </td></tr>
- </tfoot>
-
<tbody class="fence">
<tr class="cluster node info_top fence">
<td class="cluster node fence">
@@ -2661,6 +2895,7 @@
<strong class="cluster node">Main Fencing Method</strong>
</span>
</td>
+
<td class="cluster node fence_backup">
<span class="fence">
<strong class="cluster node">Backup Fencing Method</strong>
@@ -2671,46 +2906,132 @@
<tr class="cluster node info_top fence">
<td class="cluster node fence_main fence">
<div class="fence_container">
+
<div id="fence_list_level1" tal:define="global cur_fence_num python: 0">
<tal:block tal:condition="exists: fenceinfo/level1">
- <tal:block tal:repeat="cur_fencedev fenceinfo/level1">
+
+ <div class="fence_level"
+ tal:repeat="cur_fencedev fenceinfo/level1"
+ tal:attributes="id python: 'fence1_' + str(cur_fence_num)">
+
<tal:block tal:define="
- cur_fence_instances cur_fencedev/instance_list | nothing;
+ cur_fence_dev_id python: 'fence1_' + str(cur_fence_num);
cur_fence_type cur_fencedev/agent | nothing;
- cur_fence_level python: 1;">
- <div tal:attributes="id python: 'fence1_' + str(cur_fence_num)">
- <tal:block
- metal:use-macro="here/form-macros/macros/fencedev-cond-ladder" />
+ cur_fence_level python: 1">
+
+ <form tal:attributes="name cur_fence_dev_id | string:[unknown]">
+ <tal:block metal:use-macro="here/form-macros/macros/fencedev-cond-ladder" />
+ </form>
+
+ <tal:block
+ tal:define="global cur_instance_num python:0" />
+
+ <div tal:attributes="id python: cur_fence_dev_id + '_instances'">
+ <tal:block tal:condition="exists: cur_fencedev/instance_list">
+ <tal:block tal:replace="structure python: '<script type='+chr(0x22)+'text/javascript'+chr(0x22)+'>num_fence_instances[\'' + cur_fence_dev_id + '\'] = ' + str(len(cur_fencedev['instance_list'])) + ';</script>'" />
+ <tal:block tal:repeat="cur_instance cur_fencedev/instance_list">
+ <tal:block
+ tal:define="global cur_fence_instance_id python: cur_fence_dev_id + '_' + str(cur_instance_num)" />
+
+ <div class="fence_instance"
+ tal:attributes="
+ name cur_fence_instance_id | nothing;
+ id cur_fence_instance_id | nothing">
+
+ <form
+ tal:attributes="name cur_fence_instance_id | nothing">
+ <tal:block metal:use-macro="here/form-macros/macros/fencedev-instance-cond-ladder" />
+ </form>
+ <tal:block
+ tal:define="global cur_instance_num python:cur_instance_num + 1" />
+ </div>
+ </tal:block>
+ </tal:block>
</div>
+ <div class="hbSubmit">
+ <input type="button" name="remove_fence_dev"
+ value="Remove this device"
+ tal:attributes="
+ onclick python: 'del_fence(\'' + cur_fence_dev_id + '\')'" />
+ <input tal:condition="exists: cur_fencedev/isShared"
+ name="add_instance" type="button"
+ value="Add an instance"
+ tal:attributes="onclick python: 'add_fence_instance(\'' + cur_fence_dev_id + '\',\'' + cur_fence_type + '\')'" />
+ </div>
+ <tal:block tal:define="global cur_fence_num python: cur_fence_num + 1" />
</tal:block>
- <tal:block tal:define="global cur_fence_num python: cur_fence_num + 1" />
- </tal:block>
+ </div>
</tal:block>
+
<tal:block
tal:replace="structure python: '<script type='+chr(0x22)+'text/javascript'+chr(0x22)+'>num_fences_level[0] = ' + str(cur_fence_num) + ';</script>'" />
</div>
<div class="fence_control">
<input type="button" value="Add a fence to this level"
- onclick="add_node_fence_device(1);" />
- </div>
+ onclick="add_node_fence_device(1)" />
</div>
</td>
<td class="cluster node fence_main fence">
<div class="fence_container">
+
<div id="fence_list_level2" tal:define="global cur_fence_num python: 0">
<tal:block tal:condition="exists: fenceinfo/level2">
- <tal:block tal:repeat="cur_fencedev fenceinfo/level2">
- <tal:block tal:define="cur_fence_type cur_fencedev/agent | nothing">
- <div tal:attributes="id python: 'fence2_' + str(cur_fence_num)">
- <tal:block
- metal:use-macro="here/form-macros/macros/fencedev-cond-ladder" />
+
+ <div class="fence_level"
+ tal:repeat="cur_fencedev fenceinfo/level2"
+ tal:attributes="id python: 'fence2_' + str(cur_fence_num)">
+
+ <tal:block tal:define="
+ cur_fence_dev_id python: 'fence2_' + str(cur_fence_num);
+ cur_fence_type cur_fencedev/agent | nothing;
+ cur_fence_level python: 2">
+
+ <form tal:attributes="name cur_fence_dev_id | string:[unknown]">
+ <tal:block metal:use-macro="here/form-macros/macros/fencedev-cond-ladder" />
+ </form>
+
+ <tal:block
+ tal:define="global cur_instance_num python:0" />
+
+ <div tal:attributes="id python: cur_fence_dev_id + '_instances'">
+ <tal:block tal:condition="exists: cur_fencedev/instance_list">
+ <tal:block tal:replace="structure python: '<script type='+chr(0x22)+'text/javascript'+chr(0x22)+'>num_fence_instances[\'' + cur_fence_dev_id + '\'] = ' + str(len(cur_fencedev['instance_list'])) + ';</script>'" />
+ <tal:block tal:repeat="cur_instance cur_fencedev/instance_list">
+ <tal:block
+ tal:define="global cur_fence_instance_id python: cur_fence_dev_id + '_' + str(cur_instance_num)" />
+
+ <div class="fence_instance"
+ tal:attributes="
+ name cur_fence_instance_id | nothing;
+ id cur_fence_instance_id | nothing">
+
+ <form
+ tal:attributes="name cur_fence_instance_id | nothing">
+ <tal:block metal:use-macro="here/form-macros/macros/fencedev-instance-cond-ladder" />
+ </form>
+ <tal:block
+ tal:define="global cur_instance_num python:cur_instance_num + 1" />
+ </div>
+ </tal:block>
+ </tal:block>
+ </div>
+ <div class="hbSubmit">
+ <input type="button" name="remove_fence_dev"
+ value="Remove this device"
+ tal:attributes="
+ onclick python: 'del_fence(\'' + cur_fence_dev_id + '\')'" />
+ <input tal:condition="exists: cur_fencedev/isShared"
+ name="add_instance" type="button"
+ value="Add an instance"
+ tal:attributes="onclick python: 'add_fence_instance(\'' + cur_fence_dev_id + '\',\'' + cur_fence_type + '\')'" />
</div>
+ <tal:block tal:define="global cur_fence_num python: cur_fence_num + 1" />
</tal:block>
- <tal:block tal:define="global cur_fence_num python: cur_fence_num + 1" />
- </tal:block>
+ </div>
</tal:block>
+
<tal:block
tal:replace="structure python: '<script type='+chr(0x22)+'text/javascript'+chr(0x22)+'>num_fences_level[1] = ' + str(cur_fence_num) + ';</script>'" />
</div>
@@ -2719,12 +3040,46 @@
<input type="button" value="Add a fence to this level"
onclick="add_node_fence_device(2)" />
</div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div class="fence_control">
+ <form name="fence1_master" method="post" action="">
+ <input type="hidden" name="clustername"
+ tal:attributes="value request/clustername | nothing" />
+ <input type="hidden" name="nodename"
+ tal:attributes="value request/nodename | nothing" />
+ <input type="hidden" name="fence_level" value="1" />
+ <input type="hidden" name="fence_xml" value="" />
+ <input type="hidden" name="pagetype" value="58" />
+ <input type="button"
+ value="Update main fence properties"
+ onclick="validate_fence(this.form, 'fence_list_level1')" />
+ </form>
+ </div>
+ </td>
+ <td>
+ <div class="fence_control">
+ <form name="fence2_master" method="post" action="">
+ <input type="hidden" name="clustername"
+ tal:attributes="value request/clustername | nothing" />
+ <input type="hidden" name="nodename"
+ tal:attributes="value request/nodename | nothing" />
+ <input type="hidden" name="fence_level" value="2" />
+ <input type="hidden" name="fence_xml" value="" />
+ <input type="hidden" name="pagetype" value="58" />
+ <input type="button"
+ value="Update backup fence properties"
+ onclick="validate_fence(this.form, 'fence_list_level2')" />
+ </form>
</div>
</td>
</tr>
</tbody>
</table>
</tal:block>
+
<tal:block tal:condition="python: 'ricci_error' in nodeinfo">
<hr/>
<strong class="errmsgs">
@@ -2880,7 +3235,7 @@
<h2>Add a node to <span tal:replace="cur_cluster_name | string:this cluster" /></h2>
<input type="hidden" name="clusterName"
- tal:attributes="value cur_cluster_name | string:[unknown]" />
+ tal:attributes="value cur_cluster_name | string:[unknown]" />
<input name="pagetype" type="hidden"
tal:attributes="value request/form/pagetype | request/pagetype | string:15" />
@@ -3192,7 +3547,7 @@
</div>
<div metal:define-macro="xenvmprocess">
- <span tal:define="retrn python:here.processXenVM(request)"/>
+ <span tal:define="retrn python:here.processXenVM(request)"/>
</div>
@@ -3707,19 +4062,24 @@
<tr class="cluster node info_top fence">
<td class="cluster node fence_main fence">
<form name="main_fence_form">
- <select name="select_div"
- onChange="swap_fence_div('fence_container',
- this.options[this.selectedIndex].value)">
- <tal:block metal:use-macro="here/form-macros/macros/shared-fence-option-list" />
- </select>
+ <select name="select_div"
+ onChange="swap_fence_div('fence_container',
+ this.options[this.selectedIndex].value)">
+ <tal:block metal:use-macro="here/form-macros/macros/shared-fence-option-list" />
+ </select>
+ </form>
+
+ <form name="fencedevaddform" action="" method="post">
+ <div id="fence_container">
+ </div>
+ <div class="hbSubmit">
+ <input type="submit"
+ value="Add this shared fence device" />
+ <input type="hidden" name="pagetype"
+ value="51" id="pagetype" />
+ <input type="hidden" name="clustername" id="pagetype"
+ tal:attributes="value request/clustername" />
</form>
- <form name="fencedevaddform" action="" method="post">
- <div id="fence_container">
- </div>
- <input type="submit" value="Add this shared fence device"/>
- <input type="hidden" name="pagetype" value="51" id="pagetype" />
- <input type="hidden" name="clustername" value="" id="pagetype" tal:attributes="value request/clustername"/>
- </form>
</td>
</tr>
</tbody>
@@ -3740,7 +4100,7 @@
<tal:block tal:define="fencedevs python: here.getFenceInfo(modelb, None)">
- <tal:block tal:condition="fencedevs/fencedevs">
+ <tal:block tal:condition="exists: fencedevs/fencedevs">
<table class="systemsTable">
<thead class="systemsTable">
<tr class="systemsTable">
@@ -3837,40 +4197,57 @@
<tal:block tal:condition="python: cur_fence_type == 'fence_manual'">
<tal:block metal:use-macro="here/form-macros/macros/fence-form-manual" />
</tal:block>
+
+ <tal:block tal:condition="exists:cur_fencedev/unknown">
+ <tal:block metal:use-macro="here/form-macros/macros/fence-form-unknown" />
+ </tal:block>
</div>
<div metal:define-macro="fencedev-form">
<h2>Fence Device Form</h2>
- <div class="cluster fencedev">
+ <div class="cluster fencedev fence">
<tal:block tal:define="
global cur_fencename request/fencename | nothing;
global cur_cluster request/clustername | nothing;
- global cur_fence_type python: 'fence_apc'"/>
+ global cur_fence_type nothing" />
- <span tal:condition="cur_fencename">
- <span tal:define="
+ <tal:block tal:condition="cur_fencename">
+ <tal:block tal:define="
global cur_fencedev python:here.getFence(modelb,request);
- global cur_fence_type cur_fencedev/agent" />
- </span>
+ global cur_fence_type cur_fencedev/agent | nothing" />
+ </tal:block>
- <form name="fencedeveditform" action="" method="post">
- <tal:block
- metal:use-macro="here/form-macros/macros/fencedev-cond-ladder" />
- <input type="submit" value="Update this fence device"/>
- <input type="hidden" name="pagetype" value="54" id="pagetype" />
- <input type="hidden" name="clustername" value="" id="pagetype" tal:attributes="value request/clustername"/>
- <input type="hidden" name="orig_name" value="" id="orig_name" tal:attributes="value request/fencename"/>
- <input type="hidden" name="fencename" value="" id="fencename" tal:attributes="value request/fencename"/>
- </form>
- <form name="fencedevdeleteform" action="" method="post">
- <input type="submit" value="Delete this fence device"/>
- <input type="hidden" name="pagetype" value="57" id="pagetype"/>
- <input type="hidden" name="clustername" value="" id="pagetype" tal:attributes="value request/clustername"/>
- <input type="hidden" name="fencename" value="" id="fencename" tal:attributes="value request/fencename"/>
- <input type="hidden" name="orig_name" value="" id="orig_name" tal:attributes="value request/fencename"/>
- </form>
+ <form name="fencedeveditform" action="" method="post">
+ <tal:block
+ metal:use-macro="here/form-macros/macros/fencedev-cond-ladder" />
+
+ <input type="hidden" name="pagetype" value="54" />
+ <input type="hidden" name="clustername"
+ tal:attributes="value request/clustername" />
+ <input type="hidden" name="orig_name"
+ tal:attributes="value request/fencename"/>
+ <input type="hidden" name="fencename"
+ tal:attributes="value request/fencename" />
+
+ <div class="hbSubmit">
+ <input type="submit" value="Update this fence device" />
+ </div>
+ </form>
+
+ <form name="fencedevdeleteform" action="" method="post">
+ <input type="hidden" name="pagetype" value="57" />
+ <input type="hidden" name="clustername"
+ tal:attributes="value request/clustername" />
+ <input type="hidden" name="fencename"
+ tal:attributes="value request/fencename" />
+ <input type="hidden" name="orig_name"
+ tal:attributes="value request/fencename" />
+ <div class="hbSubmit">
+ <input type="submit" value="Delete this fence device" />
+ </div>
+ </form>
</div>
</div>
--- conga/luci/homebase/luci_homebase.css 2006/12/22 17:50:16 1.28.2.3
+++ conga/luci/homebase/luci_homebase.css 2007/01/10 22:53:56 1.28.2.4
@@ -14,6 +14,10 @@
background: #dee7ec;
}
+input.pad_left {
+ margin-left: +.3333em;
+}
+
div.fence {
max-width: 700px;
padding: .5em;
@@ -28,6 +32,17 @@
width: 700px;
}
+div.fence_level {
+ padding: .4045em;
+ border-bottom: 1px solid #cccccc;
+}
+
+div.fence_instance {
+ margin-left: 1em;
+ padding-left: .4045em;
+ border-left: 1px solid #cccccc;
+}
+
div.fence,
td.fence {
padding-top: .309em;
--- conga/luci/site/luci/Extensions/cluster_adapters.py 2007/01/02 20:21:26 1.120.2.16
+++ conga/luci/site/luci/Extensions/cluster_adapters.py 2007/01/10 22:53:56 1.120.2.17
@@ -23,6 +23,10 @@
from QuorumD import QuorumD
from Heuristic import Heuristic
from clusterOS import resolveOSType
+from Fence import Fence
+from Method import Method
+from FenceDevice import FenceDevice
+from Device import Device
from FenceHandler import validateNewFenceDevice, FENCE_OPTS, validateFenceDevice
from GeneralError import GeneralError
from homebase_adapters import manageCluster, createClusterSystems, havePermCreateCluster, setNodeFlag, delNodeFlag, userAuthenticated, getStorageNode, getClusterNode, delCluster, parseHostForm
@@ -1433,6 +1437,327 @@
errors.append(error_string)
return (False, {'errors': errors, 'messages': messages})
+def validateNodeFenceConfig(self, request):
+ try:
+ form_xml = request['fence_xml']
+ if not form_xml:
+ raise KeyError, 'form_xml must not be blank'
+ except Exception, e:
+ luci_log.debug_verbose('vNFC0: no form_xml: %s' % str(e))
+ return (False, {'errors': ['No fence data was supplied.']})
+
+ try:
+ fence_level = int(request.form['fence_level'].strip())
+ except Exception, e:
+ luci_log.debug_verbose('vNFC1: no fence level: %s' % str(e))
+ return (False, {'errors': ['No fence level was supplied.']})
+
+ try:
+ nodename = request['nodename']
+ if not nodename:
+ raise Exception, 'nodename is blank'
+ except Exception, e:
+ luci_log.debug_verbose('vNFC2: no nodename: %s' % str(e))
+ return (False, {'errors': ['No node name was given.']})
+
+ try:
+ clustername = request['clustername']
+ if not clustername:
+ raise Exception, 'clustername is blank'
+ except Exception, e:
+ luci_log.debug_verbose('vNFC3: no clustername: %s' % str(e))
+ return (False, {'errors': ['No cluster name was given.']})
+
+ try:
+ model = request.SESSION.get('model')
+ if not model:
+ raise Exception, 'model is none'
+ except Exception, e:
+ model = None
+ try:
+ model = getModelForCluster(self, clustername)
+ except:
+ model = None
+
+ if model is None:
+ luci_log.debug_verbose('vNFC4: unable to get model for cluster %s' % clustername)
+ return (False, {'errors': ['No cluster model was found.']})
+
+ try:
+ doc = minidom.parseString(form_xml)
+ except Exception, e:
+ luci_log.debug_verbose('vNFC5: error: %s' % str(e))
+ return (False, {'errors': ['The fence data submitted is not properly formed.']})
+
+ try:
+ node = model.retrieveNodeByName(nodename)
+ except GeneralError, e:
+ luci_log.debug_verbose('vNFC6: unable to find node name %s in current node list' % (str(nodename), str(e)))
+ return (False, {'errors': ['Unable to find the cluster node %s in the node list.' % str(nodename) ]})
+
+ fence_level_num = int(fence_level)
+ levels = node.getFenceLevels()
+ try:
+ method_id = levels[fence_level_num - 1].getAttribute('name')
+ if not method_id:
+ raise Exception, 'No method ID'
+ fence_method = Method()
+ fence_method.addAttribute('name', str(method_id))
+ levels[fence_level_num - 1] = fence_method
+ except Exception, e:
+ method_id = fence_level
+ fence_method = Method()
+ fence_method.addAttribute('name', str(method_id))
+
+ forms = doc.getElementsByTagName('form')
+ if len(forms) < 1:
+ delete_target = None
+ for l in levels:
+ # delete the fence level
+ if l.getAttribute('name') == method_id:
+ delete_target = l
+ break
+ if delete_target is not None:
+ try:
+ node.getChildren()[0].removeChild(l)
+ except Exception, e:
+ luci_log.debug_verbose('vNFC6a: %s: %s' % (method_id, str(e)))
+ return (False, {'errors': ['An error occurred while deleting fence method %s' % method_id ]})
+ else:
+ return (True, {'messages': ['No changes were made.'] })
+
+ form_hash = {}
+ for i in forms:
+ form_id = i.getAttribute('id')
+ if not form_id:
+ continue
+ ielems = i.getElementsByTagName('input')
+ if not ielems or len(ielems) < 1:
+ continue
+
+ dummy_form = {}
+
+ for i in ielems:
+ try:
+ input_type = str(i.getAttribute('type'))
+ except Exception, e:
+ luci_log.debug_verbose('vNFC7: input type: %s' % str(e))
+ continue
+
+ if not input_type or input_type == 'button':
+ continue
+
+ try:
+ dummy_form[str(i.getAttribute('name'))] = str(i.getAttribute('value'))
+ except Exception, e:
+ luci_log.debug_verbose('vNFC8: parsing XML: %s' % str(e))
+
+ if len(dummy_form) < 1:
+ continue
+
+ if 'fence_instance' in dummy_form:
+ try:
+ parent = dummy_form['parent_fencedev']
+ except:
+ luci_log.debug_verbose('vNFC9: no parent for instance')
+ return (False, {'errors': [ 'Unable to determine what device the current instance uses.' ]})
+
+ try:
+ parent_form = form_hash[parent][1].append(dummy_form)
+ del dummy_form['fence_instance']
+ except Exception, e:
+ luci_log.debug_verbose('vNFC10: no parent for instance')
+ return (False, {'errors': [ 'Unable to determine what device the current instance uses.' ]})
+ else:
+ form_hash[form_id] = (dummy_form, list())
+
+ fh_keys = form_hash.keys()
+ fh_keys.sort()
+ for i in fh_keys:
+ fencedev_name = None
+ fencedev_unknown = False
+ fencedev_obj = None
+
+ try:
+ fence_form, instance_list = form_hash[i]
+ except Exception, e:
+ luci_log.debug_verbose('vNFC11: %s' % str(e))
+ continue
+
+ try:
+ fence_type = fence_form['fence_type']
+ if not fence_type:
+ raise Exception, 'fence type is blank'
+ fence_form['agent'] = fence_type
+ except Exception, e:
+ luci_log.debug_verbose('vNFC12: %s %s' % (i, str(e)))
+ fence_type = None
+
+ try:
+ del fence_form['fence_type']
+ except:
+ pass
+
+ if 'existing_device' in fence_form:
+ del fence_form['existing_device']
+ fencedev_name = fence_form['name']
+
+ if fence_type is None:
+ # An unknown device. Pull the data out of
+ # the model and persist it and all instances.
+ # All we care about is its name.
+ fencedev_unknown = True
+ else:
+ if 'sharable' in fence_form:
+ # If it's a shared fence device that already exists, the
+ # user could not have edited it (without playing dirty
+ # games), so it's safe to pull the existing entry from
+ # the model. All we need is the device name.
+ pass
+ else:
+ # An existing non-shared device; build up the device
+ # from scratch since the user could have edited it.
+ try:
+ old_name = fence_form['old_name']
+ if not old_name:
+ raise Exception, 'old name is blank'
+ del fence_form['old_name']
+ except Exception, e:
+ luci_log.debug_verbose('vNFC12: no old name for %s %s' \
+ % (fence_form['name'], str(e)))
+ return (False, {'errors': [ 'Unable to determine the original name for the device now named %s' % fencedev_name ]})
+
+ fencedev_obj = None
+ fence_dev_list = model.getFenceDevices()
+ for fd in fence_dev_list:
+ if fd.getAttribute('name') == old_name:
+ fencedev_obj = fd
+ break
+
+ if fencedev_obj is None:
+ luci_log.debug_verbose('vNFC14: no fence device named %s was found' % old_name)
+ return (False, {'errors': ['No fence device named %s was found' % old_name ] })
+ else:
+ try:
+ model.fencedevices_ptr.removeChild(fd)
+ except Exception, e:
+ luci_log.debug_verbose('VNFC8a: %s: %s' \
+ % (old_name, str(e)))
+ return (False, {'errors': [ 'Unable to remove old fence device %s' % old_name ]})
+
+ for k in fence_form.keys():
+ if fence_form[k]:
+ fencedev_obj.addAttribute(k, str(fence_form[k]))
+
+ # Add back the tags under the method block
+ # for the fence instance
+ instance_list.append({'name': fencedev_name })
+ else:
+ # The user created a new fence device.
+ fencedev_name = fence_form['name']
+ fencedev_obj = FenceDevice()
+ for k in fence_form.keys():
+ if fence_form[k]:
+ fencedev_obj.addAttribute(k, str(fence_form[k]))
+
+ # If it's not shared, we need to create an instance form
+ # so the appropriate XML goes into the <method> block inside
+ # <node><fence>. All we need for that is the device name.
+ if not 'sharable' in fence_form:
+ instance_list.append({'name': fencedev_name })
+
+ if fencedev_obj is not None:
+ # If a device with this name exists in the model
+ # already, replace it with the current object. If
+ # this block is not executed, we don't need to make
+ # any changes to the fencedevices block for this
+ # device
+ fence_dev_list = model.getFenceDevices()
+ for fd in fence_dev_list:
+ if fencedev_name == fd.getAttribute('name'):
+ luci_log.debug_verbose('vNFC15: fence ident %s already in use' % fencedev_name)
+ return (False, {'errors': ['There is already a fence device named %s' % fencedev_name ] })
+ model.fencedevices_ptr.addChild(fencedev_obj)
+
+ if fencedev_unknown is True:
+ # Save any instances for this fence device.
+ pass
+
+ for inst in instance_list:
+ try:
+ del inst['parent_fencedev']
+ except:
+ pass
+ try:
+ del inst['new_instance']
+ except:
+ pass
+ try:
+ del inst['name']
+ except:
+ pass
+ try:
+ del inst['existing_instance']
+ except:
+ pass
+
+ device_obj = Device()
+ device_obj.setAgentType(fence_type)
+ device_obj.addAttribute('name', fencedev_name)
+ for k in inst.keys():
+ if inst[k]:
+ device_obj.addAttribute(k, str(inst[k]))
+ fence_method.addChild(device_obj)
+
+ if len(node.getChildren()) > 0:
+ # There's already a <fence> block
+ found_target = False
+ for idx in xrange(len(levels)):
+ if levels[idx].getAttribute('name') == method_id:
+ found_target = True
+ break
+
+ if found_target is False:
+ # There's a fence block, but no relevant method
+ # block
+ node.getChildren()[0].addChild(fence_method)
+ else:
+ # There is no <fence> tag under the node yet.
+ fence_node = Fence()
+ fence_node.addChild(fence_method)
+ node.addChild(fence_node)
+
+ try:
+ cp = model.getClusterPtr()
+ cp.incrementConfigVersion()
+ model.setModified(True)
+ conf = str(model.exportModelAsString())
+ if not conf:
+ raise Exception, 'model string is blank'
+ luci_log.debug_verbose('vNFC16: exported \"%s\"' % conf)
+ except Exception, e:
+ luci_log.debug_verbose('vNFC17: exportModelAsString failed: %s' \
+ % str(e))
+ return (False, {'errors': [ 'An error occurred while constructing the new cluster configuration.' ]})
+
+ rc = getRicciAgent(self, clustername)
+ if not rc:
+ luci_log.debug_verbose('vNFC18: unable to find a ricci agent for cluster %s' % clustername)
+ return (False, {'errors': ['Unable to find a ricci agent for the %s cluster' % clustername ]})
+ ragent = rc.hostname()
+
+ batch_number, result = setClusterConf(rc, conf)
+ if batch_number is None or result is None:
+ luci_log.debug_verbose('vNFC19: missing batch and/or result')
+ return (False, {'errors': [ 'An error occurred while constructing the new cluster configuration.' ]})
+
+ try:
+ set_node_flag(self, clustername, ragent, str(batch_number), FENCEDEV_NODE_CONFIG, "Updating fence configuration for node \'%s\'" % nodename)
+ except Exception, e:
+ luci_log.debug_verbose('vNFC20: failed to set flags: %s' % str(e))
+
+ response = request.RESPONSE
+ response.redirect(request['URL'] + "?pagetype=" + NODE + "&clustername=" + clustername + '&nodename=' + nodename + '&busyfirst=true')
def deleteFenceDevice(self, request):
errors = list()
@@ -1654,7 +1979,8 @@
51: validateFenceAdd,
50: validateFenceEdit,
55: validateDaemonProperties,
- 57: deleteFenceDevice
+ 57: deleteFenceDevice,
+ 58: validateNodeFenceConfig
}
def validatePost(self, request):
@@ -3922,6 +4248,7 @@
try:
map['pretty_name'] = FENCE_OPTS[fencedev.getAgentType()]
except:
+ map['unknown'] = True
map['pretty_name'] = fencedev.getAgentType()
nodes_used = list()
@@ -4036,7 +4363,11 @@
if fd is not None:
if fd.isShared() == False: #Not a shared dev...build struct and add
fencedev = {}
- fencedev['prettyname'] = FENCE_OPTS[fd.getAgentType()]
+ try:
+ fencedev['prettyname'] = FENCE_OPTS[fd.getAgentType()]
+ except:
+ fencedev['unknown'] = True
+ fencedev['prettyname'] = fd.getAgentType()
fencedev['isShared'] = False
fencedev['id'] = str(major_num)
major_num = major_num + 1
@@ -4073,7 +4404,11 @@
continue
else: #Shared, but not used above...so we need a new fencedev struct
fencedev = {}
- fencedev['prettyname'] = FENCE_OPTS[fd.getAgentType()]
+ try:
+ fencedev['prettyname'] = FENCE_OPTS[fd.getAgentType()]
+ except:
+ fencedev['unknown'] = True
+ fencedev['prettyname'] = fd.getAgentType()
fencedev['isShared'] = True
fencedev['cfgurl'] = baseurl + "?clustername=" + clustername + "&fencename=" + fd.getName().strip() + "&pagetype=" + FENCEDEV
fencedev['id'] = str(major_num)
@@ -4111,7 +4446,11 @@
shared_struct['name'] = fd.getName().strip()
agentname = fd.getAgentType()
shared_struct['agent'] = agentname
- shared_struct['prettyname'] = FENCE_OPTS[agentname]
+ try:
+ shared_struct['prettyname'] = FENCE_OPTS[agentname]
+ except:
+ shared_struct['unknown'] = True
+ shared_struct['prettyname'] = agentname
shared1.append(shared_struct)
map['shared1'] = shared1
@@ -4131,7 +4470,11 @@
if fd is not None:
if fd.isShared() == False: #Not a shared dev...build struct and add
fencedev = {}
- fencedev['prettyname'] = FENCE_OPTS[fd.getAgentType()]
+ try:
+ fencedev['prettyname'] = FENCE_OPTS[fd.getAgentType()]
+ except:
+ fencedev['unknown'] = True
+ fencedev['prettyname'] = fd.getAgentType()
fencedev['isShared'] = False
fencedev['id'] = str(major_num)
major_num = major_num + 1
@@ -4168,7 +4511,11 @@
continue
else: #Shared, but not used above...so we need a new fencedev struct
fencedev = {}
- fencedev['prettyname'] = FENCE_OPTS[fd.getAgentType()]
+ try:
+ fencedev['prettyname'] = FENCE_OPTS[fd.getAgentType()]
+ except:
+ fencedev['unknown'] = True
+ fencedev['prettyname'] = fd.getAgentType()
fencedev['isShared'] = True
fencedev['cfgurl'] = baseurl + "?clustername=" + clustername + "&fencename=" + fd.getName().strip() + "&pagetype=" + FENCEDEV
fencedev['id'] = str(major_num)
@@ -4206,7 +4553,11 @@
shared_struct['name'] = fd.getName().strip()
agentname = fd.getAgentType()
shared_struct['agent'] = agentname
- shared_struct['prettyname'] = FENCE_OPTS[agentname]
+ try:
+ shared_struct['prettyname'] = FENCE_OPTS[agentname]
+ except:
+ shared_struct['unknown'] = True
+ shared_struct['prettyname'] = agentname
shared2.append(shared_struct)
map['shared2'] = shared2
@@ -4237,6 +4588,7 @@
try:
fencedev['pretty_name'] = FENCE_OPTS[fd.getAgentType()]
except:
+ fencedev['unknown'] = True
fencedev['pretty_name'] = fd.getAgentType()
fencedev['agent'] = fd.getAgentType()
#Add config url for this fencedev
--- conga/luci/site/luci/Extensions/conga_constants.py 2007/01/08 15:29:09 1.19.2.5
+++ conga/luci/site/luci/Extensions/conga_constants.py 2007/01/10 22:53:56 1.19.2.6
@@ -45,6 +45,7 @@
CLUSTER_DAEMON="55"
SERVICE_DELETE = '56'
FENCEDEV_DELETE = "57"
+FENCEDEV_NODE_CONFIG = '58'
CONF_EDITOR = '80'
--- conga/luci/site/luci/Extensions/homebase_adapters.py 2007/01/08 19:49:20 1.34.2.10
+++ conga/luci/site/luci/Extensions/homebase_adapters.py 2007/01/10 22:53:56 1.34.2.11
@@ -794,6 +794,7 @@
def validateAuthenticate(self, request):
try:
request.SESSION.delete('auth_systems')
+ request.SESSION.delete('auth_status')
except:
pass
@@ -874,7 +875,6 @@
else:
try:
request.SESSION.delete('auth_systems')
- del auth_systems
except:
pass
next reply other threads:[~2007-01-10 22:53 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-01-10 22:53 rmccabe [this message]
-- strict thread matches above, loose matches on Subject: below --
2007-08-08 21:18 [Cluster-devel] conga/luci cluster/fence_device.js cluster/for rmccabe
2007-01-25 21:03 rmccabe
2007-01-10 23:49 rmccabe
2007-01-10 23:47 rmccabe
2007-01-08 21:58 rmccabe
2007-01-05 23:44 rmccabe
2006-12-01 14:56 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=20070110225358.16117.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.