diff --git a/LTA/ltastorageoverview/lib/scraper.py b/LTA/ltastorageoverview/lib/scraper.py index 8552d3cf818d639652239eb476c2014992fbc6e0..53aac285d4d088f6a0d6279798632da705659c9c 100755 --- a/LTA/ltastorageoverview/lib/scraper.py +++ b/LTA/ltastorageoverview/lib/scraper.py @@ -388,9 +388,9 @@ class ResultGetterThread(threading.Thread): def populateDbWithLTASitesAndRootDirs(db): if not db.sites(): #db.insertSite('nikhef', 'srm://tbn18.nikhef.nl:8446') - sara_id = db.insertSite('sara', 'srm://srm.grid.sara.nl:8443') - juelich_id = db.insertSite('juelich', 'srm://lofar-srm.fz-juelich.de:8443') - poznan_id = db.insertSite('poznan', 'srm://lta-head.lofar.psnc.pl:8443') + sara_id = db.insertSiteIfNotExists('sara', 'srm://srm.grid.sara.nl:8443') + juelich_id = db.insertSiteIfNotExists('juelich', 'srm://lofar-srm.fz-juelich.de:8443') + poznan_id = db.insertSiteIfNotExists('poznan', 'srm://lta-head.lofar.psnc.pl:8443') for site_id in [sara_id, juelich_id, poznan_id]: for i in range(1, 8): diff --git a/LTA/ltastorageoverview/lib/store.py b/LTA/ltastorageoverview/lib/store.py index 34884cc01f6f7341d1135d28a002f644e5434bb6..36dd76c6ab201113bc935640e074db2866bf9e2c 100644 --- a/LTA/ltastorageoverview/lib/store.py +++ b/LTA/ltastorageoverview/lib/store.py @@ -51,19 +51,29 @@ class LTAStorageDb(PostgresDatabaseConnection): :param string srmurls: the srm url to that site :return int: the new id of the inserted site """ + site_id = self.executeQuery('insert into lta.site (name, url) values (%s, %s) returning id;', (siteName, srmurl), fetch=FETCH_ONE)['id'] + self.commit() + return site_id + + def insertSiteIfNotExists(self, siteName, srmurl): + """insert a site into the database and return the id. + If the site already exists, then the id of that site is just returned. + :param string siteName: the name of the site + :param string srmurls: the srm url to that site + :return int: the new id of the inserted site + """ site = self.siteByName(siteName) if site: return site['id'] - site_id = self.executeQuery('insert into lta.site (name, url) values (%s, %s) returning id;', (siteName, srmurl), fetch=FETCH_ONE)['id'] - self.commit() - return site_id + return self.insertSite(siteName, srmurl) def insertRootDirectory(self, siteName, rootDirectory): """ Insert a root directory for a site. Each site has at least one root directory (with no parent). - For all non-root directories, use insertSubDirectory + For all non-root directories, use insertSubDirectory. + Beware: Uniqueness of the root dir for a site is not enforced. :param string siteName: the name of the site (should already be in the database) :param string rootDirectory: the full path of the directory :return integer: the new id of the inserted root directory @@ -81,7 +91,7 @@ class LTAStorageDb(PostgresDatabaseConnection): self.commit() return dir_id - def insertSubDirectory(self, parent_dir_id, sub_directory_path): + def insertSubDirectory(self, sub_directory_path, parent_dir_id): """ Insert a sub directory which is a child of the directory with parent_dir_id :param int parent_dir_id: the id of this subdirectories parent diff --git a/LTA/ltastorageoverview/test/db_performance_test.py b/LTA/ltastorageoverview/test/db_performance_test.py index 04b5f7f92831129c9bacd7da231dd1897350acf1..f224b3ee9c90b7b80dc6a753fc5857cd0d0b1ad2 100755 --- a/LTA/ltastorageoverview/test/db_performance_test.py +++ b/LTA/ltastorageoverview/test/db_performance_test.py @@ -75,9 +75,9 @@ def main(): db = store.LTAStorageDb(dbcreds, options.verbose) - db.insertSite('sara', 'srm://srm.siteA.nl:8444') + db.insertSiteIfNotExists('sara', 'srm://srm.siteA.nl:8444') rootdir_id = db.insertRootDirectory('sara', '/pnfs/grid.siteA.nl/data/lofar/ops') - projects_dir_id = db.insertSubDirectory(rootdir_id, '/pnfs/grid.siteA.nl/data/lofar/ops/projects') + projects_dir_id = db.insertSubDirectory('/pnfs/grid.siteA.nl/data/lofar/ops/projects', rootdir_id) total_num_files_inserted = 0 @@ -86,13 +86,13 @@ def main(): for project_nr in range(1, 10): # project_name = 'lc%d_%03d/%d' % (cycle_nr, project_nr, os.getpid()) project_name = 'lc%d_%03d' % (cycle_nr, project_nr) - projectdir_id = db.insertSubDirectory(projects_dir_id, '/pnfs/grid.siteA.nl/data/lofar/ops/projects/%s' % (project_name,)) + projectdir_id = db.insertSubDirectory('/pnfs/grid.siteA.nl/data/lofar/ops/projects/%s' % (project_name,), projects_dir_id) obs_base_id = cycle_nr*100000+project_nr*1000 for obs_nr, obsId in enumerate(range(obs_base_id, obs_base_id+20)): obsName = 'L%s' % obsId - obsdir_id = db.insertSubDirectory(projectdir_id, '/pnfs/grid.siteA.nl/data/lofar/ops/projects/%s/%s' % (project_name, obsName)) + obsdir_id = db.insertSubDirectory('/pnfs/grid.siteA.nl/data/lofar/ops/projects/%s/%s' % (project_name, obsName), projectdir_id) fileinfos = [('%s_SB%3d' % (obsName, sbNr), 1000+sbNr+project_nr*cycle_nr, base_date + timedelta(days=10*cycle_nr+project_nr, minutes=obs_nr, seconds=sbNr), obsdir_id) for sbNr in range(0, 2)] now = datetime.utcnow() diff --git a/LTA/ltastorageoverview/test/integration_test_store.py b/LTA/ltastorageoverview/test/integration_test_store.py index 8f38c40e76abef0d619fc9648582db187c418750..b141011a2d23bd0377f55a8e9307f2d6f6f77007 100755 --- a/LTA/ltastorageoverview/test/integration_test_store.py +++ b/LTA/ltastorageoverview/test/integration_test_store.py @@ -60,14 +60,14 @@ class IntegrationTestLTAStorageDb(CommonLTAStorageDbTest): for site_nr in range(NUM_SITES): site_name = 'site%d' % site_nr site_url = 'srm://%s.org' % site_name - db.insertSite(site_name, site_url) + db.insertSiteIfNotExists(site_name, site_url) for project_nr in range(NUM_PROJECTS): rootDir_id = db.insertRootDirectory(site_name, 'rootDir_%d' % project_nr) dir2subdir[rootDir_id] = [] for subdir_nr in range(NUM_PROJECT_SUBDIRS): - subDir_id = db.insertSubDirectory(rootDir_id, 'subDir_%d' % subdir_nr) + subDir_id = db.insertSubDirectory('subDir_%d' % subdir_nr, rootDir_id) dir2subdir[subDir_id] = [] dir2subdir[rootDir_id].append(subDir_id) for file_nr in range(project_nr*subdir_nr): @@ -85,7 +85,7 @@ class IntegrationTestLTAStorageDb(CommonLTAStorageDbTest): self.assertEqual(max(f['creation_date'] for f in dir_files), dir_stats['dir_max_file_creation_date']) for subsubdir_nr in range(NUM_SUB_SUBDIRS): - subsubDir_id = db.insertSubDirectory(subDir_id, 'subsubDir_%d' % subsubdir_nr) + subsubDir_id = db.insertSubDirectory('subsubDir_%d' % subsubdir_nr, subDir_id) dir2subdir[subsubDir_id] = [] dir2subdir[subDir_id].append(subsubDir_id) for kk in range(project_nr*subdir_nr*subsubdir_nr): diff --git a/LTA/ltastorageoverview/test/test_lso_webservice.py b/LTA/ltastorageoverview/test/test_lso_webservice.py index b074daca0b40eff0c6c2cbb729cb043ca2f244e9..c81e140777b5da48c96e59bdbd3459ff0311f8d1 100755 --- a/LTA/ltastorageoverview/test/test_lso_webservice.py +++ b/LTA/ltastorageoverview/test/test_lso_webservice.py @@ -90,8 +90,8 @@ def setUpModule(): webservice.db = store.LTAStorageDb(dbcreds, True) logger.info('filling test LTASO database with test data') - webservice.db.insertSite('siteA', 'srm://siteA.org') - webservice.db.insertSite('siteB', 'srm://siteB.org') + webservice.db.insertSiteIfNotExists('siteA', 'srm://siteA.org') + webservice.db.insertSiteIfNotExists('siteB', 'srm://siteB.org') rootDir_ids = [] rootDir_ids.append(webservice.db.insertRootDirectory('siteA', 'rootDir1')) @@ -100,13 +100,13 @@ def setUpModule(): for rootDir_id in rootDir_ids: for j in range(2): - subDir_id = webservice.db.insertSubDirectory(rootDir_id, 'subDir_%d' % j) + subDir_id = webservice.db.insertSubDirectory('subDir_%d' % j, rootDir_id) if j == 0: webservice.db.insertFileInfo('file_%d' % j, 271 * (j + 1), datetime.datetime.utcnow(), subDir_id) for k in range(2): - subsubDir_id = webservice.db.insertSubDirectory(subDir_id, 'subsubDir_%d' % k) + subsubDir_id = webservice.db.insertSubDirectory('subsubDir_%d' % k, subDir_id) for l in range((j + 1) * (k + 1)): webservice.db.insertFileInfo('file_%d' % l, 314 * (l + 1), datetime.datetime.utcnow(), subsubDir_id) diff --git a/LTA/ltastorageoverview/test/test_store.py b/LTA/ltastorageoverview/test/test_store.py index 7e39ddbed4570aae23177856f4dc7e76e72b4f15..c3abd73231ddf1d62c8bbfec21a36da2fb5c9e3c 100755 --- a/LTA/ltastorageoverview/test/test_store.py +++ b/LTA/ltastorageoverview/test/test_store.py @@ -33,8 +33,8 @@ logger = logging.getLogger(__name__) class TestLTAStorageDb(CommonLTAStorageDbTest): def testSites(self): with store.LTAStorageDb(self.dbcreds, True) as db: - siteA_id = db.insertSite('siteA', 'srm://siteA.org') - siteB_id = db.insertSite('siteB', 'srm://siteB.org') + siteA_id = db.insertSiteIfNotExists('siteA', 'srm://siteA.org') + siteB_id = db.insertSiteIfNotExists('siteB', 'srm://siteB.org') sites = db.sites() siteNames = [x['name'] for x in sites] @@ -50,8 +50,8 @@ class TestLTAStorageDb(CommonLTAStorageDbTest): def testRootDirs(self): with store.LTAStorageDb(self.dbcreds, True) as db: - siteA_id = db.insertSite('siteA', 'srm://siteA.org') - siteB_id = db.insertSite('siteB', 'srm://siteB.org') + siteA_id = db.insertSiteIfNotExists('siteA', 'srm://siteA.org') + siteB_id = db.insertSiteIfNotExists('siteB', 'srm://siteB.org') dirA1_id = db.insertRootDirectory('siteA', 'rootDir1') dirA2_id = db.insertRootDirectory('siteA', 'rootDir2') @@ -85,9 +85,23 @@ class TestLTAStorageDb(CommonLTAStorageDbTest): self.assertEqual(siteB_id, rootDirsDict[dirB2_id]['site_id']) self.assertEqual('siteB', rootDirsDict[dirB2_id]['site_name']) + root_dir_ids_siteA = set(d['root_dir_id'] for d in db.rootDirectoriesForSite(siteA_id)) + self.assertEqual(set([dirA1_id, dirA2_id, dirA3_id]), root_dir_ids_siteA) + + root_dir_ids_siteB = set(d['root_dir_id'] for d in db.rootDirectoriesForSite(siteB_id)) + self.assertEqual(set([dirB1_id, dirB2_id]), root_dir_ids_siteB) + + root_dirs_non_existing_site = db.rootDirectoriesForSite(999) + self.assertEqual([], root_dirs_non_existing_site) + + def testNonExistingDir(self): + with store.LTAStorageDb(self.dbcreds, True) as db: + dir = db.directoryByName('fjsdka;58432aek5843rfsjd8-sa') + self.assertEqual(None, dir) + def testLeastRecentlyVisitedDirectory(self): with store.LTAStorageDb(self.dbcreds, True) as db: - db.insertSite('siteA', 'srm://siteA.org') + db.insertSiteIfNotExists('siteA', 'srm://siteA.org') dir_ids = [] for i in range(3): @@ -113,44 +127,44 @@ class TestLTAStorageDb(CommonLTAStorageDbTest): def testDuplicateSubDirs(self): with store.LTAStorageDb(self.dbcreds, True) as db: - db.insertSite('siteA', 'srm://siteA.org') - db.insertSite('siteB', 'srm://siteB.org') + db.insertSiteIfNotExists('siteA', 'srm://siteA.org') + db.insertSiteIfNotExists('siteB', 'srm://siteB.org') dirA_id = db.insertRootDirectory('siteA', 'rootDir1') dirB_id = db.insertRootDirectory('siteB', 'rootDir1') - subDirA1_id = db.insertSubDirectory(dirA_id, 'foo') - subDirA2_id = db.insertSubDirectory(dirA_id, 'bar') - subDirB1_id = db.insertSubDirectory(dirB_id, 'foo') + subDirA1_id = db.insertSubDirectory('foo', dirA_id) + subDirA2_id = db.insertSubDirectory('bar', dirA_id) + subDirB1_id = db.insertSubDirectory('foo', dirB_id) self.assertNotEquals(None, subDirA1_id) self.assertNotEquals(None, subDirA2_id) self.assertNotEquals(None, subDirB1_id) - subDirA1a_id = db.insertSubDirectory(dirA_id, 'foo') + subDirA1a_id = db.insertSubDirectory('foo', dirA_id) self.assertEquals(None, subDirA1a_id) def testProjectsAndObservations(self): with store.LTAStorageDb(self.dbcreds, True) as db: #first insert a lot of data... - db.insertSite('juelich', 'srm://lofar-srm.fz-juelich.de:8443') - db.insertSite('sara', 'srm://srm.grid.sara.nl:8443') + db.insertSiteIfNotExists('juelich', 'srm://lofar-srm.fz-juelich.de:8443') + db.insertSiteIfNotExists('sara', 'srm://srm.grid.sara.nl:8443') juelich_root_dir_id = db.insertRootDirectory('juelich', '/pnfs/fz-juelich.de/data/lofar/ops/') sara_root_dir_id = db.insertRootDirectory('sara', '/pnfs/grid.sara.nl/data/lofar/ops') - juelich_projects_dir_id = db.insertSubDirectory(juelich_root_dir_id, '/pnfs/fz-juelich.de/data/lofar/ops/projects') - sara_projects_dir_id = db.insertSubDirectory(sara_root_dir_id, '/pnfs/grid.sara.nl/data/lofar/ops/projects') + juelich_projects_dir_id = db.insertSubDirectory('/pnfs/fz-juelich.de/data/lofar/ops/projects', juelich_root_dir_id) + sara_projects_dir_id = db.insertSubDirectory('/pnfs/grid.sara.nl/data/lofar/ops/projects', sara_root_dir_id) for project_nr, project_name in enumerate(['lc8_001', '2017lofarobs', 'ddt5_001']): # projects are sometimes stored at multiple sites for projects_dir_id in [juelich_projects_dir_id, sara_projects_dir_id]: - project_dir_id = db.insertSubDirectory(projects_dir_id, - '/pnfs/fz-juelich.de/data/lofar/ops/projects/' + project_name) + project_dir_id = db.insertSubDirectory('/pnfs/fz-juelich.de/data/lofar/ops/projects/' + project_name, + projects_dir_id) for obs_nr in range(3): obs_name = 'L%06d' % ((project_nr+1)*1000 + obs_nr) - obs_dir_id = db.insertSubDirectory(project_dir_id, - '/pnfs/fz-juelich.de/data/lofar/ops/projects/' + project_name + '/' + obs_name) + obs_dir_id = db.insertSubDirectory('/pnfs/fz-juelich.de/data/lofar/ops/projects/' + project_name + '/' + obs_name, + project_dir_id) for sb_nr in range(244): file_name = '%s_SB%03d.MS.tar' % (obs_name, sb_nr)