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')