2 '''CMS Conditions DB migration script. 12 import multiprocessing
19 'CMS_COND_31X_ALIGNMENT',
20 'CMS_COND_31X_BEAMSPOT',
23 'CMS_COND_31X_DQM_SUMMARY',
26 'CMS_COND_31X_FROM21X',
27 'CMS_COND_31X_GEOMETRY',
31 'CMS_COND_31X_PHYSICSTOOLS',
33 'CMS_COND_31X_PRESHOWER',
35 'CMS_COND_31X_RUN_INFO',
39 'CMS_COND_34X_ECAL_PED',
40 'CMS_COND_34X_GEOMETRY',
44 'CMS_COND_39X_PRESHOWER',
47 'CMS_COND_310X_ECAL_PED',
48 'CMS_COND_311X_ECAL_LAS',
49 'CMS_COND_311X_PRESH',
51 'CMS_COND_42X_ECAL_LAS',
52 'CMS_COND_42X_ECAL_LASP',
53 'CMS_COND_42X_GEOMETRY',
55 'CMS_COND_42X_RUN_INFO',
59 'CMS_COND_44X_GEOMETRY',
61 'CMS_COND_44X_PHYSICSTOOLS',
64 'CMS_COND_BEAMSPOT_000',
70 'CMS_COND_ECAL_LAS_000',
71 'CMS_COND_ECAL_PED_000',
72 'CMS_COND_GEOMETRY_000',
81 'CMS_COND_RUNINFO_000',
87 command =
'%s > %s 2>&1' % (command, output_file)
88 logging.info(
'Running %s', command)
90 subprocess.check_call(command, shell=
True)
91 except subprocess.CalledProcessError
as e:
92 logging.error(
'Error while running %s: return code %s', command, e.returncode)
96 command_template =
'$CMSSW_BASE/bin/$SCRAM_ARCH/conddb_migrate -s oracle://cms_orcon_adg/%s -d %s' 97 command = command_template % (args.account, args.db)
98 run_command(command, os.path.join(args.output, args.account))
102 def _make_args(args, account):
104 newargs.account = account
107 multiprocessing.Pool(args.jobs).
map(migrate_account, [_make_args(args, account)
for account
in accounts])
111 command_template =
'$CMSSW_BASE/bin/$SCRAM_ARCH/conddb_migrate_gt -s oracle://cms_orcon_adg/CMS_COND_31X_GLOBALTAG -d %s -g %s' 112 command = command_template % (args.db, args.gt)
113 run_command(command, os.path.join(args.output, args.gt))
117 logging.info(
'Fetching global tag list...')
118 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()
119 return cx_Oracle.connect(
'CMS_COND_GENERAL_R', password,
'cms_orcon_adg')
123 logging.info(
'Fetching global tag list...')
124 cursor = connection.cursor()
126 select substr(table_name, length('tagtree_table_') + 1) gt 128 where owner = 'CMS_COND_31X_GLOBALTAG' 129 and table_name like 'TAGTREE_TABLE_%' 132 gts =
zip(*cursor.fetchall())[0]
133 logging.info(
'Fetching global tag list... Done: %s global tags found.', len(gts))
140 def _make_args(args, gt):
145 multiprocessing.Pool(args.jobs).
map(migrate_gt, [_make_args(args, gt)
for gt
in gts])
157 for i, gt
in enumerate(gts):
158 logging.info(
'[%s/%s] Reading %s ...', i+1, len(gts), gt)
159 cursor = connection.cursor()
161 select "pfn", "tagname" 162 from CMS_COND_31X_GLOBALTAG.TAGINVENTORY_TABLE 165 from CMS_COND_31X_GLOBALTAG.TAGTREE_TABLE_%s 169 for account, tag
in cursor:
170 account_tags.setdefault(account, set([])).
add(tag)
172 for account
in sorted(account_tags):
174 for tag
in sorted(account_tags[account]):
180 if 'SCRAM_ARCH' not in os.environ:
181 raise Exception(
'SCRAM_ARCH needs to be set: run cmsenv within a newish release.')
183 if 'CMSSW_BASE' not in os.environ:
184 raise Exception(
'CMSSW_BASE needs to be set: run cmsenv within a newish release.')
186 if 'jobs' in args
and args.jobs <= 0:
187 raise Exception(
'If set, --jobs needs to be >= 1.')
190 'root':
'oracle://cms_orcoff_prep/CMS_R5_CONDITIONS',
191 'boost':
'oracle://cms_orcoff_prep/CMS_CONDITIONS',
194 if args.db
in aliases:
195 args.db = aliases[args.db]
198 if args.db ==
'oracle://cms_orcoff_prep/CMS_CONDITIONS' and \
199 not 'BOOST' in os.environ[
'CMSSW_VERSION']:
200 raise Exception(
'Boost database without a Boost release -- mistake?')
202 if args.db ==
'oracle://cms_orcoff_prep/CMS_R5_CONDITIONS' and \
203 'BOOST' in os.environ[
'CMSSW_VERSION']:
204 raise Exception(
'ROOT database with a Boost release -- mistake?')
207 os.makedirs(args.output)
217 parser.add_argument(
'--verbose',
'-v', action=
'count', help=
'Verbosity level. -v prints debugging information of this tool, like tracebacks in case of errors.')
218 parser.add_argument(
'--output',
'-o', default=time.strftime(
'%Y-%m-%d-%H-%M-%S'), help=
'Output folder. Default: {current_timestamp}, i.e. %(default)s')
219 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.*')
220 parser_subparsers = parser.add_subparsers(title=
'Available subcommands')
222 parser_account = parser_subparsers.add_parser(
'account', description=
'Migrates all (non-migrated) tags, IOVs and payloads, from an account.')
223 parser_account.add_argument(
'account', help=
'The account to migrate.')
224 parser_account.set_defaults(func=migrate_account)
226 parser_accounts = parser_subparsers.add_parser(
'accounts', description=
'Migrates all accounts (see "account" command).')
227 parser_accounts.add_argument(
'--jobs',
'-j', type=int, default=4, help=
'Number of jobs.')
228 parser_accounts.set_defaults(func=migrate_accounts)
230 parser_gt = parser_subparsers.add_parser(
'gt', description=
'Migrates a single global tag.')
231 parser_gt.add_argument(
'gt', help=
'The global tag to migrate.')
232 parser_gt.set_defaults(func=migrate_gt)
234 parser_gts = parser_subparsers.add_parser(
'gts', description=
'Migrates all global tags (see "gt" command).')
235 parser_gts.add_argument(
'authpath', help=
'Authentication path.')
236 parser_gts.add_argument(
'--jobs',
'-j', type=int, default=4, help=
'Number of jobs.')
237 parser_gts.set_defaults(func=migrate_gts)
239 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.')
240 parser_tags_in_gts.add_argument(
'authpath', help=
'Authentication path.')
241 parser_tags_in_gts.set_defaults(func=tags_in_gts)
243 args = parser.parse_args()
246 format =
'[%(asctime)s] %(levelname)s: %(message)s',
247 level = logging.DEBUG
if args.verbose >= 1
else logging.INFO,
250 if args.verbose >= 1:
257 except Exception
as e:
262 if __name__ ==
'__main__':
def fetch_gts(connection)
def migrate_account(args)
def make_gt_connection(args)
void add(const std::vector< const T * > &source, std::vector< const T * > &dest)
OutputIterator zip(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp)
def migrate_accounts(args)
def run_command(command, output_file)