From mboxrd@z Thu Jan 1 00:00:00 1970 From: rmccabe@sourceware.org Date: 25 Sep 2006 22:59:16 -0000 Subject: [Cluster-devel] conga/luci/site/luci/Extensions cluster_adapte ... Message-ID: <20060925225916.22775.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 Changes by: rmccabe at sourceware.org 2006-09-25 22:59:15 Modified files: luci/site/luci/Extensions: cluster_adapters.py homebase_adapters.py ricci_bridge.py Log message: add node stuff Patches: http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/cluster_adapters.py.diff?cvsroot=cluster&r1=1.69&r2=1.70 http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/homebase_adapters.py.diff?cvsroot=cluster&r1=1.20&r2=1.21 http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/ricci_bridge.py.diff?cvsroot=cluster&r1=1.18&r2=1.19 --- conga/luci/site/luci/Extensions/cluster_adapters.py 2006/09/25 21:00:14 1.69 +++ conga/luci/site/luci/Extensions/cluster_adapters.py 2006/09/25 22:59:15 1.70 @@ -23,7 +23,7 @@ #then only display chooser if the current user has #permissions on at least one. If the user is admin, show ALL clusters -from homebase_adapters import nodeAuth, nodeUnauth, manageCluster +from homebase_adapters import nodeAuth, nodeUnauth, manageCluster, createClusterSystems CLUSTER_FOLDER_PATH = '/luci/systems/cluster/' @@ -151,6 +151,7 @@ cluster_properties['isComplete'] = False errors.append(error) return (False, {'errors': errors, 'requestResults':cluster_properties }) + batch_id_map = {} for i in nodeList: try: @@ -189,7 +190,8 @@ def validateAddClusterNode(self, request): errors = list() - messages = list() + messages = list() + requestResults = {} try: sessionData = request.SESSION.get('checkRet') @@ -199,7 +201,7 @@ if 'clusterName' in request.form: clusterName = request.form['clusterName'] else: - return (False, {'errors': [ 'Cluster name is missing'] }) + return (False, {'errors': [ 'Cluster name is missing'], 'requestResults': requestResults }) try: numStorage = int(request.form['numStorage']) @@ -207,7 +209,7 @@ raise except: errors.append('You must specify at least one node to add to the cluster') - return (False, {'errors': [ errors ] }) + return (False, {'errors': [ errors ], 'requestResults': requestResults }) ret = validateClusterNodes(request, sessionData, clusterName, numStorage) errors.extend(ret[0]) @@ -225,18 +227,43 @@ i = 0 while i < len(nodeList): + clunode = nodeList[i] try: - x = 0 # ricci call succeeds - messages.append('Cluster join initiated for host \"' + i['ricci_host'] + '\"') + batchNode = addClusterNodeBatch(clusterName, True, False, False) + if not batchNode: + raise del nodeList[i] except: - i['errors'] = True - errors.append('Unable to initiate node creation for host \"' + i['ricci_host'] + '\"') - cluster_properties['isComplete'] = 0 + clunode['errors'] = True + nodeUnauth(nodeList) + cluster_properties['isComplete'] = False + errors.append('Unable to initiate node creation for host \"' + clunode['ricci_host'] + '\"') if not cluster_properties['isComplete']: return (False, {'errors': errors, 'requestResults': cluster_properties}) + error = createClusterSystems(self, clusterName, nodeList) + if error: + nodeUnauth(nodeList) + cluster_properties['isComplete'] = False + errors.append(error) + return (False, {'errors': errors, 'requestResults': cluster_properties}) + + batch_id_map = {} + for i in nodeList: + clunode = nodeList[i] + try: + rc = RicciCommunicator(clunode['ricci_host']) + resultNode = rc.process_batch(batchNode, async=True) + batch_id_map[clunode['ricci_host']] = resultNode.getAttribute('batch_id') + messages.append('Cluster join initiated for host \"' + clunode['ricci_host'] + '\"') + except: + nodeUnauth(nodeList) + cluster_properties['isComplete'] = False + errors.append('An error occurred while attempting to add cluster node \"' + clunode['ricci_host'] + '\"') + return (False, {'errors': errors, 'requestResults': cluster_properties}) + + buildClusterCreateFlags(self, batch_id_map, clusterName) return (True, {'errors': errors, 'messages': messages}) formValidators = { --- conga/luci/site/luci/Extensions/homebase_adapters.py 2006/08/01 16:27:53 1.20 +++ conga/luci/site/luci/Extensions/homebase_adapters.py 2006/09/25 22:59:15 1.21 @@ -986,6 +986,92 @@ newSystem.manage_role('View', [ 'Access contents information' , 'View' ]) except: pass +def createClusterSystems(self, clusterName, nodeList): + try: + clusterObj = self.restrictedTraverse(PLONE_ROOT + '/systems/cluster/' + clusterName) + if not clusterObj: + raise + except: + nodeUnauth(nodeList) + return 'No cluster named \"' + clusterName + '\" is managed by Luci' + + for i in nodeList: + if 'ricci_host' in i: + host = str(i['ricci_host']) + else: + host = str(i['host']) + + try: + clusterObj.manage_addFolder(host, '__luci__:csystem:' + clusterName) + newSystem = self.restrictedTraverse(PLONE_ROOT + '/systems/cluster/' + clusterName + '/' + host) + if not newSystem: + raise + newSystem.manage_acquiredPermissions([]) + newSystem.manage_role('View', [ 'Access contents information' , 'View' ]) + except: + nodeUnauth(nodeList) + return 'Unable to create cluster node \"' + host + '\" for cluster \"' + clusterName + '\"' + + try: + ssystem = self.restrictedTraverse(PLONE_ROOT + '/systems/storage/') + if not ssystem: + raise + except: + return + + # Only add storage systems if the and cluster node DB + # objects were added successfully. + for i in nodeList: + if 'ricci_host' in i: + host = str(i['ricci_host']) + else: + host = str(i['host']) + + try: + # It's already there, as a storage system, no problem. + exists = self.restrictedTraverse(PLONE_ROOT + '/systems/storage/' + host) + continue + except: pass + + try: + ssystem.manage_addFolder(host, '__luci__:system') + newSystem = self.restrictedTraverse(PLONE_ROOT + '/systems/storage/' + host) + newSystem.manage_acquiredPermissions([]) + newSystem.manage_role('View', [ 'Access contents information' , 'View' ]) + except: pass + +def delSystem(self, systemName): + try: + ssystem = self.restrictedTraverse(PLONE_ROOT + '/systems/storage/') + except: + return 'Unable to find storage system \"' + systemName + '\"' + + try: + rc = RicciCommunicator(systemName) + if not rc: + raise + except: + return 'Unable to connect to the ricci agent on \"' + systemName + '\" to unauthenticate' + + # Only unauthenticate if the system isn't a member of + # a managed cluster. + cluster_info = rc.cluster_info() + if not cluster_info[0]: + try: rc.unauth() + except: pass + else: + try: + newSystem = self.restrictedTraverse(PLONE_ROOT + '/systems/cluster/' + cluster_info[0] + '/' + rc.system_name()) + except: + try: rc.unauth() + except: pass + + try: + ssystem.manage_delObjects([systemName]) + except: + return 'Unable to delete storage system \"' + systemName + '\"' + + def delSystem(self, systemName): try: ssystem = self.restrictedTraverse(PLONE_ROOT + '/systems/storage/') --- conga/luci/site/luci/Extensions/ricci_bridge.py 2006/09/23 04:04:08 1.18 +++ conga/luci/site/luci/Extensions/ricci_bridge.py 2006/09/25 22:59:15 1.19 @@ -594,6 +594,57 @@ #parse out log entry return payload +def addClusterNodeBatch(cluster_name, services, shared_storage, LVS): + batch = '' + batch += '' + batch += '' + batch += '' + batch += '' + batch += '' + batch += '' + if services: + batch += '' + if shared_storage: + batch += '' + if LVS: + batch += '' + batch += '' + batch += '' + batch += '' + batch += '' + + batch += '' + batch += '' + batch += '' + batch += '' + batch += '' + + batch += '' + batch += '' + batch += '' + batch += '' + batch += '' + batch += '' + batch += '' + batch += '' + batch += '' + batch += '' + batch += '' + batch += '' + batch += '' + batch += '' + batch += '' + batch += '' + + batch += '' + batch += '' + batch += '' + batch += '' + batch += '' + batch += '' + + return minidom.parseString(batch).firstChild + def createClusterBatch(cluster_name, cluster_alias, nodeList, services, shared_storage, LVS): batch = '' batch += ''