Skip to content

Commit f14ab2c

Browse files
committed
refactor (DataManager): getReplicasFromDirectory and __cleanDirectory use getDirectoryDump; remove __getCatalogDirectoryContents
1 parent d72d4f0 commit f14ab2c

File tree

2 files changed

+16
-118
lines changed

2 files changed

+16
-118
lines changed

src/DIRAC/DataManagementSystem/Client/DataManager.py

Lines changed: 16 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -160,24 +160,22 @@ def __cleanDirectory(self, folder):
160160
errStr = "Write access not permitted for this credential."
161161
log.debug(errStr, folder)
162162
return S_ERROR(errStr)
163-
res = self.__getCatalogDirectoryContents([folder], includeDirectories=True)
163+
164+
res = returnSingleResult(self.fileCatalog.getDirectoryDump([folder]))
165+
164166
if not res["OK"]:
165167
return res
166168

167-
if not res["Value"]:
169+
if not (res["Value"]["Files"] or res["Value"]["SubDirs"]):
168170
# folder is empty, just remove it and return
169171
res = returnSingleResult(self.fileCatalog.removeDirectory(folder, recursive=True))
170172
return res
171173

172174
# create a list of folders so that empty folders are also deleted
173-
areDirs = self.fileCatalog.isDirectory(res["Value"])
174-
if not areDirs["OK"]:
175-
return areDirs
176-
listOfFolders = [aDir for aDir in areDirs["Value"]["Successful"] if areDirs["Value"]["Successful"][aDir]]
177-
for lfn in listOfFolders:
178-
res["Value"].pop(lfn)
179-
180-
res = self.removeFile(res["Value"])
175+
listOfFolders = res["Value"]["SubDirs"]
176+
listOfFiles = res["Value"]["Files"]
177+
178+
res = self.removeFile(listOfFiles)
181179
if not res["OK"]:
182180
return res
183181
for lfn, reason in res["Value"]["Failed"].items(): # can be an iterator
@@ -238,34 +236,6 @@ def __removeStorageDirectory(self, directory, storageElement):
238236
)
239237
return S_OK()
240238

241-
def __getCatalogDirectoryContents(self, directories, includeDirectories=False):
242-
"""ls recursively all files in directories
243-
244-
:param self: self reference
245-
:param list directories: folder names
246-
:param bool includeDirectories: if True includes directories in the return dictionary
247-
:return: S_OK with dict of LFNs and their attribute dictionary
248-
"""
249-
log = self.log.getSubLogger("__getCatalogDirectoryContents")
250-
log.debug("Obtaining the catalog contents for %d directories:" % len(directories))
251-
activeDirs = directories
252-
allFiles = {}
253-
while len(activeDirs) > 0:
254-
currentDir = activeDirs[0]
255-
res = returnSingleResult(self.fileCatalog.listDirectory(currentDir, verbose=True))
256-
activeDirs.remove(currentDir)
257-
258-
if not res["OK"]:
259-
log.debug("Problem getting the %s directory content" % currentDir, res["Message"])
260-
else:
261-
dirContents = res["Value"]
262-
activeDirs.extend(dirContents["SubDirs"])
263-
allFiles.update(dirContents["Files"])
264-
if includeDirectories:
265-
allFiles.update(dirContents["SubDirs"])
266-
log.debug("Found %d files" % len(allFiles))
267-
return S_OK(allFiles)
268-
269239
def getReplicasFromDirectory(self, directory):
270240
"""get all replicas from a given directory
271241
@@ -276,11 +246,16 @@ def getReplicasFromDirectory(self, directory):
276246
directories = [directory]
277247
else:
278248
directories = directory
279-
res = self.__getCatalogDirectoryContents(directories)
249+
res = returnSingleResult(self.fileCatalog.getDirectoryDump(directories))
280250
if not res["OK"]:
281251
return res
282-
allReplicas = {lfn: metadata["Replicas"] for lfn, metadata in res["Value"].items()} # can be an iterator
283-
return S_OK(allReplicas)
252+
253+
lfns = res["Value"]["Files"]
254+
res = self.fileCatalog.getReplicas(lfns, allStatus=True)
255+
if not res["OK"]:
256+
return res
257+
res["Value"] = res["Value"]["Successful"]
258+
return res
284259

285260
def getFilesFromDirectory(self, directory, days=0, wildcard="*"):
286261
"""get all files from :directory: older than :days: days matching to :wildcard:

src/DIRAC/DataManagementSystem/Client/test/Test_Client_DataManagementSystem.py

Lines changed: 0 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -100,83 +100,6 @@ def test__getFileTypesCount(self):
100100
# res = self.ci.catalogDirectoryToSE(lfnDir)
101101
# self.assertTrue(res['OK'])
102102

103-
def test__getCatalogDirectoryContents(self):
104-
lfnDirs = ["/this/is/dir1/", "/this/is/dir2/"]
105-
106-
res = self.ci._getCatalogDirectoryContents(lfnDirs)
107-
self.assertTrue(res["OK"])
108-
109-
resExpected = {
110-
"Metadata": {
111-
"/this/is/dir1/file1.txt": {
112-
"MetaData": {
113-
"Checksum": "7149ed85",
114-
"ChecksumType": "Adler32",
115-
"CreationDate": datetime.datetime(2014, 12, 4, 12, 16, 56),
116-
"FileID": 156301805,
117-
"GID": 2695,
118-
"GUID": "6A5C6C86-AD7B-E411-9EDB",
119-
"Mode": 436,
120-
"ModificationDate": datetime.datetime(2014, 12, 4, 12, 16, 56),
121-
"Owner": "phicharp",
122-
"OwnerGroup": "lhcb_prod",
123-
"Size": 206380531,
124-
"Status": "AprioriGood",
125-
"Type": "File",
126-
"UID": 19503,
127-
}
128-
},
129-
"/this/is/dir1/file2.foo.bar": {
130-
"MetaData": {
131-
"Checksum": "7149ed86",
132-
"ChecksumType": "Adler32",
133-
"CreationDate": datetime.datetime(2014, 12, 4, 12, 16, 56),
134-
"FileID": 156301805,
135-
"GID": 2695,
136-
"GUID": "6A5C6C86-AD7B-E411-9EDB",
137-
"Mode": 436,
138-
"ModificationDate": datetime.datetime(2014, 12, 4, 12, 16, 56),
139-
"Owner": "phicharp",
140-
"OwnerGroup": "lhcb_prod",
141-
"Size": 206380532,
142-
"Status": "AprioriGood",
143-
"Type": "File",
144-
"UID": 19503,
145-
}
146-
},
147-
"/this/is/dir2/subdir1/file3.pippo": {
148-
"MetaData": {
149-
"Checksum": "7149ed86",
150-
"ChecksumType": "Adler32",
151-
"CreationDate": datetime.datetime(2014, 12, 4, 12, 16, 56),
152-
"FileID": 156301805,
153-
"GID": 2695,
154-
"GUID": "6A5C6C86-AD7B-E411-9EDB",
155-
"Mode": 436,
156-
"ModificationDate": datetime.datetime(2014, 12, 4, 12, 16, 56),
157-
"Owner": "phicharp",
158-
"OwnerGroup": "lhcb_prod",
159-
"Size": 206380532,
160-
"Status": "AprioriGood",
161-
"Type": "File",
162-
"UID": 19503,
163-
}
164-
},
165-
},
166-
"Replicas": {
167-
"/this/is/dir1/file1.txt": {
168-
"SE1": "smr://srm.SE1.ch:8443/srm/v2/server?SFN=/this/is/dir1/file1.txt",
169-
"SE2": "smr://srm.SE2.fr:8443/srm/v2/server?SFN=/this/is/dir1/file1.txt",
170-
},
171-
"/this/is/dir1/file2.foo.bar": {
172-
"SE1": "smr://srm.SE1.ch:8443/srm/v2/server?SFN=/this/is/dir1/file2.foo.bar",
173-
"SE3": "smr://srm.SE3.es:8443/srm/v2/server?SFN=/this/is/dir1/file2.foo.bar",
174-
},
175-
},
176-
}
177-
178-
self.assertEqual(res["Value"], resExpected)
179-
180103

181104
if __name__ == "__main__":
182105
suite = unittest.defaultTestLoader.loadTestsFromTestCase(UtilitiesTestCase)

0 commit comments

Comments
 (0)