From: rmccabe@sourceware.org <rmccabe@sourceware.org>
To: cluster-devel.redhat.com
Subject: [Cluster-devel] conga/luci cluster/cluster_config-macros clust ...
Date: 17 Feb 2009 20:49:31 -0000 [thread overview]
Message-ID: <20090217204931.29866.qmail@sourceware.org> (raw)
CVSROOT: /cvs/cluster
Module name: conga
Branch: RHEL4
Changes by: rmccabe at sourceware.org 2009-02-17 20:49:29
Modified files:
luci/cluster : cluster_config-macros fence-macros
validate_fence.js
luci/plone-custom: conga_ajax.js validate_auth.js
luci/site/luci/Extensions: FenceHandler.py LuciClusterInfo.py
LuciValidation.py ResourceHandler.py
luci/site/luci/Extensions/ClusterModel: FenceDaemon.py
FenceDeviceAttr.py
ModelBuilder.py
QuorumD.py
luci/site/luci/var: Data.fs
Log message:
Backport fixes from RHEL5
Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/cluster/cluster_config-macros.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=1.4.2.2&r2=1.4.2.3
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/cluster/fence-macros.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=1.2.4.6&r2=1.2.4.7
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/cluster/validate_fence.js.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=1.3.2.8&r2=1.3.2.9
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/plone-custom/conga_ajax.js.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=1.3.2.2&r2=1.3.2.3
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/plone-custom/validate_auth.js.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=1.1.4.2&r2=1.1.4.3
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/FenceHandler.py.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=1.17.2.10&r2=1.17.2.11
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/LuciClusterInfo.py.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=1.10.2.7&r2=1.10.2.8
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/LuciValidation.py.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=1.9.2.3&r2=1.9.2.4
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/ResourceHandler.py.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=1.2.2.6&r2=1.2.2.7
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/ClusterModel/FenceDaemon.py.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=1.2.2.2&r2=1.2.2.3
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/ClusterModel/FenceDeviceAttr.py.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=1.5.4.1&r2=1.5.4.2
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/ClusterModel/ModelBuilder.py.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=1.5.2.6&r2=1.5.2.7
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/ClusterModel/QuorumD.py.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=1.2.2.2&r2=1.2.2.3
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/var/Data.fs.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=1.20.2.27&r2=1.20.2.28
--- conga/luci/cluster/cluster_config-macros 2008/11/10 21:02:43 1.4.2.2
+++ conga/luci/cluster/cluster_config-macros 2009/02/17 20:48:57 1.4.2.3
@@ -454,6 +454,18 @@
tal:attributes="value clusterinfo/pjd" />
</td>
</tr>
+
+ <tr tal:condition="clusterinfo/has_ignore_undef_fence"
+ class="systemsTable">
+
+ <td class="systemsTable">Skip nodes with undefined fencing</td>
+ <td class="systemsTable">
+ <input type="checkbox" name="skip_undefined"
+ tal:attributes="checked python: clusterinfo.get('skip_undefined') and 'checked' or ''" />
+ </td>
+ </tr>
+
+
<tr class="systemsTable">
<td class="systemsTable">
<span class="cluster_help" title="Enable if you will be running a VM cluster on this physical cluster">Run XVM fence daemon</td>
--- conga/luci/cluster/fence-macros 2008/11/10 21:02:43 1.2.4.6
+++ conga/luci/cluster/fence-macros 2009/02/17 20:48:57 1.2.4.7
@@ -218,6 +218,14 @@
<tal:block metal:use-macro="here/fence-macros/macros/fence-form-egenera" />
</tal:block>
+ <tal:block tal:condition="python: cur_fence_type == 'fence_lpar'">
+ <tal:block metal:use-macro="here/fence-macros/macros/fence-form-lpar" />
+ </tal:block>
+
+ <tal:block tal:condition="python: cur_fence_type == 'fence_vmware'">
+ <tal:block metal:use-macro="here/fence-macros/macros/fence-form-vmware" />
+ </tal:block>
+
<tal:block tal:condition="python: cur_fence_type == 'fence_bladecenter'">
<tal:block metal:use-macro="here/fence-macros/macros/fence-form-bladecenter" />
</tal:block>
@@ -325,6 +333,8 @@
<option name="fence_bullpap" value="fence_bullpap">Bull PAP</option>
<option name="fence_xvm" value="fence_xvm">Virtual Machine Fencing</option>
<option name="fence_scsi" value="fence_scsi">SCSI Fencing</option>
+ <option name="fence_vmware" value="fence_vmware">VMWare Fencing</option>
+ <option name="fence_lpar" value="fence_lpar">LPAR Fencing</option>
</div>
<div metal:define-macro="fence-option-list">
@@ -347,6 +357,8 @@
<option name="fence_ipmilan" value="fence_ipmilan">IPMI Lan</option>
<option name="fence_xvm" value="fence_xvm">Virtual Machine Fencing</option>
<option name="fence_scsi" value="fence_scsi">SCSI Fencing</option>
+ <option name="fence_vmware" value="fence_vmware">VMWare Fencing</option>
+ <option name="fence_lpar" value="fence_lpar">LPAR Fencing</option>
<option name="fence_manual" value="fence_manual">Manual Fencing</option>
</div>
@@ -1084,6 +1096,175 @@
</div>
</div>
+<div metal:define-macro="fence-form-lpar"
+ tal:attributes="id cur_fencedev/name | nothing">
+
+ <div id="fence_lpar" class="fencedev">
+ <table>
+ <tr>
+ <td><strong class="cluster">Fence Type</strong></td>
+ <td>LPAR</td>
+ </tr>
+ <tr>
+ <td>Name</td>
+ <td>
+ <input name="name" type="text"
+ tal:attributes="
+ disabled cur_fencedev/isShared | nothing;
+ value cur_fencedev/name | nothing" />
+ </td>
+ </tr>
+ <tr>
+ <td>Hostname</td>
+ <td>
+ <input name="ipaddr" type="text"
+ tal:attributes="
+ disabled cur_fencedev/isShared | nothing;
+ value cur_fencedev/ipaddr | nothing" />
+ </td>
+ </tr>
+ <tr>
+ <td>Login</td>
+ <td>
+ <input name="login" type="text"
+ tal:attributes="
+ disabled cur_fencedev/isShared | nothing;
+ value cur_fencedev/login | nothing" />
+ </td>
+ </tr>
+ <tr>
+ <td>Password</td>
+ <td>
+ <input name="passwd" type="password" autocomplete="off"
+ tal:attributes="
+ disabled cur_fencedev/isShared | nothing;
+ value nothing" />
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <span title="Full path to a script to generate fence password">Password Script (optional)</span>
+ </td>
+ <td>
+ <input type="text" name="passwd_script"
+ tal:attributes="
+ disabled cur_fencedev/isShared | nothing;
+ value cur_fencedev/passwd_script | nothing" />
+ </td>
+ </tr>
+ </table>
+
+ <tal:block tal:condition="exists: cur_fencedev">
+ <input type="hidden" name="existing_device" value="1" />
+ <input type="hidden" name="orig_name"
+ tal:attributes="value cur_fencedev/name | nothing" />
+ </tal:block>
+
+ <input type="hidden" name="sharable" value="1" />
+ <input type="hidden" name="fence_type" value="fence_lpar" />
+ </div>
+</div>
+
+<div metal:define-macro="fence-form-vmware"
+ tal:attributes="id cur_fencedev/name | nothing">
+
+ <div id="fence_vmware" class="fencedev">
+ <table>
+ <tr>
+ <td><strong class="cluster">Fence Type</strong></td>
+ <td>VMWare</td>
+ </tr>
+ <tr>
+ <td>Name</td>
+ <td>
+ <input name="name" type="text"
+ tal:attributes="
+ disabled cur_fencedev/isShared | nothing;
+ value cur_fencedev/name | nothing" />
+ </td>
+ </tr>
+ <tr>
+ <td>Hostname</td>
+ <td>
+ <input name="ipaddr" type="text"
+ tal:attributes="
+ disabled cur_fencedev/isShared | nothing;
+ value cur_fencedev/ipaddr | nothing" />
+ </td>
+ </tr>
+
+ <tr>
+ <td>Login</td>
+ <td>
+ <input name="login" type="text"
+ tal:attributes="
+ disabled cur_fencedev/isShared | nothing;
+ value cur_fencedev/login | nothing" />
+ </td>
+ </tr>
+ <tr>
+ <td>Password</td>
+ <td>
+ <input name="passwd" type="password" autocomplete="off"
+ tal:attributes="
+ disabled cur_fencedev/isShared | nothing;
+ value nothing" />
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <span title="Full path to a script to generate fence password">Password Script (optional)</span>
+ </td>
+ <td>
+ <input type="text" name="passwd_script"
+ tal:attributes="
+ disabled cur_fencedev/isShared | nothing;
+ value cur_fencedev/passwd_script | nothing" />
+ </td>
+ </tr>
+
+ <tr>
+ <td>VMware ESX Management Login</td>
+ <td>
+ <input name="vmlogin" type="text"
+ tal:attributes="
+ disabled cur_fencedev/isShared | nothing;
+ value cur_fencedev/vmlogin | nothing" />
+ </td>
+ </tr>
+ <tr>
+ <td>VMware ESX Management Password</td>
+ <td>
+ <input name="vmpasswd" type="password" autocomplete="off"
+ tal:attributes="
+ disabled cur_fencedev/isShared | nothing;
+ value nothing" />
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <span title="Full path to a script to generate VMware ESX Management password">VMware ESX Management Password Script (optional)</span>
+ </td>
+ <td>
+ <input type="text" name="vmpasswd_script"
+ tal:attributes="
+ disabled cur_fencedev/isShared | nothing;
+ value cur_fencedev/vmpasswd_script | nothing" />
+ </td>
+ </tr>
+ </table>
+
+ <tal:block tal:condition="exists: cur_fencedev">
+ <input type="hidden" name="existing_device" value="1" />
+ <input type="hidden" name="orig_name"
+ tal:attributes="value cur_fencedev/name | nothing" />
+ </tal:block>
+
+ <input type="hidden" name="sharable" value="1" />
+ <input type="hidden" name="fence_type" value="fence_vmware" />
+ </div>
+</div>
+
<div metal:define-macro="fence-form-egenera"
tal:attributes="id cur_fencedev/name | nothing">
@@ -1491,6 +1672,8 @@
<tal:block metal:use-macro="here/fence-macros/macros/fence-form-ipmilan" />
<tal:block metal:use-macro="here/fence-macros/macros/fence-form-xvm" />
<tal:block metal:use-macro="here/fence-macros/macros/fence-form-scsi" />
+ <tal:block metal:use-macro="here/fence-macros/macros/fence-form-lpar" />
+ <tal:block metal:use-macro="here/fence-macros/macros/fence-form-vmware" />
<tal:block metal:use-macro="here/fence-macros/macros/fence-form-manual" />
</div>
@@ -1507,6 +1690,8 @@
<tal:block metal:use-macro="here/fence-macros/macros/fence-form-bullpap" />
<tal:block metal:use-macro="here/fence-macros/macros/fence-form-xvm" />
<tal:block metal:use-macro="here/fence-macros/macros/fence-form-scsi" />
+ <tal:block metal:use-macro="here/fence-macros/macros/fence-form-lpar" />
+ <tal:block metal:use-macro="here/fence-macros/macros/fence-form-vmware" />
</div>
<div metal:define-macro="shared-fence-device-list">
@@ -1609,6 +1794,101 @@
</div>
</div>
+<div metal:define-macro="fence-instance-form-lpar"
+ tal:omit-tag="exists: cur_fence_dev_id">
+ <div id="fence_lpar_instance" name="fence_lpar" class="fencedev_instance"
+ tal:omit-tag="exists: cur_fence_dev_id">
+ <table>
+ <tr>
+ <td>Partition</td>
+ <td>
+ <input name="partition" type="text"
+ tal:attributes="
+ value cur_instance/partition | nothing" />
+ </td>
+ </tr>
+
+ <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="option" tal:condition="exists:cur_instance"
+ tal:attributes="value cur_instance/option |nothing" />
+ <input type="hidden" name="fence_type" value="fence_lpar" />
+ <input type="hidden" name="fence_instance" value="1" />
+ <input type="hidden" name="secure" 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-vmware"
+ tal:omit-tag="exists: cur_fence_dev_id">
+ <div id="fence_vmware_instance" name="fence_vmware" class="fencedev_instance"
+ tal:omit-tag="exists: cur_fence_dev_id">
+ <table>
+ <tr>
+ <td>Port</td>
+ <td>
+ <input name="port" type="text"
+ tal:attributes="
+ value cur_instance/port | nothing" />
+ </td>
+ </tr>
+
+ <tr tal:condition="exists:clusterinfo/has_fence_ssh">
+ <td>
+ <span title="Enable SSH operation">Use SSH</span>
+ </td>
+ <td>
+ <input tal:condition="exists:cur_instance"
+ type="checkbox" name="secure"
+ tal:attributes="
+ checked python:(cur_instance and cur_instance.has_key('secure') and (cur_instance['secure'] == '1' or cur_instance['secure'].lower() == 'true')) and 'checked' or ''" />
+ <input tal:condition="not:exists:cur_instance"
+ type="checkbox" name="secure" />
+ </td>
+ </tr>
+
+ <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="option" tal:condition="exists:cur_instance"
+ tal:attributes="value cur_instance/option |nothing" />
+ <input type="hidden" name="fence_type" value="fence_vmware" />
+ <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"
tal:omit-tag="exists: cur_fence_dev_id">
<div id="fence_egenera_instance" name="fence_egenera" class="fencedev_instance"
@@ -2053,6 +2333,10 @@
<tal:block
metal:use-macro="here/fence-macros/macros/fence-instance-form-egenera" />
<tal:block
+ metal:use-macro="here/fence-macros/macros/fence-instance-form-lpar" />
+ <tal:block
+ metal:use-macro="here/fence-macros/macros/fence-instance-form-vmware" />
+ <tal:block
metal:use-macro="here/fence-macros/macros/fence-instance-form-wti" />
<tal:block
metal:use-macro="here/fence-macros/macros/fence-instance-form-brocade" />
@@ -2117,6 +2401,16 @@
metal:use-macro="here/fence-macros/macros/fence-instance-form-egenera" />
</tal:block>
+ <tal:block tal:condition="python: cur_fence_type == 'fence_lpar'">
+ <tal:block
+ metal:use-macro="here/fence-macros/macros/fence-instance-form-lpar" />
+ </tal:block>
+
+ <tal:block tal:condition="python: cur_fence_type == 'fence_vmware'">
+ <tal:block
+ metal:use-macro="here/fence-macros/macros/fence-instance-form-vmware" />
+ </tal:block>
+
<tal:block tal:condition="python: cur_fence_type == 'fence_bullpap'">
<tal:block
metal:use-macro="here/fence-macros/macros/fence-instance-form-bullpap" />
--- conga/luci/cluster/validate_fence.js 2008/04/23 17:22:59 1.3.2.8
+++ conga/luci/cluster/validate_fence.js 2009/02/17 20:48:57 1.3.2.9
@@ -20,6 +20,8 @@
fence_inst_validator['vixel'] = [ 'port' ];
fence_inst_validator['wti'] = [ 'port', 'secure' ];
fence_inst_validator['xvm'] = [ 'domain' ];
+fence_inst_validator['lpar'] = [ 'partition' ];
+fence_inst_validator['vmware'] = [ 'port' ];
var fence_validator = [];
fence_validator['apc'] = [ 'ipaddr', 'login', 'passwd', 'passwd_script' ];
@@ -41,6 +43,8 @@
fence_validator['unknown'] = [];
fence_validator['vixel'] = [ 'ipaddr', 'passwd', 'passwd_script' ];
fence_validator['wti'] = [ 'ipaddr', 'passwd', 'passwd_script' ];
+fence_validator['lpar'] = [ 'ipaddr', 'login', 'passwd', 'passwd_script' ];
+fence_validator['vmware'] = [ 'ipaddr', 'login', 'passwd', 'passwd_script', 'vmlogin' ];
fence_validator['xvm'] = [];
function validate_field_str(form, form_elem) {
@@ -120,12 +124,15 @@
field_validator['ipaddr'] = validate_field_host;
field_validator['hostname'] = validate_field_host;
field_validator['login'] = validate_field_str;
+field_validator['vmlogin'] = validate_field_str;
field_validator['passwd'] = validate_field_passwd;
+field_validator['vmpasswd'] = validate_field_noop;
field_validator['servers'] = validate_field_str;
field_validator['cserver'] = validate_field_str;
field_validator['device'] = validate_field_str;
field_validator['port'] = validate_field_str;
field_validator['passwd_script'] = validate_field_noop;
+field_validator['vmpasswd_script'] = validate_field_noop;
/* iLO, DRAC5, WTI, APC, Bladecenter */
field_validator['secure'] = validate_field_noop;
@@ -143,6 +150,7 @@
field_validator['lpan'] = validate_field_str;
field_validator['pserver'] = validate_field_str;
field_validator['domain'] = validate_field_str;
+field_validator['partition'] = validate_field_str;
function validate_fence(form) {
var errors = [];
@@ -179,9 +187,12 @@
for (var i = 0 ; i < fields.length ; i++) {
var field_name = fields[i];
if (form[field_name]) {
- var err = field_validator[field_name](form, form[field_name]);
- if (err) {
- errors = errors.concat(err);
+ try {
+ var err = field_validator[field_name](form, form[field_name]);
+ if (err) {
+ errors = errors.concat(err);
+ }
+ } catch (e) {
}
}
}
--- conga/luci/plone-custom/conga_ajax.js 2008/03/25 01:27:11 1.3.2.2
+++ conga/luci/plone-custom/conga_ajax.js 2009/02/17 20:49:00 1.3.2.3
@@ -12,15 +12,24 @@
function get_xmlhttp_obj() {
xmlHttp_object = false;
- if (!xmlHttp_object && typeof XMLHttpRequest != 'undefined') {
+ if (!xmlHttp_object) {
try {
xmlHttp_object = new XMLHttpRequest();
+ if (!xmlHttp_object) {
+ throw "no XMLHttpRequest";
+ }
} catch (e0) {
try {
xmlHttp_object = new ActiveXObject("Msxml2.XMLHTTP");
+ if (!xmlHttp_object) {
+ throw "no Msxml2.XMLHTTP";
+ }
} catch (e) {
try {
xmlHttp_object = new ActiveXObject("Microsoft.XMLHTTP");
+ if (!xmlHttp_object) {
+ throw "No Microsoft.XMLHTTP";
+ }
} catch (e2) {
xmlHttp_object = false;
}
--- conga/luci/plone-custom/validate_auth.js 2008/12/10 21:02:00 1.1.4.2
+++ conga/luci/plone-custom/validate_auth.js 2009/02/17 20:49:00 1.1.4.3
@@ -94,16 +94,22 @@
var msgs = [];
var systems_list = get_systems_list_offsets(errors);
var os_str = null;
+ var form_elem = null;
for (var i = 0 ; i < systems_list.length ; i++) {
var cur_node_props = node_props[systems_list[i][0]];
var cur_sys_name = systems_list[i][0];
var offset = systems_list[i][1];
+
try {
var addr_elem = document.getElementById('__SYSTEM' + offset + ':Addr');
var pwd_elem = document.getElementById('__SYSTEM' + offset + ':Passwd');
var fp_elem = document.getElementById('__SYSTEM' + offset + 'Fingerprint');
+ if (addr_elem) {
+ form_elem = addr_elem.form;
+ }
+
if (cur_node_props['available'] != 'True') {
set_form_err(addr_elem);
clr_form_err(pwd_elem);
@@ -160,6 +166,13 @@
if (errors.length > 0) {
display_msgs(err_div_id, errors);
+ } else if (form_elem !== null && os_version == 'rhel5') {
+ try {
+ if (form_elem.pagetype.value == '1003') {
+ validate_cluster_create(form_elem);
+ }
+ } catch (e) {
+ }
}
if (msgs.length > 0) {
--- conga/luci/site/luci/Extensions/FenceHandler.py 2008/06/10 14:48:30 1.17.2.10
+++ conga/luci/site/luci/Extensions/FenceHandler.py 2009/02/17 20:49:01 1.17.2.11
@@ -30,6 +30,8 @@
FD_PROVIDE_DEVICE = 'A device must be provided for this Fence Device'
FD_PROVIDE_PORT = 'A port must be provided for this Fence Device'
FD_PROVIDE_IPMILAN_AUTH = 'Authentication type must be "none" (or blank), "md5", or "password"'
+FD_PROVIDE_VMLOGIN = 'A VMware ESX management login name must be provided for this Fence Device'
+FD_PROVIDE_VMPASSWD = 'A VMware ESX management password must be provided for this Fence Device'
FI_PROVIDE_PARENT = 'A Fence Device name must be provided for this Fence'
FI_PROVIDE_SWITCH = 'A switch address must be provided for this Fence'
@@ -40,6 +42,7 @@
FI_PROVIDE_ELPAN = 'A LPAN value must be provided for this Egenera Fence'
FI_PROVIDE_EPSERVER = 'A PServer value must be provided for this Egenera Fence'
FI_PROVIDE_NODENAME = 'A Node Name value must be provided for this SCSI Fence'
+FI_PROVIDE_PARTITION = 'A partition name must be provided for this LPAR Fence'
ILLEGAL_CHARS_REPLACED = 'Illegal characters were replaced by underscores. Feel free to set a new value.'
@@ -534,6 +537,159 @@
return errors
+def val_lpar_fd(form, fencedev):
+ errors = list()
+
+ # fence_lpar currently requires the use of SSH
+ fencedev.addAttribute('secure', '1')
+
+ try:
+ ip = form['ipaddr'].strip()
+ if not ip:
+ raise Exception, 'blank'
+ fencedev.addAttribute('ipaddr', ip)
+ except Exception, e:
+ errors.append(FD_PROVIDE_IP)
+
+ try:
+ log = form['login'].strip()
+ if not log:
+ raise Exception, 'blank'
+ fencedev.addAttribute('login', log)
+ except Exception, e:
+ errors.append(FD_PROVIDE_LOGIN)
+
+ has_passwd = False
+ try:
+ pwd = form['passwd'].strip()
+ if not pwd:
+ # Allow passwords that consist of only spaces.
+ if not form.has_key('passwd') or form['passwd'] == '':
+ raise Exception, 'blank'
+ else:
+ pwd = form['passwd']
+ fencedev.addAttribute('passwd', pwd)
+ has_passwd = True
+ except Exception, e:
+ try:
+ fencedev.removeAttribute('passwd')
+ except:
+ pass
+
+ try:
+ pwd_script = form['passwd_script'].strip()
+ if not pwd_script:
+ raise Exception, 'blank'
+ fencedev.addAttribute('passwd_script', pwd_script)
+ has_passwd = True
+ except Exception, e:
+ try:
+ fencedev.removeAttribute('passwd_script')
+ except:
+ pass
+
+ if not has_passwd:
+ errors.append(FD_PROVIDE_PASSWD)
+ return errors
+
+def val_vmware_fd(form, fencedev):
+ errors = list()
+
+ try:
+ ip = form['ipaddr'].strip()
+ if not ip:
+ raise Exception, 'blank'
+ fencedev.addAttribute('ipaddr', ip)
+ except Exception, e:
+ errors.append(FD_PROVIDE_IP)
+
+ try:
+ log = form['login'].strip()
+ if not log:
+ raise Exception, 'blank'
+ fencedev.addAttribute('login', log)
+ except Exception, e:
+ errors.append(FD_PROVIDE_LOGIN)
+
+ has_passwd = False
+ try:
+ pwd = form['passwd'].strip()
+ if not pwd:
+ # Allow passwords that consist of only spaces.
+ if not form.has_key('passwd') or form['passwd'] == '':
+ raise Exception, 'blank'
+ else:
+ pwd = form['passwd']
+ fencedev.addAttribute('passwd', pwd)
+ has_passwd = True
+ except Exception, e:
+ try:
+ fencedev.removeAttribute('passwd')
+ except:
+ pass
+
+ try:
+ pwd_script = form['passwd_script'].strip()
+ if not pwd_script:
+ raise Exception, 'blank'
+ fencedev.addAttribute('passwd_script', pwd_script)
+ has_passwd = True
+ except Exception, e:
+ try:
+ fencedev.removeAttribute('passwd_script')
+ except:
+ pass
+
+ if not has_passwd:
+ errors.append(FD_PROVIDE_PASSWD)
+ use_ssh = form.has_key('secure') and (form['secure'] == '1' or form['secure'].lower() == 'true')
+ if use_ssh:
+ fencedev.addAttribute('secure', '1')
+ else:
+ fencedev.removeAttribute('secure')
+
+ try:
+ vmlogin = form['vmlogin'].strip()
+ if not vmlogin:
+ raise Exception, 'blank'
+ fencedev.addAttribute('vmlogin', vmlogin)
+ except Exception, e:
+ errors.append(FD_PROVIDE_VMLOGIN)
+
+ has_vmpasswd = False
+ try:
+ vmpwd = form['vmpasswd'].strip()
+ if not vmpwd:
+ # Allow passwords that consist of only spaces.
+ if not form.has_key('vmpasswd') or form['vmpasswd'] == '':
+ raise Exception, 'blank'
+ else:
+ vmpwd = form['vmpasswd']
+ fencedev.addAttribute('vmpasswd', vmpwd)
+ has_vmpasswd = True
+ except Exception, e:
+ try:
+ fencedev.removeAttribute('vmpasswd')
+ except:
+ pass
+
+ try:
+ vmpwd_script = form['vmpasswd_script'].strip()
+ if not vmpwd_script:
+ raise Exception, 'blank'
+ fencedev.addAttribute('vmpasswd_script', vmpwd_script)
+ has_vmpasswd = True
+ except Exception, e:
+ try:
+ fencedev.removeAttribute('vmpasswd_script')
+ except:
+ pass
+
+ if not has_vmpasswd:
+ errors.append(FD_PROVIDE_VMPASSWD)
+
+ return errors
+
def val_noop_fd(dummy, _dummy):
return []
@@ -830,6 +986,8 @@
'fence_mcdata': val_mcdata_fd,
'fence_egenera': val_egenera_fd,
'fence_bullpap': val_bullpap_fd,
+ 'fence_lpar': val_lpar_fd,
+ 'fence_vmware': val_vmware_fd,
'fence_xvm': val_noop_fd,
'fence_scsi': val_noop_fd,
'fence_ilo': val_ilo_fd,
@@ -1089,6 +1247,40 @@
return errors
+def val_lpar_fi(form, fenceinst):
+ errors = list()
+
+ try:
+ partition = form['partition'].strip()
+ if not partition:
+ raise Exception, 'blank'
+ fenceinst.addAttribute('partition', partition)
+ except Exception, e:
+ errors.append(FI_PROVIDE_PARTITION)
+
+ fenceinst.addAttribute('secure', '1')
+
+ return errors
+
+def val_vmware_fi(form, fenceinst):
+ errors = list()
+
+ try:
+ port = form['port'].strip()
+ if not port:
+ raise Exception, 'blank'
+ fenceinst.addAttribute('port', port)
+ except Exception, e:
+ errors.append(FI_PROVIDE_PORT)
+
+ use_ssh = form.has_key('secure') and (form['secure'] == '1' or form['secure'].lower() == 'true')
+ if use_ssh:
+ fenceinst.addAttribute('secure', '1')
+ else:
+ fenceinst.removeAttribute('secure')
+
+ return errors
+
def val_manual_fi(form, fenceinst):
nodename = form.get('nodename')
if nodename:
@@ -1112,6 +1304,8 @@
'fence_manual': val_manual_fi,
'fence_xvm': val_xvm_fi,
'fence_scsi': val_scsi_fi,
+ 'fence_lpar': val_lpar_fi,
+ 'fence_vmware': val_vmware_fi,
'fence_ilo': val_noop_fi,
'fence_ipmilan': val_noop_fi,
'fence_drac': val_noop_fi,
--- conga/luci/site/luci/Extensions/LuciClusterInfo.py 2008/11/10 21:02:43 1.10.2.7
+++ conga/luci/site/luci/Extensions/LuciClusterInfo.py 2009/02/17 20:49:01 1.10.2.8
@@ -317,10 +317,48 @@
rc_map['max_depth'] = child_depth
return child_depth + 1
-
def get_fdom_names(model):
return map(lambda x: x.getName(), model.getFailoverDomains())
+def get_svc_recovery_info(svc, model, hmap):
+ try:
+ hmap['fdoms'] = get_fdom_names(model)
+ except Exception, e:
+ if LUCI_DEBUG_MODE is True:
+ luci_log.debug_verbose('getServiceInfo1: %r %s' % (e, str(e)))
+ hmap['fdoms'] = list()
+
+ try:
+ hmap['domain'] = svc.getAttribute('domain')
+ except:
+ hmap['domain'] = None
+
+ try:
+ hmap['recovery'] = svc.getAttribute('recovery')
+ except:
+ hmap['recovery'] = None
+
+ try:
+ hmap['max_restarts'] = svc.getAttribute('max_restarts')
+ if not hmap['max_restarts']:
+ hmap['max_restarts'] = 0
+ except:
+ hmap['max_restarts'] = 0
+
+ try:
+ hmap['restart_expire_time'] = svc.getAttribute('restart_expire_time')
+ if not hmap['restart_expire_time']:
+ hmap['restart_expire_time'] = 0
+ except:
+ hmap['restart_expire_time'] = 0
+
+ try:
+ if int(svc.getAttribute('exclusive')):
+ hmap['exclusive'] = 'true'
+ else:
+ hmap['exclusive'] = 'false'
+ except:
+ hmap['exclusive'] = 'false'
def getServiceInfo(self, status, model, req):
root_uuid = 'toplevel'
@@ -332,18 +370,11 @@
if LUCI_DEBUG_MODE is True:
luci_log.debug_verbose('getServiceInfo0: no model: %r' % model)
return {}
+ cluname = fvars['clustername'] or model.getClusterName()
#set up struct for service config page
hmap = {}
- try:
- cluname = fvars['clustername'] or model.getClusterName()
- hmap['fdoms'] = get_fdom_names(model)
- except Exception, e:
- if LUCI_DEBUG_MODE is True:
- luci_log.debug_verbose('getServiceInfo1: %r %s' % (e, str(e)))
- hmap['fdoms'] = list()
-
hmap['root_uuid'] = root_uuid
# uuids for the service page needed when new resources are created
hmap['uuid_list'] = map(lambda x: make_uuid('resource'), xrange(30))
@@ -412,37 +443,7 @@
# first get service by name from model
svc = model.getService(servicename)
- try:
- hmap['domain'] = svc.getAttribute('domain')
- except:
- hmap['domain'] = None
-
- try:
- hmap['recovery'] = svc.getAttribute('recovery')
- except:
- hmap['recovery'] = None
-
- try:
- hmap['max_restarts'] = svc.getAttribute('max_restarts')
- if not hmap['max_restarts']:
- hmap['max_restarts'] = 0
- except:
- hmap['max_restarts'] = 0
-
- try:
- hmap['restart_expire_time'] = svc.getAttribute('restart_expire_time')
- if not hmap['restart_expire_time']:
- hmap['restart_expire_time'] = 0
- except:
- hmap['restart_expire_time'] = 0
-
- try:
- if int(svc.getAttribute('exclusive')):
- hmap['exclusive'] = 'true'
- else:
- hmap['exclusive'] = 'false'
- except:
- hmap['exclusive'] = 'false'
+ get_svc_recovery_info(svc, model, hmap)
resource_list = list()
if svc is not None:
@@ -601,6 +602,9 @@
clumap['os_minor'] = os_minor
if os_minor > 1:
clumap['vm_migration_choice'] = True
+ if os_minor > 2:
+ clumap['has_fence_ssh'] = True
+ clumap['has_ignore_undef_fence'] = True
elif cluster_os.find('Nahant') != -1:
clumap['os_major'] = 4
os_minor = int(cluster_os[cluster_os.find('Update ') + 7])
@@ -659,6 +663,7 @@
clumap['pjd'] = pjd
#post fail delay
clumap['pfd'] = pfd
+ clumap['skip_undefined'] = fdp.getSkipUndefined()
#-------------
#if multicast
@@ -1552,6 +1557,7 @@
attrs = vm.getAttributes()
if attrs:
vm_map.update(attrs)
+ get_svc_recovery_info(vm, model, vm_map)
return vm_map
def getResourcesInfo(self, model, request):
--- conga/luci/site/luci/Extensions/LuciValidation.py 2008/11/10 21:02:44 1.9.2.3
+++ conga/luci/site/luci/Extensions/LuciValidation.py 2009/02/17 20:49:01 1.9.2.4
@@ -867,6 +867,7 @@
elif not run_xvmd:
model.delFenceXVM()
+ fd = None
try:
fd = model.getFenceDaemonPtr()
old_pj_delay = fd.getPostJoinDelay()
@@ -882,6 +883,12 @@
luci_log.debug_verbose('Unable to update fence daemon properties: %r %s' % (e, str(e)))
errors.append('An error occurred while attempting to update fence daemon properties: %s' % str(e))
+ skip_undef = form.has_key('skip_undefined')
+ if skip_undef is True:
+ fd.setSkipUndefined(True)
+ else:
+ fd.setSkipUndefined(False)
+
if len(errors) > 0:
return (False, {'errors': errors })
--- conga/luci/site/luci/Extensions/ResourceHandler.py 2008/05/12 18:04:12 1.2.2.6
+++ conga/luci/site/luci/Extensions/ResourceHandler.py 2009/02/17 20:49:01 1.2.2.7
@@ -1,4 +1,4 @@
-# Copyright (C) 2006-2008 Red Hat, Inc.
+# Copyright (C) 2006-2009 Red Hat, Inc.
#
# This program is free software; you can redistribute
# it and/or modify it under the terms of version 2 of the
@@ -41,13 +41,13 @@
def generate_fsid(model, name):
import binascii
- from random import random
+ from random import randrange
fsid_list = get_fsid_list(model)
fsid = binascii.crc32(name) & 0xffff
dupe = fsid in fsid_list
while dupe is True:
- fsid = (fsid + random.randrange(1, 0xfffe)) & 0xffff
+ fsid = (fsid + randrange(1, 0xfffe)) & 0xffff
dupe = fsid in fsid_list
return fsid
--- conga/luci/site/luci/Extensions/ClusterModel/FenceDaemon.py 2008/03/25 01:27:13 1.2.2.2
+++ conga/luci/site/luci/Extensions/ClusterModel/FenceDaemon.py 2009/02/17 20:49:02 1.2.2.3
@@ -33,6 +33,16 @@
val = self.getAttribute('clean_start')
return val
+ def getSkipUndefined(self):
+ val = self.getAttribute('skip_undefined')
+ return val
+
+ def setSkipUndefined(self, val):
+ if val:
+ self.addAttribute('skip_undefined', '1')
+ else:
+ self.removeAttribute('skip_undefined')
+
def setPostJoinDelay(self, delay):
self.addAttribute('post_join_delay', delay)
--- conga/luci/site/luci/Extensions/ClusterModel/FenceDeviceAttr.py 2008/03/25 01:27:13 1.5.4.1
+++ conga/luci/site/luci/Extensions/ClusterModel/FenceDeviceAttr.py 2009/02/17 20:49:02 1.5.4.2
@@ -29,6 +29,8 @@
'fence_drac': 'Dell DRAC',
'fence_rsa': 'IBM RSA II Device',
'fence_rps10': 'RPS10 Serial Switch',
+ 'fence_lpar': 'LPAR Fencing',
+ 'fence_vmware': 'VMware Fencing',
'fence_manual': 'Manual Fencing'
}
@@ -45,6 +47,8 @@
'fence_bullpap': True,
'fence_xvm': True,
'fence_scsi': True,
+ 'fence_lpar': True,
+ 'fence_vmware': True,
'fence_ilo': False,
'fence_ipmilan': False,
'fence_drac': False,
@@ -86,6 +90,8 @@
'fence_bullpap': ( 'domain' ),
'fence_xvm': ( 'domain' ),
'fence_scsi': ( 'node' ),
+ 'fence_lpar': ( 'partition' ),
+ 'fence_vmware': ( 'port' ),
'fence_ilo': ( ),
'fence_ipmilan': ( ),
'fence_drac': ( ),
@@ -117,6 +123,10 @@
( 'name', 'ipaddr', 'login', 'passwd' ),
'fence_xvm':
( 'name' ),
+ 'fence_lpar':
+ ( 'name', 'ipaddr', 'login', 'passwd' ),
+ 'fence_vmware':
+ ( 'name', 'ipaddr', 'login', 'passwd', 'vmlogin', 'vmpasswd' ),
'fence_scsi':
( 'name' ),
'fence_ilo':
--- conga/luci/site/luci/Extensions/ClusterModel/ModelBuilder.py 2008/11/10 21:02:44 1.5.2.6
+++ conga/luci/site/luci/Extensions/ClusterModel/ModelBuilder.py 2009/02/17 20:49:02 1.5.2.7
@@ -1,4 +1,4 @@
-# Copyright (C) 2006-2008 Red Hat, Inc.
+# Copyright (C) 2006-2009 Red Hat, Inc.
#
# This program is free software; you can redistribute
# it and/or modify it under the terms of version 2 of the
@@ -1101,6 +1101,25 @@
continue
self.__removeReferences(tagobj, t)
+ def get_expected_votes(self):
+ node_votes = 0
+ qdisk_votes = 0
+
+ if self.quorumd_ptr is not None:
+ try:
+ qdisk_votes = int(self.quorumd_ptr.getVotes())
+ except:
+ qdisk_votes = 0
+
+ for i in self.getNodes():
+ try:
+ cur_votes = int(i.getVotes())
+ except:
+ cur_votes = 1
+ node_votes += cur_votes
+
+ return node_votes + qdisk_votes
+
def updateReferences(self):
self.__updateReferences(self.cluster_ptr)
def __updateReferences(self, level):
@@ -1126,21 +1145,25 @@
return True
def check_two_node(self):
- if self.getLockType() == DLM_TYPE and self.quorumd_ptr is None:
- clusternodes_count = len(self.clusternodes_ptr.getChildren())
+ if self.getLockType() == DLM_TYPE:
+ clusternodes_count = len(self.getNodes())
#Make certain that there is a cman tag in the file
#If missing, it will not hurt to add it here
if self.CMAN_ptr is None:
cman = Cman()
self.cluster_ptr.addChild(cman)
self.CMAN_ptr = cman
- if clusternodes_count == 2:
- self.CMAN_ptr.addAttribute('two_node', '1')
- self.CMAN_ptr.addAttribute('expected_votes', '1')
- else:
- if self.CMAN_ptr.getAttribute('expected_votes') in ('0', '1'):
+
+ if not self.quorumd_ptr:
+ if clusternodes_count == 2:
+ self.CMAN_ptr.addAttribute('two_node', '1')
+ self.CMAN_ptr.addAttribute('expected_votes', '1')
+ else:
+ self.CMAN_ptr.removeAttribute('two_node')
self.CMAN_ptr.removeAttribute('expected_votes')
+ else:
self.CMAN_ptr.removeAttribute('two_node')
+ self.CMAN_ptr.addAttribute('expected_votes', str(self.get_expected_votes()))
def dual_power_fence_check(self):
# if 2 or more power controllers reside in the same fence level,
--- conga/luci/site/luci/Extensions/ClusterModel/QuorumD.py 2008/03/25 01:27:13 1.2.2.2
+++ conga/luci/site/luci/Extensions/ClusterModel/QuorumD.py 2009/02/17 20:49:02 1.2.2.3
@@ -1,4 +1,4 @@
-# Copyright (C) 2006-2008 Red Hat, Inc.
+# Copyright (C) 2006-2009 Red Hat, Inc.
#
# This program is free software; you can redistribute
# it and/or modify it under the terms of version 2 of the
@@ -13,3 +13,12 @@
def __init__(self):
TagObject.__init__(self)
self.TAG_NAME = TAG_NAME
+
+ def getVotes(self):
+ try:
+ num_votes = self.getAttribute('votes')
+ if num_votes is not None:
+ return int(num_votes)
+ except:
+ pass
+ return 0
Binary files /cvs/cluster/conga/luci/site/luci/var/Data.fs 2008/12/10 21:02:01 1.20.2.27 and /cvs/cluster/conga/luci/site/luci/var/Data.fs 2009/02/17 20:49:02 1.20.2.28 differ
rcsdiff: /cvs/cluster/conga/luci/site/luci/var/Data.fs: diff failed
next reply other threads:[~2009-02-17 20:49 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-02-17 20:49 rmccabe [this message]
-- strict thread matches above, loose matches on Subject: below --
2008-02-08 21:48 [Cluster-devel] conga/luci cluster/cluster_config-macros clust rmccabe
2008-01-02 17:36 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=20090217204931.29866.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.