From: rmccabe@sourceware.org <rmccabe@sourceware.org>
To: cluster-devel.redhat.com
Subject: [Cluster-devel] conga/luci cluster/form-macros cluster/index_h ...
Date: 21 Dec 2006 05:08:51 -0000 [thread overview]
Message-ID: <20061221050851.26921.qmail@sourceware.org> (raw)
CVSROOT: /cvs/cluster
Module name: conga
Changes by: rmccabe at sourceware.org 2006-12-21 05:08:49
Modified files:
luci/cluster : form-macros index_html validate_config_qdisk.js
luci/homebase : form-macros homebase_common.js index_html
luci_homebase.css validate_sys_remove.js
luci/site/luci/Extensions: cluster_adapters.py
homebase_adapters.py ricci_bridge.py
ricci_communicator.py
Log message:
most of the rest of fixes for bz201394. minor cleanup/polish still forthcoming.
Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/cluster/form-macros.diff?cvsroot=cluster&r1=1.135&r2=1.136
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/cluster/index_html.diff?cvsroot=cluster&r1=1.29&r2=1.30
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/cluster/validate_config_qdisk.js.diff?cvsroot=cluster&r1=1.4&r2=1.5
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/homebase/form-macros.diff?cvsroot=cluster&r1=1.49&r2=1.50
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/homebase/homebase_common.js.diff?cvsroot=cluster&r1=1.14&r2=1.15
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/homebase/index_html.diff?cvsroot=cluster&r1=1.20&r2=1.21
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/homebase/luci_homebase.css.diff?cvsroot=cluster&r1=1.30&r2=1.31
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/homebase/validate_sys_remove.js.diff?cvsroot=cluster&r1=1.2&r2=1.3
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/cluster_adapters.py.diff?cvsroot=cluster&r1=1.190&r2=1.191
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/homebase_adapters.py.diff?cvsroot=cluster&r1=1.41&r2=1.42
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/ricci_bridge.py.diff?cvsroot=cluster&r1=1.51&r2=1.52
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/ricci_communicator.py.diff?cvsroot=cluster&r1=1.22&r2=1.23
--- conga/luci/cluster/form-macros 2006/12/20 22:07:16 1.135
+++ conga/luci/cluster/form-macros 2006/12/21 05:08:48 1.136
@@ -208,173 +208,226 @@
<tal:block tal:omit-tag=""
tal:define="global sessionObj python: request.SESSION.get('checkRet')" />
- <form name="adminform" action="" method="post">
- <input name="pagetype" id="pagetype" type="hidden" value="6" />
+ <h1>Add a cluster</h1>
- <h1>Add a cluster</h1>
+ <form name="create_cluster" action="" method="post"
+ tal:define="
+ global add_cluster request/SESSION/create_cluster | nothing">
+
+ <input name="pagetype" type="hidden"
+ tal:attributes="value request/form/pagetype | request/pagetype |string:6" />
+
+ <input name="cluster_os" type="hidden"
+ tal:attributes="value add_cluster/cluster_os | nothing" />
- <tal:block tal:condition="python: not sessionObj or not 'requestResults' in sessionObj or not 'nodeList' in sessionObj['requestResults']">
- <input name="numStorage" type="hidden" value="3" />
<table id="systemsTable" class="systemsTable" border="0" cellspacing="0">
<thead class="systemsTable">
- <tr class="systemsTable"><td class="systemsTable" colspan="2">
- <div class="systemsTableTop">
- <strong>Cluster Name</strong>
- <input class="hbInputSys" type="text" id="clusterName" name="clusterName" />
- </div>
- </td></tr>
+ <tr class="systemsTable"><td class="systemsTable" colspan="2">
+ <div class="systemsTableTop">
+ <strong>Cluster Name</strong>
+ <input class="hbInputSys" type="text"
+ id="clusterName" name="clusterName"
+ tal:attributes="value add_cluster/name | nothing" />
+ </div>
+ </td></tr>
<tr class="systemsTable">
- <th class="systemsTable">System Hostname</th>
- <th class="systemsTable">Password</th>
+ <th class="systemsTable">Node Hostname</th>
+ <th class="systemsTable">Root Password</th>
+ <tal:block tal:condition="add_cluster">
+ <th class="systemsTable">Key ID</th>
+ <th class="systemsTable">Trust</th>
+ </tal:block>
+ <th></th>
</tr>
</thead>
<tfoot class="systemsTable">
<tr class="systemsTable"><td colspan="2" class="systemsTable">
<ul class="vanilla deploy">
- <li class="vanilla"><input type="radio" name="rhn_dl" value="1" checked="checked" />Download packages</li>
- <li class="vanilla"><input type="radio" name="rhn_dl" value="0" />Use locally installed packages.</li>
+ <li class="vanilla">
+ <input type="radio" name="download_pkgs"
+ value="1" checked="checked" />
+ Download packages
+ </li>
+ <li class="vanilla">
+ <input type="radio" name="download_pkgs"
+ value="0" />
+ Use locally installed packages.
+ </li>
</ul>
</td></tr>
<tr class="systemsTable"><td colspan="2" class="systemsTable">
- <input type="checkbox" value="1" name="enable_storage" />Enable Shared Storage Support
+ <input type="checkbox" name="enable_storage" />
+ Enable Shared Storage Support
</td></tr>
<tr class="systemsTable"><td colspan="2" class="systemsTable">
- <div>
- <input type="checkbox" name="allSameCheckBox" id="allSameCheckBox" onClick="allPasswdsSame(adminform);"/> Check if cluster node passwords are identical.
- </div>
+ <ul class="vanilla">
+ <li class="vanilla">
+ <input name="check_certs" type="checkbox"
+ tal:attributes="checked python: (add_cluster and add_cluster['check_certs']) and 'checked'" />
+ View system certificates before sending any passwords.
+ </li>
+ <li class="vanilla">
+ <input type="checkbox"
+ name="allSameCheckBox" id="allSameCheckBox"
+ onClick="allPasswdsSame(this.form)"
+ tal:attributes="checked python: (add_cluster and add_cluster['identical_passwds']) and 'checked'"
+ />
+
+ Check if node passwords are identical.
+ </li>
+ </ul>
</td></tr>
-
<tr class="systemsTable"><td class="systemsTable" colspan="2">
<div class="systemsTableEnd">
- <input type="button" value="Add Another Row" onClick="addSystem(adminform);" />
+ <input type="button" value="Add another entry"
+ onClick="addSystem(this.form)" />
</div>
</td></tr>
</tfoot>
+ <tal:block tal:define="global cur_sysnum python:0" />
+
<tbody class="systemsTable">
- <tr class="systemsTable">
+ <tal:block
+ tal:condition="exists: add_cluster/nodes"
+ tal:repeat="cur_sys add_cluster/nodes">
+ <tr class="systemsTable"
+ tal:attributes="id python: '__SYSTEM_ROW_%d' % cur_sysnum"
+ tal:define="sys python: add_cluster['nodes'][cur_sys]">
+ <td class="systemsTable">
+ <input type="text"
+ tal:attributes="
+ value sys/host | nothing;
+ id python: '__SYSTEM%d:Addr' % cur_sysnum;
+ name python: '__SYSTEM%d:Addr' % cur_sysnum;
+ class python: 'hbInputSys' + ('errors' in sys and ' error' or '');
+ disabled python: ('auth' in sys and sys['host'].count('.') > 0) and 1 or 0"
+ />
+ </td>
+ <td class="systemsTable">
+ <tal:block tal:condition="not: exists: sys/auth">
+ <input type="password"
+ onChange="pwd0Change(this.form)"
+ autocomplete="off"
+ tal:attributes="
+ value sys/passwd | nothing;
+ class python: 'hbInputPass' + ('errors' in sys and ' error' or '');
+ id python: '__SYSTEM%d:Passwd' % cur_sysnum;
+ name python: '__SYSTEM%d:Passwd' % cur_sysnum" />
+ </tal:block>
+
+ <tal:block tal:condition="exists: sys/auth">
+ <input type="text" onChange="pwd0Change(this.form)"
+ disabled="disabled" value="[authenticated]"
+ tal:attributes="
+ class python: 'hbInputPass' + ('errors' in sys and ' error' or '');
+ id python: '__SYSTEM%d:Passwd' % cur_sysnum;
+ name python: '__SYSTEM%d:Passwd' % cur_sysnum" />
+ </tal:block>
+ </td>
+ <td tal:condition="add_cluster" class="systemsTable">
+ <img
+ tal:attributes="
+ src python: 'trusted' in sys and '/luci/lock-ok.png' or ('fp' in sys and '/luci/lock-closed.png' or '/luci/lock-open.png');
+ title sys/fp | string:no key fingerprint available" />
+ <input type="hidden"
+ tal:attributes="
+ id python: '__SYSTEM%dFingerprint' % cur_sysnum;
+ name python: '__SYSTEM%dFingerprint' % cur_sysnum;
+ value sys/fp | nothing" />
+ </td>
+ <td tal:condition="add_cluster" class="systemsTable">
+ <input type="checkbox" tal:attributes="
+ checked exists: sys/fp;
+ id python: '__SYSTEM%dTrusted' % cur_sysnum;
+ name python: '__SYSTEM%dTrusted' % cur_sysnum;
+ disabled python: 'trusted' in sys"
+ />
+ </td>
+ <td class="systemsTable">
+ <img src="/luci/delete-row.png" class="deleteRow"
+ title="delete this row"
+ tal:attributes="
+ onclick python: 'delete_element_id(\'__SYSTEM_ROW_%d\')' % cur_sysnum" />
+ </td>
+ </tr>
+ <tal:block
+ tal:define="global cur_sysnum python: cur_sysnum + 1" />
+ </tal:block>
+
+ <tr class="systemsTable" id="__SYSTEM_ROW_0"
+ tal:condition="not: add_cluster">
<td class="systemsTable">
<input class="hbInputSys" type="text"
id="__SYSTEM0:Addr" name="__SYSTEM0:Addr" />
</td>
<td class="systemsTable">
<input type="password"
- id="__SYSTEM0:Passwd" name="__SYSTEM0:Passwd"
+ onChange="pwd0Change(this.form)"
class="hbInputPass" autocomplete="off"
- onChange="pwd0Change(adminform);" />
+ onChange="pwd0Change(this.form)"
+ id="__SYSTEM0:Passwd" name="__SYSTEM0:Passwd" />
+ </td>
+ <td class="systemsTable">
+ <img src="/luci/delete-row.png" class="deleteRow"
+ title="delete this row"
+ onclick="delete_element_id('__SYSTEM_ROW_0')" />
</td>
</tr>
-
- <tr class="systemsTable">
+ <tr class="systemsTable" id="__SYSTEM_ROW_1"
+ tal:condition="not: add_cluster">
<td class="systemsTable">
<input class="hbInputSys" type="text"
id="__SYSTEM1:Addr" name="__SYSTEM1:Addr" />
</td>
<td class="systemsTable">
<input type="password"
- id="__SYSTEM1:Passwd" name="__SYSTEM1:Passwd"
+ onChange="pwd0Change(this.form)"
class="hbInputPass" autocomplete="off"
- onChange="pwd0Change(adminform);" />
+ id="__SYSTEM1:Passwd" name="__SYSTEM1:Passwd" />
+ </td>
+ <td class="systemsTable">
+ <img src="/luci/delete-row.png" class="deleteRow"
+ title="delete this row"
+ onclick="delete_element_id('__SYSTEM_ROW_1')" />
</td>
</tr>
-
- <tr class="systemsTable">
+ <tr class="systemsTable" id="__SYSTEM_ROW_2"
+ tal:condition="not: add_cluster">
<td class="systemsTable">
<input class="hbInputSys" type="text"
id="__SYSTEM2:Addr" name="__SYSTEM2:Addr" />
</td>
<td class="systemsTable">
<input type="password"
- id="__SYSTEM2:Passwd" name="__SYSTEM2:Passwd"
+ onChange="pwd0Change(this.form)"
class="hbInputPass" autocomplete="off"
- onChange="pwd0Change(adminform);" />
+ id="__SYSTEM2:Passwd" name="__SYSTEM2:Passwd" />
</td>
- </tr>
- </tbody>
- </table>
- </tal:block>
-
- <tal:block tal:condition="python: sessionObj and 'requestResults' in sessionObj and 'nodeList' in sessionObj['requestResults']">
-
- <table id="systemsTable" class="systemsTable" border="0" cellspacing="0">
- <thead class="systemsTable">
- <tr class="systemsTable"><td class="systemsTable" colspan="2">
- <div class="systemsTableTop">
- <strong>Cluster Name:</strong>
- <input type="text" id="clusterName" name="clusterName"
- tal:attributes="value python: sessionObj['requestResults']['clusterName']" />
- </div>
- </td></tr>
- <tr class="systemsTable">
- <th class="systemsTable">Node Hostname</th>
- <th class="systemsTable">Root Password</th>
- </tr>
- </thead>
-
- <tfoot class="systemsTable">
- <tr class="systemsTable"><td class="systemsTable" colspan="2">
- <ul class="vanilla deploy">
- <li class="vanilla"><input type="radio" name="rhn_dl" value="1" checked="checked" />Download packages</li>
- <li class="vanilla"><input type="radio" name="rhn_dl" value="0" />Use locally installed packages.</li>
- </ul>
- </td></tr>
- <tr class="systemsTable"><td class="systemsTable" colspan="2">
- <input type="checkbox" value="1" name="enable_storage" />Enable Shared Storage Support
- </td></tr>
- <tr class="systemsTable"><td class="systemsTable" colspan="2">
- <div>
- <input type="checkbox" name="allSameCheckBox" id="allSameCheckBox" onClick="allPasswdsSame(adminform);"/> Check if cluster node passwords are identical.
- </div>
- </td></tr>
- <tr class="systemsTable"><td class="systemsTable" colspan="2">
- <div class="systemsTableEnd">
- <input type="button" value="Add Another Row" onClick="addSystem(adminform);" />
- </div>
- </td></tr>
- </tfoot>
-
- <span tal:omit-tag="" tal:define="global sysNum python: 0" />
-
- <tbody class="systemsTable">
- <tal:block tal:repeat="node python: sessionObj['requestResults']['nodeList']">
- <span tal:omit-tag=""
- tal:define="global nodeAuth python: node['cur_auth']" />
-
- <tr class="systemsTable">
<td class="systemsTable">
- <input type="text"
- tal:attributes="
- id python: '__SYSTEM' + str(sysNum) + ':Addr';
- name python: '__SYSTEM' + str(sysNum) + ':Addr';
- value python: node['ricci_host'];
- class python: 'hbInputSys' + ('errors' in node and ' error' or '')"
- />
- </td>
- <td class="systemsTable">
- <input
- onChange="pwd0Change(adminform);"
- tal:attributes="
- type python: nodeAuth and 'text' or 'password';
- value python: nodeAuth and '[authenticated]' or '';
- class python: 'hbInputPass' + ('errors' in node and ' error' or '');
- id python: '__SYSTEM' + str(sysNum) + ':Passwd';
- name python: '__SYSTEM' + str(sysNum) + ':Passwd'"
- />
+ <img src="/luci/delete-row.png" class="deleteRow"
+ title="delete this row"
+ onclick="delete_element_id('__SYSTEM_ROW_2')" />
</td>
+ <tal:block tal:define="global cur_sysnum python:3" />
</tr>
- <span tal:omit-tag="" tal:define="global sysNum python: sysNum + 1" />
- </tal:block>
</tbody>
</table>
- <input type="hidden" name="numStorage" tal:attributes="value python: sysNum" />
- </tal:block>
+ <input name="numStorage" id="numStorage" type="hidden"
+ tal:attributes="value cur_sysnum" />
<div class="hbSubmit" id="hbSubmit">
- <input type="button" name="Submit" value="Submit" onClick="validateForm(document.adminform);" />
+ <input type="button" name="Submit" value="Submit"
+ onClick="validateForm(this.form)" />
</div>
</form>
+
+ <div tal:condition="add_cluster">
+ <tal:block
+ tal:define="x python: request.SESSION.delete('create_cluster')" />
+ </div>
</div>
<div metal:define-macro="clusterconfig-form">
@@ -1018,9 +1071,10 @@
<input class="qdscore qdisk" type="text" name="heuristic0:hscore" id="heuristic0:hscore" value="">
</td>
<td class="systemsTable">
- <img class="qdscore qdisk qdel_img"
+ <img class="qdisk deleteRow"
id="heuristic0:hdel" name="heuristic0:hdel"
- src="/luci/homebase/x.png"
+ src="/luci/delete-row.png"
+ title="delete this heuristic"
onClick="delete_qdisk_heur(this, document.quorum_partition);">
</td>
</tr>
@@ -1067,8 +1121,9 @@
name python: 'heuristic' + str(curHeur) + ':hscore';"/>
</td>
<td class="systemsTable">
- <img class="qdscore qdisk qdel_img"
- src="/luci/homebase/x.png"
+ <img class="qdisk deleteRow"
+ src="/luci/homebase/delete-row.png"
+ title="delete this heuristic"
onClick="delete_qdisk_heur(this, document.quorum_partition);"
tal:attributes="
id python: 'heuristic' + str(curHeur) + ':hdel';
@@ -2804,6 +2859,7 @@
<script type="text/javascript">
set_page_title('Luci ??? cluster ??? Add a new cluster node');
</script>
+
<script type="text/javascript"
src="/luci/homebase/homebase_common.js">
</script>
@@ -2812,79 +2868,191 @@
src="/luci/homebase/validate_cluster_add.js">
</script>
- <input type="hidden" name="clusterName"
- tal:attributes="value request/form/clusterName | request/clustername | none"
- />
- <form name="adminform" action="" method="post">
- <input name="numStorage" type="hidden" value="1" />
- <input name="pagetype" type="hidden" value="15" />
- <input name="addnode" type="hidden" value="1" />
+ <form name="add_node" action="" method="post"
+ tal:define="
+ global add_cluster request/SESSION/add_node | nothing;
+ global cur_cluster_name add_cluster/name | request/clustername | request/form/clusterName | nothing">
+
+ <h2>Add a node to <span tal:replace="cur_cluster_name | string:this cluster" /></h2>
<input type="hidden" name="clusterName"
- tal:attributes="
- value request/form/clusterName | request/clustername | nothing"
- />
+ tal:attributes="value cur_cluster_name | string:[unknown]" />
- <h2>Add a node to <span tal:replace="request/form/clusterName | request/clustername | string:the cluster" /></h2>
+ <input name="pagetype" type="hidden"
+ tal:attributes="value request/form/pagetype | request/pagetype | string:15" />
- <table id="systemsTable" class="systemsTable" border="0" cellspacing="0">
+ <input name="cluster_os" type="hidden"
+ tal:attributes="value add_cluster/cluster_os | nothing" />
+
+ <table id="systemsTable" class="systemsTable" cellspacing="0">
<thead class="systemsTable">
- <tr class="systemsTable"><td class="systemsTable" colspan="2">
- <div class="systemsTableTop">
- <strong>Cluster Name</strong> <span tal:content="request/form/clusterName | request/clustername | none" />
- </div>
- </td></tr>
<tr class="systemsTable">
- <th class="systemsTable">System Hostname</th>
- <th class="systemsTable">Password</th>
+ <th class="systemsTable">Node Hostname</th>
+ <th class="systemsTable">Root Password</th>
+ <tal:block tal:condition="add_cluster">
+ <th class="systemsTable">Key ID</th>
+ <th class="systemsTable">Trust</th>
+ </tal:block>
+ <th></th>
</tr>
</thead>
<tfoot class="systemsTable">
<tr class="systemsTable"><td colspan="2" class="systemsTable">
<ul class="vanilla deploy">
- <li class="vanilla"><input type="radio" name="rhn_dl" value="1" checked="checked" />Download packages</li>
- <li class="vanilla"><input type="radio" name="rhn_dl" value="0" />Use locally installed packages.</li>
+ <li class="vanilla">
+ <input type="radio" name="download_pkgs" value="1"
+ tal:attributes="
+ checked add_system/download_pkgs | string:checked" />
+ Download packages
+ </li>
+ <li class="vanilla">
+ <input type="radio" name="download_pkgs" value="0"
+ tal:attributes="
+ checked not: add_system/download_pkgs | nothing" />
+
+ Use locally installed packages.
+ </li>
</ul>
</td></tr>
<tr class="systemsTable"><td colspan="2" class="systemsTable">
- <input type="checkbox" value="1" name="enable_storage" />Enable Shared Storage Support
+ <input type="checkbox" name="enable_storage"
+ tal:attributes="
+ checked add_system/shared_storage | nothing" />
+ Enable Shared Storage Support
</td></tr>
<tr class="systemsTable"><td colspan="2" class="systemsTable">
- <div id="allSameDiv">
- <input type="checkbox" class="allSameCheckBox"
- name="allSameCheckBox" id="allSameCheckBox" onClick="allPasswdsSame(adminform);"/>
- Check if cluster node passwords are identical.
- </div>
+ <ul class="vanilla">
+ <li class="vanilla">
+ <input name="check_certs" type="checkbox"
+ tal:attributes="checked python: (add_cluster and add_cluster['check_certs']) and 'checked'" />
+ View system certificates before sending any passwords.
+ </li>
+ <li class="vanilla"
+ tal:attributes="id python: (not add_cluster or ('nodes' in add_cluster and len(add_cluster['nodes']) < 2)) and 'allSameDiv'">
+ <input type="checkbox"
+ name="allSameCheckBox" id="allSameCheckBox"
+ onClick="allPasswdsSame(this.form)"
+ tal:attributes="checked python: (add_cluster and add_cluster['identical_passwds']) and 'checked'"
+ />
+ Check if node passwords are identical.
+ </li>
+ </ul>
</td></tr>
-
<tr class="systemsTable"><td class="systemsTable" colspan="2">
<div class="systemsTableEnd">
- <input type="button" value="Add Another Row" onClick="addSystem(adminform);" />
+ <input type="button" value="Add another entry"
+ onClick="addSystem(this.form)" />
</div>
</td></tr>
</tfoot>
+ <tal:block tal:define="global cur_sysnum python:0" />
+
<tbody class="systemsTable">
- <tr class="systemsTable">
+ <tal:block
+ tal:condition="exists: add_cluster/nodes"
+ tal:repeat="cur_sys add_cluster/nodes">
+ <tr class="systemsTable"
+ tal:attributes="id python: '__SYSTEM_ROW_%d' % cur_sysnum"
+ tal:define="sys python: add_cluster['nodes'][cur_sys]">
+ <td class="systemsTable">
+ <input type="text"
+ tal:attributes="
+ value sys/host | nothing;
+ id python: '__SYSTEM%d:Addr' % cur_sysnum;
+ name python: '__SYSTEM%d:Addr' % cur_sysnum;
+ class python: 'hbInputSys' + ('errors' in sys and ' error' or '');
+ disabled python: ('auth' in sys and sys['host'].count('.') > 0) and 1 or 0"
+ />
+ </td>
+ <td class="systemsTable">
+ <tal:block tal:condition="not: exists: sys/auth">
+ <input type="password"
+ autocomplete="off"
+ onChange="pwd0Change(this.form)"
+ tal:attributes="
+ value sys/passwd | nothing;
+ class python: 'hbInputPass' + ('errors' in sys and ' error' or '');
+ id python: '__SYSTEM%d:Passwd' % cur_sysnum;
+ name python: '__SYSTEM%d:Passwd' % cur_sysnum" />
+ </tal:block>
+
+ <tal:block tal:condition="exists: sys/auth">
+ <input type="text" onChange="pwd0Change(this.form)"
+ disabled="disabled" value="[authenticated]"
+ tal:attributes="
+ class python: 'hbInputPass' + ('errors' in sys and ' error' or '');
+ id python: '__SYSTEM%d:Passwd' % cur_sysnum;
+ name python: '__SYSTEM%d:Passwd' % cur_sysnum" />
+ </tal:block>
+ </td>
+ <td tal:condition="add_cluster" class="systemsTable">
+ <img
+ tal:attributes="
+ src python: 'trusted' in sys and '/luci/lock-ok.png' or ('fp' in sys and '/luci/lock-closed.png' or '/luci/lock-open.png');
+ title sys/fp | string:no key fingerprint available" />
+ <input type="hidden"
+ tal:attributes="
+ id python: '__SYSTEM%dFingerprint' % cur_sysnum;
+ name python: '__SYSTEM%dFingerprint' % cur_sysnum;
+ value sys/fp | nothing" />
+ </td>
+ <td tal:condition="add_cluster" class="systemsTable">
+ <input type="checkbox" tal:attributes="
+ checked exists: sys/fp;
+ id python: '__SYSTEM%dTrusted' % cur_sysnum;
+ name python: '__SYSTEM%dTrusted' % cur_sysnum;
+ disabled python: 'trusted' in sys"
+ />
+ </td>
+ <td class="systemsTable">
+ <img src="/luci/delete-row.png" class="deleteRow"
+ title="delete this row"
+ tal:attributes="
+ onclick python: 'delete_element_id(\'__SYSTEM_ROW_%d\')' % cur_sysnum" />
+ </td>
+ </tr>
+ <tal:block
+ tal:define="global cur_sysnum python: cur_sysnum + 1" />
+ </tal:block>
+
+ <tr class="systemsTable" id="__SYSTEM_ROW_0"
+ tal:condition="not: add_cluster">
<td class="systemsTable">
<input class="hbInputSys" type="text"
id="__SYSTEM0:Addr" name="__SYSTEM0:Addr" />
</td>
<td class="systemsTable">
<input type="password"
- id="__SYSTEM0:Passwd" name="__SYSTEM0:Passwd"
+ onChange="pwd0Change(this.form)"
class="hbInputPass" autocomplete="off"
- onChange="pwd0Change(adminform);" />
+ onChange="pwd0Change(this.form)"
+ id="__SYSTEM0:Passwd" name="__SYSTEM0:Passwd" />
+ </td>
+ <td class="systemsTable">
+ <img src="/luci/delete-row.png" class="deleteRow"
+ title="delete this row"
+ onclick="delete_element_id('__SYSTEM_ROW_0')" />
</td>
+ <tal:block tal:define="global cur_sysnum python:1" />
</tr>
</tbody>
</table>
+ <input name="numStorage" id="numStorage" type="hidden"
+ tal:attributes="value cur_sysnum" />
+
<div class="hbSubmit" id="hbSubmit">
- <input type="button" name="Submit" value="Submit" onClick="validateForm(document.adminform);" />
+ <input type="button" name="Submit" value="Submit"
+ onClick="validateForm(this.form)" />
</div>
</form>
+
+ <div tal:condition="add_cluster">
+ <tal:block
+ tal:define="x python: request.SESSION.delete('add_node')" />
+ </div>
</div>
<div metal:define-macro="nodeprocess-form">
@@ -2893,14 +3061,14 @@
<div id="errmsgsdiv" class="errmsgs"
tal:condition="python: result and len(result) > 1 and 'errors' in result[1]">
- <p class="errmsgs">The following errors occurred:</p>
+ <p class="errmsgs">The following errors occurred:</p>
- <ul class="errmsgs">
- <tal:block tal:repeat="e python: result[1]['errors']">
- <li class="errmsgs" tal:content="python:e" />
- </tal:block>
- </ul>
- </div>
+ <ul class="statusmsg">
+ <tal:block tal:repeat="e python: result[1]['errors']">
+ <li class="statusmsg" tal:content="python:e" />
+ </tal:block>
+ </ul>
+ </div>
</tal:block>
</div>
--- conga/luci/cluster/index_html 2006/11/29 18:39:50 1.29
+++ conga/luci/cluster/index_html 2006/12/21 05:08:48 1.30
@@ -207,23 +207,24 @@
<tal:block tal:define="ret python: request.SESSION.get('checkRet')">
<div class="retmsgs" id="retmsgsdiv" tal:condition="python:(ret and 'messages' in ret and len(ret['messages']))">
<div class="hbclosebox">
- <a href="javascript:hide_element('retmsgsdiv');"><img src="../homebase/x.png"></a>
+ <a href="javascript:hide_element('retmsgsdiv')"><img src="/luci/homebase/x.png" class="closeBox" title="dismiss"></a>
</div>
- <ul class="retmsgs">
+ <p class="retmsgs">Status messages:</p>
+ <ul class="statusmsg">
<tal:block tal:repeat="e python:ret['messages']">
- <li class="retmsgs" tal:content="python:e" />
+ <li class="statusmsg" tal:content="python:e" />
</tal:block>
</ul>
</div>
<div id="errmsgsdiv" class="errmsgs" tal:condition="python:(ret and 'errors' in ret and len(ret['errors']))">
<div class="hbclosebox">
- <a class="hbclosebox" href="javascript:hide_element('errmsgsdiv');"><img src="../homebase/x.png"></a>
+ <a class="hbclosebox" href="javascript:hide_element('errmsgsdiv')"><img src="/luci/homebase/x.png" class="closeBox" title="dismiss"></a>
</div>
<p class="errmsgs">The following errors occurred:</p>
- <ul class="errmsgs">
+ <ul class="statusmsg">
<tal:block tal:repeat="e python:ret['errors']">
- <li class="errmsgs" tal:content="python:e" />
+ <li class="statusmsg" tal:content="python:e" />
</tal:block>
</ul>
</div>
--- conga/luci/cluster/validate_config_qdisk.js 2006/10/04 17:24:58 1.4
+++ conga/luci/cluster/validate_config_qdisk.js 2006/12/21 05:08:48 1.5
@@ -314,10 +314,11 @@
var del_td = document.createElement('td');
del_td.className = 'systemsTable';
var del_img = document.createElement('img');
- del_img.className = 'qdscore qdisk qdel_img';
+ del_img.className = 'qdisk deleteRow';
del_img.setAttribute('name', hstr + ':hdel');
del_img.setAttribute('id', hstr + ':hdel');
- del_img.setAttribute('src', '/luci/homebase/x.png');
+ del_img.setAttribute('src', '/luci/delete-row.png');
+ del_img.setAttribute('title', 'delete this row');
del_img.setAttribute('onClick', 'delete_qdisk_heur(this, document.quorum_partition)');
del_td.appendChild(del_img);
--- conga/luci/homebase/form-macros 2006/11/01 23:04:17 1.49
+++ conga/luci/homebase/form-macros 2006/12/21 05:08:48 1.50
@@ -71,7 +71,8 @@
tal:attributes="value python:data['children'][data['curIndex']]['absolute_url']" />
<div class="hbSubmit" tal:condition="python:userList" id="hbSubmit">
- <input name="Submit" type="button" value="Delete This User" onClick="validateForm(document.adminform);" />
+ <input name="Submit" type="button" value="Delete This User"
+ onClick="validateForm(this.form)" />
</div>
</form>
@@ -140,7 +141,8 @@
tal:attributes="value python:data['children'][data['curIndex']]['absolute_url']" />
<div class="hbSubmit" id="hbSubmit">
- <input name="Submit" type="button" value="Submit" onClick="validateForm(document.adminform);" />
+ <input name="Submit" type="button" value="Submit"
+ onClick="validateForm(this.form)" />
</div>
</form>
</div>
@@ -196,7 +198,7 @@
<span tal:condition="python:perms" tal:content="string:Select a User" /><br/>
- <select tal:omit-tag="python: not perms" class="homebase" name="userList" onChange="document.location = adminform.baseURL.value + '&user=' + adminform.userList.options[adminform.userList.selectedIndex].text">
+ <select tal:omit-tag="python: not perms" class="homebase" name="userList" onChange="document.location = this.form.baseURL.value + '&user=' + this.form.userList.options[this.form.userList.selectedIndex].text">
<tal:block tal:repeat="user python:perms">
<option class="homebase"
tal:content="python:user"
@@ -250,12 +252,14 @@
tal:attributes="value python: num_clusters + 1" />
<div class="hbSubmit" id="hbSubmit">
- <input type="button" name="Update Permissions" value="Update Permissions" onClick="validateForm(document.adminform);" />
+ <input type="button" name="Update Permissions" value="Update Permissions"
+ onClick="validateForm(this.form)" />
</div>
</form>
<div tal:condition="python: blankForm">
- <p>Either no users have been added or no clusters or storage systems are being managed by Luci.</p>
+ <p>Either no users have been added or no clusters
+ or storage systems are managed by Luci.</p>
</div>
</div>
@@ -287,93 +291,191 @@
set_page_title('Luci ??? homebase ??? Remove a system or cluster from Luci');
</script>
- <span tal:omit-tag=""
- tal:define="global systems python:here.getSystems();
- global blankForm python:1;
- global num_clusters python:-1;
- global num_systems python:-1"
- />
-
<h2 class="homebase">Manage Systems and Clusters</h2>
<h3>Authenticate to Storage or Cluster Systems</h3>
<form name="authform" method="post" action="">
- <input type="hidden" name="pagetype" value="8" />
- <table id="systemsTable" class="systemsTable" border="0" cellspacing="0">
- <thead class="systemsTable">
- <tr class="systemsTable">
- <th class="systemsTable">System Hostname</th>
- <th class="systemsTable">Root Password</th>
- </tr>
- </thead>
+ <table id="systemsTable" class="systemsTable" border="0" cellspacing="0"
+ tal:define="
+ new_systems request/SESSION/auth_systems | nothing;
+ global cur_sysnum python: 1">
- <tfoot class="systemsTable">
- <tr class="systemsTable"><td colspan="2" class="systemsTable">
- <div id="allSameDiv" class="invisible">
- <input type="checkbox" class="allSameCheckBox" name="allSameCheckBox" id="allSameCheckBox" onClick="allPasswdsSame(this.form);"/><span>Check if storage system passwords are identical.</span>
- </div>
- </td></tr>
-
- <tr class="systemsTable"><td class="systemsTable" colspan="2">
- <div class="systemsTableEnd">
- <input type="button" value="Add another entry" onClick="addSystem(this.form);" />
- </div>
- </td></tr>
- </tfoot>
+ <tal:block tal:condition="not: new_systems">
+ <thead class="systemsTable">
+ <tr class="systemsTable">
+ <th class="systemsTable">System Hostname</th>
+ <th class="systemsTable">Root Password</th>
+ <th class="systemsTable"></th>
+ </tr>
+ </thead>
+
+ <tbody class="systemsTable">
+ <tr class="systemsTable" id="__SYSTEM_ROW_0">
+ <td class="systemsTable">
+ <input class="hbInputSys" type="text"
+ id="__SYSTEM0:Addr" name="__SYSTEM0:Addr" />
+ </td>
+ <td class="systemsTable">
+ <input type="password"
+ autocomplete="off"
+ id="__SYSTEM0:Passwd"
+ name="__SYSTEM0:Passwd"
+ class="hbInputPass"
+ onChange="pwd0Change(this.form)" />
+ </td>
+ <td class="systemsTable">
+ <img src="/luci/delete-row.png" class="deleteRow"
+ title="delete this row"
+ onclick="delete_element_id('__SYSTEM_ROW_0')" />
+ </td>
+ </tr>
+ </tbody>
+ </tal:block>
- <tbody class="systemsTable">
- <tr class="systemsTable">
- <td class="systemsTable">
- <input class="hbInputSys" type="text"
- id="__SYSTEM0:Addr" name="__SYSTEM0:Addr" />
- </td>
- <td class="systemsTable">
- <input type="password" autocomplete="off"
- id="__SYSTEM0:Passwd" name="__SYSTEM0:Passwd"
- class="hbInputPass"
- onChange="pwd0Change(this.form);" />
- </td>
- </tr>
+ <tal:block tal:condition="new_systems">
+ <thead class="systemsTable">
+ <tr class="systemsTable">
+ <th class="systemsTable">System Hostname</th>
+ <th class="systemsTable">Root Password</th>
+ <th class="systemsTable">Key ID</th>
+ <th class="systemsTable">Trust</th>
+ <th class="systemsTable"></th>
+ </tr>
+ </thead>
+ <tal:block tal:define="global cur_sysnum python: 0" />
- <tal:block tal:define="global numsys python: 0" />
+ <tbody class="systemsTable">
+ <tal:block tal:repeat="cur_sys new_systems">
+ <tr class="systemsTable"
+ tal:attributes="
+ id python: '__SYSTEM_ROW_%d' % cur_sysnum"
+ tal:define="sys python: new_systems[cur_sys]">
- <tal:block tal:repeat="s python:systems[2]">
- <tal:block tal:define="global numsys python: numsys + 1" />
- <tr class="systemsTable">
<td class="systemsTable">
<input class="hbInputSys" type="text"
tal:attributes="
- id python: '__SYSTEM' + str(numsys) + ':Addr';
- name python: '__SYSTEM' + str(numsys) + ':Addr'" />
+ id python: '__SYSTEM%d:Addr' % cur_sysnum;
+ name python: '__SYSTEM%d:Addr' % cur_sysnum;
+ value sys/host | nothing" />
</td>
-
<td class="systemsTable">
- <input type="password" autocomplete="off"
- onChange="pwd0Change(this.form);"
+ <input type="password"
+ autocomplete="off"
class="hbInputPass"
+ onChange="pwd0Change(this.form)"
+ tal:attributes="
+ id python: '__SYSTEM%d:Passwd' % cur_sysnum;
+ name python: '__SYSTEM%d:Passwd' % cur_sysnum;
+ value sys/passwd | nothing" />
+ </td>
+ <td class="systemsTable">
+ <img
tal:attributes="
- id python: '__SYSTEM' + str(numsys) + ':Password';
- name python: '__SYSTEM' + str(numsys) + ':Password'" />
+ src python: 'trusted' in sys and '/luci/lock-ok.png' or ('fp' in sys and '/luci/lock-closed.png' or '/luci/lock-open.png');
+ title sys/fp | string:no key fingerprint available"
+ />
+ <input type="hidden"
+ tal:attributes="
+ id python: '__SYSTEM%dFingerprint' % cur_sysnum;
+ name python: '__SYSTEM%dFingerprint' % cur_sysnum;
+ value sys/fp | nothing" />
+ </td>
+ <td class="systemsTable">
+ <input type="checkbox" checked tal:attributes="
+ id python: '__SYSTEM%dTrusted' % cur_sysnum;
+ name python: '__SYSTEM%dTrusted' % cur_sysnum;
+ disabled python: 'trusted' in sys"
+ />
+ </td>
+ <td class="systemsTable">
+ <img src="/luci/delete-row.png" class="deleteRow"
+ title="delete this row"
+ tal:attributes="onclick python:'delete_element_id(\'__SYSTEM_ROW_%d\')' % cur_sysnum" />
</td>
</tr>
+ <tal:block
+ tal:define="global cur_sysnum python: cur_sysnum + 1" />
</tal:block>
</tbody>
+ <tal:block
+ tal:define="
+ x python: request.SESSION.delete('auth_systems')" />
+ </tal:block>
+
+ <tfoot class="systemsTable">
+ <tr class="systemsTable"><td colspan="2" class="systemsTable">
+ <ul class="vanilla">
+ <li class="vanilla"><input name="check_certs" type="checkbox">View system certificates before sending any passwords.</li>
+ <li class="vanilla"
+ tal:attributes="id python: cur_sysnum < 2 and 'allSameDiv' or ''">
+ <input type="checkbox" name="allSameCheckBox"
+ id="allSameCheckBox" onClick="allPasswdsSame(this.form)" />
+ Check if system passwords are identical.
+ </li>
+ </ul>
+ </td></tr>
+
+ <tr class="systemsTable"><td class="systemsTable" colspan="2">
+ <div class="systemsTableEnd">
+ <input type="button" value="Add another entry"
+ onClick="addSystem(this.form)" />
+ </div>
+ </td></tr>
+ </tfoot>
</table>
- <input type="hidden" name="numStorage" value="1" />
+ <input name="numStorage" id="numStorage" type="hidden"
+ tal:attributes="value cur_sysnum | string:1" />
+
+ <input type="hidden" name="pagetype" value="8" />
<div class="hbSubmit" id="hbSubmit">
<input type="button" name="Submit" value="Submit"
onClick="validateAuth(this.form)" />
</div>
+
+ <tal:block tal:condition="exists: request/SESSION/auth_status">
+ <div class="retmsgs" id="auth_retmsgsdiv"
+ tal:condition="exists: request/SESSION/auth_status/messages">
+ <div class="hbclosebox">
+ <a href="javascript:hide_element('auth_retmsgsdiv');"><img src="x.png" class="closeBox" title="dismiss"></a>
+ </div>
+ <p class="retmsgs">Status messages:</p>
+ <ul class="statusmsg">
+ <tal:block tal:repeat="e request/SESSION/auth_status/messages">
+ <li class="statusmsg" tal:content="e" />
+ </tal:block>
+ </ul>
+ </div>
+ <div class="errmsgs" id="auth_errmsgsdiv"
+ tal:condition="exists: request/SESSION/auth_status/errors">
+ <div class="hbclosebox">
+ <a href="javascript:hide_element('auth_errmsgsdiv');"><img src="x.png" class="closeBox" title="dismiss"></a>
+ </div>
+ <p class="errmsgs">The following errors occurred:</p>
+ <ul class="statusmsg">
+ <tal:block tal:repeat="e request/SESSION/auth_status/errors">
+ <li class="statusmsg" tal:content="e" />
+ </tal:block>
+ </ul>
+ </div>
+ <tal:block
+ tal:define="x python: request.SESSION.delete('auth_status')" />
+ <div class="padding"> </div>
+ </tal:block>
</form>
+ <tal:block tal:define="
+ global systems python:here.getSystems();
+ global blankForm python:1;
+ global num_clusters python:-1;
+ global num_systems python:-1" />
+
<form name="adminform" method="post" action=""
tal:condition="python:(systems[0] and len(systems[0]) > 0) or (systems[1] and len(systems[1]) > 0)">
- <span tal:omit-tag="" tal:define="global blankForm python:0" />
-
+ <tal:block tal:define="global blankForm python:0" />
<input type="hidden" name="pagetype"
tal:attributes="value request/form/pagetype | request/pagetype | nothing" />
@@ -425,19 +527,20 @@
</tal:block>
</div>
- <input type="hidden" id="numStorage"
+ <input type="hidden" id="num_storage"
tal:attributes="value python: num_systems + 1" />
- <input type="hidden" id="numClusters"
+ <input type="hidden" id="num_clusters"
tal:attributes="value python: num_clusters + 1" />
- <div class="hbSubmit" id="hbSubmit">
- <input type="button" name="Submit" value="Remove Selected Systems" onClick="validateForm(document.adminform);" />
+ <div class="hbSubmit">
+ <input type="button" name="Submit" value="Remove selected entries"
+ onClick="validateForm(this.form)" />
</div>
</form>
<div tal:condition="python: blankForm">
- <p>No clusters or storage systems are currently being managed by Luci.</p>
+ <p>No clusters or storage systems are currently managed by Luci.</p>
</div>
</div>
@@ -476,51 +579,141 @@
<input name="pagetype" type="hidden"
tal:attributes="value request/form/pagetype | request/pagetype | nothing" />
- <input name="numStorage" id="numStorage" type="hidden" value="1" />
-
<input name="absoluteURL" type="hidden"
tal:attributes="value python:data['children'][data['curIndex']]['absolute_url']" />
- <table id="systemsTable" class="systemsTable" border="0" cellspacing="0">
- <thead class="systemsTable">
- <tr class="systemsTable">
- <th class="systemsTable">System Hostname</th>
- <th class="systemsTable">Root Password</th>
- </tr>
- </thead>
+ <table id="systemsTable" class="systemsTable" border="0" cellspacing="0"
+ tal:define="
+ new_systems request/SESSION/add_systems | nothing;
+ global cur_sysnum python: 1">
+
+ <tal:block tal:condition="not: new_systems">
+ <thead class="systemsTable">
+ <tr class="systemsTable">
+ <th class="systemsTable">System Hostname</th>
+ <th class="systemsTable">Root Password</th>
+ <th class="systemsTable"></th>
+ </tr>
+ </thead>
+
+ <tbody class="systemsTable">
+ <tr class="systemsTable" id="__SYSTEM_ROW_0">
+ <td class="systemsTable">
+ <input class="hbInputSys" type="text"
+ id="__SYSTEM0:Addr" name="__SYSTEM0:Addr" />
+ </td>
+ <td class="systemsTable">
+ <input type="password"
+ autocomplete="off"
+ id="__SYSTEM0:Passwd"
+ name="__SYSTEM0:Passwd"
+ class="hbInputPass"
+ onChange="pwd0Change(this.form)" />
+ </td>
+ <td class="systemsTable">
+ <img src="/luci/delete-row.png" class="deleteRow"
+ title="delete this row"
+ onclick="delete_element_id('__SYSTEM_ROW_0')" />
+ </td>
+ </tr>
+ </tbody>
+ </tal:block>
+
+ <tal:block tal:condition="new_systems">
+ <thead class="systemsTable">
+ <tr class="systemsTable">
+ <th class="systemsTable">System Hostname</th>
+ <th class="systemsTable">Root Password</th>
+ <th class="systemsTable">Key ID</th>
+ <th class="systemsTable">Trust</th>
+ <th class="systemsTable"></th>
+ </tr>
+ </thead>
+ <tal:block tal:define="global cur_sysnum python: 0" />
+
+ <tbody class="systemsTable">
+ <tal:block tal:repeat="cur_sys new_systems">
+ <tr class="systemsTable"
+ tal:attributes="
+ id python: '__SYSTEM_ROW_%d' % cur_sysnum"
+ tal:define="sys python: new_systems[cur_sys]">
+
+ <td class="systemsTable">
+ <input class="hbInputSys" type="text"
+ tal:attributes="
+ id python: '__SYSTEM%d:Addr' % cur_sysnum;
+ name python: '__SYSTEM%d:Addr' % cur_sysnum;
+ value sys/host | nothing" />
+ </td>
+ <td class="systemsTable">
+ <input type="password"
+ autocomplete="off"
+ class="hbInputPass"
+ onChange="pwd0Change(this.form)"
+ tal:attributes="
+ id python: '__SYSTEM%d:Passwd' % cur_sysnum;
+ name python: '__SYSTEM%d:Passwd' % cur_sysnum;
+ value sys/passwd | nothing" />
+
+ </td>
+ <td class="systemsTable">
+ <img
+ tal:attributes="
+ src python: 'trusted' in sys and '/luci/lock-ok.png' or ('fp' in sys and '/luci/lock-closed.png' or '/luci/lock-open.png');
+ title sys/fp | string:no key fingerprint available"
+ />
+ <input type="hidden"
+ tal:attributes="
+ id python: '__SYSTEM%dFingerprint' % cur_sysnum;
+ name python: '__SYSTEM%dFingerprint' % cur_sysnum;
+ value sys/fp | nothing" />
+ </td>
+ <td class="systemsTable">
+ <input type="checkbox" checked tal:attributes="
+ id python: '__SYSTEM%dTrusted' % cur_sysnum;
+ name python: '__SYSTEM%dTrusted' % cur_sysnum;
+ disabled python: 'trusted' in sys"
+ />
+ </td>
+ <td class="systemsTable">
+ <img src="/luci/delete-row.png" class="deleteRow"
+ title="delete this row"
+ tal:attributes="onclick python:'delete_element_id(\'__SYSTEM_ROW_%d\')' % cur_sysnum" />
+ </td>
+ </tr>
+ <tal:block
+ tal:define="global cur_sysnum python: cur_sysnum + 1" />
+ </tal:block>
+ </tbody>
+ <tal:block
+ tal:define="
+ x python: request.SESSION.delete('add_systems')" />
+ </tal:block>
<tfoot class="systemsTable">
<tr class="systemsTable"><td colspan="2" class="systemsTable">
- <div id="allSameDiv">
- <input type="checkbox" class="allSameCheckBox" name="allSameCheckBox" id="allSameCheckBox" onClick="allPasswdsSame(adminform);"/><span>Check if storage system passwords are identical.</span>
- </div>
+ <ul class="vanilla">
+ <li class="vanilla"><input name="check_certs" type="checkbox">View system certificates before sending any passwords.</li>
+ <li class="vanilla"
+ tal:attributes="id python: cur_sysnum < 2 and 'allSameDiv' or ''"><input type="checkbox" name="allSameCheckBox" id="allSameCheckBox" onClick="allPasswdsSame(this.form);"/>Check if storage system passwords are identical.</li>
+ </ul>
</td></tr>
<tr class="systemsTable"><td class="systemsTable" colspan="2">
<div class="systemsTableEnd">
- <input type="button" value="Add another entry" onClick="addSystem(adminform);" />
+ <input type="button" value="Add another entry"
+ onClick="addSystem(this.form)" />
</div>
</td></tr>
</tfoot>
-
- <tbody class="systemsTable">
- <tr class="systemsTable">
- <td class="systemsTable">
- <input class="hbInputSys" type="text"
- id="__SYSTEM0:Addr" name="__SYSTEM0:Addr" />
- </td>
- <td class="systemsTable">
- <input type="password" autocomplete="off"
- id="__SYSTEM0:Passwd" name="__SYSTEM0:Passwd"
- class="hbInputPass"
- onChange="pwd0Change(adminform);" />
- </td>
- </tr>
- </tbody>
</table>
+ <input name="numStorage" id="numStorage" type="hidden"
+ tal:attributes="value cur_sysnum | string:1" />
+
<div class="hbSubmit" id="hbSubmit">
- <input type="button" name="Submit" value="Submit" onClick="validateForm(document.adminform);" />
+ <input type="button" name="Submit" value="Submit"
+ onClick="validateForm(this.form)" />
</div>
</form>
</div>
@@ -550,95 +743,147 @@
set_page_title('Luci ??? homebase ??? Add a running cluster to be managed by Luci');
</script>
- <tal:block tal:define="
- global sessionObj python:request.SESSION.get('checkRet')" />
-
<h2 class="homebase">Add Cluster</h2>
+ <tal:block tal:define="
+ global add_cluster request/SESSION/add_cluster | nothing" />
+
<form name="adminform" action="" method="post"
- tal:condition="python: sessionObj and len(sessionObj)">
+ tal:condition="add_cluster">
+
<input name="pagetype" type="hidden"
tal:attributes="value request/form/pagetype | request/pagetype | nothing" />
<input name="absoluteURL" type="hidden"
tal:attributes="value python:data['children'][data['curIndex']]['absolute_url']" />
+ <input name="pass" type="hidden"
+ tal:attributes="value add_cluster/pass | string:0" />
+
+ <input name="cluster_os" type="hidden"
+ tal:attributes="value add_cluster/cluster_os | string:rhel5" />
+
<table id="systemsTable" class="systemsTable" border="0" cellspacing="0">
<thead class="systemsTable">
<tr class="systemsTable"><td class="systemsTable" colspan="2">
<div class="systemsTableTop">
- <strong>Cluster Name:</strong> <span tal:replace="python: sessionObj['requestResults']['clusterName']" />
- <input type="hidden" type="text" id="clusterName" name="clusterName" tal:attributes="value python: sessionObj['requestResults']['clusterName']" />
+ <strong class="cluster_name">Cluster Name:
+ <span tal:replace="add_cluster/name | string:[unknown]" />
+ </strong>
+ <input type="hidden" id="clusterName" name="clusterName"
+ tal:attributes="value add_cluster/name | nothing" />
</div>
</td></tr>
+
<tr class="systemsTable">
<th class="systemsTable">Node Hostname</th>
<th class="systemsTable">Root Password</th>
+ <th class="systemsTable">Key ID</th>
+ <th class="systemsTable">Trust</th>
</tr>
+
</thead>
<tfoot class="systemsTable">
<tr class="systemsTable"><td colspan="2" class="systemsTable">
- <div tal:condition="python: not 'isComplete' in sessionObj['requestResults'] or not sessionObj['requestResults']['isComplete'] or ('errors' in sessionObj and len(sessionObj['errors']) > 0)">
- <input type="checkbox" name="allSameCheckBox" id="allSameCheckBox" onClick="allPasswdsSame(adminform);"/> Check if cluster node passwords are identical.
- </div>
- <div class="systemsTable"
- tal:condition="python: 'isComplete' in sessionObj['requestResults'] and sessionObj['requestResults']['isComplete']"> </div>
+ <ul class="vanilla">
+ <li class="vanilla">
+ <input name="check_certs" type="checkbox"
+ tal:attributes="checked python: add_cluster['check_certs'] and 'checked'" />
+ View system certificates before sending any passwords.
+ </li>
+ <li class="vanilla" id="allSameDiv">
+ <li class="vanilla" tal:condition="not: exists: add_cluster/complete">
+ <input type="checkbox" name="allSameCheckBox"
+ id="allSameCheckBox" onClick="allPasswdsSame(this.form)"
+ tal:attributes="checked python: add_cluster['identical_passwds'] and 'checked'"
+ />
+
+ Check if node passwords are identical.
+ </li>
+ <li class="vanilla" tal:condition="python: add_cluster['pass'] > 0 and 'incomplete' in add_cluster">
+ <input type="checkbox" name="asis">
+ Add the cluster to Luci as-is.<br>
+ Any nodes that are not authenticated will need to be authenticated later.
+ </li>
+ </ul>
+ <br/>
</td></tr>
</tfoot>
- <span tal:omit-tag=""
- tal:define="global sysNum python: 0"
- />
-
- <tbody class="systemsTable" tal:condition="python: 'nodeList' in sessionObj['requestResults']">
- <tal:block tal:repeat="node python: sessionObj['requestResults']['nodeList']">
- <span tal:omit-tag=""
- tal:define="global nodeAuth python: node['cur_auth']" />
+ <tal:block tal:define="global cur_sysnum python:0" />
- <tr class="systemsTable">
+ <tbody class="systemsTable" tal:condition="add_cluster/nodes">
+ <tal:block tal:repeat="cur_sys add_cluster/nodes">
+ <tr class="systemsTable"
+ tal:define="sys python: add_cluster['nodes'][cur_sys]">
<td class="systemsTable">
<input type="text"
tal:attributes="
- id python: '__SYSTEM' + str(sysNum) + ':Addr';
- name python: '__SYSTEM' + str(sysNum) + ':Addr';
- value python: node['host'];
- class python: 'hbInputSys' + ('errors' in node and ' error' or '');
- disabled python: (nodeAuth and node['host'].count('.') > 0) and 1 or 0"
+ value sys/host | nothing;
+ id python: '__SYSTEM%d:Addr' % cur_sysnum;
+ name python: '__SYSTEM%d:Addr' % cur_sysnum;
+ class python: 'hbInputSys' + ('errors' in sys and ' error' or '');
+ disabled python: ('auth' in sys and sys['host'].count('.') > 0) and 1 or 0"
/>
</td>
<td class="systemsTable">
- <input onChange="pwd0Change(adminform);"
+ <tal:block tal:condition="not: exists: sys/auth">
+ <input type="password"
+ autocomplete="off"
+ onChange="pwd0Change(this.form)"
+ tal:attributes="
+ value sys/passwd | nothing;
+ class python: 'hbInputPass' + ('errors' in sys and ' error' or '');
+ id python: '__SYSTEM%d:Passwd' % cur_sysnum;
+ name python: '__SYSTEM%d:Passwd' % cur_sysnum" />
+ </tal:block>
+
+ <tal:block tal:condition="exists: sys/auth">
+ <input type="text" onChange="pwd0Change(this.form)"
+ disabled="disabled" value="[authenticated]"
+ tal:attributes="
+ class python: 'hbInputPass' + ('errors' in sys and ' error' or '');
+ id python: '__SYSTEM%d:Passwd' % cur_sysnum;
+ name python: '__SYSTEM%d:Passwd' % cur_sysnum" />
+ </tal:block>
+ </td>
+ <td class="systemsTable">
+ <img
tal:attributes="
- type python: nodeAuth and 'text' or 'password';
- value python: nodeAuth and '[authenticated]' or '';
- class python: 'hbInputPass' + ('errors' in node and ' error' or '');
- id python: '__SYSTEM' + str(sysNum) + ':Passwd';
- name python: '__SYSTEM' + str(sysNum) + ':Passwd';
- disabled python: nodeAuth and 1 or 0"
+ src python: 'trusted' in sys and '/luci/lock-ok.png' or ('fp' in sys and '/luci/lock-closed.png' or '/luci/lock-open.png');
+ title sys/fp | string:no key fingerprint available" />
+ <input type="hidden"
+ tal:attributes="
+ id python: '__SYSTEM%dFingerprint' % cur_sysnum;
+ name python: '__SYSTEM%dFingerprint' % cur_sysnum;
+ value sys/fp | nothing" />
+ </td>
+ <td class="systemsTable">
+ <input type="checkbox" tal:attributes="
+ checked python: add_cluster['pass'] > 0;
+ id python: '__SYSTEM%dTrusted' % cur_sysnum;
+ name python: '__SYSTEM%dTrusted' % cur_sysnum;
+ disabled python: 'trusted' in sys"
/>
</td>
</tr>
- <span tal:omit-tag=""
- tal:define="global sysNum python: sysNum + 1"
- />
- </tal:block>
+ <tal:block tal:define="global cur_sysnum python: cur_sysnum + 1" />
+ </tal:block>
</tbody>
</table>
<input name="numStorage" id="numStorage" type="hidden"
- tal:attributes="value python: sysNum" />
+ tal:attributes="value cur_sysnum" />
<div class="hbSubmit" id="hbSubmit">
- <input type="button" name="Submit" value="Add This Cluster" onClick="validateForm(document.adminform);" />
+ <input type="button" name="Submit" value="Add This Cluster"
+ onClick="validateForm(this.form)" />
</div>
</form>
- <div tal:condition="python: not sessionObj or not len(sessionObj)">
- <span class="error">
- A data integrity error has occurred. Please attempt to add this cluster to the Luci management interface again.
- </span>
- <tal:block tal:define="nop python:here.abortManageCluster(request)" />
+ <div tal:condition="add_cluster">
+ <tal:block tal:define="x python: request.SESSION.delete('add_cluster')" />
</div>
</div>
@@ -675,19 +920,26 @@
<p class="hbText">Enter one node from the cluster you wish to add to the Luci management interface.</p>
- <table id="systemsTable" class="systemsTable" border="0" cellspacing="0">
+ <table id="systemsTable" class="systemsTable" border="0" cellspacing="0"
+ tal:define="cur_sys request/SESSION/add_cluster_initial | nothing">
+
<thead class="systemsTable">
<tr class="systemsTable">
<th class="systemsTable">System Hostname</th>
<th class="systemsTable">Root Password</th>
+ <tal:block tal:condition="cur_sys">
+ <th>Key Id</th>
+ <th>Trust</th>
+ </tal:block>
</tr>
</thead>
<tfoot class="systemsTable">
<tr class="systemsTable"><td colspan="2" class="systemsTable">
- <div class="hbcheckdiv">
- <input type="checkbox" name="allSameCheckBox" id="allSameCheckBox" /> Attempt to authenticate to all cluster nodes using the password provided above.
- </div>
+ <ul class="vanilla">
+ <li class="vanilla"><input name="check_certs" type="checkbox">View system certificates before sending any passwords.</li>
+ <li class="vanilla"><input type="checkbox" name="allSameCheckBox" id="allSameCheckBox" onClick="allPasswdsSame(this.form);"/>Authenticate to all cluster nodes using the password provided above.</li>
+ </ul>
</td></tr>
</tfoot>
@@ -695,21 +947,42 @@
<tr class="systemsTable">
<td class="systemsTable">
<input class="hbInputSys" type="text"
- id="__SYSTEM0:Addr" name="__SYSTEM0:Addr" />
+ id="__SYSTEM0:Addr" name="__SYSTEM0:Addr"
+ tal:attributes="
+ value cur_sys/host | nothing" />
</td>
<td class="systemsTable">
- <input type="password" autocomplete="off"
+ <input class="hbInputPass" type="password"
+ onChange="pwd0Change(this.form)"
+ autocomplete="off"
id="__SYSTEM0:Passwd" name="__SYSTEM0:Passwd"
- class="hbInputPass" />
+ tal:attributes="
+ value cur_sys/passwd | nothing" />
</td>
+ <tal:block tal:condition="cur_sys">
+ <td class="systemsTable">
+ <img tal:attributes="
+ title sys/fp | string:no key fingerprint available;
+ src python: 'trusted' in cur_sys and '/luci/lock-ok.png' or ('fp' in cur_sys and '/luci/lock-closed.png' or '/luci/lock-open.png')"
+ />
+ </td>
+ <td class="systemsTable">
+ <input type="checkbox" name="host_is_trusted" checked="checked" />
+ </td>
+ </tal:block>
</tr>
</tbody>
+ <tal:block tal:condition="cur_sys">
+ <tal:block
+ tal:define="x python: request.SESSION.delete('add_cluster_initial')" />
+ </tal:block>
</table>
<input type="hidden" name="numStorage" value="1" />
<div class="hbSubmit" id="hbSubmit">
- <input type="button" name="Submit" value="Submit" onClick="validateForm(document.adminform);" />
+ <input type="button" name="Submit" value="Submit"
+ onClick="validateForm(this.form)" />
</div>
</form>
</div>
--- conga/luci/homebase/homebase_common.js 2006/11/03 19:13:57 1.14
+++ conga/luci/homebase/homebase_common.js 2006/12/21 05:08:48 1.15
@@ -139,22 +139,40 @@
var num_systems = form.numStorage.value;
var state = cb.checked;
- var passwd = document.getElementById('__SYSTEM0:Passwd');
- if (!passwd || passwd.type != 'password')
+
+ var first_passwd = null;
+ var first_system = 0;
+ for (var i = 0 ; i < num_systems ; i++) {
+ var passwd = document.getElementById('__SYSTEM' + i + ':Passwd');
+ if (!passwd || passwd.type != 'password')
+ continue
+ first_passwd = passwd.value;
+ first_system = i;
+ break;
+ }
+
+ if (first_passwd === null)
return (-1);
- passwd = passwd.value;
- if (!passwd || !state)
- passwd = '';
- for (var i = 1 ; i < num_systems ; i++) {
+ if (!first_passwd || !state)
+ first_passwd = '';
+
+ for (var i = first_system + 1 ; i < num_systems ; i++) {
var element = document.getElementById('__SYSTEM' + i + ':Passwd');
if (element && element.type == 'password') {
- element.value = passwd;
+ element.value = first_passwd;
element.disabled = state;
}
}
}
+function delete_element_id(id_str) {
+ var elem = document.getElementById(id_str);
+ if (!elem || !elem.parentNode)
+ return (-1);
+ elem.parentNode.removeChild(elem);
+}
+
function pwd0Change(form) {
var element = document.getElementById('allSameCheckBox');
if (element && element.checked)
@@ -182,23 +200,43 @@
newsysp.setAttribute('value', '');
newsysp.setAttribute('autocomplete', 'off');
+ var first_passwd = '';
+ for (var i = 0 ; i < num_systems - 1 ; i++) {
+ var pwd = document.getElementById('__SYSTEM' + i + ':Passwd');
+ if (!pwd || pwd.type != 'password')
+ continue;
+ first_passwd = pwd.value;
+ break;
+ }
+
var allSameCB = document.getElementById('allSameCheckBox');
if (allSameCB && allSameCB.checked) {
- newsysp.setAttribute('value', document.getElementById('__SYSTEM0:Passwd').value);
+ newsysp.setAttribute('value', first_passwd);
newsysp.setAttribute('disabled', true);
}
var newrow = document.createElement('tr');
+ newrow.setAttribute('id', '__SYSTEM_ROW_' + num_systems);
newrow.className = 'systemsTable';
+
var hcol = document.createElement('td');
hcol.className = 'systemsTable';
var pcol = document.createElement('td');
pcol.className = 'systemsTable';
+ var dcol = document.createElement('td');
+ dcol.className = 'systemsTable';
+ var del_img = document.createElement('img');
+ del_img.src = '/luci/delete-row.png';
+ del_img.title = 'delete this row'
+ del_img.className = 'deleteRow'
+ del_img.setAttribute('onClick', 'delete_element_id(\'' + newrow.id + '\')');
+ dcol.appendChild(del_img);
hcol.appendChild(newsys);
pcol.appendChild(newsysp);
newrow.appendChild(hcol);
newrow.appendChild(pcol);
+ newrow.appendChild(dcol);
sltab.appendChild(newrow);
form.numStorage.value = ++num_systems;
--- conga/luci/homebase/index_html 2006/11/01 23:04:17 1.20
+++ conga/luci/homebase/index_html 2006/12/21 05:08:48 1.21
@@ -134,23 +134,24 @@
<div class="retmsgs" id="retmsgsdiv" tal:condition="python:(ret and 'messages' in ret and len(ret['messages']))">
<div class="hbclosebox">
- <a href="javascript:hide_element('retmsgsdiv');"><img src="x.png"></a>
+ <a href="javascript:hide_element('retmsgsdiv');"><img src="x.png" class="closeBox" title="dismiss"></a>
</div>
- <ul class="retmsgs">
+ <p class="retmsgs">Status messages:</p>
+ <ul class="statusmsg">
<tal:block tal:repeat="e python:ret['messages']">
- <li class="retmsgs" tal:content="python:e" />
+ <li class="statusmsg" tal:content="python:e" />
</tal:block>
</ul>
</div>
<div id="errmsgsdiv" class="errmsgs" tal:condition="python:(ret and 'errors' in ret and len(ret['errors']))">
<div class="hbclosebox">
- <a class="hbclosebox" href="javascript:hide_element('errmsgsdiv');"><img src="x.png"></a>
+ <a class="hbclosebox" href="javascript:hide_element('errmsgsdiv');"><img src="x.png" class="closeBox" title="dismiss"></a>
</div>
<p class="errmsgs">The following errors occurred:</p>
- <ul class="errmsgs">
+ <ul class="statusmsg">
<tal:block tal:repeat="e python:ret['errors']">
- <li class="errmsgs" tal:content="python:e" />
+ <li class="statusmsg" tal:content="python:e" />
</tal:block>
</ul>
</div>
--- conga/luci/homebase/luci_homebase.css 2006/12/01 14:56:54 1.30
+++ conga/luci/homebase/luci_homebase.css 2006/12/21 05:08:48 1.31
@@ -48,6 +48,8 @@
}
input.qdisk {
+ font-family: "Bitstream Vera Sans Mono", "DejaVu Sans Mono", monospace ! important;
+ font-size: 12px ! important;
padding: .2em;
}
@@ -81,6 +83,10 @@
margin-left: 0 ! important;
}
+ul.statusmsg, li.statusmsg {
+ color: black ! important;
+}
+
ul.deploy {
margin-bottom: +.5em;
}
@@ -153,7 +159,7 @@
color: green !important;
}
-p.errmsgs {
+p.errmsgs, p.retmsgs {
font-weight: 800;
}
@@ -163,7 +169,7 @@
border-width: 2px;
border-color: red;
margin-top: 2em;
- max-width: 700px;
+ max-width: 600px ! important;
}
div.retmsgs {
@@ -172,7 +178,7 @@
border-style: dotted;
border-width: 2px;
border-color: green;
- max-width: 700px;
+ max-width: 600px ! important;
}
div.hbCSystems {
@@ -208,6 +214,7 @@
table.systemsTable {
padding-left: +.5em;
background: #dee7ec;
+ max-width: 700px;
}
td.systemsTable {
@@ -250,8 +257,6 @@
}
img.qdel_img {
- height: 7px;
- width: 7px;
background: #dee7ec;
border: none;
}
@@ -415,6 +420,10 @@
color: blue ! important;
}
+img.deleteRow, img.closeBox {
+ cursor: pointer;
+}
+
*.running,
*.node_active {
color: green ! important;
--- conga/luci/homebase/validate_sys_remove.js 2006/10/16 20:46:46 1.2
+++ conga/luci/homebase/validate_sys_remove.js 2006/12/21 05:08:48 1.3
@@ -6,7 +6,7 @@
if (!form)
return (-1);
- var num_clusters = document.getElementById('numClusters').value;
+ var num_clusters = document.getElementById('num_clusters').value;
for (var i = 0 ; i < num_clusters ; i++) {
var element = document.getElementById('__CLUSTER' + i);
if (!element || !element.value || !element.checked)
@@ -14,7 +14,7 @@
selected_clusters.push(element.value);
}
- var num_storage = document.getElementById('numStorage').value;
+ var num_storage = document.getElementById('num_storage').value;
for (var i = 0 ; i < num_storage ; i++) {
var element = document.getElementById('__SYSTEM' + i);
if (!element || !element.value || !element.checked)
--- conga/luci/site/luci/Extensions/cluster_adapters.py 2006/12/20 22:06:49 1.190
+++ conga/luci/site/luci/Extensions/cluster_adapters.py 2006/12/21 05:08:49 1.191
@@ -5,7 +5,6 @@
from conga_constants import *
from ricci_bridge import *
from ricci_communicator import RicciCommunicator, RicciError, batch_status, extract_module_status
-from string import lower
import time
import Products.ManagedSystem
from Products.Archetypes.utils import make_uuid
@@ -24,9 +23,9 @@
from QuorumD import QuorumD
from Heuristic import Heuristic
from clusterOS import resolveOSType
-from FenceHandler import validateNewFenceDevice, FENCE_OPTS
+from FenceHandler import validateNewFenceDevice, FENCE_OPTS, validateFenceDevice
from GeneralError import GeneralError
-from homebase_adapters import nodeUnauth, nodeAuth, manageCluster, createClusterSystems, havePermCreateCluster, setNodeFlag, delNodeFlag, userAuthenticated, getStorageNode, getClusterNode, delCluster
+from homebase_adapters import manageCluster, createClusterSystems, havePermCreateCluster, setNodeFlag, delNodeFlag, userAuthenticated, getStorageNode, getClusterNode, delCluster, parseHostForm
from LuciSyslog import LuciSyslog
#Policy for showing the cluster chooser menu:
@@ -42,391 +41,519 @@
except:
pass
-def validateClusterNodes(request, sessionData, clusterName, numStorage):
- nodeList = list()
- nodeHash = {}
- rnodeHash = {}
- oldNodeHash = {}
- oldRnodeHash = {}
- requestResults = {}
- errors = list()
+def buildClusterCreateFlags(self, batch_map, clusterName):
+ path = str(CLUSTER_FOLDER_PATH + clusterName)
- if sessionData and 'requestResults' in sessionData:
- requestResults = sessionData['requestResults']
- if 'nodeHash' in requestResults:
- oldNodeHash = requestResults['nodeHash']
- if 'rnodeHash' in requestResults:
- oldRnodeHash = requestResults['rnodeHash']
+ try:
+ clusterfolder = self.restrictedTraverse(path)
+ except Exception, e:
+ luci_log.debug_verbose('buildCCF0: no cluster folder@%s' % path)
+ return None
- i = 0
- while i < numStorage:
+ for key in batch_map.keys():
try:
- sysData = request.form['__SYSTEM' + str(i)]
- if not sysData or sysData[0] == '':
- raise
-
- if len(sysData) < 2 or sysData[1] == '':
- errors.append('No password was specified for host \"' + sysData[0] + '\"')
- raise
- except:
- i += 1
- continue
-
- if len(sysData) > 1:
- node = nodeAuth(None, sysData[0], sysData[1])
-
- if oldRnodeHash and node['ricci_host'] in oldRnodeHash:
- oldNode = oldRnodeHash[node['ricci_host']]
- elif oldNodeHash and node['host'] in nodeHash:
- oldNode = oldNodeHash[node['host']]
- else:
- oldNode = None
-
- if 'errors' in node:
- errors.append(node['errors'])
- node['errors'] = True
-
- if node['host'] in nodeHash or node['ricci_host'] in rnodeHash:
- node['errors'] = True
- errors.append('You added the node \"' + node['host'] + '\" more than once')
- else:
- if oldNode and 'prev_auth' in oldNode:
- node['prev_auth'] = oldNode['prev_auth']
-
- nodeHash[node['host']] = node
- rnodeHash[node['ricci_host']] = node
- nodeList.append(node)
- i += 1
-
- sfn = lambda x, y: \
- x['cur_auth'] - y['cur_auth'] or (('errors' in y) - ('errors' in x))
- nodeList.sort(sfn)
-
- dfn = lambda x: not 'cur_auth' in x or x['cur_auth'] != True
- cluster_properties = {
- 'clusterName': clusterName,
- 'nodeList': nodeList,
- 'nodeHash': nodeHash,
- 'rnodeHash': rnodeHash,
- 'isComplete': len(errors) < 1 and len(filter(dfn, nodeList)) == 0
- }
-
- return [errors, cluster_properties]
-
+ key = str(key)
+ batch_id = str(batch_map[key])
+ #This suffix needed to avoid name collision
+ objname = str(key + "____flag")
-def validateCreateCluster(self, request):
- errors = list()
- requestResults = {}
+ clusterfolder.manage_addProduct['ManagedSystem'].addManagedSystem(objname)
+ #now designate this new object properly
+ objpath = str(path + "/" + objname)
+ flag = self.restrictedTraverse(objpath)
- if not havePermCreateCluster(self):
- return (False, {'errors': ['You do not have sufficient rights to create a cluster.']})
+ flag.manage_addProperty(BATCH_ID, batch_id, "string")
+ flag.manage_addProperty(TASKTYPE, CLUSTER_ADD, "string")
+ flag.manage_addProperty(FLAG_DESC, "Creating node " + key + " for cluster " + clusterName, "string")
+ flag.manage_addProperty(LAST_STATUS, 0, "int")
+ except Exception, e:
+ luci_log.debug_verbose('buildCCF1: error creating flag for %s: %s' \
+ % (key, str(e)))
+def parseClusterNodes(self, request, cluster_os):
+ check_certs = False
try:
- sessionData = request.SESSION.get('checkRet')
+ check_certs = 'check_certs' in request.form
except:
- sessionData = None
-
- if not 'clusterName' in request.form or not request.form['clusterName']:
- return (False, {'errors': [ 'No cluster name was specified.' ]})
- clusterName = request.form['clusterName']
+ check_certs = False
+ download_pkgs = 1
try:
- numStorage = int(request.form['numStorage'])
+ download_pkgs = int(request.form['download_pkgs'].strip())
except:
- return (False, { 'errors': ['Unknown number of systems entered'], 'requestResults': requestResults })
-
- if numStorage < 1:
- return (False, { 'errors': ['A cluster must contain at least one node'], 'requestResults': requestResults })
-
- ret = validateClusterNodes(request, sessionData, clusterName, numStorage)
- errors.extend(ret[0])
- cluster_properties = ret[1]
+ download_pkgs = 1
- rhn_dl = 1
+ clusterName = None
try:
- rhn_dls = request.form['rhn_dl'].strip().lower()
- if rhn_dls != '1' and rhn_dls != 'true':
- rhn_dl = 0
+ clusterName = str(request.form['clusterName'])
except:
- rhn_dl = 0
+ clusterName = None
+
+ if clusterName is None:
+ luci_log.debug_verbose('PCN0: no cluster name was given')
+ return (False, { 'errors': [ 'No cluster name was given.' ]})
- enable_storage = 0
+ shared_storage = False
try:
- enable_storage_str = request.form['enable_storage'].strip().lower()
- if enable_storage_str:
- enable_storage = 1
+ shared_storage = request.form.has_key('enable_storage')
except:
- enable_storage = 0
+ shared_storage = False
+ same_node_passwds = False
try:
- nodeList = cluster_properties['nodeList']
- if len(nodeList) < 1:
- raise
+ same_node_passwds = 'allSameCheckBox' in request.form
except:
- errors.append('A cluster must contain@least one node')
+ same_node_passwds = False
- cluster_os = None
- try:
- cluster_os = nodeList[0]['os']
- if not cluster_os:
- raise KeyError('OS for ' + nodeList[0]['host'] + ' is blank')
- except KeyError, e:
- cluster_properties['isComplete'] = False
- errors.append('Unable to identify the operating system running on the first cluster node: ' + str(e))
+ add_cluster = { 'name': clusterName,
+ 'shared_storage': shared_storage,
+ 'download_pkgs': download_pkgs,
+ 'cluster_os': cluster_os,
+ 'identical_passwds': same_node_passwds,
+ 'check_certs': check_certs }
+
+ system_list, incomplete, errors, messages = parseHostForm(request, check_certs)
+ add_cluster['nodes'] = system_list
+
+ for i in system_list:
+ cur_system = system_list[i]
+
+ cur_host_trusted = 'trusted' in cur_system
+ cur_host = cur_system['host']
- if cluster_properties['isComplete'] != True:
- nodeUnauth(nodeList)
- return (False, {'errors': errors, 'requestResults':cluster_properties })
- else:
try:
- if len(filter(lambda x: x['os'] != cluster_os, nodeList[1:])) > 0:
- raise Exception('different operating systems were detected.')
+ cur_passwd = cur_system['passwd']
except:
- cluster_properties['isComplete'] = False
- errors.append('Cluster nodes must be running compatible operating systems.')
+ cur_passwd = None
- if cluster_properties['isComplete'] == True:
- batchNode = createClusterBatch(cluster_os,
- clusterName,
- clusterName,
- map(lambda x: x['host'], nodeList),
- True,
- True,
- enable_storage,
- False,
- rhn_dl)
-
- if not batchNode:
- nodeUnauth(nodeList)
- cluster_properties['isComplete'] = False
- errors.append('Unable to generate cluster creation ricci command')
- return (False, {'errors': errors, 'requestResults':cluster_properties })
-
- error = manageCluster(self, clusterName, nodeList)
- if error:
- nodeUnauth(nodeList)
- cluster_properties['isComplete'] = False
- errors.append(error)
- return (False, {'errors': errors, 'requestResults':cluster_properties })
-
- batch_id_map = {}
- rc = None
- for i in nodeList:
- success = True
+ if (cur_host_trusted or not check_certs) and cur_passwd:
try:
- rc = RicciCommunicator(i['host'])
- except RicciError, e:
- luci_log.debug('Unable to connect to the ricci agent on %s: %s'\
- % (i['host'], str(e)))
- success = False
+ rc = RicciCommunicator(cur_host, enforce_trust=True)
+ if not rc:
+ raise Exception, 'connection failed'
+ except Exception, e:
+ cur_system['errors'] = True
+ incomplete = True
+ errors.append('Unable to connect to %s: %s' \
+ % (cur_host, str(e)))
+ luci_log.debug_verbose('PCN1: %s: %s' % (cur_host, str(e)))
+ continue
+
+ prev_auth = rc.authed()
+ cur_system['prev_auth'] = prev_auth
+
+ try:
+ if prev_auth:
+ messages.append('Host %s is already authenticated.' \
+ % cur_host)
+ else:
+ rc.auth(cur_passwd)
+
+ if not rc.authed():
+ raise Exception, 'authentication failed'
except:
- success = False
+ cur_system['errors'] = True
+ incomplete = True
+ errors.append('Error authenticating to %s: %s' \
+ % (cur_host, str(e)))
+ luci_log.debug_verbose('PCN2: %s: %s' % (cur_host, str(e)))
+ continue
+
+ cur_cluster_info = rc.cluster_info()
+ if cur_cluster_info[0] or cur_cluster_info[1]:
+ cur_system['errors'] = True
+ incomplete = True
+
+ if cur_cluster_info[0]:
+ cur_cluster_name = cur_cluster_info[0]
+ elif cur_cluster_info[1]:
+ cur_cluster_name = cur_cluster_info[1]
- if success == True:
try:
- resultNode = rc.process_batch(batchNode, async=True)
- batch_id_map[i['host']] = resultNode.getAttribute('batch_id')
- except:
- success = False
+ if not cur_system['prev_auth']:
+ rc.unauth()
+ del cur_system['trusted']
+ except Exception, e:
+ luci_log.debug_verbose('PCN3: %s: %s' % (cur_host, str(e)))
+
+ errors.append('%s reports it is a member of cluster \"%s\"' \
+ % (cur_host, cur_cluster_name))
+ luci_log.debug_verbose('PCN4: %s: already in %s cluster' \
+ % (cur_host, cur_cluster_name))
+ continue
- if not success:
- nodeUnauth(nodeList)
- cluster_properties['isComplete'] = False
- errors.append('An error occurred while attempting to add cluster node \"' + i['host'] + '\"')
- return (False, {'errors': errors, 'requestResults':cluster_properties })
- buildClusterCreateFlags(self, batch_id_map, clusterName)
+ cur_host_os = resolveOSType(rc.os())
+ if cluster_os is None:
+ cluster_os = cur_host_os
+ add_cluster['cluster_os'] = cur_host_os
+
+ elif cluster_os != cur_host_os:
+ cur_system['errors'] = True
+ incomplete = True
- response = request.RESPONSE
- response.redirect(request['URL'] + "?pagetype=" + CLUSTER_CONFIG + "&clustername=" + clusterName + '&busyfirst=true')
+ try:
+ if not cur_system['prev_auth']:
+ rc.unauth()
+ del cur_system['trusted']
+ except Exception, e:
+ luci_log.debug_verbose('PCN5: %s: %s' % (cur_host, str(e)))
+
+ errors.append('The cluster software version on %s (%s) does not match the software on the other cluster nodes (%s)' % (cur_host, cur_host_os, cluster_os))
+ luci_log.debug_verbose('PCN6: version mismatch for %s: (%s vs. %s)' \
+ % (cur_host, cur_host_os, cluster_os))
+ continue
-def buildClusterCreateFlags(self, batch_map, clusterName):
- path = str(CLUSTER_FOLDER_PATH + clusterName)
+ return add_cluster, incomplete, errors, messages
+def validateCreateCluster(self, request):
try:
- clusterfolder = self.restrictedTraverse(path)
- except Exception, e:
- luci_log.debug_verbose('buildCCF0: no cluster folder at %s' % path)
- return None
+ request.SESSION.delete('create_cluster')
+ except:
+ pass
- for key in batch_map.keys():
- try:
- key = str(key)
- batch_id = str(batch_map[key])
- #This suffix needed to avoid name collision
- objname = str(key + "____flag")
+ cluster_os = None
+ try:
+ cluster_os = request.form['cluster_os'].strip()
+ if not cluster_os:
+ raise Exception, 'cluster OS is blank'
+ except:
+ cluster_os = None
- clusterfolder.manage_addProduct['ManagedSystem'].addManagedSystem(objname)
- #now designate this new object properly
- objpath = str(path + "/" + objname)
- flag = self.restrictedTraverse(objpath)
+ add_cluster, incomplete, errors, messages = parseClusterNodes(self, request, cluster_os)
+ clusterName = add_cluster['name']
- flag.manage_addProperty(BATCH_ID, batch_id, "string")
- flag.manage_addProperty(TASKTYPE, CLUSTER_ADD, "string")
- flag.manage_addProperty(FLAG_DESC, "Creating node " + key + " for cluster " + clusterName, "string")
- flag.manage_addProperty(LAST_STATUS, 0, "int")
+ if incomplete or len(errors) > 0:
+ request.SESSION.set('create_cluster', add_cluster)
+ return (False, { 'errors': errors, 'messages': messages })
+
+ node_list = add_cluster['nodes'].keys()
+ batchNode = createClusterBatch(add_cluster['cluster_os'],
+ clusterName,
+ clusterName,
+ node_list,
+ True,
+ True,
+ add_cluster['shared_storage'],
+ False,
+ add_cluster['download_pkgs'])
+
+ if not batchNode:
+ request.SESSION.set('create_cluster', add_cluster)
+ errors.append('Unable to generate cluster creation ricci command')
+ return (False, { 'errors': errors, 'messages': messages })
+
+ error = manageCluster(self, clusterName, add_cluster['nodes'], add_cluster['cluster_os'])
+ if error:
+ errors.append('Unable to create the cluster Luci database objects')
+ request.SESSION.set('create_cluster', add_cluster)
+ return (False, { 'errors': errors, 'messages': messages })
+
+ batch_id_map = {}
+ for i in node_list:
+ try:
+ rc = RicciCommunicator(i)
+ if not rc:
+ raise 'rc is None'
except Exception, e:
- luci_log.debug_verbose('buildCCF1: error creating flag for %s: %s' \
- % (key, str(e)))
+ msg = 'Unable to connect to the ricci agent on %s: %s' % (i, str(e))
+ errors.append(msg)
+ luci_log.debug_verbose(msg)
+ if len(batch_id_map) == 0:
+ request.SESSION.set('create_cluster', add_cluster)
+ return (False, { 'errors': errors, 'messages': messages })
+ continue
-def validateAddClusterNode(self, request):
- requestResults = {}
- errors = list()
+ try:
+ resultNode = rc.process_batch(batchNode, async=True)
+ batch_id_map[i] = resultNode.getAttribute('batch_id')
+ except:
+ errors.append('An error occurred while attempting to add cluster node \"%s\"' % i)
+ if len(batch_id_map) == 0:
+ request.SESSION.set('create_cluster', add_cluster)
+ return (False, { 'errors': errors, 'messages': messages })
+ continue
+ buildClusterCreateFlags(self, batch_id_map, clusterName)
+ response = request.RESPONSE
+ response.redirect(request['URL'] + "?pagetype=" + CLUSTER_CONFIG + "&clustername=" + clusterName + '&busyfirst=true')
+
+def validateAddClusterNode(self, request):
try:
- sessionData = request.SESSION.get('checkRet')
+ request.SESSION.delete('add_node')
except:
- sessionData = None
+ pass
- if 'clusterName' in request.form:
- clusterName = str(request.form['clusterName'])
- else:
- luci_log.debug_verbose('vACN00: no cluster name was given')
- return (False, {'errors': [ 'Cluster name is missing'], 'requestResults': requestResults })
+ check_certs = False
+ try:
+ check_certs = 'check_certs' in request.form
+ except:
+ check_certs = False
- rhn_dl = 1
+ download_pkgs = 1
try:
- rhn_dls = request.form['rhn_dl'].strip().lower()
- if rhn_dls != '1' and rhn_dls != 'true':
- rhn_dl = 0
+ download_pkgs = int(request.form['download_pkgs'].strip())
except:
- rhn_dl = 0
+ download_pkgs = 1
- enable_storage = 0
+ cluster_os = None
try:
- enable_storages = request.form['enable_storage'].strip().lower()
- if enable_storages:
- enable_storage = 1
+ cluster_os = request.form['cluster_os'].strip()
+ if not cluster_os:
+ raise Exception, 'cluster OS is blank'
except:
- enable_storage = 0
+ cluster_os = None
+ clusterName = None
try:
- numStorage = int(request.form['numStorage'])
- if numStorage < 1:
- raise Exception, 'no nodes were added'
- except Exception, e:
- luci_log.debug_verbose('vACN0: %s: %s' % (clusterName, str(e)))
- errors.append('You must specify at least one node to add to the cluster')
- return (False, {'errors': [ errors ], 'requestResults': requestResults })
+ clusterName = str(request.form['clusterName'])
+ except:
+ clusterName = None
+
+ if clusterName is None:
+ luci_log.debug_verbose('VACN0: no cluster name was given')
+ return (False, { 'errors': [ 'No cluster name was given.' ]})
+
+ if cluster_os is None:
+ cluster_folder = None
+ try:
+ cluster_folder = self.restrictedTraverse(str(CLUSTER_FOLDER_PATH + clusterName))
+ if not cluster_folder:
+ raise Exception, 'cluster DB object is missing'
+ except Exception, e:
+ luci_log.debug_verbose('VACN1: %s: %s' % (clusterName, str(e)))
+ return (False, { 'errors': [ 'The database object for %s is missing.' % clusterName ] })
+
+ try:
+ cluster_os = cluster_folder.manage_getProperty('cluster_os')
+ if not cluster_os:
+ raise Exception, 'cluster os is blank'
+ except Exception, e:
+ luci_log.debug_verbose('VACN2: %s: %s' % (clusterName, str(e)))
+ cluster_os = None
- ret = validateClusterNodes(request, sessionData, clusterName, numStorage)
- errors.extend(ret[0])
- cluster_properties = ret[1]
+ if cluster_os is None:
+ try:
+ cluster_ricci = getRicciAgent(self, clusterName)
+ cluster_os = resolveOSType(cluster_ricci.os())
+ except Exception, e:
+ luci_log.debug_verbose('VACN3: %s: %s' % (clusterName, str(e)))
+ cluster_os = None
+
+ if cluster_os is None:
+ luci_log.debug_verbose('Unable to determine cluster OS for %s' % clusterName)
+ return (False, { 'errors': [ 'Unable to determine the version of the cluster suite this cluster is running.' ] })
+ shared_storage = False
try:
- nodeList = cluster_properties['nodeList']
- if len(nodeList) < 1:
- raise Exception, 'no cluster nodes'
- except Exception, e:
- luci_log.debug_verbose('vACN1: %s: %s' % (clusterName, str(e)))
- errors.append('You must specify@least one valid node to add to the cluster')
+ shared_storage = request.form.has_key('enable_storage')
+ except:
+ shared_storage = False
- clusterObj = None
+ same_node_passwds = False
try:
- clusterObj = self.restrictedTraverse(PLONE_ROOT + '/systems/cluster/' + clusterName)
- cluster_os = clusterObj.manage_getProperty('cluster_os')
- if not cluster_os:
- raise Exception, 'no cluster OS was found in DB for %s' % clusterName
- except Exception, e:
- luci_log.debug_verbose('vACN2: %s: %s' % (clusterName, str(e)))
+ same_node_passwds = 'allSameCheckBox' in request.form
+ except:
+ same_node_passwds = False
+
+ add_cluster = { 'name': clusterName,
+ 'shared_storage': shared_storage,
+ 'download_pkgs': download_pkgs,
+ 'cluster_os': cluster_os,
+ 'identical_passwds': same_node_passwds,
+ 'check_certs': check_certs }
+
+ system_list, incomplete, errors, messages = parseHostForm(request, check_certs)
+ add_cluster['nodes'] = system_list
+
+ for i in system_list:
+ cur_system = system_list[i]
+
+ cur_host_trusted = 'trusted' in cur_system
+ cur_host = cur_system['host']
+
try:
- cluster_ricci = getRicciAgent(self, clusterName)
- if not cluster_ricci:
- raise Exception, 'cannot find a ricci agent for %s' % clusterName
- cluster_os = getClusterOS(self, cluster_ricci)['os']
- if clusterObj is None:
- try:
- clusterObj = self.restrictedTraverse(PLONE_ROOT + '/systems/cluster/' + clusterName)
- except:
- pass
+ cur_passwd = cur_system['passwd']
+ except:
+ cur_passwd = None
+
+ if (cur_host_trusted or not check_certs) and cur_passwd:
+ try:
+ rc = RicciCommunicator(cur_host, enforce_trust=True)
+ if not rc:
+ raise Exception, 'connection failed'
+ except Exception, e:
+ cur_system['errors'] = True
+ incomplete = True
+ errors.append('Unable to connect to %s: %s' \
+ % (cur_host, str(e)))
+ luci_log.debug_verbose('VACN4: %s: %s' % (cur_host, str(e)))
+ continue
+
+ prev_auth = rc.authed()
+ cur_system['prev_auth'] = prev_auth
+ try:
+ if prev_auth:
+ messages.append('Host %s is already authenticated.' \
+ % cur_host)
+ else:
+ rc.auth(cur_passwd)
+
+ if not rc.authed():
+ raise Exception, 'authentication failed'
+ except:
+ cur_system['errors'] = True
+ incomplete = True
+ errors.append('Error authenticating to %s: %s' \
+ % (cur_host, str(e)))
+ luci_log.debug_verbose('VACN5: %s: %s' % (cur_host, str(e)))
+ continue
+
+ cur_cluster_info = rc.cluster_info()
+ if cur_cluster_info[0] or cur_cluster_info[1]:
+ cur_system['errors'] = True
+ incomplete = True
+
+ if cur_cluster_info[0]:
+ cur_cluster_name = cur_cluster_info[0]
+ elif cur_cluster_info[1]:
+ cur_cluster_name = cur_cluster_info[1]
try:
- clusterObj.manage_addProperty('cluster_os', cluster_os, 'string')
- except:
- pass
- except Exception, e:
- luci_log.debug_verbose('vACN3: %s: %s' % (clusterName, str(e)))
- nodeUnauth(nodeList)
- cluster_os = None
- cluster_properties['isComplete'] = False
- errors.append('Unable to determine the cluster OS for the ' + clusterName + ' cluster.')
+ if not cur_system['prev_auth']:
+ rc.unauth()
+ del cur_system['trusted']
+ except Exception, e:
+ luci_log.debug_verbose('VACN6: %s: %s' % (cur_host, str(e)))
+
+ errors.append('%s reports it is already a member of cluster \"%s\"' % (cur_host, cur_cluster_name))
+ luci_log.debug_verbose('VACN7: %s: already in %s cluster' \
+ % (cur_host, cur_cluster_name))
+ continue
- try:
- if cluster_os is None:
- raise Exception, 'no cluster OS found for %s' % clusterName
- if len(filter(lambda x: x['os'] != cluster_os, nodeList)) > 0:
- raise Exception, 'different operating systems were detected.'
- except Exception, e:
- luci_log.debug_verbose('vACN4: %s: %s' % (clusterName, str(e)))
- nodeUnauth(nodeList)
- cluster_properties['isComplete'] = False
- errors.append('Cluster nodes must be running compatible operating systems.')
-
- if not cluster_properties['isComplete']:
- return (False, {'errors': errors, 'requestResults': cluster_properties})
-
- for clunode in nodeList:
- try:
- batchNode = addClusterNodeBatch(clunode['os'],
- clusterName,
- True,
- True,
- enable_storage,
- False,
- rhn_dl)
- if not batchNode:
- raise Exception, 'batchnode is None'
- clunode['batchnode'] = batchNode
- except Exception, e:
- luci_log.debug_verbose('vACN5: node add for %s failed: %s' \
- % (clunode['host'], str(e)))
- clunode['errors'] = True
- nodeUnauth(nodeList)
- cluster_properties['isComplete'] = False
- errors.append('Unable to initiate node creation for host \"' + clunode['host'] + '\"')
+ cur_host_os = resolveOSType(rc.os())
+ if cluster_os is not None and cluster_os != cur_host_os:
+ cur_system['errors'] = True
+ incomplete = True
+
+ try:
+ if not cur_system['prev_auth']:
+ rc.unauth()
+ del cur_system['trusted']
+ except Exception, e:
+ luci_log.debug_verbose('VACN8: %s: %s' % (cur_host, str(e)))
+
+ errors.append('The cluster software version on %s (%s) does not match the software on the other cluster nodes (%s)' % (cur_host, cur_host_os, cluster_os))
+ luci_log.debug_verbose('VACN9: version mismatch for %s: (%s vs. %s)' \
+ % (cur_host, cur_host_os, cluster_os))
+ continue
- if not cluster_properties['isComplete']:
- return (False, {'errors': errors, 'requestResults': cluster_properties})
+ if incomplete or len(errors) > 0:
+ request.SESSION.set('add_node', add_cluster)
+ return (False, { 'errors': errors, 'messages': messages })
try:
cluster_ricci = getRicciAgent(self, clusterName)
if not cluster_ricci:
- raise Exception, 'Unable to get a ricci agent for %s' % clusterName
+ raise Exception, 'Unable to find a ricci agent for %s' % clusterName
except Exception, e:
- cluster_properties['isComplete'] = False
- nodeUnauth(nodeList)
- errors.append('Unable to contact a Ricci agent for %s.' % clusterName)
- luci_log.debug_verbose('vACN6: ricci %s: %s' % (clusterName, str(e)))
- return (False, {'errors': errors, 'requestResults': cluster_properties})
+ incomplete = True
+ errors.append('Unable to contact a ricci agent for %s.' % clusterName)
+ luci_log.debug_verbose('VACN10: %s: %s' % (clusterName, str(e)))
+
+ if incomplete or len(errors) > 0:
+ request.SESSION.set('add_node', add_cluster)
+ return (False, { 'errors': errors, 'messages': messages })
try:
model = getModelBuilder(None, cluster_ricci, cluster_ricci.dom0())
if not model:
+ errors.append('Unable to build the cluster model for %s' \
+ % clusterName)
raise Exception, 'unable to get model for %s' % clusterName
+
nodesptr = model.getClusterNodesPtr()
used_ids = {}
for i in model.getNodes():
+ used_ids[int(i.getAttribute('nodeid'))] = 1
+ node_name = str(i.getAttribute('name'))
+ if node_name in system_list:
+ system_list[node_name]['errors'] = True
+ errors.append('%s is already a member of %s' \
+ % (node_name, clusterName))
+ except Exception, e:
+ incomplete = True
+ errors.append('Unable to build the cluster model for %s' \
+ % clusterName)
+ luci_log.debug_verbose('VACN11: %s' % str(e))
+
+ if incomplete or len(errors) > 0:
+ request.SESSION.set('add_node', add_cluster)
+ return (False, { 'errors': errors, 'messages': messages })
+
+ next_node_id = 1
+
+ try:
+ for x in system_list:
+ i = system_list[x]
+
try:
- used_ids[int(i.getAttribute('nodeid'))] = 1
+ batch_node = addClusterNodeBatch(cluster_os,
+ clusterName,
+ True,
+ True,
+ shared_storage,
+ False,
+ download_pkgs)
+ if not batch_node:
+ raise Exception, 'batch is blank'
+ system_list[x]['batch'] = batch_node
except Exception, e:
- luci_log.debug_verbose('vACN7: %s' % str(e))
- pass
- next_node_id = 1
- for i in nodeList:
+ cur_system['errors'] = True
+ incomplete = True
+
+ try:
+ if not cur_system['prev_auth']:
+ rc.unauth()
+ del cur_system['trusted']
+ except Exception, e:
+ luci_log.debug_verbose('VACN12: %s: %s' % (cur_host, str(e)))
+
+ errors.append('Unable to initiate cluster join for %s' % cur_host)
+ luci_log.debug_verbose('VACN13: %s: %s' % (cur_host, str(e)))
+ continue
+
next_node_id += 1
new_node = ClusterNode()
- new_node.attr_hash['name'] = i['host']
+ new_node.attr_hash['name'] = str(i['host'])
new_node.attr_hash['votes'] = str(1)
while next_node_id in used_ids:
next_node_id += 1
new_node.attr_hash['nodeid'] = str(next_node_id)
nodesptr.addChild(new_node)
- model.isModified = True
+ if incomplete or len(errors) > 0:
+ request.SESSION.set('add_node', add_cluster)
+ return (False, { 'errors': errors, 'messages': messages })
+
+ cp = model.getClusterPtr()
+ cp.incrementConfigVersion()
+ model.setModified(True)
conf_str = str(model.exportModelAsString())
if not conf_str:
- raise Exception, 'unable to export model as a string'
- batch_number, result = setClusterConf(cluster_ricci, conf_str)
+ raise Exception, 'Unable to save the new cluster model.'
+ batch_number, result = setClusterConf(cluster_ricci, conf_str)
+ if not batch_number or not result:
+ raise Exception, 'batch or result is None'
+ except Exception, e:
+ incomplete = True
+ errors.append('Unable to save the new cluster model.')
+ luci_log.debug_verbose('VACN14: %s' % str(e))
+
+ # Propagate the new cluster.conf to the existing nodes
+ # before having any of the new nodes join. If this fails,
+ # abort the whole process.
+ try:
while True:
batch_ret = checkBatch(cluster_ricci, batch_number)
code = batch_ret[0]
@@ -438,47 +565,61 @@
if code == False:
time.sleep(0.5)
except Exception, e:
- luci_log.debug_verbose('vACN8: %s' % str(e))
- errors.append('Unable to update the cluster node list for %s' % clusterName)
- return (False, {'errors': errors, 'requestResults': cluster_properties})
+ incomplete = True
+ errors.append('Unable to update the cluster node list for %s' \
+ % clusterName)
+ luci_log.debug_verbose('VACN15: %s' % str(e))
+
+ if incomplete or len(errors) > 0:
+ request.SESSION.set('add_node', add_cluster)
+ return (False, { 'errors': errors, 'messages': messages })
- error = createClusterSystems(self, clusterName, nodeList)
+ error = createClusterSystems(self, clusterName, system_list)
if error:
- luci_log.debug_verbose('vACN9: %s: %s' % (clusterName, str(e)))
- nodeUnauth(nodeList)
- cluster_properties['isComplete'] = False
+ incomplete = True
errors.append(error)
- return (False, {'errors': errors, 'requestResults': cluster_properties})
+ luci_log.debug_verbose('VACN16: %s: %s' % (clusterName, error))
+
+ if incomplete or len(errors) > 0:
+ request.SESSION.set('add_node', add_cluster)
+ return (False, { 'errors': errors, 'messages': messages })
batch_id_map = {}
- for clunode in nodeList:
+ for x in system_list:
+ clunode = system_list[x]
success = True
+
+ cur_host = clunode['host']
try:
- rc = RicciCommunicator(clunode['host'])
+ rc = RicciCommunicator(cur_host)
if not rc:
raise Exception, 'rc is None'
except Exception, e:
- nodeUnauth([clunode['host']])
success = False
- luci_log.info('vACN10: Unable to connect to the ricci daemon on host %s: %s' % (clunode['host'], str(e)))
+ clunode['errors'] = True
+ errors.append('Unable to connect to the ricci agent on %s: %s' \
+ % (cur_host, str(e)))
+ luci_log.info('VACN17: Unable to connect to the ricci daemon on host %s: %s' % (clunode['host'], str(e)))
if success:
try:
- resultNode = rc.process_batch(clunode['batchnode'], async=True)
- batch_id_map[clunode['host']] = resultNode.getAttribute('batch_id')
+ resultNode = rc.process_batch(clunode['batch'], async=True)
+ batch_id_map[cur_host] = resultNode.getAttribute('batch_id')
except Exception, e:
- nodeUnauth([clunode['host']])
+ clunode['errors'] = True
success = False
- luci_log.info('vACN11: %s' % (clunode['host'], str(e)))
+ luci_log.debug_verbose('VACN18: %s: %s' \
+ % (cur_host, str(e)))
if not success:
- cluster_properties['isComplete'] = False
- errors.append('An error occurred while attempting to add cluster node \"' + clunode['host'] + '\"')
+ incomplete = True
+ errors.append('An error occurred while attempting to add cluster node \"%s\"')
- buildClusterCreateFlags(self, batch_id_map, clusterName)
+ if incomplete or len(errors) > 0:
+ request.SESSION.set('add_node', add_cluster)
+ return (False, { 'errors': errors, 'messages': messages })
- if len(errors) > 0:
- return (False, {'errors': errors, 'requestResults': cluster_properties})
+ buildClusterCreateFlags(self, batch_id_map, clusterName)
response = request.RESPONSE
response.redirect(request['URL'] + "?pagetype=" + CLUSTER_CONFIG + "&clustername=" + clusterName + '&busyfirst=true')
@@ -642,6 +783,9 @@
return (False, {'errors': [ 'Unable to determine cluster name' ]})
try:
+ cp = model.getClusterPtr()
+ cp.incrementConfigVersion()
+ model.setModified(True)
conf = model.exportModelAsString()
if not conf:
raise Exception, 'model string for %s is blank' % clustername
@@ -696,9 +840,9 @@
if res and res[2]:
errors.extend(res[2])
raise Exception, 'An error occurred while adding this resource'
- modelb = res[1]
+ model = res[1]
newres = res[0]
- addResource(self, request, modelb, newres, res_type)
+ addResource(self, request, model, newres, res_type)
except Exception, e:
if len(errors) < 1:
errors.append('An error occurred while adding this resource')
@@ -747,7 +891,6 @@
try:
model.usesMulticast = True
model.mcast_address = addr_str
- model.isModified = True
except Exception, e:
luci_log.debug('Error updating mcast properties: %s' % str(e))
errors.append('Unable to update cluster multicast properties')
@@ -1064,7 +1207,7 @@
try:
clustername = model.getClusterName()
if not clustername:
- raise Exception, 'cluster name from modelb.getClusterName() is blank'
+ raise Exception, 'cluster name from model.getClusterName() is blank'
except Exception, e:
luci_log.debug_verbose('VCC5: error: getClusterName: %s' % str(e))
errors.append('Unable to determine cluster name from model')
@@ -1143,7 +1286,7 @@
return (False, {'errors': ['No form was submitted']})
#fencehandler = FenceHandler()
- error_code,error_string = validateNewFenceDevice(form, model)
+ error_code, error_string = validateNewFenceDevice(form, model)
if error_code == FD_VAL_SUCCESS:
messages.append(error_string)
try:
@@ -1161,7 +1304,7 @@
try:
clustername = model.getClusterName()
if not clustername:
- raise Exception, 'cluster name from modelb.getClusterName() is blank'
+ raise Exception, 'cluster name from model.getClusterName() is blank'
except Exception, e:
luci_log.debug_verbose('VFA: error: getClusterName: %s' % str(e))
errors.append('Unable to determine cluster name from model')
@@ -1240,7 +1383,7 @@
#entry for this fence device.
#
#pass form and model to validation method, then save changes if it passes.
- error_code,error_string = validateFenceDevice(form, model)
+ error_code, error_string = validateFenceDevice(form, model)
if error_code == FD_VAL_SUCCESS:
messages.append(error_string)
try:
@@ -1258,7 +1401,7 @@
try:
clustername = model.getClusterName()
if not clustername:
- raise Exception, 'cluster name from modelb.getClusterName() is blank'
+ raise Exception, 'cluster name from model.getClusterName() is blank'
except Exception, e:
luci_log.debug_verbose('VFA: error: getClusterName: %s' % str(e))
errors.append('Unable to determine cluster name from model')
@@ -1363,7 +1506,7 @@
error_string = "Fence device %s could not be removed from configuration" % fencedev_name
try:
- model.removeFenceInstancesForFenceDevice(orig_name)
+ model.removeFenceInstancesForFenceDevice(fencedev_name)
except:
luci_log.debug_verbose('VFD: Could not remove fence instances for')
@@ -1385,7 +1528,7 @@
try:
clustername = model.getClusterName()
if not clustername:
- raise Exception, 'cluster name from modelb.getClusterName() is blank'
+ raise Exception, 'cluster name from model.getClusterName() is blank'
except Exception, e:
luci_log.debug_verbose('VFA: error: getClusterName: %s' % str(e))
errors.append('Unable to determine cluster name from model')
@@ -2176,7 +2319,7 @@
return None
- cluname = lower(clustername)
+ cluname = clustername.lower()
for node in nodes:
try:
@@ -2432,7 +2575,7 @@
results.append(vals)
return results
-def getServicesInfo(self, status, modelb, req):
+def getServicesInfo(self, status, model, req):
map = {}
maplist = list()
@@ -2466,7 +2609,7 @@
itemmap['cfgurl'] = baseurl + "?" + "clustername=" + cluname + "&servicename=" + item['name'] + "&pagetype=" + SERVICE
itemmap['delurl'] = baseurl + "?" + "clustername=" + cluname + "&servicename=" + item['name'] + "&pagetype=" + SERVICE_DELETE
- svc = modelb.retrieveServiceByName(item['name'])
+ svc = model.retrieveServiceByName(item['name'])
dom = svc.getAttribute("domain")
if dom is not None:
itemmap['faildom'] = dom
@@ -2477,7 +2620,7 @@
map['services'] = maplist
return map
-def getServiceInfo(self, status, modelb, req):
+def getServiceInfo(self, status, model, req):
#set up struct for service config page
hmap = {}
root_uuid = 'toplevel'
@@ -2527,7 +2670,7 @@
innermap['restarturl'] = baseurl + "?" + "clustername=" + cluname +"&servicename=" + servicename + "&pagetype=" + SERVICE_RESTART
innermap['delurl'] = baseurl + "?" + "clustername=" + cluname +"&servicename=" + servicename + "&pagetype=" + SERVICE_DELETE
- nodes = modelb.getNodes()
+ nodes = model.getNodes()
for node in nodes:
starturl = {}
if node.getName() != nodename:
@@ -2541,7 +2684,7 @@
innermap = {}
innermap['current'] = "This service is currently stopped"
innermap['enableurl'] = baseurl + "?" + "clustername=" + cluname +"&servicename=" + servicename + "&pagetype=" + SERVICE_START
- nodes = modelb.getNodes()
+ nodes = model.getNodes()
starturls = list()
for node in nodes:
starturl = {}
@@ -2553,7 +2696,7 @@
#Now build hashes for resources under service.
#first get service by name from model
- svc = modelb.getService(servicename)
+ svc = model.getService(servicename)
resource_list = list()
if svc is not None:
indent_ctr = 0
@@ -2730,7 +2873,7 @@
response = req.RESPONSE
response.redirect(req['URL'] + "?pagetype=" + SERVICE_LIST + "&clustername=" + cluname + '&busyfirst=true')
-def getFdomsInfo(self, modelb, request, clustatus):
+def getFdomsInfo(self, model, request, clustatus):
slist = list()
nlist = list()
for item in clustatus:
@@ -2741,8 +2884,8 @@
fdomlist = list()
clustername = request['clustername']
baseurl = request['URL']
- fdoms = modelb.getFailoverDomains()
- svcs = modelb.getServices()
+ fdoms = model.getFailoverDomains()
+ svcs = model.getServices()
for fdom in fdoms:
fdom_map = {}
fdom_map['name'] = fdom.getName()
@@ -3366,10 +3509,10 @@
else:
delete_target = None
nodelist = model.getNodes()
- find_node = lower(nodename)
+ find_node = nodename.lower()
for n in nodelist:
try:
- if lower(n.getName()) == find_node:
+ if n.getName().lower() == find_node:
delete_target = n
break
except:
@@ -3387,6 +3530,9 @@
% (delete_target.getName(), str(e)))
try:
+ cp = model.getClusterPtr()
+ cp.incrementConfigVersion()
+ model.setModified(True)
str_buf = model.exportModelAsString()
if not str_buf:
raise Exception, 'model string is blank'
@@ -3471,8 +3617,8 @@
% (nodename_resolved, clustername))
return (False, {'errors': [ 'Node %s reports it is not in a cluster.' % nodename_resolved ]})
- cname = lower(clustername)
- if cname != lower(cluinfo[0]) and cname != lower(cluinfo[1]):
+ cname = clustername.lower()
+ if cname != cluinfo[0].lower() and cname != cluinfo[1].lower():
luci_log.debug('NTP6: node %s in unknown cluster %s:%s (expected %s)' % (nodename_resolved, cluinfo[0], cluinfo[1], clustername))
return (False, {'errors': [ 'Node %s reports it in cluster \"%s\". We expect it to be a member of cluster \"%s\"' % (nodename_resolved, cluinfo[0], clustername) ]})
@@ -4188,6 +4334,9 @@
xvm.addAttribute("path", req.form['xenvmpath'])
try:
+ cp = model.getClusterPtr()
+ cp.incrementConfigVersion()
+ model.setModified(True)
stringbuf = model.exportModelAsString()
if not stringbuf:
raise Exception, 'model is blank'
@@ -4198,7 +4347,7 @@
try:
clustername = model.getClusterName()
if not clustername:
- raise Exception, 'cluster name from modelb.getClusterName() is blank'
+ raise Exception, 'cluster name from model.getClusterName() is blank'
except Exception, e:
luci_log.debug_verbose('error: getClusterName: %s' % str(e))
return None
@@ -4538,7 +4687,7 @@
map['isVirtualized'] = False
return map
-def getResourcesInfo(modelb, request):
+def getResourcesInfo(model, request):
resList = list()
baseurl = request['URL']
@@ -4551,7 +4700,7 @@
luci_log.debug_verbose('getResourcesInfo missing cluster name')
return resList
- for item in modelb.getResources():
+ for item in model.getResources():
itemmap = {}
itemmap['name'] = item.getName()
itemmap['attrs'] = item.attr_hash
@@ -4562,9 +4711,9 @@
resList.append(itemmap)
return resList
-def getResourceInfo(modelb, request):
- if not modelb:
- luci_log.debug_verbose('GRI0: no modelb object in session')
+def getResourceInfo(model, request):
+ if not model:
+ luci_log.debug_verbose('GRI0: no model object in session')
return {}
name = None
@@ -4603,7 +4752,7 @@
luci_log.debug_verbose('getResourceInfo missing URL')
return {}
- for res in modelb.getResources():
+ for res in model.getResources():
if res.getName() == name:
try:
resMap = {}
@@ -4620,7 +4769,7 @@
errstr = 'An error occurred while attempting to set the new cluster.conf'
try:
- modelb = request.SESSION.get('model')
+ model = request.SESSION.get('model')
except Exception, e:
luci_log.debug_verbose('delService0: no model: %s' % str(e))
return (False, {'errors': [ errstr ] })
@@ -4665,13 +4814,16 @@
return (False, {'errors': [ '%s: unable to find a Ricci agent for this cluster.' % errstr ]})
try:
- modelb.deleteService(name)
+ model.deleteService(name)
except Exception, e:
luci_log.debug_verbose('delService5: Unable to find a service named %s for cluster %s' % (name, clustername))
return (False, {'errors': [ '%s: error removing service %s.' % (errstr, name) ]})
try:
- conf = modelb.exportModelAsString()
+ cp = model.getClusterPtr()
+ cp.incrementConfigVersion()
+ model.setModified(True)
+ conf = model.exportModelAsString()
if not conf:
raise Exception, 'model string is blank'
except Exception, e:
@@ -4696,7 +4848,7 @@
errstr = 'An error occurred while attempting to set the new cluster.conf'
try:
- modelb = request.SESSION.get('model')
+ model = request.SESSION.get('model')
except Exception, e:
luci_log.debug_verbose('delResource0: no model: %s' % str(e))
return errstr
@@ -4735,7 +4887,7 @@
luci_log.debug_verbose('delResource3: %s: %s' % (errstr, str(e)))
return errstr + ': could not determine the ricci agent hostname'
- resPtr = modelb.getResourcesPtr()
+ resPtr = model.getResourcesPtr()
resources = resPtr.getChildren()
found = 0
@@ -4750,7 +4902,10 @@
return errstr + ': the specified resource was not found.'
try:
- conf = modelb.exportModelAsString()
+ cp = model.getClusterPtr()
+ cp.incrementConfigVersion()
+ model.setModified(True)
+ conf = model.exportModelAsString()
if not conf:
raise Exception, 'model string is blank'
except Exception, e:
@@ -4779,9 +4934,9 @@
luci_log.debug_verbose('addIp error: form is missing')
return None
- modelb = request.SESSION.get('model')
- if not modelb:
- luci_log.debug_verbose('addIp error: modelb is missing')
+ model = request.SESSION.get('model')
+ if not model:
+ luci_log.debug_verbose('addIp error: model is missing')
return None
if form.has_key('edit'):
@@ -4789,7 +4944,7 @@
oldname = form['oldname'].strip()
if not oldname:
raise KeyError, 'oldname is blank.'
- res = getResourceForEdit(modelb, oldname)
+ res = getResourceForEdit(model, oldname)
except Exception, e:
luci_log.debug_verbose('addIp error: %s' % str(e))
return None
@@ -4825,7 +4980,7 @@
if len(errors) > 1:
return [None, None, errors]
- return [res, modelb, None]
+ return [res, model, None]
def addFs(request, form=None):
if form is None:
@@ -4835,9 +4990,9 @@
luci_log.debug_verbose('addFs error: form is missing')
return None
- modelb = request.SESSION.get('model')
- if not modelb:
- luci_log.debug_verbose('addFs error: modelb is missing')
+ model = request.SESSION.get('model')
+ if not model:
+ luci_log.debug_verbose('addFs error: model is missing')
return None
if form.has_key('edit'):
@@ -4845,7 +5000,7 @@
oldname = form['oldname'].strip()
if not oldname:
raise KeyError, 'oldname is blank.'
- res = getResourceForEdit(modelb, oldname)
+ res = getResourceForEdit(model, oldname)
except Exception, e:
luci_log.debug_verbose('addFs error: %s' % str(e))
return None
@@ -4929,7 +5084,7 @@
if len(errors) > 1:
return [None, None, errors]
- return [res, modelb, None]
+ return [res, model, None]
def addGfs(request, form=None):
if form is None:
@@ -4939,9 +5094,9 @@
luci_log.debug_verbose('addGfs error: form is missing')
return None
- modelb = request.SESSION.get('model')
- if not modelb:
- luci_log.debug_verbose('addGfs error: modelb is missing')
+ model = request.SESSION.get('model')
+ if not model:
+ luci_log.debug_verbose('addGfs error: model is missing')
return None
if form.has_key('edit'):
@@ -4949,7 +5104,7 @@
oldname = form['oldname'].strip()
if not oldname:
raise KeyError, 'oldname is blank.'
- res = getResourceForEdit(modelb, oldname)
+ res = getResourceForEdit(model, oldname)
if not res:
luci_log.debug('resource %s was not found for editing' % oldname)
return None
@@ -5020,7 +5175,7 @@
if len(errors) > 1:
return [None, None, errors]
- return [res, modelb, None]
+ return [res, model, None]
def addNfsm(request, form=None):
if form is None:
@@ -5030,9 +5185,9 @@
luci_log.debug_verbose('addNfsm error: form is missing')
return None
- modelb = request.SESSION.get('model')
- if not modelb:
- luci_log.debug_verbose('addNfsm error: modelb is missing')
+ model = request.SESSION.get('model')
+ if not model:
+ luci_log.debug_verbose('addNfsm error: model is missing')
return None
if form.has_key('edit'):
@@ -5040,7 +5195,7 @@
oldname = form['oldname'].strip()
if not oldname:
raise KeyError, 'oldname is blank.'
- res = getResourceForEdit(modelb, oldname)
+ res = getResourceForEdit(model, oldname)
except Exception, e:
luci_log.debug_verbose('addNfsm error: %s' % str(e))
return None
@@ -5115,7 +5270,7 @@
if len(errors) > 1:
return [None, None, errors]
- return [res, modelb, None]
+ return [res, model, None]
def addNfsc(request, form=None):
if form is None:
@@ -5125,9 +5280,9 @@
luci_log.debug_verbose('addNfsc error: form is missing')
return None
- modelb = request.SESSION.get('model')
- if not modelb:
- luci_log.debug_verbose('addNfsc error: modelb is missing')
+ model = request.SESSION.get('model')
+ if not model:
+ luci_log.debug_verbose('addNfsc error: model is missing')
return None
if form.has_key('edit'):
@@ -5135,7 +5290,7 @@
oldname = form['oldname'].strip()
if not oldname:
raise KeyError, 'oldname is blank.'
- res = getResourceForEdit(modelb, oldname)
+ res = getResourceForEdit(model, oldname)
except Exception, e:
luci_log.debug_verbose('addNfsc error: %s' % str(e))
return None
@@ -5179,19 +5334,19 @@
if len(errors) > 1:
return [None, None, errors]
- return [res, modelb, None]
+ return [res, model, None]
def addNfsx(request, form=None):
if form is None:
form = request.form
if not form:
- luci_log.debug_verbose('addNfsx error: modelb is missing')
+ luci_log.debug_verbose('addNfsx error: model is missing')
return None
- modelb = request.SESSION.get('model')
- if not modelb:
- luci_log.debug_verbose('addNfsx error: modelb is missing')
+ model = request.SESSION.get('model')
+ if not model:
+ luci_log.debug_verbose('addNfsx error: model is missing')
return None
if form.has_key('edit'):
@@ -5199,7 +5354,7 @@
oldname = form['oldname'].strip()
if not oldname:
raise KeyError, 'oldname is blank.'
- res = getResourceForEdit(modelb, oldname)
+ res = getResourceForEdit(model, oldname)
except Exception, e:
luci_log.debug_verbose('addNfsx error: %s', str(e))
return None
@@ -5227,7 +5382,7 @@
if len(errors) > 1:
return [None, None, errors]
- return [res, modelb, None]
+ return [res, model, None]
def addScr(request, form=None):
if form is None:
@@ -5237,9 +5392,9 @@
luci_log.debug_verbose('addScr error: form is missing')
return None
- modelb = request.SESSION.get('model')
- if not modelb:
- luci_log.debug_verbose('addScr error: modelb is missing')
+ model = request.SESSION.get('model')
+ if not model:
+ luci_log.debug_verbose('addScr error: model is missing')
return None
if form.has_key('edit'):
@@ -5247,7 +5402,7 @@
oldname = form['oldname'].strip()
if not oldname:
raise KeyError, 'oldname is blank.'
- res = getResourceForEdit(modelb, oldname)
+ res = getResourceForEdit(model, oldname)
except Exception, e:
luci_log.debug_verbose('addScr error: %s' % str(e))
return None
@@ -5285,7 +5440,7 @@
if len(errors) > 1:
return [None, None, errors]
- return [res, modelb, None]
+ return [res, model, None]
def addSmb(request, form=None):
if form is None:
@@ -5295,9 +5450,9 @@
luci_log.debug_verbose('addSmb error: form is missing')
return None
- modelb = request.SESSION.get('model')
- if not modelb:
- luci_log.debug_verbose('addSmb error: modelb is missing')
+ model = request.SESSION.get('model')
+ if not model:
+ luci_log.debug_verbose('addSmb error: model is missing')
return None
if form.has_key('edit'):
@@ -5305,7 +5460,7 @@
oldname = form['oldname'].strip()
if not oldname:
raise KeyError, 'oldname is blank.'
- res = getResourceForEdit(modelb, oldname)
+ res = getResourceForEdit(model, oldname)
except Exception, e:
luci_log.debug_verbose('addSmb error: %s' % str(e))
return None
@@ -5341,7 +5496,7 @@
if len(errors) > 1:
return [None, None, errors]
- return [res, modelb, None]
+ return [res, model, None]
resourceAddHandler = {
'ip': addIp,
@@ -5354,9 +5509,9 @@
'smb': addSmb
}
-def resolveClusterChanges(self, clusterName, modelb):
+def resolveClusterChanges(self, clusterName, model):
try:
- mb_nodes = modelb.getNodes()
+ mb_nodes = model.getNodes()
if not mb_nodes or not len(mb_nodes):
raise Exception, 'node list is empty'
except Exception, e:
@@ -5431,8 +5586,8 @@
return messages
-def addResource(self, request, modelb, res, res_type):
- clustername = modelb.getClusterName()
+def addResource(self, request, model, res, res_type):
+ clustername = model.getClusterName()
if not clustername:
luci_log.debug_verbose('addResource0: no cluname from mb')
return 'Unable to determine cluster name'
@@ -5443,13 +5598,16 @@
return 'Unable to find a ricci agent for the %s cluster' % clustername
try:
- modelb.getResourcesPtr().addChild(res)
+ model.getResourcesPtr().addChild(res)
except Exception, e:
luci_log.debug_verbose('addResource2: adding the new resource failed: %s' % str(e))
return 'Unable to add the new resource'
try:
- conf = modelb.exportModelAsString()
+ cp = model.getClusterPtr()
+ cp.incrementConfigVersion()
+ model.setModified(True)
+ conf = model.exportModelAsString()
if not conf:
raise Exception, 'model string for %s is blank' % clustername
except Exception, e:
@@ -5484,8 +5642,8 @@
response = request.RESPONSE
response.redirect(request['URL'] + "?pagetype=" + RESOURCES + "&clustername=" + clustername + '&busyfirst=true')
-def getResource(modelb, name):
- resPtr = modelb.getResourcesPtr()
+def getResource(model, name):
+ resPtr = model.getResourcesPtr()
resources = resPtr.getChildren()
for res in resources:
@@ -5495,8 +5653,8 @@
luci_log.debug_verbose('getResource: unable to find resource \"%s\"' % name)
raise KeyError, name
-def getResourceForEdit(modelb, name):
- resPtr = modelb.getResourcesPtr()
+def getResourceForEdit(model, name):
+ resPtr = model.getResourcesPtr()
resources = resPtr.getChildren()
for res in resources:
@@ -5591,18 +5749,18 @@
return None
try:
- modelb = ModelBuilder(0, None, None, cluster_conf_node)
- if not modelb:
+ model = ModelBuilder(0, None, None, cluster_conf_node)
+ if not model:
raise Exception, 'ModelBuilder returned None'
except Exception, e:
try:
- luci_log.debug_verbose('GMB1: An error occurred while trying to get modelb for conf \"%s\": %s' % (cluster_conf_node.toxml(), str(e)))
+ luci_log.debug_verbose('GMB1: An error occurred while trying to get model for conf \"%s\": %s' % (cluster_conf_node.toxml(), str(e)))
except:
luci_log.debug_verbose('GMB1: ModelBuilder failed')
- if modelb:
- modelb.setIsVirtualized(isVirtualized)
- return modelb
+ if model:
+ model.setIsVirtualized(isVirtualized)
+ return model
def getModelForCluster(self, clustername):
rc = getRicciAgent(self, clustername)
--- conga/luci/site/luci/Extensions/homebase_adapters.py 2006/12/14 21:37:15 1.41
+++ conga/luci/site/luci/Extensions/homebase_adapters.py 2006/12/21 05:08:49 1.42
@@ -6,7 +6,9 @@
from conga_constants import PLONE_ROOT, CLUSTER_NODE_NEED_AUTH, \
HOMEBASE_ADD_CLUSTER, HOMEBASE_ADD_CLUSTER_INITIAL, \
HOMEBASE_ADD_SYSTEM, HOMEBASE_ADD_USER, \
- HOMEBASE_DEL_SYSTEM, HOMEBASE_DEL_USER, HOMEBASE_PERMS
+ HOMEBASE_DEL_SYSTEM, HOMEBASE_DEL_USER, HOMEBASE_PERMS, \
+ STORAGE_FOLDER_PATH, CLUSTER_FOLDER_PATH
+
from ricci_bridge import getClusterConf
from ricci_communicator import RicciCommunicator, CERTS_DIR_PATH
from clusterOS import resolveOSType
@@ -40,7 +42,7 @@
if dsResult:
errors.append(dsResult)
else:
- messages.append('Removed storage system \"' + i + '\" successfully')
+ messages.append('Removed storage system \"%s\" successfully' % i)
if '__CLUSTER' in request.form:
cluNames = request.form['__CLUSTER']
@@ -51,7 +53,7 @@
if dcResult:
errors.append(dcResult)
else:
- messages.append('Removed cluster \"' + i + '\" successfully')
+ messages.append('Removed cluster \"%s\" successfully' % i)
if len(errors) > 0:
retCode = False
@@ -129,369 +131,531 @@
messages.append('Added new user \"' + user + '\" successfully')
return (True, {'messages': messages, 'params': { 'user': user }})
-def nodeUnauth(nodeList):
- for i in nodeList:
- try:
- if i['prev_auth'] != True:
- host = i['host']
- rc = RicciCommunicator(host)
- rc.unauth()
- i['cur_auth'] = False
- except Exception, e:
- try:
- luci_log.debug_verbose('unauth for %s failed: %s' \
- % (i['host'], str(e)))
- except:
- pass
-
-def nodeAuth(cluster, host, passwd):
+def validateAddClusterInitial(self, request):
+ errors = list()
messages = list()
- systemName = host
- os_str = 'rhel5'
try:
- rc = RicciCommunicator(host)
- if not rc:
- luci_log.debug_verbose('nodeAuth0: rc is None')
- raise Exception, 'unknown error'
- except Exception, e:
- try:
- error = 'Ricci connection to %s failed: %s' % (host, str(e))
- except:
- error = 'Ricci connection to %s failed' % host
- luci_log.debug_verbose('nodeAuth1: rc failed: %s' % error)
-
- return { 'host': host, 'ricci_host': host, 'errors': error, 'cur_auth': False, 'os': os_str }
-
- if rc.authed():
- prevAuth = True
- messages.append('Luci is already authenticated to %s -- not checking password' % host)
- else:
- prevAuth = False
- if not passwd:
- return { 'host': host, 'ricci_host': systemName, 'prev_auth': False, 'cur_auth': False, 'os': os_str }
- else:
- try:
- rc.auth(passwd)
- except:
- pass
+ request.SESSION.delete('add_cluster_initial')
+ request.SESSION.delete('add_cluster')
+ except:
+ pass
- if rc.authed():
- try:
- os_str = resolveOSType(rc.os())
- if not os_str:
- raise
- except:
- os_str = "rhel5" #Backup plan in case all is almost lost...
+ cur_host = None
+ try:
+ sysData = request.form['__SYSTEM0']
+ if not sysData or len(sysData) < 1:
+ raise Exception, 'no node was given'
+ cur_host = sysData[0]
+ except Exception, e:
+ luci_log.debug_verbose('vACI0: %s' % str(e))
+ return (False, { 'errors': [ 'You must provide the address of@least one node in the cluster you wish to add.' ]})
+
+ cur_entry = { 'host': cur_host }
+ try:
+ if len(sysData) < 2 or not sysData[1]:
+ raise Exception, 'no password'
+ cur_pass = sysData[1]
+ cur_entry['passwd'] = cur_pass
+ except:
+ luci_log.debug_verbose('vACI1: %s no password given')
+ request.SESSION.set('add_cluster_initial', cur_entry)
+ return (False, { 'errors': [ 'No password was given for %s' % cur_host ] })
- systemName = rc.system_name()
- if systemName[:9] == 'localhost' or systemName[:5] == '127.0':
- systemName = host
- node = { 'host': host, 'ricci_host': systemName, 'prev_auth': prevAuth, 'cur_auth': True, 'os': os_str }
+ check_certs = False
+ try:
+ check_certs = request.form.has_key('check_certs')
+ except:
+ check_certs = False
- cluster_info = rc.cluster_info()
- if cluster and ((not cluster_info) or (cluster_info[0] != cluster)):
- node['errors'] = 'Node \"' + host + '\" is reporting it is not a member of cluster \"' + cluster + '\"'
- if cluster_info and cluster_info[0]:
- node['errors'] += ' and that it is a member of cluster \"' + cluster_info[0] + '\"'
- if not cluster and cluster_info and cluster_info[0]:
- node['errors'] = 'Node \"' + host + '\" reports it is a member of cluster \"' + cluster_info[0] + '\"'
- return node
+ cur_host_trusted = False
+ try:
+ cur_host_trusted = request.form.has_key('host_is_trusted')
+ except:
+ cur_host_trusted = False
- error = 'Unable to authenticate to the ricci agent on \"' + host + '\"'
- return { 'host': host, 'ricci_host': systemName, 'prev_auth': False , 'cur_auth': False, 'errors': error, 'os': os_str }
+ cur_host_fp = None
+ try:
+ cur_host_fp = request.form['host_fingerprint'].strip()
+ if not cur_host_fp:
+ cur_host_fp = None
+ except:
+ cur_host_fp = None
-def validateAddClusterInitial(self, request, must_complete=True):
- errors = list()
- messages = list()
- newNodeList = list()
- nodeHash = {}
- rnodeHash = {}
+ try:
+ rc = RicciCommunicator(cur_host)
+ if not rc:
+ raise Exception, 'rc is None'
+ cur_fp = rc.fingerprint()
+ if cur_host_fp is not None:
+ cur_entry['fp'] = cur_host_fp
+ else:
+ cur_entry['fp'] = cur_fp[1]
+ except Exception, e:
+ luci_log.debug_verbose('vACI2: %s: %s' % (cur_host, str(e)))
+ request.SESSION.set('add_cluster_initial', cur_entry)
+ return (False, { 'errors': [ 'Unable to establish a secure connection to the ricci agent on %s: %s' \
+ % (cur_host, str(e)) ] })
+
+ if not check_certs or cur_host_trusted:
+ try:
+ if cur_host_fp is not None and cur_host_fp != cur_fp[1]:
+ errmsg = 'The key fingerprint for %s has changed from under us. It was \"%s\" and is now \"%s\".' \
+ % (cur_host, cur_host_fp, cur_fp[1])
+ request.SESSION.set('add_cluster_initial', cur_entry)
+ luci_log.info('SECURITY: %s' % errmsg)
+ return (False, { 'errors': [ errmsg ] })
+ rc.trust()
+ except Exception, e:
+ luci_log.debug_verbose('vACI3: %s %s' % (cur_host, str(e)))
+ request.SESSION.set('add_cluster_initial', cur_entry)
+ return (False, { 'errors': [ 'Unable to establish trust for host %s' % (cur_host, str(e)) ] })
+ elif check_certs:
+ if not rc.trusted():
+ msg = '%s has %s fingerprint %s' \
+ % (cur_host, cur_fp[0], cur_fp[1])
+ else:
+ cur_host_trusted = True
+ cur_entry['trusted'] = True
+ msg = 'Host %s %s fingerprint %s is already trusted.' \
+ % (cur_host, cur_fp[0], cur_fp[1])
+ request.SESSION.set('add_cluster_initial', cur_entry)
+ messages.append(msg)
+ return (True, { 'messages': [ msg ] })
try:
- sysData = request.form['__SYSTEM0']
- if not sysData or len(sysData) < 2:
- raise
+ del rc
+ request.SESSION.delete('add_cluster_initial')
except:
- return (False, { 'errors': [ 'At least one system and its root password must be given' ] })
+ pass
try:
- rc = RicciCommunicator(sysData[0])
+ rc = RicciCommunicator(cur_host, enforce_trust=True)
if not rc:
- raise Exception, 'unknown error'
+ raise Exception, 'rc is None'
+ cur_entry['trusted'] = rc.trusted()
except Exception, e:
- return (False, { 'errors': [ 'Unable to establish a connection to the Ricci agent on %s: %s' % (sysData[0], str(e)) ] })
+ luci_log.debug_verbose('vACI4: %s %s' % (cur_host, str(e)))
+ request.SESSION.set('add_cluster_initial', cur_entry)
+ return (False, { 'errors': [ 'Unable to connect to the ricci agent on %s' % cur_host ] })
- prevAuth = 0
- if not rc.authed():
+ prev_auth = rc.authed()
+ if not prev_auth:
try:
- rc.auth(sysData[1])
- except: pass
- if not rc.authed():
- return (False, { 'errors': [ 'Unable to authenticate to the Ricci agent on \"' + sysData[0] + '\"' ] })
- else:
- prevAuth = 1
+ rc.auth(cur_pass)
+ if not rc.authed():
+ raise Exception, 'authentication failed'
+ except Exception, e:
+ errmsg = 'Unable to authenticate to the ricci agent on %s: %s' % (cur_host, str(e))
+ luci_log.debug_verbose('vACI5: %s: %s' % (cur_host, str(e)))
+ request.SESSION.set('add_cluster_initial', cur_entry)
+ return (False, { 'errors': [ 'Unable to authenticate to the ricci agent on \"%s\"' % cur_host ] })
+
+ del cur_entry
try:
cluster_info = rc.cluster_info()
except:
cluster_info = None
- os_str = resolveOSType(rc.os())
- if not os_str:
- os_str = "rhel5" #Backup plan in case all is almost lost...
-
if not cluster_info or not cluster_info[0]:
- if not prevAuth:
- rc.unauth()
+ if not prev_auth:
+ try:
+ rc.unauth()
+ except:
+ pass
+
if not cluster_info:
- errmsg = 'An error occurred while attempting to retrieve the cluster.conf file for \"' + sysData[0] + '\"'
+ errmsg = 'An error occurred while attempting to retrieve the cluster.conf file from \"%s\"' % cur_host
else:
- errmsg = '\"' + sysData[0] + '\" is not a member of a cluster'
+ errmsg = '\"%s\" reports is not a member of any cluster.'
return (False, { 'errors': [ errmsg ] })
- clusterName = cluster_info[0]
- cluConf = getClusterConf(rc)
- if cluConf:
- nodeList = getClusterConfNodes(cluConf)
-
- if not cluConf or not nodeList or len(nodeList) < 1:
- if not prevAuth:
- rc.unauth()
- return (False, { 'errors': [ 'Error retrieving member nodes for cluster \"' + clusterName + '\"' ] })
-
- systemName = rc.system_name()
- if systemName[:9] == 'localhost':
- systemName = sysData[0]
-
- node = { 'host': rc.hostname(), 'ricci_host': systemName, 'prev_auth': prevAuth, 'cur_auth': rc.authed(), 'os': os_str }
- nodeHash[sysData[0]] = node
- rnodeHash[systemName] = node
- newNodeList.append(node)
+ cluster_name = cluster_info[0]
+ cluster_os = resolveOSType(rc.os())
+ try:
+ cluster_conf = getClusterConf(rc)
+ except:
+ cluster_conf = None
- if 'allSameCheckBox' in request.form:
- passwd = sysData[1]
- else:
- passwd = None
-
- for i in nodeList:
- node = nodeAuth(clusterName, i, passwd)
- if 'messages' in node:
- messages.extend(node['messages'])
- if node['host'] in nodeHash or node['ricci_host'] in rnodeHash:
- continue
- nodeHash[node['host']] = node
- if 'ricci_host' in node:
- rnodeHash[node['ricci_host']] = node
-
- if 'errors' in node:
- errors.append(node['errors'])
- node['errors'] = True
- newNodeList.append(node)
-
- sfn = lambda x, y: \
- x['cur_auth'] - y['cur_auth'] or (('errors' in y) - ('errors' in x))
- newNodeList.sort(sfn)
+ if cluster_conf:
+ try:
+ node_list = getClusterConfNodes(cluster_conf)
+ except:
+ node_list = None
- if must_complete == True:
- dfn = lambda x: not 'cur_auth' in x or x['cur_auth'] != True
- else:
- dfn = lambda x: False
+ # Make sure a cluster with this name is not already managed before
+ # going any further.
+ try:
+ dummy = self.restrictedTraverse(CLUSTER_FOLDER_PATH + cluster_name)
+ if not dummy:
+ raise Exception, 'no existing cluster'
+ errors.append('A cluster named \"%s\" is already managed.')
+ if not prev_auth:
+ try:
+ rc.unauth()
+ except:
+ pass
+ return (False, { 'errors': errors })
+ except:
+ pass
- cluster_properties = {
- 'clusterName': clusterName,
- 'nodeList': newNodeList,
- 'nodeHash': nodeHash,
- 'rnodeHash': rnodeHash,
- 'isComplete': len(filter(dfn, newNodeList)) == 0
- }
+ if not cluster_conf or not node_list or len(node_list) < 1:
+ if not prev_auth:
+ try:
+ rc.unauth()
+ except:
+ pass
+ return (False, { 'errors': [ 'Error retrieving the nodes list for cluster \"%s\" from node \"%s\"' % (cluster_name, cur_host) ] })
- if len(errors) < len(nodeList):
- cluster_properties['redirect'] = HOMEBASE_ADD_CLUSTER
+ same_node_passwds = False
+ try:
+ same_node_passwds = 'allSameCheckBox' in request.form
+ except:
+ same_node_passwds = False
- return (len(errors) < 1,
- {'messages': messages, 'errors': errors, 'requestResults': cluster_properties })
+ add_cluster = { 'name': cluster_name,
+ 'nodes': {},
+ 'cluster_os':cluster_os,
+ 'pass': 0,
+ 'identical_passwds': same_node_passwds,
+ 'check_certs': check_certs }
+
+ for i in node_list:
+ cur_node = { 'host': i }
+ if same_node_passwds:
+ cur_node['passwd'] = cur_pass
+ add_cluster['nodes'][i] = cur_node
+ request.SESSION.set('add_cluster', add_cluster)
+ request.response.redirect('/luci/homebase/index_html?pagetype=%s' % HOMEBASE_ADD_CLUSTER)
-def validateAddCluster(self, request, must_complete=True):
+def parseHostForm(request, check_certs):
errors = list()
messages = list()
- requestResults = None
- nodeList = None
+ system_list = {}
try:
- sessionData = request.SESSION.get('checkRet')
- requestResults = sessionData['requestResults']
+ num_storage = int(request.form['numStorage'].strip())
except Exception, e:
- luci_log.debug_verbose('VAC0: error getting session obj: %s' % str(e))
+ luci_log.debug_verbose('PHF1: numStorage field missing: %s' % str(e))
+ errors.append('The number of systems entered could not be determined.')
+
+ incomplete = False
+ i = 0
+ while i < num_storage:
try:
- clusterName = request.form['clusterName']
+ sysData = request.form['__SYSTEM%d' % i]
+ if len(sysData) < 1 or not sysData[0]:
+ raise Exception, 'no hostname'
+ cur_host = sysData[0]
+ if cur_host in system_list:
+ errors.append('You have added \"%s\" more than once.' % cur_host)
+ raise Exception, '%s added more than once' % cur_host
except:
- clusterName = ''
+ i += 1
+ continue
+
+ cur_system = { 'host': cur_host }
+
+ if len(sysData) < 2 or not sysData[1]:
+ errors.append('No password for %s (entry %d).' % (cur_host, i))
+ cur_passwd = None
+ else:
+ cur_passwd = sysData[1]
+ cur_system['passwd'] = cur_passwd
try:
- nodeList = requestResults['nodeList']
- luci_log.debug_verbose('VAC1: unauth to node list')
- nodeUnauth(nodeList)
+ cur_fp = request.form['__SYSTEM%dFingerprint' % i].strip()
+ if not cur_fp:
+ raise Exception, 'fingerprint is blank'
+ cur_system['fp'] = cur_fp
except:
- pass
+ cur_fp = None
+
+ try:
+ cur_set_trust = request.form.has_key('__SYSTEM%dTrusted' % i)
+ except:
+ cur_set_trust = False
+
+ if check_certs or (cur_fp is not None and cur_set_trust is True):
+ try:
+ rc = RicciCommunicator(cur_host, enforce_trust=False)
+ if not rc:
+ raise Exception, 'rc is None'
+ cur_system['prev_auth'] = rc.authed()
+ fp = rc.fingerprint()
+
+ if cur_set_trust is True:
+ cur_system['fp'] = cur_fp
+ if cur_fp != fp[1]:
+ errmsg = 'The key fingerprint for %s has changed from under us. It was \"%s\" and is now \"%s\".' % (cur_host, cur_fp, fp[1])
+ errors.append(errmsg)
+ luci_log.info('SECURITY: %s' % errmsg)
+ cur_system['error'] = True
+ incomplete = True
+ else:
+ rc.trust()
+ cur_system['trusted'] = True
+ else:
+ cur_system['fp'] = fp[1]
+
+ if not rc.trusted():
+ incomplete = True
+ msg = '%s has %s fingerprint %s' % (cur_host, fp[0], fp[1])
+ else:
+ cur_system['trusted'] = True
+ msg = '%s %s fingerprint %s is already trusted.' % (cur_host, fp[0], fp[1])
+
+ if check_certs:
+ messages.append(msg)
+ except Exception, e:
+ cur_system['error'] = True
+ try:
+ del cur_system['trusted']
+ except:
+ pass
+ errors.append('Unable to retrieve the SSL fingerprint for node %s: %s' % (cur_host, str(e)))
+ luci_log.debug_verbose('PHF2: %s: %s' \
+ % (cur_host, str(e)))
+ else:
+ # The user doesn't care. Trust the system.
+ try:
+ rc = RicciCommunicator(cur_host)
+ if not rc:
+ raise Exception, 'rc is None'
+ rc.trust()
+ cur_system['trusted'] = True
+ cur_system['prev_auth'] = rc.authed()
+ except Exception, e:
+ incomplete = True
+ cur_system['error'] = True
+ try:
+ if not 'prev_auth' in cur_system:
+ del cur_system['trusted']
+ rc.untrust()
+ except:
+ pass
+ errors.append('Unable to add the key for node %s to the trusted keys list.' % cur_host)
+ luci_log.debug_verbose('PHF3: %s: %s' % (cur_host, str(e)))
+ system_list[cur_host] = cur_system
+ i += 1
+
+ return system_list, incomplete, errors, messages
+
+def validateAddCluster(self, request):
+ errors = list()
- return (False, { 'errors': [ 'A data integrity error has occurred. Please attempt adding the cluster again.' ], 'requestResults': { 'clusterName': clusterName, 'isComplete': False, 'nodeList': [], 'redirect': HOMEBASE_ADD_CLUSTER_INITIAL } })
-
try:
- clusterName = request.form['clusterName']
- if not clusterName:
- raise Exception, 'no cluster name was found'
- except Exception, e:
- luci_log.debug_verbose('VAC2: no cluser name found: %s', str(e))
- return (False, { 'errors': ['No cluster name was given.'], 'requestResults': requestResults })
+ request.SESSION.delete('add_cluster')
+ request.SESSION.delete('add_cluster_initial')
+ except:
+ pass
try:
- nodeList = requestResults['nodeList']
- if not nodeList or len(nodeList) < 1:
- raise Exception, 'no node list found'
- except Exception, e:
- luci_log.debug_verbose('VAC3: no nodeList found: %s', str(e))
- return (False, { 'errors': ['No cluster nodes were given.'], 'requestResults': requestResults })
+ cluster_name = request.form['clusterName'].strip()
+ except:
+ luci_log.debug_verbose('VAC0: no cluster name')
+ errors.append('No cluster name was given.')
try:
- nodeHash = requestResults['nodeHash']
+ cluster_os = request.form['cluster_os'].strip()
except:
- nodeHash = {}
+ luci_log.debug_verbose('VAC1: no cluster os')
+ errors.append('Unable to determine the version of cluster %s.' % cluster_name)
+ check_certs = False
try:
- rnodeHash = requestResults['rnodeHash']
+ check_certs = 'check_certs' in request.form
except:
- rnodeHash = {}
+ check_certs = False
- # This should never fail
try:
- numStorage = int(request.form['numStorage'])
- if numStorage != len(nodeList):
- raise Exception, 'numstorage != len(nodelist)'
- except Exception, e:
+ pass_num = int(request.form['pass'].strip()) + 1
+ except:
+ pass_num = 1
+
+ same_node_passwds = False
+ try:
+ same_node_passwds = 'allSameCheckBox' in request.form
+ except:
+ same_node_passwds = False
+
+ add_cluster = { 'name': cluster_name,
+ 'pass': pass_num,
+ 'cluster_os': cluster_os,
+ 'identical_passwds': same_node_passwds,
+ 'check_certs': check_certs }
+
+ system_list, incomplete, new_errors, messages = parseHostForm(request, check_certs)
+ errors.extend(new_errors)
+ add_cluster['nodes'] = system_list
+
+ for i in system_list:
+ cur_system = system_list[i]
+
+ cur_host_trusted = 'trusted' in cur_system
+ cur_host = cur_system['host']
+ prev_auth = False
try:
- requestResults['isComplete'] = False
- luci_log.debug_verbose('VAC4: error: %s' % str(e))
+ cur_passwd = cur_system['passwd']
except:
- pass
+ cur_passwd = None
- nodeUnauth(nodeList)
- return (False, {
- 'errors': [ 'Unknown number of nodes entered' ],
- 'requestResults': requestResults })
+ if (cur_host_trusted or not check_certs) and cur_passwd:
+ try:
+ rc = RicciCommunicator(cur_host, enforce_trust=False)
+ prev_auth = rc.authed()
+ except Exception, e:
+ errors.append('Unable to connect to the ricci agent on %s: %s' \
+ % (cur_host, str(e)))
+ incomplete = True
+ cur_system['errors'] = True
+ luci_log.debug_verbose('VAC2: %s: %s' % cur_host, str(e))
+ continue
- i = 0
- while i < numStorage:
- sysData = request.form['__SYSTEM' + str(i)]
- if not sysData:
- i += 1
- continue
+ try:
+ rc.auth(cur_passwd)
+ if not rc.authed():
+ raise Exception, 'authentication failed'
+ except Exception, e:
+ errors.append('Unable to authenticate to the ricci agent on %s: %s' \
+ % (cur_host, str(e)))
+ incomplete = True
+ cur_system['errors'] = True
+ luci_log.debug_verbose('VAC3: %s: %s' % cur_host, str(e))
+ continue
- oldNode = None
- node = nodeAuth(clusterName, sysData[0], sysData[1])
- if node['host'] in nodeHash:
- oldNode = nodeHash[node['host']]
- elif 'ricci_host' in node and node['ricci_host'] in rnodeHash:
- oldNode = rnodeHash[node['ricci_host']]
- elif not oldNode:
- for k in nodeHash.keys():
- if node['host'][:len(k) + 1] == k + '.':
- oldNode = nodeHash[k]
- elif not oldNode:
- for k in rnodeHash.keys():
- if node['host'][:len(k) + 1] == k + '.':
- oldNode = rnodeHash[k]
-
- if not oldNode:
- luci_log.debug_verbose('VAC5: node %s not found', sysData[0])
- nodeUnauth(nodeList)
- return (False, { 'errors': [ 'A data integrity error has occurred. Please attempt adding the cluster again.' ], 'requestResults': { 'clusterName': clusterName, 'nodeList': nodeList, 'isComplete': False, 'redirect': HOMEBASE_ADD_CLUSTER_INITIAL } })
-
- if oldNode['host'] != node['host']:
- del nodeHash[oldNode['host']]
- oldNode['host'] = node['host']
- nodeHash[node['host']] = oldNode
-
- if 'ricci_host' in node and (not 'ricci_host' in oldNode or node['ricci_host'] != oldNode['ricci_host']):
- if oldNode['ricci_host'] in rnodeHash:
- del rnodeHash[oldNode['ricci_host']]
- oldNode['ricci_host'] = node['ricci_host']
- rnodeHash[node['ricci_host']] = oldNode
-
- oldNode['cur_auth'] = node['cur_auth']
- if 'errors' in node:
- errors.append(node['errors'])
- oldNode['errors'] = True
- i += 1
+ cluster_info = rc.cluster_info()
+ if cluster_info[0] != cluster_name and cluster_info[1] != cluster_name:
+ incomplete = True
+ cur_system['errors'] = True
+
+ if cluster_info[0]:
+ cur_cluster_name = cluster_info[0]
+ else:
+ cur_cluster_name = cluster_info[1]
+
+ if cur_cluster_name:
+ err_msg = 'Node %s reports it is in cluster \"%s\" and we expect \"%s\"' \
+ % (cur_host, cur_cluster_name % cluster_name)
+ else:
+ err_msg = 'Node %s reports it is not a member of any cluster' % cur_host
+
+ if not prev_auth:
+ try:
+ rc.unauth()
+ except:
+ luci_log.debug_verbose('VAC4: %s: %s' % (cur_host, str(e)))
- if must_complete == True:
- dfn = lambda x: not 'cur_auth' in x or x['cur_auth'] != True
- else:
- dfn = lambda x: False
+ errors.append(err_msg)
+ luci_log.debug_verbose('VAC5: %s' % err_msg)
+ continue
- clusterComplete = len(filter(dfn, nodeList)) == 0
+ cur_os = resolveOSType(rc.os())
+ if cur_os != cluster_os:
+ incomplete = True
+ cur_system['errors'] = True
+
+ if not prev_auth:
+ try:
+ rc.unauth()
+ except Exception, e:
+ luci_log.debug_verbose('VAC6: %s: %s' % (cur_host, str(e)))
- if clusterComplete:
- err = manageCluster(self, clusterName, nodeList)
- if err:
- errors.append(err)
+ err_msg = 'Node %s reports its cluster version is %s and we expect %s' \
+ % (cur_os, cluster_os)
+
+ errors.append(err_msg)
+ luci_log.debug_verbose('VAC7: %s' % err_msg)
+ continue
else:
- messages.append('Cluster \"' + clusterName + '\" has been added to the Luci management interface.')
- else:
- sfn = lambda x, y: \
- x['cur_auth'] - y['cur_auth'] or (('errors' in y) - ('errors' in x))
- nodeList.sort(sfn)
-
- ret = { 'messages': messages, 'errors': errors }
-
- if len(errors) > 0 or not clusterComplete:
- ret['requestResults'] = {
- 'clusterName': clusterName,
- 'nodeList': nodeList,
- 'nodeHash': nodeHash,
- 'rnodeHash': rnodeHash,
- 'isComplete': clusterComplete
- }
- else:
- ret['requestResults'] = {
- 'redirect': HOMEBASE_ADD_CLUSTER_INITIAL,
- 'clusterName': clusterName,
- 'isComplete': True
- }
+ incomplete = True
- return (len(errors) < 1, ret)
+ if len(errors) > 0:
+ incomplete = True
+
+ if not incomplete or request.form.has_key('asis'):
+ err_msg = manageCluster(self, cluster_name, system_list, cluster_os)
+ if err_msg:
+ incomplete = True
+ errors.append('An error occurred while creating the database objects for cluster %s: %s' \
+ % (cluster_name, err_msg))
+ luci_log.debug_verbose('VAC7: error adding cluster DB objects for %s: %s' \
+ % (cluster_name, err_msg))
+ else:
+ messages.append('Cluster %s is now managed by Luci' % cluster_name)
+ incomplete = False
+
+ if incomplete:
+ add_cluster['incomplete'] = True
+ request.SESSION.set('add_cluster', add_cluster)
+ return_code = False
+ else:
+ return_code = True
+
+ return (return_code, {'errors': errors, 'messages': messages })
def validateAddSystem(self, request):
- errors = list()
- messages = list()
+ try:
+ request.SESSION.delete('add_systems')
+ except:
+ pass
+ check_certs = False
try:
- numStorage = request.form['numStorage']
+ check_certs = 'check_certs' in request.form
except:
- return (False, { 'errors': ['Unknown number of systems entered'] })
+ check_certs = False
+
+ add_systems, incomplete, errors, messages = parseHostForm(request, check_certs)
+ delete_keys = list()
+ for i in add_systems:
+ cur_system = add_systems[i]
+
+ cur_host_trusted = 'trusted' in cur_system
+ cur_host = cur_system['host']
- i = 0
- while i < numStorage:
try:
- sysData = request.form['__SYSTEM' + str(i)]
+ cur_passwd = cur_system['passwd']
except:
- break
-
- if len(sysData) == 2 and sysData[0] != '' and sysData[1] != '':
- csResult = createSystem(self, sysData[0], sysData[1])
+ cur_passwd = None
+ if (cur_host_trusted or not check_certs) and cur_passwd:
+ csResult = createSystem(self, cur_host, cur_passwd)
if csResult:
+ incomplete = True
+ cur_system['error'] = True
errors.append(csResult)
else:
- messages.append('Added storage system \"' + sysData[0] + '\" successfully')
- i += 1
+ delete_keys.append(i)
+ messages.append('Added storage system \"%s\" successfully' \
+ % cur_host)
+
+ for i in delete_keys:
+ try:
+ del add_systems[i]
+ except:
+ pass
if len(errors) > 0:
- returnCode = False
+ return_code = False
else:
- returnCode = True
+ return_code = True
+
+ if incomplete:
+ try:
+ request.SESSION.set('add_systems', add_systems)
+ except Exception, e:
+ luci_log.debug_verbose('validateSA2: %s' % str(e))
+ return_code = False
+ else:
+ try:
+ request.SESSION.delete('add_systems')
+ del add_systems
+ except:
+ pass
- return (returnCode, {'errors': errors, 'messages': messages})
+ return (return_code, { 'errors': errors, 'messages': messages})
def validatePerms(self, request):
userId = None
@@ -599,62 +763,99 @@
return (returnCode, {'errors': errors, 'messages': messages, 'params': {'user': userId }})
def validateAuthenticate(self, request):
- errors = list()
- messages = list()
+ try:
+ request.SESSION.delete('auth_systems')
+ except:
+ pass
+ check_certs = False
try:
- numStorage = int(request.form['numStorage'])
+ check_certs = 'check_certs' in request.form
except:
- return (False, {'errors': [ 'Unknown number of nodes entered']})
+ check_certs = False
- i = 0
- while i < numStorage:
- sysData = request.form['__SYSTEM' + str(i)]
- if not sysData or len(sysData) < 2 or not sysData[0] or not sysData[1]:
- i += 1
- continue
+ system_list, incomplete, errors, messages = parseHostForm(request, check_certs)
+ delete_keys = list()
+ for i in system_list:
+ cur_system = system_list[i]
- host = str(sysData[0])
- passwd = str(sysData[1])
+ cur_host_trusted = 'trusted' in cur_system
+ cur_host = cur_system['host']
try:
- rc = RicciCommunicator(sysData[0])
- if rc is None:
- raise Exception, 'unknown error'
- except Exception, e:
- errors.append('Unable to contact the ricci agent for %s: %s' \
- % (sysData[0], str(e)))
- i += 1
- continue
+ cur_passwd = cur_system['passwd']
+ except:
+ cur_passwd = None
- if rc.authed():
- messages.append(host + ' is already authenticated.')
- else:
+ if (cur_host_trusted or not check_certs) and cur_passwd:
try:
- rc.auth(passwd)
- except:
- errors.append('Error authenticating to the ricci agent on ' + host)
- i += 1
+ rc = RicciCommunicator(cur_host, enforce_trust=True)
+ if not rc:
+ raise Exception, 'connection failed'
+ except Exception, e:
+ luci_log.debug_verbose('validateAuth0: %s: %s' % (cur_host, str(e)))
+ errors.append('Unable to communicate with the ricci agent on %s: %s' \
+ % (cur_host, str(e)))
+ incomplete = True
+ cur_system['error'] = True
continue
- if not rc.authed():
- errors.append('Error authenticating to the ricci agent on ' + host)
- else:
- messages.append(host + ' was successfully authenticated.')
-
- if rc.authed():
+ try:
+ if rc.authed():
+ messages.append('%s is already authenticated.' % cur_host)
+ else:
+ rc.auth(cur_passwd)
+ if not rc.authed():
+ raise Exception, 'authentication failed'
+ messages.append('Authenticated to %s successfully' \
+ % cur_host)
+ delete_keys.append(i)
try:
- delNodeFlag(self, getStorageNode(self, host), CLUSTER_NODE_NEED_AUTH)
+ delNodeFlag(self, getStorageNode(self, cur_host), CLUSTER_NODE_NEED_AUTH)
except:
pass
try:
- delNodeFlag(self, getClusterNode(self, host, rc.cluster_info()[0]), CLUSTER_NODE_NEED_AUTH)
+ delNodeFlag(self, getClusterNode(self, cur_host, rc.cluster_info()[0]), CLUSTER_NODE_NEED_AUTH)
except:
pass
- i += 1
-
- return (len(errors) > 0, {'errors': errors, 'messages': messages })
+ except Exception, e:
+ errors.append('Unable to authenticate to %s: %s' % (cur_host, str(e)))
+ luci_log.debug_verbose('validateAuth1: %s: %s' % (cur_host, str(e)))
+ incomplete = True
+ cur_system['error'] = True
+
+ for i in delete_keys:
+ try:
+ del system_list[i]
+ except:
+ pass
+
+ if len(errors) > 0:
+ return_code = False
+ else:
+ return_code = True
+
+ if incomplete:
+ try:
+ request.SESSION.set('auth_systems', system_list)
+ except Exception, e:
+ luci_log.debug_verbose('validateAuthenticate2: %s' % str(e))
+ return_code = False
+ else:
+ try:
+ request.SESSION.delete('auth_systems')
+ del auth_systems
+ except:
+ pass
+
+ auth_msgs = {}
+ if len(errors) > 0:
+ auth_msgs['errors'] = errors
+ if len(messages) > 0:
+ auth_msgs['messages'] = messages
+ request.SESSION.set('auth_status', auth_msgs)
+ request.response.redirect('/luci/homebase/index_html?pagetype=5')
formValidators = [
validateAddUser,
@@ -690,11 +891,6 @@
return False
def homebaseControlPost(self, request):
- try:
- sessionData = request.SESSION.get('checkRet')
- except:
- sessionData = None
-
if 'ACTUAL_URL' in request:
url = request['ACTUAL_URL']
else:
@@ -718,24 +914,14 @@
pass
return homebasePortal(self, request, '.', '0')
- if validatorFn == validateAddClusterInitial or validatorFn == validateAddCluster:
- ret = validatorFn(self, request, must_complete=False)
- else:
- ret = validatorFn(self, request)
+ ret = validatorFn(self, request)
params = None
- if 'params' in ret[1]:
- params = ret[1]['params']
-
- if 'requestResults' in ret[1]:
- requestResults = ret[1]['requestResults']
+ if ret and len(ret) > 1 and ret[1]:
+ if 'params' in ret[1]:
+ params = ret[1]['params']
+ request.SESSION.set('checkRet', ret[1])
- if 'redirect' in requestResults:
- pagetype = requestResults['redirect']
- request['pagetype'] = pagetype
- request.form['pagetype'] = pagetype
-
- request.SESSION.set('checkRet', ret[1])
return homebasePortal(self, request, url, pagetype, params)
def homebaseControl(self, request):
@@ -789,33 +975,12 @@
# Initial add cluster page
try:
- if pagetype == HOMEBASE_ADD_CLUSTER:
- raise
if havePermAddCluster(self):
addCluster = {}
addCluster['Title'] = 'Add an Existing Cluster'
addCluster['absolute_url'] = url + '?pagetype=' + HOMEBASE_ADD_CLUSTER_INITIAL
addCluster['Description'] = 'Add an existing cluster to the Luci cluster management interface.'
- if pagetype == HOMEBASE_ADD_CLUSTER_INITIAL:
- addCluster['currentItem'] = True
- ret['curIndex'] = index
- cur = addCluster
- else:
- addCluster['currentItem'] = False
- index += 1
- temp.append(addCluster)
- except: pass
-
- # Add cluster - screen 2
- try:
- if pagetype != HOMEBASE_ADD_CLUSTER:
- raise
- if havePermAddCluster(self):
- addCluster = {}
- addCluster['Title'] = 'Add an Existing Cluster'
- addCluster['absolute_url'] = url + '?pagetype=' + HOMEBASE_ADD_CLUSTER
- addCluster['Description'] = 'Add an existing cluster to the Luci cluster management interface.'
- if pagetype == HOMEBASE_ADD_CLUSTER:
+ if pagetype == HOMEBASE_ADD_CLUSTER_INITIAL or pagetype == HOMEBASE_ADD_CLUSTER:
addCluster['currentItem'] = True
ret['curIndex'] = index
cur = addCluster
@@ -923,7 +1088,7 @@
def getClusterSystems(self, clusterName):
if isAdmin(self):
try:
- return self.restrictedTraverse(PLONE_ROOT + '/systems/cluster/' + clusterName + '/objectItems')('Folder')
+ return self.restrictedTraverse(CLUSTER_FOLDER_PATH + clusterName + '/objectItems')('Folder')
except Exception, e:
luci_log.debug_verbose('GCSy0: %s: %s' % (clusterName, str(e)))
return None
@@ -937,7 +1102,7 @@
return None
try:
- csystems = self.restrictedTraverse(PLONE_ROOT + '/systems/cluster/' + clusterName + '/objectItems')('Folder')
+ csystems = self.restrictedTraverse(CLUSTER_FOLDER_PATH + clusterName + '/objectItems')('Folder')
if not csystems or len(csystems) < 1:
return None
except Exception, e:
@@ -1024,20 +1189,19 @@
def createSystem(self, host, passwd):
try:
- exists = self.restrictedTraverse(PLONE_ROOT +'/systems/storage/' + host)
+ dummy = self.restrictedTraverse(STORAGE_FOLDER_PATH + host)
luci_log.debug_verbose('CS0: %s already exists' % host)
return 'Storage system %s is already managed' % host
except:
pass
try:
- rc = RicciCommunicator(host)
+ rc = RicciCommunicator(host, enforce_trust=True)
if rc is None:
- raise Exception, 'unknown error'
+ raise Exception, 'rc is None'
except Exception, e:
luci_log.debug_verbose('CS1: %s: %s' % (host, str(e)))
- return 'Unable to establish a connection to the ricci agent on %s: %s' \
- % (host, str(e))
+ return 'Unable to establish a secure connection to the ricci agent on %s: %s' % (host, str(e))
try:
if not rc.authed():
@@ -1056,21 +1220,21 @@
return 'Authentication for storage system %s failed' % host
try:
- exists = self.restrictedTraverse(PLONE_ROOT + '/systems/storage/' + host)
+ dummy = self.restrictedTraverse(STORAGE_FOLDER_PATH + host)
luci_log.debug_verbose('CS4 %s already exists' % host)
return 'Storage system %s is already managed' % host
except:
pass
try:
- ssystem = self.restrictedTraverse(PLONE_ROOT + '/systems/storage/')
+ ssystem = self.restrictedTraverse(STORAGE_FOLDER_PATH)
except Exception, e:
luci_log.debug_verbose('CS5 %s: %s' % (host, str(e)))
return 'Unable to create storage system %s: %s' % host
try:
ssystem.manage_addFolder(host, '__luci__:system')
- newSystem = self.restrictedTraverse(PLONE_ROOT + '/systems/storage/' + host)
+ newSystem = self.restrictedTraverse(STORAGE_FOLDER_PATH + host)
except Exception, e:
luci_log.debug_verbose('CS6 %s: %s' % (host, str(e)))
return 'Unable to create DB entry for storage system %s' % host
@@ -1085,28 +1249,22 @@
return None
def abortManageCluster(self, request):
- try:
- sessionData = request.SESSION.get('checkRet')
- nodeUnauth(sessionData['requestResults']['nodeList'])
- except Exception, e:
- luci_log.debug_verbose('AMC0: %s' % str(e))
+ pass
-def manageCluster(self, clusterName, nodeList):
+def manageCluster(self, clusterName, node_list, cluster_os):
clusterName = str(clusterName)
try:
- clusters = self.restrictedTraverse(PLONE_ROOT + '/systems/cluster/')
+ clusters = self.restrictedTraverse(CLUSTER_FOLDER_PATH)
if not clusters:
raise Exception, 'cannot find the cluster entry in the DB'
except Exception, e:
- nodeUnauth(nodeList)
luci_log.debug_verbose('MC0: %s: %s' % (clusterName, str(e)))
return 'Unable to create cluster %s: the cluster directory is missing.' % clusterName
try:
- newCluster = self.restrictedTraverse(PLONE_ROOT + '/systems/cluster/' + clusterName)
+ newCluster = self.restrictedTraverse(CLUSTER_FOLDER_PATH + clusterName)
if newCluster:
- nodeUnauth(nodeList)
luci_log.debug_verbose('MC1: cluster %s: already exists' % clusterName)
return 'A cluster named %s is already managed by Luci' % clusterName
except:
@@ -1114,11 +1272,10 @@
try:
clusters.manage_addFolder(clusterName, '__luci__:cluster')
- newCluster = self.restrictedTraverse(PLONE_ROOT + '/systems/cluster/' + clusterName)
+ newCluster = self.restrictedTraverse(CLUSTER_FOLDER_PATH + clusterName)
if not newCluster:
raise Exception, 'unable to create the cluster DB entry for %s' % clusterName
except Exception, e:
- nodeUnauth(nodeList)
luci_log.debug_verbose('MC2: %s: %s' % (clusterName, str(e)))
return 'Unable to create cluster %s: %s' % (clusterName, str(e))
@@ -1127,7 +1284,6 @@
newCluster.manage_role('View', ['Access Contents Information', 'View'])
except Exception, e:
luci_log.debug_verbose('MC3: %s: %s' % (clusterName, str(e)))
- nodeUnauth(nodeList)
try:
clusters.manage_delObjects([clusterName])
except Exception, e:
@@ -1135,34 +1291,22 @@
return 'Unable to set permissions on new cluster: %s: %s' % (clusterName, str(e))
try:
- cluster_os = nodeList[0]['os']
- if not cluster_os:
- raise KeyError, 'Cluster OS is blank'
- except KeyError, e:
- luci_log.debug_verbose('MC5: %s: %s' % (clusterName, str(e)))
- cluster_os = 'rhel5'
-
- try:
newCluster.manage_addProperty('cluster_os', cluster_os, 'string')
except Exception, e:
luci_log.debug_verbose('MC5: %s: %s: %s' \
% (clusterName, cluster_os, str(e)))
- for i in nodeList:
- #if 'ricci_host' in i:
- # host = str(i['ricci_host'])
- #else:
- host = str(i['host'])
+ for i in node_list:
+ host = node_list[i]['host']
try:
newCluster.manage_addFolder(host, '__luci__:csystem:' + clusterName)
- newSystem = self.restrictedTraverse(PLONE_ROOT + '/systems/cluster/' + clusterName + '/' + host)
+ newSystem = self.restrictedTraverse(str(CLUSTER_FOLDER_PATH + clusterName + '/' + host))
if not newSystem:
raise Exception, 'unable to create cluster system DB entry for node %s' % host
newSystem.manage_acquiredPermissions([])
newSystem.manage_role('View', [ 'Access contents information' , 'View' ])
except Exception, e:
- nodeUnauth(nodeList)
try:
clusters.manage_delObjects([clusterName])
except Exception, e:
@@ -1175,7 +1319,7 @@
% (host, clusterName, str(e))
try:
- ssystem = self.restrictedTraverse(PLONE_ROOT + '/systems/storage/')
+ ssystem = self.restrictedTraverse(STORAGE_FOLDER_PATH)
if not ssystem:
raise Exception, 'The storage DB entry is missing'
except Exception, e:
@@ -1184,83 +1328,78 @@
# Only add storage systems if the cluster and cluster node DB
# objects were added successfully.
- for i in nodeList:
- #if 'ricci_host' in i:
- # host = str(i['ricci_host'])
- #else:
- host = str(i['host'])
+ for i in node_list:
+ host = node_list[i]['host']
try:
# It's already there, as a storage system, no problem.
- exists = self.restrictedTraverse(PLONE_ROOT + '/systems/storage/' + host)
+ dummy = self.restrictedTraverse(str(STORAGE_FOLDER_PATH + host))
continue
except:
pass
try:
ssystem.manage_addFolder(host, '__luci__:system')
- newSystem = self.restrictedTraverse(PLONE_ROOT + '/systems/storage/' + host)
+ newSystem = self.restrictedTraverse(STORAGE_FOLDER_PATH + host)
newSystem.manage_acquiredPermissions([])
newSystem.manage_role('View', [ 'Access contents information' , 'View' ])
except Exception, e:
luci_log.debug_verbose('MC9: %s: %s: %s' % (clusterName, host, str(e)))
-def createClusterSystems(self, clusterName, nodeList):
+def createClusterSystems(self, clusterName, node_list):
try:
- clusterObj = self.restrictedTraverse(PLONE_ROOT + '/systems/cluster/' + clusterName)
+ clusterObj = self.restrictedTraverse(CLUSTER_FOLDER_PATH + clusterName)
if not clusterObj:
raise Exception, 'cluster %s DB entry is missing' % clusterName
except Exception, e:
- nodeUnauth(nodeList)
luci_log.debug_verbose('CCS0: %s: %s' % (clusterName, str(e)))
- return 'No cluster named \"' + clusterName + '\" is managed by Luci'
+ return 'No cluster named \"%s\" is managed by Luci' % clusterName
- for i in nodeList:
- #if 'ricci_host' in i:
- # host = str(i['ricci_host'])
- #else:
+ for x in node_list:
+ i = node_list[x]
host = str(i['host'])
try:
clusterObj.manage_addFolder(host, '__luci__:csystem:' + clusterName)
- newSystem = self.restrictedTraverse(PLONE_ROOT + '/systems/cluster/' + clusterName + '/' + host)
+ except Exception, e:
+ luci_log.debug_verbose('CCS0a: %s: %s: %s' % (clusterName, host, str(e)))
+ try:
+ newSystem = self.restrictedTraverse(CLUSTER_FOLDER_PATH + clusterName + '/' + host)
if not newSystem:
raise Exception, 'cluster node DB entry for %s disappeared from under us' % host
newSystem.manage_acquiredPermissions([])
newSystem.manage_role('View', [ 'Access contents information' , 'View' ])
except Exception, e:
- nodeUnauth(nodeList)
luci_log.debug_verbose('CCS1: %s: %s: %s' % (clusterName, host, str(e)))
return 'Unable to create cluster node %s for cluster %s: %s' \
% (host, clusterName, str(e))
try:
- ssystem = self.restrictedTraverse(PLONE_ROOT + '/systems/storage/')
+ ssystem = self.restrictedTraverse(STORAGE_FOLDER_PATH)
if not ssystem:
raise Exception, 'storage DB entry is missing'
except Exception, e:
+ # This shouldn't fail, but if it does, it's harmless right now
luci_log.debug_verbose('CCS2: %s: %s' % (clusterName, host, str(e)))
- return
+ return None
# Only add storage systems if the and cluster node DB
# objects were added successfully.
- for i in nodeList:
- #if 'ricci_host' in i:
- # host = str(i['ricci_host'])
- #else:
+ for x in node_list:
+ i = node_list[x]
host = str(i['host'])
try:
# It's already there, as a storage system, no problem.
- exists = self.restrictedTraverse(PLONE_ROOT + '/systems/storage/' + host)
+ dummy = self.restrictedTraverse(STORAGE_FOLDER_PATH + host)
continue
except:
pass
try:
ssystem.manage_addFolder(host, '__luci__:system')
- newSystem = self.restrictedTraverse(PLONE_ROOT + '/systems/storage/' + host)
+ newSystem = self.restrictedTraverse(STORAGE_FOLDER_PATH + host)
newSystem.manage_acquiredPermissions([])
newSystem.manage_role('View', [ 'Access contents information' , 'View' ])
except Exception, e:
@@ -1268,7 +1407,7 @@
def delSystem(self, systemName):
try:
- ssystem = self.restrictedTraverse(PLONE_ROOT + '/systems/storage/')
+ ssystem = self.restrictedTraverse(STORAGE_FOLDER_PATH)
if not ssystem:
raise Exception, 'storage DB entry is missing'
except Exception, e:
@@ -1298,7 +1437,7 @@
pass
else:
try:
- newSystem = self.restrictedTraverse(PLONE_ROOT + '/systems/cluster/' + cluster_info[0] + '/' + systemName)
+ dummy = self.restrictedTraverse(CLUSTER_FOLDER_PATH + cluster_info[0] + '/' + systemName)
except:
try:
rc.unauth()
@@ -1314,7 +1453,7 @@
def delCluster(self, clusterName):
try:
- clusters = self.restrictedTraverse(PLONE_ROOT + '/systems/cluster/')
+ clusters = self.restrictedTraverse(CLUSTER_FOLDER_PATH)
if not clusters:
raise Exception, 'clusters DB entry is missing'
except Exception, e:
@@ -1333,7 +1472,7 @@
def delClusterSystem(self, cluster, systemName):
try:
- if not self.restrictedTraverse(PLONE_ROOT + '/systems/storage/' + systemName):
+ if not self.restrictedTraverse(STORAGE_FOLDER_PATH + systemName):
raise
except:
# It's not a storage system, so unauthenticate.
@@ -1353,7 +1492,7 @@
def delClusterSystems(self, clusterName):
try:
- cluster = self.restrictedTraverse(PLONE_ROOT + '/systems/cluster/' + clusterName)
+ cluster = self.restrictedTraverse(CLUSTER_FOLDER_PATH + clusterName)
if not cluster:
raise Exception, 'cluster DB entry is missing'
@@ -1510,7 +1649,7 @@
def getClusterNode(self, nodename, clustername):
try:
- cluster_node = self.restrictedTraverse(PLONE_ROOT + '/systems/cluster/' + str(clustername) + '/' + str(nodename))
+ cluster_node = self.restrictedTraverse(CLUSTER_FOLDER_PATH + str(clustername) + '/' + str(nodename))
if not cluster_node:
raise Exception, 'cluster node is none'
return cluster_node
@@ -1521,7 +1660,7 @@
def getStorageNode(self, nodename):
try:
- storage_node = self.restrictedTraverse(PLONE_ROOT + '/systems/storage/' + '/' + str(nodename))
+ storage_node = self.restrictedTraverse(STORAGE_FOLDER_PATH + str(nodename))
if not storage_node:
raise Exception, 'storage node is none'
return storage_node
--- conga/luci/site/luci/Extensions/ricci_bridge.py 2006/12/12 19:03:06 1.51
+++ conga/luci/site/luci/Extensions/ricci_bridge.py 2006/12/21 05:08:49 1.52
@@ -597,6 +597,8 @@
# temporary workaround for ricci bug
system_info = rc.hostname()
try:
+# FIXME
+# rc = RicciCommunicator(system_info, enforce_trust=True)
rc = RicciCommunicator(system_info)
if rc is None:
raise Exception, 'unknown error'
--- conga/luci/site/luci/Extensions/ricci_communicator.py 2006/12/06 22:34:09 1.22
+++ conga/luci/site/luci/Extensions/ricci_communicator.py 2006/12/21 05:08:49 1.23
@@ -83,7 +83,19 @@
luci_log.debug_verbose('RC:dom0: [auth %d] reported system_name = %s for %s' \
% (self.__authed, self.__dom0, self.__hostname))
return self.__dom0
-
+
+ def fingerprint(self):
+ return self.ss.peer_fingerprint()
+
+ def trust(self):
+ return self.ss.trust()
+
+ def untrust(self):
+ return self.ss.untrust()
+
+ def trusted(self):
+ return self.ss.trusted()
+
def auth(self, password):
if self.authed():
luci_log.debug_verbose('RC:auth0: already authenticated to %s' \
@@ -126,6 +138,10 @@
% (ret, self.__hostname))
if ret != '0':
raise Exception, 'Invalid response'
+ try:
+ self.ss.untrust()
+ except:
+ pass
except:
errstr = 'Error authenticating to host %s: %s' \
% (self.__hostname, str(ret))
next reply other threads:[~2006-12-21 5:08 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-12-21 5:08 rmccabe [this message]
-- strict thread matches above, loose matches on Subject: below --
2007-07-26 4:16 [Cluster-devel] conga/luci cluster/form-macros cluster/index_h rmccabe
2007-02-20 23:09 rmccabe
2007-02-20 23:07 rmccabe
2006-11-07 21:33 rmccabe
2006-11-03 19:13 rmccabe
2006-10-31 17:28 rmccabe
2006-10-16 4:26 rmccabe
2006-09-08 22:54 rmccabe
2006-07-19 20:20 rmccabe
2006-07-05 20:13 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=20061221050851.26921.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.