[luci] Preserve comment elements for resource ref tags
by Ryan McCabe
commit 52fc788df54d064a7ea892b0ba01d5f36a0b16b3
Author: Ryan McCabe <rmccabe(a)redhat.com>
Date: Sun Oct 24 12:05:02 2010 -0400
Preserve comment elements for resource ref tags
luci/lib/ClusterConf/ModelBuilder.py | 14 ++++++++++----
1 files changed, 10 insertions(+), 4 deletions(-)
---
diff --git a/luci/lib/ClusterConf/ModelBuilder.py b/luci/lib/ClusterConf/ModelBuilder.py
index 7da9426..ad14308 100644
--- a/luci/lib/ClusterConf/ModelBuilder.py
+++ b/luci/lib/ClusterConf/ModelBuilder.py
@@ -257,7 +257,8 @@ class ModelBuilder:
self.events_ptr = new_object
else:
if parent_node.nodeType in (Node.COMMENT_NODE, Node.TEXT_NODE):
- return parent_node
+ if parent_node.data and not parent_node.data.isspace():
+ return parent_node
return None
pending_comments = []
@@ -269,9 +270,7 @@ class ModelBuilder:
pending_comments.append(result_object.data)
elif result_object.nodeType == Node.TEXT_NODE:
if type(new_object) is Event.Event:
- elem_txt = result_object.data
- if elem_txt is not None and not elem_txt.isspace():
- new_object.element_text = elem_txt
+ new_object.element_text = result_object.data
else:
result_object.comments = pending_comments
new_object.addChild(result_object)
@@ -382,6 +381,13 @@ class ModelBuilder:
# Must be a service
parent = self.resourcemanager_ptr
+ try:
+ rf.comments = entity.comments
+ rf.trailing_comments = entity.trailing_comments
+ rf.element_text = entity.element_text
+ except:
+ pass
+
parent.replaceChild(entity, rf)
return True
13 years, 6 months
[luci] Preserve DOM Text nodes that are children of Event elements as they may contain script data.
by Ryan McCabe
commit efb96490f93e74e43843999dbc1f6c20a57a08cc
Author: Ryan McCabe <rmccabe(a)redhat.com>
Date: Sun Oct 24 02:20:50 2010 -0400
Preserve DOM Text nodes that are children of Event elements as they may contain script data.
luci/lib/ClusterConf/Event.py | 7 +++++++
luci/lib/ClusterConf/ModelBuilder.py | 24 +++++++++++++++---------
luci/lib/ClusterConf/TagObject.py | 4 ++++
3 files changed, 26 insertions(+), 9 deletions(-)
---
diff --git a/luci/lib/ClusterConf/Event.py b/luci/lib/ClusterConf/Event.py
index 82c52b0..7e031d9 100644
--- a/luci/lib/ClusterConf/Event.py
+++ b/luci/lib/ClusterConf/Event.py
@@ -46,3 +46,10 @@ class Event(TagObject):
def getNodeLocal(self):
return self.getBinaryAttribute('node_local')
+
+ def getScript(self):
+ return self.element_text
+
+ def setScript(self, val):
+ self.element_text = val
+ return self.element_text
diff --git a/luci/lib/ClusterConf/ModelBuilder.py b/luci/lib/ClusterConf/ModelBuilder.py
index ffa6497..7da9426 100644
--- a/luci/lib/ClusterConf/ModelBuilder.py
+++ b/luci/lib/ClusterConf/ModelBuilder.py
@@ -256,7 +256,7 @@ class ModelBuilder:
elif parent_node.nodeName == Events.TAG_NAME:
self.events_ptr = new_object
else:
- if parent_node.nodeType == Node.COMMENT_NODE:
+ if parent_node.nodeType in (Node.COMMENT_NODE, Node.TEXT_NODE):
return parent_node
return None
@@ -265,7 +265,13 @@ class ModelBuilder:
result_object = self.buildModel(item, new_object)
if result_object is not None:
if not issubclass(type(result_object), TagObject):
- pending_comments.append(result_object.data)
+ if result_object.nodeType == Node.COMMENT_NODE:
+ pending_comments.append(result_object.data)
+ elif result_object.nodeType == Node.TEXT_NODE:
+ if type(new_object) is Event.Event:
+ elem_txt = result_object.data
+ if elem_txt is not None and not elem_txt.isspace():
+ new_object.element_text = elem_txt
else:
result_object.comments = pending_comments
new_object.addChild(result_object)
@@ -372,12 +378,12 @@ class ModelBuilder:
except:
pass
- if parent is None: #Must be a service
- self.resourcemanager_ptr.replaceChild(entity, rf)
- return True
- else:
- parent.replaceChild(entity, rf)
- return True
+ if parent is None:
+ # Must be a service
+ parent = self.resourcemanager_ptr
+
+ parent.replaceChild(entity, rf)
+ return True
def exportModelAsString(self):
if self.perform_final_check() is False: # failed
@@ -946,7 +952,7 @@ class ModelBuilder:
if self.isQuorumd():
self.cman_ptr.delTwoNode()
- self.cman_ptr.setExpectedVotes(self.get_expected_votes())
+ self.cman_ptr.setExpectedVotes(max(1, self.get_expected_votes()))
else:
if clusternodes_count == 2:
self.cman_ptr.setTwoNode(True)
diff --git a/luci/lib/ClusterConf/TagObject.py b/luci/lib/ClusterConf/TagObject.py
index 7d4c093..2d24cc6 100644
--- a/luci/lib/ClusterConf/TagObject.py
+++ b/luci/lib/ClusterConf/TagObject.py
@@ -14,6 +14,7 @@ class TagObject(object):
self.TAG_NAME = tagname
self.comments = list()
self.trailing_comments = list()
+ self.element_text = None
def addChild(self, child):
self.children.append(child)
@@ -115,6 +116,9 @@ class TagObject(object):
for c in self.trailing_comments:
tag.appendChild(doc.createComment(c))
+ if self.element_text:
+ tag.appendChild(doc.createTextNode(self.element_text))
+
def getAttributes(self):
return self.attr_hash
13 years, 6 months
[luci] Big cleanup of the cluster model class
by Ryan McCabe
commit 01c335417a1bafb35a30093f9016b5ace3f7dc0d
Author: Ryan McCabe <rmccabe(a)redhat.com>
Date: Sun Oct 24 01:26:54 2010 -0400
Big cleanup of the cluster model class
- Add support for retaining <!-- comments -->
- Make sure the order of resources in services stays the same after resolving refs
- Don't set the defaults for the totem, dlm, gfs_controld, and fence_daemon tags explicitly (unless a user specifies them)
luci/lib/ClusterConf/Action.py | 42 +++
luci/lib/ClusterConf/ClusterNode.py | 5 +-
luci/lib/ClusterConf/Cman.py | 1 -
luci/lib/ClusterConf/DLM.py | 1 -
luci/lib/ClusterConf/Device.py | 10 +-
luci/lib/ClusterConf/Event.py | 48 +++
luci/lib/ClusterConf/Events.py | 15 +
luci/lib/ClusterConf/FenceDaemon.py | 1 -
luci/lib/ClusterConf/FenceDevice.py | 13 +-
luci/lib/ClusterConf/GFSControld.py | 1 -
luci/lib/ClusterConf/LoggingDaemon.py | 9 +
luci/lib/ClusterConf/ModelBuilder.py | 587 ++++++++++++++++-----------------
luci/lib/ClusterConf/TagObject.py | 18 +-
luci/lib/ClusterConf/Totem.py | 1 -
14 files changed, 434 insertions(+), 318 deletions(-)
---
diff --git a/luci/lib/ClusterConf/Action.py b/luci/lib/ClusterConf/Action.py
new file mode 100644
index 0000000..a27d69c
--- /dev/null
+++ b/luci/lib/ClusterConf/Action.py
@@ -0,0 +1,42 @@
+# Copyright (C) 2010 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.
+
+from TagObject import TagObject
+
+TAG_NAME = "action"
+
+class Action(TagObject):
+ def __init__(self):
+ TagObject.__init__(self)
+ self.TAG_NAME = TAG_NAME
+
+ def getDepth(self):
+ return self.getAttribute('depth')
+
+ def setDepth(self, val):
+ return self.addAttribute('depth', val)
+
+ def delDepth(self):
+ return self.removeAttribute('depth')
+
+ def getInterval(self):
+ return self.getAttribute('interval')
+
+ def setInterval(self, val):
+ return self.addIntegerAttribute('interval', val, (0, None))
+
+ def delInterval(self):
+ return self.removeAttribute('interval')
+
+ def getTimeout(self):
+ return self.getAttribute('timeout')
+
+ def setTimeout(self, val):
+ return self.addIntegerAttribute('timeout', val, (0, None))
+
+ def delTimeout(self):
+ return self.removeAttribute('timeout')
diff --git a/luci/lib/ClusterConf/ClusterNode.py b/luci/lib/ClusterConf/ClusterNode.py
index 7949373..2929ddc 100644
--- a/luci/lib/ClusterConf/ClusterNode.py
+++ b/luci/lib/ClusterConf/ClusterNode.py
@@ -26,9 +26,8 @@ class ClusterNode(TagObject):
self.addChild(ret)
return ret
- def getFenceLevels(self):
- # This method returns the set of 'method' objs. 'method' blocks represent
- # fence levels
+ def getFenceMethods(self):
+ # This method returns the set of 'method' objs.
return self.getFenceNode().getChildren()
def getVotes(self):
diff --git a/luci/lib/ClusterConf/Cman.py b/luci/lib/ClusterConf/Cman.py
index 00e9740..2f66a19 100644
--- a/luci/lib/ClusterConf/Cman.py
+++ b/luci/lib/ClusterConf/Cman.py
@@ -13,7 +13,6 @@ class Cman(TagObject):
def __init__(self):
TagObject.__init__(self)
self.TAG_NAME = TAG_NAME
- self.DEFAULTS = {}
def setBroadcast(self, val):
return self.addBinaryAttribute('broadcast', val, (None, 'yes'))
diff --git a/luci/lib/ClusterConf/DLM.py b/luci/lib/ClusterConf/DLM.py
index b4d64d3..ab875af 100644
--- a/luci/lib/ClusterConf/DLM.py
+++ b/luci/lib/ClusterConf/DLM.py
@@ -29,7 +29,6 @@ class DLM(TagObject):
def __init__(self):
TagObject.__init__(self)
self.TAG_NAME = TAG_NAME
- self.attr_hash.update(DLM.DEFAULTS)
def getLogDebug(self):
return self.getBinaryAttribute('log_debug')
diff --git a/luci/lib/ClusterConf/Device.py b/luci/lib/ClusterConf/Device.py
index 9f92f62..a991318 100644
--- a/luci/lib/ClusterConf/Device.py
+++ b/luci/lib/ClusterConf/Device.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2006-2009 Red Hat, Inc.
+# Copyright (C) 2006-2010 Red Hat, Inc.
#
# This program is free software; you can redistribute
# it and/or modify it under the terms of version 2 of the
@@ -17,7 +17,6 @@ class Device(TagObject):
self.TAG_NAME = TAG_NAME
self.agent_type = ""
self.has_native_option_set = False
- self.pretty_fence_names = FenceDeviceAttr.FENCE_OPTS
def getAgentType(self):
return self.agent_type
@@ -34,12 +33,11 @@ class Device(TagObject):
def addAttribute(self, name, value):
if name == OPTION:
self.has_native_option_set = True
- self.attr_hash[name] = value
+ return super(Device, self).addAttribute(name, value)
def clone(self):
"""Creates a shallow copy of itself."""
- ret = TagObject.clone(self)
- ret.agent_type = self.agent_type
+ ret = super(Device, self).clone()
+ ret.setAgentType(self.getAgentType())
ret.has_native_option_set = self.has_native_option_set
- ret.pretty_fence_names = self.pretty_fence_names
return ret
diff --git a/luci/lib/ClusterConf/Event.py b/luci/lib/ClusterConf/Event.py
new file mode 100644
index 0000000..82c52b0
--- /dev/null
+++ b/luci/lib/ClusterConf/Event.py
@@ -0,0 +1,48 @@
+# Copyright (C) 2010 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.
+
+from TagObject import TagObject
+
+TAG_NAME = "event"
+
+class Event(TagObject):
+ def __init__(self):
+ TagObject.__init__(self)
+ self.TAG_NAME = TAG_NAME
+
+ def getFile(self):
+ return self.getAttribute('file')
+
+ def getPriority(self):
+ return self.getAttribute('priority')
+
+ def getClass(self):
+ return self.getAttribute('class')
+
+ def getService(self):
+ return self.getAttribute('service')
+
+ def getServiceState(self):
+ return self.getAttribute('service_state')
+
+ def getServiceOwner(self):
+ return self.getAttribute('service_owner')
+
+ def getNode(self):
+ return self.getAttribute('node')
+
+ def getNodeID(self):
+ return self.getAttribute('node_id')
+
+ def getNodeState(self):
+ return self.getBinaryAttribute('node_state')
+
+ def getNodeClean(self):
+ return self.getBinaryAttribute('node_clean')
+
+ def getNodeLocal(self):
+ return self.getBinaryAttribute('node_local')
diff --git a/luci/lib/ClusterConf/Events.py b/luci/lib/ClusterConf/Events.py
new file mode 100644
index 0000000..2f78bdc
--- /dev/null
+++ b/luci/lib/ClusterConf/Events.py
@@ -0,0 +1,15 @@
+# Copyright (C) 2010 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.
+
+from TagObject import TagObject
+
+TAG_NAME = "events"
+
+class Events(TagObject):
+ def __init__(self):
+ TagObject.__init__(self)
+ self.TAG_NAME = TAG_NAME
diff --git a/luci/lib/ClusterConf/FenceDaemon.py b/luci/lib/ClusterConf/FenceDaemon.py
index 4a8d7af..bd665a1 100644
--- a/luci/lib/ClusterConf/FenceDaemon.py
+++ b/luci/lib/ClusterConf/FenceDaemon.py
@@ -19,7 +19,6 @@ class FenceDaemon(TagObject):
def __init__(self):
TagObject.__init__(self)
self.TAG_NAME = TAG_NAME
- self.attr_hash.update(FenceDaemon.DEFAULTS)
def getPostJoinDelay(self):
return self.getAttribute('post_join_delay')
diff --git a/luci/lib/ClusterConf/FenceDevice.py b/luci/lib/ClusterConf/FenceDevice.py
index 2c01672..3a90403 100644
--- a/luci/lib/ClusterConf/FenceDevice.py
+++ b/luci/lib/ClusterConf/FenceDevice.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2006-2009 Red Hat, Inc.
+# Copyright (C) 2006-2010 Red Hat, Inc.
#
# This program is free software; you can redistribute
# it and/or modify it under the terms of version 2 of the
@@ -10,16 +10,13 @@ from TagObject import TagObject
TAG_NAME = "fencedevice"
-
class FenceDevice(TagObject):
def __init__(self):
TagObject.__init__(self)
self.TAG_NAME = TAG_NAME
- self.pretty_fence_names = FenceDeviceAttr.FENCE_OPTS
- self.shared_fences = FenceDeviceAttr.FENCE_SHARED
def getAgentType(self):
- agent = self.attr_hash["agent"]
+ agent = self.attr_hash.get('agent')
try:
return agent[agent.rfind('/') + 1:]
except:
@@ -28,9 +25,9 @@ class FenceDevice(TagObject):
def getPrettyName(self):
agent_type = self.getAgentType()
- pname = self.pretty_fence_names.get(agent_type)
+ pname = FenceDeviceAttr.FENCE_OPTS.get(agent_type)
if pname is None:
- pname = agent_type
+ return agent_type
return pname
def isShared(self):
@@ -41,4 +38,4 @@ class FenceDevice(TagObject):
return False
else:
return True
- return self.shared_fences.has_key(agent)
+ return FenceDeviceAttr.FENCE_SHARED.has_key(agent)
diff --git a/luci/lib/ClusterConf/GFSControld.py b/luci/lib/ClusterConf/GFSControld.py
index 297a7e6..0429e6d 100644
--- a/luci/lib/ClusterConf/GFSControld.py
+++ b/luci/lib/ClusterConf/GFSControld.py
@@ -24,7 +24,6 @@ class GFSControld(TagObject):
def __init__(self):
TagObject.__init__(self)
self.TAG_NAME = TAG_NAME
- self.attr_hash.update(GFSControld.DEFAULTS)
def getEnableWithdraw(self):
return self.getBinaryAttribute('enable_withdraw')
diff --git a/luci/lib/ClusterConf/LoggingDaemon.py b/luci/lib/ClusterConf/LoggingDaemon.py
index d886bc6..86bac98 100644
--- a/luci/lib/ClusterConf/LoggingDaemon.py
+++ b/luci/lib/ClusterConf/LoggingDaemon.py
@@ -13,3 +13,12 @@ class LoggingDaemon(Logging):
def __init__(self):
Logging.__init__(self)
self.TAG_NAME = TAG_NAME
+
+ def getSubsys(self):
+ return self.getAttribute('subsys')
+
+ def setSubsys(self, val):
+ return self.addAttribute('subsys', val)
+
+ def delSubsys(self):
+ return self.removeAttribute('subsys')
diff --git a/luci/lib/ClusterConf/ModelBuilder.py b/luci/lib/ClusterConf/ModelBuilder.py
index 463010b..ffa6497 100644
--- a/luci/lib/ClusterConf/ModelBuilder.py
+++ b/luci/lib/ClusterConf/ModelBuilder.py
@@ -7,163 +7,159 @@
from xml.dom import minidom, Node
from TagObject import TagObject
-from Cluster import Cluster
-from ClusterNode import ClusterNode
-from ClusterNodes import ClusterNodes
-from Fence import Fence
-from Unfence import Unfence
-from FenceDevice import FenceDevice
-from FenceDevices import FenceDevices
-from Method import Method
-from Device import Device
-from Cman import Cman
-from Totem import Totem
-from DLM import DLM
-from Lockspace import Lockspace
-from GFSControld import GFSControld
-from Interface import Interface
-from Clvmd import Clvmd
-from Group import Group
-from Master import Master
-from Ip import Ip
-from Script import Script
-from Logging import Logging
-from LoggingDaemon import LoggingDaemon
-from NFSClient import NFSClient
-from NFSExport import NFSExport
-from NFSServer import NFSServer
-from Fs import Fs
-from Samba import Samba
-from Apache import Apache
-from Named import Named
-from DRBD import DRBD
-from LVM import LVM
-from MySQL import MySQL
-from OpenLDAP import OpenLDAP
-from Postgres8 import Postgres8
-from Tomcat5 import Tomcat5
-from Tomcat6 import Tomcat6
-from SAPDatabase import SAPDatabase
-from SAPInstance import SAPInstance
-from SybaseASE import SybaseASE
-from OracleDB import OracleDB
-from Multicast import Multicast
-from FenceDaemon import FenceDaemon
-from FenceXVMd import FenceXVMd
-from Netfs import Netfs
-from Clusterfs import Clusterfs
-from Resources import Resources
-from Service import Service
-from QuorumD import QuorumD
-from Heuristic import Heuristic
-from Vm import Vm
from RefObject import RefObject
-from FailoverDomain import FailoverDomain
-from FailoverDomains import FailoverDomains
-from FailoverDomainNode import FailoverDomainNode
-from Rm import Rm
-from Altname import Altname
+
+import Cluster
+
+# Children of <cluster>
+import Cman, Totem, QuorumD, FenceDaemon, FenceXVMd, DLM, GFSControld, \
+ Group, Logging, ClusterNodes, FenceDevices, Rm, Clvmd
+
+# Children of <cman>
+import Multicast
+
+# Children of <totem>
+import Interface
+
+# Children of <quorumd>
+import Heuristic
+
+# Children of <dlm>
+import Lockspace
+
+# Children of <lockspace>
+import Master
+
+# Children of <logging>
+import LoggingDaemon
+
+# Children of <clusternodes>
+import ClusterNode
+
+# Children of <clusternode>
+import Altname, Fence, Unfence
+
+# Children of <fence>
+import Method
+
+# Children of <method>
+import Device
+
+# Children of <fencedevices>
+import FenceDevice
+
+# Children of <rm>
+import FailoverDomains, Events, Resources, Service, Vm
+
+# Children of <failoverdomains>
+import FailoverDomain
+
+# Children of <failoverdomain>
+import FailoverDomainNode
+
+# Children of <events>
+import Event
+
+# Children of <resources> and <service>
+import Ip, Script, NFSClient, NFSExport, NFSServer, Fs, Samba, Apache, Named, \
+ DRBD, LVM, MySQL, OpenLDAP, Postgres8, Tomcat5, Tomcat6, \
+ SAPDatabase, SAPInstance, SybaseASE, OracleDB, Netfs, Clusterfs
+
+# Children of resource types
+import Action
TAGNAMES = {
- 'cluster': Cluster,
- 'clusternodes': ClusterNodes,
- 'clusternode': ClusterNode,
- 'altname': Altname,
- 'fence': Fence,
- 'device': Device,
- 'unfence': Unfence,
- 'logging': Logging,
- 'logging_daemon': LoggingDaemon,
- 'fencedevice': FenceDevice,
- 'fencedevices': FenceDevices,
- 'method': Method,
- 'cman': Cman,
- 'totem': Totem,
- 'interface': Interface,
- 'group': Group,
- 'clvmd': Clvmd,
- 'gfs_controld': GFSControld,
- 'dlm': DLM,
- 'lockspace': Lockspace,
- 'master': Master,
- 'rm': Rm,
- 'service': Service,
- 'vm': Vm,
- 'fence_xvmd': FenceXVMd,
- 'resources': Resources,
- 'failoverdomain': FailoverDomain,
- 'failoverdomains': FailoverDomains,
- 'failoverdomainnode': FailoverDomainNode,
- 'quorumd': QuorumD,
- 'heuristic': Heuristic,
- 'ip': Ip,
- 'fs': Fs,
- 'smb': Samba,
- 'apache': Apache,
- 'named': Named,
- 'drbd': DRBD,
- 'lvm': LVM,
- 'mysql': MySQL,
- 'openldap': OpenLDAP,
- 'postgres-8': Postgres8,
- 'tomcat-5': Tomcat5,
- 'tomcat-6': Tomcat6,
- 'fence_daemon': FenceDaemon,
- 'multicast': Multicast,
- 'clusterfs': Clusterfs,
- 'netfs': Netfs,
- 'script': Script,
- 'nfsexport': NFSExport,
- 'nfsclient': NFSClient,
- 'nfsserver': NFSServer,
- 'SAPDatabase': SAPDatabase,
- 'SAPInstance': SAPInstance,
- 'ASEHAagent': SybaseASE,
- 'oracledb': OracleDB,
+ Cluster.TAG_NAME: Cluster.Cluster,
+ Totem.TAG_NAME: Totem.Totem,
+ Interface.TAG_NAME: Interface.Interface,
+ Cman.TAG_NAME: Cman.Cman,
+ Multicast.TAG_NAME: Multicast.Multicast,
+ Group.TAG_NAME: Group.Group,
+ Clvmd.TAG_NAME: Clvmd.Clvmd,
+ GFSControld.TAG_NAME: GFSControld.GFSControld,
+ DLM.TAG_NAME: DLM.DLM,
+ Lockspace.TAG_NAME: Lockspace.Lockspace,
+ Master.TAG_NAME: Master.Master,
+ ClusterNodes.TAG_NAME: ClusterNodes.ClusterNodes,
+ ClusterNode.TAG_NAME: ClusterNode.ClusterNode,
+ Altname.TAG_NAME: Altname.Altname,
+ Method.TAG_NAME: Method.Method,
+ Fence.TAG_NAME: Fence.Fence,
+ Device.TAG_NAME: Device.Device,
+ Unfence.TAG_NAME: Unfence.Unfence,
+ FenceDaemon.TAG_NAME: FenceDaemon.FenceDaemon,
+ Logging.TAG_NAME: Logging.Logging,
+ LoggingDaemon.TAG_NAME: LoggingDaemon.LoggingDaemon,
+ FenceDevice.TAG_NAME: FenceDevice.FenceDevice,
+ FenceDevices.TAG_NAME: FenceDevices.FenceDevices,
+ FenceXVMd.TAG_NAME: FenceXVMd.FenceXVMd,
+ FailoverDomains.TAG_NAME: FailoverDomains.FailoverDomains,
+ FailoverDomain.TAG_NAME: FailoverDomain.FailoverDomain,
+ FailoverDomainNode.TAG_NAME: FailoverDomainNode.FailoverDomainNode,
+ Events.TAG_NAME: Events.Events,
+ Event.TAG_NAME: Event.Event,
+ QuorumD.TAG_NAME: QuorumD.QuorumD,
+ Heuristic.TAG_NAME: Heuristic.Heuristic,
+ Rm.TAG_NAME: Rm.Rm,
+ Service.TAG_NAME: Service.Service,
+ Vm.TAG_NAME: Vm.Vm,
+ Resources.TAG_NAME: Resources.Resources,
+ Ip.TAG_NAME: Ip.Ip,
+ Fs.TAG_NAME: Fs.Fs,
+ Samba.TAG_NAME: Samba.Samba,
+ Apache.TAG_NAME: Apache.Apache,
+ Named.TAG_NAME: Named.Named,
+ DRBD.TAG_NAME: DRBD.DRBD,
+ LVM.TAG_NAME: LVM.LVM,
+ MySQL.TAG_NAME: MySQL.MySQL,
+ OpenLDAP.TAG_NAME: OpenLDAP.OpenLDAP,
+ Postgres8.TAG_NAME: Postgres8.Postgres8,
+ Tomcat5.TAG_NAME: Tomcat5.Tomcat5,
+ Tomcat6.TAG_NAME: Tomcat6.Tomcat6,
+ Clusterfs.TAG_NAME: Clusterfs.Clusterfs,
+ Netfs.TAG_NAME: Netfs.Netfs,
+ Script.TAG_NAME: Script.Script,
+ NFSExport.TAG_NAME: NFSExport.NFSExport,
+ NFSClient.TAG_NAME: NFSClient.NFSClient,
+ NFSServer.TAG_NAME: NFSServer.NFSServer,
+ SAPDatabase.TAG_NAME: SAPDatabase.SAPDatabase,
+ SAPInstance.TAG_NAME: SAPInstance.SAPInstance,
+ SybaseASE.TAG_NAME: SybaseASE.SybaseASE,
+ OracleDB.TAG_NAME: OracleDB.OracleDB,
+ Action.TAG_NAME: Action.Action,
}
-###---Don't translate strings below---
-CLUSTER_PTR_STR = "cluster"
-CLUSTERNODES_PTR_STR = "clusternodes"
-FAILDOMS_PTR_STR = "failoverdomains"
-FENCEDEVICES_PTR_STR = "fencedevices"
-RESOURCEMANAGER_PTR_STR = "rm"
-RESOURCES_PTR_STR = "resources"
-FENCEDAEMON_PTR_STR = "fence_daemon"
-SERVICE = "service"
-VM = "vm"
-FENCE_XVMD_STR = "fence_xvmd"
-MCAST_STR = "multicast"
-CMAN_PTR_STR = "cman"
-TOTEM_PTR_STR = "totem"
-QUORUMD_PTR_STR = "quorumd"
-###-----------------------------------
-
class ModelBuilder:
- def __init__(self, domm=None, cluster_version=(3, 'Fedora')):
- if domm is None:
+ def __init__(self, conf_xml_obj, cluster_version=(3, 'Fedora')):
+ if conf_xml_obj is None:
raise Exception, 'No cluster configuration'
-
self.errors = False
self.errmsg = None
- self.mcast_ptr = None
+ self.isModified = False
+
self.cluster_ptr = None
- self.CMAN_ptr = None
- self.TOTEM_ptr = None
+ self.cman_ptr = None
+ self.totem_ptr = None
self.logging_ptr = None
+ self.group_ptr = None
+ self.clvmd_ptr = None
self.clusternodes_ptr = None
self.failoverdomains_ptr = None
self.fencedevices_ptr = None
self.resourcemanager_ptr = None
- self.resources_ptr = None
self.fence_daemon_ptr = None
- self.isModified = False
self.quorumd_ptr = None
self.fence_xvmd_ptr = None
- self.unusual_items = list()
+ self.dlm_ptr = None
+ self.gfscontrold_ptr = None
+ self.events_ptr = None
+ self.resources_ptr = None
+ self.mcast_ptr = None
+ self.lockspace_ptr = None
+ self.unknown_elements = list()
(self.cluster_version, self.cluster_os) = cluster_version
- self.parent = domm
+ self.parent = conf_xml_obj
self.object_tree = self.buildModel(None)
self.check_empty_ptrs()
self.check_fence_daemon()
@@ -188,70 +184,96 @@ class ModelBuilder:
if parent_node is None:
parent_node = self.parent
+ comment_nodes = []
new_object = None
+
if parent_node.nodeType == Node.DOCUMENT_NODE:
- parent_node = parent_node.firstChild
+ for n in parent_node.childNodes:
+ if n.nodeType == Node.ELEMENT_NODE:
+ parent_node = n
+ elif n.nodeType == Node.COMMENT_NODE:
+ comment_nodes.append(n)
if parent_node.nodeType == Node.ELEMENT_NODE:
- #Create proper type
+ unknown_element = False
try:
+ # Create proper type
new_object = TAGNAMES[parent_node.nodeName]()
- attrs = parent_node.attributes
- for attrName in attrs.keys():
- attrNode = attrs.get(attrName)
- attrValue = attrNode.nodeValue
- new_object.addAttribute(attrName, attrValue)
- except KeyError, e: ##This allows for custom tags
+ except KeyError, e:
+ # This allows for custom tags
new_object = TagObject(parent_node.nodeName)
- attrs = parent_node.attributes
- for attrName in attrs.keys():
- attrNode = attrs.get(attrName)
- attrValue = attrNode.nodeValue
- new_object.addAttribute(attrName, attrValue)
- self.unusual_items.append((parent_object, new_object))
+ unknown_element = True
+
+ new_object.comments = [c.data for c in comment_nodes]
+
+ for k, v in parent_node.attributes.items():
+ new_object.addAttribute(k, v)
+
+ if unknown_element is True:
+ self.unknown_elements.append((parent_object, new_object))
for item in parent_node.childNodes:
result_object = self.buildModel(item, new_object)
if result_object is not None:
new_object.addChild(result_object)
return None
- ######End of unusual item exception
-
- if parent_node.nodeName == CLUSTER_PTR_STR:
+ if parent_node.nodeName == Cluster.TAG_NAME:
self.cluster_ptr = new_object
- if parent_node.nodeName == CLUSTERNODES_PTR_STR:
+ elif parent_node.nodeName == Cman.TAG_NAME:
+ self.cman_ptr = new_object
+ elif parent_node.nodeName == Totem.TAG_NAME:
+ self.totem_ptr = new_object
+ elif parent_node.nodeName == QuorumD.TAG_NAME:
+ self.quorumd_ptr = new_object
+ elif parent_node.nodeName == FenceDaemon.TAG_NAME:
+ self.fence_daemon_ptr = new_object
+ elif parent_node.nodeName == FenceXVMd.TAG_NAME:
+ self.fence_xvmd_ptr = new_object
+ elif parent_node.nodeName == DLM.TAG_NAME:
+ self.dlm_ptr = new_object
+ elif parent_node.nodeName == GFSControld.TAG_NAME:
+ self.gfscontrold_ptr = new_object
+ elif parent_node.nodeName == Group.TAG_NAME:
+ self.group_ptr = new_object
+ elif parent_node.nodeName == Logging.TAG_NAME:
+ self.logging_ptr = new_object
+ elif parent_node.nodeName == ClusterNodes.TAG_NAME:
self.clusternodes_ptr = new_object
- elif parent_node.nodeName == FENCEDEVICES_PTR_STR:
+ elif parent_node.nodeName == Rm.TAG_NAME:
+ self.resourcemanager_ptr = new_object
+ elif parent_node.nodeName == Clvmd.TAG_NAME:
+ self.clvmd_ptr = new_object
+ elif parent_node.nodeName == FenceDevices.TAG_NAME:
self.fencedevices_ptr = new_object
- elif parent_node.nodeName == FAILDOMS_PTR_STR:
+ elif parent_node.nodeName == FailoverDomains.TAG_NAME:
self.failoverdomains_ptr = new_object
- elif parent_node.nodeName == RESOURCEMANAGER_PTR_STR:
- self.resourcemanager_ptr = new_object
- elif parent_node.nodeName == RESOURCES_PTR_STR:
+ elif parent_node.nodeName == Resources.TAG_NAME:
self.resources_ptr = new_object
- elif parent_node.nodeName == FENCEDAEMON_PTR_STR:
- self.fence_daemon_ptr = new_object
- elif parent_node.nodeName == QUORUMD_PTR_STR:
- self.quorumd_ptr = new_object
- elif parent_node.nodeName == CMAN_PTR_STR:
- self.CMAN_ptr = new_object
- elif parent_node.nodeName == TOTEM_PTR_STR:
- self.TOTEM_ptr = new_object
- elif parent_node.nodeName == MCAST_STR:
+ elif parent_node.nodeName == Multicast.TAG_NAME:
self.mcast_ptr = new_object
- elif parent_node.nodeName == FENCE_XVMD_STR:
- self.fence_xvmd_ptr = new_object
-
+ elif parent_node.nodeName == Lockspace.TAG_NAME:
+ self.lockspace_ptr = new_object
+ elif parent_node.nodeName == Events.TAG_NAME:
+ self.events_ptr = new_object
else:
+ if parent_node.nodeType == Node.COMMENT_NODE:
+ return parent_node
return None
-
+ pending_comments = []
for item in parent_node.childNodes:
result_object = self.buildModel(item, new_object)
if result_object is not None:
- new_object.addChild(result_object)
+ if not issubclass(type(result_object), TagObject):
+ pending_comments.append(result_object.data)
+ else:
+ result_object.comments = pending_comments
+ new_object.addChild(result_object)
+ pending_comments = []
- return (new_object)
+ if len(pending_comments) > 0:
+ new_object.trailing_comments = pending_comments
+ return new_object
def getFenceDeviceByName(self, name):
device = filter(lambda x: x.getName() == name, self.getFenceDevices())
@@ -280,8 +302,8 @@ class ModelBuilder:
self.errors = True
for node in self.getNodes():
- for level in node.getFenceLevels():
- for child in level.getChildren():
+ for method in node.getFenceMethods():
+ for child in method.getChildren():
try:
child.setAgentType(agent_hash[child.getName()])
except KeyError, e:
@@ -298,25 +320,21 @@ class ModelBuilder:
reset_list_sentinel = False
resource_children = self.resourcemanager_ptr.getChildren()
for r_child in resource_children:
- if r_child.getTagName() == SERVICE:
+ if r_child.getTagName() == Service.TAG_NAME:
reset_list_sentinel = self.find_references(r_child)
if reset_list_sentinel is True:
break
def find_references(self, entity, parent=None):
- result = False
- if (entity.getAttribute("ref") is not None) and (entity.isRefObject() is False):
- result = self.transform_reference(entity, parent)
- return result
+ if entity.getAttribute("ref") is not None and entity.isRefObject() is False:
+ result = self.transform_reference(entity, parent)
+ return result
- children = entity.getChildren()
- if len(children) > 0:
- for child in children:
+ for child in entity.getChildren():
result = self.find_references(child, entity)
if result is True:
return result
-
- return result
+ return False
def transform_reference(self, entity, parent):
result = False
@@ -355,12 +373,10 @@ class ModelBuilder:
pass
if parent is None: #Must be a service
- self.resourcemanager_ptr.addChild(rf)
- self.resourcemanager_ptr.removeChild(entity)
+ self.resourcemanager_ptr.replaceChild(entity, rf)
return True
else:
- parent.addChild(rf)
- parent.removeChild(entity)
+ parent.replaceChild(entity, rf)
return True
def exportModelAsString(self):
@@ -369,7 +385,7 @@ class ModelBuilder:
#check for dual power fences
self.dual_power_fence_check()
- self.restore_unusual_items()
+ self.restore_unknown_elements()
try:
doc = minidom.Document()
@@ -387,36 +403,25 @@ class ModelBuilder:
self.resolve_fence_instance_types()
self.purgePCDuplicates()
self.resolve_references()
-
- finally:
- pass
- #dual_power_fence_check() adds extra
- #fence instance entries for dual power controllers
- #These must be removed from the tree before the UI
- #can be used
- #self.purgePCDuplicates()
+ except Exception, e:
+ strbuf = ""
return strbuf
- def restore_unusual_items(self):
- for item in self.unusual_items:
+ def restore_unknown_elements(self):
+ for item in self.unknown_elements:
duplicate = False
- kids = item[0].getChildren()
- for kid in kids:
+ for kid in item[0].getChildren():
if kid == item[1]:
duplicate = True
break
- if duplicate is True:
- continue
- else:
+ if duplicate is not True:
item[0].addChild(item[1])
def check_for_nodeids(self):
- nodes = self.getNodes()
- for node in nodes:
- if node.getAttribute('nodeid') is None:
- new_id = self.getUniqueNodeID()
- node.addAttribute('nodeid', new_id)
+ for node in self.getNodes():
+ if node.getNodeID() is None:
+ node.setNodeID(self.getUniqueNodeID())
def getUniqueNodeID(self):
nodes = self.getNodes()
@@ -450,15 +455,17 @@ class ModelBuilder:
def getNodeNameById(self, node_id):
try:
- return filter(lambda x: x.getAttribute('nodeid') == node_id, self.clusternodes_ptr.getChildren())[0].getName()
+ return filter(lambda x: x.getNodeID() == node_id, self.clusternodes_ptr.getChildren())[0].getName()
except:
- return None
+ pass
+ return None
def getNodeByName(self, node_name):
try:
- return filter(lambda x: x.getAttribute('name') == node_name, self.clusternodes_ptr.getChildren())[0]
+ return filter(lambda x: x.getName() == node_name, self.clusternodes_ptr.getChildren())[0]
except:
- return None
+ pass
+ return None
def addNode(self, clusternode):
self.clusternodes_ptr.addChild(clusternode)
@@ -471,8 +478,8 @@ class ModelBuilder:
name = clusternode.getName()
- for level in clusternode.getFenceLevels():
- for fence in level.getChildren():
+ for method in clusternode.getFenceMethods():
+ for fence in method.getChildren():
fdev = self.getFenceDeviceByName(fence.getName())
if fdev and not fdev.isShared():
self.deleteFenceDevice(fdev)
@@ -511,7 +518,7 @@ class ModelBuilder:
return None
def getServicesForFdom(self, name):
- svc_list = filter(lambda x: x.getAttribute('domain') == name, self.getServices())
+ svc_list = filter(lambda x: x.getFailoverDomain() == name, self.getServices())
return svc_list
def retrieveVMsByName(self, name):
@@ -522,16 +529,16 @@ class ModelBuilder:
return None
def del_totem(self):
- if self.TOTEM_ptr is not None:
- self.cluster_ptr.removeChild(self.TOTEM_ptr)
- self.TOTEM_ptr = None
+ if self.totem_ptr is not None:
+ self.cluster_ptr.removeChild(self.totem_ptr)
+ self.totem_ptr = None
def addTotem(self):
self.del_totem()
- if self.TOTEM_ptr is None:
- self.TOTEM_ptr = Totem()
- self.cluster_ptr.addChild(self.TOTEM_ptr)
- return self.TOTEM_ptr
+ if self.totem_ptr is None:
+ self.totem_ptr = Totem.Totem()
+ self.cluster_ptr.addChild(self.totem_ptr)
+ return self.totem_ptr
def hasFenceXVM(self):
return self.fence_xvmd_ptr is not None
@@ -570,8 +577,8 @@ class ModelBuilder:
nodes = self.getNodes()
for i in nodes:
added_node = False
- levels = i.getFenceLevels()
- for l in levels:
+ methods = i.getFenceMethods()
+ for l in methods:
lc = l.getChildren()
for dev in lc:
if dev.getName() == fence_name:
@@ -621,18 +628,12 @@ class ModelBuilder:
for fdom in fdoms:
if fdom.getName().encode('ascii', 'ignore') == fd:
kids = fdom.getChildren()
- newnode = FailoverDomainNode()
+ newnode = FailoverDomainNode.FailoverDomainNode()
if len(kids) != 0: #Use an existing node as a baseline...
- attrs = kids[0].getAttributes()
- kees = attrs.keys()
- for k in kees:
- newnode.addAttribute(k, attrs[k])
- newnode.addAttribute("name", node)
- else:
- newnode.addAttribute("name", node)
+ newnode.attr_hash.update(kids[0].getAttributes())
+ newnode.setName(node)
fdom.addChild(newnode)
return
-
return
def removeNodeFromFailoverDomain(self, node, fd):
@@ -683,27 +684,27 @@ class ModelBuilder:
def check_empty_ptrs(self):
if self.resourcemanager_ptr is None:
- rm = Rm()
+ rm = Rm.Rm()
self.cluster_ptr.addChild(rm)
self.resourcemanager_ptr = rm
if self.failoverdomains_ptr is None:
- fdoms = FailoverDomains()
+ fdoms = FailoverDomains.FailoverDomains()
self.resourcemanager_ptr.addChild(fdoms)
self.failoverdomains_ptr = fdoms
if self.fencedevices_ptr is None:
- fds = FenceDevices()
+ fds = FenceDevices.FenceDevices()
self.cluster_ptr.addChild(fds)
self.fencedevices_ptr = fds
if self.resources_ptr is None:
- rcs = Resources()
+ rcs = Resources.Resources()
self.resourcemanager_ptr.addChild(rcs)
self.resources_ptr = rcs
if self.fence_daemon_ptr is None:
- fdp = FenceDaemon()
+ fdp = FenceDaemon.FenceDaemon()
self.cluster_ptr.addChild(fdp)
self.fence_daemon_ptr = fdp
@@ -712,7 +713,7 @@ class ModelBuilder:
if self.resourcemanager_ptr is not None:
kids = self.resourcemanager_ptr.getChildren()
for kid in kids:
- if kid.getTagName() in (SERVICE, VM):
+ if kid.getTagName() in (Service.TAG_NAME, Vm.TAG_NAME):
rg_list.append(kid)
return rg_list
@@ -730,7 +731,7 @@ class ModelBuilder:
if self.resourcemanager_ptr is not None:
kids = self.resourcemanager_ptr.getChildren()
for kid in kids:
- if kid.getTagName() == VM:
+ if kid.getTagName() == Vm.TAG_NAME:
rg_list.append(kid)
return rg_list
@@ -794,10 +795,10 @@ class ModelBuilder:
return self.getClusterPtr().setConfigVersion(version)
def getCMANPtr(self):
- return self.CMAN_ptr
+ return self.cman_ptr
def getTotemPtr(self):
- return self.TOTEM_ptr
+ return self.totem_ptr
def getLoggingPtr(self):
return self.logging_ptr
@@ -805,40 +806,40 @@ class ModelBuilder:
def set_cluster_broadcast(self):
if self.del_cluster_multicast() is False:
return False
- return self.CMAN_ptr.setBroadcast(True)
+ return self.cman_ptr.setBroadcast(True)
def del_cluster_broadcast(self):
- if self.CMAN_ptr is None:
+ if self.cman_ptr is None:
return False
- self.CMAN_ptr.removeAttribute('broadcast')
+ self.cman_ptr.delBroadcast()
self.isModified = True
def get_cluster_broadcast(self):
- if self.CMAN_ptr is None:
+ if self.cman_ptr is None:
return False
- return self.CMAN_ptr.getBroadcast()
+ return self.cman_ptr.getBroadcast()
def set_cluster_multicast(self, mcast_addr=None):
self.del_cluster_broadcast()
if mcast_addr is not None:
if self.mcast_ptr is None:
- self.mcast_ptr = Multicast()
- self.CMAN_ptr.addChild(self.mcast_ptr)
+ self.mcast_ptr = Multicast.Multicast()
+ self.cman_ptr.addChild(self.mcast_ptr)
self.mcast_ptr.setAddr(mcast_addr)
def del_cluster_multicast(self):
- if self.CMAN_ptr is None:
+ if self.cman_ptr is None:
return True
if self.mcast_ptr is not None:
- self.CMAN_ptr.removeChild(self.mcast_ptr)
+ self.cman_ptr.removeChild(self.mcast_ptr)
self.mcast_ptr = None
self.isModified = True
return True
def check_fence_daemon(self):
if self.fence_daemon_ptr is None:
- self.fence_daemon_ptr = FenceDaemon()
+ self.fence_daemon_ptr = FenceDaemon.FenceDaemon()
self.cluster_ptr.addChild(self.fence_daemon_ptr)
def getFenceDaemonPtr(self):
@@ -859,43 +860,43 @@ class ModelBuilder:
children = fdom.getChildren() #These are failoverdomainnodes...
for child in children:
if child.getName().strip() == oldname:
- child.addAttribute("name", newname)
+ child.setName(newname)
###This method runs through ALL fences (Device objs) and changes name attr
###to new name
def rectifyNewFencedevicenameWithFences(self, oldname, newname):
nodes = self.getNodes()
for node in nodes:
- levels = node.getFenceLevels()
- for level in levels:
- fences = level.getChildren()
+ methods = node.getFenceMethods()
+ for method in methods:
+ fences = method.getChildren()
for fence in fences:
if fence.getName() == oldname:
- fence.addAttribute("name", newname)
+ fence.setName(newname)
###Method for removing fence instances if a fence device
###has been deleted from the configuration
def removeFenceInstancesForFenceDevice(self, name):
nodes = self.getNodes()
for node in nodes:
- levels = node.getFenceLevels()
- for level in levels:
- fences = level.getChildren()
+ methods = node.getFenceMethods()
+ for method in methods:
+ fences = method.getChildren()
kill_list = list()
for fence in fences:
if fence.getName() == name:
kill_list.append(fence)
for victim in kill_list:
- node.removeFenceInstance(level, victim)
+ node.removeFenceInstance(method, victim)
def removeReferences(self, tagobj):
self.__removeReferences(tagobj, self.cluster_ptr)
- def __removeReferences(self, tagobj, level):
- for t in level.getChildren()[:]:
+ def __removeReferences(self, tagobj, method):
+ for t in method.getChildren()[:]:
if t.isRefObject():
if t.getObj() == tagobj:
- level.removeChild(t)
+ method.removeChild(t)
continue
self.__removeReferences(tagobj, t)
@@ -924,8 +925,8 @@ class ModelBuilder:
def updateReferences(self):
self.__updateReferences(self.cluster_ptr)
- def __updateReferences(self, level):
- for t in level.getChildren():
+ def __updateReferences(self, method):
+ for t in method.getChildren():
if t.isRefObject():
t.setRef(t.getObj().getName())
self.__updateReferences(t)
@@ -938,52 +939,50 @@ class ModelBuilder:
clusternodes_count = len(self.getNodes())
# Make certain that there is a cman tag in the file
# If missing, it will not hurt to add it here
- if self.CMAN_ptr is None:
- cman = Cman()
+ if self.cman_ptr is None:
+ cman = Cman.Cman()
self.cluster_ptr.addChild(cman)
- self.CMAN_ptr = cman
+ self.cman_ptr = cman
if self.isQuorumd():
- self.CMAN_ptr.removeAttribute('two_node')
- self.CMAN_ptr.addAttribute('expected_votes', str(self.get_expected_votes()))
+ self.cman_ptr.delTwoNode()
+ self.cman_ptr.setExpectedVotes(self.get_expected_votes())
else:
if clusternodes_count == 2:
- self.CMAN_ptr.addAttribute('two_node', '1')
- self.CMAN_ptr.addAttribute('expected_votes', '1')
+ self.cman_ptr.setTwoNode(True)
+ self.cman_ptr.setExpectedVotes(1)
else:
- self.CMAN_ptr.removeAttribute('two_node')
- self.CMAN_ptr.removeAttribute('expected_votes')
+ self.cman_ptr.delTwoNode()
+ self.cman_ptr.delExpectedVotes()
def dual_power_fence_check(self):
- # if 2 or more power controllers reside in the same fence level,
+ # if 2 or more power controllers reside in the same fence method,
# duplicate entries must be made for every controller with an
# attribute for option set first for off, then for on.
# for every node:
- # for every fence level:
+ # for every fence method:
# examine every fence
- # If fence is of power type, add to 'found' list for that level
+ # If fence is of power type, add to 'found' list for that method
# If 'found' list is longer than 1, write out extra objs
for node in self.getNodes():
- for level in node.getFenceLevels():
+ for method in node.getFenceMethods():
pc_list = list()
- for kid in level.getChildren():
+ for kid in method.getChildren():
if kid.hasNativeOptionSet() is True:
continue
if kid.isPowerController() is True:
pc_list.append(kid)
if len(pc_list) > 1:
- # Means we found multiple PCs in the same level
+ # Means we found multiple PCs in the same method
for fence in pc_list:
fence.addAttribute("option", "off")
- d = Device()
+ d = Device.Device()
+ d.attr_hash.update(fence.getAttributes())
d.setAgentType(fence.getAgentType())
- attrs = fence.getAttributes()
- for (k, v) in attrs.iteritems():
- d.addAttribute(k, v)
d.addAttribute("option", "on")
- level.addChild(d)
+ method.addChild(d)
def purgePCDuplicates(self):
found_one = True
@@ -991,9 +990,9 @@ class ModelBuilder:
found_one = False
nodes = self.getNodes()
for node in nodes:
- levels = node.getFenceLevels()
- for level in levels:
- kids = level.getChildren()
+ methods = node.getFenceMethods()
+ for method in methods:
+ kids = method.getChildren()
for kid in kids: #kids are actual fence instance objects
#Need to pass over this device if:
##1) It is not a power controller, or
@@ -1007,7 +1006,7 @@ class ModelBuilder:
if res == "off":
kid.removeAttribute("option")
else:
- level.removeChild(kid)
+ method.removeChild(kid)
found_one = True
break
if found_one is True:
diff --git a/luci/lib/ClusterConf/TagObject.py b/luci/lib/ClusterConf/TagObject.py
index 3dbbe9d..7d4c093 100644
--- a/luci/lib/ClusterConf/TagObject.py
+++ b/luci/lib/ClusterConf/TagObject.py
@@ -12,6 +12,8 @@ class TagObject(object):
self.attr_hash = {}
self.children = list()
self.TAG_NAME = tagname
+ self.comments = list()
+ self.trailing_comments = list()
def addChild(self, child):
self.children.append(child)
@@ -44,7 +46,7 @@ class TagObject(object):
if len(bounds) > 1 and bounds[1] is not None:
if int_val > bounds[1]:
raise ValueError, '%d not <= %d' % (int_val, bounds[1])
- return self.addAttribute(name, val)
+ return self.addAttribute(name, str(val))
def addBinaryAttribute(self, name, value, mapping):
if value is None:
@@ -96,15 +98,23 @@ class TagObject(object):
tag.setAttribute(k, v)
def generateXML(self, doc, parent=None):
- tag = doc.createElement(self.TAG_NAME)
if parent is None:
parent = doc
+
+ for c in self.comments:
+ parent.appendChild(doc.createComment(c))
+
+ tag = doc.createElement(self.TAG_NAME)
parent.appendChild(tag)
self.exportAttributes(tag)
+
for child in self.children:
if child is not None:
child.generateXML(doc, tag)
+ for c in self.trailing_comments:
+ tag.appendChild(doc.createComment(c))
+
def getAttributes(self):
return self.attr_hash
@@ -118,6 +128,10 @@ class TagObject(object):
def getName(self):
return self.attr_hash.get('name', '')
+ def setName(self, val):
+ self.attr_hash['name'] = val
+ return val
+
def getTagName(self):
return self.TAG_NAME
diff --git a/luci/lib/ClusterConf/Totem.py b/luci/lib/ClusterConf/Totem.py
index bf270a2..86c87de 100644
--- a/luci/lib/ClusterConf/Totem.py
+++ b/luci/lib/ClusterConf/Totem.py
@@ -20,7 +20,6 @@ class Totem(TagObject):
def __init__(self):
TagObject.__init__(self)
self.TAG_NAME = TAG_NAME
- self.attr_hash.update(Totem.DEFAULTS)
def getJoinTimeout(self):
return self.getAttribute('join')
13 years, 6 months
[luci] Add deleters to the methods of classes that manipulate element attributes
by Ryan McCabe
commit 1b7b04ba83c1b4b382a6414211c3e4acb9c54773
Author: Ryan McCabe <rmccabe(a)redhat.com>
Date: Sat Oct 23 02:03:00 2010 -0400
Add deleters to the methods of classes that manipulate element attributes
luci/lib/ClusterConf/Altname.py | 9 +++
luci/lib/ClusterConf/BaseResource.py | 25 ++++++++-
luci/lib/ClusterConf/ClusterNode.py | 11 +++-
luci/lib/ClusterConf/Clusterfs.py | 2 +-
luci/lib/ClusterConf/Clvmd.py | 3 +
luci/lib/ClusterConf/Cman.py | 54 ++++++++++++++++--
luci/lib/ClusterConf/DLM.py | 39 +++++++++++++
luci/lib/ClusterConf/FailoverDomain.py | 11 ++++-
luci/lib/ClusterConf/FailoverDomainNode.py | 5 ++-
luci/lib/ClusterConf/FenceDaemon.py | 26 ++++++++--
luci/lib/ClusterConf/FenceXVMd.py | 29 ++++++++++-
luci/lib/ClusterConf/GFSControld.py | 24 ++++++++
luci/lib/ClusterConf/Group.py | 3 +
luci/lib/ClusterConf/Interface.py | 17 ++++++-
luci/lib/ClusterConf/Lockspace.py | 7 ++-
luci/lib/ClusterConf/Logging.py | 27 ++++++++-
luci/lib/ClusterConf/Master.py | 4 ++
luci/lib/ClusterConf/Multicast.py | 3 +
luci/lib/ClusterConf/NFSClient.py | 3 +-
luci/lib/ClusterConf/QuorumD.py | 60 ++++++++++++++++++++
luci/lib/ClusterConf/Rm.py | 15 +++++-
luci/lib/ClusterConf/Service.py | 67 +++++++++++------------
luci/lib/ClusterConf/TagObject.py | 17 ++++--
luci/lib/ClusterConf/Totem.py | 24 ++++++++
luci/widget_validators/validate_cluster_prop.py | 2 +-
25 files changed, 419 insertions(+), 68 deletions(-)
---
diff --git a/luci/lib/ClusterConf/Altname.py b/luci/lib/ClusterConf/Altname.py
index 48bb221..e0be390 100644
--- a/luci/lib/ClusterConf/Altname.py
+++ b/luci/lib/ClusterConf/Altname.py
@@ -20,14 +20,23 @@ class Altname(TagObject):
def setAddr(self, val):
return self.addAttribute('name', val)
+ def delAddr(self):
+ return self.attr_hash.get('name')
+
def getPort(self):
return self.getAttribute('port')
def setPort(self, val):
return self.addIntegerAttribute('port', val, (1, 0xffff))
+ def delPort(self):
+ return self.removeAttribute('port')
+
def getMcast(self):
return self.getAttribute('mcast')
def setMcast(self, val):
return self.addAttribute('mcast', val)
+
+ def delMcast(self):
+ return self.removeAttribute('mcast')
diff --git a/luci/lib/ClusterConf/BaseResource.py b/luci/lib/ClusterConf/BaseResource.py
index 035631c..a3c990c 100644
--- a/luci/lib/ClusterConf/BaseResource.py
+++ b/luci/lib/ClusterConf/BaseResource.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2006-2009 Red Hat, Inc.
+# Copyright (C) 2006-2010 Red Hat, Inc.
#
# This program is free software; you can redistribute
# it and/or modify it under the terms of version 2 of the
@@ -19,9 +19,11 @@ class BaseResource(TagObject):
def ref(self):
self.refcount += 1
+ return self.refcount
def unref(self):
self.refcount -= 1
+ return self.refcount
def getRefcount(self):
return self.refcount
@@ -44,6 +46,9 @@ class BaseResource(TagObject):
def setIndependentSubtree(self, val):
return self.addBinaryAttribute('__independent_subtree', val, (None, '1'))
+ def delIndependentSubtree(self):
+ return self.removeAttribute('__independent_subtree')
+
def getNonCriticalResource(self):
try:
ret = int(self.getAttribute('__independent_subtree'))
@@ -56,24 +61,36 @@ class BaseResource(TagObject):
def setNonCriticalResource(self, val):
return self.addBinaryAttribute('__independent_subtree', val, (None, '2'))
+ def delNonCriticalResource(self):
+ return self.removeAttribute('__independent_subtree')
+
def getEnforceTimeouts(self):
return self.getBinaryAttribute('__enforce_timeouts')
def setEnforceTimeouts(self, val):
return self.addBinaryAttribute('__enforce_timeouts', val (None, '1'))
+ def delEnforceTimeouts(self):
+ return self.removeAttribute('__enforce_timeouts')
+
def getMaxFailures(self):
return self.getAttribute('__max_failures')
def setMaxFailures(self, val):
return self.addIntegerAttribute('__max_failures', val, (0, None))
+ def delMaxFailures(self):
+ return self.removeAttribute('__max_failures')
+
def getFailureExpireTime(self):
return self.getAttribute('__failure_expire_time')
def setFailureExpireTime(self, val):
return self.addIntegerAttribute('__failure_expire_time', val, (0, None))
+ def delFailureExpireTime(self):
+ return self.removeAttribute('__failure_expire_time')
+
def getMaxRestarts(self):
return self.getAttribute('__max_restarts')
@@ -83,5 +100,11 @@ class BaseResource(TagObject):
def getRestartExpireTime(self):
return self.getAttribute('__restart_expire_time')
+ def delMaxRestarts(self):
+ return self.removeAttribute('__max_restarts')
+
def setRestartExpireTime(self, val):
return self.addIntegerAttribute('__restart_expire_time', val, (0, None))
+
+ def delRestartExpireTime(self):
+ return self.removeAttribute('__restart_expire_time')
diff --git a/luci/lib/ClusterConf/ClusterNode.py b/luci/lib/ClusterConf/ClusterNode.py
index 9eb1665..7949373 100644
--- a/luci/lib/ClusterConf/ClusterNode.py
+++ b/luci/lib/ClusterConf/ClusterNode.py
@@ -40,6 +40,9 @@ class ClusterNode(TagObject):
def setVotes(self, val):
return self.addIntegerAttribute('votes', val, (1, None))
+ def delVotes(self):
+ return self.removeAttribute('votes')
+
def getNodeID(self):
return self.getAttribute('nodeid')
@@ -48,11 +51,15 @@ class ClusterNode(TagObject):
# Cluster2/RHEL5 only
def getIfname(self):
- self.getAttribute('ifname')
+ return self.getAttribute('ifname')
# Cluster2/RHEL5 only
def setIfname(self, val):
- self.addAttribute('ifname', val)
+ return self.addAttribute('ifname', val)
+
+ # Cluster2/RHEL5 only
+ def delIfname(self):
+ return self.removeAttribute('ifname')
def removeFenceInstance(self, method, instance):
"""Remove fence instance from this node and given fence method."""
diff --git a/luci/lib/ClusterConf/Clusterfs.py b/luci/lib/ClusterConf/Clusterfs.py
index f3b00ad..d4e6528 100644
--- a/luci/lib/ClusterConf/Clusterfs.py
+++ b/luci/lib/ClusterConf/Clusterfs.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2006-2009 Red Hat, Inc.
+# Copyright (C) 2006-2010 Red Hat, Inc.
#
# This program is free software; you can redistribute
# it and/or modify it under the terms of version 2 of the
diff --git a/luci/lib/ClusterConf/Clvmd.py b/luci/lib/ClusterConf/Clvmd.py
index 0c6552c..6823815 100644
--- a/luci/lib/ClusterConf/Clvmd.py
+++ b/luci/lib/ClusterConf/Clvmd.py
@@ -19,3 +19,6 @@ class Clvmd(TagObject):
def setInterface(self, val):
return self.addAttribute('interface', val)
+
+ def delInterface(self):
+ return self.removeAttribute('interface')
diff --git a/luci/lib/ClusterConf/Cman.py b/luci/lib/ClusterConf/Cman.py
index 2d5062a..00e9740 100644
--- a/luci/lib/ClusterConf/Cman.py
+++ b/luci/lib/ClusterConf/Cman.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2006-2009 Red Hat, Inc.
+# Copyright (C) 2006-2010 Red Hat, Inc.
#
# This program is free software; you can redistribute
# it and/or modify it under the terms of version 2 of the
@@ -21,59 +21,89 @@ class Cman(TagObject):
def getBroadcast(self):
return self.getBinaryAttribute('broadcast')
+ def delBroadcast(self):
+ return self.removeAttribute('broadcast')
+
def getTwoNode(self):
return self.getBinaryAttribute('two_node')
def setTwoNode(self, val):
return self.addBinaryAttribute('two_node', val, (None, '1'))
+ def delTwoNode(self):
+ return self.removeAttribute('two_node')
+
def getExpectedVotes(self):
return self.getAttribute('expected_votes')
def setExpectedVotes(self, val):
return self.addIntegerAttribute('expected_votes', val, (1, None))
+ def delExpectedVotes(self):
+ return self.removeAttribute('expected_votes')
+
def getUpgrading(self):
- return self.getAttribute('upgrading')
+ return self.getBinaryAttribute('upgrading')
def setUpgrading(self, val):
return self.addBinaryAttribute('upgrading', val, (None, '1'))
+ def delUpgrading(self):
+ return self.removeAttribute('upgrading')
+
def getDisallowed(self):
- return self.getAttribute('disallowed')
+ return self.getBinaryAttribute('disallowed')
def setDisallowed(self, val):
return self.addBinaryAttribute('disallowed', val, (None, '1'))
+ def delDisallowed(self):
+ return self.removeAttribute('disallowed')
+
def getQuorumDevPoll(self):
return self.getAttribute('quorum_dev_poll')
def setQuorumDevPoll(self, val):
return self.addIntegerAttribute('quorum_dev_poll', val, (0, None))
+ def delQuorumDevPoll(self):
+ return self.removeAttribute('quorum_dev_poll')
+
def getShutdownTimeout(self):
return self.getAttribute('shutdown_timeout')
def setShutdownTimeout(self, val):
return self.addIntegerAttribute('shutdown_timeout', val, (0, None))
+ def delShutdownTimeout(self):
+ return self.removeAttribute('shutdown_timeout')
+
def getCcsdPoll(self):
return self.getAttribute('ccsd_poll')
def setCcsdPoll(self, val):
return self.addIntegerAttribute('ccsd_poll', val, (0, None))
+ def delCcsdPoll(self):
+ return self.removeAttribute('ccsd_poll')
+
def getDebugMask(self):
return self.getAttribute('debug_mask')
def setDebugMask(self, val):
return self.addIntegerAttribute('debug_mask', val)
+ def delDebugMask(self):
+ return self.removeAttribute('debug_mask')
+
def getPort(self):
return self.getAttribute('port')
def setPort(self, val):
- return self.addIntegerAttribute('port', val, (0, None))
+ return self.addIntegerAttribute('port', val, (1, 0xffff))
+
+ def delPort(self):
+ return self.removeAttribute('port')
def getClusterId(self):
return self.getAttribute('cluster_id')
@@ -81,20 +111,32 @@ class Cman(TagObject):
def setClusterId(self, val):
return self.addIntegerAttribute('cluster_id', val, (0, None))
+ def delClusterId(self):
+ return self.removeAttribute('cluster_id')
+
def getHashClusterId(self):
- return self.getAttribute('hash_cluster_id')
+ return self.getBinaryAttribute('hash_cluster_id')
def setHashClusterId(self, val):
return self.addBinaryAttribute('hash_cluster_id', val, (None, '1'))
+ def delHashClusterId(self):
+ return self.removeAttribute('hash_cluster_id')
+
def getKeyFile(self):
return self.getAttribute('keyfile')
def setKeyFile(self, val):
return self.addAttribute('keyfile', val)
+ def delKeyFile(self):
+ return self.removeAttribute('keyfile')
+
def getDisableOpenAIS(self):
- return self.getAttribute('disable_openais')
+ return self.getBinaryAttribute('disable_openais')
def setDisableOpenAIS(self, val):
return self.addBinaryAttribute('disable_openais', val, (None, '1'))
+
+ def delDisableOpenAIS(self):
+ return self.removeAttribute('disable_openais')
diff --git a/luci/lib/ClusterConf/DLM.py b/luci/lib/ClusterConf/DLM.py
index 772d118..b4d64d3 100644
--- a/luci/lib/ClusterConf/DLM.py
+++ b/luci/lib/ClusterConf/DLM.py
@@ -37,21 +37,33 @@ class DLM(TagObject):
def setLogDebug(self, val):
return self.addBinaryAttribute('log_debug', val, ('0', '1'))
+ def delLogDebug(self):
+ return self.removeAttribute('log_debug')
+
def getEnableFencing(self):
return self.getBinaryAttribute('enable_fencing')
def setEnableFencing(self, val):
return self.addBinaryAttribute('enable_fencing', val, ('0', '1'))
+ def delEnableFencing(self):
+ return self.removeAttribute('enable_fencing')
+
def getEnableQuorum(self):
return self.getBinaryAttribute('enable_quorum')
def setEnableQuorum(self, val):
return self.addBinaryAttribute('enable_quorum', val, ('0', '1'))
+ def delEnableQuorum(self):
+ return self.removeAttribute('enable_quorum')
+
def getEnableDeadlk(self):
return self.getBinaryAttribute('enable_deadlk')
+ def delEnableDeadlk(self):
+ return self.removeAttribute('enable_deadlk')
+
def setEnableDeadlk(self, val):
return self.addBinaryAttribute('enable_deadlk', val, ('0', '1'))
@@ -61,50 +73,77 @@ class DLM(TagObject):
def setEnablePlock(self, val):
return self.addBinaryAttribute('enable_plock', val, ('0', '1'))
+ def delEnablePlock(self):
+ return self.removeAttribute('enable_plock')
+
def getEnablePlockDebug(self):
return self.getBinaryAttribute('enable_plock_debug')
def setEnablePlockDebug(self, val):
return self.addBinaryAttribute('enable_plock_debug', val, ('0', '1'))
+ def delEnablePlockDebug(self):
+ return self.removeAttribute('enable_plock_debug')
+
def getPlockRatelimit(self):
return self.getBinaryAttribute('plock_rate_limit')
def setPlockRatelimit(self, val):
return self.addBinaryAttribute('plock_rate_limit', val, ('0', '1'))
+ def delPlockRatelimit(self):
+ return self.removeAttribute('plock_rate_limit')
+
def getPlockOwnership(self):
return self.getBinaryAttribute('plock_ownership')
def setPlockOwnership(self, val):
return self.addBinaryAttribute('plock_ownership', val, ('0', '1'))
+ def delPlockOwnership(self):
+ return self.removeAttribute('plock_ownership')
+
def getTimeWarn(self):
return self.getAttribute('timewarn')
def setTimeWarn(self, val):
return self.addIntegerAttribute('timewarn', val)
+ def delTimeWarn(self):
+ return self.removeAttribute('timewarn')
+
def getProtocol(self):
return self.getAttribute('protocol')
def setProtocol(self, val):
return self.addAttribute('protocol', val)
+ def delProtocol(self):
+ return self.removeAttribute('protocol')
+
def getDropResourcesTime(self):
return self.getAttribute('drop_resources_time')
def setDropResourcesTime(self, val):
return self.addIntegerAttribute('drop_resources_time', val)
+ def delDropResourcesTime(self):
+ return self.removeAttribute('drop_resources_time')
+
def getDropResourcesCount(self):
return self.getAttribute('drop_resources_count')
def setDropResourcesCount(self, val):
return self.addIntegerAttribute('drop_resources_count', val)
+ def delDropResourcesCount(self):
+ return self.removeAttribute('drop_resources_count')
+
def getDropResourcesAge(self):
return self.getAttribute('drop_resources_age')
def setDropResourcesAge(self, val):
return self.addIntegerAttribute('drop_resources_age', val)
+
+ def delDropResourcesAge(self):
+ return self.removeAttribute('drop_resources_age')
diff --git a/luci/lib/ClusterConf/FailoverDomain.py b/luci/lib/ClusterConf/FailoverDomain.py
index 215cde7..fdde092 100644
--- a/luci/lib/ClusterConf/FailoverDomain.py
+++ b/luci/lib/ClusterConf/FailoverDomain.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2006-2009 Red Hat, Inc.
+# Copyright (C) 2006-2010 Red Hat, Inc.
#
# This program is free software; you can redistribute
# it and/or modify it under the terms of version 2 of the
@@ -20,18 +20,27 @@ class FailoverDomain(TagObject):
def setRestricted(self, val):
return self.addBinaryAttribute('restricted', val, ('0', '1'))
+ def delRestricted(self):
+ return self.removeAttribute('restricted')
+
def getOrdered(self):
return self.getBinaryAttribute('ordered')
def setOrdered(self, val):
return self.addBinaryAttribute('ordered', val, ('0', '1'))
+ def delOrdered(self):
+ return self.removeAttribute('ordered')
+
def getNoFailback(self):
return self.getBinaryAttribute('nofailback')
def setNoFailback(self, val):
return self.addBinaryAttribute('nofailback', val, (None, '1'))
+ def delNoFailback(self):
+ return self.removeAttribute('nofailback')
+
def get_member_node(self, nodename):
member_list = self.children
for i in member_list:
diff --git a/luci/lib/ClusterConf/FailoverDomainNode.py b/luci/lib/ClusterConf/FailoverDomainNode.py
index 8ee3db6..88039ce 100644
--- a/luci/lib/ClusterConf/FailoverDomainNode.py
+++ b/luci/lib/ClusterConf/FailoverDomainNode.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2006-2009 Red Hat, Inc.
+# Copyright (C) 2006-2010 Red Hat, Inc.
#
# This program is free software; you can redistribute
# it and/or modify it under the terms of version 2 of the
@@ -19,3 +19,6 @@ class FailoverDomainNode(TagObject):
def setPriority(self, val):
self.addIntegerAttribute('priority', val, (0, None))
+
+ def delPriority(self):
+ return self.removeAttribute('priority')
diff --git a/luci/lib/ClusterConf/FenceDaemon.py b/luci/lib/ClusterConf/FenceDaemon.py
index 3b7915c..4a8d7af 100644
--- a/luci/lib/ClusterConf/FenceDaemon.py
+++ b/luci/lib/ClusterConf/FenceDaemon.py
@@ -25,34 +25,52 @@ class FenceDaemon(TagObject):
return self.getAttribute('post_join_delay')
def setPostJoinDelay(self, delay):
- self.addIntegerAttribute('post_join_delay', delay, (0, None))
+ return self.addIntegerAttribute('post_join_delay', delay, (0, None))
+
+ def delPostJoinDelay(self):
+ return self.removeAttribute('post_join_delay')
def getPostFailDelay(self):
return self.getAttribute('post_fail_delay')
def setPostFailDelay(self, delay):
- self.addIntegerAttribute('post_fail_delay', delay, (0, None))
+ return self.addIntegerAttribute('post_fail_delay', delay, (0, None))
+
+ def delPostFailDelay(self):
+ return self.removeAttribute('post_fail_delay')
def getCleanStart(self):
- return self.getAttribute('clean_start')
+ return self.getBinaryAttribute('clean_start')
def setCleanStart(self, val):
return self.addBinaryAttribute('clean_start', val, (None, '1'))
+ def delCleanStart(self):
+ return self.removeAttribute('clean_start')
+
def getSkipUndefined(self):
- return self.getAttribute('skip_undefined')
+ return self.getBinaryAttribute('skip_undefined')
def setSkipUndefined(self, val):
return self.addBinaryAttribute('skip_undefined', val, (None, '1'))
+ def delSkipUndefined(self):
+ return self.removeAttribute('skip_undefined')
+
def getOverridePath(self):
return self.getAttribute('override_path')
def setOverridePath(self, val):
return self.addAttribute('override_path', val)
+ def delOverridePath(self):
+ return self.removeAttribute('override_path')
+
def getOverrideTime(self):
return self.getAttribute('override_time')
def setOverrideTime(self, val):
return self.addIntegerAttribute('override_time', val, (0, None))
+
+ def delOverrideTime(self):
+ return self.removeAttribute('override_time')
diff --git a/luci/lib/ClusterConf/FenceXVMd.py b/luci/lib/ClusterConf/FenceXVMd.py
index 8ec3951..1619746 100644
--- a/luci/lib/ClusterConf/FenceXVMd.py
+++ b/luci/lib/ClusterConf/FenceXVMd.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2006-2009 Red Hat, Inc.
+# Copyright (C) 2006-2010 Red Hat, Inc.
#
# This program is free software; you can redistribute
# it and/or modify it under the terms of version 2 of the
@@ -31,30 +31,45 @@ class FenceXVMd(TagObject):
return None
return self.addIntegerAttribute('debug', val)
+ def delDebug(self):
+ return self.removeAttribute('debug')
+
def getPort(self):
return self.getAttribute('port')
def setPort(self, val):
return self.addIntegerAttribute('port', val, (1, 0xffff))
+ def delPort(self):
+ return self.removeAttribute('port')
+
def getUseUUID(self):
return self.getBinaryAttribute('use_uuid')
def setUseUUID(self, val):
return self.addBinaryAttribute('use_uuid', val, (None, '1'))
+ def delUseUUID(self):
+ return self.removeAttribute('use_uuid')
+
def getMulticastAddress(self):
return self.getAttribute('multicast_address')
def setMulticastAddress(self, val):
return self.addAttribute('multicast_address', val)
+ def delMulticastAddress(self):
+ return self.removeAttribute('multicast_address')
+
def getMulticastInterface(self):
return self.getAttribute('multicast_interface')
def setMulticastInterface(self, val):
return self.addAttribute('multicast_interface', val)
+ def delMulticastInterface(self):
+ return self.removeAttribute('multicast_interface')
+
def getAuth(self):
return self.getAttribute('auth')
@@ -64,6 +79,9 @@ class FenceXVMd(TagObject):
raise ValueError, val
return self.addAttribute('auth', val)
+ def delAuth(self):
+ return self.removeAttribute('auth')
+
def getHash(self):
return self.getAttribute('hash')
@@ -73,14 +91,23 @@ class FenceXVMd(TagObject):
raise ValueError, val
return self.addAttribute('hash', val)
+ def delHash(self):
+ return self.removeAttribute('hash')
+
def getURI(self):
return self.getAttribute('uri')
def setURI(self, val):
return self.addAttribute('uri', val)
+ def delURI(self):
+ return self.removeAttribute('uri')
+
def getKeyFile(self):
return self.getAttribute('key_file')
def setKeyFile(self, val):
return self.addAttribute('key_file', val)
+
+ def delKeyFile(self):
+ return self.removeAttribute('key_file')
diff --git a/luci/lib/ClusterConf/GFSControld.py b/luci/lib/ClusterConf/GFSControld.py
index ca80a5d..297a7e6 100644
--- a/luci/lib/ClusterConf/GFSControld.py
+++ b/luci/lib/ClusterConf/GFSControld.py
@@ -32,44 +32,68 @@ class GFSControld(TagObject):
def setEnableWithdraw(self, val):
return self.addBinaryAttribute('enable_withdraw', val, ('0', '1'))
+ def delEnableWithdraw(self):
+ return self.removeAttribute('enable_withdraw')
+
def getEnablePlock(self):
return self.getBinaryAttribute('enable_plock')
def setEnablePlock(self, val):
return self.addBinaryAttribute('enable_plock', val, ('0', '1'))
+ def delEnablePlock(self):
+ return self.removeAttribute('enable_plock')
+
def getPlockDebug(self):
return self.getBinaryAttribute('plock_debug')
def setPlockDebug(self, val):
return self.addBinaryAttribute('plock_debug', val, ('0', '1'))
+ def delPlockDebug(self):
+ return self.removeAttribute('plock_debug')
+
def getPlockRateLimit(self):
return self.getBinaryAttribute('plock_rate_limit')
def setPlockRateLimit(self, val):
return self.addBinaryAttribute('plock_rate_limit', val, ('0', '1'))
+ def delPlockRateLimit(self):
+ return self.removeAttribute('plock_rate_limit')
+
def getPlockOwnership(self):
return self.getBinaryAttribute('plock_ownership')
def setPlockOwnership(self, val):
return self.addBinaryAttribute('plock_ownership', val, ('0', '1'))
+ def delPlockOwnership(self):
+ return self.removeAttribute('plock_ownership')
+
def getDropResourcesTime(self):
return self.getAttribute('drop_resources_time')
def setDropResourcesTime(self, val):
return self.addIntegerAttribute('drop_resources_time', val)
+ def delDropResourcesTime(self):
+ return self.removeAttribute('drop_resources_time')
+
def getDropResourcesCount(self):
return self.getAttribute('drop_resources_count')
def setDropResourcesCount(self, val):
return self.addIntegerAttribute('drop_resources_count', val)
+ def delDropResourcesCount(self):
+ return self.removeAttribute('drop_resources_count')
+
def getDropResourcesAge(self):
return self.getAttribute('drop_resources_age')
def setDropResourcesAge(self, val):
return self.addIntegerAttribute('drop_resources_age', val)
+
+ def delDropResourcesAge(self):
+ return self.removeAttribute('drop_resources_age')
diff --git a/luci/lib/ClusterConf/Group.py b/luci/lib/ClusterConf/Group.py
index 69ce000..03df951 100644
--- a/luci/lib/ClusterConf/Group.py
+++ b/luci/lib/ClusterConf/Group.py
@@ -19,3 +19,6 @@ class Group(TagObject):
def setCompat(self, val):
return self.addBinaryAttribute('groupd_compat', val, (None, '1'))
+
+ def delCompat(self):
+ return self.removeAttribute('groupd_compat')
diff --git a/luci/lib/ClusterConf/Interface.py b/luci/lib/ClusterConf/Interface.py
index c13eed3..150e97f 100644
--- a/luci/lib/ClusterConf/Interface.py
+++ b/luci/lib/ClusterConf/Interface.py
@@ -20,26 +20,41 @@ class Interface(TagObject):
def setRingNumber(self, val):
return self.addIntegerAttribute('ringnumber', val)
+ def delRingNumber(self):
+ return self.removeAttribute('ringnumber')
+
def getBindNetAddr(self):
return self.getAttribute('bindnetaddr')
def setBindNetAddr(self, val):
return self.addAttribute('bindnetaddr', val)
+ def delBindNetAddr(self):
+ return self.removeAttribute('bindnetaddr')
+
def getMcastAddr(self):
return self.getAttribute('mcastaddr')
def setMcastAddr(self, val):
return self.addAttribute('mcastaddr', val)
+ def delMcastAddr(self):
+ return self.removeAttribute('mcastaddr')
+
def getMcastPort(self):
return self.getAttribute('mcastport')
def setMcastPort(self, val):
- return self.addIntegerAttribute('mcastport', val)
+ return self.addIntegerAttribute('mcastport', val, (0, 0xffff))
+
+ def delMcastPort(self):
+ return self.removeAttribute('mcastport')
def getBroadcast(self):
return self.getBinaryAttribute('broadcast')
def setBroadcast(self, val):
return self.addBinaryAttribute('broadcast', val, (None, 'yes'))
+
+ def delBroadcast(self):
+ return self.removeAttribute('broadcast')
diff --git a/luci/lib/ClusterConf/Lockspace.py b/luci/lib/ClusterConf/Lockspace.py
index 206e7d3..f67db63 100644
--- a/luci/lib/ClusterConf/Lockspace.py
+++ b/luci/lib/ClusterConf/Lockspace.py
@@ -15,7 +15,10 @@ class Lockspace(TagObject):
self.TAG_NAME = TAG_NAME
def getNodir(self):
- return self.getAttribute('nodir')
+ return self.getBinaryAttribute('nodir')
def setNodir(self, val):
- self.addBinaryAttribute('nodir', val, ('0', '1'))
+ return self.addBinaryAttribute('nodir', val, ('0', '1'))
+
+ def delNodir(self):
+ return self.removeAttribute('nodir')
diff --git a/luci/lib/ClusterConf/Logging.py b/luci/lib/ClusterConf/Logging.py
index 7e2511b..15d8446 100644
--- a/luci/lib/ClusterConf/Logging.py
+++ b/luci/lib/ClusterConf/Logging.py
@@ -15,43 +15,64 @@ class Logging(TagObject):
self.TAG_NAME = TAG_NAME
def getSyslog(self):
- return self.getAttribute('to_syslog')
+ return self.getBinaryAttribute('to_syslog')
def setSyslog(self, val):
return self.addBinaryAttribute('to_syslog', val, ('no', 'yes'))
+ def delSyslog(self):
+ return self.removeAttribute('to_syslog')
+
def getLogfile(self):
- return self.getAttribute('to_logfile')
+ return self.getBinaryAttribute('to_logfile')
def setLogfile(self, val):
return self.addBinaryAttribute('to_logfile', val, ('no', 'yes'))
+ def delLogfile(self):
+ return self.removeAttribute('to_logfile')
+
def getLogfilePath(self):
return self.getAttribute('logfile')
def setLogFilePath(self, path):
return self.addAttribute('logfile', path)
+ def delLogfilePath(self):
+ return self.removeAttribute('logfile')
+
def getSyslogFacility(self):
return self.getAttribute('syslog_facility')
def setSyslogFacility(self, val):
return self.addAttribute('syslog_facility', val)
+ def delSyslogFacility(self):
+ return self.removeAttribute('syslog_facility')
+
def getSyslogPriority(self):
return self.getAttribute('syslog_priority')
def setSyslogPriority(self, val):
return self.addAttribute('syslog_priority', val)
+ def delSyslogPriority(self):
+ return self.removeAttribute('syslog_priority')
+
def getLogfilePriority(self):
return self.getAttribute('logfile_priority')
def setLogfilePriority(self, val):
return self.addAttribute('logfile_priority', val)
+ def delLogfilePriority(self):
+ return self.removeAttribute('logfile_priority')
+
def getDebug(self):
- return self.getAttribute('debug')
+ return self.getBinaryAttribute('debug')
def setDebug(self, val):
return self.addBinaryAttribute('debug', val, (None, 'on'))
+
+ def delDebug(self):
+ return self.removeAttribute('debug')
diff --git a/luci/lib/ClusterConf/Master.py b/luci/lib/ClusterConf/Master.py
index aacd4c3..c0fadfe 100644
--- a/luci/lib/ClusterConf/Master.py
+++ b/luci/lib/ClusterConf/Master.py
@@ -19,3 +19,7 @@ class Master(TagObject):
def setWeight(self, val):
return self.addIntegerAttribute('weight', val, (0, None))
+
+ def delWeight(self):
+ return self.removeAttribute('weight')
+
diff --git a/luci/lib/ClusterConf/Multicast.py b/luci/lib/ClusterConf/Multicast.py
index 3806f10..5940b5a 100644
--- a/luci/lib/ClusterConf/Multicast.py
+++ b/luci/lib/ClusterConf/Multicast.py
@@ -19,3 +19,6 @@ class Multicast(TagObject):
def setAddr(self, val):
return self.addAttribute('addr', val)
+
+ def delAddr(self, val):
+ return self.removeAttribute('addr', val)
diff --git a/luci/lib/ClusterConf/NFSClient.py b/luci/lib/ClusterConf/NFSClient.py
index cb41ee7..746fcff 100644
--- a/luci/lib/ClusterConf/NFSClient.py
+++ b/luci/lib/ClusterConf/NFSClient.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2006-2009 Red Hat, Inc.
+# Copyright (C) 2006-2010 Red Hat, Inc.
#
# This program is free software; you can redistribute
# it and/or modify it under the terms of version 2 of the
@@ -18,5 +18,4 @@ class NFSClient(BaseResource):
BaseResource.__init__(self)
self.TAG_NAME = TAG_NAME
self.resource_type = RESOURCE_TYPE
- #self.addAttribute('name', ' ')
self.deny_all_children = DENY_ALL_CHILDREN
diff --git a/luci/lib/ClusterConf/QuorumD.py b/luci/lib/ClusterConf/QuorumD.py
index 07cd9f5..216ab4b 100644
--- a/luci/lib/ClusterConf/QuorumD.py
+++ b/luci/lib/ClusterConf/QuorumD.py
@@ -24,30 +24,45 @@ class QuorumD(TagObject):
def setVotes(self, val):
return self.addIntegerAttribute('votes', val, (1, None))
+ def delVotes(self):
+ return self.removeAttribute('votes')
+
def getInterval(self):
return self.getAttribute('interval')
def setInterval(self, val):
return self.addIntegerAttribute('interval', val, (0, None))
+ def delInterval(self):
+ return self.removeAttribute('interval')
+
def getTKO(self):
return self.getAttribute('tko')
def setTKO(self, val):
return self.addIntegerAttribute('tko', val, (0, None))
+ def delTKO(self):
+ return self.removeAttribute('tko')
+
def getMinScore(self):
return self.getAttribute('min_score')
def setMinScore(self, val):
return self.addIntegerAttribute('min_score', val, (0, None))
+ def delMinScore(self):
+ return self.removeAttribute('min_score')
+
def getDevice(self):
return self.getAttribute('device')
def setDevice(self, val):
return self.addAttribute('device', val)
+ def delDevice(self):
+ return self.removeAttribute('device')
+
def getLabel(self):
return self.getAttribute('label')
@@ -57,15 +72,24 @@ class QuorumD(TagObject):
def getCmanLabel(self):
return self.getAttribute('cman_label')
+ def delLabel(self):
+ return self.removeAttribute('label')
+
def setCmanLabel(self, val):
return self.addAttribute('cman_label', val)
+ def delCmanLabel(self):
+ return self.removeAttribute('cman_label')
+
def getStatusFile(self):
return self.getAttribute('status_file')
def setStatusFile(self, val):
return self.addAttribute('status_file', val)
+ def delStatusFile(self):
+ return self.removeAttribute('status_file')
+
def getScheduler(self):
return self.getAttribute('scheduler')
@@ -75,71 +99,107 @@ class QuorumD(TagObject):
raise ValueError, sched
return self.addAttribute('scheduler', sched)
+ def delScheduler(self):
+ return self.removeAttribute('scheduler')
+
def getReboot(self):
return self.getBinaryAttribute('reboot')
def setReboot(self, val):
return self.addBinaryAttribute('reboot', val, (None, '1'))
+ def delReboot(self):
+ return self.removeAttribute('reboot')
+
def getPriority(self):
return self.getAttribute('priority')
def setPriority(self, val):
return self.addIntegerAttribute('priority', val)
+ def delPriority(self):
+ return self.removeAttribute('priority')
+
def getStopCman(self):
return self.getBinaryAttribute('stop_cman')
def setStopCman(self, val):
return self.addBinaryAttribute('stop_cman', val, (None, '1'))
+ def delStopCman(self):
+ return self.removeAttribute('stop_cman')
+
def getParanoid(self):
return self.getBinaryAttribute('paranoid')
def setParanoid(self, val):
return self.addBinaryAttribute('paranoid', val, (None, '1'))
+ def delParanoid(self):
+ return self.removeAttribute('paranoid')
+
def getAllowKill(self):
return self.getBinaryAttribute('allow_kill')
def setAllowKill(self, val):
return self.addBinaryAttribute('allow_kill', val, (None, '1'))
+ def delAllowKill(self):
+ return self.removeAttribute('allow_kill')
+
def getMaxErrorCycles(self):
return self.getAttribute('max_error_cycles')
def setMaxErrorCycles(self, val):
return self.addIntegerAttribute('max_error_cycles', val, (0, None))
+ def delMaxErrorCycles(self):
+ return self.removeAttribute('max_error_cycles')
+
def getIOTimeout(self):
return self.getAttribute('io_timeout')
def setIOTimeout(self, val):
return self.addIntegerAttribute('io_timeout', val, (0, None))
+ def delIOTimeout(self):
+ return self.removeAttribute('io_timeout')
+
def getMasterWins(self):
return self.getBinaryAttribute('master_wins')
def setMasterWins(self, val):
return self.addBinaryAttribute('master_wins', val, (None, '1'))
+ def delMasterWins(self):
+ return self.removeAttribute('master_wins')
+
def getTKOUp(self):
return self.getAttribute('tko_up')
def setTKOUp(self, val):
return self.addIntegerAttribute('tko_up', val, (0, None))
+ def delTKOUp(self):
+ return self.removeAttribute('tko_up')
+
def getUpgradeWait(self):
return self.getAttribute('upgrade_wait')
def setUpgradeWait(self, val):
return self.addIntegerAttribute('upgrade_wait', val, (1, None))
+ def delUpgradeWait(self):
+ return self.removeAttribute('upgrade_wait')
+
def getUseUptime(self):
return self.getBinaryAttribute('use_uptime')
def setUseUptime(self, val):
return self.addBinaryAttribute('use_uptime', val, ('0', None))
+ def delUseUptime(self):
+ return self.removeAttribute('use_uptime')
+
def getHeuristicsLen(self):
return len(self.children)
diff --git a/luci/lib/ClusterConf/Rm.py b/luci/lib/ClusterConf/Rm.py
index 39369d4..bfec0e6 100644
--- a/luci/lib/ClusterConf/Rm.py
+++ b/luci/lib/ClusterConf/Rm.py
@@ -20,20 +20,33 @@ class Rm(TagObject):
def setStatusChildMax(self, val):
return self.addIntegerAttribute('status_child_max', val, (0, None))
+ def delStatusChildMax(self):
+ return self.removeAttribute('status_child_max')
+
def getStatusPollInterval(self):
return self.getAttribute('status_poll_interval')
def setStatusPollInterval(self, val):
return self.addIntegerAttribute('status_poll_interval', val, (0, None))
+ def delStatusPollInterval(self):
+ return self.removeAttribute('status_poll_interval')
+
def getCentralProcessing(self):
- return self.getAttribute('central_processing')
+ return self.getBinaryAttribute('central_processing')
def setCentralProcessing(self, val):
return self.addBinaryAttribute('central_processing', val, (None, '1'))
+ def delCentralProcessing(self):
+ return self.removeAttribute('central_processing')
+
def getTransitionThrottling(self):
return self.getAttribute('transition_throttling')
def setTransitionThrottling(self, val):
return self.addIntegerAttribute('transition_throttling', val, (0, None))
+
+ def delTransitionThrottling(self):
+ return self.removeAttribute('transition_throttling')
+
diff --git a/luci/lib/ClusterConf/Service.py b/luci/lib/ClusterConf/Service.py
index 4e3a187..6681a5d 100644
--- a/luci/lib/ClusterConf/Service.py
+++ b/luci/lib/ClusterConf/Service.py
@@ -20,89 +20,80 @@ class Service(TagObject):
def setAutostart(self, val):
return self.addBinaryAttribute('autostart', val, ('0', '1'))
+ def delAutostart(self):
+ return self.removeAttribute('autostart')
+
def getExclusive(self):
return self.getBinaryAttribute('exclusive')
def setExclusive(self, val):
return self.addBinaryAttribute('exclusive', val, ('0', '1'))
+ def delExclusive(self):
+ return self.removeAttribute('exclusive')
+
def getFailoverDomain(self):
return self.getAttribute('domain')
def setFailoverDomain(self, val):
return self.addAttribute('domain', val)
+ def delFailoverDomain(self):
+ return self.removeAttribute('domain')
+
def getRecoveryPolicy(self):
return self.getAttribute('recovery')
def setRecoveryPolicy(self, val):
return self.addAttribute('recovery', val)
+ def delRecoveryPolicy(self):
+ return self.removeAttribute('recovery')
+
def getNFSLock(self):
return self.getBinaryAttribute('nfslock')
def setNFSLock(self, val):
return self.addBinaryAttribute('nfslock', val, (None, '1'))
+ def delNFSLock(self):
+ return self.removeAttribute('nfslock')
+
def getNFSClientCache(self):
return self.getBinaryAttribute('nfs_client_cache')
def setNFSClientCache(self, val):
return self.addBinaryAttribute('nfs_client_cache', val, (None, '1'))
+ def delNFSClientCache(self):
+ return self.removeAttribute('nfs_client_cache')
+
def getMaxRestarts(self):
return self.getAttribute('max_restarts')
def setMaxRestarts(self, val):
return self.addIntegerAttribute('max_restarts', val, (0, None))
+ def delMaxRestarts(self):
+ return self.removeAttribute('max_restarts')
+
def getRestartExpireTime(self):
return self.getAttribute('restart_expire_time')
def setRestartExpireTime(self, val):
return self.addIntegerAttribute('restart_expire_time', val, (0, None))
+ def delRestartExpireTime(self):
+ return self.removeAttribute('restart_expire_time')
+
def getPriority(self):
return self.getAttribute('priority')
def setPriority(self, val):
return self.addIntegerAttribute('priority', val)
- def getIndependentSubtree(self):
- return self.getAttribute('__independent_subtree')
-
- def setIndependentSubtree(self, val):
- return self.addIntegerAttribute('__independent_subtree', val)
-
- def getEnforceTimeouts(self):
- return self.getBinaryAttribute('__enforce_timeouts')
-
- def setEnforceTimeouts(self, val):
- return self.addBinaryAttribute('__enforce_timeouts', val (None, '1'))
-
- def getMaxFailures(self):
- return self.getAttribute('__max_failures')
-
- def setMaxFailures(self, val):
- return self.addIntegerAttribute('__max_failures', val, (0, None))
-
- def getFailureExpireTime(self):
- return self.getAttribute('__failure_expire_time')
-
- def setFailureExpireTime(self, val):
- return self.addIntegerAttribute('__failure_expire_time', val, (0, None))
-
- def getMaxRestartsIST(self):
- return self.getAttribute('__max_restarts')
-
- def setMaxRestartsIST(self, val):
- return self.addIntegerAttribute('__max_restarts', val, (0, None))
-
- def getRestartExpireTimeIST(self):
- return self.getAttribute('__restart_expire_time')
-
- def setRestartExpireTimeIST(self, val):
- return self.addIntegerAttribute('__restart_expire_time', val, (0, None))
+ def delPriority(self):
+ return self.removeAttribute('priority')
def getDependMode(self):
return self.getAttribute('depend_mode')
@@ -113,8 +104,14 @@ class Service(TagObject):
raise ValueError, val
return self.addAttribute('depend_mode', val)
+ def delDependMode(self):
+ return self.removeAttribute('depend_mode')
+
def getDepend(self):
return self.getAttribute('depend')
def setDepend(self, val):
return self.addAttribute('depend', val)
+
+ def delDepend(self):
+ return self.removeAttribute('depend')
diff --git a/luci/lib/ClusterConf/TagObject.py b/luci/lib/ClusterConf/TagObject.py
index 4cfd56b..3dbbe9d 100644
--- a/luci/lib/ClusterConf/TagObject.py
+++ b/luci/lib/ClusterConf/TagObject.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2006-2009 Red Hat, Inc.
+# Copyright (C) 2006-2010 Red Hat, Inc.
#
# This program is free software; you can redistribute
# it and/or modify it under the terms of version 2 of the
@@ -19,10 +19,6 @@ class TagObject(object):
def removeChild(self, child):
self.children.remove(child)
- def addAttribute(self, name, value):
- self.attr_hash[name] = value
- return value
-
def removeAttribute(self, key):
try:
del self.attr_hash[key]
@@ -30,7 +26,16 @@ class TagObject(object):
return False
return True
+ def addAttribute(self, name, value):
+ if value is None:
+ return self.removeAttribute(name)
+ self.attr_hash[name] = value
+ return value
+
def addIntegerAttribute(self, name, val, bounds=(None, None)):
+ if val is None:
+ self.removeAttribute(name)
+ return None
int_val = int(val)
if bounds and type(bounds) is tuple:
if len(bounds) > 0 and bounds[0] is not None:
@@ -43,7 +48,7 @@ class TagObject(object):
def addBinaryAttribute(self, name, value, mapping):
if value is None:
- self.removeAttribute('name')
+ self.removeAttribute(name)
return None
val_type = type(value)
if val_type in (str, unicode):
diff --git a/luci/lib/ClusterConf/Totem.py b/luci/lib/ClusterConf/Totem.py
index 3ebf29e..bf270a2 100644
--- a/luci/lib/ClusterConf/Totem.py
+++ b/luci/lib/ClusterConf/Totem.py
@@ -28,24 +28,36 @@ class Totem(TagObject):
def setJoinTimeout(self, val):
return self.addIntegerAttribute('join', val)
+ def delJoinTimeout(self):
+ return self.removeAttribute('join')
+
def getTokenTimeout(self):
return self.getAttribute('token')
def setTokenTimeout(self, val):
return self.addIntegerAttribute('token', val)
+ def delTokenTimeout(self):
+ return self.removeAttribute('token')
+
def getTokenRetransmits(self):
return self.getAttribute('token_retransmits_before_loss_const')
def setTokenRetransmits(self, val):
return self.addIntegerAttribute('token_retransmits_before_loss_const', val)
+ def delTokenRetransmits(self):
+ return self.removeAttribute('token_retransmits_before_loss_const')
+
def getConsensusTimeout(self):
return self.getAttribute('consensus')
def setConsensusTimeout(self, val):
return self.addIntegerAttribute('consensus', val)
+ def delConsensusTimeout(self):
+ return self.removeAttribute('consensus')
+
def getRRPMode(self):
return self.getAttribute('rrp_mode')
@@ -60,20 +72,32 @@ class Totem(TagObject):
self.addAttribute('rrp_mode', val)
return val
+ def delRRPMode(self):
+ return self.removeAttribute('rrp_mode')
+
def getSecAuth(self):
return self.getBinaryAttribute('secauth')
def setSecAuth(self, val):
return self.addBinaryAttribute('secauth', val, ('off', 'on'))
+ def delSecAuth(self):
+ return self.removeAttribute('secauth')
+
def getFailRecvConst(self):
return self.getAttribute('fail_recv_const')
def setFailRecvConst(self, val):
return self.addIntegerAttribute('fail_recv_const', val)
+ def delFailRecvConst(self):
+ return self.removeAttribute('fail_recv_const')
+
def getKeyFile(self):
return self.getAttribute('keyfile')
def setKeyFile(self, val):
return self.addAttribute('keyfile', val)
+
+ def delKeyFile(self):
+ return self.removeAttribute('keyfile')
diff --git a/luci/widget_validators/validate_cluster_prop.py b/luci/widget_validators/validate_cluster_prop.py
index 7b2481f..7e6f940 100644
--- a/luci/widget_validators/validate_cluster_prop.py
+++ b/luci/widget_validators/validate_cluster_prop.py
@@ -408,7 +408,7 @@ def validate_cluster_config_form(model, **kw):
except:
errors.append(_('Invalid value for totem join timeout : %s') % join_timeout)
else:
- if int(join_timeout) != Totem.DEFAULTS.get('join'):
+ if join_timeout != Totem.DEFAULTS.get('join'):
totem.setJoinTimeout(join_timeout)
else:
totem.removeAttribute('join')
13 years, 7 months
[luci/pkg-update] spec: better handling of luci-specific user/group
by Jan Pokorný
commit c0659bfcc5b428e1bf80379423b3f795afbe0167
Author: Jan Pokorny <jpokorny(a)redhat.com>
Date: Fri Oct 22 22:30:08 2010 +0200
spec: better handling of luci-specific user/group
* ability to redefine user/group name a/o uid/gid at build-time
(use e.g. rpmbuild --define "username foo" ...), which also includes
parameterization of attributes (%attr macro)
* better handled situation when there is a collision on
user/group name a/o uid/gid
- e.g. when "luci" user has been created before the installation
of luci using simple "useradd luci" (which automatically creates
a group of the same name with gid >= 500 [depending on system
settings]), the installation from command line looks like this:
---
# rpm -ivh luci-XYZ.rpm
Preparing... ########################################### [100%]
Error: unexpected state of group `luci' (gid 141) encountered
(colliding group probably created manually beforehand)
Solution: make sure that there is no group named `luci' and also no
group uses gid 141, then reinstall; alternatively, make sure that
mentioned group name matches mentioned gid, then reinstall
1:luci ########################################### [100%]
---
- note: such installation will not fail (it seems to be generally
disaproved to "fail" any scriptlet within installation), but at
least inform that something went wrong, that the service probably
won't work and also tell how fix it, after which the installation
can be repeated
luci.spec | 80 +++++++++++++++++++++++++++++++++++++++++++++++-------------
1 files changed, 62 insertions(+), 18 deletions(-)
---
diff --git a/luci.spec b/luci.spec
index b819322..534fecb 100644
--- a/luci.spec
+++ b/luci.spec
@@ -2,11 +2,15 @@
%{!?python_sitelib_arch: %define python_sitelib_arch %(%{__python} -c "from distutils.sysconfig import get_python_lib; print get_python_lib(1)")}
%{!?pyver: %define pyver %(%{__python} -c "import sys ; print sys.version[:3]")}
-# luci-specific user/group
-%global uid 141
-%global username luci
-%global gid %{uid}
-%global groupname %{username}
+# Default luci-specific user/group (using the same values);
+# we want to force one particular system-allocated uid/gid
+%global def_uid 141
+%global def_uname luci
+# Conditional assignment allowing external redefinition during build stage
+%{!?userid: %global userid %{def_uid}}
+%{!?username: %global username %{def_uname}}
+%{!?groupid: %global groupid %{userid}}
+%{!?groupname: %global groupname %{username}}
Name: luci
@@ -35,8 +39,8 @@ Requires: cyrus-sasl
# (saslauthd from cyrus-sasl uses "pam" mechanism by default)
# Requires: pam
-# shadow-utils: groupadd, useradd; util-linux-ng: /sbin/nologin
-Requires(pre): shadow-utils util-linux-ng
+# glibc-common:getent; shadow-utils:groupadd,useradd; util-linux-ng:/sbin/nologin
+Requires(pre): glibc-common shadow-utils util-linux-ng
Requires(post): chkconfig
Requires(preun): chkconfig initscripts
Requires(postun): initscripts
@@ -73,20 +77,60 @@ rm -rf %{buildroot}
%{python_sitelib_arch}/LuciPAM-1.0-py%{pyver}.egg-info
%{python_sitelib_arch}/lucipam.so
-%config(noreplace) /etc/pam.d/luci
-%config(noreplace) %{_localstatedir}/lib/luci/etc/luci.ini
-%attr(0600,luci,luci) %{_localstatedir}/lib/luci/etc/luci.ini
-%config(noreplace) %{_localstatedir}/lib/luci/etc/cacert.config
-%attr(0600,luci,luci) %{_localstatedir}/lib/luci/etc/cacert.config
-%attr(0750,luci,luci) %{_localstatedir}/lib/luci
-%config(noreplace) %{_sysconfdir}/rc.d/init.d/luci
-%attr(750, luci, luci) %dir /var/log/luci
+%config(noreplace) /etc/pam.d/luci
+%config(noreplace) %{_localstatedir}/lib/luci/etc/luci.ini
+%attr(0600,%{username},%{groupname}) %{_localstatedir}/lib/luci/etc/luci.ini
+%config(noreplace) %{_localstatedir}/lib/luci/etc/cacert.config
+%attr(0600,%{username},%{groupname}) %{_localstatedir}/lib/luci/etc/cacert.config
+%attr(0750,%{username},%{groupname}) %{_localstatedir}/lib/luci
+%config(noreplace) %{_sysconfdir}/rc.d/init.d/luci
+%dir /var/log/luci
+%attr(0750,%{username},%{groupname}) /var/log/luci
%pre
-/usr/sbin/groupadd -g %{gid} %{groupname} 2> /dev/null
-/usr/sbin/useradd -r -u %{uid} -g %{gid} -d /var/lib/luci -s /sbin/nologin \
- -c "luci user" %{username} 2> /dev/null
+# Group preparation
+str_groupid=$(getent group %{groupid} 2>/dev/null)
+str_groupname=$(getent group %{groupname} 2>/dev/null)
+group_ready=1
+if [ "$str_groupid" == "$str_groupname" ]; then
+ if [ -z "$str_groupid" ]; then
+ # Neither such gid nor groupname present yet (perhaps 1st install)
+ /usr/sbin/groupadd -g %{groupid} %{groupname} 2>/dev/null
+ fi
+ # Otherwise everything is already prepared wrt groups (perhaps upgrade)
+else
+ echo "Error: unexpected state of group \`%{groupname}' (gid %{groupid})"\
+ "encountered (colliding group probably created manually"\
+ "beforehand)" >&2
+ echo "Solution: make sure that there is no group named \`%{groupname}'"\
+ "and also no group uses gid %{groupid}, then reinstall;"\
+ "alternatively, make sure that mentioned group name matches"\
+ "mentioned gid, then reinstall" >&2
+ group_ready=0
+fi
+if [ $group_ready -eq 1 ]; then
+ # User preparation
+ str_userid=$(getent passwd %{userid} 2>/dev/null)
+ str_username=$(getent passwd %{username} 2>/dev/null)
+ if [ "$str_userid" == "$str_username" ]; then
+ if [ -z "$str_userid" ]; then
+ # Neither such uid nor username present yet (perhaps 1st install)
+ /usr/sbin/useradd -r -u %{userid} -g %{groupid} -d /var/lib/luci \
+ -s /sbin/nologin -c "luci user" \
+ %{username} 2>/dev/null
+ fi
+ # Otherwise everything is already prepared wrt users (perhaps upgrade)
+ else
+ echo "Error: unexpected state of user \`%{username}'"\
+ "(uid %{userid}) encountered (colliding user probably created"\
+ "manually beforehand)" >&2
+ echo "Solution: make sure that there is no user named \`%{username}'"\
+ "and also no user uses uid %{userid}, then reinstall;"\
+ "alternatively, make sure that mentioned user name matches"\
+ "mentioned uid, then reinstall" >&2
+ fi
+fi
exit 0
%post
13 years, 7 months
[luci] Fix typo
by Ryan McCabe
commit a8eeb1d5a09985e4603575d8b92541e72cfc3e10
Author: Ryan McCabe <rmccabe(a)redhat.com>
Date: Fri Oct 22 11:48:58 2010 -0400
Fix typo
luci/lib/ClusterConf/ModelBuilder.py | 4 ++--
luci/lib/ClusterConf/QuorumD.py | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
---
diff --git a/luci/lib/ClusterConf/ModelBuilder.py b/luci/lib/ClusterConf/ModelBuilder.py
index 59c0450..463010b 100644
--- a/luci/lib/ClusterConf/ModelBuilder.py
+++ b/luci/lib/ClusterConf/ModelBuilder.py
@@ -823,7 +823,7 @@ class ModelBuilder:
if mcast_addr is not None:
if self.mcast_ptr is None:
self.mcast_ptr = Multicast()
- self.CMAN_ptr.appendChild(self.mcast_ptr)
+ self.CMAN_ptr.addChild(self.mcast_ptr)
self.mcast_ptr.setAddr(mcast_addr)
def del_cluster_multicast(self):
@@ -831,7 +831,7 @@ class ModelBuilder:
return True
if self.mcast_ptr is not None:
- self.CMAN_ptr.removeChild(mcast_ptr)
+ self.CMAN_ptr.removeChild(self.mcast_ptr)
self.mcast_ptr = None
self.isModified = True
return True
diff --git a/luci/lib/ClusterConf/QuorumD.py b/luci/lib/ClusterConf/QuorumD.py
index 4093741..07cd9f5 100644
--- a/luci/lib/ClusterConf/QuorumD.py
+++ b/luci/lib/ClusterConf/QuorumD.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2006-2009 Red Hat, Inc.
+# Copyright (C) 2006-2010 Red Hat, Inc.
#
# This program is free software; you can redistribute
# it and/or modify it under the terms of version 2 of the
13 years, 7 months
[luci] Add setters and getters for all valid attributes of the quorumd element
by Ryan McCabe
commit f803161181ce7c73a0b2fb9d527838f4616d463d
Author: Ryan McCabe <rmccabe(a)redhat.com>
Date: Fri Oct 22 11:45:07 2010 -0400
Add setters and getters for all valid attributes of the quorumd element
luci/lib/ClusterConf/QuorumD.py | 126 +++++++++++++++++++++++++++++++++++++-
1 files changed, 122 insertions(+), 4 deletions(-)
---
diff --git a/luci/lib/ClusterConf/QuorumD.py b/luci/lib/ClusterConf/QuorumD.py
index 7b18917..4093741 100644
--- a/luci/lib/ClusterConf/QuorumD.py
+++ b/luci/lib/ClusterConf/QuorumD.py
@@ -16,12 +16,130 @@ class QuorumD(TagObject):
def getVotes(self):
try:
- num_votes = self.getAttribute('votes')
- if num_votes is not None:
- return int(num_votes)
+ return int(self.getAttribute('votes'))
except:
- pass
+ pass
return 0
+ def setVotes(self, val):
+ return self.addIntegerAttribute('votes', val, (1, None))
+
+ def getInterval(self):
+ return self.getAttribute('interval')
+
+ def setInterval(self, val):
+ return self.addIntegerAttribute('interval', val, (0, None))
+
+ def getTKO(self):
+ return self.getAttribute('tko')
+
+ def setTKO(self, val):
+ return self.addIntegerAttribute('tko', val, (0, None))
+
+ def getMinScore(self):
+ return self.getAttribute('min_score')
+
+ def setMinScore(self, val):
+ return self.addIntegerAttribute('min_score', val, (0, None))
+
+ def getDevice(self):
+ return self.getAttribute('device')
+
+ def setDevice(self, val):
+ return self.addAttribute('device', val)
+
+ def getLabel(self):
+ return self.getAttribute('label')
+
+ def setLabel(self, val):
+ return self.addAttribute('label', val)
+
+ def getCmanLabel(self):
+ return self.getAttribute('cman_label')
+
+ def setCmanLabel(self, val):
+ return self.addAttribute('cman_label', val)
+
+ def getStatusFile(self):
+ return self.getAttribute('status_file')
+
+ def setStatusFile(self, val):
+ return self.addAttribute('status_file', val)
+
+ def getScheduler(self):
+ return self.getAttribute('scheduler')
+
+ def setScheduler(self, val):
+ sched = val.lower()
+ if not sched in ('rr', 'fifo', 'other'):
+ raise ValueError, sched
+ return self.addAttribute('scheduler', sched)
+
+ def getReboot(self):
+ return self.getBinaryAttribute('reboot')
+
+ def setReboot(self, val):
+ return self.addBinaryAttribute('reboot', val, (None, '1'))
+
+ def getPriority(self):
+ return self.getAttribute('priority')
+
+ def setPriority(self, val):
+ return self.addIntegerAttribute('priority', val)
+
+ def getStopCman(self):
+ return self.getBinaryAttribute('stop_cman')
+
+ def setStopCman(self, val):
+ return self.addBinaryAttribute('stop_cman', val, (None, '1'))
+
+ def getParanoid(self):
+ return self.getBinaryAttribute('paranoid')
+
+ def setParanoid(self, val):
+ return self.addBinaryAttribute('paranoid', val, (None, '1'))
+
+ def getAllowKill(self):
+ return self.getBinaryAttribute('allow_kill')
+
+ def setAllowKill(self, val):
+ return self.addBinaryAttribute('allow_kill', val, (None, '1'))
+
+ def getMaxErrorCycles(self):
+ return self.getAttribute('max_error_cycles')
+
+ def setMaxErrorCycles(self, val):
+ return self.addIntegerAttribute('max_error_cycles', val, (0, None))
+
+ def getIOTimeout(self):
+ return self.getAttribute('io_timeout')
+
+ def setIOTimeout(self, val):
+ return self.addIntegerAttribute('io_timeout', val, (0, None))
+
+ def getMasterWins(self):
+ return self.getBinaryAttribute('master_wins')
+
+ def setMasterWins(self, val):
+ return self.addBinaryAttribute('master_wins', val, (None, '1'))
+
+ def getTKOUp(self):
+ return self.getAttribute('tko_up')
+
+ def setTKOUp(self, val):
+ return self.addIntegerAttribute('tko_up', val, (0, None))
+
+ def getUpgradeWait(self):
+ return self.getAttribute('upgrade_wait')
+
+ def setUpgradeWait(self, val):
+ return self.addIntegerAttribute('upgrade_wait', val, (1, None))
+
+ def getUseUptime(self):
+ return self.getBinaryAttribute('use_uptime')
+
+ def setUseUptime(self, val):
+ return self.addBinaryAttribute('use_uptime', val, ('0', None))
+
def getHeuristicsLen(self):
return len(self.children)
13 years, 7 months
[luci] Clean up the main cluster.conf model class
by Ryan McCabe
commit 8402b411a0f183120a6bf024612ef19a617a2481
Author: Ryan McCabe <rmccabe(a)redhat.com>
Date: Fri Oct 22 00:31:22 2010 -0400
Clean up the main cluster.conf model class
- remove Gulm configuration bits, as they're not unused
luci/lib/ClusterConf/Cman.py | 2 +-
luci/lib/ClusterConf/Gulm.py | 15 -
luci/lib/ClusterConf/Lockserver.py | 15 -
luci/lib/ClusterConf/ModelBuilder.py | 533 +++++------------------
luci/lib/db_helpers.py | 2 +-
luci/templates/configure.html | 17 +-
luci/widget_validators/validate_cluster_prop.py | 18 +-
7 files changed, 129 insertions(+), 473 deletions(-)
---
diff --git a/luci/lib/ClusterConf/Cman.py b/luci/lib/ClusterConf/Cman.py
index a73cf79..2d5062a 100644
--- a/luci/lib/ClusterConf/Cman.py
+++ b/luci/lib/ClusterConf/Cman.py
@@ -19,7 +19,7 @@ class Cman(TagObject):
return self.addBinaryAttribute('broadcast', val, (None, 'yes'))
def getBroadcast(self):
- return self.getAttribute('broadcast')
+ return self.getBinaryAttribute('broadcast')
def getTwoNode(self):
return self.getBinaryAttribute('two_node')
diff --git a/luci/lib/ClusterConf/ModelBuilder.py b/luci/lib/ClusterConf/ModelBuilder.py
index da0d577..59c0450 100644
--- a/luci/lib/ClusterConf/ModelBuilder.py
+++ b/luci/lib/ClusterConf/ModelBuilder.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2006-2009 Red Hat, Inc.
+# Copyright (C) 2006-2010 Red Hat, Inc.
#
# This program is free software; you can redistribute
# it and/or modify it under the terms of version 2 of the
@@ -18,8 +18,13 @@ from Method import Method
from Device import Device
from Cman import Cman
from Totem import Totem
-from Gulm import Gulm
-from Lockserver import Lockserver
+from DLM import DLM
+from Lockspace import Lockspace
+from GFSControld import GFSControld
+from Interface import Interface
+from Clvmd import Clvmd
+from Group import Group
+from Master import Master
from Ip import Ip
from Script import Script
from Logging import Logging
@@ -59,60 +64,63 @@ from FailoverDomainNode import FailoverDomainNode
from Rm import Rm
from Altname import Altname
-DLM_TYPE = 0
-GULM_TYPE = 1
-
-TAGNAMES = { 'cluster': Cluster,
- 'clusternodes': ClusterNodes,
- 'clusternode': ClusterNode,
- 'altname': Altname,
- 'fence': Fence,
- 'unfence': Unfence,
- 'logging': Logging,
- 'logging_daemon': LoggingDaemon,
- 'fencedevice': FenceDevice,
- 'fencedevices': FenceDevices,
- 'method': Method,
- 'cman': Cman,
- 'totem': Totem,
- 'gulm': Gulm,
- 'lockserver': Lockserver,
- 'rm': Rm,
- 'service': Service,
- 'vm': Vm,
- 'fence_xvmd': FenceXVMd,
- 'resources': Resources,
- 'failoverdomain': FailoverDomain,
- 'failoverdomains': FailoverDomains,
- 'failoverdomainnode': FailoverDomainNode,
- 'ip': Ip,
- 'fs': Fs,
- 'smb': Samba,
- 'apache': Apache,
- 'named': Named,
- 'drbd': DRBD,
- 'lvm': LVM,
- 'mysql': MySQL,
- 'openldap': OpenLDAP,
- 'postgres-8': Postgres8,
- 'tomcat-5': Tomcat5,
- 'tomcat-6': Tomcat6,
- 'fence_daemon': FenceDaemon,
- 'multicast': Multicast,
- 'clusterfs': Clusterfs,
- 'netfs': Netfs,
- 'quorumd': QuorumD,
- 'heuristic': Heuristic,
- 'script': Script,
- 'nfsexport': NFSExport,
- 'nfsclient': NFSClient,
- 'nfsserver': NFSServer,
- 'SAPDatabase': SAPDatabase,
- 'SAPInstance': SAPInstance,
- 'ASEHAagent': SybaseASE,
- 'oracledb': OracleDB,
- 'device': Device }
-
+TAGNAMES = {
+ 'cluster': Cluster,
+ 'clusternodes': ClusterNodes,
+ 'clusternode': ClusterNode,
+ 'altname': Altname,
+ 'fence': Fence,
+ 'device': Device,
+ 'unfence': Unfence,
+ 'logging': Logging,
+ 'logging_daemon': LoggingDaemon,
+ 'fencedevice': FenceDevice,
+ 'fencedevices': FenceDevices,
+ 'method': Method,
+ 'cman': Cman,
+ 'totem': Totem,
+ 'interface': Interface,
+ 'group': Group,
+ 'clvmd': Clvmd,
+ 'gfs_controld': GFSControld,
+ 'dlm': DLM,
+ 'lockspace': Lockspace,
+ 'master': Master,
+ 'rm': Rm,
+ 'service': Service,
+ 'vm': Vm,
+ 'fence_xvmd': FenceXVMd,
+ 'resources': Resources,
+ 'failoverdomain': FailoverDomain,
+ 'failoverdomains': FailoverDomains,
+ 'failoverdomainnode': FailoverDomainNode,
+ 'quorumd': QuorumD,
+ 'heuristic': Heuristic,
+ 'ip': Ip,
+ 'fs': Fs,
+ 'smb': Samba,
+ 'apache': Apache,
+ 'named': Named,
+ 'drbd': DRBD,
+ 'lvm': LVM,
+ 'mysql': MySQL,
+ 'openldap': OpenLDAP,
+ 'postgres-8': Postgres8,
+ 'tomcat-5': Tomcat5,
+ 'tomcat-6': Tomcat6,
+ 'fence_daemon': FenceDaemon,
+ 'multicast': Multicast,
+ 'clusterfs': Clusterfs,
+ 'netfs': Netfs,
+ 'script': Script,
+ 'nfsexport': NFSExport,
+ 'nfsclient': NFSClient,
+ 'nfsserver': NFSServer,
+ 'SAPDatabase': SAPDatabase,
+ 'SAPInstance': SAPInstance,
+ 'ASEHAagent': SybaseASE,
+ 'oracledb': OracleDB,
+}
###---Don't translate strings below---
CLUSTER_PTR_STR = "cluster"
@@ -125,30 +133,21 @@ FENCEDAEMON_PTR_STR = "fence_daemon"
SERVICE = "service"
VM = "vm"
FENCE_XVMD_STR = "fence_xvmd"
-GULM_TAG_STR = "gulm"
MCAST_STR = "multicast"
CMAN_PTR_STR = "cman"
TOTEM_PTR_STR = "totem"
QUORUMD_PTR_STR = "quorumd"
###-----------------------------------
-
-INVALID_GULM_COUNT = "GULM locking mechanism may consist of 1, 3, or 5 locking servers. You have configured %d. Fix the error and try saving again."
-
-
class ModelBuilder:
- def __init__(self, mcast_addr=None, domm=None, cluster_version=(3, 'Fedora')):
+ def __init__(self, domm=None, cluster_version=(3, 'Fedora')):
if domm is None:
raise Exception, 'No cluster configuration'
self.errors = False
self.errmsg = None
- self.lock_type = DLM_TYPE
- self.mcast_address = mcast_addr
- self.mcast_interface = None
self.mcast_ptr = None
self.cluster_ptr = None
- self.GULM_ptr = None
self.CMAN_ptr = None
self.TOTEM_ptr = None
self.logging_ptr = None
@@ -162,14 +161,8 @@ class ModelBuilder:
self.quorumd_ptr = None
self.fence_xvmd_ptr = None
self.unusual_items = list()
- self.isVirtualized = False
(self.cluster_version, self.cluster_os) = cluster_version
- if mcast_addr is None:
- self.usesMulticast = False
- else:
- self.usesMulticast = True
-
self.parent = domm
self.object_tree = self.buildModel(None)
self.check_empty_ptrs()
@@ -177,7 +170,6 @@ class ModelBuilder:
self.resolve_fence_instance_types()
self.purgePCDuplicates()
self.resolve_references()
- self.check_for_multicast()
self.check_for_nodeids()
def has_errors(self):
@@ -193,7 +185,6 @@ class ModelBuilder:
return self.cluster_os
def buildModel(self, parent_node, parent_object=None):
-
if parent_node is None:
parent_node = self.parent
@@ -242,15 +233,12 @@ class ModelBuilder:
self.fence_daemon_ptr = new_object
elif parent_node.nodeName == QUORUMD_PTR_STR:
self.quorumd_ptr = new_object
- elif parent_node.nodeName == GULM_TAG_STR:
- self.GULM_ptr = new_object
- self.lock_type = GULM_TYPE
elif parent_node.nodeName == CMAN_PTR_STR:
self.CMAN_ptr = new_object
elif parent_node.nodeName == TOTEM_PTR_STR:
self.TOTEM_ptr = new_object
elif parent_node.nodeName == MCAST_STR:
- self.usesMulticast = True
+ self.mcast_ptr = new_object
elif parent_node.nodeName == FENCE_XVMD_STR:
self.fence_xvmd_ptr = new_object
@@ -265,86 +253,6 @@ class ModelBuilder:
return (new_object)
- def buildDLMModelTemplate(self):
- obj_tree = Cluster()
- self.cluster_ptr = obj_tree
-
- obj_tree.addAttribute("name", "alpha_cluster")
- obj_tree.addAttribute("config_version", "1")
- fdp = FenceDaemon()
- obj_tree.addChild(fdp)
- self.fence_daemon_ptr = fdp
- cns = ClusterNodes()
- obj_tree.addChild(cns)
- self.clusternodes_ptr = cns
-
- cman = Cman()
- self.CMAN_ptr = cman
- obj_tree.addChild(cman)
-
- if self.usesMulticast is True:
- mcast = Multicast()
- mcast.addAttribute("addr", self.mcast_address)
- if self.mcast_interface is not None:
- mcast.addAttribute("interface", self.mcast_interface)
- cman.addChild(mcast)
- self.mcast_ptr = mcast
-
- fds = FenceDevices()
- obj_tree.addChild(fds)
- self.fencedevices_ptr = fds
-
- rm = Rm()
- obj_tree.addChild(rm)
- self.resourcemanager_ptr = rm
-
- fdoms = FailoverDomains()
- self.failoverdomains_ptr = fdoms
- rm.addChild(fdoms)
-
- rcs = Resources()
- rm.addChild(rcs)
- self.resources_ptr = rcs
-
- self.isModified = False
-
- return obj_tree
-
- def buildGULMModelTemplate(self):
- obj_tree = Cluster()
- self.cluster_ptr = obj_tree
-
- obj_tree.addAttribute("name", "alpha_cluster")
- obj_tree.addAttribute("config_version", "1")
- cns = ClusterNodes()
- obj_tree.addChild(cns)
- self.clusternodes_ptr = cns
-
- gulm = Gulm()
- self.GULM_ptr = gulm
- self.fence_daemon_ptr = None
- obj_tree.addChild(gulm)
-
- fds = FenceDevices()
- obj_tree.addChild(fds)
- self.fencedevices_ptr = fds
-
- rm = Rm()
- obj_tree.addChild(rm)
- self.resourcemanager_ptr = rm
-
- fdoms = FailoverDomains()
- self.failoverdomains_ptr = fdoms
- rm.addChild(fdoms)
-
- rcs = Resources()
- rm.addChild(rcs)
- self.resources_ptr = rcs
-
- self.isModified = False
-
- return obj_tree
-
def getFenceDeviceByName(self, name):
device = filter(lambda x: x.getName() == name, self.getFenceDevices())
num_fdevs = len(device)
@@ -479,7 +387,6 @@ class ModelBuilder:
self.resolve_fence_instance_types()
self.purgePCDuplicates()
self.resolve_references()
- self.check_for_multicast()
finally:
pass
@@ -521,7 +428,7 @@ class ModelBuilder:
for dex in dex_list:
found = False
for node in nodes:
- ndid = node.getAttribute('nodeid')
+ ndid = node.getNodeID()
if ndid is not None:
if ndid == dex:
found = True
@@ -534,15 +441,6 @@ class ModelBuilder:
else:
return dex
- def setIsVirtualized(self, isVirtualized):
- if isVirtualized is None:
- self.isVirtualized = False
- else:
- self.isVirtualized = isVirtualized
-
- def getIsVirtualized(self):
- return self.isVirtualized
-
def getNodes(self):
#Find the clusternodes obj and return get_children
return self.clusternodes_ptr.getChildren()
@@ -564,19 +462,12 @@ class ModelBuilder:
def addNode(self, clusternode):
self.clusternodes_ptr.addChild(clusternode)
- if self.usesMulticast is True:
- mcast = Multicast()
- mcast.addAttribute('addr', self.mcast_address)
- if self.mcast_interface is not None:
- mcast.addAttribute('interface', self.mcast_interface)
- clusternode.addChild(mcast)
self.isModified = True
def deleteNode(self, clusternode):
#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()
@@ -601,11 +492,6 @@ class ModelBuilder:
found_one = True
break
- lock_type = self.getLockType()
- if lock_type == GULM_TYPE:
- if self.isNodeLockserver(clusternode.getName()) is True:
- self.removeLockserver(clusternode)
-
self.isModified = True
def retrieveNodeByName(self, name):
@@ -640,12 +526,13 @@ class ModelBuilder:
self.cluster_ptr.removeChild(self.TOTEM_ptr)
self.TOTEM_ptr = None
- def addTotem(self, obj):
+ def addTotem(self):
self.del_totem()
if self.TOTEM_ptr is None:
- self.cluster_ptr.addChild(obj)
- self.TOTEM_ptr = obj
-
+ self.TOTEM_ptr = Totem()
+ self.cluster_ptr.addChild(self.TOTEM_ptr)
+ return self.TOTEM_ptr
+
def hasFenceXVM(self):
return self.fence_xvmd_ptr is not None
@@ -760,31 +647,10 @@ class ModelBuilder:
return
- def isMulticast(self):
- return self.usesMulticast
-
- def check_for_multicast(self):
- if self.usesMulticast is True:
- #set mcast address
- children = self.CMAN_ptr.getChildren()
- for child in children:
- if child.getTagName() == MCAST_STR:
- self.mcast_ptr = child
- addr = child.getAttribute("addr")
- if addr is not None:
- self.mcast_address = addr
- else: #What a mess! a multicast tag, but no addr attribute
- self.mcast_address = ""
- mcastif = child.getAttribute("interface")
- if mcastif is not None:
- self.mcast_interface = mcastif
- return
-
def getMcastAddr(self):
- return self.mcast_address
-
- def getMcastInterface(self):
- return self.mcast_interface
+ if self.mcast_ptr is not None:
+ return self.mcast_ptr.getAddr()
+ return None
def setQuorumd(self, qd):
cp = self.getClusterPtr()
@@ -836,7 +702,7 @@ class ModelBuilder:
self.resourcemanager_ptr.addChild(rcs)
self.resources_ptr = rcs
- if self.GULM_ptr is None and self.fence_daemon_ptr is None:
+ if self.fence_daemon_ptr is None:
fdp = FenceDaemon()
self.cluster_ptr.addChild(fdp)
self.fence_daemon_ptr = fdp
@@ -902,7 +768,7 @@ class ModelBuilder:
if not res or len(res) < 1:
raise KeyError, name
if len(res) > 1:
- raise Exception, 'More than one resource is named "%s"' % name
+ raise KeyError, 'More than one resource is named "%s"' % name
return res[0]
def deleteResource(self, name):
@@ -927,12 +793,6 @@ class ModelBuilder:
def setClusterConfigVersion(self, version):
return self.getClusterPtr().setConfigVersion(version)
- def getClusterAlias(self):
- return self.getClusterPtr().getAlias()
-
- def getGULMPtr(self):
- return self.GULM_ptr
-
def getCMANPtr(self):
return self.CMAN_ptr
@@ -942,166 +802,10 @@ class ModelBuilder:
def getLoggingPtr(self):
return self.logging_ptr
- def getLockServer(self, name):
- children = self.GULM_ptr.getChildren()
- for child in children:
- if child.getName() == name:
- return child
- return None
-
- def getLockType(self):
- return self.lock_type
-
- def isNodeLockserver(self, name):
- gptr = self.getGULMPtr()
- if gptr is None: #Obviously not GULM
- return False
- children = gptr.getChildren()
- for child in children:
- if child.getName() == name:
- return True
-
- return False
-
- def removeLockserver(self, clusternode):
- gptr = self.getGULMPtr()
- if gptr is None: #Obviously not GULM
- return
- children = gptr.getChildren()
- for child in children:
- if child.getName() == clusternode.getName():
- gptr.removeChild(child)
- break #Only one will be found
-
- self.isModified = True
-
- def switch_lockservers(self):
- #first get what type of locking is currently in place
- if self.lock_type == DLM_TYPE:
- #remove <cman>
- self.cluster_ptr.removeChild(self.CMAN_ptr)
- if self.TOTEM_ptr is not None:
- self.del_totem()
- self.CMAN_ptr = None
-
- #add gulm tag
- gulm = Gulm()
- self.GULM_ptr = gulm
- self.cluster_ptr.addChild(gulm)
-
- #check for multicast
- #if multicast, remove <multicast> from each node
- #remove votes attr from each node
- nodes = self.getNodes()
- for node in nodes:
- if self.usesMulticast is True:
- mnode = node.getMulticastNode()
- if mnode is not None:
- node.removeChild(mnode)
- node.removeAttribute('votes')
-
- self.usesMulticast = None
- self.mcast_address = None
- self.mcast_interface = None
- self.mcast_ptr = None
-
- #reset self.lock_type
- self.lock_type = GULM_TYPE
-
- #make the first node a lockserver
- nodes = self.getNodes()
- for node in nodes:
- ls = Lockserver()
- ls.addAttribute('name', node.getName())
- self.GULM_ptr.addChild(ls)
- break
-
-
- #set modified
- self.isModified = True
-
- else:
- #remove <gulm> tag
- children = self.cluster_ptr.getChildren()
- for child in children:
- if child.getTagName() == "gulm":
- self.cluster_ptr.removeChild(child)
- break
-
- #set gulm pointer to None
- self.GULM_ptr = None
-
- #add <cman> tag
- cman = Cman()
- self.CMAN_ptr = cman
- self.cluster_ptr.addChild(cman)
-
- #reset self.lock_type
- self.lock_type = DLM_TYPE
-
- #give each node a vote of 1
- nds = self.getNodes()
- for nd in nds:
- nd.addAttribute('votes', '1')
-
- #set modified
- self.isModified = True
-
- def set_nodes_multicast(self, mcast_addr, mcast_if=None):
- for node in iter(self.getNodes()):
- new_mcast_tag = True
- mcast = None
-
- for node_child in iter(node.getChildren()):
- if node_child.getTagName() == MCAST_STR:
- mcast = node_child
- new_mcast_tag = False
- break
-
- if mcast is None:
- mcast = Multicast()
-
- mcast.addAttribute('addr', mcast_addr)
- if mcast_if:
- mcast.addAttribute('interface', mcast_if)
- else:
- try:
- mcast.removeAttribute('interface')
- except:
- pass
-
- if new_mcast_tag is True:
- node.addChild(mcast)
-
- def set_cluster_multicast(self, mcast_addr, mcast_if=None):
- if not self.CMAN_ptr:
- return False
-
- if self.mcast_ptr is None:
- mcast = Multicast()
- self.CMAN_ptr.addChild(mcast)
- self.mcast_ptr = mcast
- else:
- mcast = self.mcast_ptr
-
- mcast.addAttribute('addr', mcast_addr)
- self.mcast_address = mcast_addr
- self.mcast_interface = mcast_if
- self.usesMulticast = True
- self.set_nodes_multicast(mcast_addr, mcast_if=mcast_if)
- self.isModified = True
-
- def del_nodes_multicast(self):
- for node in iter(self.getNodes()):
- for node_child in iter(node.getChildren()):
- if node_child.getTagName() == MCAST_STR:
- node.removeChild(node_child)
- break
-
def set_cluster_broadcast(self):
if self.del_cluster_multicast() is False:
return False
- self.CMAN_ptr.addAttribute('broadcast', 'yes')
+ return self.CMAN_ptr.setBroadcast(True)
def del_cluster_broadcast(self):
if self.CMAN_ptr is None:
@@ -1112,34 +816,28 @@ class ModelBuilder:
def get_cluster_broadcast(self):
if self.CMAN_ptr is None:
return False
- broadcast = self.CMAN_ptr.getAttribute('broadcast')
- if broadcast and broadcast.lower() in ('1', 'true', 'yes'):
- return True
- return False
+ return self.CMAN_ptr.getBroadcast()
+
+ def set_cluster_multicast(self, mcast_addr=None):
+ self.del_cluster_broadcast()
+ if mcast_addr is not None:
+ if self.mcast_ptr is None:
+ self.mcast_ptr = Multicast()
+ self.CMAN_ptr.appendChild(self.mcast_ptr)
+ self.mcast_ptr.setAddr(mcast_addr)
def del_cluster_multicast(self):
if self.CMAN_ptr is None:
- return False
-
- for child in iter(self.CMAN_ptr.getChildren()):
- if child.getTagName() == MCAST_STR:
- self.CMAN_ptr.removeChild(child)
-
- self.mcast_ptr = None
- self.usesMulticast = False
- self.mcast_address = None
- self.mcast_interface = None
- self.del_nodes_multicast()
- self.isModified = True
+ return True
- def swap_multicast_state(self, address=None, mcast_if=None):
- if self.usesMulticast is True:
- self.del_cluster_multicast()
- else:
- self.set_cluster_multicast(address, mcast_if)
+ if self.mcast_ptr is not None:
+ self.CMAN_ptr.removeChild(mcast_ptr)
+ self.mcast_ptr = None
+ self.isModified = True
+ return True
def check_fence_daemon(self):
- if self.GULM_ptr is None and self.fence_daemon_ptr is None:
+ if self.fence_daemon_ptr is None:
self.fence_daemon_ptr = FenceDaemon()
self.cluster_ptr.addChild(self.fence_daemon_ptr)
@@ -1192,6 +890,7 @@ class ModelBuilder:
def removeReferences(self, tagobj):
self.__removeReferences(tagobj, self.cluster_ptr)
+
def __removeReferences(self, tagobj, level):
for t in level.getChildren()[:]:
if t.isRefObject():
@@ -1224,6 +923,7 @@ class ModelBuilder:
def updateReferences(self):
self.__updateReferences(self.cluster_ptr)
+
def __updateReferences(self, level):
for t in level.getChildren():
if t.isRefObject():
@@ -1232,40 +932,27 @@ class ModelBuilder:
def perform_final_check(self):
self.check_two_node()
- if self.check_gulm_count() is False:
- return False
-
- #add more checks
-
- return True
-
- def check_gulm_count(self):
- if self.getLockType() == GULM_TYPE:
- gulm_count = len(self.getGULMPtr().getChildren())
- if not (gulm_count in (1, 3, 5)):
- return False
return True
def check_two_node(self):
- if self.getLockType() == DLM_TYPE:
- clusternodes_count = len(self.getNodes())
- #Make certain that there is a cman tag in the file
- #If missing, it will not hurt to add it here
- if self.CMAN_ptr is None:
+ clusternodes_count = len(self.getNodes())
+ # Make certain that there is a cman tag in the file
+ # If missing, it will not hurt to add it here
+ if self.CMAN_ptr is None:
cman = Cman()
self.cluster_ptr.addChild(cman)
self.CMAN_ptr = cman
- if self.isQuorumd():
+ if self.isQuorumd():
self.CMAN_ptr.removeAttribute('two_node')
self.CMAN_ptr.addAttribute('expected_votes', str(self.get_expected_votes()))
- else:
+ else:
if clusternodes_count == 2:
- self.CMAN_ptr.addAttribute('two_node', '1')
- self.CMAN_ptr.addAttribute('expected_votes', '1')
+ self.CMAN_ptr.addAttribute('two_node', '1')
+ self.CMAN_ptr.addAttribute('expected_votes', '1')
else:
- self.CMAN_ptr.removeAttribute('two_node')
- self.CMAN_ptr.removeAttribute('expected_votes')
+ self.CMAN_ptr.removeAttribute('two_node')
+ self.CMAN_ptr.removeAttribute('expected_votes')
def dual_power_fence_check(self):
# if 2 or more power controllers reside in the same fence level,
@@ -1325,9 +1012,3 @@ class ModelBuilder:
break
if found_one is True:
break
-
- def searchObjectTree(self, tagtype):
- objlist = list()
- self.object_tree.searchTree(objlist, tagtype)
-
- return objlist
diff --git a/luci/lib/db_helpers.py b/luci/lib/db_helpers.py
index 7322a51..0d3999e 100644
--- a/luci/lib/db_helpers.py
+++ b/luci/lib/db_helpers.py
@@ -110,7 +110,7 @@ def get_model_for_cluster(cluster_name, rc=None):
from luci.lib.ClusterConf.ModelBuilder import ModelBuilder
conf = rq.getClusterConf(rc)
if conf is not None:
- model = ModelBuilder(None, conf, rc.cluster_version())
+ model = ModelBuilder(conf, rc.cluster_version())
return model
except Exception, e:
log.exception("Error getting cluster configuration for %s: %s"
diff --git a/luci/templates/configure.html b/luci/templates/configure.html
index 0c6c9d7..3bace6d 100644
--- a/luci/templates/configure.html
+++ b/luci/templates/configure.html
@@ -92,20 +92,25 @@
<form action="${tg.url(configure_cmd)}" method="post">
<input type="hidden" name="page" value="Network"/>
<h2>Network Configuration</h2>
- <div class="row">
+ <div class="row"
+ py:with="
+ uses_broadcast = cluster_data.get_cluster_broadcast();
+ multicast_addr = cluster_data and cluster_data.getMcastAddr()">
<input name="multicast" value="multicast" class="radio" type="radio"
- py:attrs="cluster_data and cluster_data.getMcastAddr() == None and {'checked': 'checked'} or {}"/>
+ py:attrs="(uses_broadcast is not True and multicast_addr is None) and {'checked': 'checked'} or {}"/>
<label class="choice">Let cluster choose the multicast address</label>
<br />
+
<input name="multicast" value="multicast_manual" class="radio" type="radio"
- py:attrs="cluster_data and cluster_data.getMcastAddr() != None and {'checked': 'checked'} or {}"/>
+ py:attrs="(uses_broadcast is not True and multicast_addr is not None) and {'checked': 'checked'} or {}"/>
<label class="choice">Specify the multicast address manually</label>
<br />
- <label class=" indent">Multicast address</label>
+
+ <label class="indent">Multicast address</label>
<input type="text" class="text" name="mcast_address" value="${cluster_data and cluster_data.getMcastAddr()}"/>
<br />
<input name="multicast" value="broadcast" class="radio" type="radio"
- py:attrs="cluster_data and cluster_data.get_cluster_broadcast() is True and {'checked': 'checked'} or {}"/>
+ py:attrs="uses_broadcast is True and {'checked': 'checked'} or {}"/>
<label class="choice">Use broadcast (demos only - no production support)</label>
</div>
<div class="row"><div id="button"><button class="button small silver">Show Advanced Properties</button></div>
@@ -114,7 +119,7 @@
<div id="advanced"
py:with="totem=cluster_data and cluster_data.getTotemPtr()">
<div class="row"><label>Token Timeout (ms)</label><input name="token_timeout" class="text" type="text" py:attrs="totem and { 'value': totem.getTokenTimeout() } or {'value': totem_defaults.get('token')}"/></div>
- <div class="row"><label>Number of token retransmits</label><input name="token_retransmits" class="text" type="text" py:attrs="totem and { 'value': totem.getTokenRetransmits() } or {'value': totem_defaults.get('token')}"/></div>
+ <div class="row"><label>Number of token retransmits</label><input name="token_retransmits" class="text" type="text" py:attrs="totem and { 'value': totem.getTokenRetransmits() } or {'value': totem_defaults.get('token_retransmits_before_loss_const')}"/></div>
<div class="row"><label>Join Timeout (ms)</label><input name="join_timeout" class="text" type="text" py:attrs="totem and { 'value': totem.getJoinTimeout() } or {'value': totem_defaults.get('join')}"/></div>
<div class="row"><label>Consensus Timeout (ms)</label><input name="consensus_timeout" class="text" type="text" py:attrs="totem and { 'value': totem.getConsensusTimeout() } or {'value': totem_defaults.get('consensus')}"/></div>
</div>
diff --git a/luci/widget_validators/validate_cluster_prop.py b/luci/widget_validators/validate_cluster_prop.py
index 9c74527..7b2481f 100644
--- a/luci/widget_validators/validate_cluster_prop.py
+++ b/luci/widget_validators/validate_cluster_prop.py
@@ -397,7 +397,7 @@ def validate_cluster_config_form(model, **kw):
totem = model.getTotemPtr()
if totem is None:
- totem = model.addTotemPtr()
+ totem = model.addTotem()
join_timeout = kw.get('join_timeout')
if join_timeout:
@@ -408,8 +408,8 @@ def validate_cluster_config_form(model, **kw):
except:
errors.append(_('Invalid value for totem join timeout : %s') % join_timeout)
else:
- if int(join_timeout) != Totem.JOIN_TIMEOUT:
- totem.addAttribute('join', join_timeout)
+ if int(join_timeout) != Totem.DEFAULTS.get('join'):
+ totem.setJoinTimeout(join_timeout)
else:
totem.removeAttribute('join')
@@ -422,8 +422,8 @@ def validate_cluster_config_form(model, **kw):
except:
errors.append(_('Invalid value for totem token timeout : %s') % token_timeout)
else:
- if int(token_timeout) != Totem.TOKEN_TIMEOUT:
- totem.addAttribute('token', token_timeout)
+ if token_timeout != Totem.DEFAULTS.get('token'):
+ totem.setTokenTimeout(token_timeout)
else:
totem.removeAttribute('token')
@@ -436,8 +436,8 @@ def validate_cluster_config_form(model, **kw):
except:
errors.append(_('Invalid value for totem token retransmits before loss: %s') % token_retransmits)
else:
- if int(token_retransmits) != Totem.TOKEN_RETRANSMITS_BEFORE_LOSS:
- totem.addAttribute('token_retransmits_before_loss_const', token_retransmits)
+ if token_retransmits != Totem.DEFAULTS.get('token_retransmits_before_loss_const'):
+ totem.setTokenRetransmits(token_retransmits)
else:
totem.removeAttribute('token_retransmits_before_loss_const')
@@ -450,8 +450,8 @@ def validate_cluster_config_form(model, **kw):
except:
errors.append(_('Invalid value for totem consensus timeout : %s') % consensus_timeout)
else:
- if int(consensus_timeout) != Totem.CONSENSUS_TIMEOUT:
- totem.addAttribute('consensus', consensus_timeout)
+ if consensus_timeout != Totem.DEFAULTS.get('consensus'):
+ totem.setConsensusTimeout(consensus_timeout)
else:
totem.removeAttribute('consensus')
13 years, 7 months
[luci] Add setters and getters for the attributes of the altname element
by Ryan McCabe
commit 6f2ff20598599763580e6f12605ad408e8108c9c
Author: Ryan McCabe <rmccabe(a)redhat.com>
Date: Fri Oct 22 00:29:30 2010 -0400
Add setters and getters for the attributes of the altname element
luci/lib/ClusterConf/Altname.py | 20 +++++++++++++++++++-
1 files changed, 19 insertions(+), 1 deletions(-)
---
diff --git a/luci/lib/ClusterConf/Altname.py b/luci/lib/ClusterConf/Altname.py
index 8474afd..48bb221 100644
--- a/luci/lib/ClusterConf/Altname.py
+++ b/luci/lib/ClusterConf/Altname.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2007-2009 Red Hat, Inc.
+# Copyright (C) 2007-2010 Red Hat, Inc.
#
# This program is free software; you can redistribute
# it and/or modify it under the terms of version 2 of the
@@ -13,3 +13,21 @@ class Altname(TagObject):
def __init__(self):
TagObject.__init__(self)
self.TAG_NAME = TAG_NAME
+
+ def getAddr(self):
+ return self.attr_hash.get('name')
+
+ def setAddr(self, val):
+ return self.addAttribute('name', val)
+
+ def getPort(self):
+ return self.getAttribute('port')
+
+ def setPort(self, val):
+ return self.addIntegerAttribute('port', val, (1, 0xffff))
+
+ def getMcast(self):
+ return self.getAttribute('mcast')
+
+ def setMcast(self, val):
+ return self.addAttribute('mcast', val)
13 years, 7 months
[luci] Clean up the clusternode and multicast tags.
by Ryan McCabe
commit 718d7b586888d0bb2465742ffceb78c9fbb88df2
Author: Ryan McCabe <rmccabe(a)redhat.com>
Date: Thu Oct 21 21:21:44 2010 -0400
Clean up the clusternode and multicast tags.
- Add support for getting/setting all attributes.
- Remove RHEL4 legacy bits
luci/lib/ClusterConf/ClusterNode.py | 72 +++++++++++------------------------
luci/lib/ClusterConf/Multicast.py | 8 +++-
luci/templates/node.html | 10 ++--
3 files changed, 34 insertions(+), 56 deletions(-)
---
diff --git a/luci/lib/ClusterConf/ClusterNode.py b/luci/lib/ClusterConf/ClusterNode.py
index 00a486a..9eb1665 100644
--- a/luci/lib/ClusterConf/ClusterNode.py
+++ b/luci/lib/ClusterConf/ClusterNode.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2006-2009 Red Hat, Inc.
+# Copyright (C) 2006-2010 Red Hat, Inc.
#
# This program is free software; you can redistribute
# it and/or modify it under the terms of version 2 of the
@@ -17,7 +17,7 @@ class ClusterNode(TagObject):
def getFenceNode(self):
ret = None
- for child in self.getChildren():
+ for child in self.children:
if child.getTagName() == 'fence':
ret = child
break
@@ -31,68 +31,40 @@ class ClusterNode(TagObject):
# fence levels
return self.getFenceNode().getChildren()
- def getMulticastNode(self):
- children = self.getChildren()
- for child in children:
- if child.getTagName() == "multicast":
- return child
-
- return None
-
- def getInterface(self):
- nd = self.getMulticastNode()
- if nd is None:
- return None
- else:
- return nd.getAttribute("interface")
-
- def setInterface(self, ifc):
- nd = self.getMulticastNode()
- if nd is None:
- return
- else:
- nd.addAttribute("interface", ifc)
+ def getVotes(self):
+ votes = self.getAttribute('votes')
+ if votes is None:
+ return '1'
+ return votes
- def isFenced(self):
- fence_sum = 0
- flevels = self.getFenceLevels()
- if len(flevels) == 0:
- return False
+ def setVotes(self, val):
+ return self.addIntegerAttribute('votes', val, (1, None))
- for flevel in flevels:
- fence_sum = fence_sum + len(flevel.getChildren())
+ def getNodeID(self):
+ return self.getAttribute('nodeid')
- if fence_sum > 0:
- return True
- else:
- return False
+ def setNodeID(self, val):
+ return self.addIntegerAttribute('nodeid', val, (1, None))
- def getVotes(self):
- try:
- return self.getAttribute('votes')
- except KeyError, e:
- return "1"
- except:
- return None
+ # Cluster2/RHEL5 only
+ def getIfname(self):
+ self.getAttribute('ifname')
- def getID(self):
- try:
- return self.getAttribute('nodeid')
- except Exception, e:
- pass
- return "UNKNOWN"
+ # Cluster2/RHEL5 only
+ def setIfname(self, val):
+ self.addAttribute('ifname', val)
def removeFenceInstance(self, method, instance):
"""Remove fence instance from this node and given fence method."""
- for child in self.getChildren():
+ for child in self.children:
if child.getTagName() == 'unfence':
unfence = child
- for child_device in unfence.getChildren():
+ for child_device in unfence.children:
# Try to find existing unfence device that mirrored fence device instance
# to be removed and remove it, too.
if len(set(instance.getAttributes().items()).difference(child_device.getAttributes().items())) == 0:
unfence.removeChild(child_device)
- if len(unfence.getChildren()) == 0:
+ if len(unfence.children) == 0:
# Remove the whole 'unfence' section from within 'node' section
# if it is empty.
self.removeChild(unfence)
diff --git a/luci/lib/ClusterConf/Multicast.py b/luci/lib/ClusterConf/Multicast.py
index 1926dcc..3806f10 100644
--- a/luci/lib/ClusterConf/Multicast.py
+++ b/luci/lib/ClusterConf/Multicast.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2006-2009 Red Hat, Inc.
+# Copyright (C) 2006-2010 Red Hat, Inc.
#
# This program is free software; you can redistribute
# it and/or modify it under the terms of version 2 of the
@@ -13,3 +13,9 @@ class Multicast(TagObject):
def __init__(self):
TagObject.__init__(self)
self.TAG_NAME = TAG_NAME
+
+ def getAddr(self):
+ return self.getAttribute('addr')
+
+ def setAddr(self, val):
+ return self.addAttribute('addr', val)
diff --git a/luci/templates/node.html b/luci/templates/node.html
index 04de0b0..dbbcb5b 100644
--- a/luci/templates/node.html
+++ b/luci/templates/node.html
@@ -93,7 +93,7 @@
<span class="entity_ok">${entity_name}</span>
</a>
</td>
- <td class="node_tlist_id">${nodeobj and nodeobj.getID()}</td>
+ <td class="node_tlist_id">${nodeobj and nodeobj.getNodeID()}</td>
<td class="node_tlist_votes">${nodeobj and nodeobj.getVotes()}</td>
<td class="node_tlist_status">${_('Cluster Member')}</td>
<td class="node_tlist_uptime">${node_data and node_data.uptime_str}</td>
@@ -108,7 +108,7 @@
<span class="entity_fail">${entity_name}</span>
</a>
</td>
- <td class="node_tlist_id">${nodeobj and nodeobj.getID()}</td>
+ <td class="node_tlist_id">${nodeobj and nodeobj.getNodeID()}</td>
<td class="node_tlist_votes">${nodeobj and nodeobj.getVotes()}</td>
<td class="node_tlist_status">${_('Not a cluster member')}</td>
<td class="node_tlist_uptime">${node_data and node_data.uptime_str}</td>
@@ -123,7 +123,7 @@
<span class="entity_unknown">${entity_name}</span>
</a>
</td>
- <td class="node_tlist_id">${nodeobj and nodeobj.getID()}</td>
+ <td class="node_tlist_id">${nodeobj and nodeobj.getNodeID()}</td>
<td class="node_tlist_votes">${nodeobj and nodeobj.getVotes()}</td>
<td class="node_tlist_status">${_('The status of this node is unknown')}</td>
<td class="node_tlist_uptime">${node_data and node_data.uptime_str}</td>
@@ -137,7 +137,7 @@
<span class="entity_fail">${entity_name}</span>
</a>
</td>
- <td class="node_tlist_id">${nodeobj and nodeobj.getID()}</td>
+ <td class="node_tlist_id">${nodeobj and nodeobj.getNodeID()}</td>
<td class="node_tlist_votes">${nodeobj and nodeobj.getVotes()}</td>
<td class="node_tlist_status">${_('Node is being removed')}</td>
<td class="node_tlist_uptime"></td>
@@ -284,7 +284,7 @@
</td>
<td class="node_tfdoms_priority">
<py:if test="fdom.getOrdered()">
- ${fdom.get_member_node(name).getAttribute('priority')}
+ ${fdom.get_member_node(name).getPriority()}
</py:if>
</td>
</tr>
13 years, 7 months