[luci] luci: Add support for TNS_ADMIN in oracle agents
by Ryan McCabe
commit 866c980e4224682344794fb5a999c8cec69cdfda
Author: Ryan McCabe <rmccabe(a)redhat.com>
Date: Mon Aug 12 23:51:44 2013 -0400
luci: Add support for TNS_ADMIN in oracle agents
Add support for setting and viewing the newly-added
"tns_admin" attribute for oracledb, orainstance, and oralistener.
Resolves: rhbz#983693
Signed-off-by: Ryan McCabe <rmccabe(a)redhat.com>
luci/templates/resource_list.html | 21 +++++++++++++++++++++
luci/validation/validate_resource.py | 3 +++
2 files changed, 24 insertions(+), 0 deletions(-)
---
diff --git a/luci/templates/resource_list.html b/luci/templates/resource_list.html
index 6549bbf..3cfd829 100644
--- a/luci/templates/resource_list.html
+++ b/luci/templates/resource_list.html
@@ -1443,6 +1443,13 @@
py:attrs="res and {'value':res.getAttribute('vhost'), 'disabled':global_resource and 'disabled' or None} or {}" />
</td>
</tr>
+ <tr>
+ <td>TNS_ADMIN (optional)</td>
+ <td>
+ <input type="text" class="text" name="tns_admin"
+ py:attrs="res and {'value':res.getAttribute('tns_admin'), 'disabled':global_resource and 'disabled' or None} or {}" />
+ </td>
+ </tr>
${res_footer(res)}
</table>
</div>
@@ -1494,6 +1501,13 @@
py:attrs="res and {'value':res.getAttribute('lockfile'), 'disabled':global_resource and 'disabled' or None} or {}" />
</td>
</tr>
+ <tr>
+ <td>TNS_ADMIN (optional)</td>
+ <td>
+ <input type="text" class="text" name="tns_admin"
+ py:attrs="res and {'value':res.getAttribute('tns_admin'), 'disabled':global_resource and 'disabled' or None} or {}" />
+ </td>
+ </tr>
${res_footer(res)}
</table>
</div>
@@ -1531,6 +1545,13 @@
py:attrs="res and {'value':res.getAttribute('home'), 'disabled':global_resource and 'disabled' or None} or {}" />
</td>
</tr>
+ <tr>
+ <td>TNS_ADMIN (optional)</td>
+ <td>
+ <input type="text" class="text" name="tns_admin"
+ py:attrs="res and {'value':res.getAttribute('tns_admin'), 'disabled':global_resource and 'disabled' or None} or {}" />
+ </td>
+ </tr>
${res_footer(res)}
</table>
</div>
diff --git a/luci/validation/validate_resource.py b/luci/validation/validate_resource.py
index c6cd8c8..2c67d62 100644
--- a/luci/validation/validate_resource.py
+++ b/luci/validation/validate_resource.py
@@ -445,6 +445,7 @@ def addOracleDB(res, rname, model, **kw):
params = (
('user', _('Oracle User Name'), True, None),
('home', _('Oracle Home Directory'), True, None),
+ ('tns_admin', _('Value for TNS_ADMIN'), False, None),
('listener_name', '', False, None),
('oracletype', _('Oracle Installation Type'), True, '10g'),
('vhost', _('Virtual Hostname'), False, None)
@@ -462,6 +463,7 @@ def addOracleInstance(res, rname, model, **kw):
params = (
('user', _('Oracle User Name'), True, None),
('home', _('Oracle Home Directory'), True, None),
+ ('tns_admin', _('Value for TNS_ADMIN'), False, None),
('listeners', _('Oracle listeners'), False, None),
('lockfile', _('Path to lock file'), False, None),
)
@@ -472,6 +474,7 @@ def addOracleListener(res, rname, model, **kw):
params = (
('user', _('Oracle User Name'), True, None),
('home', _('Oracle Home Directory'), True, None),
+ ('tns_admin', _('Value for TNS_ADMIN'), False, None),
)
errors = config_resource(params, res, rname, **kw)
return errors
10 years, 9 months
[luci] luci: Ask for confirmation when removing a cluster
by Ryan McCabe
commit ce0e40cea64a46425ea3ec200b70c190f28ece47
Author: Ryan McCabe <rmccabe(a)redhat.com>
Date: Mon Aug 12 16:44:31 2013 -0400
luci: Ask for confirmation when removing a cluster
Ask for user confirmation when removing a cluster from the
luci interface.
Resolves: rhbz#917814
Signed-off-by: Ryan McCabe <rmccabe(a)redhat.com>
luci/public/js/cluster_list.js | 95 ++++++++++++++++++++++++++++++++++++++
luci/templates/cluster_list.html | 7 ++-
2 files changed, 100 insertions(+), 2 deletions(-)
---
diff --git a/luci/public/js/cluster_list.js b/luci/public/js/cluster_list.js
index 83e591e..c11af16 100644
--- a/luci/public/js/cluster_list.js
+++ b/luci/public/js/cluster_list.js
@@ -1,4 +1,99 @@
$(function() {
+ var dialog_txt = "Remove the selected clusters from the luci interface?";
+ $('#confirm_cluster_dialog').dialog({
+ modal: true,
+ autoOpen: false,
+ draggable: false,
+ resizable: false,
+ closeOnEscape: false,
+ open: function(event, ui) {
+ $(this).parent().children().children('.ui-dialog-titlebar-close').hide();
+ },
+ buttons: {
+ "Proceed": function() {
+ $(this).dialog("close");
+ },
+ "Cancel": function() {
+ $(this).dialog("close");
+ }
+ }
+ });
+
+ $(".confirm_link").click(function(e) {
+ e.preventDefault();
+ var targetUrl = $(this).attr("href");
+ var trigger_elem_id = $(this).attr("id");
+ var cur_action = null;
+
+ if (trigger_elem_id == 'dh_delete')
+ cur_action = 'Delete';
+ else
+ return true;
+
+ $("#confirm_cluster_dialog").dialog({
+ open: function(event, ui) {
+ $(this).parent().children().children('.ui-dialog-titlebar-close').hide();
+ },
+ closeOnEscape: false,
+ buttons: {
+ "Proceed": function() {
+ window.location.href = targetUrl;
+ $(this).dialog("close");
+ },
+ "Cancel" : function() {
+ $(this).dialog("close");
+ }
+ }
+ });
+ try {
+ $('#cluster_confirm_span').empty();
+ $('#cluster_confirm_span').append(dialog_txt);
+ } catch (e) {}
+ $("#confirm_cluster_dialog").dialog("open");
+ });
+
+ $("[type=submit],[type=image]").bind("click", function(e) {
+ $(this).attr("trigger_elem", "True");
+ });
+
+ $(".confirm_form").submit(function(e) {
+ var cur_form = this;
+ var cur_action = null;
+
+ var trigger_elem = $("[trigger_elem=True]").get(0);
+ if (trigger_elem.id == 'tb_delete')
+ cur_action = 'Remove';
+ else
+ return true;
+ trigger_elem.removeAttribute('trigger_elem');
+ e.preventDefault();
+ var ret = $("#confirm_cluster_dialog").dialog({
+ closeOnEscape: false,
+ open: function(event, ui) {
+ $(this).parent().children().children('.ui-dialog-titlebar-close').hide();
+ },
+ buttons: {
+ "Proceed": function() {
+ $(this).dialog("close");
+ $(cur_form).append('<input type="hidden" name="MultiAction" value="' + cur_action + '"/>');
+ cur_form.submit();
+ return true;
+ },
+ "Cancel" : function() {
+ $(this).dialog("close");
+ return false;
+ }
+ }
+ });
+ try {
+ $('#cluster_confirm_span').empty();
+ $('#cluster_confirm_span').append(dialog_txt);
+ } catch (e) {}
+ $("#confirm_cluster_dialog").dialog("open");
+ });
+})
+
+$(function() {
$('#add_existing_dialog').dialog({
modal: true,
title: 'Add Existing Cluster',
diff --git a/luci/templates/cluster_list.html b/luci/templates/cluster_list.html
index f4551ca..a82e5bf 100644
--- a/luci/templates/cluster_list.html
+++ b/luci/templates/cluster_list.html
@@ -19,14 +19,14 @@
<script type="text/javascript" src="/js/cluster_list.js"></script>
<script type="text/javascript" src="/js/add_existing.js"></script>
- <form action="${tg.url('/' + page + '/delete_cmd')}" method="post">
+ <form class="confirm_form" action="${tg.url('/' + page + '/delete_cmd')}" method="post">
<div class="sectionblock">
<xi:include href="submenu.html"/>
<div id="toolbar">
<a href="#" onclick="$('#add_existing_dialog').dialog('open')" class="toolbar_button" id="tb_add">Add</a>
<a href="#" onclick="$('#create_cluster_dialog').dialog('open')" class="toolbar_button" id="tb_create">Create</a>
- <input type="submit" name="MultiAction" value="${_('Remove')}" class="toolbar_button MultiAction" id="tb_delete" disabled="disabled"/>
+ <input type="submit" name="MultiAction" value="${_('Remove')}" class="confirm_form toolbar_button MultiAction" id="tb_delete" disabled="disabled"/>
</div>
<!--! OVERVIEW SECTION. -->
@@ -120,6 +120,9 @@
</form>
<div id="form_container" class="hidden">
+ <div id="confirm_cluster_dialog" title="Confirm Action">
+ <span id="cluster_confirm_span"></span>
+ </div>
<xi:include href="add_existing.html" />
<div id="create_cluster_dialog">
10 years, 9 months
[luci] luci: Remove useless "remove this instance" button
by Ryan McCabe
commit a455f295951af2b64ba7a88667d8e18f89fb0573
Author: Ryan McCabe <rmccabe(a)redhat.com>
Date: Mon Aug 12 16:44:31 2013 -0400
luci: Remove useless "remove this instance" button
Remove the "remove this instance" button from the fence device
instance creation form because it did nothing at all. There is already
a button to remove an instance on the cluster nodes page.
Resolves: rhbz#886576
Signed-off-by: Ryan McCabe <rmccabe(a)redhat.com>
luci/templates/fence_instances.html | 186 -----------------------------------
1 files changed, 0 insertions(+), 186 deletions(-)
---
diff --git a/luci/templates/fence_instances.html b/luci/templates/fence_instances.html
index 34a0d28..dd42b09 100644
--- a/luci/templates/fence_instances.html
+++ b/luci/templates/fence_instances.html
@@ -58,12 +58,6 @@
</table>
</fieldset>
</td></tr>
- <tr><td colspan="2">
- <div>
- <input type="button" name="remove_fence" value="Remove this instance"
- py:attrs="fi_id is not None and {'onclick': '$(\'#%s\').remove()' % fi_id} or {}"/>
- </div>
- </td></tr>
</table>
<input type="hidden" name="fence_type" value="fence_apc" />
@@ -105,12 +99,6 @@
<input type="hidden" name="unfence_action" value="on" />
</td>
</tr>
- <tr><td colspan="2">
- <div>
- <input type="button" name="remove_fence" value="Remove this instance"
- py:attrs="fi_id is not None and {'onclick': '$(\'#%s\').remove()' % fi_id} or {}"/>
- </div>
- </td></tr>
</table>
<input type="hidden" name="fence_type" value="fence_egenera" />
@@ -150,12 +138,6 @@
py:attrs="cur_fence_inst and {'value': cur_fence_inst.getAttribute('identity_file')}"/>
</td>
</tr>
- <tr><td colspan="2">
- <div>
- <input type="button" name="remove_fence" value="Remove this instance"
- py:attrs="fi_id is not None and {'onclick': '$(\'#%s\').remove()' % fi_id} or {}"/>
- </div>
- </td></tr>
</table>
<input type="hidden" name="fence_type" value="fence_lpar" />
@@ -205,12 +187,6 @@
</table>
</fieldset>
</td></tr>
- <tr><td colspan="2">
- <div>
- <input type="button" name="remove_fence" value="Remove this instance"
- py:attrs="fi_id is not None and {'onclick': '$(\'#%s\').remove()' % fi_id} or {}"/>
- </div>
- </td></tr>
</table>
<input type="hidden" name="fence_type" value="fence_vmware" />
@@ -252,12 +228,6 @@
py:attrs="cur_fence_inst and cur_fence_inst.getAttribute('ssl') and {'checked': 'checked'}"/>
</td>
</tr>
- <tr><td colspan="2">
- <div>
- <input type="button" name="remove_fence" value="Remove this instance"
- py:attrs="fi_id is not None and {'onclick': '$(\'#%s\').remove()' % fi_id} or {}"/>
- </div>
- </td></tr>
</table>
<input type="hidden" name="fence_type" value="fence_vmware_soap" />
@@ -306,12 +276,6 @@
</table>
</fieldset>
</td></tr>
- <tr><td colspan="2">
- <div>
- <input type="button" name="remove_fence" value="Remove this instance"
- py:attrs="fi_id is not None and {'onclick': '$(\'#%s\').remove()' % fi_id} or {}"/>
- </div>
- </td></tr>
</table>
<input type="hidden" name="fence_type" value="fence_wti" />
@@ -360,12 +324,6 @@
</table>
</fieldset>
</td></tr>
- <tr><td colspan="2">
- <div>
- <input type="button" name="remove_fence" value="Remove this instance"
- py:attrs="fi_id is not None and {'onclick': '$(\'#%s\').remove()' % fi_id} or {}"/>
- </div>
- </td></tr>
</table>
<input type="hidden" name="fence_type" value="fence_virsh" />
@@ -391,12 +349,6 @@
py:attrs="cur_fence_inst and {'value': cur_fence_inst.getAttribute('delay')}"/>
</td>
</tr>
- <tr><td colspan="2">
- <div>
- <input type="button" name="remove_fence" value="Remove this instance"
- py:attrs="fi_id is not None and {'onclick': '$(\'#%s\').remove()' % fi_id} or {}"/>
- </div>
- </td></tr>
</table>
<input type="hidden" name="fence_type" value="fence_rhevm" />
@@ -424,12 +376,6 @@
<input type="hidden" name="unfence_action" value="on" />
</td>
</tr>
- <tr><td colspan="2">
- <div>
- <input type="button" name="remove_fence" value="Remove this instance"
- py:attrs="fi_id is not None and {'onclick': '$(\'#%s\').remove()' % fi_id} or {}"/>
- </div>
- </td></tr>
</table>
<input type="hidden" name="fence_type" value="fence_brocade" />
@@ -448,12 +394,6 @@
py:attrs="cur_fence_inst and {'value': cur_fence_inst.getAttribute('port')}"/>
</td>
</tr>
- <tr><td colspan="2">
- <div>
- <input type="button" name="remove_fence" value="Remove this instance"
- py:attrs="fi_id is not None and {'onclick': '$(\'#%s\').remove()' % fi_id} or {}"/>
- </div>
- </td></tr>
</table>
<input type="hidden" name="fence_type" value="fence_vixel" />
@@ -488,12 +428,6 @@
<input type="hidden" name="unfence_action" value="on" />
</td>
</tr>
- <tr><td colspan="2">
- <div>
- <input type="button" name="remove_fence" value="Remove this instance"
- py:attrs="fi_id is not None and {'onclick': '$(\'#%s\').remove()' % fi_id} or {}"/>
- </div>
- </td></tr>
</table>
<input type="hidden" name="fence_type" value="fence_sanbox2" />
@@ -523,12 +457,6 @@
<input type="hidden" name="unfence_action" value="on" />
</td>
</tr>
- <tr><td colspan="2">
- <div>
- <input type="button" name="remove_fence" value="Remove this instance"
- py:attrs="fi_id is not None and {'onclick': '$(\'#%s\').remove()' % fi_id} or {}"/>
- </div>
- </td></tr>
</table>
<input type="hidden" name="fence_type" value="fence_sanlock" />
@@ -556,12 +484,6 @@
<input type="hidden" name="unfence_action" value="on" />
</td>
</tr>
- <tr><td colspan="2">
- <div>
- <input type="button" name="remove_fence" value="Remove this instance"
- py:attrs="fi_id is not None and {'onclick': '$(\'#%s\').remove()' % fi_id} or {}"/>
- </div>
- </td></tr>
</table>
<input type="hidden" name="fence_type" value="fence_mcdata" />
@@ -580,12 +502,6 @@
py:attrs="cur_fence_inst and {'value': cur_fence_inst.getAttribute('ipaddress')}"/>
</td>
</tr>
- <tr><td colspan="2">
- <div>
- <input type="button" name="remove_fence" value="Remove this instance"
- py:attrs="fi_id is not None and {'onclick': '$(\'#%s\').remove()' % fi_id} or {}"/>
- </div>
- </td></tr>
</table>
<input type="hidden" name="fence_type" value="fence_gnbd" />
@@ -604,12 +520,6 @@
py:attrs="cur_fence_inst and {'value': cur_fence_inst.getAttribute('domain')}"/>
</td>
</tr>
- <tr><td colspan="2">
- <div>
- <input type="button" name="remove_fence" value="Remove this instance"
- py:attrs="fi_id is not None and {'onclick': '$(\'#%s\').remove()' % fi_id} or {}"/>
- </div>
- </td></tr>
</table>
<input type="hidden" name="fence_type" value="fence_bullpap" />
@@ -635,12 +545,6 @@
py:attrs="cur_fence_inst and {'value': cur_fence_inst.getAttribute('delay')}"/>
</td>
</tr>
- <tr><td colspan="2">
- <div>
- <input type="button" name="remove_fence" value="Remove this instance"
- py:attrs="fi_id is not None and {'onclick': '$(\'#%s\').remove()' % fi_id} or {}"/>
- </div>
- </td></tr>
</table>
<input type="hidden" name="fence_type" value="fence_virt" />
@@ -666,12 +570,6 @@
py:attrs="cur_fence_inst and {'value': cur_fence_inst.getAttribute('delay')}"/>
</td>
</tr>
- <tr><td colspan="2">
- <div>
- <input type="button" name="remove_fence" value="Remove this instance"
- py:attrs="fi_id is not None and {'onclick': '$(\'#%s\').remove()' % fi_id} or {}"/>
- </div>
- </td></tr>
</table>
<input type="hidden" name="fence_type" value="fence_xvm" />
@@ -720,12 +618,6 @@
</table>
</fieldset>
</td></tr>
- <tr><td colspan="2">
- <div>
- <input type="button" name="remove_fence" value="Remove this instance"
- py:attrs="fi_id is not None and {'onclick': '$(\'#%s\').remove()' % fi_id} or {}"/>
- </div>
- </td></tr>
</table>
<input type="hidden" name="fence_type" value="fence_bladecenter" />
@@ -744,12 +636,6 @@
py:attrs="cur_fence_inst and {'value': cur_fence_inst.getAttribute('port')}"/>
</td>
</tr>
- <tr><td colspan="2">
- <div>
- <input type="button" name="remove_fence" value="Remove this instance"
- py:attrs="fi_id is not None and {'onclick': '$(\'#%s\').remove()' % fi_id} or {}"/>
- </div>
- </td></tr>
</table>
<input type="hidden" name="fence_type" value="fence_rackswitch" />
@@ -798,12 +684,6 @@
</table>
</fieldset>
</td></tr>
- <tr><td colspan="2">
- <div>
- <input type="button" name="remove_fence" value="Remove this instance"
- py:attrs="fi_id is not None and {'onclick': '$(\'#%s\').remove()' % fi_id} or {}"/>
- </div>
- </td></tr>
</table>
<input type="hidden" name="fence_type" value="fence_ldom" />
@@ -829,12 +709,6 @@
py:attrs="cur_fence_inst and {'value': cur_fence_inst.getAttribute('delay')}"/>
</td>
</tr>
- <tr><td colspan="2">
- <div>
- <input type="button" name="remove_fence" value="Remove this instance"
- py:attrs="fi_id is not None and {'onclick': '$(\'#%s\').remove()' % fi_id} or {}"/>
- </div>
- </td></tr>
</table>
<input type="hidden" name="fence_type" value="fence_cisco_mds" />
@@ -860,12 +734,6 @@
py:attrs="cur_fence_inst and {'value': cur_fence_inst.getAttribute('delay')}"/>
</td>
</tr>
- <tr><td colspan="2">
- <div>
- <input type="button" name="remove_fence" value="Remove this instance"
- py:attrs="fi_id is not None and {'onclick': '$(\'#%s\').remove()' % fi_id} or {}"/>
- </div>
- </td></tr>
</table>
<input type="hidden" name="fence_type" value="fence_cisco_ucs" />
@@ -891,12 +759,6 @@
py:attrs="cur_fence_inst and {'value': cur_fence_inst.getAttribute('delay')}"/>
</td>
</tr>
- <tr><td colspan="2">
- <div>
- <input type="button" name="remove_fence" value="Remove this instance"
- py:attrs="fi_id is not None and {'onclick': '$(\'#%s\').remove()' % fi_id} or {}"/>
- </div>
- </td></tr>
</table>
<input type="hidden" name="fence_type" value="fence_eps" />
@@ -922,12 +784,6 @@
py:attrs="cur_fence_inst and {'value': cur_fence_inst.getAttribute('delay')}"/>
</td>
</tr>
- <tr><td colspan="2">
- <div>
- <input type="button" name="remove_fence" value="Remove this instance"
- py:attrs="fi_id is not None and {'onclick': '$(\'#%s\').remove()' % fi_id} or {}"/>
- </div>
- </td></tr>
</table>
<input type="hidden" name="fence_type" value="fence_ibmblade" />
@@ -953,12 +809,6 @@
py:attrs="cur_fence_inst and {'value': cur_fence_inst.getAttribute('delay')}"/>
</td>
</tr>
- <tr><td colspan="2">
- <div>
- <input type="button" name="remove_fence" value="Remove this instance"
- py:attrs="fi_id is not None and {'onclick': '$(\'#%s\').remove()' % fi_id} or {}"/>
- </div>
- </td></tr>
</table>
<input type="hidden" name="fence_type" value="fence_ifmib" />
@@ -984,12 +834,6 @@
py:attrs="cur_fence_inst and {'value': cur_fence_inst.getAttribute('delay')}"/>
</td>
</tr>
- <tr><td colspan="2">
- <div>
- <input type="button" name="remove_fence" value="Remove this instance"
- py:attrs="fi_id is not None and {'onclick': '$(\'#%s\').remove()' % fi_id} or {}"/>
- </div>
- </td></tr>
</table>
<input type="hidden" name="fence_type" value="fence_intelmodular" />
@@ -1015,12 +859,6 @@
py:attrs="cur_fence_inst and {'value': cur_fence_inst.getAttribute('delay')}"/>
</td>
</tr>
- <tr><td colspan="2">
- <div>
- <input type="button" name="remove_fence" value="Remove this instance"
- py:attrs="fi_id is not None and {'onclick': '$(\'#%s\').remove()' % fi_id} or {}"/>
- </div>
- </td></tr>
</table>
<input type="hidden" name="fence_type" value="fence_apc_snmp" />
@@ -1156,12 +994,6 @@
py:attrs="cur_fence_inst and {'value': cur_fence_inst.getAttribute('delay')}"/>
</td>
</tr>
- <tr><td colspan="2">
- <div>
- <input type="button" name="remove_fence" value="Remove this instance"
- py:attrs="fi_id is not None and {'onclick': '$(\'#%s\').remove()' % fi_id} or {}"/>
- </div>
- </td></tr>
</table>
<input type="hidden" name="fence_type" value="fence_ipdu" />
@@ -1266,12 +1098,6 @@
py:attrs="cur_fence_inst and {'value': cur_fence_inst.getAttribute('delay')}"/>
</td>
</tr>
- <tr><td colspan="2">
- <div>
- <input type="button" name="remove_fence" value="Remove this instance"
- py:attrs="fi_id is not None and {'onclick': '$(\'#%s\').remove()' % fi_id} or {}"/>
- </div>
- </td></tr>
</table>
<input type="hidden" name="fence_type" value="fence_scsi" />
<input type="hidden" name="fence_instance" value="1" />
@@ -1296,12 +1122,6 @@
py:attrs="cur_fence_inst and {'value': cur_fence_inst.getAttribute('delay')}"/>
</td>
</tr>
- <tr><td colspan="2">
- <div>
- <input type="button" name="remove_fence" value="Remove this instance"
- py:attrs="fi_id is not None and {'onclick': '$(\'#%s\').remove()' % fi_id} or {}"/>
- </div>
- </td></tr>
</table>
<input type="hidden" name="fence_type" value="fence_eaton_snmp" />
@@ -1350,12 +1170,6 @@
</table>
</fieldset>
</td></tr>
- <tr><td colspan="2">
- <div>
- <input type="button" name="remove_fence" value="Remove this instance"
- py:attrs="fi_id is not None and {'onclick': '$(\'#%s\').remove()' % fi_id} or {}"/>
- </div>
- </td></tr>
</table>
<input type="hidden" name="fence_type" value="fence_hpblade" />
10 years, 9 months
[luci] luci: Add support for missing fence devices
by Ryan McCabe
commit 49e1bacab84a05b7ab560c752e524b922d4fb514
Author: Ryan McCabe <rmccabe(a)redhat.com>
Date: Mon Aug 12 16:44:31 2013 -0400
luci: Add support for missing fence devices
Add support for fence_ilo2, fence_ilo3, fence_ilo4,
fence_imm, and fence_idrac, all of which are symlinks to
either (in the case of the first 3), fence_ilo or (in the case
of the last two), fence_ipmilan.
Resolves: rhbz#917747
Signed-off-by: Ryan McCabe <rmccabe(a)redhat.com>
luci/lib/ClusterConf/FenceDeviceAttr.py | 10 +
luci/templates/fence_devices.html | 571 +++++++++++++++++++++++++++++++
luci/templates/fence_instances.html | 55 +++
luci/validation/validate_fence.py | 10 +
4 files changed, 646 insertions(+), 0 deletions(-)
---
diff --git a/luci/lib/ClusterConf/FenceDeviceAttr.py b/luci/lib/ClusterConf/FenceDeviceAttr.py
index bf11d20..05fdb92 100644
--- a/luci/lib/ClusterConf/FenceDeviceAttr.py
+++ b/luci/lib/ClusterConf/FenceDeviceAttr.py
@@ -29,7 +29,12 @@ FENCE_OPTS = {
'fence_virt': 'fence_virt Virtual Machine Fencing',
'fence_scsi': 'SCSI Reservation Fencing',
'fence_ilo': 'HP iLO Device',
+ 'fence_ilo2': 'HP iLO2 Device',
+ 'fence_ilo3': 'HP iLO3 Device',
+ 'fence_ilo4': 'HP iLO4 Device',
'fence_ipmilan': 'IPMI Lan',
+ 'fence_idrac': 'Dell iDRAC',
+ 'fence_imm': 'IBM Integrated Management Module',
'fence_ipdu': 'IBM iPDU',
'fence_drac': 'Dell DRAC',
'fence_drac5': 'Dell DRAC 5',
@@ -90,8 +95,13 @@ FENCE_SHARED = {
'fence_rhevm': True,
'fence_sanlock': True,
'fence_ilo': False,
+ 'fence_ilo2': False,
+ 'fence_ilo3': False,
+ 'fence_ilo4': False,
'fence_ilo_mp': False,
'fence_ipmilan': False,
+ 'fence_idrac': False,
+ 'fence_imm': False,
'fence_drac': False,
'fence_drac5': False,
'fence_rps10': False,
diff --git a/luci/templates/fence_devices.html b/luci/templates/fence_devices.html
index 561fe16..5d4561d 100644
--- a/luci/templates/fence_devices.html
+++ b/luci/templates/fence_devices.html
@@ -1878,6 +1878,321 @@
<input type="hidden" name="fence_type" value="fence_ilo" />
</div>
+<div py:def="fence_ilo2(cur_fencedev, ni)" id="fence_ilo2" class="fencedevform row"
+ py:attrs="cur_fencedev and {'id': 'fd_%s' % cur_fencedev.getName()}">
+ <table class="formtable">
+ <tr>
+ <td>Fence Type</td>
+ <td>HP iLO2</td>
+ </tr>
+ <tr>
+ <td>Name</td>
+ <td>
+ <input name="name" type="text" class="text"
+ py:attrs="cur_fencedev and {'value': cur_fencedev.getName()} or {}"/>
+ </td>
+ </tr>
+ <tr>
+ <td>IP Address or Hostname</td>
+ <td>
+ <input name="ipaddr" type="text" class="text"
+ py:attrs="cur_fencedev and {'value': cur_fencedev.getAttribute('ipaddr')} or {}"/>
+ </td>
+ </tr>
+ <tr>
+ <td>IP Port (optional)</td>
+ <td>
+ <input name="ipport" type="text" class="text"
+ py:attrs="cur_fencedev and {'value': cur_fencedev.getAttribute('ipport')} or {}"/>
+ </td>
+ </tr>
+ <tr>
+ <td>Login</td>
+ <td>
+ <input name="login" type="text" class="text"
+ py:attrs="cur_fencedev and {'value': cur_fencedev.getAttribute('login')} or {}"/>
+ </td>
+ </tr>
+ <tr>
+ <td>Password</td>
+ <td>
+ <input name="passwd" type="password" class="text" autocomplete="off"
+ py:attrs="cur_fencedev and {'value': cur_fencedev.getAttribute('passwd')} or {}"/>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <span title="Full path to a script to generate fence password">Password Script (optional)</span>
+ </td>
+ <td>
+ <input type="text" class="text" name="passwd_script"
+ py:attrs="cur_fencedev and {'value': cur_fencedev.getAttribute('passwd_script')} or {}"/>
+ </td>
+ </tr>
+ <tr>
+ <td>Power Wait (seconds)</td>
+ <td>
+ <input type="text" class="text" name="power_wait"
+ py:attrs="cur_fencedev and {'value': cur_fencedev.getAttribute('power_wait')} or {}"/>
+ </td>
+ </tr>
+ <tr>
+ <td>Delay (seconds)</td>
+ <td>
+ <input name="delay" type="text" class="text"
+ py:attrs="cur_fencedev and {'value': cur_fencedev.getAttribute('delay')}"/>
+ </td>
+ </tr>
+ <tr>
+ <td>Power Timeout (seconds)</td>
+ <td>
+ <input type="text" class="text" name="power_timeout"
+ py:attrs="cur_fencedev and {'value': cur_fencedev.getAttribute('power_timeout')} or {}"/>
+ </td>
+ </tr>
+ <tr>
+ <td>Shell Timeout (seconds)</td>
+ <td>
+ <input type="text" class="text" name="shell_timeout"
+ py:attrs="cur_fencedev and {'value': cur_fencedev.getAttribute('shell_timeout')} or {}"/>
+ </td>
+ </tr>
+ <tr>
+ <td>Login Timeout (seconds)</td>
+ <td>
+ <input type="text" class="text" name="login_timeout"
+ py:attrs="cur_fencedev and {'value': cur_fencedev.getAttribute('login_timeout')} or {}"/>
+ </td>
+ </tr>
+ <tr>
+ <td>Times to Retry Power On Operation</td>
+ <td>
+ <input type="text" class="text" name="retry_on"
+ py:attrs="cur_fencedev and {'value': cur_fencedev.getAttribute('retry_on')} or {}"/>
+ </td>
+ </tr>
+ </table>
+
+ <py:if test="cur_fencedev">
+ <input type="hidden"
+ name="orig_name" value="${cur_fencedev.getName()}"/>
+ <input type="hidden"
+ name="existing_device" value="1" />
+ </py:if>
+
+ <input type="hidden" name="fence_type" value="fence_ilo2" />
+</div>
+
+<div py:def="fence_ilo3(cur_fencedev, ni)" id="fence_ilo3" class="fencedevform row"
+ py:attrs="cur_fencedev and {'id': 'fd_%s' % cur_fencedev.getName()}">
+ <table class="formtable">
+ <tr>
+ <td>Fence Type</td>
+ <td>HP iLO3</td>
+ </tr>
+ <tr>
+ <td>Name</td>
+ <td>
+ <input name="name" type="text" class="text"
+ py:attrs="cur_fencedev and {'value': cur_fencedev.getName()} or {}"/>
+ </td>
+ </tr>
+ <tr>
+ <td>IP Address or Hostname</td>
+ <td>
+ <input name="ipaddr" type="text" class="text"
+ py:attrs="cur_fencedev and {'value': cur_fencedev.getAttribute('ipaddr')} or {}"/>
+ </td>
+ </tr>
+ <tr>
+ <td>IP Port (optional)</td>
+ <td>
+ <input name="ipport" type="text" class="text"
+ py:attrs="cur_fencedev and {'value': cur_fencedev.getAttribute('ipport')} or {}"/>
+ </td>
+ </tr>
+ <tr>
+ <td>Login</td>
+ <td>
+ <input name="login" type="text" class="text"
+ py:attrs="cur_fencedev and {'value': cur_fencedev.getAttribute('login')} or {}"/>
+ </td>
+ </tr>
+ <tr>
+ <td>Password</td>
+ <td>
+ <input name="passwd" type="password" class="text" autocomplete="off"
+ py:attrs="cur_fencedev and {'value': cur_fencedev.getAttribute('passwd')} or {}"/>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <span title="Full path to a script to generate fence password">Password Script (optional)</span>
+ </td>
+ <td>
+ <input type="text" class="text" name="passwd_script"
+ py:attrs="cur_fencedev and {'value': cur_fencedev.getAttribute('passwd_script')} or {}"/>
+ </td>
+ </tr>
+ <tr>
+ <td>Power Wait (seconds)</td>
+ <td>
+ <input type="text" class="text" name="power_wait"
+ py:attrs="cur_fencedev and {'value': cur_fencedev.getAttribute('power_wait')} or {}"/>
+ </td>
+ </tr>
+ <tr>
+ <td>Delay (seconds)</td>
+ <td>
+ <input name="delay" type="text" class="text"
+ py:attrs="cur_fencedev and {'value': cur_fencedev.getAttribute('delay')}"/>
+ </td>
+ </tr>
+ <tr>
+ <td>Power Timeout (seconds)</td>
+ <td>
+ <input type="text" class="text" name="power_timeout"
+ py:attrs="cur_fencedev and {'value': cur_fencedev.getAttribute('power_timeout')} or {}"/>
+ </td>
+ </tr>
+ <tr>
+ <td>Shell Timeout (seconds)</td>
+ <td>
+ <input type="text" class="text" name="shell_timeout"
+ py:attrs="cur_fencedev and {'value': cur_fencedev.getAttribute('shell_timeout')} or {}"/>
+ </td>
+ </tr>
+ <tr>
+ <td>Login Timeout (seconds)</td>
+ <td>
+ <input type="text" class="text" name="login_timeout"
+ py:attrs="cur_fencedev and {'value': cur_fencedev.getAttribute('login_timeout')} or {}"/>
+ </td>
+ </tr>
+ <tr>
+ <td>Times to Retry Power On Operation</td>
+ <td>
+ <input type="text" class="text" name="retry_on"
+ py:attrs="cur_fencedev and {'value': cur_fencedev.getAttribute('retry_on')} or {}"/>
+ </td>
+ </tr>
+ </table>
+
+ <py:if test="cur_fencedev">
+ <input type="hidden"
+ name="orig_name" value="${cur_fencedev.getName()}"/>
+ <input type="hidden"
+ name="existing_device" value="1" />
+ </py:if>
+
+ <input type="hidden" name="fence_type" value="fence_ilo3" />
+</div>
+
+<div py:def="fence_ilo4(cur_fencedev, ni)" id="fence_ilo4" class="fencedevform row"
+ py:attrs="cur_fencedev and {'id': 'fd_%s' % cur_fencedev.getName()}">
+ <table class="formtable">
+ <tr>
+ <td>Fence Type</td>
+ <td>HP iLO4</td>
+ </tr>
+ <tr>
+ <td>Name</td>
+ <td>
+ <input name="name" type="text" class="text"
+ py:attrs="cur_fencedev and {'value': cur_fencedev.getName()} or {}"/>
+ </td>
+ </tr>
+ <tr>
+ <td>IP Address or Hostname</td>
+ <td>
+ <input name="ipaddr" type="text" class="text"
+ py:attrs="cur_fencedev and {'value': cur_fencedev.getAttribute('ipaddr')} or {}"/>
+ </td>
+ </tr>
+ <tr>
+ <td>IP Port (optional)</td>
+ <td>
+ <input name="ipport" type="text" class="text"
+ py:attrs="cur_fencedev and {'value': cur_fencedev.getAttribute('ipport')} or {}"/>
+ </td>
+ </tr>
+ <tr>
+ <td>Login</td>
+ <td>
+ <input name="login" type="text" class="text"
+ py:attrs="cur_fencedev and {'value': cur_fencedev.getAttribute('login')} or {}"/>
+ </td>
+ </tr>
+ <tr>
+ <td>Password</td>
+ <td>
+ <input name="passwd" type="password" class="text" autocomplete="off"
+ py:attrs="cur_fencedev and {'value': cur_fencedev.getAttribute('passwd')} or {}"/>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <span title="Full path to a script to generate fence password">Password Script (optional)</span>
+ </td>
+ <td>
+ <input type="text" class="text" name="passwd_script"
+ py:attrs="cur_fencedev and {'value': cur_fencedev.getAttribute('passwd_script')} or {}"/>
+ </td>
+ </tr>
+ <tr>
+ <td>Power Wait (seconds)</td>
+ <td>
+ <input type="text" class="text" name="power_wait"
+ py:attrs="cur_fencedev and {'value': cur_fencedev.getAttribute('power_wait')} or {}"/>
+ </td>
+ </tr>
+ <tr>
+ <td>Delay (seconds)</td>
+ <td>
+ <input name="delay" type="text" class="text"
+ py:attrs="cur_fencedev and {'value': cur_fencedev.getAttribute('delay')}"/>
+ </td>
+ </tr>
+ <tr>
+ <td>Power Timeout (seconds)</td>
+ <td>
+ <input type="text" class="text" name="power_timeout"
+ py:attrs="cur_fencedev and {'value': cur_fencedev.getAttribute('power_timeout')} or {}"/>
+ </td>
+ </tr>
+ <tr>
+ <td>Shell Timeout (seconds)</td>
+ <td>
+ <input type="text" class="text" name="shell_timeout"
+ py:attrs="cur_fencedev and {'value': cur_fencedev.getAttribute('shell_timeout')} or {}"/>
+ </td>
+ </tr>
+ <tr>
+ <td>Login Timeout (seconds)</td>
+ <td>
+ <input type="text" class="text" name="login_timeout"
+ py:attrs="cur_fencedev and {'value': cur_fencedev.getAttribute('login_timeout')} or {}"/>
+ </td>
+ </tr>
+ <tr>
+ <td>Times to Retry Power On Operation</td>
+ <td>
+ <input type="text" class="text" name="retry_on"
+ py:attrs="cur_fencedev and {'value': cur_fencedev.getAttribute('retry_on')} or {}"/>
+ </td>
+ </tr>
+ </table>
+
+ <py:if test="cur_fencedev">
+ <input type="hidden"
+ name="orig_name" value="${cur_fencedev.getName()}"/>
+ <input type="hidden"
+ name="existing_device" value="1" />
+ </py:if>
+
+ <input type="hidden" name="fence_type" value="fence_ilo4" />
+</div>
+
<div py:def="fence_drac(cur_fencedev, ni)" id="fence_drac" class="fencedevform row"
py:attrs="cur_fencedev and {'id': 'fd_%s' % cur_fencedev.getName()}">
<table class="formtable">
@@ -2376,6 +2691,252 @@
<input type="hidden" name="fence_type" value="fence_ipmilan" />
</div>
+<div py:def="fence_imm(cur_fencedev, ni)" id="fence_imm" class="fencedevform row"
+ py:attrs="cur_fencedev and {'id': 'fd_%s' % cur_fencedev.getName()}">
+ <table class="formtable">
+ <tr>
+ <td>Fence Type</td>
+ <td>IBM Integrated Management Module</td>
+ </tr>
+ <tr>
+ <td>Name</td>
+ <td>
+ <input name="name" type="text" class="text"
+ py:attrs="cur_fencedev and {'value': cur_fencedev.getName()} or {}"/>
+ </td>
+ </tr>
+ <tr>
+ <td>IP Address or Hostname</td>
+ <td>
+ <input name="ipaddr" type="text" class="text"
+ py:attrs="cur_fencedev and {'value': cur_fencedev.getAttribute('ipaddr')} or {}"/>
+ </td>
+ </tr>
+ <tr>
+ <td>Login</td>
+ <td>
+ <input name="login" type="text" class="text"
+ py:attrs="cur_fencedev and {'value': cur_fencedev.getAttribute('login')} or {}"/>
+ </td>
+ </tr>
+ <tr>
+ <td>Password</td>
+ <td>
+ <input name="passwd" type="password" class="text" autocomplete="off"
+ py:attrs="cur_fencedev and {'value': cur_fencedev.getAttribute('passwd')} or {}"/>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <span title="Full path to a script to generate fence password">Password Script (optional)</span>
+ </td>
+ <td>
+ <input type="text" class="text" name="passwd_script"
+ py:attrs="cur_fencedev and {'value': cur_fencedev.getAttribute('passwd_script')} or {}"/>
+ </td>
+ </tr>
+ <tr>
+ <td>Authentication Type</td>
+ <td>
+ <select name="auth" class="fencedevformselect">
+ <option value=""
+ py:attrs="(not cur_fencedev or not cur_fencedev.getAttribute('auth')) and {'selected':'selected'} or {}">None</option>
+ <option value="password"
+ py:attrs="cur_fencedev and cur_fencedev.getAttribute('auth') == 'password' and {'selected':'selected'} or {}">Password</option>
+ <option value="md5"
+ py:attrs="cur_fencedev and cur_fencedev.getAttribute('auth') == 'md5' and {'selected':'selected'} or {}">MD5</option>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td>Use Lanplus</td>
+ <td>
+ <input name="lanplus" type="checkbox" class="checkbox"
+ py:attrs="cur_fencedev and cur_fencedev.getAttribute('lanplus') and {'checked':'checked'} or {}"/>
+ </td>
+ </tr>
+ <tr>
+ <td>Ciphersuite to use</td>
+ <td>
+ <input name="cipher" type="text" class="text"
+ py:attrs="cur_fencedev and {'value': cur_fencedev.getAttribute('cipher')} or {}"/>
+ </td>
+ </tr>
+ <tr>
+ <td>Privilege Level</td>
+ <td>
+ <py:with vars="privlvl = cur_fencedev and cur_fencedev.getAttribute('privlvl')">
+ <select name="privlvl">
+ <option value=""
+ py:attrs="not privlvl and {'selected':'selected'} or {}">Default</option>
+ <option value="CALLBACK"
+ py:attrs="privlvl and privlvl.upper() == 'CALLBACK' and {'selected':'selected'} or {}">CALLBACK</option>
+ <option value="USER"
+ py:attrs="privlvl and privlvl.upper() == 'USER' and {'selected':'selected'} or {}">USER</option>
+ <option value="OPERATOR"
+ py:attrs="privlvl and privlvl.upper() == 'OPERATOR' and {'selected':'selected'} or {}">OPERATOR</option>
+ <option value="ADMINISTRATOR"
+ py:attrs="privlvl and privlvl.upper() == 'ADMINISTRATOR' and {'selected':'selected'} or {}">ADMINISTRATOR</option>
+ </select>
+ </py:with>
+ </td>
+ </tr>
+ <tr>
+ <td>IPMI Operation Timeout</td>
+ <td>
+ <input name="timeout" type="text" class="text"
+ py:attrs="cur_fencedev and {'value': cur_fencedev.getAttribute('timeout')}"/>
+ </td>
+ </tr>
+ <tr>
+ <td>Power Wait (seconds)</td>
+ <td>
+ <input type="text" class="text" name="power_wait"
+ py:attrs="cur_fencedev and {'value': cur_fencedev.getAttribute('power_wait')} or {}"/>
+ </td>
+ </tr>
+ <tr>
+ <td>Delay (seconds)</td>
+ <td>
+ <input name="delay" type="text" class="text"
+ py:attrs="cur_fencedev and {'value': cur_fencedev.getAttribute('delay')}"/>
+ </td>
+ </tr>
+ </table>
+
+ <py:if test="cur_fencedev">
+ <input type="hidden"
+ name="orig_name" value="${cur_fencedev.getName()}"/>
+ <input type="hidden"
+ name="existing_device" value="1" />
+ </py:if>
+
+ <input type="hidden" name="fence_type" value="fence_imm" />
+</div>
+
+<div py:def="fence_idrac(cur_fencedev, ni)" id="fence_idrac" class="fencedevform row"
+ py:attrs="cur_fencedev and {'id': 'fd_%s' % cur_fencedev.getName()}">
+ <table class="formtable">
+ <tr>
+ <td>Fence Type</td>
+ <td>Dell iDRAC</td>
+ </tr>
+ <tr>
+ <td>Name</td>
+ <td>
+ <input name="name" type="text" class="text"
+ py:attrs="cur_fencedev and {'value': cur_fencedev.getName()} or {}"/>
+ </td>
+ </tr>
+ <tr>
+ <td>IP Address or Hostname</td>
+ <td>
+ <input name="ipaddr" type="text" class="text"
+ py:attrs="cur_fencedev and {'value': cur_fencedev.getAttribute('ipaddr')} or {}"/>
+ </td>
+ </tr>
+ <tr>
+ <td>Login</td>
+ <td>
+ <input name="login" type="text" class="text"
+ py:attrs="cur_fencedev and {'value': cur_fencedev.getAttribute('login')} or {}"/>
+ </td>
+ </tr>
+ <tr>
+ <td>Password</td>
+ <td>
+ <input name="passwd" type="password" class="text" autocomplete="off"
+ py:attrs="cur_fencedev and {'value': cur_fencedev.getAttribute('passwd')} or {}"/>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <span title="Full path to a script to generate fence password">Password Script (optional)</span>
+ </td>
+ <td>
+ <input type="text" class="text" name="passwd_script"
+ py:attrs="cur_fencedev and {'value': cur_fencedev.getAttribute('passwd_script')} or {}"/>
+ </td>
+ </tr>
+ <tr>
+ <td>Authentication Type</td>
+ <td>
+ <select name="auth" class="fencedevformselect">
+ <option value=""
+ py:attrs="(not cur_fencedev or not cur_fencedev.getAttribute('auth')) and {'selected':'selected'} or {}">None</option>
+ <option value="password"
+ py:attrs="cur_fencedev and cur_fencedev.getAttribute('auth') == 'password' and {'selected':'selected'} or {}">Password</option>
+ <option value="md5"
+ py:attrs="cur_fencedev and cur_fencedev.getAttribute('auth') == 'md5' and {'selected':'selected'} or {}">MD5</option>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td>Use Lanplus</td>
+ <td>
+ <input name="lanplus" type="checkbox" class="checkbox"
+ py:attrs="cur_fencedev and cur_fencedev.getAttribute('lanplus') and {'checked':'checked'} or {}"/>
+ </td>
+ </tr>
+ <tr>
+ <td>Ciphersuite to use</td>
+ <td>
+ <input name="cipher" type="text" class="text"
+ py:attrs="cur_fencedev and {'value': cur_fencedev.getAttribute('cipher')} or {}"/>
+ </td>
+ </tr>
+ <tr>
+ <td>Privilege Level</td>
+ <td>
+ <py:with vars="privlvl = cur_fencedev and cur_fencedev.getAttribute('privlvl')">
+ <select name="privlvl">
+ <option value=""
+ py:attrs="not privlvl and {'selected':'selected'} or {}">Default</option>
+ <option value="CALLBACK"
+ py:attrs="privlvl and privlvl.upper() == 'CALLBACK' and {'selected':'selected'} or {}">CALLBACK</option>
+ <option value="USER"
+ py:attrs="privlvl and privlvl.upper() == 'USER' and {'selected':'selected'} or {}">USER</option>
+ <option value="OPERATOR"
+ py:attrs="privlvl and privlvl.upper() == 'OPERATOR' and {'selected':'selected'} or {}">OPERATOR</option>
+ <option value="ADMINISTRATOR"
+ py:attrs="privlvl and privlvl.upper() == 'ADMINISTRATOR' and {'selected':'selected'} or {}">ADMINISTRATOR</option>
+ </select>
+ </py:with>
+ </td>
+ </tr>
+ <tr>
+ <td>IPMI Operation Timeout</td>
+ <td>
+ <input name="timeout" type="text" class="text"
+ py:attrs="cur_fencedev and {'value': cur_fencedev.getAttribute('timeout')}"/>
+ </td>
+ </tr>
+ <tr>
+ <td>Power Wait (seconds)</td>
+ <td>
+ <input type="text" class="text" name="power_wait"
+ py:attrs="cur_fencedev and {'value': cur_fencedev.getAttribute('power_wait')} or {}"/>
+ </td>
+ </tr>
+ <tr>
+ <td>Delay (seconds)</td>
+ <td>
+ <input name="delay" type="text" class="text"
+ py:attrs="cur_fencedev and {'value': cur_fencedev.getAttribute('delay')}"/>
+ </td>
+ </tr>
+ </table>
+
+ <py:if test="cur_fencedev">
+ <input type="hidden"
+ name="orig_name" value="${cur_fencedev.getName()}"/>
+ <input type="hidden"
+ name="existing_device" value="1" />
+ </py:if>
+
+ <input type="hidden" name="fence_type" value="fence_idrac" />
+</div>
+
<div py:def="fence_alom(cur_fencedev, ni)" id="fence_alom" class="fencedevform row"
py:attrs="cur_fencedev and {'id': 'fd_%s' % cur_fencedev.getName()}">
<table class="formtable">
@@ -4248,11 +4809,16 @@ ${fence_lpar(None,0)}
${fence_vmware(None,0)}
${fence_vmware_soap(None,0)}
${fence_ilo(None,0)}
+${fence_ilo2(None,0)}
+${fence_ilo3(None,0)}
+${fence_ilo4(None,0)}
${fence_drac(None,0)}
${fence_rsa(None,0)}
${fence_rsb(None,0)}
${fence_rps10(None,0)}
${fence_ipmilan(None,0)}
+${fence_idrac(None,0)}
+${fence_imm(None,0)}
${fence_alom(None,0)}
${fence_cisco_mds(None,0)}
${fence_cisco_ucs(None,0)}
@@ -4311,6 +4877,7 @@ ${fence_unknown(None,0)}
<option py:if="cluster_version == 3" name="fence_drac" value="fence_drac">Dell DRAC (Deprecated)</option>
<option name="fence_drac5" value="fence_drac5">Dell DRAC 5</option> <!-- needs work -->
+ <option name="fence_idrac" value="fence_idrac">Dell iDRAC</option>
<option py:if="cluster_version == 3" name="fence_eaton_snmp" value="fence_eaton_snmp">Eaton Network Power Switch (SNMP interface)</option>
<option name="fence_egenera" value="fence_egenera">Egenera SAN Controller</option>
@@ -4327,9 +4894,13 @@ ${fence_unknown(None,0)}
<option name="fence_rsb" value="fence_rsb">Fujitsu Siemens RemoteView Service Board</option>
<option name="fence_hpblade" value="fence_hpblade">HP BladeSystem</option>
<option name="fence_ilo" value="fence_ilo">HP iLO Device</option>
+ <option name="fence_ilo2" value="fence_ilo2">HP iLO2 Device</option>
+ <option name="fence_ilo3" value="fence_ilo3">HP iLO3 Device</option>
+ <option name="fence_ilo4" value="fence_ilo4">HP iLO4 Device</option>
<option name="fence_ilo_mp" value="fence_ilo_mp">HP iLO MP</option> <!-- needs work -->
<option name="fence_bladecenter" value="fence_bladecenter">IBM BladeCenter</option>
<option py:if="cluster_version == 3" name="fence_ibmblade" value="fence_ibmblade">IBM BladeCenter SNMP</option>
+ <option name="fence_imm" value="fence_imm">IBM Integrated Management Module</option>
<option name="fence_ipdu" value="fence_ipdu">IBM iPDU</option>
<option py:if="cluster_version == 2" name="fence_rsa" value="fence_rsa">IBM RSA II Device</option> <!-- needs work -->
diff --git a/luci/templates/fence_instances.html b/luci/templates/fence_instances.html
index ba7fc23..34a0d28 100644
--- a/luci/templates/fence_instances.html
+++ b/luci/templates/fence_instances.html
@@ -1059,6 +1059,36 @@
py:attrs="cur_fence_dev_id and {'value': cur_fence_dev_id} or {}" />
</div>
+<div py:def="fence_ilo2_instance(cur_fence_inst, cur_fence_dev_id, fi_id, **kw)" id="fence_ilo2_instance"
+ py:attrs="fi_id is not None and {'id': fi_id, 'class':'fenceinst'}">
+
+ <div class="emptyfenceinst">No additional parameters</div>
+ <input type="hidden" name="fence_type" value="fence_ilo2" />
+ <input type="hidden" name="fence_instance" value="1" />
+ <input type="hidden" name="parent_fencedev"
+ py:attrs="cur_fence_dev_id and {'value': cur_fence_dev_id} or {}" />
+</div>
+
+<div py:def="fence_ilo3_instance(cur_fence_inst, cur_fence_dev_id, fi_id, **kw)" id="fence_ilo3_instance"
+ py:attrs="fi_id is not None and {'id': fi_id, 'class':'fenceinst'}">
+
+ <div class="emptyfenceinst">No additional parameters</div>
+ <input type="hidden" name="fence_type" value="fence_ilo3" />
+ <input type="hidden" name="fence_instance" value="1" />
+ <input type="hidden" name="parent_fencedev"
+ py:attrs="cur_fence_dev_id and {'value': cur_fence_dev_id} or {}" />
+</div>
+
+<div py:def="fence_ilo4_instance(cur_fence_inst, cur_fence_dev_id, fi_id, **kw)" id="fence_ilo4_instance"
+ py:attrs="fi_id is not None and {'id': fi_id, 'class':'fenceinst'}">
+
+ <div class="emptyfenceinst">No additional parameters</div>
+ <input type="hidden" name="fence_type" value="fence_ilo4" />
+ <input type="hidden" name="fence_instance" value="1" />
+ <input type="hidden" name="parent_fencedev"
+ py:attrs="cur_fence_dev_id and {'value': cur_fence_dev_id} or {}" />
+</div>
+
<div py:def="fence_ilo_mp_instance(cur_fence_inst, cur_fence_dev_id, fi_id, **kw)" id="fence_ilo_mp_instance"
py:attrs="fi_id is not None and {'id': fi_id, 'class':'fenceinst'}">
@@ -1089,6 +1119,26 @@
py:attrs="cur_fence_dev_id and {'value': cur_fence_dev_id} or {}" />
</div>
+<div py:def="fence_idrac_instance(cur_fence_inst, cur_fence_dev_id, fi_id, **kw)" id="fence_idrac_instance"
+ py:attrs="fi_id is not None and {'id': fi_id, 'class':'fenceinst'}">
+
+ <div class="emptyfenceinst">No additional parameters</div>
+ <input type="hidden" name="fence_type" value="fence_idrac" />
+ <input type="hidden" name="fence_instance" value="1" />
+ <input type="hidden" name="parent_fencedev"
+ py:attrs="cur_fence_dev_id and {'value': cur_fence_dev_id} or {}" />
+</div>
+
+<div py:def="fence_imm_instance(cur_fence_inst, cur_fence_dev_id, fi_id, **kw)" id="fence_imm_instance"
+ py:attrs="fi_id is not None and {'id': fi_id, 'class':'fenceinst'}">
+
+ <div class="emptyfenceinst">No additional parameters</div>
+ <input type="hidden" name="fence_type" value="fence_imm" />
+ <input type="hidden" name="fence_instance" value="1" />
+ <input type="hidden" name="parent_fencedev"
+ py:attrs="cur_fence_dev_id and {'value': cur_fence_dev_id} or {}" />
+</div>
+
<div py:def="fence_ipdu_instance(cur_fence_inst, cur_fence_dev_id, fi_id, **kw)" id="fence_ipdu_instance"
py:attrs="fi_id is not None and {'id': fi_id, 'class':'fenceinst'}">
<table class="detailstable">
@@ -1357,9 +1407,14 @@ ${fence_rhevm_instance(None, None, None)}
${fence_drac_instance(None, None, None)}
${fence_drac5_instance(None, None, None)}
${fence_ilo_instance(None, None, None)}
+${fence_ilo2_instance(None, None, None)}
+${fence_ilo3_instance(None, None, None)}
+${fence_ilo4_instance(None, None, None)}
${fence_ilo_mp_instance(None, None, None)}
${fence_rsa_instance(None, None, None)}
${fence_ipmilan_instance(None, None, None)}
+${fence_imm_instance(None, None, None)}
+${fence_idrac_instance(None, None, None)}
${fence_alom_instance(None, None, None)}
${fence_cpint_instance(None, None, None)}
${fence_rps10_instance(None, None, None)}
diff --git a/luci/validation/validate_fence.py b/luci/validation/validate_fence.py
index e866a83..c05e8be 100644
--- a/luci/validation/validate_fence.py
+++ b/luci/validation/validate_fence.py
@@ -852,9 +852,14 @@ FD_VALIDATE = {
'fence_ifmib': val_ifmib_fd,
'fence_ilo_mp': val_ilo_mp_fd,
'fence_ilo': val_ilo_fd,
+ 'fence_ilo2': val_ilo_fd,
+ 'fence_ilo3': val_ilo_fd,
+ 'fence_ilo4': val_ilo_fd,
'fence_intelmodular': val_intelmodular_fd,
'fence_ipdu': val_ipdu_fd,
'fence_ipmilan': val_ipmilan_fd,
+ 'fence_idrac': val_ipmilan_fd,
+ 'fence_imm': val_ipmilan_fd,
'fence_ldom': val_ldom_fd,
'fence_lpar': val_lpar_fd,
'fence_manual': val_noop_fd,
@@ -1259,8 +1264,13 @@ FI_VALIDATE = {
'fence_ifmib': val_ifmib_fi,
'fence_ilo_mp': val_noop_fi,
'fence_ilo': val_noop_fi,
+ 'fence_ilo2': val_noop_fi,
+ 'fence_ilo3': val_noop_fi,
+ 'fence_ilo4': val_noop_fi,
'fence_intelmodular': val_intelmodular_fi,
'fence_ipmilan': val_noop_fi,
+ 'fence_idrac': val_noop_fi,
+ 'fence_imm': val_noop_fi,
'fence_ldom': val_ldom_fi,
'fence_lpar': val_lpar_fi,
'fence_ipdu': val_ipdu_fi,
10 years, 9 months
[luci] luci: Make pop-up messages act like static status messages
by Ryan McCabe
commit a6a02ea13e0e821703889a77e9d1ea725187663f
Author: Ryan McCabe <rmccabe(a)redhat.com>
Date: Mon Aug 12 16:44:31 2013 -0400
luci: Make pop-up messages act like static status messages
Additional fix to remove the pop-up status messages and
instead add the messages so that they look the same way
static status messages look.
Resolves: rhbz#773491
Signed-off-by: Ryan McCabe <rmccabe(a)redhat.com>
luci/templates/master.html | 4 +++-
1 files changed, 3 insertions(+), 1 deletions(-)
---
diff --git a/luci/templates/master.html b/luci/templates/master.html
index 16ad632..7b59c9b 100644
--- a/luci/templates/master.html
+++ b/luci/templates/master.html
@@ -58,7 +58,9 @@
<div id="content">
<py:with vars="flash=tg.flash_obj.render('flash', use_js=False)">
<div py:if="flash" py:content="XML(flash)" class="message"/>
- <div py:if="not flash" id="flash"/>
+ <div py:if="not flash" class="message">
+ <div id="flash"/>
+ </div>
</py:with>
<py:if test="'flash2' in session">
<div py:for="message in session['flash2']" class="message" id="${message.hash}">
10 years, 9 months
[luci] Enable the ricci and modclusterd services when creating a new cluster or adding a node to an existin
by Ryan McCabe
commit 22a4c774ec3dbc5c0bf6b4adae69640adab5681e
Author: Ryan McCabe <rmccabe(a)redhat.com>
Date: Mon Aug 12 16:44:31 2013 -0400
Enable the ricci and modclusterd services when creating a new cluster or adding a node to an existing cluster.
Resolves: rhbz#886517
Signed-off-by: Ryan McCabe <rmccabe(a)redhat.com>
luci/lib/ricci_queries.py | 22 ++++++++++++++++++++++
luci/public/js/busy.js | 1 +
2 files changed, 23 insertions(+), 0 deletions(-)
---
diff --git a/luci/lib/ricci_queries.py b/luci/lib/ricci_queries.py
index 40820b5..1610667 100644
--- a/luci/lib/ricci_queries.py
+++ b/luci/lib/ricci_queries.py
@@ -60,6 +60,17 @@ def addClusterNodeBatch(model,
batch.append('</request>')
batch.append('</module>')
+ batch.append('<module name="service">')
+ batch.append('<request API_version="1.0">')
+ batch.append('<function_call name="enable">')
+ batch.append('<var mutable="false" name="services" type="list_xml">')
+ batch.append('<service name="ricci"/>')
+ batch.append('<service name="modclusterd"/>')
+ batch.append('</var>')
+ batch.append('</function_call>')
+ batch.append('</request>')
+ batch.append('</module>')
+
need_reboot = reboot_nodes
if need_reboot:
batch.append('<module name="reboot">')
@@ -152,6 +163,17 @@ def createClusterBatch( cluster_name,
batch.append('</request>')
batch.append('</module>')
+ batch.append('<module name="service">')
+ batch.append('<request API_version="1.0">')
+ batch.append('<function_call name="enable">')
+ batch.append('<var mutable="false" name="services" type="list_xml">')
+ batch.append('<service name="ricci"/>')
+ batch.append('<service name="modclusterd"/>')
+ batch.append('</var>')
+ batch.append('</function_call>')
+ batch.append('</request>')
+ batch.append('</module>')
+
need_reboot = reboot_nodes
if need_reboot:
batch.append('<module name="reboot">')
diff --git a/luci/public/js/busy.js b/luci/public/js/busy.js
index 9f04f3a..e51ab22 100644
--- a/luci/public/js/busy.js
+++ b/luci/public/js/busy.js
@@ -39,6 +39,7 @@ function get_task_status(cluster_name) {
'',
'installing packages',
'disabling cluster services',
+ 'enabling ricci and modclusterd services',
'rebooting node',
'setting cluster configuration',
'enabling cluster services',
10 years, 9 months
[luci] luci: Add support for fence_scsi 'delay' attribute
by Ryan McCabe
commit fc467686fc8420048888cdd4f3ea5982790b4008
Author: Ryan McCabe <rmccabe(a)redhat.com>
Date: Wed Aug 7 12:05:00 2013 -0400
luci: Add support for fence_scsi 'delay' attribute
Add support for configuring fence_scsi's newly added "delay"
attribute.
Resolves: rhbz#883008
luci/templates/fence_instances.html | 7 +++++++
luci/validation/validate_fence.py | 1 +
2 files changed, 8 insertions(+), 0 deletions(-)
---
diff --git a/luci/templates/fence_instances.html b/luci/templates/fence_instances.html
index b10c4ec..ba7fc23 100644
--- a/luci/templates/fence_instances.html
+++ b/luci/templates/fence_instances.html
@@ -1209,6 +1209,13 @@
py:attrs="cur_fence_inst and {'value': cur_fence_inst.getAttribute('key')} or {}"/>
</td>
</tr>
+ <tr>
+ <td>Delay (optional)</td>
+ <td>
+ <input name="delay" type="text" class="text"
+ py:attrs="cur_fence_inst and {'value': cur_fence_inst.getAttribute('delay')}"/>
+ </td>
+ </tr>
<tr><td colspan="2">
<div>
<input type="button" name="remove_fence" value="Remove this instance"
diff --git a/luci/validation/validate_fence.py b/luci/validation/validate_fence.py
index 019dfac..e866a83 100644
--- a/luci/validation/validate_fence.py
+++ b/luci/validation/validate_fence.py
@@ -1201,6 +1201,7 @@ def val_scsi_fi(fenceinst, parent_name, **kw):
params = (
('nodename', False),
('key', False),
+ ('delay', False),
('unfencing', True), # just a template sanity-check
)
10 years, 9 months