Skip to content
Snippets Groups Projects
Commit 4bd43aa1 authored by Sebastien Ponce's avatar Sebastien Ponce
Browse files

moved the code to parse mountPoints and diskserver/diskpool names given on the...

moved the code to parse mountPoints and diskserver/diskpool names given on the command line to common place
parent fa1757f2
No related branches found
No related tags found
No related merge requests found
......@@ -31,8 +31,11 @@ import castor_tools
def modifyDiskServers(dbconn, targets, state, mountPoints, diskPool, isRecursive):
'''modifies the properties of a set of diskservers'''
stcur = dbconn.cursor()
# consistency check
if len(targets) == 0 and len(mountPoints) > 0:
raise ValueError('targets are mandatory when mountPoints are given')
# check target diskpool if any
stcur = dbconn.cursor()
if diskPool:
sqlStatement = "SELECT id, name FROM DiskPool WHERE name = :diskPool"
stcur.execute(sqlStatement, diskPool=diskPool)
......@@ -40,44 +43,15 @@ def modifyDiskServers(dbconn, targets, state, mountPoints, diskPool, isRecursive
if not rows:
raise ValueError('DiskPool %s does not exist. Giving up' % diskPool)
diskPoolId = rows[0][0]
# check target diskpools
sqlStatement = 'SELECT id, name FROM DiskPool WHERE name = :dpname'
diskPools = set([])
diskPoolIds = []
for target in targets:
stcur.execute(sqlStatement, dpname=target)
row = stcur.fetchone()
if row:
diskPoolIds.append(row[0])
diskPools.add(row[1])
# check target diskservers
sqlStatement = 'SELECT id, name FROM DiskServer WHERE name = :dsname'
diskServers = set([])
diskServerIds = []
for target in targets:
stcur.execute(sqlStatement, dsname=target)
row = stcur.fetchone()
if row:
diskServerIds.append(row[0])
diskServers.add(row[1])
unknownTargets = set(t for t in targets) - diskPools - diskServers
if not diskPools and not diskServers:
# get list of target diskservers rfom the mix diskpool/diskserver targets
unknownTargets, diskServerIds = castor_tools.parseAndCheckTargets(targets, stcur)
# and complain in case of problem
if not diskServerIds:
raise ValueError('None of the provided diskpools/diskservers could be found. Giving up')
# go for the update
returnMsg = []
mountPointIds = []
if mountPoints == None:
# check DiskServers
if diskPools:
sqlStatement = '''SELECT UNIQUE DiskServer.id FROM DiskServer, FileSystem
WHERE DiskServer.id = FileSystem.diskServer
AND FileSystem.diskPool IN (''' + "'" + \
"', '".join([str(x) for x in diskPoolIds]) + "')"
stcur.execute(sqlStatement)
rows = stcur.fetchall()
diskServerIds.extend([row[0] for row in rows])
if not diskServerIds:
raise ValueError('No diskserver matching your request')
# update diskServers for status
if state != None:
sqlStatement = '''UPDATE DiskServer SET status = :status
......@@ -98,16 +72,8 @@ def modifyDiskServers(dbconn, targets, state, mountPoints, diskPool, isRecursive
else:
# MountPoints were given by the user, check them
sqlStatement = '''SELECT id, mountPoint FROM FileSystem
WHERE mountPoint = :mountPoint'''
if targets:
sqlStatement += ' AND ('
if diskPoolIds:
sqlStatement += 'diskPool IN (' + ', '.join([str(x) for x in diskPoolIds]) + ')'
if diskServerIds:
if diskPoolIds:
sqlStatement += ' OR '
sqlStatement += 'diskServer IN (' + ', '.join([str(x) for x in diskServerIds]) + ')'
sqlStatement += ')'
WHERE mountPoint = :mountPoint
AND (diskServer IN (''' + ', '.join([str(x) for x in diskServerIds]) + '))'
existingMountPoints = set([])
for mountPoint in mountPoints:
stcur.execute(sqlStatement, mountPoint=mountPoint)
......
......@@ -25,7 +25,7 @@
"""utility functions for castor tools written in python"""
import os, sys, time, thread, subprocess, re, socket, pwd
import os, sys, time, thread, subprocess, re, socket, pwd, grp
import dlf
def _checkValueFound(name, value, instance, configFile):
......@@ -249,6 +249,7 @@ def getNSDBConnectParam(filename):
# connectTo_ methods
#-------------------------------------------------------------------------------
def connectToVdqm():
'''Connects to the VDQM database'''
VDQMSCHEMAVERSION = "2_1_12_0"
user, passwd, dbname = getVdqmDBConnectParams()
return connectToDB(user, passwd, dbname, VDQMSCHEMAVERSION)
......@@ -680,7 +681,7 @@ def parseUser(rawUserGroup):
gid = grp.getgrnam(rawGroup).gr_gid
except KeyError:
raise ParsingError('Unknown group %s' % rawGroup)
return uid,gid
return uid, gid
def parsePositiveInt(name, svalue):
'''parses a positive int value and exits with proper error message in case the value does not fit'''
......@@ -750,6 +751,61 @@ def parseTimeDuration(name, svalue):
except ValueError:
raise ParsingError('Invalid %s %s' % (name, svalue))
def parseAndCheckTargets(targets, stcur):
'''extracts list of concerned diskservers from a list of targets that can mix diskservers
and diskpools. Checks them and returns a tuple of a set and a list :
- a set of unknown targets
- a list of diskServer ids'''
# check target diskpools
sqlStatement = 'SELECT id, name FROM DiskPool WHERE name = :dpname'
diskPools = set([])
diskPoolIds = []
for target in targets:
stcur.execute(sqlStatement, dpname=target)
row = stcur.fetchone()
if row:
diskPoolIds.append(row[0])
diskPools.add(row[1])
# check target diskservers
sqlStatement = 'SELECT id, name FROM DiskServer WHERE name = :dsname'
diskServers = set([])
diskServerIds = []
for target in targets:
stcur.execute(sqlStatement, dsname=target)
row = stcur.fetchone()
if row:
diskServerIds.append(row[0])
diskServers.add(row[1])
unknownTargets = set(t for t in targets) - diskPools - diskServers
# get diskservers of the diskpools
if diskPools:
sqlStatement = '''SELECT UNIQUE DiskServer.id FROM DiskServer, FileSystem
WHERE DiskServer.id = FileSystem.diskServer
AND FileSystem.diskPool IN (''' + \
', '.join([str(x) for x in diskPoolIds]) + ')'
stcur.execute(sqlStatement)
rows = stcur.fetchall()
diskServerIds.extend([row[0] for row in rows])
# return
return (unknownTargets, diskServerIds)
def parseAndCheckMountPoints(diskServerIds, mountPoints, stcur):
'''extracts list of concerned mountPoints from a list of diskserver ids
and a set of mountPoints. Checks them and returns a list of triplets
(diskServerId, FileSystemId, mountPoint)'''
# build select statement
stGetFileSystemIds = '''
SELECT DiskServer.id, FileSystem.id, FileSystem.mountPoint
FROM FileSystem, DiskServer
WHERE DiskServer.id IN (''' + ", ".join([str(x) for x in diskServerIds]) + ''')
AND FileSystem.diskServer = DiskServer.id'''
if mountPoints:
stGetFileSystemIds += ' AND FileSystem.mountPoint IN (' + "', '".join(mountPoints) + "')"
# execute statement
stcur.execute(stGetFileSystemIds)
# and return result
return stcur.fetchall()
#--------------------
# getCurrentUsername
#--------------------
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment