def test_query_bdii(self): """ Test querying the BDII. """ # Test that information is retrieved and is populated correctly infosys_entries = query_bdii("exp-bdii.cern.ch", "cms") self.assertNotEqual(infosys_entries, {}) keys = infosys_entries.keys() entry = infosys_entries[keys[0]] self.assertTrue(entry['site_name'] != '') self.assertTrue(entry['gridtype'] != '') self.assertTrue(entry['gatekeeper'] != '') self.assertTrue(entry['wall_clocktime'] >= 0) self.assertTrue('GlueCEUniqueID' in entry['ref_id']) self.assertTrue(entry['ce_status'] != '') self.assertTrue(entry['glexec_bin'] != '') self.assertTrue(entry['work_dir'] != '') self.assertEqual(entry['source'], "exp-bdii.cern.ch") self.assertEqual(entry['source_type'], 'BDII') self.assertTrue(entry['GlueCEUniqueID'] != '') # Test bad bidd source self.assertRaises(ldapMonitor.ldap.LDAPError, query_bdii, "bad.url", "cms") # Test bad vo name infosys_entries = query_bdii("exp-bdii.cern.ch", "junk_testing_bad_vo_name_that_is_not_valid") self.assertEqual(infosys_entries, {}) # Test empty vo name infosys_entries = query_bdii("exp-bdii.cern.ch", "") self.assertTrue(infosys_entries != {})
def find_new_entries_in_infosys(config_xml, source, source_type, skip_disabled, vo_name=''): """ For the given information system, find any new entries that are not already in the config. """ try: # Find all config entries not disabled config_dom = minidom.parse(config_xml) config_entries = infosys_lib.parse_entries(config_dom, skip_missing_ref_id=True, skip_disabled=skip_disabled) except: print "Error parsing the config file '%s' for entries, exiting the tool." % config_xml sys.exit(2) # Query the given info system if source_type.lower() == 'bdii': infosys_entries = infosys_lib.query_bdii(source, vo_name) elif source_type.lower() == 'ress': # Update path with condor condor_path = infosys_lib.parse_condor_path(config_dom) os.environ["CONDOR_CONFIG"] = condor_path + "/etc/condor_config" condorExe.set_path(condor_path + "/bin", condor_path + "/sbin") ress_entries = infosys_lib.query_ress(source, vo_name) # Remove duplicate entries infosys_entries = remove_duplicates(ress_entries) elif source_type.lower() == 'tg': infosys_entries = infosys_lib.query_teragrid() # Compare config entries with what is found in the information system new_entries = [] for infosys_id in infosys_entries: entry_i = infosys_entries[infosys_id] found_match = False for config_entry in config_entries: entry_c = config_entries[config_entry] # Check if ids match if entry_i['ref_id'] == entry_c['ref_id']: # Check same source types between config and infosys entries # TODO do we need to check source url too? if entry_c['source_type'].lower() == source_type.lower(): found_match = True # already have this entry break else: # Check if content matches for other infosys or manual entries if entry_i['gatekeeper'] == entry_c['gatekeeper'] and entry_i['gridtype'] == entry_c['gridtype'] and entry_i['rsl'] == entry_c['rsl']: found_match = True # already have this entry # TODO here could add ability to update ref_ids if find additional matching entry # not sure if we want to for ress entries tho? break if not found_match: new_entries.append(infosys_entries[infosys_id]) return new_entries
def find_entries_with_partial_id_match(config_xml, skip_disabled): """ Finds the bdii, ress and TeraGrid entries with partial matches. """ try: # Find all enabled config entries with ref ids config_dom = minidom.parse(config_xml) config_entries = infosys_lib.parse_entries(config_dom, skip_missing_ref_id=True, skip_disabled=skip_disabled) # Create an info systems list from factory config infosystems = infosys_lib.parse_info_systems(config_dom) has_ress = False for infosys in infosystems: if infosystems[infosys].lower() == 'ress': has_ress = True break if has_ress: # Update path with condor condor_path = infosys_lib.parse_condor_path(config_dom) os.environ["CONDOR_CONFIG"] = condor_path + "/etc/condor_config" condorExe.set_path(condor_path + "/bin", condor_path + "/sbin") except: print "Error parsing the the config file '%s', exiting the tool." % config_xml sys.exit(2) # Retrieve info systems entries bdii_entries = {} ress_entries = {} tg_entries = {} for infosys, type in infosystems.iteritems(): if type.lower() == 'bdii': bdii_entries.update(infosys_lib.query_bdii(infosys)) elif type.lower() == 'ress': ress_entries.update(infosys_lib.query_ress(infosys)) elif type.lower() == 'tg': tg_entries.update(infosys_lib.query_teragrid(infosys)) partial_match_bdii_entries = find_partial_id_match(bdii_entries, config_entries, 'bdii') partial_match_ress_entries = find_partial_id_match(ress_entries, config_entries, 'ress') partial_match_tg_entries = find_partial_id_match(tg_entries, config_entries, 'tg') return partial_match_bdii_entries, partial_match_ress_entries, partial_match_tg_entries