3 from __future__
import print_function
9 import CondCore.Utilities.conddb_serialization_metadata
as sm
10 import CondCore.Utilities.credentials
as auth
11 import CondCore.Utilities.conddb_time
as conddb_time
14 authPathEnvVar =
'COND_AUTH_PATH' 15 prod_db_service = (
'cms_orcon_prod',{
'w':
'cms_orcon_prod/cms_cond_general_w',
'r':'cms_orcon_prod/cms_cond_general_r'})
16 adg_db_service = (
'cms_orcon_adg',{
'r':'cms_orcon_adg/cms_cond_general_r'})
17 dev_db_service = (
'cms_orcoff_prep',{
'w':
'cms_orcoff_prep/cms_cond_general_w',
'r':'cms_orcoff_prep/cms_cond_general_r'})
18 schema_name =
'CMS_CONDITIONS' 20 fmt_str =
"[%(asctime)s] %(levelname)s: %(message)s" 21 logLevel = logging.INFO
22 logFormatter = logging.Formatter(fmt_str)
43 line += (fmt.format( row[ind] )+
' ')
50 hsep += (fmt.format(
'')+
' ')
62 cursor = self.db.cursor()
63 cursor.execute(
'SELECT BOOST_VERSION, CMSSW_VERSION FROM CMSSW_BOOST_MAP');
64 rows = cursor.fetchall()
71 cursor = self.db.cursor()
72 cursor.execute(
'SELECT RUN_NUMBER, RUN_START_TIME, BOOST_VERSION, INSERTION_TIME FROM BOOST_RUN_MAP ORDER BY RUN_NUMBER, INSERTION_TIME')
73 rows = cursor.fetchall()
76 self.boost_run_map.append( (r[0],r[1],r[2],
str(r[3])) )
80 cursor = self.db.cursor()
81 cursor.execute(
'SELECT MIN(RUN_NUMBER) FROM RUN_INFO WHERE RUN_NUMBER >= :RUN',(run,))
82 res = cursor.fetchone()
83 if res
is not None and res[0]
is not None:
85 cursor.execute(
'SELECT START_TIME FROM RUN_INFO WHERE RUN_NUMBER=:RUN',(min_run,))
86 min_run_time = cursor.fetchone()[0]
87 min_run_ts = calendar.timegm( min_run_time.utctimetuple() ) << 32
91 now = datetime.datetime.utcnow()
92 cursor.execute(
'INSERT INTO BOOST_RUN_MAP ( RUN_NUMBER, RUN_START_TIME, BOOST_VERSION, INSERTION_TIME ) VALUES (:RUN, :RUN_START_T, :BOOST, :TIME)',(run,min_run_ts,boost_version,now) )
95 cursor = self.db.cursor()
96 cursor.execute(
'INSERT INTO CMSSW_BOOST_MAP ( CMSSW_VERSION, BOOST_VERSION ) VALUES ( :CMSSW_VERSION, :BOOST_VERSION )',(cmssw_version,boost_version))
99 cmssw_v = sm.check_cmssw_version( cmssw_version )
102 if sm.is_release_cycle( cmssw_v ):
103 cmssw_v = sm.strip_cmssw_version( cmssw_v )
104 archs = sm.get_production_arch( cmssw_v )
106 path = sm.get_release_root( cmssw_v, arch )
107 if os.path.exists(os.path.join(path,cmssw_v)):
111 if releaseRoot
is None:
114 releaseRoot = sm.get_release_root( cmssw_v, arch )
115 for r
in sorted (os.listdir( releaseRoot )):
116 if r.startswith(cmssw_v):
118 logging.debug(
'Boost version will be verified in release %s' %cmssw_v)
120 if cmssw_v
in self.cmssw_boost_map.keys():
123 if releaseRoot
is None:
124 archs = sm.get_production_arch( cmssw_v )
126 path = sm.get_release_root( cmssw_v, arch )
127 if os.path.exists(os.path.join(path,cmssw_v)):
131 logging.debug(
'Release path: %s' %releaseRoot)
132 boost_version = sm.get_cmssw_boost( the_arch,
'%s/%s' %(releaseRoot,cmssw_v) )
133 if not boost_version
is None:
139 cursor = self.db.cursor()
140 cursor.execute(
'SELECT DISTINCT(RELEASE) FROM GLOBAL_TAG')
141 rows = cursor.fetchall()
151 self.logger.setLevel(logLevel)
152 consoleHandler = logging.StreamHandler(sys.stdout)
153 consoleHandler.setFormatter(logFormatter)
154 self.logger.addHandler(consoleHandler)
159 if self.args.db
is None:
161 if self.args.db ==
'dev' or self.args.db ==
'oradev' :
162 db_service = dev_db_service
163 elif self.args.db ==
'orapro':
164 db_service = adg_db_service
165 elif self.args.db !=
'onlineorapro' or self.args.db !=
'pro':
166 db_service = prod_db_service
168 raise Exception(
"Database '%s' is not known." %args.db )
169 if self.args.accessType
not in db_service[1].
keys():
170 raise Exception(
'The specified database connection %s does not support the requested action.' %db_service[0])
171 service = db_service[1][self.args.accessType]
172 creds = auth.get_credentials( authPathEnvVar, service, self.args.auth )
174 raise Exception(
"Could not find credentials for service %s" %service)
175 (username, account, pwd) = creds
176 connStr =
'%s/%s@%s' %(username,pwd,db_service[0])
177 self.
db = cx_Oracle.connect(connStr)
178 logging.info(
'Connected to %s as user %s' %(db_service[0],username))
179 self.db.current_schema = schema_name
182 if self.
iovs is None:
184 cursor = self.db.cursor()
185 stmt =
'SELECT IOV.SINCE SINCE, IOV.INSERTION_TIME INSERTION_TIME, P.STREAMER_INFO STREAMER_INFO FROM TAG, IOV, PAYLOAD P WHERE TAG.NAME = IOV.TAG_NAME AND P.HASH = IOV.PAYLOAD_HASH AND TAG.NAME = :TAG_NAME' 187 if timeCut
and tagBoostVersion
is not None and not validate:
188 whereClauseOnSince =
' AND IOV.INSERTION_TIME>:TIME_CUT' 189 stmt = stmt + whereClauseOnSince
190 params = params + (timeCut,)
191 stmt = stmt +
' ORDER BY SINCE' 192 logging.debug(
'Executing: "%s"' %stmt)
193 cursor.execute(stmt,params)
195 streamer_info =
str(r[2].
read())
196 self.iovs.append((r[0],r[1],streamer_info))
201 if tagBoostVersion
is not None:
203 for iov
in self.
iovs:
204 if validate
and timeCut
is not None and timeCut < iov[1]:
207 iovBoostVersion, tagBoostVersion = sm.update_tag_boost_version( tagBoostVersion, minIov, iov[2], iov[0], timetype, self.version_db.boost_run_map )
208 if minIov
is None or iov[0]<minIov:
210 logging.debug(
'iov: %s - inserted on %s - streamer: %s' %(iov[0],iov[1],iov[2]))
211 logging.debug(
'current tag boost version: %s minIov: %s' %(tagBoostVersion,minIov))
212 if lastBoost
is None or lastBoost!=iovBoostVersion:
213 self.versionIovs.append((iov[0],iovBoostVersion))
214 lastBoost = iovBoostVersion
216 if tagBoostVersion
is None:
218 logging.warning(
'No iovs found. boost version cannot be determined.')
221 logging.error(
'Could not determine the tag boost version.' )
225 logging.info(
'Tag boost version has not changed.')
227 msg =
'Found tag boost version %s ( min iov: %s ) combining payloads from %s iovs' %(tagBoostVersion,minIov,niovs)
228 if timeCut
is not None:
230 msg +=
' (iov insertion time>%s)' %
str(timeCut)
232 msg +=
' (iov insertion time<%s)' %
str(timeCut)
234 return tagBoostVersion, minIov
237 cursor = self.db.cursor()
238 cursor.execute(
'SELECT GT.NAME, GT.RELEASE, GT.SNAPSHOT_TIME FROM GLOBAL_TAG GT, GLOBAL_TAG_MAP GTM WHERE GT.NAME = GTM.GLOBAL_TAG_NAME AND GTM.TAG_NAME = :TAG_NAME',(t,))
239 rows = cursor.fetchall()
244 gts.append((r[0],r[1],r[2]))
246 logging.info(
'validating %s gts.' %len(gts))
247 boost_snapshot_map = {}
250 logging.debug(
'Validating for GT %s (release %s)' %(gt[0],gt[1]))
251 gtCMSSWVersion = sm.check_cmssw_version( gt[1] )
252 gtBoostVersion = self.version_db.lookup_boost_in_cmssw( gtCMSSWVersion )
253 if sm.cmp_boost_version( gtBoostVersion, tagBoostVersion )<0:
254 logging.warning(
'The boost version computed from all the iovs in the tag (%s) is incompatible with the gt [%s] %s (consuming ver: %s, snapshot: %s)' %(tagBoostVersion,ngt,gt[0],gtBoostVersion,
str(gt[2])))
255 if str(gt[2])
not in boost_snapshot_map.keys():
256 tagSnapshotBoostVersion =
None 259 if tagSnapshotBoostVersion
is not None:
260 boost_snapshot_map[
str(gt[2])] = tagSnapshotBoostVersion
264 tagSnapshotBoostVersion = boost_snapshot_map[
str(gt[2])]
265 if sm.cmp_boost_version( gtBoostVersion, tagSnapshotBoostVersion )<0:
266 logging.error(
'The snapshot from tag used by gt %s (consuming ver: %s) has an incompatible combined boost version %s' %(gt[0],gtBoostVersion,tagSnapshotBoostVersion))
267 invalid_gts.append( ( gt[0], gtBoostVersion ) )
268 if len(invalid_gts)==0:
270 logging.info(
'boost version for the tag validated in %s referencing Gts' %(ngt))
272 logging.info(
'No GT referencing this tag found.')
274 logging.error(
'boost version for the tag is invalid.')
278 cursor = self.db.cursor()
279 now = datetime.datetime.utcnow()
281 cursor.execute(
'UPDATE TAG_METADATA SET MIN_SERIALIZATION_V=:BOOST_V, MIN_SINCE=:MIN_IOV, MODIFICATION_TIME=:NOW WHERE TAG_NAME = :NAME',( tagBoostVersion,minIov,now,t))
283 cursor.execute(
'INSERT INTO TAG_METADATA ( TAG_NAME, MIN_SERIALIZATION_V, MIN_SINCE, MODIFICATION_TIME ) VALUES ( :NAME, :BOOST_V, :MIN_IOV, :NOW )',(t, tagBoostVersion,minIov,now))
284 logging.info(
'Minimum boost version for the tag updated.')
287 cursor = self.db.cursor()
289 self.version_db.fetch_cmssw_boost_map()
290 self.version_db.fetch_boost_run_map()
293 if self.args.name
is not None:
294 stmt0 =
'SELECT NAME FROM TAG WHERE NAME = :TAG_NAME' 295 wpars = (self.args.name,)
296 cursor.execute(stmt0,wpars);
297 rows = cursor.fetchall()
303 raise Exception(
'Tag %s does not exists in the database.' %self.args.name )
304 tags[self.args.name] =
None 305 stmt1 =
'SELECT MIN_SERIALIZATION_V, MIN_SINCE, CAST(MODIFICATION_TIME AS TIMESTAMP(0)) FROM TAG_METADATA WHERE TAG_NAME = :NAME' 306 cursor.execute(stmt1,wpars);
307 rows = cursor.fetchall()
309 tags[self.args.name] = (r[0],r[1],r[2])
311 stmt0 =
'SELECT NAME FROM TAG WHERE NAME NOT IN ( SELECT TAG_NAME FROM TAG_METADATA) ORDER BY NAME' 313 if self.args.max
is not None:
318 stmt0 =
'SELECT NAME FROM (SELECT NAME FROM TAG WHERE NAME NOT IN ( SELECT TAG_NAME FROM TAG_METADATA ) ORDER BY NAME) WHERE ROWNUM<= :MAXR' 320 cursor.execute(stmt0,wpars);
321 rows = cursor.fetchall()
324 stmt1 =
'SELECT T.NAME NAME, TM.MIN_SERIALIZATION_V MIN_SERIALIZATION_V, TM.MIN_SINCE MIN_SINCE, CAST(TM.MODIFICATION_TIME AS TIMESTAMP(0)) MODIFICATION_TIME FROM TAG T, TAG_METADATA TM WHERE T.NAME=TM.TAG_NAME AND CAST(TM.MODIFICATION_TIME AS TIMESTAMP(0)) < (SELECT MAX(INSERTION_TIME) FROM IOV WHERE IOV.TAG_NAME=TM.TAG_NAME) ORDER BY NAME' 325 nmax = nmax-len(tags)
327 stmt1 =
'SELECT NAME, MIN_SERIALIZATION_V, MIN_SINCE, MODIFICATION_TIME FROM (SELECT T.NAME NAME, TM.MIN_SERIALIZATION_V MIN_SERIALIZATION_V, TM.MIN_SINCE MIN_SINCE, CAST(TM.MODIFICATION_TIME AS TIMESTAMP(0)) MODIFICATION_TIME FROM TAG T, TAG_METADATA TM WHERE T.NAME=TM.TAG_NAME AND CAST(TM.MODIFICATION_TIME AS TIMESTAMP(0)) < (SELECT MAX(INSERTION_TIME) FROM IOV WHERE IOV.TAG_NAME=TM.TAG_NAME) ORDER BY NAME) WHERE ROWNUM<= :MAXR' 329 cursor.execute(stmt1,wpars);
330 rows = cursor.fetchall()
334 if nmax >=0
and i>nmax:
336 tags[r[0]] = (r[1],r[2],r[3])
337 logging.info(
'Processing boost version for %s tags' %len(tags))
339 for t
in sorted(tags.keys()):
343 cursor.execute(
'SELECT TIME_TYPE FROM TAG WHERE NAME= :TAG_NAME',(t,))
344 timetype = cursor.fetchone()[0]
346 logging.info(
'************************************************************************')
347 logging.info(
'Tag [%s] %s - timetype: %s' %(count,t,timetype))
348 tagBoostVersion =
None 351 if tags[t]
is not None:
353 tagBoostVersion = tags[t][0]
356 tagBoostVersion, minIov = self.
process_tag_boost_version( t, timetype, tagBoostVersion, minIov, timeCut, self.args.validate )
357 if tagBoostVersion
is None:
359 logging.debug(
'boost versions in the %s iovs: %s' %(len(self.
iovs),
str(self.
versionIovs)))
360 if self.args.validate:
362 if len(invalid_gts)>0:
363 with open(
'invalid_tags_in_gts.txt',
'a')
as error_file:
364 for gt
in invalid_gts:
365 error_file.write(
'Tag %s (boost %s) is invalid for GT %s ( boost %s) \n' %(t,tagBoostVersion,gt[0],gt[1]))
367 if self.
iovs[0][0]<minIov:
368 minIov = self.
iovs[0]
371 except Exception
as e:
372 logging.error(
str(e))
375 cursor = self.db.cursor()
377 if self.args.min_ts
is None:
378 raise Exception(
"Run %s has not been found in the database - please provide an explicit TimeType value with the min_ts parameter ." %self.args.since )
379 self.version_db.insert_boost_run_range( self.args.since, self.args.label, self.args.min_ts )
381 logging.info(
'boost version %s inserted with since %s' %(self.args.label,self.args.since))
384 cursor = self.db.cursor()
386 self.version_db.fetch_boost_run_map()
387 headers = [
'Run',
'Run start time',
'Boost Version',
'Insertion time']
388 print_table( headers, self.version_db.boost_run_map )
391 cursor = self.db.cursor()
392 tag = self.args.tag_name
393 cursor.execute(
'SELECT TIME_TYPE FROM TAG WHERE NAME= :TAG_NAME',(tag,))
394 rows = cursor.fetchall()
396 t_modificationTime =
None 400 raise Exception(
"Tag %s does not exist in the database." %tag)
401 cursor.execute(
'SELECT MAX(INSERTION_TIME) FROM IOV WHERE TAG_NAME= :TAG_NAME',(tag,))
402 rows = cursor.fetchall()
404 t_modificationTime = r[0]
405 if t_modificationTime
is None:
406 raise Exception(
"Tag %s does not have any iov stored." %tag)
407 logging.info(
'Tag %s - timetype: %s' %(tag,timeType))
408 cursor.execute(
'SELECT MIN_SERIALIZATION_V, MIN_SINCE, MODIFICATION_TIME FROM TAG_METADATA WHERE TAG_NAME= :TAG_NAME',(tag,))
409 rows = cursor.fetchall()
410 tagBoostVersion =
None 412 v_modificationTime =
None 414 tagBoostVersion = r[0]
416 v_modificationTime = r[2]
417 if v_modificationTime
is not None:
418 if t_modificationTime > v_modificationTime:
419 logging.warning(
'The minimum boost version stored is out of date.')
421 logging.info(
'The minimum boost version stored is up to date.')
423 if v_modificationTime
is not None:
424 mt =
str(v_modificationTime)
425 r_tagBoostVersion =
None 426 if self.args.rebuild
or self.args.full:
428 self.version_db.fetch_boost_run_map()
430 logging.info(
'Calculating minimum boost version for the available iovs...')
432 print(
'# Currently stored: %s (min iov:%s)' %(tagBoostVersion,minIov))
433 print(
'# Last update: %s' %mt)
434 print(
'# Last update on the iovs: %s' %
str(t_modificationTime))
435 if self.args.rebuild
or self.args.full:
436 print(
'# Based on the %s available IOVs: %s (min iov:%s)' %(len(self.
iovs),r_tagBoostVersion,r_minIov))
438 headers = [
'Run',
'Boost Version']
446 parser = argparse.ArgumentParser(description=
'CMS conddb command-line tool for serialiation metadata. For general help (manual page), use the help subcommand.')
447 parser.add_argument(
'--db', type=str, help=
'The target database: pro ( for prod ) or dev ( for prep ). default=pro')
448 parser.add_argument(
"--auth",
"-a", type=str, help=
"The path of the authentication file")
449 parser.add_argument(
'--verbose',
'-v', action=
'count', help=
'The verbosity level')
450 parser_subparsers = parser.add_subparsers(title=
'Available subcommands')
451 parser_update_tags = parser_subparsers.add_parser(
'update_tags', description=
'Update the existing tag headers with the boost version')
452 parser_update_tags.add_argument(
'--name',
'-n', type=str, help=
'Name of the specific tag to process (default=None - in this case all of the tags will be processed.')
453 parser_update_tags.add_argument(
'--max',
'-m', type=int, help=
'the maximum number of tags processed',default=100)
454 parser_update_tags.add_argument(
'--all',action=
'store_true', help=
'process all of the tags with boost_version = None')
455 parser_update_tags.add_argument(
'--validate',action=
'store_true', help=
'validate the tag/boost version under processing')
456 parser_update_tags.set_defaults(func=tool.update_tags,accessType=
'w')
457 parser_insert_boost_version = parser_subparsers.add_parser(
'insert', description=
'Insert a new boost version range in the run map')
458 parser_insert_boost_version.add_argument(
'--label',
'-l',type=str, help=
'The boost version label',required=
True)
459 parser_insert_boost_version.add_argument(
'--since',
'-s',type=int, help=
'The since validity (run number)',required=
True)
460 parser_insert_boost_version.add_argument(
'--min_ts',
'-t',type=str, help=
'The since validity (Time timetype)', required=
False)
461 parser_insert_boost_version.set_defaults(func=tool.insert_boost_run,accessType=
'w')
462 parser_list_boost_versions = parser_subparsers.add_parser(
'list', description=
'list the boost versions in the run map')
463 parser_list_boost_versions.set_defaults(func=tool.list_boost_run,accessType=
'r') 464 parser_show_version = parser_subparsers.add_parser('show_tag', description=
'Display the minimum boost version for the specified tag (the value stored, by default)')
465 parser_show_version.add_argument(
'tag_name',help=
'The name of the tag')
466 parser_show_version.add_argument(
'--rebuild',
'-r',action=
'store_true',default=
False,help=
'Re-calculate the minimum boost versio ')
467 parser_show_version.add_argument(
'--full',action=
'store_true',default=
False,help=
'Recalulate the minimum boost version, listing the versions in the iov sequence')
468 parser_show_version.set_defaults(func=tool.show_tag_boost_version,accessType=
'r') 469 args = parser.parse_args() 472 tool.logger.setLevel(logging.DEBUG)
478 sys.exit( args.func())
479 except Exception
as e:
483 if __name__ ==
'__main__':
def print_table(headers, table)
def lookup_boost_in_cmssw(self, cmssw_version)
def string_to_timestamp(sdt)
S & print(S &os, JobReport::InputFile const &f)
def insert_cmssw_boost(self, cmssw_version, boost_version)
def fetch_cmssw_boost_map(self)
def insert_boost_run_range(self, run, boost_version, min_ts)
def fetch_boost_run_map(self)
def populate_for_gts(self)