From mboxrd@z Thu Jan 1 00:00:00 1970 From: rmccabe@sourceware.org Date: 17 Feb 2009 20:49:31 -0000 Subject: [Cluster-devel] conga/luci cluster/cluster_config-macros clust ... Message-ID: <20090217204931.29866.qmail@sourceware.org> List-Id: To: cluster-devel.redhat.com MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit 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" /> + + + + Skip nodes with undefined fencing + + + + + + Run XVM fence daemon --- 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 @@ + + + + + + + + @@ -325,6 +333,8 @@ + +
@@ -347,6 +357,8 @@ + +
@@ -1084,6 +1096,175 @@ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Fence TypeLPAR
Name + +
Hostname + +
Login + +
Password + +
+ Password Script (optional) + + +
+ + + + + + + + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Fence TypeVMWare
Name + +
Hostname + +
Login + +
Password + +
+ Password Script (optional) + + +
VMware ESX Management Login + +
VMware ESX Management Password + +
+ VMware ESX Management Password Script (optional) + + +
+ + + + + + + + +
+
+
@@ -1491,6 +1672,8 @@ + +
@@ -1507,6 +1690,8 @@ + +
@@ -1609,6 +1794,101 @@
+
+
+ + + + + + + +
Partition + +
+
+ + + + + + +
+
+ + + + + + + +
+
+ +
+
+ + + + + + + + + + + + +
Port + +
+ Use SSH + + + +
+
+ + + + + + +
+
+ + + + + + +
+
+
+ + @@ -2117,6 +2401,16 @@ metal:use-macro="here/fence-macros/macros/fence-instance-form-egenera" /> + + + + + + + + --- 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