8 import CondCore.Utilities.conddb_serialization_metadata
as sm
9 import CondCore.Utilities.credentials
as auth
12 authPathEnvVar =
'COND_AUTH_PATH' 13 prod_db_service = (
'cms_orcon_prod',{
'w':
'cms_orcon_prod/cms_cond_general_w',
'r':'cms_orcon_prod/cms_cond_general_r'})
14 adg_db_service = (
'cms_orcon_adg',{
'r':'cms_orcon_adg/cms_cond_general_r'})
15 dev_db_service = (
'cms_orcoff_prep',{
'w':
'cms_orcoff_prep/cms_cond_general_w',
'r':'cms_orcoff_prep/cms_cond_general_r'})
16 schema_name =
'CMS_CONDITIONS' 18 fmt_str =
"[%(asctime)s] %(levelname)s: %(message)s" 19 logLevel = logging.INFO
20 logFormatter = logging.Formatter(fmt_str)
41 line += (fmt.format( row[ind] )+
' ')
48 hsep += (fmt.format(
'')+
' ')
60 cursor = self.db.cursor()
61 cursor.execute(
'SELECT BOOST_VERSION, CMSSW_VERSION FROM CMSSW_BOOST_MAP');
62 rows = cursor.fetchall()
69 cursor = self.db.cursor()
70 cursor.execute(
'SELECT RUN_NUMBER, RUN_START_TIME, BOOST_VERSION, INSERTION_TIME FROM BOOST_RUN_MAP ORDER BY RUN_NUMBER, INSERTION_TIME')
71 rows = cursor.fetchall()
74 self.boost_run_map.append( (r[0],r[1],r[2],
str(r[3])) )
78 cursor = self.db.cursor()
79 cursor.execute(
'SELECT MIN(RUN_NUMBER) FROM RUN_INFO WHERE RUN_NUMBER >= :RUN',(run,))
80 min_run = cursor.fetchone()[0]
81 cursor.execute(
'SELECT START_TIME FROM RUN_INFO WHERE RUN_NUMBER=:RUN',(min_run,))
82 min_run_time = cursor.fetchone()[0]
83 min_run_ts = calendar.timegm( min_run_time.utctimetuple() ) << 32
84 now = datetime.datetime.utcnow()
85 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) )
88 cursor = self.db.cursor()
89 cursor.execute(
'INSERT INTO CMSSW_BOOST_MAP ( CMSSW_VERSION, BOOST_VERSION ) VALUES ( :CMSSW_VERSION, :BOOST_VERSION )',(cmssw_version,boost_version))
92 cmssw_v = sm.check_cmssw_version( cmssw_version )
95 if sm.is_release_cycle( cmssw_v ):
96 cmssw_v = sm.strip_cmssw_version( cmssw_v )
97 archs = sm.get_production_arch( cmssw_v )
99 path = sm.get_release_root( cmssw_v, arch )
100 if os.path.exists(os.path.join(path,cmssw_v)):
104 if releaseRoot
is None:
107 releaseRoot = sm.get_release_root( cmssw_v, arch )
108 for r
in sorted (os.listdir( releaseRoot )):
109 if r.startswith(cmssw_v):
111 logging.debug(
'Boost version will be verified in release %s' %cmssw_v)
113 if cmssw_v
in self.cmssw_boost_map.keys():
116 if releaseRoot
is None:
117 archs = sm.get_production_arch( cmssw_v )
119 path = sm.get_release_root( cmssw_v, arch )
120 if os.path.exists(os.path.join(path,cmssw_v)):
124 logging.debug(
'Release path: %s' %releaseRoot)
125 boost_version = sm.get_cmssw_boost( the_arch,
'%s/%s' %(releaseRoot,cmssw_v) )
126 if not boost_version
is None:
132 cursor = self.db.cursor()
133 cursor.execute(
'SELECT DISTINCT(RELEASE) FROM GLOBAL_TAG')
134 rows = cursor.fetchall()
144 self.logger.setLevel(logLevel)
145 consoleHandler = logging.StreamHandler(sys.stdout)
146 consoleHandler.setFormatter(logFormatter)
147 self.logger.addHandler(consoleHandler)
152 if self.args.db
is None:
154 if self.args.db ==
'dev' or self.args.db ==
'oradev' :
155 db_service = dev_db_service
156 elif self.args.db ==
'orapro':
157 db_service = adg_db_service
158 elif self.args.db !=
'onlineorapro' or self.args.db !=
'pro':
159 db_service = prod_db_service
161 raise Exception(
"Database '%s' is not known." %args.db )
162 if self.args.accessType
not in db_service[1].
keys():
163 raise Exception(
'The specified database connection %s does not support the requested action.' %db_service[0])
164 service = db_service[1][self.args.accessType]
165 creds = auth.get_credentials( authPathEnvVar, service, self.args.auth )
167 raise Exception(
"Could not find credentials for service %s" %service)
168 (username, account, pwd) = creds
169 connStr =
'%s/%s@%s' %(username,pwd,db_service[0])
170 self.
db = cx_Oracle.connect(connStr)
171 logging.info(
'Connected to %s as user %s' %(db_service[0],username))
172 self.db.current_schema = schema_name
175 if self.
iovs is None:
177 cursor = self.db.cursor()
178 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' 180 stmt = stmt +
' ORDER BY SINCE' 181 logging.debug(
'Executing: "%s"' %stmt)
182 cursor.execute(stmt,params)
184 streamer_info =
str(r[2].read())
185 self.iovs.append((r[0],r[1],streamer_info))
190 if tagBoostVersion
is not None:
192 for iov
in self.
iovs:
193 if timeCut
is not None:
194 if tagBoostVersion
is not None:
201 iovBoostVersion, tagBoostVersion = sm.update_tag_boost_version( tagBoostVersion, iov[2], iov[0], timetype, self.version_db.boost_run_map )
202 logging.debug(
'iov: %s - boost version: %s - streamer: %s' %(iov[0],iovBoostVersion,iov[2]))
203 if lastBoost
is None or lastBoost!=iovBoostVersion:
204 self.versionIovs.append((iov[0],iovBoostVersion))
205 lastBoost = iovBoostVersion
207 if tagBoostVersion
is None:
209 logging.warning(
'No iovs found. boost version cannot be determined.')
212 logging.error(
'Could not determine the tag boost version.' )
216 logging.info(
'Tag boost version has not changed.')
218 msg =
'Found tag boost version %s combining payloads from %s iovs' %(tagBoostVersion,niovs)
219 if timeCut
is not None:
221 msg +=
' (iov insertion time>%s)' %
str(timeCut)
223 msg +=
' (iov insertion time<%s)' %
str(timeCut)
225 return tagBoostVersion
228 cursor = self.db.cursor()
229 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,))
230 rows = cursor.fetchall()
235 gts.append((r[0],r[1],r[2]))
237 logging.info(
'validating %s gts.' %len(gts))
238 boost_snapshot_map = {}
241 logging.debug(
'Validating for GT %s (release %s)' %(gt[0],gt[1]))
242 gtCMSSWVersion = sm.check_cmssw_version( gt[1] )
243 gtBoostVersion = self.version_db.lookup_boost_in_cmssw( gtCMSSWVersion )
244 if sm.cmp_boost_version( gtBoostVersion, tagBoostVersion )<0:
245 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])))
246 if str(gt[2])
not in boost_snapshot_map.keys():
247 tagSnapshotBoostVersion =
None 249 if tagSnapshotBoostVersion
is not None:
250 boost_snapshot_map[
str(gt[2])] = tagSnapshotBoostVersion
254 tagSnapshotBoostVersion = boost_snapshot_map[
str(gt[2])]
255 if sm.cmp_boost_version( gtBoostVersion, tagSnapshotBoostVersion )<0:
256 logging.error(
'The snapshot from tag used by gt %s (consuming ver: %s) has an incompatible combined boost version %s' %(gt[0],gtBoostVersion,tagSnapshotBoostVersion))
257 invalid_gts.append( ( gt[0], gtBoostVersion ) )
258 if len(invalid_gts)==0:
260 logging.info(
'boost version for the tag validated in %s referencing Gts' %(ngt))
262 logging.info(
'No GT referencing this tag found.')
264 logging.error(
'boost version for the tag is invalid.')
268 cursor = self.db.cursor()
269 now = datetime.datetime.utcnow()
271 cursor.execute(
'UPDATE TAG_METADATA SET MIN_SERIALIZATION_V=:BOOST_V, MODIFICATION_TIME=:NOW WHERE TAG_NAME = :NAME',( tagBoostVersion,now,t))
273 cursor.execute(
'INSERT INTO TAG_METADATA ( TAG_NAME, MIN_SERIALIZATION_V, MODIFICATION_TIME ) VALUES ( :NAME, :BOOST_V, :NOW )',(t, tagBoostVersion,now))
274 logging.info(
'Minimum boost version for the tag updated.')
277 cursor = self.db.cursor()
279 self.version_db.fetch_cmssw_boost_map()
280 self.version_db.fetch_boost_run_map()
283 if self.args.name
is not None:
284 stmt0 =
'SELECT NAME FROM TAG WHERE NAME = :TAG_NAME' 285 wpars = (self.args.name,)
286 cursor.execute(stmt0,wpars);
287 rows = cursor.fetchall()
293 raise Exception(
'Tag %s does not exists in the database.' %self.args.name )
294 tags[self.args.name] =
None 295 stmt1 =
'SELECT MIN_SERIALIZATION_V, MODIFICATION_TIME FROM TAG_METADATA WHERE TAG_NAME = :NAME' 296 cursor.execute(stmt1,wpars);
297 rows = cursor.fetchall()
299 tags[self.args.name] = (r[0],r[1])
308 stmt0 =
'SELECT NAME FROM TAG WHERE NAME NOT IN ( SELECT TAG_NAME FROM TAG_METADATA) ORDER BY NAME' 310 if self.args.max
is not None:
315 stmt0 =
'SELECT NAME FROM (SELECT NAME FROM TAG WHERE NAME NOT IN ( SELECT TAG_NAME FROM TAG_METADATA ) ORDER BY NAME) WHERE ROWNUM<= :MAXR' 317 cursor.execute(stmt0,wpars);
318 rows = cursor.fetchall()
321 stmt1 =
'SELECT T.NAME NAME, TM.MIN_SERIALIZATION_V MIN_SERIALIZATION_V, TM.MODIFICATION_TIME MODIFICATION_TIME FROM TAG T, TAG_METADATA TM WHERE T.NAME=TM.TAG_NAME AND TM.MODIFICATION_TIME < (SELECT MAX(INSERTION_TIME) FROM IOV WHERE IOV.TAG_NAME=TM.TAG_NAME) ORDER BY NAME' 322 nmax = nmax-len(tags)
324 stmt1 =
'SELECT NAME, MIN_SERIALIZATION_V, MODIFICATION_TIME FROM (SELECT T.NAME NAME, TM.MIN_SERIALIZATION_V MIN_SERIALIZATION_V, TM.MODIFICATION_TIME MODIFICATION_TIME FROM TAG T, TAG_METADATA TM WHERE T.NAME=TM.TAG_NAME AND TM.MODIFICATION_TIME < (SELECT MAX(INSERTION_TIME) FROM IOV WHERE IOV.TAG_NAME=TM.TAG_NAME) ORDER BY NAME) WHERE ROWNUM<= :MAXR' 326 cursor.execute(stmt1,wpars);
327 rows = cursor.fetchall()
331 if nmax >=0
and i>nmax:
333 tags[r[0]] = (r[1],r[2])
334 logging.info(
'Processing boost version for %s tags' %len(tags))
336 for t
in sorted(tags.keys()):
340 cursor.execute(
'SELECT TIME_TYPE FROM TAG WHERE NAME= :TAG_NAME',(t,))
341 timetype = cursor.fetchone()[0]
343 logging.info(
'************************************************************************')
344 logging.info(
'Tag [%s] %s - timetype: %s' %(count,t,timetype))
345 tagBoostVersion =
None 347 if tags[t]
is not None:
349 tagBoostVersion = tags[t][0]
352 if tagBoostVersion
is None:
354 logging.debug(
'boost versions in the %s iovs: %s' %(len(self.
iovs),
str(self.
versionIovs)))
356 if len(invalid_gts)>0:
357 with open(
'invalid_tags_in_gts.txt',
'a')
as error_file:
358 for gt
in invalid_gts:
359 error_file.write(
'Tag %s (boost %s) is invalid for GT %s ( boost %s) \n' %(t,tagBoostVersion,gt[0],gt[1]))
362 except Exception
as e:
363 logging.error(
str(e))
366 cursor = self.db.cursor()
368 self.version_db.insert_boost_run_range( self.args.since, self.args.label )
370 logging.info(
'boost version %s inserted with since %s' %(self.args.label,self.args.since))
373 cursor = self.db.cursor()
375 self.version_db.fetch_boost_run_map()
376 headers = [
'Run',
'Run start time',
'Boost Version',
'Insertion time']
377 print_table( headers, self.version_db.boost_run_map )
380 cursor = self.db.cursor()
381 tag = self.args.tag_name
382 cursor.execute(
'SELECT TIME_TYPE FROM TAG WHERE NAME= :TAG_NAME',(tag,))
383 rows = cursor.fetchall()
385 t_modificationTime =
None 389 raise Exception(
"Tag %s does not exist in the database." %tag)
390 cursor.execute(
'SELECT MAX(INSERTION_TIME) FROM IOV WHERE TAG_NAME= :TAG_NAME',(tag,))
391 rows = cursor.fetchall()
393 t_modificationTime = r[0]
394 if t_modificationTime
is None:
395 raise Exception(
"Tag %s does not have any iov stored." %tag)
396 logging.info(
'Tag %s - timetype: %s' %(tag,timeType))
397 cursor.execute(
'SELECT MIN_SERIALIZATION_V, MODIFICATION_TIME FROM TAG_METADATA WHERE TAG_NAME= :TAG_NAME',(tag,))
398 rows = cursor.fetchall()
399 tagBoostVersion =
None 400 v_modificationTime =
None 402 tagBoostVersion = r[0]
403 v_modificationTime = r[1]
404 if v_modificationTime
is not None:
405 if t_modificationTime > v_modificationTime:
406 logging.warning(
'The minimum boost version stored is out of date.')
408 logging.info(
'The minimum boost version stored is up to date.')
410 if v_modificationTime
is not None:
411 mt =
str(v_modificationTime)
412 r_tagBoostVersion =
None 413 if self.args.rebuild
or self.args.full:
415 self.version_db.fetch_boost_run_map()
417 logging.info(
'Calculating minimum boost version for the available iovs...')
419 print '# Currently stored: %s' %(tagBoostVersion)
420 print '# Last update: %s' %mt
421 print '# Last update on the iovs: %s' %
str(t_modificationTime)
422 if self.args.rebuild
or self.args.full:
423 print '# Based on the %s available IOVs: %s' %(len(self.
iovs),r_tagBoostVersion)
425 headers = [
'Run',
'Boost Version']
433 parser =
argparse.ArgumentParser(description=
'CMS conddb command-line tool for serialiation metadata. For general help (manual page), use the help subcommand.')
434 parser.add_argument(
'--db', type=str, help=
'The target database: pro ( for prod ) or dev ( for prep ). default=pro')
435 parser.add_argument(
"--auth",
"-a", type=str, help=
"The path of the authentication file")
436 parser.add_argument(
'--verbose',
'-v', action=
'count', help=
'The verbosity level')
437 parser_subparsers = parser.add_subparsers(title=
'Available subcommands')
438 parser_update_tags = parser_subparsers.add_parser(
'update_tags', description=
'Update the existing tags headers with the boost version')
439 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.')
440 parser_update_tags.add_argument(
'--max',
'-m', type=int, help=
'the maximum number of tags processed',default=100)
441 parser_update_tags.add_argument(
'--all',action=
'store_true', help=
'process all of the tags with boost_version = None')
442 parser_update_tags.set_defaults(func=tool.update_tags,accessType=
'w')
443 parser_insert_boost_version = parser_subparsers.add_parser(
'insert_boost_version', description=
'Insert a new boost version range in the run map')
444 parser_insert_boost_version.add_argument(
'--label',
'-l',type=str, help=
'The boost version label',required=
True)
445 parser_insert_boost_version.add_argument(
'--since',
'-s',type=int, help=
'The since validity (run number)',required=
True)
446 parser_insert_boost_version.set_defaults(func=tool.insert_boost_run,accessType=
'w')
447 parser_list_boost_versions = parser_subparsers.add_parser(
'list_boost_versions', description=
'list the boost versions in the run map')
448 parser_list_boost_versions.set_defaults(func=tool.list_boost_run,accessType=
'r') 449 parser_show_version = parser_subparsers.add_parser('show_boost_version', description=
'Display the minimum boost version for the specified tag (the value stored, by default)')
450 parser_show_version.add_argument(
'tag_name',help=
'The name of the tag')
451 parser_show_version.add_argument(
'--rebuild',
'-r',action=
'store_true',default=
False,help=
'Re-calculate the minimum boost versio ')
452 parser_show_version.add_argument(
'--full',action=
'store_true',default=
False,help=
'Recalulate the minimum boost version, listing the versions in the iov sequence')
453 parser_show_version.set_defaults(func=tool.show_tag_boost_version,accessType=
'r') 454 args = parser.parse_args() 457 tool.logger.setLevel(logging.DEBUG)
463 sys.exit( args.func())
464 except Exception
as e:
468 if __name__ ==
'__main__':
def print_table(headers, table)
def lookup_boost_in_cmssw(self, cmssw_version)
def insert_cmssw_boost(self, cmssw_version, boost_version)
def insert_boost_run_range(self, run, boost_version)
def fetch_cmssw_boost_map(self)
def fetch_boost_run_map(self)
def populate_for_gts(self)