-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathinspectHPSS.py
More file actions
226 lines (163 loc) · 8.65 KB
/
Copy pathinspectHPSS.py
File metadata and controls
226 lines (163 loc) · 8.65 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
#!/usr/bin/env python
b'This script requires python 3.4'
"""
Daily inspection of collection HPSS_Files
For detailed documentation, see: README_CrawlerHPSS.md
"""
import sys
import datetime
from mongoUtil import mongoDbUtil
##############################################
# -- GLOBAL CONSTANTS
N_DAYS_AGO = 14
##############################################
# -- Check for a proper Python Version
if sys.version[0:3] < '3.0':
print ('Python version 3.0 or greater required (found: {0}).'.format(sys.version[0:5]))
sys.exit(-1)
# ----------------------------------------------------------------------------------
class hpssInspectUtil:
"""Class to inspect HPSS collections."""
# _________________________________________________________
def __init__(self, nDaysAgo):
self._nDaysAgo = nDaysAgo
self._fields = {1: 'starDetails.runyear', 2: 'starDetails.energy', 3: 'starDetails.system',
4: 'starDetails.trigger', 5: 'starDetails.production'}
self._fieldsExtra = {1: 'starDetails.day', 2: 'starDetails.runnumber', 3: 'starDetails.stream', 4: 'starDetails.picoType',
5: 'isInTarFile'}
# _________________________________________________________
def setCollections(self, collHpssFiles, collHpssPicoDsts, collHpssDuplicates):
"""Get collection from mongoDB."""
self._collHpssFiles = collHpssFiles
self._collHpssPicoDsts = collHpssPicoDsts
self._collHpssDuplicates = collHpssDuplicates
# ____________________________________________________________________________
def generalInfo(self):
"""Print generalInfo."""
print(">>>", self._collHpssFiles)
print(" Number of documents:", self._collHpssFiles.count())
print(">>>", self._collHpssPicoDsts)
print(" Number of documents:", self._collHpssPicoDsts.count())
if self._collHpssDuplicates.count() == 0:
return
print(">>>", self._collHpssDuplicates)
print(" Number of documents:", self._collHpssDuplicates.count())
# ____________________________________________________________________________
def inspector(self):
"""Check if all files are still on HPSS."""
print('\n==---------------------------------------------------------==')
print('Inspector - check for files, changed within the last {0} days'.format(self._nDaysAgo))
print('==---------------------------------------------------------==')
nDaysAgo = (datetime.date.today() - datetime.timedelta(days=self._nDaysAgo)).strftime('%Y-%m-%d')
lostPicoDsts = list(self._collHpssFiles.find({'lastSeen': {"$lt" : nDaysAgo}}))
if lostPicoDsts:
print("These files (", len(lostPicoDsts),") have not been seen for the last", self._nDaysAgo,"days!")
for entry in lostPicoDsts:
print(" ", entry['fileFullPath'], "- last seen:", entry['lastSeen'])
# ____________________________________________________________________________
def printOverviewPicoDst(self):
"""Print overview of picoDsts."""
print('\n==---------------------------------------------------------==')
print('Collection:', self._collHpssPicoDsts.name)
print('==---------------------------------------------------------==')
self._printOverviewLevelPicoDst(self._collHpssPicoDsts, 1, {})
# ____________________________________________________________________________
def printOverviewDuplicates(self):
"""Print overview of duplicate picoDsts."""
if self._collHpssDuplicates.count() == 0:
return
print('\n==---------------------------------------------------------==')
print('Collection:', self._collHpssDuplicates.name)
print('==---------------------------------------------------------==')
self._printOverviewLevelPicoDst(self._collHpssDuplicates, 1, {})
# ____________________________________________________________________________
def _printOverviewLevelPicoDst(self, coll, level, queryOld):
""" Print picoDst details recursively for various depth."""
try:
field = self._fields[level]
except:
return
for item in coll.distinct(field, queryOld):
query = dict(queryOld)
query[field] = item
print (" "*level, item, " -> ", coll.find(query).count())
self._printOverviewLevelPicoDst(coll, level+1, query)
# ____________________________________________________________________________
def printDistinct(self):
"""Print list of distinct values in fields."""
print('\n==---------------------------------------------------------==')
print('Collection:', self._collHpssFiles.name)
print('==---------------------------------------------------------==')
self._printListOfUniqEntries(self._collHpssFiles, 'fileType')
print('\n==---------------------------------------------------------==')
print('Collection:', self._collHpssPicoDsts.name)
print('==---------------------------------------------------------==')
for key, value in self._fields.items():
self._printListOfUniqEntries(self._collHpssPicoDsts, value)
for key, value in self._fieldsExtra.items():
if key == 1:
print(' Unique Entries in field:', value)
print (' ', sorted(self._collHpssPicoDsts.distinct(value)))
elif key >= 3:
self._printListOfUniqEntries(self._collHpssPicoDsts, value)
if self._collHpssDuplicates.count() == 0:
return
print('\n==---------------------------------------------------------==')
print('Collection:', self._collHpssDuplicates.name)
print('==---------------------------------------------------------==')
for key, value in self._fields.items():
self._printListOfUniqEntries(self._collHpssDuplicates, value)
for key, value in self._fieldsExtra.items():
if key == 1:
print(' Unique Entries in field:', value)
print (' ', sorted(self._collHpssDuplicates.distinct(value)))
elif key >= 3:
self._printListOfUniqEntries(self._collHpssDuplicates, value)
# ____________________________________________________________________________
def _printListOfUniqEntries(self, coll, field):
"""Print uniq entries in field."""
print(' Unique Entries in field:', field)
for item in coll.distinct(field):
print (' ', item, " -> ", coll.find({field: item}).count())
# ____________________________________________________________________________
def compareDuplicates(self):
"""Compare duplicates in collection with entries in picoDsts."""
if self._collHpssDuplicates.count() == 0:
return
with open("toBeDeleted.txt", "w") as toBeDeleted:
for duplicate in self._collHpssDuplicates.find({}):
if duplicate['isInTarFile'] == True:
continue
orig = self._collHpssPicoDsts.find_one({'filePath': duplicate['filePath']})
if orig['fileSize'] != duplicate['fileSize']:
print('Is NOT equal: orig {0} - duplicate {1} : {2}'.format(orig['fileSize'],duplicate['fileSize'], duplicate['filePath']))
# print(duplicate['fileFullPath'], file=toBeDeleted)
continue
print(duplicate['fileFullPath'], file=toBeDeleted)
self._collHpssDuplicates.delete_one({'_id': duplicate['_id']})
# ____________________________________________________________________________
def main():
"""initialize and run"""
# -- Connect to mongoDB
dbUtil = mongoDbUtil("", "admin")
collHpssFiles = dbUtil.getCollection("HPSS_Files")
collHpssPicoDsts = dbUtil.getCollection("HPSS_PicoDsts")
collHpssDuplicates = dbUtil.getCollection("HPSS_Duplicates")
inspect = hpssInspectUtil(N_DAYS_AGO)
inspect.setCollections(collHpssFiles, collHpssPicoDsts, collHpssDuplicates)
# -- Print General Info
# inspect.generalInfo()
# -- Check if all files are still on HPSS
inspect.inspector()
# -- Print Overview picoDsts
inspect.printOverviewPicoDst()
# -- Print Overview picoDsts - duplicates
inspect.printOverviewDuplicates()
# -- Print distinct fields
inspect.printDistinct()
# -- Compare duplicates in duplicate collection
inspect.compareDuplicates()
dbUtil.close()
# ____________________________________________________________________________
if __name__ == "__main__":
sys.exit(main())