From mboxrd@z Thu Jan 1 00:00:00 1970 From: rmccabe@sourceware.org Date: 10 Jan 2007 22:53:58 -0000 Subject: [Cluster-devel] conga/luci cluster/fence_device.js cluster/for ... Message-ID: <20070110225358.16117.qmail@sourceware.org> List-Id: To: cluster-devel.redhat.com MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit CVSROOT: /cvs/cluster Module name: conga Branch: RHEL5 Changes by: rmccabe at sourceware.org 2007-01-10 22:53:56 Modified files: luci/cluster : fence_device.js form-macros luci/homebase : luci_homebase.css luci/site/luci/Extensions: cluster_adapters.py conga_constants.py homebase_adapters.py Log message: fixes related to bz212021 Patches: http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/cluster/fence_device.js.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.2.2.1&r2=1.2.2.2 http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/cluster/form-macros.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.90.2.13&r2=1.90.2.14 http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/homebase/luci_homebase.css.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.28.2.3&r2=1.28.2.4 http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/cluster_adapters.py.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.120.2.16&r2=1.120.2.17 http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/conga_constants.py.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.19.2.5&r2=1.19.2.6 http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/homebase_adapters.py.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.34.2.10&r2=1.34.2.11 --- conga/luci/cluster/fence_device.js 2006/12/12 13:37:24 1.2.2.1 +++ conga/luci/cluster/fence_device.js 2007/01/10 22:53:56 1.2.2.2 @@ -1,3 +1,46 @@ +var num_fences_level = Array(0, 0) +var num_fence_instances = new Array() + +function del_fence_instance(fi_div_id) { + delete_element_id(fi_div_id); +} + +function del_fence(fence_id) { + delete_element_id(fence_id); +} + +function add_fence_instance(fi_cont_id, fence_type) { + var instance_div = document.getElementById(fi_cont_id + '_instances'); + if (!instance_div) + return (-1); + + var fi_form = document.getElementById(fence_type + '_instance'); + if (fi_form) { + var cloned_iform = fi_form.cloneNode(1); + var fencei_name = fi_cont_id + '_' + num_fence_instances[fi_cont_id]++; + cloned_iform.id = fencei_name; + cloned_iform.name = fencei_name; + cloned_iform.className = 'fence_instance'; + + var form_elem = document.createElement('form'); + form_elem.name = cloned_iform.id; + form_elem.appendChild(cloned_iform); + var ielem = cloned_iform.getElementsByTagName('input'); + for (var i = 0 ; i < ielem.length ; i++) { + if (ielem[i].name == 'parent_fencedev') { + ielem[i].value = fi_cont_id; + } else if ( ielem[i].type == 'button' && + ielem[i].name == 'remove_fence') + { + ielem[i].setAttribute('onclick', + 'del_fence_instance(\'' + cloned_iform.id + '\')'); + } + } + + instance_div.appendChild(form_elem); + } +} + function swap_fence_div(container_id, element_id) { var container_element = document.getElementById(container_id); if (!container_element) { @@ -25,14 +68,13 @@ var fence_id = fence_opt.value; var child_element = document.getElementById(fence_id); - if (container_element.firstChild) - container_element.removeChild(container_element.firstChild); - if (!child_element) return (-1); + if (container_element.firstChild) + container_element.removeChild(container_element.firstChild); var target = child_element.cloneNode(1); - target.id = null; + target.id = ''; var fence_type = fence_id; if (fence_opt.className.match(/shared_fencedev/)) { @@ -46,13 +88,66 @@ } } + var target_form = document.createElement('form'); + target_form.name = container_element.id; + target_form.appendChild(target); + container_element.appendChild(target_form); + var fi_form = document.getElementById(fence_type + '_instance'); - if (fi_form) - target.appendChild(fi_form.cloneNode(1)); - container_element.appendChild(target); -} + var sharable = 0; + if (fi_form) { + var idiv = document.createElement('div'); + idiv.id = container_id + '_instances'; + idiv.name = idiv.id; + + var cloned_iform = fi_form.cloneNode(1); + cloned_iform.id = container_id + '_0'; + cloned_iform.name = cloned_iform.id; + cloned_iform.className = 'fence_instance'; + + var form_elem = document.createElement('form'); + form_elem.name = cloned_iform.id; + form_elem.appendChild(cloned_iform); + var ielem = cloned_iform.getElementsByTagName('input'); + for (var i = 0 ; i < ielem.length ; i++) { + if (ielem[i].name == 'parent_fencedev') { + ielem[i].value = container_id; + } else if ( ielem[i].type == 'button' + && ielem[i].name == 'remove_fence') + { + ielem[i].setAttribute('onclick', + 'del_fence_instance(\'' + cloned_iform.id + '\')'); + } + } + idiv.appendChild(form_elem); + container_element.appendChild(idiv); + num_fence_instances[container_id] = 1; + sharable++; + } -var num_fences_level = Array(0, 0) + var remove_div = document.createElement('div'); + remove_div.className = 'hbSubmit'; + + var remove_button = document.createElement('input'); + remove_button.setAttribute('type', 'button'); + remove_button.setAttribute('value', 'Remove this device'); + remove_button.setAttribute('onclick', "del_fence('" + container_element.id + "');"); + + if (sharable) { + var add_instance_button = document.createElement('input'); + add_instance_button.setAttribute('type', 'button'); + add_instance_button.setAttribute('name', 'add_fence_inst'); + add_instance_button.setAttribute('value', 'Add an instance'); + add_instance_button.setAttribute('onclick', "add_fence_instance('" + container_element.id + "','" + fence_type + "');"); + add_instance_button.className = 'pad_left'; + } + + var remove_form = document.createElement('form'); + remove_form.appendChild(remove_button); + remove_form.appendChild(add_instance_button); + remove_div.appendChild(remove_form); + container_element.appendChild(remove_div); +} function add_node_fence_device(fence_level) { var cont_name = 'fence_list_level' + fence_level; @@ -67,9 +162,10 @@ var div_elem = document.createElement('div'); if (!div_elem) return (-1); - var level_num_fences = num_fences_level[fence_level]; + var level_num_fences = num_fences_level[fence_level - 1]; div_elem.id = 'fence' + fence_level + '_' + level_num_fences; + div_elem.className = 'fence_level'; chooser_elem = chooser_elem.cloneNode(1); chooser_elem.id = null; chooser_elem.className = null; @@ -91,5 +187,44 @@ div_elem.appendChild(chooser_elem); container.appendChild(div_elem); - num_fences_level[fence_level]++; + num_fences_level[fence_level - 1]++; +} + +function validate_fence(master_form, container_id) { + var errors = new Array(); + var div_elem = document.getElementById(container_id); + if (!div_elem) + return (-1); + var form_xml = ''; + + var form = div_elem.getElementsByTagName('form'); + for (var i = 0 ; i < form.length ; i++) { + var input_elem = form[i].getElementsByTagName('input'); + var temp = ''; + for (var j = 0 ; j < input_elem.length ; j++) { + var res_type = input_elem[j].type; + if (res_type == 'hidden' || res_type == 'text' || + res_type == 'password') + { + temp += ''; + } else if (res_type == 'checkbox' || res_type == 'radio') { + if (input_elem[j].checked) + temp += ''; + } + + form_xml += '
' + temp + '
'; + } + + master_form.fence_xml.value = '' + form_xml + ''; + + if (confirm('Update this node\'s fence configuration?')) + master_form.submit(); } --- conga/luci/cluster/form-macros 2007/01/04 00:22:13 1.90.2.13 +++ conga/luci/cluster/form-macros 2007/01/10 22:53:56 1.90.2.14 @@ -1166,6 +1166,7 @@
+ @@ -1182,6 +1183,7 @@
+ @@ -1202,6 +1204,31 @@
+
+ +
+ + + + + + + + + +
Fence Type[unknown]
Name + +
+ + + + + +
+
+
@@ -1223,7 +1250,7 @@ IP Address - @@ -1241,7 +1268,7 @@ Password - @@ -1249,15 +1276,6 @@ -
- - - - - -
- IP Address - @@ -1308,7 +1326,7 @@ Password - @@ -1316,15 +1334,6 @@ -
- - - - - -
- IP Address - @@ -1366,7 +1375,7 @@ Password - @@ -1374,15 +1383,6 @@ -
- - - - - -
- Password - @@ -1462,7 +1462,7 @@ IP Address - @@ -1476,7 +1476,7 @@ Password - @@ -1524,7 +1524,7 @@ Password - @@ -1561,7 +1561,7 @@ IP Address - @@ -1579,7 +1579,7 @@ Password - @@ -1587,15 +1587,6 @@ -
- - - - - -
- IP Address - + + + Login @@ -1641,7 +1637,7 @@ Password - @@ -1649,15 +1645,6 @@ -
- - - - - -
- IP Address - @@ -1699,7 +1686,7 @@ Password - @@ -1707,15 +1694,6 @@ -
- - - - - -
- -
- - - - - -
- -
- - - - - -
- IP Address - @@ -1867,7 +1827,7 @@ Password - @@ -1879,6 +1839,7 @@ tal:attributes="value cur_fencedev/name | nothing" /> +
@@ -1904,7 +1865,7 @@ IP Address - @@ -1922,7 +1883,7 @@ Password - @@ -1930,15 +1891,6 @@ -
- - - - - -
- -
- - - - - -
- IP Address - @@ -2104,6 +2047,14 @@ Authentication Type + + Use Lanplus + + + + @@ -2219,8 +2170,11 @@ -
-
+
+ +
@@ -2230,21 +2184,39 @@ - + - - +
Port
SwitchSwitch (optional)
+
+ + + + + + +
+
+ + + +
-
-
+
+
@@ -2260,15 +2232,33 @@ tal:attributes="value cur_instance/pserver | nothing" /> - - +
lpan
+
+ + + + + + +
+
+ + + +
-
-
+
+
@@ -2277,15 +2267,33 @@ tal:attributes="value cur_instance/port | nothing" /> - - +
Port
+
+ + + + + + +
+
+ + + +
-
-
+
+
@@ -2294,15 +2302,33 @@ tal:attributes="value cur_instance/port | nothing" /> - - +
Port
+
+ + + + + + +
+
+ + + +
-
-
+
+
@@ -2311,15 +2337,33 @@ tal:attributes="value cur_instance/port | nothing" /> - - +
Port
+
+ + + + + + +
+
+ + + +
-
-
+
+
@@ -2328,15 +2372,33 @@ tal:attributes="value cur_instance/port | nothing" /> - - +
Port
+
+ + + + + + +
+
+ + + +
-
-
+
+
@@ -2345,15 +2407,33 @@ tal:attributes="value cur_instance/port | nothing" /> - - +
Port
+
+ + + + + + +
+
+ + + +
-
-
+
+
@@ -2362,32 +2442,68 @@ tal:attributes="value cur_instance/ipaddress | nothing" /> - - +
IP Address
+
+ + + + + + +
+
+ + + +
-
-
+
+
- - +
Blade - +
+
+ + + + + + +
+
+ + + +
-
-
+
+
@@ -2396,15 +2512,55 @@ tal:attributes="value cur_instance/domain | nothing" /> - - + +
Domain
+
+ + + + + + +
+
+ + + + +
+
+ +
+
+ + + + +
Node name + +
+ + + +
-
-
+
+
@@ -2413,10 +2569,26 @@ tal:attributes="value cur_instance/domain | nothing" /> - - +
Domain
+
+ + + + + + +
+
+ + + +
@@ -2440,13 +2612,82 @@ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ '" /> + + + +
+ +
+ + + +
+
+
+
+ + +
+ - - +
+
-
+ onclick="add_node_fence_device(1)" />
+
- - -
- + +
+ + + +
+ + + + + +
+ + + + + +
+ +
+ + + +
+
+
+
+
+ +
+ - - +
+
@@ -2719,12 +3040,46 @@
+ + + + +
+
+ + + + + + +
+
+ + +
+
+ + + + + + +
+
@@ -2880,7 +3235,7 @@

Add a node to

+ tal:attributes="value cur_cluster_name | string:[unknown]" /> @@ -3192,7 +3547,7 @@
- +
@@ -3707,19 +4062,24 @@
- + +
+ +
+
+
+
+ + + -
-
-
- - - -
@@ -3740,7 +4100,7 @@ - + @@ -3837,40 +4197,57 @@ + + + +

Fence Device Form

-
+
+ global cur_fence_type nothing" /> - - + - + global cur_fence_type cur_fencedev/agent | nothing" /> + -
- - - - - - - -
- - - - - - +
+ + + + + + + +
+ +
+ + +
+ + + + +
+ +
+
--- conga/luci/homebase/luci_homebase.css 2006/12/22 17:50:16 1.28.2.3 +++ conga/luci/homebase/luci_homebase.css 2007/01/10 22:53:56 1.28.2.4 @@ -14,6 +14,10 @@ background: #dee7ec; } +input.pad_left { + margin-left: +.3333em; +} + div.fence { max-width: 700px; padding: .5em; @@ -28,6 +32,17 @@ width: 700px; } +div.fence_level { + padding: .4045em; + border-bottom: 1px solid #cccccc; +} + +div.fence_instance { + margin-left: 1em; + padding-left: .4045em; + border-left: 1px solid #cccccc; +} + div.fence, td.fence { padding-top: .309em; --- conga/luci/site/luci/Extensions/cluster_adapters.py 2007/01/02 20:21:26 1.120.2.16 +++ conga/luci/site/luci/Extensions/cluster_adapters.py 2007/01/10 22:53:56 1.120.2.17 @@ -23,6 +23,10 @@ from QuorumD import QuorumD from Heuristic import Heuristic from clusterOS import resolveOSType +from Fence import Fence +from Method import Method +from FenceDevice import FenceDevice +from Device import Device from FenceHandler import validateNewFenceDevice, FENCE_OPTS, validateFenceDevice from GeneralError import GeneralError from homebase_adapters import manageCluster, createClusterSystems, havePermCreateCluster, setNodeFlag, delNodeFlag, userAuthenticated, getStorageNode, getClusterNode, delCluster, parseHostForm @@ -1433,6 +1437,327 @@ errors.append(error_string) return (False, {'errors': errors, 'messages': messages}) +def validateNodeFenceConfig(self, request): + try: + form_xml = request['fence_xml'] + if not form_xml: + raise KeyError, 'form_xml must not be blank' + except Exception, e: + luci_log.debug_verbose('vNFC0: no form_xml: %s' % str(e)) + return (False, {'errors': ['No fence data was supplied.']}) + + try: + fence_level = int(request.form['fence_level'].strip()) + except Exception, e: + luci_log.debug_verbose('vNFC1: no fence level: %s' % str(e)) + return (False, {'errors': ['No fence level was supplied.']}) + + try: + nodename = request['nodename'] + if not nodename: + raise Exception, 'nodename is blank' + except Exception, e: + luci_log.debug_verbose('vNFC2: no nodename: %s' % str(e)) + return (False, {'errors': ['No node name was given.']}) + + try: + clustername = request['clustername'] + if not clustername: + raise Exception, 'clustername is blank' + except Exception, e: + luci_log.debug_verbose('vNFC3: no clustername: %s' % str(e)) + return (False, {'errors': ['No cluster name was given.']}) + + try: + model = request.SESSION.get('model') + if not model: + raise Exception, 'model is none' + except Exception, e: + model = None + try: + model = getModelForCluster(self, clustername) + except: + model = None + + if model is None: + luci_log.debug_verbose('vNFC4: unable to get model for cluster %s' % clustername) + return (False, {'errors': ['No cluster model was found.']}) + + try: + doc = minidom.parseString(form_xml) + except Exception, e: + luci_log.debug_verbose('vNFC5: error: %s' % str(e)) + return (False, {'errors': ['The fence data submitted is not properly formed.']}) + + try: + node = model.retrieveNodeByName(nodename) + except GeneralError, e: + luci_log.debug_verbose('vNFC6: unable to find node name %s in current node list' % (str(nodename), str(e))) + return (False, {'errors': ['Unable to find the cluster node %s in the node list.' % str(nodename) ]}) + + fence_level_num = int(fence_level) + levels = node.getFenceLevels() + try: + method_id = levels[fence_level_num - 1].getAttribute('name') + if not method_id: + raise Exception, 'No method ID' + fence_method = Method() + fence_method.addAttribute('name', str(method_id)) + levels[fence_level_num - 1] = fence_method + except Exception, e: + method_id = fence_level + fence_method = Method() + fence_method.addAttribute('name', str(method_id)) + + forms = doc.getElementsByTagName('form') + if len(forms) < 1: + delete_target = None + for l in levels: + # delete the fence level + if l.getAttribute('name') == method_id: + delete_target = l + break + if delete_target is not None: + try: + node.getChildren()[0].removeChild(l) + except Exception, e: + luci_log.debug_verbose('vNFC6a: %s: %s' % (method_id, str(e))) + return (False, {'errors': ['An error occurred while deleting fence method %s' % method_id ]}) + else: + return (True, {'messages': ['No changes were made.'] }) + + form_hash = {} + for i in forms: + form_id = i.getAttribute('id') + if not form_id: + continue + ielems = i.getElementsByTagName('input') + if not ielems or len(ielems) < 1: + continue + + dummy_form = {} + + for i in ielems: + try: + input_type = str(i.getAttribute('type')) + except Exception, e: + luci_log.debug_verbose('vNFC7: input type: %s' % str(e)) + continue + + if not input_type or input_type == 'button': + continue + + try: + dummy_form[str(i.getAttribute('name'))] = str(i.getAttribute('value')) + except Exception, e: + luci_log.debug_verbose('vNFC8: parsing XML: %s' % str(e)) + + if len(dummy_form) < 1: + continue + + if 'fence_instance' in dummy_form: + try: + parent = dummy_form['parent_fencedev'] + except: + luci_log.debug_verbose('vNFC9: no parent for instance') + return (False, {'errors': [ 'Unable to determine what device the current instance uses.' ]}) + + try: + parent_form = form_hash[parent][1].append(dummy_form) + del dummy_form['fence_instance'] + except Exception, e: + luci_log.debug_verbose('vNFC10: no parent for instance') + return (False, {'errors': [ 'Unable to determine what device the current instance uses.' ]}) + else: + form_hash[form_id] = (dummy_form, list()) + + fh_keys = form_hash.keys() + fh_keys.sort() + for i in fh_keys: + fencedev_name = None + fencedev_unknown = False + fencedev_obj = None + + try: + fence_form, instance_list = form_hash[i] + except Exception, e: + luci_log.debug_verbose('vNFC11: %s' % str(e)) + continue + + try: + fence_type = fence_form['fence_type'] + if not fence_type: + raise Exception, 'fence type is blank' + fence_form['agent'] = fence_type + except Exception, e: + luci_log.debug_verbose('vNFC12: %s %s' % (i, str(e))) + fence_type = None + + try: + del fence_form['fence_type'] + except: + pass + + if 'existing_device' in fence_form: + del fence_form['existing_device'] + fencedev_name = fence_form['name'] + + if fence_type is None: + # An unknown device. Pull the data out of + # the model and persist it and all instances. + # All we care about is its name. + fencedev_unknown = True + else: + if 'sharable' in fence_form: + # If it's a shared fence device that already exists, the + # user could not have edited it (without playing dirty + # games), so it's safe to pull the existing entry from + # the model. All we need is the device name. + pass + else: + # An existing non-shared device; build up the device + # from scratch since the user could have edited it. + try: + old_name = fence_form['old_name'] + if not old_name: + raise Exception, 'old name is blank' + del fence_form['old_name'] + except Exception, e: + luci_log.debug_verbose('vNFC12: no old name for %s %s' \ + % (fence_form['name'], str(e))) + return (False, {'errors': [ 'Unable to determine the original name for the device now named %s' % fencedev_name ]}) + + fencedev_obj = None + fence_dev_list = model.getFenceDevices() + for fd in fence_dev_list: + if fd.getAttribute('name') == old_name: + fencedev_obj = fd + break + + if fencedev_obj is None: + luci_log.debug_verbose('vNFC14: no fence device named %s was found' % old_name) + return (False, {'errors': ['No fence device named %s was found' % old_name ] }) + else: + try: + model.fencedevices_ptr.removeChild(fd) + except Exception, e: + luci_log.debug_verbose('VNFC8a: %s: %s' \ + % (old_name, str(e))) + return (False, {'errors': [ 'Unable to remove old fence device %s' % old_name ]}) + + for k in fence_form.keys(): + if fence_form[k]: + fencedev_obj.addAttribute(k, str(fence_form[k])) + + # Add back the tags under the method block + # for the fence instance + instance_list.append({'name': fencedev_name }) + else: + # The user created a new fence device. + fencedev_name = fence_form['name'] + fencedev_obj = FenceDevice() + for k in fence_form.keys(): + if fence_form[k]: + fencedev_obj.addAttribute(k, str(fence_form[k])) + + # If it's not shared, we need to create an instance form + # so the appropriate XML goes into the block inside + # . All we need for that is the device name. + if not 'sharable' in fence_form: + instance_list.append({'name': fencedev_name }) + + if fencedev_obj is not None: + # If a device with this name exists in the model + # already, replace it with the current object. If + # this block is not executed, we don't need to make + # any changes to the fencedevices block for this + # device + fence_dev_list = model.getFenceDevices() + for fd in fence_dev_list: + if fencedev_name == fd.getAttribute('name'): + luci_log.debug_verbose('vNFC15: fence ident %s already in use' % fencedev_name) + return (False, {'errors': ['There is already a fence device named %s' % fencedev_name ] }) + model.fencedevices_ptr.addChild(fencedev_obj) + + if fencedev_unknown is True: + # Save any instances for this fence device. + pass + + for inst in instance_list: + try: + del inst['parent_fencedev'] + except: + pass + try: + del inst['new_instance'] + except: + pass + try: + del inst['name'] + except: + pass + try: + del inst['existing_instance'] + except: + pass + + device_obj = Device() + device_obj.setAgentType(fence_type) + device_obj.addAttribute('name', fencedev_name) + for k in inst.keys(): + if inst[k]: + device_obj.addAttribute(k, str(inst[k])) + fence_method.addChild(device_obj) + + if len(node.getChildren()) > 0: + # There's already a block + found_target = False + for idx in xrange(len(levels)): + if levels[idx].getAttribute('name') == method_id: + found_target = True + break + + if found_target is False: + # There's a fence block, but no relevant method + # block + node.getChildren()[0].addChild(fence_method) + else: + # There is no tag under the node yet. + fence_node = Fence() + fence_node.addChild(fence_method) + node.addChild(fence_node) + + try: + cp = model.getClusterPtr() + cp.incrementConfigVersion() + model.setModified(True) + conf = str(model.exportModelAsString()) + if not conf: + raise Exception, 'model string is blank' + luci_log.debug_verbose('vNFC16: exported \"%s\"' % conf) + except Exception, e: + luci_log.debug_verbose('vNFC17: exportModelAsString failed: %s' \ + % str(e)) + return (False, {'errors': [ 'An error occurred while constructing the new cluster configuration.' ]}) + + rc = getRicciAgent(self, clustername) + if not rc: + luci_log.debug_verbose('vNFC18: unable to find a ricci agent for cluster %s' % clustername) + return (False, {'errors': ['Unable to find a ricci agent for the %s cluster' % clustername ]}) + ragent = rc.hostname() + + batch_number, result = setClusterConf(rc, conf) + if batch_number is None or result is None: + luci_log.debug_verbose('vNFC19: missing batch and/or result') + return (False, {'errors': [ 'An error occurred while constructing the new cluster configuration.' ]}) + + try: + set_node_flag(self, clustername, ragent, str(batch_number), FENCEDEV_NODE_CONFIG, "Updating fence configuration for node \'%s\'" % nodename) + except Exception, e: + luci_log.debug_verbose('vNFC20: failed to set flags: %s' % str(e)) + + response = request.RESPONSE + response.redirect(request['URL'] + "?pagetype=" + NODE + "&clustername=" + clustername + '&nodename=' + nodename + '&busyfirst=true') def deleteFenceDevice(self, request): errors = list() @@ -1654,7 +1979,8 @@ 51: validateFenceAdd, 50: validateFenceEdit, 55: validateDaemonProperties, - 57: deleteFenceDevice + 57: deleteFenceDevice, + 58: validateNodeFenceConfig } def validatePost(self, request): @@ -3922,6 +4248,7 @@ try: map['pretty_name'] = FENCE_OPTS[fencedev.getAgentType()] except: + map['unknown'] = True map['pretty_name'] = fencedev.getAgentType() nodes_used = list() @@ -4036,7 +4363,11 @@ if fd is not None: if fd.isShared() == False: #Not a shared dev...build struct and add fencedev = {} - fencedev['prettyname'] = FENCE_OPTS[fd.getAgentType()] + try: + fencedev['prettyname'] = FENCE_OPTS[fd.getAgentType()] + except: + fencedev['unknown'] = True + fencedev['prettyname'] = fd.getAgentType() fencedev['isShared'] = False fencedev['id'] = str(major_num) major_num = major_num + 1 @@ -4073,7 +4404,11 @@ continue else: #Shared, but not used above...so we need a new fencedev struct fencedev = {} - fencedev['prettyname'] = FENCE_OPTS[fd.getAgentType()] + try: + fencedev['prettyname'] = FENCE_OPTS[fd.getAgentType()] + except: + fencedev['unknown'] = True + fencedev['prettyname'] = fd.getAgentType() fencedev['isShared'] = True fencedev['cfgurl'] = baseurl + "?clustername=" + clustername + "&fencename=" + fd.getName().strip() + "&pagetype=" + FENCEDEV fencedev['id'] = str(major_num) @@ -4111,7 +4446,11 @@ shared_struct['name'] = fd.getName().strip() agentname = fd.getAgentType() shared_struct['agent'] = agentname - shared_struct['prettyname'] = FENCE_OPTS[agentname] + try: + shared_struct['prettyname'] = FENCE_OPTS[agentname] + except: + shared_struct['unknown'] = True + shared_struct['prettyname'] = agentname shared1.append(shared_struct) map['shared1'] = shared1 @@ -4131,7 +4470,11 @@ if fd is not None: if fd.isShared() == False: #Not a shared dev...build struct and add fencedev = {} - fencedev['prettyname'] = FENCE_OPTS[fd.getAgentType()] + try: + fencedev['prettyname'] = FENCE_OPTS[fd.getAgentType()] + except: + fencedev['unknown'] = True + fencedev['prettyname'] = fd.getAgentType() fencedev['isShared'] = False fencedev['id'] = str(major_num) major_num = major_num + 1 @@ -4168,7 +4511,11 @@ continue else: #Shared, but not used above...so we need a new fencedev struct fencedev = {} - fencedev['prettyname'] = FENCE_OPTS[fd.getAgentType()] + try: + fencedev['prettyname'] = FENCE_OPTS[fd.getAgentType()] + except: + fencedev['unknown'] = True + fencedev['prettyname'] = fd.getAgentType() fencedev['isShared'] = True fencedev['cfgurl'] = baseurl + "?clustername=" + clustername + "&fencename=" + fd.getName().strip() + "&pagetype=" + FENCEDEV fencedev['id'] = str(major_num) @@ -4206,7 +4553,11 @@ shared_struct['name'] = fd.getName().strip() agentname = fd.getAgentType() shared_struct['agent'] = agentname - shared_struct['prettyname'] = FENCE_OPTS[agentname] + try: + shared_struct['prettyname'] = FENCE_OPTS[agentname] + except: + shared_struct['unknown'] = True + shared_struct['prettyname'] = agentname shared2.append(shared_struct) map['shared2'] = shared2 @@ -4237,6 +4588,7 @@ try: fencedev['pretty_name'] = FENCE_OPTS[fd.getAgentType()] except: + fencedev['unknown'] = True fencedev['pretty_name'] = fd.getAgentType() fencedev['agent'] = fd.getAgentType() #Add config url for this fencedev --- conga/luci/site/luci/Extensions/conga_constants.py 2007/01/08 15:29:09 1.19.2.5 +++ conga/luci/site/luci/Extensions/conga_constants.py 2007/01/10 22:53:56 1.19.2.6 @@ -45,6 +45,7 @@ CLUSTER_DAEMON="55" SERVICE_DELETE = '56' FENCEDEV_DELETE = "57" +FENCEDEV_NODE_CONFIG = '58' CONF_EDITOR = '80' --- conga/luci/site/luci/Extensions/homebase_adapters.py 2007/01/08 19:49:20 1.34.2.10 +++ conga/luci/site/luci/Extensions/homebase_adapters.py 2007/01/10 22:53:56 1.34.2.11 @@ -794,6 +794,7 @@ def validateAuthenticate(self, request): try: request.SESSION.delete('auth_systems') + request.SESSION.delete('auth_status') except: pass @@ -874,7 +875,6 @@ else: try: request.SESSION.delete('auth_systems') - del auth_systems except: pass