From: rmccabe@sourceware.org <rmccabe@sourceware.org>
To: cluster-devel.redhat.com
Subject: [Cluster-devel] conga/luci cluster/form-macros site/luci/Exten ...
Date: 8 Feb 2007 03:46:52 -0000 [thread overview]
Message-ID: <20070208034652.10370.qmail@sourceware.org> (raw)
CVSROOT: /cvs/cluster
Module name: conga
Branch: RHEL4
Changes by: rmccabe at sourceware.org 2007-02-08 03:46:51
Modified files:
luci/cluster : form-macros
luci/site/luci/Extensions: FailoverDomain.py ModelBuilder.py
cluster_adapters.py
Added files:
luci/cluster : validate_fdom.js
luci/site/luci/Extensions: FenceXVMd.py
Log message:
Support for adding and editing failover domains (bz 215014)
Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/cluster/validate_fdom.js.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=NONE&r2=1.3.2.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/cluster/form-macros.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=1.176.2.4&r2=1.176.2.5
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/FenceXVMd.py.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=NONE&r2=1.1.2.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/FailoverDomain.py.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=1.1&r2=1.1.4.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/ModelBuilder.py.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=1.19.2.2&r2=1.19.2.3
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/cluster_adapters.py.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=1.227.2.3&r2=1.227.2.4
/cvs/cluster/conga/luci/cluster/validate_fdom.js,v --> standard output
revision 1.3.2.1
--- conga/luci/cluster/validate_fdom.js
+++ - 2007-02-08 03:46:51.751330000 +0000
@@ -0,0 +1,40 @@
+function fdom_set_prioritized(form, state) {
+ var prilist = form.getElementsByTagName('input');
+ if (!prilist)
+ return (-1);
+ for (var i = 0 ; i < prilist.length ; i++) {
+ if (prilist[i].type == 'text' && prilist[i].className == 'fdom_priority')
+ prilist[i].disabled = !state || !form[prilist[i].id][0].checked;
+ }
+}
+
+function fdom_set_member(form, name, state) {
+ var prioritized = document.getElementById('prioritized');
+ if (!prioritized)
+ return (-1);
+ prioritized = prioritized.checked;
+ var member_pri_elem = document.getElementById(name);
+ if (!member_pri_elem)
+ return (-1);
+ member_pri_elem.disabled = !prioritized || !state;
+}
+
+function validate_add_fdom(form) {
+ var errors = new Array();
+
+ if (!form.name || str_is_blank(form.name.value)) {
+ set_form_err(form.name);
+ errors.append('No name was given for this failover domain.');
+ } else
+ clr_form_err(form.name);
+
+ if (error_dialog(errors))
+ return (-1);
+
+ var confirm_msg = 'Add this failover domain?';
+ if (form.oldname)
+ confirm_msg = 'Update this failover domain?';
+
+ if (confirm(confirm_msg))
+ form.submit();
+}
--- conga/luci/cluster/form-macros 2007/02/07 18:30:53 1.176.2.4
+++ conga/luci/cluster/form-macros 2007/02/08 03:46:51 1.176.2.5
@@ -4322,23 +4322,117 @@
</div>
</div>
+<tal:block metal:define-macro="fdom-macro">
+<script type="text/javascript"
+ src="/luci/homebase/homebase_common.js">
+</script>
+<script type="text/javascript"
+ src="/luci/cluster/validate_fdom.js">
+</script>
+
+<form method="post" action="">
+ <input type="hidden" name="clustername"
+ tal:attributes="value request/clustername | nothing" />
+ <input type="hidden" name="pagetype"
+ tal:attributes="value request/pagetype | nothing" />
+ <input type="hidden" name="oldname"
+ tal:condition="exists: fdom/name"
+ tal:attributes="value fdom/name | nothing" />
+
+ <table class="systemsTable" width="100%">
+ <thead class="systemsTable">
+ <tr class="systemsTable">
+ <td><strong>Failover Domain Name</strong></td>
+ <td>
+ <input type="text" name="name"
+ tal:attributes="value fdom/name | nothing" />
+ </td>
+ </tr>
+ <tr class="systemsTable">
+ <td>Prioritized</td>
+ <td>
+ <input type="checkbox" name="prioritized" id="prioritized"
+ onchange="fdom_set_prioritized(this.form, this.checked)"
+ tal:attributes="checked python: (fdom and 'prioritized' in fdom and fdom['prioritized'] == '1') and 'checked' or ''" />
+ </td>
+ </tr>
+ <tr class="systemsTable">
+ <td>Restrict failover to this domain's members</td>
+ <td>
+ <input type="checkbox" name="restricted"
+ tal:attributes="checked python: (fdom and 'restricted' in fdom and fdom['restricted'] == '1') and 'checked' or ''" />
+ </td>
+ </tr>
+ <tr class="systemsTable">
+ <td class="systemsTable" colspan="2">
+ <p></p>
+ <p class="reshdr">Failover domain membership</p>
+ </td>
+ </tr>
+ </thead>
+
+ <tfoot class="systemsTable">
+ <tr class="systemsTable"><td>
+ <div class="hbSubmit">
+ <input type="button" name="add" value="Submit"
+ onclick="validate_add_fdom(this.form)" />
+ </div>
+ </td></tr>
+ </tfoot>
+
+ <tbody width="60%">
+ <tr class="systemsTable">
+ <th class="systemsTable" width="33%">Node</th>
+ <th class="systemsTable" width="10%">Member</th>
+ <th class="systemsTable" width="57%">Priority</th>
+ </tr>
+ <tal:block tal:repeat="n python:here.getnodes(modelb)">
+ <tr class="systemsTable">
+ <td class="systemsTable" width="33%">
+ <tal:block tal:replace="n" />
+ <td class="systemsTable" width="10%">
+ <input type="checkbox"
+ onchange="fdom_set_member(this.form, this.name, this.checked)"
+ tal:attributes="
+ checked python: ('members' in fdom and n in fdom['members']) and 'checked' or '';
+ name n" />
+ </td>
+ <td class="systemsTable" width="75%">
+ <input type="text" class="fdom_priority"
+ tal:attributes="
+ id n;
+ name python: '__PRIORITY__' + n;
+ value python: ('members' in fdom and n in fdom['members'] and 'priority' in fdom['members'][n]) and fdom['members'][n]['priority'] or '1';
+ disabled python: (not fdom or not 'prioritized' in fdom or fdom['prioritized'] != '1' or not 'members' in fdom or not n in fdom['members']) and 'disabled' or ''" />
+ </td>
+ </tr>
+ </tal:block>
+ </tbody>
+ </table>
+</form>
+
+</tal:block>
+
<div metal:define-macro="fdomadd-form">
<script type="text/javascript">
set_page_title('Luci ??? cluster ??? failover domains ??? Add a failover domain');
</script>
- <h2>Failover Domain Add Form</h2>
- <tal:block tal:define="allnodes python:here.getFdomNodes(request)"/>
+
+ <h2>Add a Failover Domain</h2>
+ <tal:block metal:use-macro="here/form-macros/macros/fdom-macro" />
</div>
<div metal:define-macro="fdomconfig-form">
<script type="text/javascript">
set_page_title('Luci ??? cluster ??? failover domains ??? Configure a failover domain');
</script>
- <h2>Failover Domain Configuration Form</h2>
</div>
<div metal:define-macro="fdom-form">
<h2>Failover Domain Form</h2>
+ <tal:block tal:define="fdom python:here.getFdomInfo(modelb, request)">
+ <tal:block metal:use-macro="here/form-macros/macros/fdom-macro" />
+ </tal:block>
</div>
<div metal:define-macro="fdomprocess-form">
/cvs/cluster/conga/luci/site/luci/Extensions/FenceXVMd.py,v --> standard output
revision 1.1.2.1
--- conga/luci/site/luci/Extensions/FenceXVMd.py
+++ - 2007-02-08 03:46:51.952546000 +0000
@@ -0,0 +1,14 @@
+import string
+from TagObject import TagObject
+
+TAG_NAME = "fence_xvmd"
+
+class FenceXVMd(TagObject):
+ def __init__(self):
+ TagObject.__init__(self)
+ self.TAG_NAME = TAG_NAME
+ #Have autostart set by default
+
+ def getProperties(self):
+ stringbuf = ""
+ return stringbuf
--- conga/luci/site/luci/Extensions/FailoverDomain.py 2006/05/30 20:17:21 1.1
+++ conga/luci/site/luci/Extensions/FailoverDomain.py 2007/02/08 03:46:51 1.1.4.1
@@ -22,7 +22,7 @@
def getProperties(self):
stringbuf = ""
restricted_status = ""
- ordereded_status = ""
+ ordered_status = ""
string_restricted = ""
string_ordered = ""
string_num_kin = ""
--- conga/luci/site/luci/Extensions/ModelBuilder.py 2007/02/07 17:02:18 1.19.2.2
+++ conga/luci/site/luci/Extensions/ModelBuilder.py 2007/02/08 03:46:51 1.19.2.3
@@ -627,10 +627,17 @@
return list()
else:
return self.failoverdomains_ptr.getChildren()
-
+
def getFailoverDomainPtr(self):
return self.failoverdomains_ptr
+ def getFailoverDomainByName(self, fdom_name):
+ fdoms = self.getFailoverDomains()
+ for i in fdoms:
+ if i.getName() == fdom_name:
+ return i
+ return None
+
def getFailoverDomainsForNode(self, nodename):
matches = list()
faildoms = self.getFailoverDomains()
--- conga/luci/site/luci/Extensions/cluster_adapters.py 2007/02/07 21:30:33 1.227.2.3
+++ conga/luci/site/luci/Extensions/cluster_adapters.py 2007/02/08 03:46:51 1.227.2.4
@@ -11,6 +11,8 @@
from Ip import Ip
from Clusterfs import Clusterfs
from Fs import Fs
+from FailoverDomain import FailoverDomain
+from FailoverDomainNode import FailoverDomainNode
from RefObject import RefObject
from ClusterNode import ClusterNode
from NFSClient import NFSClient
@@ -2009,6 +2011,143 @@
response.redirect(request['URL'] + "?pagetype=" + NODE + "&clustername=" + clustername + '&nodename=' + nodename + '&busyfirst=true')
+def validateFdom(self, request):
+ errors = list()
+
+ try:
+ model = request.SESSION.get('model')
+ if not model:
+ raise Exception, 'no model'
+ except Exception, e:
+ luci_log.debug_verbose('validateFdom0: no model: %s' % str(e))
+ return (False, {'errors': [ 'Unable to retrieve cluster information.' ]})
+
+ prioritized = False
+ try:
+ prioritized = request.form.has_key('prioritized')
+ except:
+ prioritized = False
+
+ restricted = False
+ try:
+ restricted = request.form.has_key('restricted')
+ except:
+ restricted = False
+
+ clustername = None
+ try:
+ clustername = request.form['clustername'].strip()
+ if not clustername:
+ raise Exception, 'blank'
+ except:
+ try:
+ clustername = model.getClusterName()
+ if not clustername:
+ raise Exception, 'blank'
+ except:
+ clustername = None
+
+ if not clustername:
+ errors.append('Unable to determine this cluster\'s name.')
+
+ try:
+ name = request.form['name'].strip()
+ if not name:
+ raise Exception, 'blank'
+ except Exception, e:
+ errors.append('No name was given for this failover domain.')
+ luci_log.debug_verbose('validateFdom0: %s' % str(e))
+
+ oldname = None
+ try:
+ oldname = request.form['oldname'].strip()
+ if not oldname:
+ raise Exception, 'blank'
+ except:
+ pass
+
+ if oldname is None or oldname != name:
+ if model.getFailoverDomainByName(name) is not None:
+ errors.append('A failover domain named \"%s\" already exists.' % name)
+
+ fdom = None
+ if oldname is not None:
+ fdom = model.getFailoverDomainByName(oldname)
+ if fdom is None:
+ luci_log.debug_verbose('validateFdom1: No fdom named %s exists' % oldname)
+ errors.append('No failover domain named \"%s" exists.' % oldname)
+ else:
+ fdom.addAttribute('name', name)
+ fdom.children = list()
+ else:
+ fdom = FailoverDomain()
+ fdom.addAttribute('name', name)
+
+ if fdom is None or len(errors) > 0:
+ return (False, {'errors': errors })
+
+ if prioritized:
+ fdom.addAttribute('ordered', '1')
+ else:
+ fdom.addAttribute('ordered', '0')
+
+ if restricted:
+ fdom.addAttribute('restricted', '1')
+ else:
+ fdom.addAttribute('restricted', '0')
+
+ cluster_nodes = map(lambda x: str(x.getName()), model.getNodes())
+
+ for i in cluster_nodes:
+ if request.form.has_key(i):
+ fdn = FailoverDomainNode()
+ fdn.addAttribute('name', i)
+ if prioritized:
+ priority = 1
+ try:
+ priority = int(request.form['__PRIORITY__' + i].strip())
+ if priority < 1:
+ priority = 1
+ except Exception, e:
+ priority = 1
+ fdn.addAttribute('priority', str(priority))
+ fdom.addChild(fdn)
+
+ try:
+ fdom_ptr = model.getFailoverDomainPtr()
+ if not oldname:
+ fdom_ptr.addChild(fdom)
+ model.setModified(True)
+ conf = str(model.exportModelAsString())
+ except Exception, e:
+ luci_log.debug_verbose('validateFdom2: %s' % str(e))
+ errors.append('Unable to update the cluster configuration.')
+
+ if len(errors) > 0:
+ return (False, {'errors': errors })
+
+ rc = getRicciAgent(self, clustername)
+ if not rc:
+ luci_log.debug_verbose('validateFdom3: unable to find a ricci agent for cluster %s' % clustername)
+ return (False, {'errors': ['Unable to find a ricci agent for the %s cluster' % clustername ]})
+ ragent = rc.hostname()
+
+ batch_number, result = setClusterConf(rc, conf)
+ if batch_number is None or result is None:
+ luci_log.debug_verbose('validateFdom4: missing batch and/or result')
+ return (False, {'errors': [ 'An error occurred while constructing the new cluster configuration.' ]})
+
+ try:
+ if oldname:
+ set_node_flag(self, clustername, ragent, str(batch_number), FDOM, 'Updating failover domain \"%s\"' % oldname)
+ else:
+ set_node_flag(self, clustername, ragent, str(batch_number), FDOM_ADD, 'Creating failover domain \"%s\"' % name)
+ except Exception, e:
+ luci_log.debug_verbose('validateFdom5: failed to set flags: %s' % str(e))
+
+ response = request.RESPONSE
+ response.redirect(request['URL'] + "?pagetype=" + FDOM + "&clustername=" + clustername + '&fdomname=' + name + '&busyfirst=true')
+
def validateVM(self, request):
errors = list()
@@ -2122,6 +2261,8 @@
24: validateServiceAdd,
31: validateResourceAdd,
33: validateResourceAdd,
+ 41: validateFdom,
+ 44: validateFdom,
51: validateFenceAdd,
54: validateFenceEdit,
55: validateDaemonProperties,
@@ -2247,12 +2388,11 @@
return dummynode
def getnodes(self, model):
- mb = model
- nodes = mb.getNodes()
- names = list()
- for node in nodes:
- names.append(node.getName())
- return names
+ try:
+ return map(lambda x: str(x.getName()), model.getNodes())
+ except Exception, e:
+ luci_log.debug_verbose('getnodes0: %s' % str(e))
+ return []
def createCluConfigTree(self, request, model):
dummynode = {}
@@ -3370,6 +3510,39 @@
response = req.RESPONSE
response.redirect(req['URL'] + "?pagetype=" + SERVICE_LIST + "&clustername=" + cluname + '&busyfirst=true')
+def getFdomInfo(self, model, request):
+ fhash = {}
+ fhash['members'] = {}
+
+ try:
+ fdom = model.getFailoverDomainByName(request['fdomname'])
+ except Exception, e:
+ luci_log.debug_verbose('getFdomInfo0: %s' % str(e))
+ return fhash
+
+ fhash['name'] = fdom.getName()
+
+ ordered_attr = fdom.getAttribute('ordered')
+ if ordered_attr is not None and (ordered_attr == "true" or ordered_attr == "1"):
+ fhash['prioritized'] = '1'
+ else:
+ fhash['prioritized'] = '0'
+
+ restricted_attr = fdom.getAttribute('restricted')
+ if restricted_attr is not None and (restricted_attr == "true" or restricted_attr == "1"):
+ fhash['restricted'] = '1'
+ else:
+ fhash['restricted'] = '0'
+
+ nodes = fdom.getChildren()
+ for node in nodes:
+ try:
+ priority = node.getAttribute('priority')
+ except:
+ priority = '1'
+ fhash['members'][node.getName()] = { 'priority': priority }
+ return fhash
+
def getFdomsInfo(self, model, request, clustatus):
slist = list()
nlist = list()
@@ -3386,7 +3559,7 @@
for fdom in fdoms:
fdom_map = {}
fdom_map['name'] = fdom.getName()
- fdom_map['cfgurl'] = baseurl + "?pagetype=" + FDOM_LIST + "&clustername=" + clustername
+ fdom_map['cfgurl'] = baseurl + "?pagetype=" + FDOM + "&clustername=" + clustername + '&fdomname=' + fdom.getName()
ordered_attr = fdom.getAttribute('ordered')
restricted_attr = fdom.getAttribute('restricted')
if ordered_attr is not None and (ordered_attr == "true" or ordered_attr == "1"):
next reply other threads:[~2007-02-08 3:46 UTC|newest]
Thread overview: 39+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-02-08 3:46 rmccabe [this message]
-- strict thread matches above, loose matches on Subject: below --
2007-09-21 3:11 [Cluster-devel] conga/luci cluster/form-macros site/luci/Exten rmccabe
2007-06-19 15:54 rmccabe
2007-05-03 20:16 rmccabe
2007-03-15 16:41 rmccabe
2007-03-14 22:38 rmccabe
2007-03-14 22:37 rmccabe
2007-03-05 16:50 rmccabe
2007-03-05 16:50 rmccabe
2007-03-05 16:49 rmccabe
2007-02-15 22:44 rmccabe
2007-02-07 17:02 rmccabe
2007-02-07 16:55 rmccabe
2007-02-02 4:34 rmccabe
2007-02-02 0:11 rmccabe
2007-02-01 20:49 rmccabe
2007-01-31 23:36 rmccabe
2007-01-31 5:26 rmccabe
2007-01-23 13:53 rmccabe
2007-01-15 18:21 rmccabe
2007-01-11 19:11 rmccabe
2007-01-10 21:40 rmccabe
2007-01-06 3:29 rmccabe
2006-12-14 23:14 rmccabe
2006-12-14 18:22 rmccabe
2006-12-11 22:42 rmccabe
2006-12-11 21:51 rmccabe
2006-12-06 22:11 rmccabe
2006-12-06 21:16 rmccabe
2006-11-13 21:40 rmccabe
2006-11-12 2:10 rmccabe
2006-11-09 20:32 rmccabe
2006-11-03 22:48 rmccabe
2006-10-25 1:53 rmccabe
2006-10-25 1:11 rmccabe
2006-10-13 21:25 rmccabe
2006-08-03 18:36 shuennek
2006-07-21 14:49 rmccabe
2006-07-20 16:59 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=20070208034652.10370.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.