CVSROOT: /cvs/cluster Module name: conga Changes by: [EMAIL PROTECTED] 2007-09-20 22:37:32
Modified files: . : conga.spec.in.in luci/site/luci/Extensions: FenceHandler.py LuciClusterInfo.py cluster_adapters.py luci/site/luci/Extensions/ClusterModel: Device.py FenceDevice.py ModelBuilder.py Added files: luci/site/luci/Extensions/ClusterModel: FenceDeviceAttr.py Log message: Fix bz253223 (When deleting a node from conga, the fence device isn't deleted) Patches: http://sourceware.org/cgi-bin/cvsweb.cgi/conga/conga.spec.in.in.diff?cvsroot=cluster&r1=1.83&r2=1.84 http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/FenceHandler.py.diff?cvsroot=cluster&r1=1.22&r2=1.23 http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/LuciClusterInfo.py.diff?cvsroot=cluster&r1=1.13&r2=1.14 http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/cluster_adapters.py.diff?cvsroot=cluster&r1=1.270&r2=1.271 http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/ClusterModel/FenceDeviceAttr.py.diff?cvsroot=cluster&r1=NONE&r2=1.1 http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/ClusterModel/Device.py.diff?cvsroot=cluster&r1=1.4&r2=1.5 http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/ClusterModel/FenceDevice.py.diff?cvsroot=cluster&r1=1.2&r2=1.3 http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/ClusterModel/ModelBuilder.py.diff?cvsroot=cluster&r1=1.9&r2=1.10 --- conga/conga.spec.in.in 2007/09/20 21:03:16 1.83 +++ conga/conga.spec.in.in 2007/09/20 22:37:32 1.84 @@ -293,6 +293,7 @@ - Fixed bz277661 (RFE: Better instructions on the luci login page if luci_admin not run.) - Fixed bz277711 (RFE: luci_admin should check that luci is running before asking for the password) - Fixed bz295771 (RFE: add ability to set self_fence attribute for clusterfs resources) +- Fixed bz253223 (When deleting a node from conga, the fence device isn't deleted) * Mon Aug 27 2007 Ryan McCabe <[EMAIL PROTECTED]> 0.10.0-6 - Fixed bz253783 --- conga/luci/site/luci/Extensions/FenceHandler.py 2007/08/08 21:26:37 1.22 +++ conga/luci/site/luci/Extensions/FenceHandler.py 2007/09/20 22:37:32 1.23 @@ -43,117 +43,6 @@ ILLEGAL_CHARS_REPLACED = 'Illegal characters were replaced by underscores. Feel free to set a new value.' -# For every new fence added, there will be a fence instance and fence device -# form needed. There will also be a populate and a validate method for each -# form. The methods will need to be added to this file, and the four hash -# tables (self.fi_populate, self.fi_validate, self.fd_populate, -# self.fd_validate) must be updated. The methods will use fields in the -# forms to set_text and to check. - -FENCE_OPTS = { - 'fence_apc': 'APC Power Device', - 'fence_wti': 'WTI Power Device', - 'fence_brocade': 'Brocade Switch', - 'fence_vixel': 'Vixel SAN Switch', - 'fence_gnbd': 'Global Network Block Device', - 'fence_sanbox2': 'QLogic SANBox2', - 'fence_bladecenter': 'IBM Blade Center', - 'fence_mcdata': 'McDATA SAN Switch', - 'fence_egenera': 'Egenera SAN Controller', - 'fence_bullpap': 'Bull PAP', - 'fence_xvm': 'Virtual Machine Fencing', - 'fence_scsi': 'SCSI Reservation', - 'fence_ilo': 'HP ILO Device', - 'fence_ipmilan': 'IPMI Lan', - 'fence_drac': 'Dell DRAC', - 'fence_rsa': 'IBM RSA II Device', - 'fence_rps10': 'RPS10 Serial Switch', - 'fence_manual': 'Manual Fencing' -} - -FENCE_SHARED = { - 'fence_apc': True, - 'fence_wti': True, - 'fence_brocade': True, - 'fence_vixel': True, - 'fence_gnbd': True, - 'fence_sanbox2': True, - 'fence_bladecenter': True, - 'fence_mcdata': True, - 'fence_egenera': True, - 'fence_bullpap': True, - 'fence_xvm': True, - 'fence_scsi': True, - 'fence_ilo': False, - 'fence_ipmilan': False, - 'fence_drac': False, - 'fence_rsa': False, - 'fence_rps10': False, - 'fence_manual': False -} - -PRETTY_NAME_ATTRS = { - 'port': 'Port', - 'blade': 'Blade', - 'switch': 'Switch', - 'ipaddr': 'IP Address', - 'ipaddress': 'IP Address', - 'nodename': 'Node Name', - 'lpan': 'LPAN', - 'lanplus': 'Lanplus', - 'pserver': 'PServer', - 'login': 'Login', - 'passwd': 'Password', - 'name': 'Name', - 'server': 'Server', - 'domain': 'Domain', - 'hostname': 'Hostname', - 'path': 'Path', - 'cserver': 'CServer' -} - -FENCE_FI_ATTRS = { - 'fence_apc': ['port', 'switch'], - 'fence_wti': ['port'], - 'fence_brocade': ['port'], - 'fence_vixel': ['port'], - 'fence_gnbd': ['ipaddress'], - 'fence_sanbox2': ['port'], - 'fence_bladecenter': ['blade'], - 'fence_mcdata': ['port'], - 'fence_egenera': ['lpan', 'pserver'], - 'fence_bullpap': ['domain'], - 'fence_xvm': ['domain'], - 'fence_scsi': ['nodename'], - 'fence_ilo': [], - 'fence_ipmilan': [], - 'fence_drac': [], - 'fence_rsa': [], - 'fence_rps10': [], - 'fence_manual': [] -} - -FENCE_FD_ATTRS = { - 'fence_apc': ['name', 'ipaddr', 'login', 'passwd'], - 'fence_wti': ['name', 'ipaddr', 'passwd'], - 'fence_brocade': ['name', 'ipaddr', 'login', 'passwd'], - 'fence_vixel': ['name', 'ipaddr', 'passwd'], - 'fence_gnbd': ['name', 'servers'], - 'fence_sanbox2': ['name', 'ipaddr', 'login', 'passwd'], - 'fence_bladecenter': ['name', 'ipaddr', 'login', 'passwd'], - 'fence_mcdata': ['name', 'ipaddr', 'login', 'passwd'], - 'fence_egenera': ['name', 'cserver'], - 'fence_bullpap': ['name', 'ipaddr', 'login', 'passwd'], - 'fence_xvm': ['name'], - 'fence_scsi': ['name'], - 'fence_ilo': ['name', 'hostname', 'login', 'passwd'], - 'fence_ipmilan': ['name', 'ipaddr', 'login', 'passwd', 'lanplus', 'auth'], - 'fence_drac': ['name', 'ipaddr', 'login', 'passwd'], - 'fence_rsa': ['name', 'hostname', 'login', 'passwd'], - 'fence_rps10': ['name', 'device', 'port'], - 'fence_manual': ['name'] -} - luci_log = get_logger() def makeNCName(name): --- conga/luci/site/luci/Extensions/LuciClusterInfo.py 2007/09/11 16:04:33 1.13 +++ conga/luci/site/luci/Extensions/LuciClusterInfo.py 2007/09/20 22:37:32 1.14 @@ -7,9 +7,9 @@ from Products.Archetypes.utils import make_uuid from ClusterModel.ModelBuilder import ModelBuilder +from ClusterModel.FenceDeviceAttr import FENCE_OPTS import RicciQueries as rq from ricci_communicator import RicciCommunicator -from FenceHandler import FENCE_OPTS from LuciSyslog import get_logger from LuciDB import resolve_nodename from LuciZope import GetReqVars --- conga/luci/site/luci/Extensions/cluster_adapters.py 2007/09/11 16:04:33 1.270 +++ conga/luci/site/luci/Extensions/cluster_adapters.py 2007/09/20 22:37:32 1.271 @@ -1796,6 +1796,7 @@ if fencedev_name is None: return (False, {'errors': ['No device name in form submission']}) + # XXX - FIXME: use new model calls to do this. fdev_to_delete = None fdevs = model.getFenceDevices() for fdev in fdevs: /cvs/cluster/conga/luci/site/luci/Extensions/ClusterModel/FenceDeviceAttr.py,v --> standard output revision 1.1 --- conga/luci/site/luci/Extensions/ClusterModel/FenceDeviceAttr.py +++ - 2007-09-20 22:37:33.804688000 +0000 @@ -0,0 +1,130 @@ +# Copyright (C) 2007 Red Hat, Inc. +# +# This program is free software; you can redistribute +# it and/or modify it under the terms of version 2 of the +# GNU General Public License as published by the +# Free Software Foundation. + +FENCE_POWER_CONTROLLERS = [ 'fence_wti', 'fence_apc', 'fence_apc_snmp' ] + +FENCE_OPTS = { + 'fence_apc': 'APC Power Device', + 'fence_wti': 'WTI Power Device', + 'fence_brocade': 'Brocade Switch', + 'fence_vixel': 'Vixel SAN Switch', + 'fence_gnbd': 'Global Network Block Device', + 'fence_sanbox2': 'QLogic SANBox2', + 'fence_bladecenter': 'IBM Blade Center', + 'fence_mcdata': 'McDATA SAN Switch', + 'fence_egenera': 'Egenera SAN Controller', + 'fence_bullpap': 'Bull PAP', + 'fence_xvm': 'Virtual Machine Fencing', + 'fence_scsi': 'SCSI Reservation', + 'fence_ilo': 'HP iLO Device', + 'fence_ipmilan': 'IPMI Lan', + 'fence_drac': 'Dell DRAC', + 'fence_rsa': 'IBM RSA II Device', + 'fence_rps10': 'RPS10 Serial Switch', + 'fence_manual': 'Manual Fencing' +} + +FENCE_SHARED = { + 'fence_apc': True, + 'fence_wti': True, + 'fence_brocade': True, + 'fence_vixel': True, + 'fence_gnbd': True, + 'fence_sanbox2': True, + 'fence_bladecenter': True, + 'fence_mcdata': True, + 'fence_egenera': True, + 'fence_bullpap': True, + 'fence_xvm': True, + 'fence_scsi': True, + 'fence_ilo': False, + 'fence_ipmilan': False, + 'fence_drac': False, + 'fence_rsa': False, + 'fence_rps10': False, + 'fence_manual': False +} + +PRETTY_NAME_ATTRS = { + 'port': 'Port', + 'blade': 'Blade', + 'switch': 'Switch', + 'ipaddr': 'IP Address', + 'ipaddress': 'IP Address', + 'nodename': 'Node Name', + 'lpan': 'LPAN', + 'lanplus': 'Lanplus', + 'pserver': 'PServer', + 'login': 'Login', + 'passwd': 'Password', + 'name': 'Name', + 'server': 'Server', + 'domain': 'Domain', + 'hostname': 'Hostname', + 'path': 'Path', + 'cserver': 'CServer' +} + +FENCE_FI_ATTRS = { + 'fence_apc': [ 'port', 'switch' ], + 'fence_wti': [ 'port' ], + 'fence_brocade': [ 'port' ], + 'fence_vixel': [ 'port' ], + 'fence_gnbd': [ 'ipaddress' ], + 'fence_sanbox2': [ 'port' ], + 'fence_bladecenter': [ 'blade' ], + 'fence_mcdata': [ 'port' ], + 'fence_egenera': [ 'lpan', 'pserver' ], + 'fence_bullpap': [ 'domain' ], + 'fence_xvm': [ 'domain' ], + 'fence_scsi': [ 'nodename' ], + 'fence_ilo': [ ], + 'fence_ipmilan': [ ], + 'fence_drac': [ ], + 'fence_rsa': [ ], + 'fence_rps10': [ ], + 'fence_manual': [ ] +} + +FENCE_FD_ATTRS = { + 'fence_apc': + [ 'name', 'ipaddr', 'login', 'passwd' ], + 'fence_wti': + [ 'name', 'ipaddr', 'passwd' ], + 'fence_brocade': + [ 'name', 'ipaddr', 'login', 'passwd' ], + 'fence_vixel': + [ 'name', 'ipaddr', 'passwd' ], + 'fence_gnbd': + [ 'name', 'servers' ], + 'fence_sanbox2': + [ 'name', 'ipaddr', 'login', 'passwd' ], + 'fence_bladecenter': + [ 'name', 'ipaddr', 'login', 'passwd' ], + 'fence_mcdata': + [ 'name', 'ipaddr', 'login', 'passwd' ], + 'fence_egenera': + [ 'name', 'cserver' ], + 'fence_bullpap': + [ 'name', 'ipaddr', 'login', 'passwd' ], + 'fence_xvm': + [ 'name' ], + 'fence_scsi': + [ 'name' ], + 'fence_ilo': + [ 'name', 'hostname', 'login', 'passwd' ], + 'fence_ipmilan': + [ 'name', 'ipaddr', 'login', 'passwd', 'lanplus', 'auth' ], + 'fence_drac': + [ 'name', 'ipaddr', 'login', 'passwd' ], + 'fence_rsa': + [ 'name', 'hostname', 'login', 'passwd' ], + 'fence_rps10': + [ 'name', 'device', 'port' ], + 'fence_manual': + [ 'name' ] +} --- conga/luci/site/luci/Extensions/ClusterModel/Device.py 2007/08/08 21:00:08 1.4 +++ conga/luci/site/luci/Extensions/ClusterModel/Device.py 2007/09/20 22:37:32 1.5 @@ -5,25 +5,21 @@ # GNU General Public License as published by the # Free Software Foundation. -import FenceHandler +import FenceDeviceAttr from TagObject import TagObject TAG_NAME = "device" OPTION = "option" -#New Power Controller Fence Agent names should be added to -#the list below -power_controller_list = [ "fence_wti", "fence_apc", "fence_apc_snmp" ] - class Device(TagObject): def __init__(self): TagObject.__init__(self) self.TAG_NAME = TAG_NAME self.agent_type = "" self.has_native_option_set = False - self.fi_attrs = FenceHandler.FENCE_FI_ATTRS - self.pretty_fence_names = FenceHandler.FENCE_OPTS - self.pretty_name_attrs = FenceHandler.PRETTY_NAME_ATTRS + self.fi_attrs = FenceDeviceAttr.FENCE_FI_ATTRS + self.pretty_fence_names = FenceDeviceAttr.FENCE_OPTS + self.pretty_name_attrs = FenceDeviceAttr.PRETTY_NAME_ATTRS def getAgentType(self): return self.agent_type @@ -35,7 +31,7 @@ return self.has_native_option_set def isPowerController(self): - for item in power_controller_list: + for item in FenceDeviceAttr.FENCE_POWER_CONTROLLERS: if self.agent_type == item: return True --- conga/luci/site/luci/Extensions/ClusterModel/FenceDevice.py 2007/06/25 16:03:39 1.2 +++ conga/luci/site/luci/Extensions/ClusterModel/FenceDevice.py 2007/09/20 22:37:32 1.3 @@ -5,7 +5,7 @@ # GNU General Public License as published by the # Free Software Foundation. -import FenceHandler +import FenceDeviceAttr from TagObject import TagObject TAG_NAME = "fencedevice" @@ -15,12 +15,10 @@ def __init__(self): TagObject.__init__(self) self.TAG_NAME = TAG_NAME - self.fd_attrs = FenceHandler.FENCE_FD_ATTRS - self.pretty_fence_names = FenceHandler.FENCE_OPTS - self.pretty_name_attrs = FenceHandler.PRETTY_NAME_ATTRS - self.shared_fences = FenceHandler.FENCE_SHARED - - + self.fd_attrs = FenceDeviceAttr.FENCE_FD_ATTRS + self.pretty_fence_names = FenceDeviceAttr.FENCE_OPTS + self.pretty_name_attrs = FenceDeviceAttr.PRETTY_NAME_ATTRS + self.shared_fences = FenceDeviceAttr.FENCE_SHARED def getAgentType(self): agent = self.attr_hash["agent"] @@ -30,6 +28,9 @@ pass return agent + def getPrettyName(self): + return self.pretty_fence_names[self.attr_hash['name']] + def isShared(self): agent = self.getAgentType() if agent == "fence_drac": #2 variants of drac... --- conga/luci/site/luci/Extensions/ClusterModel/ModelBuilder.py 2007/09/11 19:04:32 1.9 +++ conga/luci/site/luci/Extensions/ClusterModel/ModelBuilder.py 2007/09/20 22:37:32 1.10 @@ -333,7 +333,14 @@ return obj_tree - + def getFenceDeviceByName(self, name): + device = filter(lambda x: x.getName() == name, self.getFenceDevices()) + if len(device) > 1: + raise Exception, '%d fence devices named %s exist' % (len(device), name) + if len(device) < 1: + return None + return device[0] + ##Because fence devices are declared in a separate XML section ##in conf file, agent types for fence instances must be done in ##a separate pass, after the DOM is completely built. This method @@ -527,12 +534,19 @@ self.isModified = True def deleteNode(self, clusternode): - #1) delete node - #2) delete failoverdomainnodes with same name - #3) delete lockserver nodes if GULM + #1) delete any non-shared fence devices used by this node + #2) delete node + #3) delete failoverdomainnodes with same name + #4) delete lockserver nodes if GULM name = clusternode.getName() + for level in clusternode.getFenceLevels(): + for fence in level.getChildren(): + fdev = self.getFenceDeviceByName(fence.getName()) + if fdev and not fdev.isShared(): + self.deleteFenceDevice(fdev) + self.clusternodes_ptr.removeChild(clusternode) found_one = True @@ -607,6 +621,12 @@ self.cluster_ptr.removeChild(self.fence_xvmd_ptr) self.fence_xvmd_ptr = None + def deleteFenceDevice(self, device): + if self.fencedevices_ptr is None or device is None: + return False + self.fencedevices_ptr.removeChild(device) + return True + def getFenceDevices(self): if self.fencedevices_ptr is None: return list()