From mboxrd@z Thu Jan 1 00:00:00 1970 From: rmccabe@sourceware.org Date: 8 May 2007 22:19:38 -0000 Subject: [Cluster-devel] conga/luci/site/luci/Extensions LuciDB.py Luci ... Message-ID: <20070508221938.28498.qmail@sourceware.org> List-Id: To: cluster-devel.redhat.com MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit CVSROOT: /cvs/cluster Module name: conga Branch: EXPERIMENTAL Changes by: rmccabe at sourceware.org 2007-05-08 22:19:35 Modified files: luci/site/luci/Extensions: LuciDB.py LuciZope.py cluster_adapters.py Added files: luci/site/luci/Extensions: LuciClusterActions.py LuciClusterInfo.py Removed files: luci/site/luci/Extensions: clusterOS.py Log message: cleanup and refactor, part 3 Patches: http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/LuciClusterActions.py.diff?cvsroot=cluster&only_with_tag=EXPERIMENTAL&r1=NONE&r2=1.1.2.1 http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/LuciClusterInfo.py.diff?cvsroot=cluster&only_with_tag=EXPERIMENTAL&r1=NONE&r2=1.1.2.1 http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/LuciDB.py.diff?cvsroot=cluster&only_with_tag=EXPERIMENTAL&r1=1.1.2.2&r2=1.1.2.3 http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/LuciZope.py.diff?cvsroot=cluster&only_with_tag=EXPERIMENTAL&r1=1.1.2.1&r2=1.1.2.2 http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/cluster_adapters.py.diff?cvsroot=cluster&only_with_tag=EXPERIMENTAL&r1=1.255.2.2&r2=1.255.2.3 http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/clusterOS.py.diff?cvsroot=cluster&only_with_tag=EXPERIMENTAL&r1=1.3&r2=NONE --- conga/luci/site/luci/Extensions/Attic/LuciDB.py 2007/05/04 19:10:24 1.1.2.2 +++ conga/luci/site/luci/Extensions/Attic/LuciDB.py 2007/05/08 22:19:35 1.1.2.3 @@ -1,5 +1,5 @@ from AccessControl import getSecurityManager -from conga_constants import CLUSTER_FOLDER_PATH, BATCH_ID, TASKTYPE, FLAG_DESC, CLUSTER_ADD, CLUSTER_NODE_ADDED, CLUSTER_NODE_NEED_AUTH, LAST_STATUS, PLONE_ROOT, STORAGE_FOLDER_PATH +from conga_constants import CLUSTER_FOLDER_PATH, BATCH_ID, TASKTYPE, FLAG_DESC, CLUSTER_ADD, CLUSTER_NODE_ADDED, CLUSTER_NODE_NEED_AUTH, LAST_STATUS, PLONE_ROOT, STORAGE_FOLDER_PATH, CLUSTER_NODE_NOT_MEMBER import RicciQuery as rq from ricci_communicator import RicciCommunicator from LuciZope import isAdmin @@ -10,22 +10,22 @@ try: cluster_node = self.restrictedTraverse('%s%s/%s' % (CLUSTER_FOLDER_PATH, clustername, nodename)) if not cluster_node: - raise Exception, 'cluster node is none' + return None return cluster_node except Exception, e: - luci_log.debug_verbose('getClusterNode0: %s %s: %s' \ - % (nodename, clustername, str(e))) - return None + luci_log.debug_verbose('getClusterNode0: %s %s: %r' \ + % (nodename, clustername, e)) + return None def getStorageNode(self, nodename): try: storage_node = self.restrictedTraverse('%s%s' % (STORAGE_FOLDER_PATH, nodename)) if not storage_node: - raise Exception, 'storage node is none' + return None return storage_node except Exception, e: - luci_log.debug_verbose('getStorageNode0: %s: %s' % (nodename, str(e))) - return None + luci_log.debug_verbose('getStorageNode0: %s: %r' % (nodename, e)) + return None def testNodeFlag(node, flag_mask): try: @@ -34,7 +34,7 @@ return False return flags & flag_mask != 0 except Exception, e: - luci_log.debug_verbose('testNodeFlag0: %s' % str(e)) + luci_log.debug_verbose('testNodeFlag0: %r' % e) return False def setNodeFlag(node, flag_mask): @@ -47,7 +47,7 @@ try: node.manage_addProperty('flags', flag_mask, 'int') except Exception, e: - luci_log.debug_verbose('setNodeFlag0: %s' % str(e)) + luci_log.debug_verbose('setNodeFlag0: %r' % e) def delNodeFlag(node, flag_mask): try: @@ -57,7 +57,7 @@ if flags & flag_mask != 0: node.manage_changeProperties({ 'flags': flags & ~flag_mask }) except Exception, e: - luci_log.debug_verbose('delNodeFlag0: %s' % str(e)) + luci_log.debug_verbose('delNodeFlag0: %r' % e) def set_node_flag(self, cluname, agent, batchid, task, desc): path = '%s%s' % (CLUSTER_FOLDER_PATH, cluname) @@ -74,16 +74,16 @@ flag.manage_addProperty(TASKTYPE, task, 'string') flag.manage_addProperty(FLAG_DESC, desc, 'string') except Exception, e: - errmsg = 'SNF0: error creating flag (%s,%s,%s) at %s: %s' \ - % (batch_id, task, desc, objpath, str(e)) + errmsg = 'SNF0: error creating flag (%s,%s,%s) at %s: %r' \ + % (batch_id, task, desc, objpath, e) luci_log.debug_verbose(errmsg) raise Exception, errmsg def noNodeFlagsPresent(self, nodefolder, flagname, hostname): try: items = nodefolder.objectItems('ManagedSystem') - except: - luci_log.debug('NNFP0: error getting flags for %s' % nodefolder[0]) + except Exception, e: + luci_log.debug('NNFP0: error getting flags for %s: %r' % (nodefolder[0], e)) return None for item in items: @@ -95,7 +95,7 @@ # hostname must be a FQDN rc = RicciCommunicator(hostname) except Exception, e: - luci_log.info('NNFP1: ricci error %s: %s' % (hostname, str(e))) + luci_log.info('NNFP1: ricci error %s: %r' % (hostname, e)) return None if not rc.authed(): @@ -114,8 +114,8 @@ try: nodefolder.manage_delObjects([item[0]]) except Exception, e: - luci_log.info('NNFP3: manage_delObjects for %s failed: %s' \ - % (item[0], str(e))) + luci_log.info('NNFP3: manage_delObjects for %s failed: %r' \ + % (item[0], e)) return None return True else: @@ -130,8 +130,8 @@ clusterfolder = self.restrictedTraverse(path) objs = clusterfolder.objectItems('Folder') except Exception, e: - luci_log.debug_verbose('RNN0: error for %s/%s: %s' \ - % (nodename, clustername, str(e))) + luci_log.debug_verbose('RNN0: error for %s/%s: %r' \ + % (nodename, clustername, e)) return nodename for obj in objs: @@ -151,8 +151,8 @@ if not mb_nodes or not len(mb_nodes): raise Exception, 'node list is empty' except Exception, e: - luci_log.debug_verbose('RCC0: no model builder nodes found for %s: %s' \ - % (str(e), clusterName)) + luci_log.debug_verbose('RCC0: no model builder nodes found for %s: %r' \ + % (clusterName, e)) return 'Unable to find cluster nodes for %s' % clusterName try: @@ -160,8 +160,8 @@ if not cluster_node: raise Exception, 'cluster node is none' except Exception, e: - luci_log.debug('RCC1: cant find cluster node for %s: %s' - % (clusterName, str(e))) + luci_log.debug('RCC1: cant find cluster node for %s: %r' + % (clusterName, e)) return 'Unable to find an entry for %s in the Luci database.' % clusterName try: @@ -170,7 +170,7 @@ raise Exception, 'no database nodes' except Exception, e: # Should we just create them all? Can this even happen? - luci_log.debug('RCC2: error: %s' % str(e)) + luci_log.debug('RCC2: error: %r' % e) return 'Unable to find database entries for any nodes in %s' % clusterName same_host = lambda x, y: x == y or x[:len(y) + 1] == y + '.' or y[:len(x) + 1] == x + '.' @@ -206,7 +206,7 @@ messages.append('Node "%s" is no longer in a member of cluster "%s." It has been deleted from the management interface for this cluster.' % (i, clusterName)) luci_log.debug_verbose('VCC3: deleted node %s' % i) except Exception, e: - luci_log.debug_verbose('VCC4: delObjects: %s: %s' % (i, str(e))) + luci_log.debug_verbose('VCC4: delObjects: %s: %r' % (i, e)) new_flags = CLUSTER_NODE_NEED_AUTH | CLUSTER_NODE_ADDED for i in new_list: @@ -217,8 +217,8 @@ messages.append('A new cluster node, "%s," is now a member of cluster "%s." It has been added to the management interface for this cluster, but you must authenticate to it in order for it to be fully functional.' % (i, clusterName)) except Exception, e: messages.append('A new cluster node, "%s," is now a member of cluster "%s,". but it has not been added to the management interface for this cluster as a result of an error creating a database entry for it.' % (i, clusterName)) - luci_log.debug_verbose('VCC5: addFolder: %s/%s: %s' \ - % (clusterName, i, str(e))) + luci_log.debug_verbose('VCC5: addFolder: %s/%s: %r' \ + % (clusterName, i, e)) return messages @@ -228,7 +228,7 @@ try: clusterfolder = self.restrictedTraverse(path) except Exception, e: - luci_log.debug_verbose('buildCCF0: no cluster folder at %s' % path) + luci_log.debug_verbose('buildCCF0: no cluster folder at %s: %r' % (path, e)) return None for key in batch_map.keys(): @@ -248,8 +248,8 @@ flag.manage_addProperty(FLAG_DESC, 'Creating node "%s" for cluster "%s"' % (key, clusterName), 'string') flag.manage_addProperty(LAST_STATUS, 0, 'int') except Exception, e: - luci_log.debug_verbose('buildCCF1: error creating flag for %s: %s' \ - % (key, str(e))) + luci_log.debug_verbose('buildCCF1: error creating flag for %s: %r' \ + % (key, e)) def manageCluster(self, clusterName, node_list, cluster_os): clusterName = str(clusterName) @@ -259,7 +259,7 @@ if not clusters: raise Exception, 'cannot find the cluster entry in the DB' except Exception, e: - luci_log.debug_verbose('MC0: %s: %s' % (clusterName, str(e))) + luci_log.debug_verbose('MC0: %s: %r' % (clusterName, e)) return 'Unable to create cluster %s: the cluster directory is missing.' % clusterName try: @@ -276,25 +276,25 @@ if not newCluster: raise Exception, 'unable to create the cluster DB entry for %s' % clusterName except Exception, e: - luci_log.debug_verbose('MC2: %s: %s' % (clusterName, str(e))) - return 'Unable to create cluster %s: %s' % (clusterName, str(e)) + luci_log.debug_verbose('MC2: %s: %r' % (clusterName, e)) + return 'Unable to create cluster %s: %r' % (clusterName, e) try: newCluster.manage_acquiredPermissions([]) newCluster.manage_role('View', ['Access Contents Information', 'View']) except Exception, e: - luci_log.debug_verbose('MC3: %s: %s' % (clusterName, str(e))) + luci_log.debug_verbose('MC3: %s: %r' % (clusterName, e)) try: clusters.manage_delObjects([clusterName]) except Exception, e: - luci_log.debug_verbose('MC4: %s: %s' % (clusterName, str(e))) - return 'Unable to set permissions on new cluster: %s: %s' % (clusterName, str(e)) + luci_log.debug_verbose('MC4: %s: %r' % (clusterName, e)) + return 'Unable to set permissions on new cluster: %s: %r' % (clusterName, e) try: newCluster.manage_addProperty('cluster_os', cluster_os, 'string') except Exception, e: - luci_log.debug_verbose('MC5: %s: %s: %s' \ - % (clusterName, cluster_os, str(e))) + luci_log.debug_verbose('MC5: %s: %s: %r' \ + % (clusterName, cluster_os, e)) for i in node_list: host = node_list[i]['host'] @@ -310,21 +310,21 @@ try: clusters.manage_delObjects([clusterName]) except Exception, e: - luci_log.debug_verbose('MC6: %s: %s: %s' \ - % (clusterName, host, str(e))) + luci_log.debug_verbose('MC6: %s: %s: %r' \ + % (clusterName, host, e)) - luci_log.debug_verbose('MC7: %s: %s: %s' \ - % (clusterName, host, str(e))) - return 'Unable to create cluster node %s for cluster %s: %s' \ - % (host, clusterName, str(e)) + luci_log.debug_verbose('MC7: %s: %s: %r' \ + % (clusterName, host, e)) + return 'Unable to create cluster node %s for cluster %s: %r' \ + % (host, clusterName, e) try: ssystem = self.restrictedTraverse(STORAGE_FOLDER_PATH) if not ssystem: raise Exception, 'The storage DB entry is missing' except Exception, e: - luci_log.debug_verbose('MC8: %s: %s: %s' % (clusterName, host, str(e))) - return 'Error adding storage node %s: %s' % (host, str(e)) + luci_log.debug_verbose('MC8: %s: %s: %r' % (clusterName, host, e)) + return 'Error adding storage node %s: %r' % (host, e) # Only add storage systems if the cluster and cluster node DB # objects were added successfully. @@ -344,7 +344,7 @@ newSystem.manage_acquiredPermissions([]) newSystem.manage_role('View', [ 'Access contents information' , 'View' ]) except Exception, e: - luci_log.debug_verbose('MC9: %s: %s: %s' % (clusterName, host, str(e))) + luci_log.debug_verbose('MC9: %s: %s: %r' % (clusterName, host, e)) def createClusterSystems(self, clusterName, node_list): try: @@ -352,7 +352,7 @@ if not clusterObj: raise Exception, 'cluster %s DB entry is missing' % clusterName except Exception, e: - luci_log.debug_verbose('CCS0: %s: %s' % (clusterName, str(e))) + luci_log.debug_verbose('CCS0: %s: %r' % (clusterName, e)) return 'No cluster named "%s" is managed by Luci' % clusterName for x in node_list: @@ -362,7 +362,8 @@ try: clusterObj.manage_addFolder(host, '__luci__:csystem:%s' % clusterName) except Exception, e: - luci_log.debug_verbose('CCS0a: %s: %s: %s' % (clusterName, host, str(e))) + luci_log.debug_verbose('CCS0a: %s: %s: %r' % (clusterName, host, e)) + try: newSystem = self.restrictedTraverse('%s%s/%s' % (CLUSTER_FOLDER_PATH, clusterName, host)) if not newSystem: @@ -370,9 +371,9 @@ newSystem.manage_acquiredPermissions([]) newSystem.manage_role('View', [ 'Access contents information' , 'View' ]) except Exception, e: - luci_log.debug_verbose('CCS1: %s: %s: %s' % (clusterName, host, str(e))) - return 'Unable to create cluster node %s for cluster %s: %s' \ - % (host, clusterName, str(e)) + luci_log.debug_verbose('CCS1: %s: %s: %r' % (clusterName, host, e)) + return 'Unable to create cluster node %s for cluster %s: %r' \ + % (host, clusterName, e) try: ssystem = self.restrictedTraverse(STORAGE_FOLDER_PATH) @@ -380,7 +381,7 @@ raise Exception, 'storage DB entry is missing' except Exception, e: # This shouldn't fail, but if it does, it's harmless right now - luci_log.debug_verbose('CCS2: %s: %s' % (clusterName, host, str(e))) + luci_log.debug_verbose('CCS2: %s: %r' % (clusterName, host, e)) return None # Only add storage systems if the and cluster node DB @@ -402,7 +403,7 @@ newSystem.manage_acquiredPermissions([]) newSystem.manage_role('View', [ 'Access contents information' , 'View' ]) except Exception, e: - luci_log.debug_verbose('CCS3: %s: %s' % (clusterName, host, str(e))) + luci_log.debug_verbose('CCS3: %s: %r' % (clusterName, host, e)) def delSystem(self, systemName): @@ -411,8 +412,8 @@ if not ssystem: raise Exception, 'storage DB entry is missing' except Exception, e: - luci_log.debug_verbose('delSystem0: %s: %s' % (systemName, str(e))) - return 'Unable to find storage system %s: %s' % (systemName, str(e)) + luci_log.debug_verbose('delSystem0: %s: %r' % (systemName, e)) + return 'Unable to find storage system %s: %r' % (systemName, e) try: rc = RicciCommunicator(systemName, enforce_trust=False) @@ -421,10 +422,10 @@ except Exception, e: try: ssystem.manage_delObjects([ systemName ]) - except Exception, e: - luci_log.debug_verbose('delSystem1: %s: %s' % (systemName, str(e))) + except Exception, e1: + luci_log.debug_verbose('delSystem1: %s: %r' % (systemName, e1)) return 'Unable to delete the storage system %s' % systemName - luci_log.debug_verbose('delSystem2: %s: %s' % (systemName, str(e))) + luci_log.debug_verbose('delSystem2: %s: %r' % (systemName, e)) return # Only unauthenticate if the system isn't a member of @@ -457,9 +458,9 @@ try: ssystem.manage_delObjects([ systemName ]) except Exception, e: - luci_log.debug_verbose('delSystem3: %s: %s' % (systemName, str(e))) - return 'Unable to delete storage system %s: %s' \ - % (systemName, str(e)) + luci_log.debug_verbose('delSystem3: %s: %r' % (systemName, e)) + return 'Unable to delete storage system %s: %r' \ + % (systemName, e) def delCluster(self, clusterName): @@ -468,7 +469,7 @@ if not clusters: raise Exception, 'clusters DB entry is missing' except Exception, e: - luci_log.debug_verbose('delCluster0: %s' % str(e)) + luci_log.debug_verbose('delCluster0: %r' % e) return 'Unable to find cluster %s' % clusterName err = delClusterSystems(self, clusterName) @@ -478,7 +479,7 @@ try: clusters.manage_delObjects([ clusterName ]) except Exception, e: - luci_log.debug_verbose('delCluster1: %s' % str(e)) + luci_log.debug_verbose('delCluster1: %s %r' % (clusterName, e)) return 'Unable to delete cluster %s' % clusterName def delClusterSystem(self, cluster, systemName): @@ -490,13 +491,13 @@ rc = RicciCommunicator(systemName, enforce_trust=False) rc.unauth() except Exception, e: - luci_log.debug_verbose('delClusterSystem0: ricci error for %s: %s' \ - % (systemName, str(e))) + luci_log.debug_verbose('delClusterSystem0: ricci error for %s: %r' \ + % (systemName, e)) try: cluster.manage_delObjects([ systemName ]) except Exception, e: - err_str = 'Error deleting cluster object %s: %s' % (systemName, str(e)) + err_str = 'Error deleting cluster object %s: %r' % (systemName, e) luci_log.debug_verbose('delClusterSystem1: %s' % err_str) return err_str @@ -511,11 +512,11 @@ if not csystems or len(csystems) < 1: return None except Exception, e: - luci_log.debug_verbose('delCluSystems0: %s' % str(e)) + luci_log.debug_verbose('delCluSystems0: %r' % e) return None except Exception, er: - luci_log.debug_verbose('delCluSystems1: error for %s: %s' \ - % (clusterName, str(er))) + luci_log.debug_verbose('delCluSystems1: error for %s: %r' \ + % (clusterName, er)) return str(er) error_list = list() @@ -584,7 +585,7 @@ try: return self.restrictedTraverse('%s%s/objectItems' % (CLUSTER_FOLDER_PATH, clusterName))('Folder') except Exception, e: - luci_log.debug_verbose('GCSy0: %s: %s' % (clusterName, str(e))) + luci_log.debug_verbose('GCSy0: %s: %r' % (clusterName, e)) return None try: @@ -592,7 +593,7 @@ if not i: raise Exception, 'security manager says no user' except Exception, e: - luci_log.debug_verbose('GCSy1: %s: %s' % (clusterName, str(e))) + luci_log.debug_verbose('GCSy1: %s: %r' % (clusterName, e)) return None try: @@ -600,7 +601,7 @@ if not csystems or len(csystems) < 1: return None except Exception, e: - luci_log.debug_verbose('GCSy2: %s: %s' % (clusterName, str(e))) + luci_log.debug_verbose('GCSy2: %s: %r' % (clusterName, e)) return None allowedCSystems = list() @@ -609,25 +610,24 @@ if i.has_role('View', c[1]): allowedCSystems.append(c) except Exception, e: - luci_log.debug_verbose('GCSy3: %s: %s: %s' \ - % (clusterName, c[0], str(e))) + luci_log.debug_verbose('GCSy3: %s: %s: %r' \ + % (clusterName, c[0], e)) return allowedCSystems - def getClusters(self): if isAdmin(self): try: return self.restrictedTraverse('%s/systems/cluster/objectItems' % PLONE_ROOT)('Folder') except Exception, e: - luci_log.debug_verbose('GC0: %s' % str(e)) + luci_log.debug_verbose('GC0: %r' % e) return None try: i = getSecurityManager().getUser() if not i: raise Exception, 'GSMGU failed' except Exception, e: - luci_log.debug_verbose('GC1: %s' % str(e)) + luci_log.debug_verbose('GC1: %r' % e) return None try: @@ -635,7 +635,7 @@ if not clusters or len(clusters) < 1: return None except Exception, e: - luci_log.debug_verbose('GC2: %s' % str(e)) + luci_log.debug_verbose('GC2: %r' % e) return None allowedClusters = list() @@ -644,7 +644,7 @@ if i.has_role('View', c[1]): allowedClusters.append(c) except Exception, e: - luci_log.debug_verbose('GC3: %s: %s' % (c[0], str(e))) + luci_log.debug_verbose('GC3: %s: %r' % (c[0], e)) return allowedClusters @@ -654,7 +654,7 @@ try: return self.restrictedTraverse('%s/systems/storage/objectItems' % PLONE_ROOT)('Folder') except Exception, e: - luci_log.debug_verbose('GS0: %s' % str(e)) + luci_log.debug_verbose('GS0: %r' % e) return None try: @@ -662,7 +662,7 @@ if not i: raise Exception, 'GSMGU failed' except Exception, e: - luci_log.debug_verbose('GS1: %s' % str(e)) + luci_log.debug_verbose('GS1: %r' % e) return None try: @@ -670,7 +670,7 @@ if not storage or len(storage) < 1: return None except Exception, e: - luci_log.debug_verbose('GS2: %s' % str(e)) + luci_log.debug_verbose('GS2: %r' % e) return None allowedStorage = list() @@ -679,7 +679,116 @@ if i.has_role('View', s[1]): allowedStorage.append(s) except Exception, e: - luci_log.debug_verbose('GS3: %s' % str(e)) + luci_log.debug_verbose('GS3: %r' % e) return allowedStorage +def check_clusters(self, clusters): + sm = getSecurityManager() + user = sm.getUser() + + clist = list() + for cluster in clusters: + if user.has_permission('View', cluster): + clist.append(cluster) + return clist + +def cluster_permission_check(cluster): + try: + sm = getSecurityManager() + user = sm.getUser() + if user.has_permission('View', cluster): + return True + except: + pass + return False + +def allowed_systems(self, user, systems): + user = getSecurityManager().getUser().getUser() + return map(lambda x: user.has_permission('View', x[1]), systems) + +def access_to_host_allowed(self, hostname, allowed_systems_list): + allowed = dict(map(lambda x: [ x[0], None ], allowed_systems_list)) + return allowed.has_key(hostname) + +def getRicciAgent(self, clustername): + try: + perm = cluster_permission_check(clustername) + if not perm: + return None + except Exception, e: + luci_log.debug_verbose('GRA0: %r' % e) + return None + + try: + path = '%s%s' % (CLUSTER_FOLDER_PATH, clustername) + clusterfolder = self.restrictedTraverse(path) + if not clusterfolder: + luci_log.debug('GRA1: cluster folder %s for %s is missing' \ + % (path, clustername)) + return None + + nodes = clusterfolder.objectItems('Folder') + if len(nodes) < 1: + luci_log.debug('GRA2: no cluster nodes for %s found.' % clustername) + raise Exception, 'No cluster nodes were found@%s' % path + except Exception, e: + try: + luci_log.debug('GRA3: cluster folder %s for %s is missing: %r' \ + % (path, clustername, e)) + + if len(clusterfolder.objectItems()) < 1: + clusters = self.restrictedTraverse(str(CLUSTER_FOLDER_PATH)) + clusters.manage_delObjects([clustername]) + except Exception, ein: + luci_log.debug_verbose('GRA4: %r' % ein) + return None + + cluname = clustername.lower() + for node in nodes: + try: + hostname = node[1].getId() + except: + try: + hostname = node[0] + except: + continue + + try: + rc = RicciCommunicator(hostname) + if not rc: + luci_log.debug_verbose('GRA5: rc is None') + continue + + ricci_hostname = rc.hostname() + if not ricci_hostname: + luci_log.debug_verbose('GRA6: ricci_hostname is blank') + continue + + clu_info = rc.cluster_info() + + cur_name = str(clu_info[0]).strip().lower() + if not cur_name: + cur_name = None + luci_log.debug_verbose('GRA7: cluster name is none for %s' % ricci_hostname) + + cur_alias = str(clu_info[1]).strip().lower() + if not cur_alias: + cur_alias = None + luci_log.debug_verbose('GRA8: cluster alias is none for %s' % ricci_hostname) + + if (cur_name is not None and cluname != cur_name) and (cur_alias is not None and cluname != cur_alias): + luci_log.debug('GRA9: node %s reports it\'s in cluster %s:%s; we expect %s' % (hostname, clu_info[0], clu_info[1], cluname)) + setNodeFlag(self, node, CLUSTER_NODE_NOT_MEMBER) + continue + + if rc.authed(): + return rc + + setNodeFlag(node[1], CLUSTER_NODE_NEED_AUTH) + except Exception, eout: + luci_log.debug_verbose('GRA10: %r' % eout) + + luci_log.debug('GRA11: no ricci agent could be found for cluster %s' \ + % cluname) + return None --- conga/luci/site/luci/Extensions/Attic/LuciZope.py 2007/05/04 19:10:24 1.1.2.1 +++ conga/luci/site/luci/Extensions/Attic/LuciZope.py 2007/05/08 22:19:35 1.1.2.2 @@ -1,6 +1,8 @@ -from ricci_communicator import CERTS_DIR_PATH from AccessControl import getSecurityManager +from ricci_communicator import CERTS_DIR_PATH from conga_constants import PLONE_ROOT +from LuciDB import allowed_systems + def siteIsSetup(self): import os @@ -36,77 +38,52 @@ pass return False -def allowed_systems(self, user, systems): - allowed = [] - sm = getSecurityManager() - user = sm.getUser() - for system in systems: - #Does this take too long? - if user.has_permission('View', system[1]): - allowed.append(system) - return allowed - -def access_to_host_allowed(self, hostname, allowed_systems_list): - for system in allowed_systems_list: - if system[0] == hostname: - if len(self.allowed_systems(None, [system])) == 1: - return True - else: - return False - return False - # removes systems that user is not authorized access to def get_systems_statuses(self, systems, from_cache=False): - from HelperFunctions import get_system_info - - CACHED_INDEX = '_get_systems_statuses()_cached_result_' - session = self.REQUEST.SESSION - if session.has_key(CACHED_INDEX): - res = session[CACHED_INDEX] - if res != None: - session.set(CACHED_INDEX, None) - if from_cache: - return res - - allowed_sys_list = self.allowed_systems(self, None, systems) - ss_list = get_system_info(self, allowed_sys_list) - session.set(CACHED_INDEX, ss_list) - - return ss_list - -def set_persistent_var(self, - var_name, - default_value): - request = self.REQUEST - response = request.RESPONSE - session = request.SESSION - - # TODO: add username into cookie_prefix, so users don't overwrite each other - cookie_prefix = '__luci_storage_cookie_' - - value = default_value - if request.has_key(var_name): - value = request[var_name] - elif session.has_key(var_name): - value = session[var_name] - elif request.cookies.has_key(cookie_prefix + var_name): - value = request.cookies[cookie_prefix + var_name] - - session.set(var_name, - value) - response.setCookie(cookie_prefix + var_name, - value, - expires='Tue, 30 Jun 2060 12:00:00 GMT') - return value + from HelperFunctions import get_system_info + CACHED_INDEX = '_get_systems_statuses()_cached_result_' + session = self.REQUEST.SESSION + if session.has_key(CACHED_INDEX): + res = session[CACHED_INDEX] + if res != None: + session.set(CACHED_INDEX, None) + if from_cache: + return res + + allowed_sys_list = allowed_systems(self, None, systems) + ss_list = get_system_info(self, allowed_sys_list) + session.set(CACHED_INDEX, ss_list) + return ss_list + +def set_persistent_var(self, var_name, default_value): + request = self.REQUEST + response = request.RESPONSE + session = request.SESSION + + # TODO: add username into cookie_prefix, so users don't overwrite each other + cookie_prefix = '__luci_storage_cookie_' + + value = default_value + if request.has_key(var_name): + value = request[var_name] + elif session.has_key(var_name): + value = session[var_name] + elif request.cookies.has_key(cookie_prefix + var_name): + value = request.cookies[cookie_prefix + var_name] + + session.set(var_name, value) + response.setCookie(cookie_prefix + var_name, value, + expires='Tue, 30 Jun 2060 12:00:00 GMT') + return value # returns (str(float), units) that fits best, # takes prefered units into account def bytes_to_value_prefunits(self, bytes): - from HelperFunctions import bytes_to_value_units, convert_bytes, get_units_multiplier + from HelperFunctions import bytes_to_value_units, convert_bytes, get_units_multiplier - p_units = self.REQUEST.SESSION.get('preferred_size_units') - dummy, units = bytes_to_value_units(bytes) - if get_units_multiplier(units) > get_units_multiplier(p_units): - units = p_units - return (convert_bytes(bytes, units), units) + p_units = self.REQUEST.SESSION.get('preferred_size_units') + dummy, units = bytes_to_value_units(bytes) + if get_units_multiplier(units) > get_units_multiplier(p_units): + units = p_units + return (convert_bytes(bytes, units), units) --- conga/luci/site/luci/Extensions/cluster_adapters.py 2007/05/04 19:10:24 1.255.2.2 +++ conga/luci/site/luci/Extensions/cluster_adapters.py 2007/05/08 22:19:35 1.255.2.3 @@ -1449,51 +1449,71 @@ response.redirect('%s?pagetype=%s&clustername=%s&busyfirst=true' \ % (request['URL'], CLUSTER_CONFIG, clustername)) -def validateFenceAdd(self, request): - errors = list() - messages = list() - rc = None +def LuciExtractCluName(self, request): + cluname = None + try: + cluname = request.form['clustername'] + except Exception, e: + try: + cluname = request['clustername'] + except Exception, e: + cluname = None - try: - model = request.SESSION.get('model') - if not model: - raise Exception, 'model is none' - except Exception, e: - model = None - try: - cluname = request.form['clustername'] - except: - try: - cluname = request['clustername'] - except: - luci_log.debug_verbose('VFE: no model, no cluster name') - return (False, {'errors': ['No cluster model was found.']}) + if not cluname: + luci_log.debug_verbose('LECN0: no cluster name') + return cluname + +def LuciExtractCluModel(self, request, cluster_name=None): + model = None + if not cluster_name: + cluster_name = LuciExtractCluName(self, request) + if not cluster_name: + luci_log.debug_verbose('LECM0: no cluster name') - try: - model = getModelForCluster(self, cluname) - except: - model = None + try: + model = request.SESSION.get('model') + if not model: + model = None + except Exception, e: + model = None - if model is None: - luci_log.debug_verbose('VFE: unable to get model from session') - return (False, {'errors': ['No cluster model was found.']}) + try: + model = getModelForCluster(self, cluster_name) + if not model: + luci_log.debug_verbose('LECM1: empty model') + model = None + except Exception, e: + luci_log.debug_verbose('LECM2: no model: %s' % str(e)) + model = None + return model - form = None - try: - response = request.response - form = request.form - if not form: - form = None - raise Exception, 'no form was submitted' - except: - pass +def LuciFenceAddReq(self, request): + model = LuciExtractCluModel(self, request) + if not model: + luci_log.debug_verbose('VFE0: no model') + return (False, [ 'No cluster model was found.' ]) - if form is None: - luci_log.debug_verbose('VFE: no form was submitted') - return (False, {'errors': ['No form was submitted']}) + ret = validateFenceAdd(request, model) + if ret[0] is not True: + return (False, { 'errors': ret[1] }) + +def validateFenceAdd(request, model): + errors = list() + messages = list() + + if not request.form: + luci_log.debug_verbose('VFE: no form was submitted') + return (False, [ 'No form was submitted ']) + + ret_code, ret_msgs = validateNewFenceDevice(form, model) + if error_code != FD_VAL_SUCCESS: + if ret_msgs: + errors.extend(ret_msgs) + return (False, errors) + if ret_msgs: + messages.extend(ret_msgs) + return (True, ret_msgs) - error_code, retobj = validateNewFenceDevice(form, model) - if error_code == FD_VAL_SUCCESS: try: conf_str = model.exportModelAsString() if not conf_str: @@ -1503,38 +1523,7 @@ % str(e)) errors.append('Unable to store the new cluster configuration') - try: - clustername = model.getClusterName() - if not clustername: - raise Exception, 'cluster name from model.getClusterName() is blank' - except Exception, e: - luci_log.debug_verbose('VFA: error: getClusterName: %s' % str(e)) - errors.append('Unable to determine cluster name from model') - - if not rc: - rc = getRicciAgent(self, clustername) - if not rc: - luci_log.debug_verbose('VFA: unable to find a ricci agent for the %s cluster' % clustername) - errors.append('Unable to contact a ricci agent for cluster %s' \ - % clustername) - - if rc: - batch_id, result = rq.setClusterConf(rc, str(conf_str)) - if batch_id is None or result is None: - luci_log.debug_verbose('VFA: setCluserConf: batchid or result is None') - errors.append('Unable to propagate the new cluster configuration for %s' \ - % clustername) - else: - try: - set_node_flag(self, clustername, rc.hostname(), batch_id, - CLUSTER_CONFIG, 'Adding new fence device "%s"' % retobj) - except: - pass - response.redirect('%s?pagetype=%s&clustername=%s&fencename=%s&busyfirst=true' % (request['URL'], FENCEDEV, clustername, retobj)) - else: - errors.extend(retobj) - return (False, {'errors': errors, 'messages': messages}) def validateFenceEdit(self, request): @@ -3060,125 +3049,6 @@ return portaltabs -def check_clusters(self, clusters): - sm = AccessControl.getSecurityManager() - user = sm.getUser() - - clist = list() - for cluster in clusters: - if user.has_permission('View', cluster): - clist.append(cluster) - return clist - -def cluster_permission_check(cluster): - try: - sm = AccessControl.getSecurityManager() - user = sm.getUser() - if user.has_permission('View', cluster): - return True - except: - pass - return False - -def getRicciAgent(self, clustername): - #Check cluster permission here! return none if false - path = '%s%s' % (CLUSTER_FOLDER_PATH, clustername) - - try: - clusterfolder = self.restrictedTraverse(path) - if not clusterfolder: - luci_log.debug('GRA0: cluster folder %s for %s is missing.' \ - % (path, clustername)) - raise Exception, 'no cluster folder at %s' % path - nodes = clusterfolder.objectItems('Folder') - if len(nodes) < 1: - luci_log.debug('GRA1: no cluster nodes for %s found.' % clustername) - raise Exception, 'no cluster nodes were found@%s' % path - except Exception, e: - try: - luci_log.debug('GRA2: cluster folder %s for %s is missing: %s.' \ - % (path, clustername, str(e))) - - if len(clusterfolder.objectItems()) < 1: - clusters = self.restrictedTraverse(str(CLUSTER_FOLDER_PATH)) - clusters.manage_delObjects([clustername]) - except Exception, e: - luci_log.debug_verbose('GRA3: %s' % str(e)) - - return None - - cluname = clustername.lower() - - for node in nodes: - try: - hostname = node[1].getId() - except: - try: - hostname = node[0] - except Exception, e: - luci_log.debug_verbose('GRA2a: %s' % str(e)) - continue - - try: - rc = RicciCommunicator(hostname) - if not rc: - raise Exception, 'rc is None' - ricci_hostname = rc.hostname() - if not ricci_hostname: - raise Exception, 'ricci_hostname is blank' - except Exception, e: - luci_log.debug('GRA3: ricci error: %s' % str(e)) - continue - - try: - clu_info = rc.cluster_info() - except Exception, e: - luci_log.debug('GRA4: cluster_info error for %s: %s' \ - % (ricci_hostname, str(e))) - continue - - try: - cur_name = str(clu_info[0]).strip().lower() - if not cur_name: - raise Exception, 'cluster name is none for %s' % ricci_hostname - except Exception, e: - luci_log.debug_verbose('GRA4a: %s' % str(e)) - cur_name = None - - try: - cur_alias = str(clu_info[1]).strip().lower() - if not cur_alias: - raise Exception, 'cluster alias is none' - except Exception, e: - luci_log.debug_verbose('GRA4b: %s' % str(e)) - cur_alias = None - - if (cur_name is not None and cluname != cur_name) and (cur_alias is not None and cluname != cur_alias): - try: - luci_log.debug('GRA5: %s reports it\'s in cluster %s:%s; we expect %s' \ - % (hostname, clu_info[0], clu_info[1], cluname)) - setNodeFlag(self, node, CLUSTER_NODE_NOT_MEMBER) - except: - pass - continue - - try: - if rc.authed(): - return rc - - try: - setNodeFlag(node[1], CLUSTER_NODE_NEED_AUTH) - except: - pass - raise Exception, '%s not authed' % rc.hostname() - except Exception, e: - luci_log.debug_verbose('GRA6: %s' % str(e)) - continue - - luci_log.debug('GRA7: no ricci agent could be found for cluster %s' \ - % cluname) - return None - def getRicciAgentForCluster(self, req): clustername = None try: @@ -3293,338 +3163,6 @@ return results -def getClusterStatus(self, request, rc, cluname=None): - try: - doc = rq.getClusterStatusBatch(rc) - if not doc: - raise Exception, 'doc is None' - except Exception, e: - luci_log.debug_verbose('GCS0: error: %s' % str(e)) - doc = None - - if doc is None and not cluname: - try: - model = request.SESSION.get('model') - cinfo = getClusterStatusModel(model) - if not cinfo or len(cinfo) < 1: - raise Exception, 'cinfo is None' - return cinfo - except Exception, e: - luci_log.debug_verbose('GCS1: %s' % str(e)) - doc = None - - if not doc: - try: - clustername = cluname - if clustername is None: - try: - clustername = request['clustername'] - except: - try: - clustername = request.form['clustername'] - except: - pass - - if not clustername: - raise Exception, 'unable to determine cluster name' - - cinfo = getClusterStatusDB(self, clustername) - if not cinfo or len(cinfo) < 1: - raise Exception, 'cinfo is None' - return cinfo - except Exception, e: - luci_log.debug_verbose('GCS1a: unable to get cluster info from DB: %s' % str(e)) - return [] - - results = list() - vals = {} - vals['type'] = "cluster" - - try: - vals['alias'] = doc.firstChild.getAttribute('alias') - except AttributeError, e: - vals['alias'] = doc.firstChild.getAttribute('name') - - vals['votes'] = doc.firstChild.getAttribute('votes') - vals['name'] = doc.firstChild.getAttribute('name') - vals['minQuorum'] = doc.firstChild.getAttribute('minQuorum') - vals['quorate'] = doc.firstChild.getAttribute('quorate') - results.append(vals) - - for node in doc.firstChild.childNodes: - if node.nodeName == 'node': - vals = {} - vals['type'] = "node" - vals['clustered'] = node.getAttribute('clustered') - vals['name'] = node.getAttribute('name') - vals['online'] = node.getAttribute('online') - vals['uptime'] = node.getAttribute('uptime') - vals['votes'] = node.getAttribute('votes') - results.append(vals) - elif node.nodeName == 'service': - vals = {} - vals['type'] = 'service' - vals['name'] = node.getAttribute('name') - vals['nodename'] = node.getAttribute('nodename') - vals['running'] = node.getAttribute('running') - try: - vals['is_vm'] = node.getAttribute('vm').lower() == 'true' - except: - vals['is_vm'] = False - vals['failed'] = node.getAttribute('failed') - vals['autostart'] = node.getAttribute('autostart') - results.append(vals) - return results - -def getServicesInfo(self, status, model, req): - svc_map = {} - maplist = list() - - try: - baseurl = req['URL'] - if not baseurl: - raise KeyError, 'is blank' - except: - baseurl = '/luci/cluster/index_html' - - try: - nodes = model.getNodes() - cluname = req['clustername'] - if not cluname: - raise KeyError, 'is blank' - except: - try: - cluname = req.form['clusterName'] - if not cluname: - raise KeyError, 'is blank' - except: - cluname = '[error retrieving cluster name]' - - for item in status: - if item['type'] == "service": - itemmap = {} - itemmap['name'] = item['name'] - - cur_node = None - if item['running'] == "true": - cur_node = item['nodename'] - itemmap['running'] = "true" - itemmap['nodename'] = cur_node - itemmap['disableurl'] = '%s?clustername=%s&servicename=%s&pagetype=%s' % (baseurl, cluname, item['name'], SERVICE_STOP) - itemmap['restarturl'] = '%s?clustername=%s&servicename=%s&pagetype=%s' % (baseurl, cluname, item['name'], SERVICE_RESTART) - else: - itemmap['enableurl'] = '%s?clustername=%s&servicename=%s&pagetype=%s' % (baseurl, cluname, item['name'], SERVICE_START) - - itemmap['autostart'] = item['autostart'] - - try: - svc = model.retrieveServiceByName(item['name']) - itemmap['cfgurl'] = '%s?clustername=%s&servicename=%s&pagetype=%s' % (baseurl, cluname, item['name'], SERVICE) - itemmap['cfgurl'] = '%s?clustername=%s&servicename=%s&pagetype=%s' % (baseurl, cluname, item['name'], SERVICE_DELETE) - except: - try: - svc = model.retrieveVMsByName(item['name']) - itemmap['is_vm'] = True - itemmap['cfgurl'] = '%s?clustername=%s&servicename=%s&pagetype=%s' % (baseurl, cluname, item['name'], VM_CONFIG) - itemmap['delurl'] = '%s?clustername=%s&servicename=%s&pagetype=%s' % (baseurl, cluname, item['name'], VM_CONFIG) - except: - continue - - starturls = list() - for node in nodes: - cur_nodename = node.getName() - if node.getName() != cur_node: - starturl = {} - starturl['nodename'] = cur_nodename - starturl['url'] = '%s?clustername=%s&servicename=%s&pagetype=%s&nodename=%s' % (baseurl, cluname, item['name'], SERVICE_START, cur_nodename) - starturls.append(starturl) - - if itemmap.has_key('is_vm') and itemmap['is_vm'] is True: - migrate_url = { 'nodename': cur_nodename } - migrate_url['migrate'] = True - migrate_url['url'] = '%s?clustername=%s&servicename=%s&pagetype=%s&nodename=%s' % (baseurl, cluname, item['name'], SERVICE_MIGRATE, cur_nodename) - starturls.append(migrate_url) - - itemmap['links'] = starturls - - dom = svc.getAttribute("domain") - if dom is not None: - itemmap['faildom'] = dom - else: - itemmap['faildom'] = "No Failover Domain" - maplist.append(itemmap) - - svc_map['services'] = maplist - return svc_map - -def get_fdom_names(model): - return map(lambda x: x.getName(), model.getFailoverDomains()) - -def getServiceInfo(self, status, model, req): - from Products.Archetypes.utils import make_uuid - #set up struct for service config page - hmap = {} - root_uuid = 'toplevel' - - try: - baseurl = req['URL'] - if not baseurl: - raise KeyError, 'is blank' - except: - baseurl = '/luci/cluster/index_html' - - try: - hmap['fdoms'] = get_fdom_names(model) - except: - hmap['fdoms'] = list() - - try: - cluname = req['clustername'] - if not cluname: - raise KeyError, 'is blank' - except KeyError, e: - try: - cluname = req.form['clusterName'] - if not cluname: - raise - except: - cluname = '[error retrieving cluster name]' - - hmap['root_uuid'] = root_uuid - # uuids for the service page needed when new resources are created - hmap['uuid_list'] = map(lambda x: make_uuid('resource'), xrange(30)) - - try: - servicename = req['servicename'] - except KeyError, e: - hmap['resource_list'] = {} - return hmap - - for item in status: - innermap = {} - if item['type'] == 'service': - if item['name'] == servicename: - hmap['name'] = servicename - hmap['autostart'] = item['autostart'] - - starturls = list() - if item['running'] == 'true': - hmap['running'] = 'true' - nodename = item['nodename'] - innermap['current'] = 'Running on %s' % nodename - - innermap['disableurl'] = '%s?clustername=%s&servicename=%s&pagetype=%s' % (baseurl, cluname, servicename, SERVICE_STOP) - innermap['restarturl'] = '%s?clustername=%s&servicename=%s&pagetype=%s' % (baseurl, cluname, servicename, SERVICE_RESTART) - innermap['delurl'] = '%s?clustername=%s&servicename=%s&pagetype=%s' % (baseurl, cluname, servicename, SERVICE_DELETE) - - #In this case, determine where it can run... - nodes = model.getNodes() - for node in nodes: - if node.getName() != nodename: - starturl = {} - cur_nodename = node.getName() - starturl['nodename'] = cur_nodename - starturl['url'] = '%s?clustername=%s&servicename=%s&pagetype=%s&nodename=%s' % (baseurl, cluname, servicename, SERVICE_START, cur_nodename) - starturls.append(starturl) - - if item.has_key('is_vm') and item['is_vm'] is True: - migrate_url = { 'nodename': cur_nodename } - migrate_url['url'] = '%s?clustername=%s&servicename=%s&pagetype=%s&nodename=%s' % (baseurl, cluname, servicename, SERVICE_MIGRATE, cur_nodename) - migrate_url['migrate'] = True - starturls.append(migrate_url) - innermap['links'] = starturls - else: - #Do not set ['running'] in this case...ZPT will detect it is missing - innermap['current'] = "Stopped" - innermap['enableurl'] = '%s?clustername=%s&servicename=%s&pagetype=%s' % (baseurl, cluname, servicename, SERVICE_START) - innermap['delurl'] = '%s?clustername=%s&servicename=%s&pagetype=%s' % (baseurl, cluname, servicename, SERVICE_DELETE) - - nodes = model.getNodes() - starturls = list() - for node in nodes: - starturl = {} - cur_nodename = node.getName() - - starturl['nodename'] = cur_nodename - starturl['url'] = '%s?clustername=%s&servicename=%s&pagetype=%s&nodename=%s' % (baseurl, cluname, servicename, SERVICE_START, cur_nodename) - starturls.append(starturl) - - if item.has_key('is_vm') and item['is_vm'] is True: - migrate_url = { 'nodename': cur_nodename } - migrate_url['url'] = '%s?clustername=%s&servicename=%s&pagetype=%s&nodename=%s' % (baseurl, cluname, servicename, SERVICE_MIGRATE, cur_nodename) - migrate_url['migrate'] = True - starturls.append(migrate_url) - innermap['links'] = starturls - hmap['innermap'] = innermap - - #Now build hashes for resources under service. - #first get service by name from model - svc = model.getService(servicename) - try: - hmap['domain'] = svc.getAttribute('domain') - except: - hmap['domain'] = None - - try: - hmap['recovery'] = svc.getAttribute('recovery') - except: - hmap['recovery'] = None - - try: - if int(svc.getAttribute('exclusive')): - hmap['exclusive'] = 'true' - else: - hmap['exclusive'] = 'false' - except: - hmap['exclusive'] = 'false' - - resource_list = list() - if svc is not None: - indent_ctr = 0 - children = svc.getChildren() - for child in children: - recurse_resources(root_uuid, child, resource_list, indent_ctr) - - hmap['resource_list'] = resource_list - return hmap - -def recurse_resources(parent_uuid, child, resource_list, indent_ctr, parent=None): - #First, add the incoming child as a resource - #Next, check for children of it - #Call yourself on every children - #then return - rc_map = {} - if parent is not None: - rc_map['parent'] = parent - rc_map['name'] = child.getName() - - #Note: Final version needs all resource attrs - if child.isRefObject() == True: - rc_map['ref_object'] = True - rc_map['tag_name'] = child.getObj().TAG_NAME - rc_map['type'] = child.getObj().getResourceType() - rc_map['attrs'] = child.getObj().getAttributes() - else: - rc_map['tag_name'] = child.TAG_NAME - rc_map['type'] = child.getResourceType() - rc_map['attrs'] = child.getAttributes() - - rc_map['indent_ctr'] = indent_ctr - - rc_map['uuid'] = make_uuid('resource') - rc_map['parent_uuid'] = parent_uuid - - resource_list.append(rc_map) - kids = child.getChildren() - child_depth = 0 - new_indent_ctr = indent_ctr + 1 - for kid in kids: - cdepth = recurse_resources(rc_map['uuid'], kid, resource_list, new_indent_ctr, child) - child_depth = max(cdepth, child_depth) - - rc_map['max_depth'] = child_depth - return child_depth + 1 - def serviceStart(self, rc, req): svcname = None try: @@ -3820,111 +3358,6 @@ response.redirect('%s?pagetype=%s&clustername=%s&busyfirst=true' \ % (req['URL'], SERVICE_LIST, cluname)) -def getFdomInfo(self, model, request): - fhash = {} - fhash['members'] = {} - - try: - fdom = model.getFailoverDomainByName(request['fdomname']) - except Exception, e: - luci_log.debug_verbose('getFdomInfo0: %s' % str(e)) - return fhash - - fhash['name'] = fdom.getName() - - ordered_attr = fdom.getAttribute('ordered') - if ordered_attr is not None and (ordered_attr == "true" or ordered_attr == "1"): - fhash['prioritized'] = '1' - else: - fhash['prioritized'] = '0' - - restricted_attr = fdom.getAttribute('restricted') - if restricted_attr is not None and (restricted_attr == "true" or restricted_attr == "1"): - fhash['restricted'] = '1' - else: - fhash['restricted'] = '0' - - nodes = fdom.getChildren() - for node in nodes: - try: - priority = node.getAttribute('priority') - except: - priority = '1' - fhash['members'][node.getName()] = { 'priority': priority } - return fhash - -def getFdomsInfo(self, model, request, clustatus): - slist = list() - nlist = list() - for item in clustatus: - if item['type'] == "node": - nlist.append(item) - elif item['type'] == "service": - slist.append(item) - fdomlist = list() - clustername = request['clustername'] - baseurl = request['URL'] - fdoms = model.getFailoverDomains() - svcs = model.getServices() - for fdom in fdoms: - fdom_map = {} - fdom_map['name'] = fdom.getName() - fdom_map['cfgurl'] = '%s?pagetype=%s&clustername=%s&fdomname=%s' \ - % (baseurl, FDOM, clustername, fdom.getName()) - ordered_attr = fdom.getAttribute('ordered') - restricted_attr = fdom.getAttribute('restricted') - if ordered_attr is not None and (ordered_attr == "true" or ordered_attr == "1"): - fdom_map['ordered'] = True - else: - fdom_map['ordered'] = False - if restricted_attr is not None and (restricted_attr == "true" or restricted_attr == "1"): - fdom_map['restricted'] = True - else: - fdom_map['restricted'] = False - nodes = fdom.getChildren() - nodelist = list() - for node in nodes: - nodesmap = {} - ndname = node.getName() - for nitem in nlist: - if nitem['name'] == ndname: - break - nodesmap['nodename'] = ndname - nodesmap['nodecfgurl'] = '%s?clustername=%s&nodename=%s&pagetype=%s' \ - % (baseurl, clustername, ndname, NODE) - if nitem['clustered'] == "true": - nodesmap['status'] = NODE_ACTIVE - elif nitem['online'] == "false": - nodesmap['status'] = NODE_UNKNOWN - else: - nodesmap['status'] = NODE_INACTIVE - priority_attr = node.getAttribute('priority') - if priority_attr is not None: - nodesmap['priority'] = "0" - nodelist.append(nodesmap) - fdom_map['nodeslist'] = nodelist - - svclist = list() - for svc in svcs: - svcname = svc.getName() - for sitem in slist: - if sitem['name'] == svcname: - break #found more info about service... - - domain = svc.getAttribute("domain") - if domain is not None: - if domain == fdom.getName(): - svcmap = {} - svcmap['name'] = svcname - svcmap['status'] = sitem['running'] - svcmap['svcurl'] = '%s?pagetype=%s&clustername=%s&servicename=%s' \ - % (baseurl, SERVICE, clustername, svcname) - svcmap['location'] = sitem['nodename'] - svclist.append(svcmap) - fdom_map['svclist'] = svclist - fdomlist.append(fdom_map) - return fdomlist - def clusterTaskProcess(self, model, request): try: task = request['task'] @@ -3975,248 +3408,6 @@ response.redirect('%s?pagetype=%s&clustername=%s&busyfirst=true' \ % (request['URL'], redirect_page, model.getClusterName())) -def getClusterInfo(self, model, req): - try: - cluname = req[CLUNAME] - except: - try: - cluname = req.form['clustername'] - except: - try: - cluname = req.form['clusterName'] - except: - luci_log.debug_verbose('GCI0: unable to determine cluster name') - return {} - - clumap = {} - if model is None: - try: - model = getModelForCluster(self, cluname) - if not model: - raise Exception, 'model is none' - req.SESSION.set('model', model) - except Exception, e: - luci_log.debug_verbose('GCI1: unable to get model for cluster %s: %s' % (cluname, str(e))) - return {} - else: - totem = model.getTotemPtr() - if totem: - clumap['totem'] = totem.getAttributes() - - prop_baseurl = '%s?pagetype=%s&clustername=%s&' \ - % (req['URL'], CLUSTER_CONFIG, cluname) - basecluster_url = '%stab=%s' % (prop_baseurl, PROP_GENERAL_TAB) - #needed: - clumap['basecluster_url'] = basecluster_url - #name field - clumap['clustername'] = model.getClusterAlias() - #config version - cp = model.getClusterPtr() - clumap['config_version'] = cp.getConfigVersion() - #------------- - #new cluster params - if rhel5 - #------------- - - clumap['fence_xvmd'] = model.hasFenceXVM() - gulm_ptr = model.getGULMPtr() - if not gulm_ptr: - #Fence Daemon Props - fencedaemon_url = '%stab=%s' % (prop_baseurl, PROP_FENCE_TAB) - clumap['fencedaemon_url'] = fencedaemon_url - fdp = model.getFenceDaemonPtr() - pjd = fdp.getAttribute('post_join_delay') - if pjd is None: - pjd = "6" - pfd = fdp.getAttribute('post_fail_delay') - if pfd is None: - pfd = "0" - #post join delay - clumap['pjd'] = pjd - #post fail delay - clumap['pfd'] = pfd - - #------------- - #if multicast - multicast_url = '%stab=%s' % (prop_baseurl, PROP_MCAST_TAB) - clumap['multicast_url'] = multicast_url - #mcast addr - is_mcast = model.isMulticast() - if is_mcast: - clumap['mcast_addr'] = model.getMcastAddr() - clumap['is_mcast'] = "True" - else: - clumap['is_mcast'] = "False" - clumap['mcast_addr'] = "1.2.3.4" - clumap['gulm'] = False - else: - #------------- - #GULM params (rhel4 only) - lockserv_list = list() - clunodes = model.getNodes() - gulm_lockservs = map(lambda x: x.getName(), gulm_ptr.getChildren()) - lockserv_list = map(lambda x: (x, True), gulm_lockservs) - for node in clunodes: - n = node.getName() - if not n in gulm_lockservs: - lockserv_list.append((n, False)) - clumap['gulm'] = True - clumap['gulm_url'] = '%stab=%s' % (prop_baseurl, PROP_GULM_TAB) - clumap['gulm_lockservers'] = lockserv_list - - #------------- - #quorum disk params - quorumd_url = '%stab=%s' % (prop_baseurl, PROP_QDISK_TAB) - clumap['quorumd_url'] = quorumd_url - is_quorumd = model.isQuorumd() - clumap['is_quorumd'] = is_quorumd - clumap['interval'] = "" - clumap['tko'] = "" - clumap['votes'] = "" - clumap['min_score'] = "" - clumap['device'] = "" - clumap['label'] = "" - - #list struct for heuristics... - hlist = list() - - if is_quorumd: - qdp = model.getQuorumdPtr() - interval = qdp.getAttribute('interval') - if interval is not None: - clumap['interval'] = interval - - tko = qdp.getAttribute('tko') - if tko is not None: - clumap['tko'] = tko - - votes = qdp.getAttribute('votes') - if votes is not None: - clumap['votes'] = votes - - min_score = qdp.getAttribute('min_score') - if min_score is not None: - clumap['min_score'] = min_score - - device = qdp.getAttribute('device') - if device is not None: - clumap['device'] = device - - label = qdp.getAttribute('label') - if label is not None: - clumap['label'] = label - - heuristic_kids = qdp.getChildren() - - for kid in heuristic_kids: - hmap = {} - hprog = kid.getAttribute('program') - if hprog is None: - continue - - hscore = kid.getAttribute('score') - hmap['hprog'] = hprog - if hscore is not None: - hmap['hscore'] = hscore - else: - hmap['hscore'] = "" - - hinterval = kid.getAttribute('interval') - if hinterval is not None: - hmap['hinterval'] = hinterval - else: - hmap['hinterval'] = "" - hlist.append(hmap) - clumap['hlist'] = hlist - - return clumap - -def getClustersInfo(self, status, req): - clu_map = {} - nodelist = list() - svclist = list() - clulist = list() - baseurl = req['URL'] - - for item in status: - if item['type'] == "node": - nodelist.append(item) - elif item['type'] == "service": - svclist.append(item) - elif item['type'] == "cluster": - clulist.append(item) - else: - continue - if len(clulist) < 1: - return {} - clu = clulist[0] - if 'error' in clu: - clu_map['error'] = True - clustername = clu['name'] - if clu['alias'] != "": - clu_map['clusteralias'] = clu['alias'] - else: - clu_map['clusteralias'] = clustername - clu_map['clustername'] = clustername - if clu['quorate'] == "true": - clu_map['status'] = "Quorate" - clu_map['running'] = "true" - else: - clu_map['status'] = "Not Quorate" - clu_map['running'] = "false" - clu_map['votes'] = clu['votes'] - clu_map['minquorum'] = clu['minQuorum'] - - clu_map['clucfg'] = '%s?pagetype=%s&clustername=%s' \ - % (baseurl, CLUSTER_CONFIG, clustername) - - clu_map['restart_url'] = '%s?pagetype=%s&clustername=%s&task=%s' \ - % (baseurl, CLUSTER_PROCESS, clustername, CLUSTER_RESTART) - clu_map['stop_url'] = '%s?pagetype=%s&clustername=%s&task=%s' \ - % (baseurl, CLUSTER_PROCESS, clustername, CLUSTER_STOP) - clu_map['start_url'] = '%s?pagetype=%s&clustername=%s&task=%s' \ - % (baseurl, CLUSTER_PROCESS, clustername, CLUSTER_START) - clu_map['delete_url'] = '%s?pagetype=%s&clustername=%s&task=%s' \ - % (baseurl, CLUSTER_PROCESS, clustername, CLUSTER_DELETE) - - svc_dict_list = list() - for svc in svclist: - svc_dict = {} - svc_dict['nodename'] = svc['nodename'] - svcname = svc['name'] - svc_dict['name'] = svcname - svc_dict['srunning'] = svc['running'] - svc_dict['servicename'] = svcname - - if svc.has_key('is_vm') and svc['is_vm'] is True: - target_page = VM_CONFIG - else: - target_page = SERVICE - - svcurl = '%s?pagetype=%s&clustername=%s&servicename=%s' \ - % (baseurl, target_page, clustername, svcname) - svc_dict['svcurl'] = svcurl - svc_dict_list.append(svc_dict) - clu_map['currentservices'] = svc_dict_list - node_dict_list = list() - - for item in nodelist: - nmap = {} - name = item['name'] - nmap['nodename'] = name - cfgurl = '%s?pagetype=%s&clustername=%s&nodename=%s' \ - % (baseurl, NODE, clustername, name) - nmap['configurl'] = cfgurl - if item['clustered'] == "true": - nmap['status'] = NODE_ACTIVE - elif item['online'] == "false": - nmap['status'] = NODE_UNKNOWN - else: - nmap['status'] = NODE_INACTIVE - node_dict_list.append(nmap) - - clu_map['currentnodes'] = node_dict_list - return clu_map - def nodeLeave(self, rc, clustername, nodename_resolved): path = '%s%s/%s' % (CLUSTER_FOLDER_PATH, clustername, nodename_resolved) @@ -4707,657 +3898,6 @@ response.redirect('%s?pagetype=%s&clustername=%s&busyfirst=true' \ % (request['URL'], NODES, clustername)) -def getNodeInfo(self, model, status, request): - infohash = {} - item = None - baseurl = request['URL'] - nodestate = NODE_ACTIVE - svclist = list() - for thing in status: - if thing['type'] == "service": - svclist.append(thing) - - #Get cluster name and node name from request - try: - clustername = request['clustername'] - nodename = request['nodename'] - except Exception, e: - luci_log.debug_verbose('getNodeInfo0: %s' % str(e)) - return {} - - #extract correct node line from cluster status - found = False - for item in status: - if (item['type'] == "node") and (item['name'] == nodename): - found = True - break - if found == False: - luci_log.debug_verbose('getNodeInfo1: Unable to resolve node name in cluster status') - return {} - - #Now determine state of node... - if item['online'] == "false": - nodestate = NODE_UNKNOWN - elif item['clustered'] == "true": - nodestate = NODE_ACTIVE - else: - nodestate = NODE_INACTIVE - - infohash['nodestate'] = nodestate - infohash['nodename'] = nodename - - #set up drop down links - if nodestate == NODE_ACTIVE: - infohash['jl_url'] = '%s?pagetype=%s&task=%s&nodename=%s&clustername=%s' \ - % (baseurl, NODE_PROCESS, NODE_LEAVE_CLUSTER, nodename, clustername) - infohash['reboot_url'] = '%s?pagetype=%s&task=%s&nodename=%s&clustername=%s' \ - % (baseurl, NODE_PROCESS, NODE_REBOOT, nodename, clustername) - infohash['fence_url'] = '%s?pagetype=%s&task=%s&nodename=%s&clustername=%s' \ - % (baseurl, NODE_PROCESS, NODE_FENCE, nodename, clustername) - infohash['delete_url'] = '%s?pagetype=%s&task=%s&nodename=%s&clustername=%s' \ - % (baseurl, NODE_PROCESS, NODE_DELETE, nodename, clustername) - elif nodestate == NODE_INACTIVE: - infohash['jl_url'] = '%s?pagetype=%s&task=%s&nodename=%s&clustername=%s' \ - % (baseurl, NODE_PROCESS, NODE_JOIN_CLUSTER, nodename, clustername) - infohash['reboot_url'] = '%s?pagetype=%s&task=%s&nodename=%s&clustername=%s' \ - % (baseurl, NODE_PROCESS, NODE_REBOOT, nodename, clustername) - infohash['fence_url'] = '%s?pagetype=%s&task=%s&nodename=%s&clustername=%s' \ - % (baseurl, NODE_PROCESS, NODE_FENCE, nodename, clustername) - infohash['delete_url'] = '%s?pagetype=%s&task=%s&nodename=%s&clustername=%s' \ - % (baseurl, NODE_PROCESS, NODE_DELETE, nodename, clustername) - else: - infohash['fence_url'] = '%s?pagetype=%s&task=%s&nodename=%s&clustername=%s' \ - % (baseurl, NODE_PROCESS, NODE_FENCE, nodename, clustername) - - #figure out current services running on this node - svc_dict_list = list() - for svc in svclist: - if svc['nodename'] == nodename: - svc_dict = {} - svcname = svc['name'] - svcurl = '%s?pagetype=%s&clustername=%s&servicename=%s' \ - % (baseurl, SERVICE, clustername, svcname) - svc_dict['servicename'] = svcname - svc_dict['svcurl'] = svcurl - svc_dict_list.append(svc_dict) - - infohash['currentservices'] = svc_dict_list - - fdom_dict_list = list() - gulm_cluster = False - if model: - gulm_cluster = model.getGULMPtr() is not None - try: - infohash['gulm_lockserver'] = model.isNodeLockserver(nodename) - except: - infohash['gulm_lockserver'] = False - #next is faildoms - fdoms = model.getFailoverDomainsForNode(nodename) - for fdom in fdoms: - fdom_dict = {} - fdom_dict['name'] = fdom.getName() - fdomurl = '%s?pagetype=%s&clustername=%s&fdomname=%s' \ - % (baseurl, FDOM_CONFIG, clustername, fdom.getName()) - fdom_dict['fdomurl'] = fdomurl - fdom_dict_list.append(fdom_dict) - else: - infohash['gulm_lockserver'] = False - - infohash['fdoms'] = fdom_dict_list - - #return infohash - infohash['d_states'] = None - - nodename_resolved = resolve_nodename(self, clustername, nodename) - - if nodestate == NODE_ACTIVE or nodestate == NODE_INACTIVE: - #call service module on node and find out which daemons are running - try: - rc = RicciCommunicator(nodename_resolved) - if not rc: - raise Exception, 'rc is none' - except Exception, e: - rc = None - infohash['ricci_error'] = True - luci_log.info('Error connecting to %s: %s' \ - % (nodename_resolved, str(e))) - - if rc is not None: - dlist = list() - dlist.append("ccsd") - if not gulm_cluster: - dlist.append("cman") - dlist.append("fenced") - else: - dlist.append("lock_gulmd") - dlist.append("rgmanager") - states = rq.getDaemonStates(rc, dlist) - infohash['d_states'] = states - else: - infohash['ricci_error'] = True - - infohash['logurl'] = '/luci/logs/?nodename=%s&clustername=%s' \ - % (nodename_resolved, clustername) - return infohash - -def getNodesInfo(self, model, status, req): - resultlist = list() - nodelist = list() - svclist = list() - - #Sort into lists... - for item in status: - if item['type'] == "node": - nodelist.append(item) - elif item['type'] == "service": - svclist.append(item) - else: - continue - - try: - clustername = req['clustername'] - if not clustername: - raise KeyError, 'clustername is blank' - except: - try: - clustername = req.form['clustername'] - raise KeyError, 'clustername is blank' - except: - try: - clustername = req.form['clusterName'] - except: - try: - clustername = model.getClusterName() - except: - luci_log.debug_verbose('GNI0: unable to determine cluster name') - return {} - - for item in nodelist: - nl_map = {} - name = item['name'] - nl_map['nodename'] = name - try: - nl_map['gulm_lockserver'] = model.isNodeLockserver(name) - except: - nl_map['gulm_lockserver'] = False - - try: - baseurl = req['URL'] - except: - baseurl = '/luci/cluster/index_html' - - cfgurl = '%s?pagetype=%s&clustername=%s&nodename=%s' \ - % (baseurl, NODE, clustername, name) - nl_map['configurl'] = cfgurl - nl_map['fenceurl'] = '%s#fence' % cfgurl - if item['clustered'] == "true": - nl_map['status'] = NODE_ACTIVE - nl_map['status_str'] = NODE_ACTIVE_STR - elif item['online'] == "false": - nl_map['status'] = NODE_UNKNOWN - nl_map['status_str'] = NODE_UNKNOWN_STR - else: - nl_map['status'] = NODE_INACTIVE - nl_map['status_str'] = NODE_INACTIVE_STR - - nodename_resolved = resolve_nodename(self, clustername, name) - - nl_map['logurl'] = '/luci/logs?nodename=%s&clustername=%s' \ - % (nodename_resolved, clustername) - - #set up URLs for dropdown menu... - if nl_map['status'] == NODE_ACTIVE: - nl_map['jl_url'] = '%s?pagetype=%s&task=%s&nodename=%s&clustername=%s' \ - % (baseurl, NODE_PROCESS, NODE_LEAVE_CLUSTER, name, clustername) - nl_map['reboot_url'] = '%s?pagetype=%s&task=%s&nodename=%s&clustername=%s' \ - % (baseurl, NODE_PROCESS, NODE_REBOOT, name, clustername) - nl_map['fence_it_url'] = '%s?pagetype=%s&task=%s&nodename=%s&clustername=%s' \ - % (baseurl, NODE_PROCESS, NODE_FENCE, name, clustername) - nl_map['delete_url'] = '%s?pagetype=%s&task=%s&nodename=%s&clustername=%s' \ - % (baseurl, NODE_PROCESS, NODE_DELETE, name, clustername) - elif nl_map['status'] == NODE_INACTIVE: - nl_map['jl_url'] = '%s?pagetype=%s&task=%s&nodename=%s&clustername=%s' \ - % (baseurl, NODE_PROCESS, NODE_JOIN_CLUSTER, name, clustername) - nl_map['reboot_url'] = '%s?pagetype=%s&task=%s&nodename=%s&clustername=%s' \ - % (baseurl, NODE_PROCESS, NODE_REBOOT, name, clustername) - nl_map['fence_it_url'] = '%s?pagetype=%s&task=%s&nodename=%s&clustername=%s' \ - % (baseurl, NODE_PROCESS, NODE_FENCE, name, clustername) - nl_map['delete_url'] = '%s?pagetype=%s&task=%s&nodename=%s&clustername=%s' \ - % (baseurl, NODE_PROCESS, NODE_DELETE, name, clustername) - else: - nl_map['fence_it_url'] = '%s?pagetype=%s&task=%s&nodename=%s&clustername=%s' \ - % (baseurl, NODE_PROCESS, NODE_FENCE, name, clustername) - - #figure out current services running on this node - svc_dict_list = list() - for svc in svclist: - if svc['nodename'] == name: - svc_dict = {} - svcname = svc['name'] - svcurl = '%s?pagetype=%s&clustername=%s&servicename=%s' \ - % (baseurl, SERVICE, clustername, svcname) - svc_dict['servicename'] = svcname - svc_dict['svcurl'] = svcurl - svc_dict_list.append(svc_dict) - - nl_map['currentservices'] = svc_dict_list - #next is faildoms - - if model: - fdoms = model.getFailoverDomainsForNode(name) - else: - nl_map['ricci_error'] = True - fdoms = list() - fdom_dict_list = list() - for fdom in fdoms: - fdom_dict = {} - fdom_dict['name'] = fdom.getName() - fdomurl = '%s?pagetype=%s&clustername=%s&fdomname=%s' \ - % (baseurl, FDOM_CONFIG, clustername, fdom.getName()) - fdom_dict['fdomurl'] = fdomurl - fdom_dict_list.append(fdom_dict) - - nl_map['fdoms'] = fdom_dict_list - resultlist.append(nl_map) - - return resultlist - -def getFence(self, model, request): - if not model: - luci_log.debug_verbose('getFence0: model is None') - return {} - - fence_map = {} - fencename = request['fencename'] - fencedevs = model.getFenceDevices() - for fencedev in fencedevs: - if fencedev.getName().strip() == fencename: - fence_map = fencedev.getAttributes() - try: - fence_map['pretty_name'] = FENCE_OPTS[fencedev.getAgentType()] - except: - fence_map['unknown'] = True - fence_map['pretty_name'] = fencedev.getAgentType() - - nodes_used = list() - nodes = model.getNodes() - for node in nodes: - flevels = node.getFenceLevels() - for flevel in flevels: #These are the method blocks... - kids = flevel.getChildren() - for kid in kids: #These are actual devices in each level - if kid.getName().strip() == fencedev.getName().strip(): - #See if this fd already has an entry for this node - found_duplicate = False - for item in nodes_used: - if item['nodename'] == node.getName().strip(): - found_duplicate = True - if found_duplicate == True: - continue - baseurl = request['URL'] - clustername = model.getClusterName() - node_hash = {} - cur_nodename = node.getName().strip() - node_hash['nodename'] = cur_nodename - node_hash['nodeurl'] = '%s?clustername=%s&nodename=%s&pagetype=%s' \ - % (baseurl, clustername, cur_nodename, NODE) - nodes_used.append(node_hash) - - fence_map['nodesused'] = nodes_used - return fence_map - - return fence_map - -def getFDForInstance(fds, name): - for fd in fds: - if fd.getName().strip() == name: - return fd - - raise - -def getFenceInfo(self, model, request): - if not model: - luci_log.debug_verbose('getFenceInfo00: model is None') - return {} - - try: - clustername = request['clustername'] - except: - try: - clustername = request.form['clustername'] - except: - luci_log.debug_verbose('getFenceInfo0: unable to determine cluster name') - return {} - - try: - baseurl = request['URL'] - except Exception, e: - luci_log.debug_verbose('getFenceInfo1: no request.URL') - return {} - - fence_map = {} - level1 = list() #First level fence devices - level2 = list() #Second level fence devices - shared1 = list() #List of available sharable fence devs not used in level1 - shared2 = list() #List of available sharable fence devs not used in level2 - fence_map['level1'] = level1 - fence_map['level2'] = level2 - fence_map['shared1'] = shared1 - fence_map['shared2'] = shared2 - - major_num = 1 - minor_num = 100 - - try: - nodename = request['nodename'] - except: - try: - nodename = request.form['nodename'] - except: - luci_log.debug_verbose('getFenceInfo2: unable to extract nodename: %s' \ - % str(e)) - return {} - - #Here we need to get fences for a node - just the first two levels - #Each level has its own list of fence devs used in that level - #For each fence dev, a list of instance structs is appended - #In addition, for each level, a list of available but unused fence devs - #is returned. - try: - node = model.retrieveNodeByName(nodename) - except GeneralError, e: - luci_log.debug_verbose('getFenceInfo3: unabel to find node name %s in current node list' % (str(nodename), str(e))) - return {} - - fds = model.getFenceDevices() - - levels = node.getFenceLevels() - len_levels = len(levels) - - if len_levels == 0: - return fence_map - - if len_levels >= 1: - first_level = levels[0] - kids = first_level.getChildren() - last_kid_fd = None #This is a marker for allowing multi instances - #beneath a fencedev - for kid in kids: - instance_name = kid.getName().strip() - try: - fd = getFDForInstance(fds, instance_name) - except: - fd = None #Set to None in case last time thru loop - continue - - if fd is not None: - if fd.isShared() == False: #Not a shared dev...build struct and add - fencedev = {} - try: - fencedev['prettyname'] = FENCE_OPTS[fd.getAgentType()] - except: - fencedev['unknown'] = True - fencedev['prettyname'] = fd.getAgentType() - fencedev['isShared'] = False - fencedev['id'] = str(major_num) - major_num = major_num + 1 - devattrs = fd.getAttributes() - kees = devattrs.keys() - for kee in kees: - fencedev[kee] = devattrs[kee] - kidattrs = kid.getAttributes() - kees = kidattrs.keys() - for kee in kees: - if kee == "name": - continue #Don't duplicate name attr - fencedev[kee] = kidattrs[kee] - #This fencedev struct is complete, and needs to be placed on the - #level1 Q. Because it is non-shared, we should set last_kid_fd - #to none. - last_kid_fd = None - level1.append(fencedev) - else: #This dev is shared - if (last_kid_fd is not None) and (fd.getName().strip() == last_kid_fd['name'].strip()): #just append a new instance struct to last_kid_fd - instance_struct = {} - instance_struct['id'] = str(minor_num) - minor_num = minor_num + 1 - kidattrs = kid.getAttributes() - kees = kidattrs.keys() - for kee in kees: - if kee == "name": - continue - instance_struct[kee] = kidattrs[kee] - #Now just add this struct to last_kid_fd and reset last_kid_fd - ilist = last_kid_fd['instance_list'] - ilist.append(instance_struct) - #last_kid_fd = fd - continue - else: #Shared, but not used above...so we need a new fencedev struct - fencedev = {} - try: - fencedev['prettyname'] = FENCE_OPTS[fd.getAgentType()] - except: - fencedev['unknown'] = True - fencedev['prettyname'] = fd.getAgentType() - fencedev['isShared'] = True - fencedev['cfgurl'] = '%s?clustername=%s&fencename=%s&pagetype=%s' \ - % (baseurl, clustername, fd.getName().strip(), FENCEDEV) - fencedev['id'] = str(major_num) - major_num = major_num + 1 - inlist = list() - fencedev['instance_list'] = inlist - devattrs = fd.getAttributes() - kees = devattrs.keys() - for kee in kees: - fencedev[kee] = devattrs[kee] - instance_struct = {} - kidattrs = kid.getAttributes() - kees = kidattrs.keys() - for kee in kees: - if kee == "name": - continue - instance_struct[kee] = kidattrs[kee] - inlist.append(instance_struct) - level1.append(fencedev) - last_kid_fd = fencedev - continue - fence_map['level1'] = level1 - - #level1 list is complete now, but it is still necessary to build shared1 - for fd in fds: - isUnique = True - if fd.isShared() == False: - continue - for fdev in level1: - if fd.getName().strip() == fdev['name']: - isUnique = False - break - if isUnique == True: - shared_struct = {} - shared_struct['name'] = fd.getName().strip() - agentname = fd.getAgentType() - shared_struct['agent'] = agentname - try: - shared_struct['prettyname'] = FENCE_OPTS[agentname] - except: - shared_struct['unknown'] = True - shared_struct['prettyname'] = agentname - shared1.append(shared_struct) - fence_map['shared1'] = shared1 - - #YUK: This next section violates the DRY rule, :-( - if len_levels >= 2: - second_level = levels[1] - kids = second_level.getChildren() - last_kid_fd = None #This is a marker for allowing multi instances - #beneath a fencedev - for kid in kids: - instance_name = kid.getName().strip() - try: - fd = getFDForInstance(fds, instance_name) - except: - fd = None #Set to None in case last time thru loop - continue - if fd is not None: - if fd.isShared() == False: #Not a shared dev...build struct and add - fencedev = {} - try: - fencedev['prettyname'] = FENCE_OPTS[fd.getAgentType()] - except: - fencedev['unknown'] = True - fencedev['prettyname'] = fd.getAgentType() - fencedev['isShared'] = False - fencedev['id'] = str(major_num) - major_num = major_num + 1 - devattrs = fd.getAttributes() - kees = devattrs.keys() - for kee in kees: - fencedev[kee] = devattrs[kee] - kidattrs = kid.getAttributes() - kees = kidattrs.keys() - for kee in kees: - if kee == "name": - continue #Don't duplicate name attr - fencedev[kee] = kidattrs[kee] - #This fencedev struct is complete, and needs to be placed on the - #level2 Q. Because it is non-shared, we should set last_kid_fd - #to none. - last_kid_fd = None - level2.append(fencedev) - else: #This dev is shared - if (last_kid_fd is not None) and (fd.getName().strip() == last_kid_fd['name'].strip()): #just append a new instance struct to last_kid_fd - instance_struct = {} - instance_struct['id'] = str(minor_num) - minor_num = minor_num + 1 - kidattrs = kid.getAttributes() - kees = kidattrs.keys() - for kee in kees: - if kee == "name": - continue - instance_struct[kee] = kidattrs[kee] - #Now just add this struct to last_kid_fd and reset last_kid_fd - ilist = last_kid_fd['instance_list'] - ilist.append(instance_struct) - #last_kid_fd = fd - continue - else: #Shared, but not used above...so we need a new fencedev struct - fencedev = {} - try: - fencedev['prettyname'] = FENCE_OPTS[fd.getAgentType()] - except: - fencedev['unknown'] = True - fencedev['prettyname'] = fd.getAgentType() - fencedev['isShared'] = True - fencedev['cfgurl'] = '%s?clustername=%s&fencename=%s&pagetype=%s' \ - % (baseurl, clustername, fd.getName().strip(), FENCEDEV) - fencedev['id'] = str(major_num) - major_num = major_num + 1 - inlist = list() - fencedev['instance_list'] = inlist - devattrs = fd.getAttributes() - kees = devattrs.keys() - for kee in kees: - fencedev[kee] = devattrs[kee] - instance_struct = {} - kidattrs = kid.getAttributes() - kees = kidattrs.keys() - for kee in kees: - if kee == "name": - continue - instance_struct[kee] = kidattrs[kee] - inlist.append(instance_struct) - level2.append(fencedev) - last_kid_fd = fencedev - continue - fence_map['level2'] = level2 - - #level2 list is complete but like above, we need to build shared2 - for fd in fds: - isUnique = True - if fd.isShared() == False: - continue - for fdev in level2: - if fd.getName().strip() == fdev['name']: - isUnique = False - break - if isUnique == True: - shared_struct = {} - shared_struct['name'] = fd.getName().strip() - agentname = fd.getAgentType() - shared_struct['agent'] = agentname - try: - shared_struct['prettyname'] = FENCE_OPTS[agentname] - except: - shared_struct['unknown'] = True - shared_struct['prettyname'] = agentname - shared2.append(shared_struct) - fence_map['shared2'] = shared2 - - return fence_map - -def getFencesInfo(self, model, request): - fences_map = {} - if not model: - luci_log.debug_verbose('getFencesInfo0: model is None') - fences_map['fencedevs'] = list() - return fences_map - - clustername = request['clustername'] - baseurl = request['URL'] - fencedevs = list() #This is for the fencedev list page - - #Get list of fence devices - fds = model.getFenceDevices() - for fd in fds: - #This section determines which nodes use the dev - #create fencedev hashmap - nodes_used = list() - - if fd.isShared() == True: - fencedev = {} - attr_hash = fd.getAttributes() - kees = attr_hash.keys() - - for kee in kees: - fencedev[kee] = attr_hash[kee] #copy attrs over - try: - fencedev['pretty_name'] = FENCE_OPTS[fd.getAgentType()] - except: - fencedev['unknown'] = True - fencedev['pretty_name'] = fd.getAgentType() - - fencedev['agent'] = fd.getAgentType() - #Add config url for this fencedev - fencedev['cfgurl'] = '%s?clustername=%s&fencename=%s&pagetype=%s' \ - % (baseurl, clustername, fd.getName().strip(), FENCEDEV) - - nodes = model.getNodes() - for node in nodes: - flevels = node.getFenceLevels() - for flevel in flevels: #These are the method blocks... - kids = flevel.getChildren() - for kid in kids: #These are actual devices in each level - if kid.getName().strip() == fd.getName().strip(): - #See if this fd already has an entry for this node - found_duplicate = False - for item in nodes_used: - if item['nodename'] == node.getName().strip(): - found_duplicate = True - if found_duplicate == True: - continue - node_hash = {} - cur_nodename = node.getName().strip() - node_hash['nodename'] = cur_nodename - node_hash['nodeurl'] = '%s?clustername=%s&nodename=%s&pagetype=%s' \ - % (baseurl, clustername, cur_nodename, NODE) - nodes_used.append(node_hash) - - fencedev['nodesused'] = nodes_used - fencedevs.append(fencedev) - - fences_map['fencedevs'] = fencedevs - return fences_map - def getLogsForNode(self, request): try: nodename = request['nodename'] @@ -5416,43 +3956,6 @@ return rq.getNodeLogs(rc) -def getVMInfo(self, model, request): - vm_map = {} - - try: - clustername = request['clustername'] - except Exception, e: - try: - clustername = model.getName() - except: - return vm_map - - svcname = None - try: - svcname = request['servicename'] - except Exception, e: - try: - vmname = request.form['servicename'] - except Exception, e: - return vm_map - - vm_map['formurl'] = '%s?clustername=%s&pagetype=29&servicename=%s' \ - % (request['URL'], clustername, svcname) - - try: - vm = model.retrieveVMsByName(vmname) - except: - luci_log.debug('An error occurred while attempting to get VM %s' \ - % vmname) - return vm_map - - attrs = vm.getAttributes() - keys = attrs.keys() - for key in keys: - vm_map[key] = attrs[key] - - return vm_map - def isClusterBusy(self, req): items = None busy_map = {} @@ -5784,92 +4287,6 @@ clu_map['isVirtualized'] = False return clu_map -def getResourcesInfo(model, request): - resList = list() - baseurl = request['URL'] - - try: - cluname = request['clustername'] - except: - try: - cluname = request.form['clustername'] - except: - luci_log.debug_verbose('getResourcesInfo missing cluster name') - return resList - - for item in model.getResources(): - itemmap = {} - cur_itemname = item.getName().strip() - itemmap['name'] = cur_itemname - itemmap['attrs'] = item.attr_hash - itemmap['type'] = item.resource_type - itemmap['tag_name'] = item.TAG_NAME - itemmap['cfgurl'] = '%s?clustername=%s&resourcename=%s&pagetype=%s' \ - % (baseurl, cluname, cur_itemname, RESOURCE_CONFIG) - itemmap['url'] = '%s?clustername=%s&resourcename=%s&pagetype=%s' \ - % (baseurl, cluname, cur_itemname, RESOURCE) - itemmap['delurl'] = '%s?clustername=%s&resourcename=%s&pagetype=%s' \ - % (baseurl, cluname, cur_itemname, RESOURCE_REMOVE) - resList.append(itemmap) - return resList - -def getResourceInfo(model, request): - if not model: - luci_log.debug_verbose('GRI0: no model object in session') - return {} - - name = None - try: - name = request['resourcename'] - except: - try: - name = request.form['resourcename'] - except: - pass - - if name is None: - try: - res_type = request.form['type'] - if res_type == 'ip': - name = request.form['value'].strip() - except: - pass - - if name is None: - luci_log.debug_verbose('getResourceInfo missing res name') - return {} - - try: - cluname = request['clustername'] - except: - try: - cluname = request.form['clustername'] - except: - luci_log.debug_verbose('getResourceInfo missing cluster name') - return {} - - try: - baseurl = request['URL'] - except: - luci_log.debug_verbose('getResourceInfo missing URL') - return {} - - for res in model.getResources(): - if res.getName() == name: - try: - resMap = {} - cur_resname = res.getName().strip() - resMap['name'] = cur_resname - resMap['type'] = res.resource_type - resMap['tag_name'] = res.TAG_NAME - resMap['attrs'] = res.attr_hash - resMap['cfgurl'] = '%s?clustername=%s&resourcename=%s&pagetype=%s' \ - % (baseurl, cluname, cur_resname, RESOURCE_CONFIG) - return resMap - except: - continue - return {} - def delService(self, request): errstr = 'An error occurred while attempting to set the new cluster.conf' @@ -6089,22 +4506,12 @@ response.redirect('%s?pagetype=%s&clustername=%s&busyfirst=true' % (request['URL'], RESOURCES, clustername)) -def getResource(model, name): - resPtr = model.getResourcesPtr() - resources = resPtr.getChildren() - - for res in resources: - if res.getName() == name: - return res - - luci_log.debug_verbose('getResource: unable to find resource "%s"' % name) - raise KeyError, name def appendModel(request, model): try: request.SESSION.set('model', model) - except: - luci_log.debug_verbose('Appending model to request failed') + except Exception, e: + luci_log.debug_verbose('Appending model to request failed: %r' % e) return 'An error occurred while storing the cluster model.' def getModelBuilder(self, rc, isVirtualized): @@ -6113,21 +4520,21 @@ if not cluster_conf_node: raise Exception, 'getClusterConf returned None' except Exception, e: - luci_log.debug_verbose('GMB0: unable to get cluster_conf_node in getModelBuilder: %s' % str(e)) + luci_log.debug_verbose('GMB0: unable to get cluster_conf_node in getModelBuilder: %r' % e) return None try: model = ModelBuilder(0, None, None, cluster_conf_node) if not model: - raise Exception, 'ModelBuilder returned None' + raise Exception, 'ModelBuilder() returned None' except Exception, e: try: - luci_log.debug_verbose('GMB1: An error occurred while trying to get model for conf "%s": %s' % (cluster_conf_node.toxml(), str(e))) + luci_log.debug_verbose('GMB1: An error occurred while trying to get model for conf "%r": %r' % (cluster_conf_node.toxml(), e)) except: luci_log.debug_verbose('GMB1: ModelBuilder failed') + return None - if model: - model.setIsVirtualized(isVirtualized) + model.setIsVirtualized(isVirtualized) return model def getModelForCluster(self, clustername): @@ -6142,8 +4549,8 @@ if not model: raise Exception, 'model is none' except Exception, e: - luci_log.debug_verbose('GMFC1: unable to get model builder for %s: %s' \ - % (clustername, str(e))) + luci_log.debug_verbose('GMFC1: unable to get model builder for %s: %r' \ + % (clustername, e)) return None return model