def create_dbs3_json_blocks(opts, dataset_blocks): for (block, block_dump, block_size, dataset_type) in create_dbs3_proto_blocks(opts, dataset_blocks): dataset = block[DataProvider.Dataset] primary_dataset, processed_dataset, data_tier = dataset[1:].split('/') # add primary dataset information block_dump['primds'] = {'primary_ds_type': dataset_type, 'primary_ds_name': primary_dataset} # add dataset information block_dump['dataset'] = { 'dataset': dataset, 'processed_ds_name': processed_dataset, 'data_tier_name': data_tier, 'physics_group_name': None, 'dataset_access_type': 'VALID', 'xtcrosssection': None, # TODO: Add to meta data from FrameWorkJobReport, if possible! } # add block information site_db = SiteDB() try: origin_site_name = site_db.se_to_cms_name(block[DataProvider.Locations][0])[0] except IndexError: origin_site_name = 'UNKNOWN' block_dump['block'] = {'block_name': '%s#%s' % (dataset, block[DataProvider.BlockName]), 'file_count': len(block[DataProvider.FileList]), 'block_size': block_size, 'origin_site_name': origin_site_name} if opts.do_close_blocks: block_dump['block']['open_for_writing'] = 0 else: block_dump['block']['open_for_writing'] = 1 # add acquisition_era, CRAB is important because of checks within DBS 3 block_dump['acquisition_era'] = {'acquisition_era_name': 'CRAB', 'start_date': 0} # add processing_era block_dump['processing_era'] = {'processing_version': 1, 'description': 'grid-control'} yield validate_dbs3_json('blockBulk', block_dump)
from grid_control.gc_exceptions import RuntimeError from grid_control.utils.webservice import readJSON from grid_control_cms.provider_sitedb import SiteDB def lfn2pfn(node, lfn): return readJSON('https://cmsweb.cern.ch/phedex/datasvc/json/prod/lfn2pfn', {'node': node, 'protocol': 'srmv2', 'lfn': lfn})['phedex']['mapping'][0]['pfn'] parser = optparse.OptionParser() parser.add_option('-s', '--SE', dest='SE', default=None, help='Resolve LFN on CMS SE into PFN') parser.add_option('', '--lfn', dest='lfn', default='/store/user/<hypernews name>', help='Name of default LFN') parser.add_option('', '--se-prot', dest='seprot', default='srmv2', help='Name of default SE protocol') (opts, args) = parseOptions(parser) if opts.SE: if '<hypernews name>' in opts.lfn: token = AccessToken.getInstance('VomsProxy', getConfig(), None) site_db = SiteDB() hnName = site_db.dn_to_username(dn=token.getFQUsername()) if not hnName: raise RuntimeError('Unable to map grid certificate to hypernews name!') opts.lfn = opts.lfn.replace('<hypernews name>', hnName) tmp = readJSON('https://cmsweb.cern.ch/phedex/datasvc/json/prod/lfn2pfn', {'node': opts.SE, 'protocol': opts.seprot, 'lfn': opts.lfn})['phedex']['mapping'] for entry in tmp: if len(tmp) > 1: print entry['node'], print entry['pfn']
def generateDBS3BlockDumps(opts, blocks): for block_info in blocks: block_dump = dict(dataset_conf_list=[], files=[], file_conf_list=[], file_parent_list=[]) locations = block_info[DataProvider.Locations] dataset = block_info[DataProvider.Dataset] primary_dataset, processed_dataset, data_tier = dataset[1:].split('/') block_name = block_info[DataProvider.BlockName] file_list = block_info[DataProvider.FileList] block_size = 0 dataset_configurations = block_dump[u'dataset_conf_list'] for file_info in file_list: metadata_info = dict(zip(block_info[DataProvider.Metadata], file_info[DataProvider.Metadata])) parent_lfns = metadata_info['CMSSW_PARENT_LFN'] dataset_type = metadata_info['CMSSW_DATATYPE'] file_size = metadata_info['SE_OUTPUT_SIZE'] lfn = file_info[DataProvider.URL] file_lumi_list = [{u'lumi_section_num': lumi_num, u'run_num': run_num} for run_num, lumi_num in metadata_info['CMSSW_LUMIS']] ###add file information file_dict = {u'check_sum': metadata_info['SE_OUTPUT_HASH_CRC32'], u'file_lumi_list': file_lumi_list, u'adler32': 'NOTSET', u'event_count': metadata_info['CMSSW_EVENTS_WRITE'], u'file_type': 'EDM', u'logical_file_name': lfn, u'file_size': file_size, u'md5': metadata_info['SE_OUTPUT_HASH_MD5'], u'auto_cross_section': 0.0 } block_dump[u'files'].append(file_dict) ###add file configurations file_conf_dict = {u'release_version': metadata_info['CMSSW_VERSION'], u'pset_hash': metadata_info['CMSSW_CONFIG_HASH'], u'lfn': lfn, u'app_name': 'cmsRun', u'output_module_label': 'crab2_mod_label', u'global_tag': metadata_info['CMSSW_GLOBALTAG']#,#default=opts.globaltag) } block_dump[u'file_conf_list'].append(file_conf_dict) ###add file parentage information file_parentage = [{'logical_file_name': lfn, 'parent_logical_file_name': parent_lfn} for parent_lfn in parent_lfns] block_dump[u'file_parent_list'].extend(file_parentage) ###fill dataset configurations, same as file configurations with removed lfn dataset_conf_dict = dict(file_conf_dict) del dataset_conf_dict[u'lfn'] if dataset_conf_dict not in dataset_configurations: dataset_configurations.append(dataset_conf_dict) ###update block size for block summary information block_size += file_size ###add primary dataset information block_dump[u'primds'] = {u'primary_ds_type': dataset_type, u'primary_ds_name': primary_dataset} ###add dataset information block_dump[u'dataset'] = {u'physics_group_name': None, u'dataset_access_type': 'VALID', u'data_tier_name': data_tier, u'processed_ds_name': processed_dataset, u'xtcrosssection': None,###Add to meta data from FrameWorkJobReport, if possible! u'dataset': dataset } ###add block information site_db = SiteDB() try: origin_site_name = site_db.se_to_cms_name(locations[0])[0] except IndexError: origin_site_name = 'UNKNOWN' block_dump[u'block'] = {u'open_for_writing': 0, u'block_name': '%s#%s' % (dataset, block_name), u'file_count': len(file_list), u'block_size': block_size, u'origin_site_name': origin_site_name} ###add acquisition_era, CRAB is important because of checks within DBS 3 block_dump[u'acquisition_era'] = {u'acquisition_era_name': 'CRAB', u'start_date': 0} ###add processing_era block_dump[u'processing_era'] = {u'processing_version': 1, u'description': 'grid-control'} yield DBS3InputValidation.validate_json_input('blockBulk', block_dump)
from gcSupport import Options, Plugin, getConfig, scriptOptions from grid_control.utils.webservice import readJSON from grid_control_cms.provider_sitedb import SiteDB def lfn2pfn(node, lfn): return readJSON('https://cmsweb.cern.ch/phedex/datasvc/json/prod/lfn2pfn', {'node': node, 'protocol': 'srmv2', 'lfn': lfn})['phedex']['mapping'][0]['pfn'] parser = Options() parser.addText(None, 's', 'SE', default = None, help = 'Resolve LFN on CMS SE into PFN') parser.addText(None, ' ', 'se-prot', default = 'srmv2', help = 'Name of default SE protocol') parser.addText(None, ' ', 'lfn', default = '/store/user/<hypernews name>', help = 'Name of default LFN') options = scriptOptions(parser) if options.opts.SE: if '<hypernews name>' in options.opts.lfn: token = Plugin.getClass('AccessToken').createInstance('VomsProxy', getConfig(), None) site_db = SiteDB() hnName = site_db.dn_to_username(dn=token.getFQUsername()) if not hnName: raise Exception('Unable to map grid certificate to hypernews name!') options.opts.lfn = options.opts.lfn.replace('<hypernews name>', hnName) tmp = readJSON('https://cmsweb.cern.ch/phedex/datasvc/json/prod/lfn2pfn', {'node': options.opts.SE, 'protocol': options.opts.se_prot, 'lfn': options.opts.lfn})['phedex']['mapping'] for entry in tmp: if len(tmp) > 1: print(entry['node'] + ' ' + entry['pfn']) print(entry['pfn'])