2 '''CMS Conditions DB migration script.
4 from __future__
import print_function
13 import multiprocessing
20 'CMS_COND_31X_ALIGNMENT',
21 'CMS_COND_31X_BEAMSPOT',
24 'CMS_COND_31X_DQM_SUMMARY',
27 'CMS_COND_31X_FROM21X',
28 'CMS_COND_31X_GEOMETRY',
32 'CMS_COND_31X_PHYSICSTOOLS',
34 'CMS_COND_31X_PRESHOWER',
36 'CMS_COND_31X_RUN_INFO',
40 'CMS_COND_34X_ECAL_PED',
41 'CMS_COND_34X_GEOMETRY',
45 'CMS_COND_39X_PRESHOWER',
48 'CMS_COND_310X_ECAL_PED',
49 'CMS_COND_311X_ECAL_LAS',
50 'CMS_COND_311X_PRESH',
52 'CMS_COND_42X_ECAL_LAS',
53 'CMS_COND_42X_ECAL_LASP',
54 'CMS_COND_42X_GEOMETRY',
56 'CMS_COND_42X_RUN_INFO',
60 'CMS_COND_44X_GEOMETRY',
62 'CMS_COND_44X_PHYSICSTOOLS',
65 'CMS_COND_BEAMSPOT_000',
71 'CMS_COND_ECAL_LAS_000',
72 'CMS_COND_ECAL_PED_000',
73 'CMS_COND_GEOMETRY_000',
82 'CMS_COND_RUNINFO_000',
88 command =
'%s > %s 2>&1' % (command, output_file)
89 logging.info(
'Running %s', command)
91 subprocess.check_call(command, shell=
True)
92 except subprocess.CalledProcessError
as e:
93 logging.error(
'Error while running %s: return code %s', command, e.returncode)
97 command_template =
'$CMSSW_BASE/bin/$SCRAM_ARCH/conddb_migrate -s oracle://cms_orcon_adg/%s -d %s'
98 command = command_template % (args.account, args.db)
99 run_command(command, os.path.join(args.output, args.account))
103 def _make_args(args, account):
104 newargs = argparse.Namespace(**vars(args))
105 newargs.account = account
108 multiprocessing.Pool(args.jobs).
map(migrate_account, [_make_args(args, account)
for account
in accounts])
112 command_template =
'$CMSSW_BASE/bin/$SCRAM_ARCH/conddb_migrate_gt -s oracle://cms_orcon_adg/CMS_COND_31X_GLOBALTAG -d %s -g %s'
113 command = command_template % (args.db, args.gt)
114 run_command(command, os.path.join(args.output, args.gt))
118 logging.info(
'Fetching global tag list...')
119 password = subprocess.check_output(
'''cat %s | grep -F 'CMS_COND_31X_GLOBALTAG' -2 | tail -1 | cut -d'"' -f4''' % os.path.join(args.authpath,
'readOnlyProd.xml'), shell=
True).
strip()
120 return cx_Oracle.connect(
'CMS_COND_GENERAL_R', password,
'cms_orcon_adg')
124 logging.info(
'Fetching global tag list...')
125 cursor = connection.cursor()
127 select substr(table_name, length('tagtree_table_') + 1) gt
129 where owner = 'CMS_COND_31X_GLOBALTAG'
130 and table_name like 'TAGTREE_TABLE_%'
133 gts =
zip(*cursor.fetchall())[0]
134 logging.info(
'Fetching global tag list... Done: %s global tags found.', len(gts))
141 def _make_args(args, gt):
142 newargs = argparse.Namespace(**vars(args))
146 multiprocessing.Pool(args.jobs).
map(migrate_gt, [_make_args(args, gt)
for gt
in gts])
158 for i, gt
in enumerate(gts):
159 logging.info(
'[%s/%s] Reading %s ...', i+1, len(gts), gt)
160 cursor = connection.cursor()
162 select "pfn", "tagname"
163 from CMS_COND_31X_GLOBALTAG.TAGINVENTORY_TABLE
166 from CMS_COND_31X_GLOBALTAG.TAGTREE_TABLE_%s
170 for account, tag
in cursor:
171 account_tags.setdefault(account, set([])).
add(tag)
173 for account
in sorted(account_tags):
175 for tag
in sorted(account_tags[account]):
181 if 'SCRAM_ARCH' not in os.environ:
182 raise Exception(
'SCRAM_ARCH needs to be set: run cmsenv within a newish release.')
184 if 'CMSSW_BASE' not in os.environ:
185 raise Exception(
'CMSSW_BASE needs to be set: run cmsenv within a newish release.')
187 if 'jobs' in args
and args.jobs <= 0:
188 raise Exception(
'If set, --jobs needs to be >= 1.')
191 'root':
'oracle://cms_orcoff_prep/CMS_R5_CONDITIONS',
192 'boost':
'oracle://cms_orcoff_prep/CMS_CONDITIONS',
195 if args.db
in aliases:
196 args.db = aliases[args.db]
199 if args.db ==
'oracle://cms_orcoff_prep/CMS_CONDITIONS' and \
200 not 'BOOST' in os.environ[
'CMSSW_VERSION']:
201 raise Exception(
'Boost database without a Boost release -- mistake?')
203 if args.db ==
'oracle://cms_orcoff_prep/CMS_R5_CONDITIONS' and \
204 'BOOST' in os.environ[
'CMSSW_VERSION']:
205 raise Exception(
'ROOT database with a Boost release -- mistake?')
208 os.makedirs(args.output)
217 parser = argparse.ArgumentParser(description=
'conddb_migrate - the CMS Conditions DB migration script')
218 parser.add_argument(
'--verbose',
'-v', action=
'count', help=
'Verbosity level. -v prints debugging information of this tool, like tracebacks in case of errors.')
219 parser.add_argument(
'--output',
'-o', default=time.strftime(
'%Y-%m-%d-%H-%M-%S'), help=
'Output folder. Default: {current_timestamp}, i.e. %(default)s')
220 parser.add_argument(
'db', help=
'Destination database. Aliases: "root" (CMS_CONDITIONS), "boost" (CMS_TEST_CONDITIONS), both in prep. *Make sure the database kind matches the code, i.e. use a BOOST IB when uploading to a Boost database; and a normal release when uploading to the ROOT database -- this script checks the CMSSW_VERSION when using the two official aliases in prep to prevent mistakes, but not for other databases.*')
221 parser_subparsers = parser.add_subparsers(title=
'Available subcommands')
223 parser_account = parser_subparsers.add_parser(
'account', description=
'Migrates all (non-migrated) tags, IOVs and payloads, from an account.')
224 parser_account.add_argument(
'account', help=
'The account to migrate.')
225 parser_account.set_defaults(func=migrate_account)
227 parser_accounts = parser_subparsers.add_parser(
'accounts', description=
'Migrates all accounts (see "account" command).')
228 parser_accounts.add_argument(
'--jobs',
'-j', type=int, default=4, help=
'Number of jobs.')
229 parser_accounts.set_defaults(func=migrate_accounts)
231 parser_gt = parser_subparsers.add_parser(
'gt', description=
'Migrates a single global tag.')
232 parser_gt.add_argument(
'gt', help=
'The global tag to migrate.')
233 parser_gt.set_defaults(func=migrate_gt)
235 parser_gts = parser_subparsers.add_parser(
'gts', description=
'Migrates all global tags (see "gt" command).')
236 parser_gts.add_argument(
'authpath', help=
'Authentication path.')
237 parser_gts.add_argument(
'--jobs',
'-j', type=int, default=4, help=
'Number of jobs.')
238 parser_gts.set_defaults(func=migrate_gts)
240 parser_tags_in_gts = parser_subparsers.add_parser(
'tags_in_gts', description=
'Dumps the set of tags (including account name) which are in each global tag.')
241 parser_tags_in_gts.add_argument(
'authpath', help=
'Authentication path.')
242 parser_tags_in_gts.set_defaults(func=tags_in_gts)
244 args = parser.parse_args()
247 format =
'[%(asctime)s] %(levelname)s: %(message)s',
248 level = logging.DEBUG
if args.verbose >= 1
else logging.INFO,
251 if args.verbose >= 1:
258 except Exception
as e:
263 if __name__ ==
'__main__':