[luci] Removed repeated usage of accessor of cluster ver.
by Jan Pokorný
commit add3737ed799bbca61e14f5cb6721c344ec1e559
Author: Jan Pokorny <jpokorny(a)redhat.com>
Date: Thu Aug 5 19:32:29 2010 +0200
Removed repeated usage of accessor of cluster ver.
luci/templates/fence_devices.html | 45 +++++++++++++++++++------------------
luci/templates/resource_list.html | 7 +++--
2 files changed, 27 insertions(+), 25 deletions(-)
---
diff --git a/luci/templates/fence_devices.html b/luci/templates/fence_devices.html
index e32a68d..4c6a4cd 100644
--- a/luci/templates/fence_devices.html
+++ b/luci/templates/fence_devices.html
@@ -2759,39 +2759,40 @@ ${fence_unknown(None,0)}
</py:if>
<py:if test="not model">
<select name="select_div"
- onchange="swap_fence_form(this.options[this.selectedIndex].value, '${cont_id}');this.selectedIndex=0">
+ onchange="swap_fence_form(this.options[this.selectedIndex].value, '${cont_id}');this.selectedIndex=0"
+ py:with="cluster_version = tmpl_context.cluster.get_version()" >
<option>-- Select a fence device --</option>
<option name="fence_apc" value="fence_apc">APC Power Switch</option>
<option name="fence_apc_snmp" value="fence_apc_snmp">APC Power Switch (SNMP interface)</option>
- <option py:if="tmpl_context.cluster.get_version() == 2" name="fence_brocade" value="fence_brocade">Brocade Fabric Switch</option>
- <option py:if="tmpl_context.cluster.get_version() == 2" name="fence_bullpap" value="fence_bullpap">Bull PAP</option>
+ <option py:if="cluster_version == 2" name="fence_brocade" value="fence_brocade">Brocade Fabric Switch</option>
+ <option py:if="cluster_version == 2" name="fence_bullpap" value="fence_bullpap">Bull PAP</option>
<option name="fence_cisco_mds" value="fence_cisco_mds">Cisco MDS</option>
- <option py:if="tmpl_context.cluster.get_version() == 2" name="fence_drac" value="fence_drac">Dell DRAC</option>
- <option py:if="tmpl_context.cluster.get_version() == 3" name="fence_drac" value="fence_drac">Dell DRAC (Deprecated)</option>
+ <option py:if="cluster_version == 2" name="fence_drac" value="fence_drac">Dell DRAC</option>
+ <option py:if="cluster_version == 3" name="fence_drac" value="fence_drac">Dell DRAC (Deprecated)</option>
<option name="fence_drac5" value="fence_drac5">Dell DRAC 5</option> <!-- needs work -->
<option name="fence_egenera" value="fence_egenera">Egenera SAN Controller</option>
<option name="fence_eps" value="fence_eps">ePowerSwitch</option>
- <py:choose test="tmpl_context.cluster.get_version()">
+ <py:choose test="cluster_version">
<py:when test="3">
<option name="fence_virt" value="fence_virt">Fence virt (Tech Preview)</option>
<option name="fence_xvm" value="fence_xvm">Fence virt (Multicast Mode)</option>
</py:when>
</py:choose>
- <option py:if="tmpl_context.cluster.get_version() == 2" name="fence_xvm" value="fence_xvm">Fence xvm</option>
+ <option py:if="cluster_version == 2" name="fence_xvm" value="fence_xvm">Fence xvm</option>
<option name="fence_rsb" value="fence_rsb">Fujitsu Siemens RemoteView Service Board</option>
<option name="fence_ilo" value="fence_ilo">HP iLO Device</option>
<option name="fence_ilo_mp" value="fence_ilo_mp">HP iLO MP</option> <!-- needs work -->
<option name="fence_bladecenter" value="fence_bladecenter">IBM BladeCenter</option>
- <option py:if="tmpl_context.cluster.get_version() == 3" name="fence_ibmblade" value="fence_ibmblade">IBM BladeCenter SNMP</option>
+ <option py:if="cluster_version == 3" name="fence_ibmblade" value="fence_ibmblade">IBM BladeCenter SNMP</option>
- <option py:if="tmpl_context.cluster.get_version() == 2" name="fence_rsa" value="fence_rsa">IBM RSA II Device</option> <!-- needs work -->
- <option py:if="tmpl_context.cluster.get_version() == 3" name="fence_rsa" value="fence_rsa">IBM RSA II Device (Deprecated)</option> <!-- needs work -->
+ <option py:if="cluster_version == 2" name="fence_rsa" value="fence_rsa">IBM RSA II Device</option> <!-- needs work -->
+ <option py:if="cluster_version == 3" name="fence_rsa" value="fence_rsa">IBM RSA II Device (Deprecated)</option> <!-- needs work -->
- <py:if test="tmpl_context.cluster.get_version() == 3">
+ <py:if test="cluster_version == 3">
<!-- <option name="fence_cpint" value="fence_cpint">IBM S/390 cpint</option> -->
<!-- <option name="fence_zvm" value="fence_zvm">IBM S/390 z/VM</option> -->
<option name="fence_ifmib" value="fence_ifmib">IF MIB</option>
@@ -2799,27 +2800,27 @@ ${fence_unknown(None,0)}
</py:if>
<option name="fence_ipmilan" value="fence_ipmilan">IPMI Lan</option>
- <option py:if="tmpl_context.cluster.get_version() == 2" name="fence_brocade" value="fence_brocade">Brocade Fabric Switch</option>
- <option py:if="tmpl_context.cluster.get_version() == 2" name="fence_lpar" value="fence_lpar">LPAR Fencing</option>
- <option py:if="tmpl_context.cluster.get_version() == 2" name="fence_mcdata" value="fence_mcdata">McData SAN Switch</option>
+ <option py:if="cluster_version == 2" name="fence_brocade" value="fence_brocade">Brocade Fabric Switch</option>
+ <option py:if="cluster_version == 2" name="fence_lpar" value="fence_lpar">LPAR Fencing</option>
+ <option py:if="cluster_version == 2" name="fence_mcdata" value="fence_mcdata">McData SAN Switch</option>
- <option py:if="tmpl_context.cluster.get_version() == 2" name="fence_sanbox2" value="fence_sanbox2">QLogic SANbox2</option>
- <option py:if="tmpl_context.cluster.get_version() == 3" name="fence_sanbox2" value="fence_sanbox2">QLogic SANbox2 (Deprecated)</option>
+ <option py:if="cluster_version == 2" name="fence_sanbox2" value="fence_sanbox2">QLogic SANbox2</option>
+ <option py:if="cluster_version == 3" name="fence_sanbox2" value="fence_sanbox2">QLogic SANbox2 (Deprecated)</option>
- <!-- <option py:if="tmpl_context.cluster.get_version() == 3" name="fence_rackswitch" value="fence_rackswitch">RackSaver RackSwitch</option> -->
- <option py:if="tmpl_context.cluster.get_version() == 2" name="fence_rps10" value="fence_rps10">RPS10 Serial Switch</option> -->
+ <!-- <option py:if="cluster_version == 3" name="fence_rackswitch" value="fence_rackswitch">RackSaver RackSwitch</option> -->
+ <option py:if="cluster_version == 2" name="fence_rps10" value="fence_rps10">RPS10 Serial Switch</option> -->
<option name="fence_scsi" value="fence_scsi">SCSI Reservation Fencing</option>
- <py:if test="tmpl_context.cluster.get_version() == 3">
+ <py:if test="cluster_version == 3">
<!-- <option name="fence_alom" value="fence_alom">Sun ALOM</option> -->
<!-- <option name="fence_ldom" value="fence_ldom">Sun LDOM</option> -->
</py:if>
- <option py:if="tmpl_context.cluster.get_version() == 2" name="fence_vixel" value="fence_vixel">Vixel SAN Switch</option>
- <option py:if="tmpl_context.cluster.get_version() == 2" name="fence_vmware" value="fence_vmware">VMware Fencing (Tech Preview)</option>
+ <option py:if="cluster_version == 2" name="fence_vixel" value="fence_vixel">Vixel SAN Switch</option>
+ <option py:if="cluster_version == 2" name="fence_vmware" value="fence_vmware">VMware Fencing (Tech Preview)</option>
<option name="fence_wti" value="fence_wti">WTI Power Switch</option>
- <py:if test="tmpl_context.cluster.get_version() == 3">
+ <py:if test="cluster_version == 3">
<!-- <option name="fence_xcat" value="fence_xcat">xCAT</option> -->
<!-- <option name="fence_zvm" value="fence_zvm">s390 z/VM</option> -->
</py:if>
diff --git a/luci/templates/resource_list.html b/luci/templates/resource_list.html
index 552a79a..7263ea0 100644
--- a/luci/templates/resource_list.html
+++ b/luci/templates/resource_list.html
@@ -147,7 +147,8 @@
</div>
<div py:def="clusterfs_resource(res, form_id, parent_id, isref)" name="CLUSTERFS" id="clusterfs_resource" class="row rescfg"
- py:with="global_resource = res and isref != 0"
+ py:with="global_resource = res and isref != 0;
+ cluster_version = tmpl_context.cluster.get_version()"
py:attrs="res and {'id': 'global_res_%s' % res.getName(), 'name': res.getName()}">
<input name="global" type="hidden" value="1" py:if="global_resource"/>
<input name="parent_id" type="hidden" value="${parent_id}"/>
@@ -156,7 +157,7 @@
py:attrs="res and {'value':res.getAttribute('name')} or {}" />
<input name="type" type="hidden" value="clusterfs" />
- <py:choose test="tmpl_context.cluster.get_version()">
+ <py:choose test="cluster_version">
<py:when test="2">
<h3>GFS/GFS2</h3>
</py:when>
@@ -192,7 +193,7 @@
<td>
<select name="fstype" class="serviceformselect"
py:attrs="{'disabled':global_resource and 'disabled' or None}">
- <py:choose test="tmpl_context.cluster.get_version()">
+ <py:choose test="cluster_version">
<py:when test="3">
<option value="gfs2"
py:attrs="res and res.getAttribute('fstype') == 'gfs2' and {'selected':'selected'} or {}">GFS2</option>
13 years, 9 months
[luci] Fix: validate_fence.py: condition for val.strip()
by Jan Pokorný
commit 95ee6eba2c5aee436b271f785b39b756bd2647c7
Author: Jan Pokorny <jpokorny(a)redhat.com>
Date: Wed Aug 4 15:45:59 2010 +0200
Fix: validate_fence.py: condition for val.strip()
luci/widget_validators/validate_fence.py | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
---
diff --git a/luci/widget_validators/validate_fence.py b/luci/widget_validators/validate_fence.py
index 790a052..ebf24d7 100644
--- a/luci/widget_validators/validate_fence.py
+++ b/luci/widget_validators/validate_fence.py
@@ -75,7 +75,7 @@ def config_fence_attr(params, fence, fname, **kw):
try:
# passwords may begin and/or end with blank characters
- if not val in ['passwd', 'vmpasswd', 'snmp_priv_passwd']:
+ if not attr_name in ['passwd', 'vmpasswd', 'snmp_priv_passwd']:
val = val.strip()
if not val:
val = None
13 years, 9 months
[luci] Add labels (per Lon's suggestion) to the resource forms so it's clear what you're doing when constru
by Ryan McCabe
commit 308119c16fe1db3eeae1479780c7b92ac1df99c5
Author: Ryan McCabe <rmccabe(a)redhat.com>
Date: Tue Aug 3 18:35:30 2010 -0400
Add labels (per Lon's suggestion) to the resource forms so it's clear what you're doing when constructing/editing a service
luci/templates/resource_list.html | 30 ++++++++++++++++++++++++++++++
1 files changed, 30 insertions(+), 0 deletions(-)
---
diff --git a/luci/templates/resource_list.html b/luci/templates/resource_list.html
index 3937400..552a79a 100644
--- a/luci/templates/resource_list.html
+++ b/luci/templates/resource_list.html
@@ -13,6 +13,7 @@
py:attrs="res and {'value':res.getAttribute('address')} or {}" />
<input name="type" type="hidden" value="ip" />
+ <h3>IP Address</h3>
<table class="formtable">
<tr>
<td>IP address</td>
@@ -56,6 +57,7 @@
py:attrs="res and {'value':res.getAttribute('name')} or {}" />
<input name="type" type="hidden" value="fs" />
+ <h3>Filesystem</h3>
<table class="formtable">
<tr>
<td>Name</td>
@@ -154,6 +156,15 @@
py:attrs="res and {'value':res.getAttribute('name')} or {}" />
<input name="type" type="hidden" value="clusterfs" />
+ <py:choose test="tmpl_context.cluster.get_version()">
+ <py:when test="2">
+ <h3>GFS/GFS2</h3>
+ </py:when>
+ <py:otherwise>
+ <h3>GFS2</h3>
+ </py:otherwise>
+ </py:choose>
+
<table class="formtable">
<tr>
<td>Name</td>
@@ -237,6 +248,7 @@
py:attrs="res and {'value':res.getAttribute('name')} or {}" />
<input name="type" type="hidden" value="netfs" />
+ <h3>NFS/CIFS Mount</h3>
<table class="formtable">
<tr>
<td>Name</td>
@@ -315,6 +327,7 @@
py:attrs="res and {'value':res.getAttribute('name')} or {}" />
<input name="type" type="hidden" value="nfsexport" />
+ <h3>NFS v3 Export</h3>
<table class="formtable">
<tr>
<td>Name</td>
@@ -336,6 +349,7 @@
py:attrs="res and {'value':res.getAttribute('name')} or {}" />
<input name="type" type="hidden" value="nfsserver" />
+ <h3>NFS Server</h3>
<table class="formtable">
<tr>
<td>Name</td>
@@ -364,6 +378,7 @@
py:attrs="res and {'value':res.getAttribute('name')} or {}" />
<input name="type" type="hidden" value="nfsclient" />
+ <h3>NFS Client</h3>
<table class="formtable">
<tr>
<td>Name</td>
@@ -406,6 +421,7 @@
py:attrs="res and {'value':res.getAttribute('name')} or {}" />
<input name="type" type="hidden" value="smb" />
+ <h3>Samba Server</h3>
<table class="formtable">
<tr>
<td>Name</td>
@@ -462,6 +478,7 @@
py:attrs="res and {'value':res.getAttribute('name')} or {}" />
<input name="type" type="hidden" value="script" />
+ <h3>Script</h3>
<table class="formtable">
<tr>
<td>Name</td>
@@ -490,6 +507,7 @@
py:attrs="res and {'value':res.getAttribute('name')} or {}" />
<input name="type" type="hidden" value="apache" />
+ <h3>Apache</h3>
<table class="formtable">
<tr>
<td>Name</td>
@@ -542,6 +560,7 @@
py:attrs="res and {'value':res.getAttribute('name')} or {}" />
<input name="type" type="hidden" value="mysql" />
+ <h3>MySQL</h3>
<table class="formtable">
<tr>
<td>Name</td>
@@ -599,6 +618,7 @@
py:attrs="res and {'value':res.getAttribute('name')} or {}" />
<input name="type" type="hidden" value="lvm" />
+ <h3>HA LVM</h3>
<table class="formtable">
<tr>
<td>Name</td>
@@ -641,6 +661,7 @@
py:attrs="res and {'value':res.getAttribute('name')} or {}" />
<input name="type" type="hidden" value="openldap" />
+ <h3>Open LDAP</h3>
<table class="formtable">
<tr>
<td>Name</td>
@@ -692,6 +713,7 @@
py:attrs="res and {'value':res.getAttribute('name')} or {}" />
<input name="type" type="hidden" value="postgres-8" />
+ <h3>PostgreSQL 8</h3>
<table class="formtable">
<tr>
<td>Name</td>
@@ -743,6 +765,7 @@
py:attrs="res and {'value':res.getAttribute('name')} or {}" />
<input name="type" type="hidden" value="tomcat-5" />
+ <h3>Tomcat 5</h3>
<table class="formtable">
<tr>
<td>Name</td>
@@ -802,6 +825,7 @@
py:attrs="res and {'value':res.getAttribute('name')} or {}" />
<input name="type" type="hidden" value="tomcat-6" />
+ <h3>Tomcat 6</h3>
<table class="formtable">
<tr>
<td>Name</td>
@@ -848,6 +872,7 @@
py:attrs="res and {'value':res.getAttribute('InstanceName')} or {}" />
<input name="type" type="hidden" value="SAPInstance" />
+ <h3>SAP Instance</h3>
<table class="formtable">
<tr>
<td>SAP instance name</td>
@@ -948,6 +973,7 @@
py:attrs="res and {'value':res.getAttribute('SID')} or {}" />
<input name="type" type="hidden" value="SAPDatabase" />
+ <h3>SAP Database</h3>
<table class="formtable">
<tr>
<td>SAP Database name</td>
@@ -1094,6 +1120,7 @@
py:attrs="res and {'value':res.getAttribute('name')} or {}" />
<input name="type" type="hidden" value="ASEHAagent" />
+ <h3>Sybase ASE Failover Instance</h3>
<table class="formtable">
<tr>
<td>Instance Name</td>
@@ -1195,6 +1222,7 @@
py:attrs="res and {'value':res.getAttribute('name')} or {}" />
<input name="type" type="hidden" value="oracledb" />
+ <h3>Oracle 10g/11g Failover Instance</h3>
<table class="formtable">
<tr>
<td>Instance name (SID) of Oracle instance</td>
@@ -1260,6 +1288,7 @@
py:attrs="res and {'value':res.getAttribute('name')} or {}" />
<input name="type" type="hidden" value="named" />
+ <h3>Named</h3>
<table class="formtable">
<tr>
<td>Name</td>
@@ -1311,6 +1340,7 @@
py:attrs="res and {'value':res.getAttribute('name')} or {}" />
<input name="type" type="hidden" value="drbd" />
+ <h3>DRBD</h3>
<table class="formtable">
<tr>
<td>Name</td>
13 years, 9 months
[luci] Fix netmask field inside of IP resources in services
by Ryan McCabe
commit b2c85e7499cc16236103038d52ede12dcf1fe00f
Author: Ryan McCabe <rmccabe(a)redhat.com>
Date: Tue Aug 3 18:17:23 2010 -0400
Fix netmask field inside of IP resources in services
luci/widget_validators/validate_resource.py | 7 ++++++-
1 files changed, 6 insertions(+), 1 deletions(-)
---
diff --git a/luci/widget_validators/validate_resource.py b/luci/widget_validators/validate_resource.py
index 8234159..1870f4c 100644
--- a/luci/widget_validators/validate_resource.py
+++ b/luci/widget_validators/validate_resource.py
@@ -536,7 +536,12 @@ def validate_clusvc_form(model, **kw):
try:
if res_type == 'ip':
- dummy_form['resourcename'] = dummy_form['address']
+ mask = dummy_form.get('address_mask')
+ if mask:
+ dummy_form['resourcename'] = '%s/%s' % (dummy_form['address_nominal'], dummy_form['address_mask'])
+ else:
+ dummy_form['resourcename'] = dummy_form['address_nominal']
+ dummy_form['address'] = dummy_form['resourcename']
except:
log.exception('no ipaddr')
return (False, { 'errors': [ 'No IP address was given' ]})
13 years, 9 months
[luci] Removed extra logging from luci speedup code.
by Chris Feist
commit 060c7109cfee0f43db5b05d3bcdae867539ece38
Author: Chris Feist <cfeist(a)redhat.com>
Date: Mon Aug 2 16:59:07 2010 -0500
Removed extra logging from luci speedup code.
luci/controllers/cluster.py | 2 --
1 files changed, 0 insertions(+), 2 deletions(-)
---
diff --git a/luci/controllers/cluster.py b/luci/controllers/cluster.py
index a3a90ec..62adfa2 100644
--- a/luci/controllers/cluster.py
+++ b/luci/controllers/cluster.py
@@ -83,7 +83,6 @@ class IndividualClusterController(BaseController):
identity = request.environ.get('repoze.who.identity')
self.username = identity['repoze.who.userid']
- log.debug("Creating %s" % repr(self))
tmpl_context.show_sidebar = True
tmpl_context.cluster_name = self.name
tmpl_context.cluster_url = '/cluster/%s/' % self.name
@@ -105,7 +104,6 @@ class IndividualClusterController(BaseController):
def get_model(self):
if not self.model:
- log.debug("Obtaining cluster model for %s" % repr(self))
self.model = get_model_for_cluster(self.name, self.get_agent())
return self.model
13 years, 9 months
[luci: 101/101] Fix rhbz#618578 - netmask field for ip resource
by Jan Pokorný
commit be5bc438392f460820183cc937679e54f160fa12
Author: Jan Pokorny <jpokorny(a)redhat.com>
Date: Tue Aug 3 22:48:04 2010 +0200
Fix rhbz#618578 - netmask field for ip resource
luci/controllers/cluster.py | 31 +++++++++++++++++++-------
luci/templates/resource_list.html | 16 ++++++++++---
luci/widget_validators/validate_resource.py | 2 +-
3 files changed, 35 insertions(+), 14 deletions(-)
---
diff --git a/luci/controllers/cluster.py b/luci/controllers/cluster.py
index 13c8a2d..a3a90ec 100644
--- a/luci/controllers/cluster.py
+++ b/luci/controllers/cluster.py
@@ -12,7 +12,7 @@
from tg import request, expose, redirect, flash, app_globals, tmpl_context
# third party imports
-from repoze.what.predicates import not_anonymous
+from repoze.what.predicates import not_anonymous
from pylons.i18n import ugettext as _
# project specific imports
@@ -166,7 +166,7 @@ class IndividualClusterController(BaseController):
if kw.get("moveup_method"):
node = self.model.retrieveNodeByName(kw.get("node"))
methodname = kw.get("moveup_method")
- levels = node.getFenceLevels()
+ levels = node.getFenceLevels()
for level in levels:
if level.getAttribute("name") == methodname:
position = levels.index(level)
@@ -180,7 +180,7 @@ class IndividualClusterController(BaseController):
if kw.get("movedown_method"):
node = self.model.retrieveNodeByName(kw.get("node"))
methodname = kw.get("movedown_method")
- levels = node.getFenceLevels()
+ levels = node.getFenceLevels()
for level in levels:
if level.getAttribute("name") == methodname:
position = levels.index(level)
@@ -302,8 +302,8 @@ class IndividualClusterController(BaseController):
base_url = '/cluster/%s/resources' % self.name
resources_cmd = '/cluster/%s/resources_cmd' % self.name
- if (len(args) == 1):
- resourcename = args[0]
+ if (len(args) >= 1):
+ resourcename = '/'.join(args)
else:
resourcename = None
return dict(page='nodes', name=resourcename, base_url=base_url, resources_cmd=resources_cmd)
@@ -346,7 +346,7 @@ class IndividualClusterController(BaseController):
pass
if len(errors) != 0:
flash(_('%s') % ', '.join(errors), status='error')
- else:
+ else:
log.info('User "%s" deleted resource "%s" in cluster "%s"'
% (self.username, ', '.join(cur_list), self.name))
flash(_("Deleting resources %s") % ', '.join(cur_list),
@@ -359,15 +359,28 @@ class IndividualClusterController(BaseController):
cur_action = _('Created')
else:
cur_action = _('Edited')
+ res_type = kw.get('type', '')
+ if res_type == 'ip':
+ # The whole address parameter has to be constructed
+ # from its parts ('address_nominal', 'address_mask') first.
+ address = kw.get('address_nominal', '').strip()
+ if len(kw.get('address_mask', '')) > 0:
+ mask = kw.get('address_mask', '').strip()
+ if not mask.startswith('/'):
+ address += '/'
+ address += mask
+ kw['address'] = address
+ kw.pop('address_nominal', None)
+ kw.pop('address_mask', None)
vret = validate_resource_form(self.model, **kw)
if vret[0] is True:
- res_name = kw.get('resourcename')
# For IP resources there is no name, just an IP Address
# and to make IP addresses work you need to add a .html
- if res_name == None and kw.get('address'):
- res_name = kw.get('address')
+ if res_type == 'ip':
+ res_name = kw['address']
redir_fmt = '%s/%s.html'
else:
+ res_name = kw.get('resourcename')
redir_fmt = '%s/%s'
log.info('User "%s" %s global resource "%s" in cluster "%s"'
% (self.username, cur_action, res_name, self.name))
diff --git a/luci/templates/resource_list.html b/luci/templates/resource_list.html
index 6ba06e5..3937400 100644
--- a/luci/templates/resource_list.html
+++ b/luci/templates/resource_list.html
@@ -3,21 +3,29 @@
py:strip="">
<div py:def="ip_resource(res, form_id, parent_id, isref)" name="IP" id="ip_resource" class="row rescfg"
- py:with="global_resource = res and isref != 0"
+ py:with="global_resource = res and isref != 0;
+ ip_address = res and res.getAttribute('address').split('/') or []"
py:attrs="res and {'id': 'global_res_%s' % res.getName(), 'name': res.getName()}">
<input name="global" type="hidden" value="1" py:if="global_resource"/>
<input name="parent_id" type="hidden" value="${parent_id}"/>
<input name="form_id" type="hidden" value="${form_id}"/>
<input name="oldname" type="hidden"
- py:attrs="res and {'value':res.getAttribute('name')} or {}" />
+ py:attrs="res and {'value':res.getAttribute('address')} or {}" />
<input name="type" type="hidden" value="ip" />
<table class="formtable">
<tr>
<td>IP address</td>
<td>
- <input name="address" type="text" class="text"
- py:attrs="res and {'value': res.getAttribute('address'), 'disabled':global_resource and 'disabled' or None} or {}" />
+ <input name="address_nominal" type="text" class="text"
+ py:attrs="ip_address and {'value': ip_address[0], 'disabled':global_resource and 'disabled' or None} or {}" />
+ </td>
+ </tr>
+ <tr>
+ <td>Netmask bits (optional)</td>
+ <td>
+ <input name="address_mask" type="text" class="text"
+ py:attrs="len(ip_address) > 1 and {'value': ip_address[1], 'disabled':global_resource and 'disabled' or None} or {}" />
</td>
</tr>
<tr>
diff --git a/luci/widget_validators/validate_resource.py b/luci/widget_validators/validate_resource.py
index c5ef6be..8234159 100644
--- a/luci/widget_validators/validate_resource.py
+++ b/luci/widget_validators/validate_resource.py
@@ -443,7 +443,7 @@ def create_resource(res_type, model, **kw):
res = resource_table[res_type][1]()
if res_type == 'ip':
- rname = kw['address'].strip()
+ rname = kw['address']
elif res_type == 'vm':
rname = ''
else:
13 years, 9 months
[luci: 100/101] .gitignore: luci.egg-info directory added
by Jan Pokorný
commit e9700891ea25080bc71d3bc1abdf6739c042f505
Author: Jan Pokorny <jpokorny(a)redhat.com>
Date: Tue Aug 3 18:37:20 2010 +0200
.gitignore: luci.egg-info directory added
.gitignore | 1 +
1 files changed, 1 insertions(+), 0 deletions(-)
---
diff --git a/.gitignore b/.gitignore
index 40184f5..35439bf 100644
--- a/.gitignore
+++ b/.gitignore
@@ -6,6 +6,7 @@
build
dist
data
+luci.egg-info
# Specific files
devdata.db
13 years, 9 months
[luci: 99/101] Fix rhbz#614130 - tomcat6 resource agent for RHEL6
by Jan Pokorný
commit bf7737a64052eefc6295b5a822ddd56a1975fa9c
Author: Jan Pokorny <jpokorny(a)redhat.com>
Date: Tue Aug 3 18:31:37 2010 +0200
Fix rhbz#614130 - tomcat6 resource agent for RHEL6
luci/lib/ClusterConf/ModelBuilder.py | 4 +-
luci/lib/ClusterConf/Tomcat6.py | 18 ++++++++
luci/templates/resource_list.html | 59 ++++++++++++++++++++++++--
luci/widget_validators/validate_resource.py | 12 +++++
4 files changed, 87 insertions(+), 6 deletions(-)
---
diff --git a/luci/lib/ClusterConf/ModelBuilder.py b/luci/lib/ClusterConf/ModelBuilder.py
index 84daf20..e7cdbb6 100644
--- a/luci/lib/ClusterConf/ModelBuilder.py
+++ b/luci/lib/ClusterConf/ModelBuilder.py
@@ -34,9 +34,10 @@ from MySQL import MySQL
from OpenLDAP import OpenLDAP
from Postgres8 import Postgres8
from Tomcat5 import Tomcat5
+from Tomcat6 import Tomcat6
from SAPDatabase import SAPDatabase
from SAPInstance import SAPInstance
-from SybaseASE import SybaseASE
+from SybaseASE import SybaseASE
from OracleDB import OracleDB
from Multicast import Multicast
from FenceDaemon import FenceDaemon
@@ -89,6 +90,7 @@ TAGNAMES = { 'cluster': Cluster,
'openldap': OpenLDAP,
'postgres-8': Postgres8,
'tomcat-5': Tomcat5,
+ 'tomcat-6': Tomcat6,
'fence_daemon': FenceDaemon,
'multicast': Multicast,
'clusterfs': Clusterfs,
diff --git a/luci/lib/ClusterConf/Tomcat6.py b/luci/lib/ClusterConf/Tomcat6.py
new file mode 100644
index 0000000..189759c
--- /dev/null
+++ b/luci/lib/ClusterConf/Tomcat6.py
@@ -0,0 +1,18 @@
+# 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
+# GNU General Public License as published by the
+# Free Software Foundation.
+
+from BaseResource import BaseResource
+from gettext import gettext as _
+
+TAG_NAME = 'tomcat-6'
+RESOURCE_TYPE = _('Tomcat 6 Server')
+
+class Tomcat6(BaseResource):
+ def __init__(self):
+ BaseResource.__init__(self)
+ self.TAG_NAME = TAG_NAME
+ self.resource_type = RESOURCE_TYPE
diff --git a/luci/templates/resource_list.html b/luci/templates/resource_list.html
index 75da32c..6ba06e5 100644
--- a/luci/templates/resource_list.html
+++ b/luci/templates/resource_list.html
@@ -784,6 +784,52 @@
</table>
</div>
+<div py:def="tomcat6_resource(res, form_id, parent_id, isref)" name="TOMCAT-6" id="tomcat6_resource" class="row rescfg"
+ py:with="global_resource = res and isref != 0"
+ py:attrs="res and {'id': 'global_res_%s' % res.getName(), 'name': res.getName()}">
+ <input name="global" type="hidden" value="1" py:if="global_resource"/>
+ <input name="parent_id" type="hidden" value="${parent_id}"/>
+ <input name="form_id" type="hidden" value="${form_id}"/>
+ <input name="oldname" type="hidden"
+ py:attrs="res and {'value':res.getAttribute('name')} or {}" />
+ <input name="type" type="hidden" value="tomcat-6" />
+
+ <table class="formtable">
+ <tr>
+ <td>Name</td>
+ <td>
+ <input type="text" class="text" name="resourcename"
+ py:attrs="res and {'value':res.getAttribute('name'), 'disabled':global_resource and 'disabled' or None} or {}" />
+ </td>
+ </tr>
+ <tr>
+ <td>Config file</td>
+ <td>
+ <input type="text" class="text" name="config_file"
+ value="/etc/tomcat6/tomcat6.conf"
+ py:attrs="res and {'value':res.getAttribute('config_file'), 'disabled':global_resource and 'disabled' or None} or {}" />
+ </td>
+ </tr>
+ <!--! XXX: really not supported?
+ <tr>
+ <td>Tomcat user</td>
+ <td>
+ <input type="text" class="text" name="tomcat_user"
+ value="tomcat"
+ py:attrs="res and {'value':res.getAttribute('tomcat_user'), 'disabled':global_resource and 'disabled' or None} or {}" />
+ </td>
+ </tr>
+ -->
+ <tr>
+ <td>Shutdown wait (seconds)</td>
+ <td>
+ <input type="text" class="text" name="shutdown_wait" value="30"
+ py:attrs="res and {'value':res.getAttribute('shutdown_wait'), 'disabled':global_resource and 'disabled' or None} or {}" />
+ </td>
+ </tr>
+ </table>
+</div>
+
<div py:def="SAPInstance_resource(res, form_id, parent_id, isref)" name="SAPInstance" id="SAPInstance_resource" class="row rescfg"
py:with="global_resource = res and isref != 0"
py:attrs="res and {'id': 'global_res_%s' % res.getName(), 'name': res.getName()}">
@@ -1373,6 +1419,7 @@ ${lvm_resource(None,None,None,0)}
${openldap_resource(None,None,None,0)}
${postgres8_resource(None,None,None,0)}
${tomcat5_resource(None,None,None,0)}
+${tomcat6_resource(None,None,None,0)}
${SAPInstance_resource(None,None,None,0)}
${SAPDatabase_resource(None,None,None,0)}
${ASEHAagent_resource(None,None,None,0)}
@@ -1396,7 +1443,8 @@ ${vm_resource(None,None,None,0)}
<select name="res_select" class="resource_selector"
py:with="
svc_onchange_fn = 'insert_resource(this.options[this.selectedIndex].value, \'%s\', this.form, \'%s\');this.selectedIndex=0' % (dest, parentid);
- res_onchange_fn = 'swap_resource_form(this.options[this.selectedIndex].value);this.selectedIndex=0'"
+ res_onchange_fn = 'swap_resource_form(this.options[this.selectedIndex].value);this.selectedIndex=0';
+ cluster_version = tmpl_context.cluster.get_version()"
py:attrs="{'onchange': model and svc_onchange_fn or res_onchange_fn, 'id': parentid and '%s_resource_selector' % parentid or 'resource_selector'}">
<py:if test="model" py:with="global_res = model.getResources()">
<py:if test="len(global_res) != 0">
@@ -1412,7 +1460,7 @@ ${vm_resource(None,None,None,0)}
<option>-- Select a resource type --</option>
<option name="apache_resource" value="apache_resource">Apache</option>
<option name="fs_resource" value="fs_resource">Filesystem</option>
- <py:choose test="tmpl_context.cluster.get_version()">
+ <py:choose test="cluster_version">
<py:when test="3">
<option name="clusterfs_resource" value="clusterfs_resource">GFS2</option>
</py:when>
@@ -1426,7 +1474,7 @@ ${vm_resource(None,None,None,0)}
<option name="netfs_resource" value="netfs_resource">NFS/CIFS Mount</option>
<option name="nfsclient_resource" value="nfsclient_resource">NFS Client</option>
<option name="nfsexport_resource" value="nfsexport_resource">NFS v3 Export</option>
- <option py:if="tmpl_context.cluster.get_version() not in (1, 2)" name="nfsserver_resource" value="nfsserver_resource">NFS Server</option>
+ <option py:if="cluster_version not in (1, 2)" name="nfsserver_resource" value="nfsserver_resource">NFS Server</option>
<option name="oracledb_resource" value="oracledb_resource">Oracle 10g/11g Failover Instance</option>
<option name="openldap_resource" value="openldap_resource">Open LDAP</option>
<option name="postgres8_resource" value="postgres8_resource">PostgreSQL 8</option>
@@ -1435,7 +1483,8 @@ ${vm_resource(None,None,None,0)}
<option name="smb_resource" value="smb_resource">Samba Server</option>
<option name="script_resource" value="script_resource">Script</option>
<option name="ASEHAagent_resource" value="ASEHAagent_resource">Sybase ASE Failover Instance</option>
- <option name="tomcat5_resource" value="tomcat5_resource">Tomcat</option>
+ <option py:if="cluster_version < 3" name="tomcat5_resource" value="tomcat5_resource">Tomcat 5</option>
+ <option py:if="cluster_version >= 3" name="tomcat6_resource" value="tomcat6_resource">Tomcat 6</option>
<option name="vm_resource" value="vm_resource" py:if="model">Virtual machine</option>
</select>
</div>
@@ -1570,7 +1619,7 @@ ${vm_resource(None,None,None,0)}
value="Add a child resource"
onclick="${'insert_resource_dialog(this.form, \'children_%s\', \'%s\')' % (cur_id_str, cur_id_str)}"/>
</div>
- </div>
+ </div>
</td>
</tr>
</tbody>
diff --git a/luci/widget_validators/validate_resource.py b/luci/widget_validators/validate_resource.py
index ea683a2..c5ef6be 100644
--- a/luci/widget_validators/validate_resource.py
+++ b/luci/widget_validators/validate_resource.py
@@ -15,6 +15,7 @@ from luci.lib.ClusterConf.NFSServer import NFSServer
from luci.lib.ClusterConf.Script import Script
from luci.lib.ClusterConf.Samba import Samba
from luci.lib.ClusterConf.Tomcat5 import Tomcat5
+from luci.lib.ClusterConf.Tomcat6 import Tomcat6
from luci.lib.ClusterConf.Postgres8 import Postgres8
from luci.lib.ClusterConf.Apache import Apache
from luci.lib.ClusterConf.OpenLDAP import OpenLDAP
@@ -271,6 +272,16 @@ def addTomcat5(res, rname, model, **kw):
errors = config_resource(params, res, rname, **kw)
return errors
+def addTomcat6(res, rname, model, **kw):
+ params = (
+ ('config_file', _('Path to configuration file'), False, None),
+ # XXX really not supported?
+ # ('tomcat_user', '', False, None),
+ ('shutdown_wait', '', False, None)
+ )
+ errors = config_resource(params, res, rname, **kw)
+ return errors
+
def addLVM(res, rname, model, **kw):
params = (
('vg_name', _('Volume group name'), True, None),
@@ -389,6 +400,7 @@ resource_table = {
'script': ( addScript, Script ),
'smb': ( addSamba, Samba ),
'tomcat-5': ( addTomcat5, Tomcat5 ),
+ 'tomcat-6': ( addTomcat6, Tomcat6 ),
'postgres-8': ( addPostgres8, Postgres8 ),
'apache': ( addApache, Apache ),
'openldap': ( addOpenLDAP, OpenLDAP ),
13 years, 9 months
[luci: 98/101] Fix handling of qdisk and of cman attributes "expected_votes" and "two_node"
by Jan Pokorný
commit d0fab117082f7081b5d9675fbddf0945fe0763a4
Author: Ryan McCabe <rmccabe(a)redhat.com>
Date: Tue Aug 3 02:15:02 2010 -0400
Fix handling of qdisk and of cman attributes "expected_votes" and "two_node"
luci/controllers/cluster.py | 6 ++++
luci/lib/ClusterConf/ModelBuilder.py | 30 ++++++++++++++++-------
luci/widget_validators/validate_cluster_prop.py | 13 ++++-----
3 files changed, 33 insertions(+), 16 deletions(-)
---
diff --git a/luci/controllers/cluster.py b/luci/controllers/cluster.py
index 5380502..13c8a2d 100644
--- a/luci/controllers/cluster.py
+++ b/luci/controllers/cluster.py
@@ -689,8 +689,14 @@ class IndividualClusterController(BaseController):
log.info('User "%s" updated the cluster properties for cluster "%s"'
% (self.username, self.name))
flash("Applying Settings")
+ msgs = vret[1].get('flash')
+ if msgs and len(msgs) > 0:
+ flash(', '.join(msgs), status="info")
self.model.setModified(True)
rh.update_cluster_conf(self.model)
+ if vret[1].get('start_qdisk'):
+ log.info('Starting qdiskd for cluster "%s"' % self.name)
+ rh.cluster_node_start(self.name, [])
else:
msgs = vret[1].get('errors')
if msgs and len(msgs) > 0:
diff --git a/luci/lib/ClusterConf/ModelBuilder.py b/luci/lib/ClusterConf/ModelBuilder.py
index 958dc79..84daf20 100644
--- a/luci/lib/ClusterConf/ModelBuilder.py
+++ b/luci/lib/ClusterConf/ModelBuilder.py
@@ -151,7 +151,6 @@ class ModelBuilder:
self.fence_daemon_ptr = None
self.isModified = False
self.quorumd_ptr = None
- self.usesQuorumd = False
self.fence_xvmd_ptr = None
self.unusual_items = list()
self.isVirtualized = False
@@ -231,7 +230,6 @@ class ModelBuilder:
self.fence_daemon_ptr = new_object
elif parent_node.nodeName == QUORUMD_PTR_STR:
self.quorumd_ptr = new_object
- self.usesQuorumd = True
elif parent_node.nodeName == GULM_TAG_STR:
self.GULM_ptr = new_object
self.lock_type = GULM_TYPE
@@ -776,8 +774,19 @@ class ModelBuilder:
def getMcastInterface(self):
return self.mcast_interface
+ def setQuorumd(self, qd):
+ cp = self.getClusterPtr()
+ cp.addChild(qd)
+ self.quorumd_ptr = qd
+
+ def delQuorumd(self):
+ cp = self.getClusterPtr()
+ if self.quorumd_ptr is not None:
+ cp.removeChild(self.quorumd_ptr)
+ self.quorumd_ptr = None
+
def isQuorumd(self):
- return self.usesQuorumd
+ return self.quorumd_ptr is not None
def getQuorumdPtr(self):
return self.quorumd_ptr
@@ -1188,7 +1197,10 @@ class ModelBuilder:
cur_votes = 1
node_votes += cur_votes
- return node_votes + qdisk_votes
+ if qdisk_votes != 0:
+ return node_votes + qdisk_votes
+ else:
+ return 2 * node_votes - 1
def updateReferences(self):
self.__updateReferences(self.cluster_ptr)
@@ -1199,9 +1211,9 @@ class ModelBuilder:
self.__updateReferences(t)
def perform_final_check(self):
+ self.check_two_node()
if self.check_gulm_count() is False:
return False
- self.check_two_node()
#add more checks
@@ -1224,16 +1236,16 @@ class ModelBuilder:
self.cluster_ptr.addChild(cman)
self.CMAN_ptr = cman
- if not self.isQuorumd():
+ if self.isQuorumd():
+ self.CMAN_ptr.removeAttribute('two_node')
+ self.CMAN_ptr.addAttribute('expected_votes', str(self.get_expected_votes()))
+ else:
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,
diff --git a/luci/widget_validators/validate_cluster_prop.py b/luci/widget_validators/validate_cluster_prop.py
index b35ccaa..eeb7de1 100644
--- a/luci/widget_validators/validate_cluster_prop.py
+++ b/luci/widget_validators/validate_cluster_prop.py
@@ -150,7 +150,6 @@ def validate_qdisk_prop_form(model, **kw):
errors = []
use_qdisk = None
- cp = model.getClusterPtr()
qdp = model.getQuorumdPtr()
quorumd = kw.get('quorumd')
@@ -164,7 +163,7 @@ def validate_qdisk_prop_form(model, **kw):
if use_qdisk is False:
if qdp is not None:
- cp.removeChild(qdp)
+ model.delQuorumd()
return (True, {'flash': [ _('The updated quorum disk settings will not take effect until the cluster is restarted') ] })
# No changes
return (False, {'errors': [ _('No changes were made to the quorum disk settings') ] })
@@ -270,12 +269,12 @@ def validate_qdisk_prop_form(model, **kw):
return (False, {'errors': errors })
ret = (len(errors) < 1, {'errors': errors})
- if qdp:
- cp.removeChild(qdp)
+ if qdp is not None:
+ model.delQuorumd()
else:
- ret[1]['flash'] = [ _('The updated quorum disk settings will not take effect until the cluster is restarted') ]
- cp.addChild(qd)
- return (len(errors) < 1, {'errors': errors})
+ ret[1]['start_qdisk'] = True
+ model.setQuorumd(qd)
+ return ret
def validate_add_existing(**kw):
errors = []
13 years, 9 months
[luci: 97/101] Finished up luci speedup patches
by Jan Pokorný
commit 64e279a93530e1ee5342113b337e59cec376243c
Author: Chris Feist <cfeist(a)redhat.com>
Date: Mon Aug 2 15:02:54 2010 -0500
Finished up luci speedup patches
luci/lib/db_helpers.py | 22 ++++++++++++++++++++++
luci/templates/mainmenu.html | 2 +-
2 files changed, 23 insertions(+), 1 deletions(-)
---
diff --git a/luci/lib/db_helpers.py b/luci/lib/db_helpers.py
index 6cc8bc2..bfd98ff 100644
--- a/luci/lib/db_helpers.py
+++ b/luci/lib/db_helpers.py
@@ -156,6 +156,28 @@ def get_cluster_list():
return db_obj
+def get_cluster_list_status(delegate=None):
+ cluster_list = {}
+
+ db_objs = get_cluster_list()
+ for i in db_objs:
+ cluster_name = i.name
+ # Delegate, if it exists, will be an instance of
+ # luci.controllers.cluster.IndividualClusterController
+ if delegate and delegate.name == cluster_name:
+ status = delegate.get_status()
+ else:
+ rc = get_agent_for_cluster(cluster_name)
+ if rc is None:
+ status = ClusterStatus(None)
+ else:
+ status = get_status_for_cluster(cluster_name, rc)
+
+ cluster_list[cluster_name] = {
+ 'status': status
+ }
+ return cluster_list
+
def get_cluster_list_full():
cluster_list = {}
diff --git a/luci/templates/mainmenu.html b/luci/templates/mainmenu.html
index 40ceba4..71fbfe3 100644
--- a/luci/templates/mainmenu.html
+++ b/luci/templates/mainmenu.html
@@ -10,7 +10,7 @@
<li><a py:attrs="{'class': 'manage_clusters' in dir(tmpl_context) and 'current' or '', 'href': tg.url('/clusters')}">Manage Clusters</a></li>
</ul>
<ul class="sidenavlist" id="clusterlist">
- <div py:for="i, (entity_name, cluster_data) in enumerate(db_helpers.get_cluster_list_full().iteritems())"
+ <div py:for="i, (entity_name, cluster_data) in enumerate(db_helpers.get_cluster_list_status(tmpl_context.cluster).iteritems())"
py:attrs="not i%2 and {'class': 'even'} or None"
py:with="identifier = form_utils.string2Id(entity_name)">
<div py:if="hasattr(cluster_data['status'],'quorate')">
13 years, 9 months