[Cluster-devel] conga/luci/site/luci/Extensions homebase_adapt ...

rmccabe at sourceware.org rmccabe at sourceware.org
Thu Jun 22 03:58:41 UTC 2006


CVSROOT:	/cvs/cluster
Module name:	conga
Changes by:	rmccabe at sourceware.org	2006-06-22 03:58:41

Modified files:
	luci/site/luci/Extensions: homebase_adapters.py 

Log message:
	

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/homebase_adapters.py.diff?cvsroot=cluster&r1=1.4&r2=1.5

--- conga/luci/site/luci/Extensions/homebase_adapters.py	2006/06/08 19:56:35	1.4
+++ conga/luci/site/luci/Extensions/homebase_adapters.py	2006/06/22 03:58:41	1.5
@@ -4,9 +4,7 @@
 import os
 from AccessControl import getSecurityManager
 from ZPublisher import HTTPRequest
-import xml
 import xml.dom
-from xml.dom import minidom
 
 from ricci_defines import *
 from ricci_communicator import RicciCommunicator
@@ -35,6 +33,9 @@
 	errors = list()
 	messages = list()
 
+	sys.stdout = sys.stderr
+	print request.form
+
 	if '__SYSTEM' in request.form:
 		sysNames = request.form['__SYSTEM']
 		for i in sysNames:
@@ -110,6 +111,10 @@
 		return (False, {'errors': ['You didn\'t confirm the password'] })
 
 	user = request.form['newUserName']
+
+	if self.portal_membership.getMemberById(user):
+		return (False, {'errors': ['The user \"' + user + '\" already exists']})
+
 	passwd = request.form['newPassword']
 	pwconfirm = request.form['newPasswordConfirm']
 
@@ -136,7 +141,7 @@
 
 	# This should never fail
 	try:
-		numSystems = request.form['numSystems']
+		numStorage = request.form['numStorage']
 	except:
 		return (False, {'errors': ['Unknown number of systems entered']})
 
@@ -146,19 +151,23 @@
 
 	cclRet = createCluster(self, clusterName)
 	if cclRet:
-		return (False, {'errors': cclRet })
+		return (False, {'errors': [cclRet] })
 	else:
 		messages.append('Created cluster \"' + clusterName + '\" successfully')
 
 	i = 0
-	while i < numSystems:
+	while i < numStorage:
 		try:
 			sysData = request.form['__SYSTEM' + str(i)]
 		except:
 			break
 
 		if len(sysData) == 2 and sysData[0] != '' and sysData[1] != '':
-			csResult = createSystem(self, sysData[0], sysData[1])
+			try:
+				csResult = createClusterSystem(self, clusterName, sysData[0], sysData[1])
+			except string, e:
+				dialog_str = 'The system \"' + sysData[0] + '\" is a member of the cluster \"' + e + '\"\nDo you want to manage the whole cluster?'
+				return (True, {'dialog': dialog_str })
 			if csResult:
 				errors.append(csResult)
 			else:
@@ -177,12 +186,12 @@
 	messages = list()
 
 	try:
-		numSystems = request.form['numSystems']
+		numStorage = request.form['numStorage']
 	except:
 		return (False, {'errors': ['Unknown number of systems entered']})
 
 	i = 0
-	while i < numSystems:
+	while i < numStorage:
 		try:
 			sysData = request.form['__SYSTEM' + str(i)]
 		except:
@@ -220,7 +229,7 @@
 	userId = user.getUserId()
 
 	clusters = self.restrictedTraverse(PLONE_ROOT + '/systems/cluster/objectItems')()
-	if not request.form.__contains__('__CLUSTER'):
+	if not '__CLUSTER' in request.form:
 		for i in clusters:
 			try:
 				if user.has_role('View', i[1]):
@@ -261,7 +270,7 @@
 						errors.append('Failed to remove permission for ' + userId + ' for cluster ' + i[0])
 
 	storage = self.restrictedTraverse(PLONE_ROOT + '/systems/storage/objectItems')()
-	if not request.form.__contains__('__STORAGE'):
+	if not '__SYSTEM' in request.form:
 		for i in storage:
 			try:
 				if user.has_role('View', i[1]):
@@ -277,7 +286,7 @@
 				errors.append('Failed to remove permission for ' + userId + ' for ' + i[0])
 	else:
 		for i in storage:
-			if i[0] in request.form['__STORAGE']:
+			if i[0] in request.form['__SYSTEM']:
 				try:
 					if not user.has_role('View', i[1]):
 						roles = list(i[1].get_local_roles_for_userid(userId))
@@ -338,37 +347,28 @@
 	return False
 
 def homebaseControlPost(self, request):
-	if 'ACTUAL_URL' in request:
+	if 'absoluteURL' in request.form:
+		url = request.form['absoluteURL']
+	elif 'ACTUAL_URL' in request:
 		url = request['ACTUAL_URL']
+	elif 'URL' in request:
+		url = request['URL']
 	else:
-		try:
-			url = request.form['absoluteURL']
-		except:
-			if 'URL' in request:
-				url = request['URL']
-			else:
-				url = '.'
+		url = '.'
 
-	try:
+	if 'pagetype' in request.form:
 		pagetype = request.form['pagetype']
-	except:
+	else:
 		return homebasePortal(self, request, '.', '0')
 
-	validatorFn = formValidators[int(request.form['pagetype']) - 1]
-	# Invalid request, send them to homebase
+	try:
+		validatorFn = formValidators[int(request.form['pagetype']) - 1]
+	except:
+		return homebasePortal(self, request, '.', '0')
 
 	ret = validatorFn(self, request)
-
 	request.SESSION.set('checkRet', ret[1])
-
-	if ret[0] == True:
-		# No errors occurred
-		return homebasePortal(self, request, url, pagetype, ret[1])
-
-		return homebasePortal(self, request, url, pagetype, ret[1])
-	else:
-		# Errors occurred
-		return homebasePortal(self, request, url, pagetype, ret[1])
+	return homebasePortal(self, request, url, pagetype, ret[1])
 
 def homebaseControl(self, request):
 	try:
@@ -380,23 +380,21 @@
 		return homebaseControlPost(self, request)
 
 	try:
-		url = request['URL']
+		url = request.form['absoluteURL']
 	except:
-		url = '.'
+		try:
+			url = request['URL']
+		except:
+			url = '.'
 
 	try:
 		pagetype = request.form['pagetype']
 	except:
 		pagetype = '0'
 
-	return homebasePortal(self, request,  url, pagetype)
+	return homebasePortal(self, request, url, pagetype)
 
 def homebasePortal(self, request=None, url=None, pagetype=None, params=None):
-#
-# The add user page
-#
-#	if params and 'dest' in params:
-#		pagetype = params['dest']
 	ret = {}
 	temp = list()
 	index = 0
@@ -471,17 +469,17 @@
 
 	try:
 		if (havePermRemStorage(self) and havePermRemCluster(self) and (getStorage(self) or getClusters(self))):
-			delSystem = {}
-			delSystem['Title'] = 'Remove a System'
-			delSystem['absolute_url'] = url + '?pagetype=' + HOMEBASE_DEL_SYSTEM
-			delSystem['Description'] = 'Remove a system'
+			remSystem = {}
+			remSystem['Title'] = 'Remove a System'
+			remSystem['absolute_url'] = url + '?pagetype=' + HOMEBASE_DEL_SYSTEM
+			remSystem['Description'] = 'Remove a system'
 			if pagetype == HOMEBASE_DEL_SYSTEM:
-				delSystem['currentItem'] = True
+				remSystem['currentItem'] = True
 				ret['curIndex'] = index
 			else:
-				delSystem['currentItem'] = False
+				remSystem['currentItem'] = False
 			index += 1
-			temp.append(delSystem)
+			temp.append(remSystem)
 	except: pass
 
 #
@@ -494,8 +492,8 @@
 			userPerm['absolute_url'] = url + '?pagetype=' + HOMEBASE_PERMS
 			userPerm['Description'] = 'Set permissions for users'
 			if pagetype == HOMEBASE_PERMS:
-#				if params and 'user' in params:
-#					userPerm['absolute_url'] += '&user=' + params['user']
+				if params and 'user' in params:
+					userPerm['curUser'] += params['user']
 				userPerm['currentItem'] = True
 				ret['curIndex'] = index
 			else:
@@ -510,13 +508,34 @@
 	ret['children'] = temp
 	return ret
 
+def getClusterSystems(self, clusterName):
+	if isAdmin(self):
+		return self.restrictedTraverse(PLONE_ROOT + '/systems/cluster/' + clusterName + '/objectItems')()
+
+	try:
+		i = getSecurityManager().getUser()
+		if not i:
+			raise
+	except:
+		return None
+
+	csystems = self.restrictedTraverse(PLONE_ROOT + '/systems/cluster/' + clusterName + '/objectItems')()
+	if not csystems:
+		return None
+
+	allowedCSystems = list()
+	for c in csystems:
+		if i.has_role('View', c[1]):
+			allowedCSystems.append(c)
+	return (c)
+
 def getClusters(self):
 	if isAdmin(self):
 		return self.restrictedTraverse(PLONE_ROOT + '/systems/cluster/objectItems')()
 	try:
 		i = getSecurityManager().getUser()
 		if not i:
-			return None
+			raise
 	except:
 		return None
 
@@ -554,6 +573,12 @@
 
 def createSystem(self, host, passwd):
 	try:
+		exists = self.restrictedTraverse(PLONE_ROOT +'/systems/storage/' + host)
+		return 'Storage system \"' +  host + '\" is already managed.'
+	except:
+		pass
+
+	try:
 		rc = RicciCommunicator(host)
 	except:
 		return 'Unable to establish a connection to the ricci agent on \"' + host + '\"'
@@ -588,6 +613,16 @@
 	except:
 		return 'Unable to set permissions on new system \"' + host + '\"'
 
+#	sys.stdout = sys.stderr
+#	cluster_info = rc.cluster_info()
+#	if cluster_info[0] != '':
+#		cluConf = getClusterConf(rc)
+#		if cluConf:
+#			print cluConf.toxml()
+#			nodeList = getClusterConfNodes(cluConf)
+#			sys.stdout = sys.stderr
+#			print "other nodes in",cluster_info[0],"::",nodeList
+
 def createCluster(self, clusterName):
 	try:
 		clusters = self.restrictedTraverse(PLONE_ROOT + '/systems/cluster/')
@@ -625,22 +660,27 @@
 	if i != True:
 		return 'Authentication for host \"' + host + '\" failed'
 
+	cluster_info = rc.cluster_info()
+	if len(cluster_info) > 0 and cluster_info[0] != '' and  cluster_info[0] != cluster:
+		return 'The host \"' + host + '\" is already a member of the cluster \"' + cluster_info[0] + '\"'
+
 	try:
-		ssystem = self.restrictedTraverse(PLONE_ROOT + '/systems/cluster/' + cluster)
+		exists = self.restrictedTraverse(PLONE_ROOT + '/systems/cluster/' + cluster + '/' + host)
+		if exists:
+			return None
 	except:
-		return 'Unable to create storage system \"' + host + '\" for cluster \"' + cluster + '\"'
+		pass
 
 	try:
-		ssystem.manage_addFolder(host, '__luci__:system')
-		newSystem = self.restrictedTraverse(PLONE_ROOT + '/systems/storage/' + host)
+		ssystem = self.restrictedTraverse(PLONE_ROOT + '/systems/cluster/' + cluster)
 	except:
-		return 'Unable to create storage system \"' + host + '\" for cluster \"' + cluster + '\"'
+		return 'Unable to create storage system \"' + host + '\" for cluster \"' + cluster + '\": Cannot find cluster'
 
 	try:
-		newSystem.manage_acquiredPermissions([])
-		newSystem.manage_role('View', ['Access contents information','View'])
+		ssystem.manage_addFolder(host, '__luci__:csystem:' + cluster)
+		newSystem = self.restrictedTraverse(PLONE_ROOT + '/systems/cluster/' + cluster + '/' + host)
 	except:
-		return 'Unable to set permissions on new system \"' + host + '\" for cluster \"' + cluster + '\"'
+		return 'Unable to create storage system \"' + host + '\" for cluster \"' + cluster + '\"'
 
 	try:
 		ssystem = self.restrictedTraverse(PLONE_ROOT + '/systems/storage/')
@@ -649,7 +689,13 @@
 
 	try:
 		ssystem.manage_addFolder(host, '__luci__:system')
+	except:
+		pass
+
+	try:
 		newSystem = self.restrictedTraverse(PLONE_ROOT + '/systems/storage/' + host)
+		if not newSystem:
+			raise
 	except:
 		return 'Unable to create storage system \"' + host + '\"'
 
@@ -660,16 +706,38 @@
 		return 'Unable to set permissions on new storage system \"' + host + '\"'
 
 def delSystem(self, systemName):
-	# should rikki revoke certs?
 	try:
 		ssystem = self.restrictedTraverse(PLONE_ROOT + '/systems/storage/')
 	except:
 		return 'Unable to find storage system \"' + systemName + '\"'
 
+	rc = RicciCommunicator(systemName)
+	cluster_info = rc.cluster_info()
+
 	try:
-		ssystem.manage_delObjects([systemName])
-	except:
-		return 'Unable to delete storage system \"' + systemName + '\"'
+		rc.unauth()
+	except Exception, e:
+		e = str(e)
+		if str(e) != '5':
+			# If it's simply a case where we're not authed in the first
+			# place, an attempt to unauthorize failing isn't a problem.
+			return 'Unable to unauthenticate to storage system \"' + systemName + '\"'
+		pass
+
+	if len(cluster_info) > 0 and cluster_info[0] != '':
+		try:
+			delClusterSystem(self, str(cluster_info[0]), systemName)
+		except KeyError:
+			# The cluster may have been deleted, but the system
+			# may still exist in the storage dir.
+			pass
+		except:
+			return 'Unable to delete cluster storage system \"' + systemName + '\"'
+
+		try:
+			ssystem.manage_delObjects([systemName])
+		except:
+			return 'Unable to delete storage system \"' + systemName + '\"'
 
 def delCluster(self, clusterName):
 	try:
@@ -681,7 +749,29 @@
 		clusters.manage_delObjects([clusterName])
 	except:
 		return 'Unable to delete cluster \"' + clusterName + '\"'
-	
+
+def delClusterSystem(self, clusterName, systemName):
+	cluster = self.restrictedTraverse(PLONE_ROOT + '/systems/cluster/' + clusterName)
+	cluster.manage_delObjects([systemName])
+
+def delClusterSystems(self, clusterName):
+	try:
+		cluster = self.restrictedTraverse(PLONE_ROOT + '/systems/cluster/' + clusterName)
+		csystems = getClusterSystems(self, clusterName)
+	except:
+		return 'Unable to find any systems for cluster \"' + clusterName + '\"'
+
+	errors = ''
+	for i in csystems:
+		try:
+			delSystem(i)
+			cluster.manage_delObjects([i])
+			delClusterSystem(i)
+		except:
+			errors += 'Unable to delete the cluster system \"' + i + '\"\n'
+
+	return errors
+
 def getDefaultUser(self):
 	try:
 		return self.portal_membership.listMembers()[0].getUserName()
@@ -732,7 +822,7 @@
 	return isAdmin(self) 
 
 def getClusterConf(rc):
-	doc = minidom.Document()
+	doc = xml.dom.minidom.Document()
 	batch = doc.createElement('batch')
 	module = doc.createElement('module')
 	module.setAttribute('name', 'cluster')
@@ -743,8 +833,12 @@
 	request.appendChild(call)
 	module.appendChild(request)
 	batch.appendChild(module)
+
 	ret = rc.process_batch(batch)
 
+	if not ret:
+		return None
+
 	cur = ret
 	while len(cur.childNodes) > 0:
 		for i in cur.childNodes:
@@ -753,10 +847,9 @@
 					return i.childNodes[1].cloneNode(True)
 				else:
 					cur = i
-		
 	return None
 
-def getClusterNodes(clusterConfDom):
+def getClusterConfNodes(clusterConfDom):
 	cur = clusterConfDom
 	clusterNodes = list()
 
@@ -768,3 +861,25 @@
 					clusterNodes.append(i.getAttribute('name'))
 			return clusterNodes
 	return clusterNodes
+
+def getSystems(self):
+	storage = getStorage(self)
+	clusters = getClusters(self)
+	storageList = None
+	ret = [{}, None]
+	zeroindex = lambda i: i[0]
+
+	if storage and len(storage) > 0:
+		storageList = map(zeroindex, storage)
+
+	for i in clusters:
+		cSystems = map(zeroindex, getClusterSystems(self, i[0]))
+		for c in cSystems:
+			try:
+				del storageList[storageList.index(c)]
+			except ValueError: pass
+		ret[0][i[0]] = cSystems
+
+	if storageList:
+		ret[1] = storageList
+	return ret




More information about the Cluster-devel mailing list