All of lore.kernel.org
 help / color / mirror / Atom feed
From: rmccabe@sourceware.org <rmccabe@sourceware.org>
To: cluster-devel.redhat.com
Subject: [Cluster-devel] conga/luci/site/luci/Extensions cluster_adapte ...
Date: 19 Jul 2006 20:19:54 -0000	[thread overview]
Message-ID: <20060719201954.11998.qmail@sourceware.org> (raw)

CVSROOT:	/cvs/cluster
Module name:	conga
Changes by:	rmccabe at sourceware.org	2006-07-19 20:19:53

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

Log message:
	cluster create, and cluster remove (stop managing) bits

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/cluster_adapters.py.diff?cvsroot=cluster&r1=1.2&r2=1.3
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/homebase_adapters.py.diff?cvsroot=cluster&r1=1.13&r2=1.14

--- conga/luci/site/luci/Extensions/cluster_adapters.py	2006/07/14 16:00:26	1.2
+++ conga/luci/site/luci/Extensions/cluster_adapters.py	2006/07/19 20:19:53	1.3
@@ -14,12 +14,111 @@
 #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                     
 
 CLUSTER_FOLDER_PATH = '/luci/systems/cluster/'
 
+def validatePost(request):
+	if int(request.form['pagetype']) != 6:
+		return
+
+	errors = list()
+	nodeList = list()
+	nodeHash = {}
+	rnodeHash = {}
+	oldNodeHash = {}
+	oldRnodeHash = {}
+	requestResults = {}
+
+ 	sessionData = request.SESSION.get('checkRet')
+	if sessionData and 'requestResults' in sessionData:
+		requestResults = sessionData['requestResults']
+		if 'nodeHash' in requestResults:
+			oldNodeHash = requestResults['nodeHash']
+		if 'rnodeHash' in requestResults:
+			oldRnodeHash = requestResults['rnodeHash']
+
+	if not 'clusterName' in request.form or not request.form['clusterName']:
+		return (False, {'errors': [ 'No cluster name was specified.' ] })
+	clusterName = request.form['clusterName']
+
+	try:
+		numStorage = int(request.form['numStorage'])
+	except:
+		return (False, { 'errors': ['Unknown number of systems entered'], 'requestResults': requestResults })
+
+	if numStorage < 2:
+		return (False, { 'errors': ['A cluster must contain@least two nodes'], 'requestResults': requestResults })
+
+	i = 0
+	while i < numStorage:
+		try:
+			sysData = request.form['__SYSTEM' + str(i)]
+			if not sysData or sysData[0] == '':
+				raise
+
+			if len(sysData) < 2 or sysData[1] == '':
+				errors.append('No password was specified for host \"' + sysData[0] + '\"')
+				raise
+		except:
+			i += 1
+			continue
+
+		if len(sysData) > 1:
+			node = nodeAuth(None, sysData[0], sysData[1])
+
+			if oldRnodeHash and node['ricci_host'] in oldRnodeHash:
+				oldNode = oldRnodeHash[node['ricci_host']]
+			elif oldNodeHash and node['host'] in nodeHash:
+				oldNode = oldNodeHash[node['host']]
+			else:
+				oldNode = None
+
+			if 'errors' in node:
+				errors.append(node['errors'])
+				node['errors'] = True
+
+			if node['host'] in nodeHash or node['ricci_host'] in rnodeHash:
+				node['errors'] = True
+				errors.append('You added the node \"' + node['host'] + '\" more than once')
+			else:
+				if oldNode and 'prev_auth' in oldNode:
+					node['prev_auth'] = oldNode['prev_auth']
+
+				nodeHash[node['host']] = node
+				rnodeHash[node['ricci_host']] = node
+				nodeList.append(node)
+		i += 1
+
+	if len(nodeList) < 2:
+		errors.append('A cluster must contain@least two nodes')
+
+	sfn = lambda x, y: \
+		x['cur_auth'] - y['cur_auth'] or (('errors' in y) - ('errors' in x))
+	nodeList.sort(sfn)
+
+	dfn = lambda x: not 'cur_auth' in x or x['cur_auth'] != True
+	cluster_properties = {
+		'clusterName': clusterName,
+		'nodeList': nodeList,
+		'nodeHash': nodeHash,
+		'rnodeHash': rnodeHash,
+		'isComplete': len(errors) < 1 and len(filter(dfn, nodeList)) == 0
+	}
+	return (len(errors) < 1, {'errors': errors, 'requestResults': cluster_properties })
+
 def createCluChooser(self, request, systems):
   dummynode = {}
+  
+  if request.REQUEST_METHOD == 'POST':
+    ret = validatePost(request)
+    try:
+		request.SESSION.set('checkRet', ret[1])
+    except:
+		request.SESSION.set('checkRet', {})
+  else:
+    try: request.SESSION.set('checkRet', {})
+    except: pass
 
   #First, see if a cluster is chosen, then 
   #check that the current user can access that system
@@ -39,6 +138,7 @@
   except KeyError, e:
     pagetype = "0"
 
+
   cldata = {}
   cldata['Title'] = "Cluster List"
   cldata['cfg_type'] = "clusters"
--- conga/luci/site/luci/Extensions/homebase_adapters.py	2006/07/18 19:26:03	1.13
+++ conga/luci/site/luci/Extensions/homebase_adapters.py	2006/07/19 20:19:53	1.14
@@ -174,8 +174,13 @@
 			systemName = host
 		node = { 'host': host, 'ricci_host': systemName, 'prev_auth': prevAuth, 'cur_auth': True }
 		cluster_info = rc.cluster_info()
-		if not cluster_info or cluster_info[0] != cluster:
-			node['errors'] = 'Node ' + host + ' is reporting it is not a member of cluster \"' + cluster + '\"'
+		if not cluster or not cluster_info or cluster_info[0] != cluster:
+			if cluster:
+				node['errors'] = 'Node \"' + host + '\" is reporting it is not a member of cluster \"' + cluster + '\"'
+				if cluster_info[0]:
+					node['errors'] += ' and that it is a member of cluster \"' + cluster_info[0] + '\"'
+			else:
+				node['errors'] = 'Node \"' + host + '\" reports it is a member of cluster \"' + cluster_info[0] + '\"'
 		return node
 
 	error = 'Unable to authenticate to the ricci agent on \"' + host + '\"'
@@ -563,21 +568,20 @@
 	except:
 		sessionData = None
 
-
 	if 'ACTUAL_URL' in request:
 		url = request['ACTUAL_URL']
 	else:
 		url = '.'
 
 	if 'pagetype' in request.form:
-		pagetype = request.form['pagetype']
+		pagetype = int(request.form['pagetype'])
 	else:
 		try: request.SESSION.set('checkRet', {})
 		except: pass
 		return homebasePortal(self, request, '.', '0')
 
 	try:
-		validatorFn = formValidators[int(request.form['pagetype']) - 1]
+		validatorFn = formValidators[pagetype - 1]
 	except:
 		try: request.SESSION.set('checkRet', {})
 		except: pass
@@ -887,6 +891,12 @@
 	except:
 		return 'Unable to set permissions on new system \"' + host + '\"'
 
+def abortManageCluster(self):
+	try:
+		sessionData = request.SESSION.get('checkRet')
+		nodeUnauth(sessionData['requestResults']['nodeList'])
+	except: pass
+
 def manageCluster(self, clusterName, nodeList):
 	clusterName = str(clusterName)
 
@@ -920,11 +930,6 @@
 		except: pass
 		return 'Unable to set permissions on new cluster \"' + clusterName + '\"-- Cluster creation failed'
 
-	try:
-		ssystem = self.restrictedTraverse(PLONE_ROOT + '/systems/storage/')
-	except:
-		ssystem = None
-
 	for i in nodeList:
 		if 'ricci_host' in i:
 			host = str(i['ricci_host'])
@@ -938,25 +943,39 @@
 				raise 'not there'
 			newSystem.manage_acquiredPermissions([])
 			newSystem.manage_role('View', [ 'Access contents information' , 'View' ])
-		except Exception, e:
+		except:
 			nodeUnauth(nodeList)
 			try: clusters.manage_delObjects([clusterName])
 			except: pass
 			return 'Unable to create cluster node \"' + host + '\" for cluster \"' + clusterName + '\" -- Cluster creation failed."'
 
-		if ssystem:
-			try:
-				# It's already there, as a storage system, no problem.
-				exists = self.restrictedTraverse(PLONE_ROOT + '/systems/storage/' + host)
-				continue
-			except: pass
+	try:
+		ssystem = self.restrictedTraverse(PLONE_ROOT + '/systems/storage/')
+		if not ssystem:
+			raise
+	except:
+		return
 
-			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
+	# Only add storage systems if the cluster 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:
@@ -964,28 +983,25 @@
 	except:
 		return 'Unable to find storage system \"' + systemName + '\"'
 
-	rc = RicciCommunicator(systemName)
-	cluster_info = rc.cluster_info()
-
 	try:
-		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
+		rc = RicciCommunicator(systemName)
+		if not rc:
+			raise
+	except:
+		return 'Unable to connect to the ricci agent on \"' + systemName + '\" to unauthenticate'
 
-	if len(cluster_info) > 0 and cluster_info[0] != '':
+	# 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:
-			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
+			newSystem = self.restrictedTraverse(PLONE_ROOT + '/systems/cluster/' + cluster_info[0] + '/' + rc.system_name())
 		except:
-			return 'Unable to delete cluster storage system \"' + systemName + '\"'
+			try: rc.unauth()
+			except: pass
 
 	try:
 		ssystem.manage_delObjects([systemName])
@@ -1007,8 +1023,7 @@
 	except:
 		return 'Unable to delete cluster \"' + clusterName + '\"'
 
-def delClusterSystem(self, clusterName, systemName):
-	cluster = self.restrictedTraverse(PLONE_ROOT + '/systems/cluster/' + clusterName)
+def delClusterSystem(self, cluster, systemName):
 	try:
 		if not self.restrictedTraverse(PLONE_ROOT + '/systems/storage/' + systemName):
 			raise
@@ -1029,10 +1044,9 @@
 	errors = ''
 	for i in csystems:
 		try:
-			cluster.manage_delObjects([i])
-			delClusterSystem(i)
+			delClusterSystem(self, cluster, i[0])
 		except:
-			errors += 'Unable to delete the cluster system \"' + i + '\"\n'
+			errors += 'Unable to delete the cluster system \"' + i[0] + '\"\n'
 
 	return errors
 



             reply	other threads:[~2006-07-19 20:19 UTC|newest]

Thread overview: 185+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-07-19 20:19 rmccabe [this message]
  -- strict thread matches above, loose matches on Subject: below --
2006-07-19 20:57 [Cluster-devel] conga/luci/site/luci/Extensions cluster_adapte rmccabe
2006-07-19 21:38 rmccabe
2006-07-19 22:28 rmccabe
2006-07-24 19:50 jparsons
2006-07-24 21:13 jparsons
2006-07-24 21:51 jparsons
2006-07-25  0:56 jparsons
2006-07-25 20:01 jparsons
2006-07-25 20:16 jparsons
2006-07-27 15:53 rmccabe
2006-07-27 16:34 jparsons
2006-07-28 11:46 jparsons
2006-07-28 14:02 jparsons
2006-07-28 14:16 jparsons
2006-07-28 18:40 jparsons
2006-07-28 18:57 jparsons
2006-07-28 19:03 jparsons
2006-07-31 18:21 rmccabe
2006-08-01 15:04 jparsons
2006-08-01 15:13 jparsons
2006-08-01 15:20 jparsons
2006-08-01 15:25 jparsons
2006-08-01 15:29 jparsons
2006-08-02 17:25 rmccabe
2006-08-02 18:59 rmccabe
2006-08-03 13:37 jparsons
2006-08-09 21:48 jparsons
2006-08-09 22:05 jparsons
2006-08-10 14:16 jparsons
2006-08-10 16:50 jparsons
2006-08-10 23:06 shuennek
2006-08-11  0:29 jparsons
2006-08-12 17:53 jparsons
2006-08-12 18:22 jparsons
2006-08-12 20:31 jparsons
2006-08-12 21:13 jparsons
2006-08-13 13:48 jparsons
2006-08-13 14:57 jparsons
2006-08-13 15:02 jparsons
2006-08-13 16:15 jparsons
2006-08-13 16:32 jparsons
2006-08-13 18:36 jparsons
2006-08-13 19:37 jparsons
2006-08-13 19:38 jparsons
2006-08-14 15:12 jparsons
2006-08-16 16:10 jparsons
2006-08-16 19:14 rmccabe
2006-08-16 21:51 jparsons
2006-08-16 21:54 jparsons
2006-08-16 21:56 jparsons
2006-08-16 23:40 jparsons
2006-08-22 17:41 jparsons
2006-08-22 17:46 jparsons
2006-08-30 22:59 rmccabe
2006-09-22 18:24 rmccabe
2006-09-25 22:59 rmccabe
2006-09-27 15:35 jparsons
2006-09-27 15:51 jparsons
2006-09-27 16:18 jparsons
2006-09-27 18:46 rmccabe
2006-09-28 20:10 rmccabe
2006-09-28 22:04 rmccabe
2006-10-02 20:53 rmccabe
2006-10-02 21:09 rmccabe
2006-10-02 21:42 rmccabe
2006-10-02 22:30 rmccabe
2006-10-04 15:11 jparsons
2006-10-04 16:05 jparsons
2006-10-04 16:20 rmccabe
2006-10-09 20:21 rmccabe
2006-10-10 21:33 kupcevic
2006-10-11 16:18 rmccabe
2006-10-11 16:25 jparsons
2006-10-11 16:35 jparsons
2006-10-11 17:29 rmccabe
2006-10-11 17:43 jparsons
2006-10-11 20:58 jparsons
2006-10-11 22:37 jparsons
2006-10-11 23:08 rmccabe
2006-10-11 23:11 jparsons
2006-10-11 23:56 jparsons
2006-10-12  0:04 jparsons
2006-10-12 15:45 jparsons
2006-10-12 15:50 jparsons
2006-10-12 17:08 jparsons
2006-10-12 17:27 jparsons
2006-10-12 19:40 rmccabe
2006-10-12 20:48 jparsons
2006-10-12 20:54 jparsons
2006-10-12 21:00 kupcevic
2006-10-12 22:11 jparsons
2006-10-13 22:56 rmccabe
2006-10-16  4:51 rmccabe
2006-10-16  4:54 rmccabe
2006-10-16  5:28 rmccabe
2006-10-16 19:17 jparsons
2006-10-16 20:51 jparsons
2006-10-16 21:01 rmccabe
2006-10-18 19:16 rmccabe
2006-10-18 23:12 rmccabe
2006-10-19 14:57 rmccabe
2006-10-20 21:59 rmccabe
2006-10-20 22:09 rmccabe
2006-10-23 20:47 jparsons
2006-10-24 14:08 rmccabe
2006-10-25  0:43 rmccabe
2006-10-27  1:11 rmccabe
2006-10-30 20:43 jparsons
2006-10-30 22:52 rmccabe
2006-10-31  0:16 rmccabe
2006-10-31 17:18 rmccabe
2006-11-02  3:17 rmccabe
2006-11-02 20:41 rmccabe
2006-11-02 20:45 rmccabe
2006-11-02 20:58 rmccabe
2006-11-03  1:08 rmccabe
2006-11-03  1:24 rmccabe
2006-11-03 21:13 jparsons
2006-11-05  0:59 rmccabe
2006-11-06 23:55 rmccabe
2006-11-07  1:32 jparsons
2006-11-07  2:36 jparsons
2006-11-07 20:13 jparsons
2006-11-07 20:14 jparsons
2006-11-08 15:52 jparsons
2006-11-08 21:42 rmccabe
2006-11-09 14:17 rmccabe
2006-11-09 22:30 rmccabe
2006-11-10 17:59 rmccabe
2006-11-10 18:18 rmccabe
2006-11-17  5:48 rmccabe
2006-11-17  5:50 rmccabe
2006-11-20 15:05 jparsons
2006-11-20 23:32 rmccabe
2006-11-27 18:15 rmccabe
2006-11-27 21:05 rmccabe
2006-11-27 21:06 rmccabe
2006-11-30 20:12 jparsons
2006-12-08 23:02 rmccabe
2006-12-14 17:03 rmccabe
2006-12-14 21:37 rmccabe
2006-12-20 20:40 jparsons
2007-01-10 20:06 rmccabe
2007-01-10 22:45 rmccabe
2007-01-10 23:33 jparsons
2007-01-17 22:14 rmccabe
2007-01-17 22:26 rmccabe
2007-01-18  2:48 rmccabe
2007-01-26 19:35 rmccabe
2007-01-29 23:30 rmccabe
2007-01-30 21:05 jparsons
2007-01-30 21:21 jparsons
2007-01-30 21:41 jparsons
2007-01-31 18:50 rmccabe
2007-01-31 19:28 rmccabe
2007-01-31 23:45 rmccabe
2007-02-05 19:56 rmccabe
2007-02-07 21:30 rmccabe
2007-02-07 22:00 rmccabe
2007-02-12 20:24 rmccabe
2007-02-12 20:25 rmccabe
2007-02-13 19:50 rmccabe
2007-02-13 19:50 rmccabe
2007-03-01 20:22 rmccabe
2007-03-01 20:22 rmccabe
2007-03-01 20:22 rmccabe
2007-03-06 22:48 rmccabe
2007-03-12  5:46 rmccabe
2007-03-12  5:46 rmccabe
2007-03-12  5:47 rmccabe
2007-03-13  3:06 rmccabe
2007-03-13  3:07 rmccabe
2007-03-16  3:19 rmccabe
2007-03-16  3:19 rmccabe
2007-03-16  3:19 rmccabe
2007-03-27  2:03 rmccabe
2007-04-02 15:56 rmccabe
2007-04-02 16:35 rmccabe
2007-05-03 19:51 rmccabe
2007-08-22 20:57 rmccabe
2007-08-23 19:00 rmccabe
2007-12-12 15:45 rmccabe
2008-04-18 20:37 rmccabe
2008-07-17 16:36 rmccabe

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20060719201954.11998.qmail@sourceware.org \
    --to=rmccabe@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.