diff --git a/.gitattributes b/.gitattributes index d5bcb56bd6b9d4837734557a19514b1284df7eaf..0cab55578cd3bc458919ca168a069f54f7236396 100644 --- a/.gitattributes +++ b/.gitattributes @@ -4896,20 +4896,20 @@ SAS/ResourceAssignment/ResourceAssignmentDatabase/CMakeLists.txt -text SAS/ResourceAssignment/ResourceAssignmentDatabase/__init__.py -text SAS/ResourceAssignment/ResourceAssignmentDatabase/config.py -text SAS/ResourceAssignment/ResourceAssignmentDatabase/radb.py -text +SAS/ResourceAssignment/ResourceAssignmentDatabase/radb/sql/CMakeLists.txt -text +SAS/ResourceAssignment/ResourceAssignmentDatabase/radb/sql/README -text +SAS/ResourceAssignment/ResourceAssignmentDatabase/radb/sql/add_notifications.sql -text +SAS/ResourceAssignment/ResourceAssignmentDatabase/radb/sql/add_resource_allocation_statics.sql -text +SAS/ResourceAssignment/ResourceAssignmentDatabase/radb/sql/add_triggers.sql -text +SAS/ResourceAssignment/ResourceAssignmentDatabase/radb/sql/add_virtual_instrument.sql -text +SAS/ResourceAssignment/ResourceAssignmentDatabase/radb/sql/create_add_notifications.sql.py -text +SAS/ResourceAssignment/ResourceAssignmentDatabase/radb/sql/create_add_virtual_instrument.sql.py -text +SAS/ResourceAssignment/ResourceAssignmentDatabase/radb/sql/create_and_populate_database.sql -text +SAS/ResourceAssignment/ResourceAssignmentDatabase/radb/sql/create_database.sql -text SAS/ResourceAssignment/ResourceAssignmentDatabase/radbbuslistener.py -text SAS/ResourceAssignment/ResourceAssignmentDatabase/radbpglistener -text SAS/ResourceAssignment/ResourceAssignmentDatabase/radbpglistener.ini -text SAS/ResourceAssignment/ResourceAssignmentDatabase/radbpglistener.py -text -SAS/ResourceAssignment/ResourceAssignmentDatabase/sql/CMakeLists.txt -text -SAS/ResourceAssignment/ResourceAssignmentDatabase/sql/README -text -SAS/ResourceAssignment/ResourceAssignmentDatabase/sql/add_notifications.sql -text -SAS/ResourceAssignment/ResourceAssignmentDatabase/sql/add_resource_allocation_statics.sql -text -SAS/ResourceAssignment/ResourceAssignmentDatabase/sql/add_triggers.sql -text -SAS/ResourceAssignment/ResourceAssignmentDatabase/sql/add_virtual_instrument.sql -text -SAS/ResourceAssignment/ResourceAssignmentDatabase/sql/create_add_notifications.sql.py -text -SAS/ResourceAssignment/ResourceAssignmentDatabase/sql/create_add_virtual_instrument.sql.py -text -SAS/ResourceAssignment/ResourceAssignmentDatabase/sql/create_and_populate_database.sql -text -SAS/ResourceAssignment/ResourceAssignmentDatabase/sql/create_database.sql -text SAS/ResourceAssignment/ResourceAssignmentDatabase/tests/CMakeLists.txt -text SAS/ResourceAssignment/ResourceAssignmentDatabase/tests/fill_database.sql -text SAS/ResourceAssignment/ResourceAssignmentDatabase/tests/t_radb.py -text diff --git a/SAS/ResourceAssignment/ResourceAssignmentDatabase/CMakeLists.txt b/SAS/ResourceAssignment/ResourceAssignmentDatabase/CMakeLists.txt index edb2891cc71ef16a140a3a9d10009129f35e7612..fef199b8466bb52706ed1df98fe69263cd681ab8 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentDatabase/CMakeLists.txt +++ b/SAS/ResourceAssignment/ResourceAssignmentDatabase/CMakeLists.txt @@ -22,5 +22,16 @@ install(FILES radbpglistener.ini DESTINATION etc/supervisord.d) -add_subdirectory(sql) +add_subdirectory(radb/sql) add_subdirectory(tests) + +# symmetric install of sql in build share/... and installed/share/... +set(sql_files radb/sql/add_notifications.sql + radb/sql/add_triggers.sql + radb/sql/add_resource_allocation_statics.sql + radb/sql/add_virtual_instrument.sql + radb/sql/create_database.sql + radb/sql/create_and_populate_database.sql) + +install_files(/share/ FILES ${sql_files}) +lofar_add_data_files(${sql_files}) \ No newline at end of file diff --git a/SAS/ResourceAssignment/ResourceAssignmentDatabase/radb.py b/SAS/ResourceAssignment/ResourceAssignmentDatabase/radb.py index 50c4c1629f8096c7bbdca42bf4bf89832b260518..d393ac5ef565f2328569c642f9222f40e5db911a 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentDatabase/radb.py +++ b/SAS/ResourceAssignment/ResourceAssignmentDatabase/radb.py @@ -989,15 +989,15 @@ class RADatabase: if status is not None: def _claimStatusId(s): - #convert status string to status.id, if it is a string + #convert status string to status.id, if it is a string return self.getResourceClaimStatusId(s) if isinstance(s, basestring) else s if isinstance(status, (int, basestring)): # just a single id conditions.append('status_id = %s') - #convert status string to status.id, if it is a string + #convert status string to status.id, if it is a string qargs.append(_claimStatusId(status)) else: #assume a list/enumerable of id's conditions.append('status_id in %s') - #convert status string to status.id, if they are strings + #convert status string to status.id, if they are strings qargs.append(tuple([_claimStatusId(s) for s in status])) if claim_ids is not None: diff --git a/SAS/ResourceAssignment/ResourceAssignmentDatabase/radb/sql/CMakeLists.txt b/SAS/ResourceAssignment/ResourceAssignmentDatabase/radb/sql/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..dd62bc41019be68f32334ed7ca0473809f62c860 --- /dev/null +++ b/SAS/ResourceAssignment/ResourceAssignmentDatabase/radb/sql/CMakeLists.txt @@ -0,0 +1,2 @@ +# $Id: CMakeLists.txt 32341 2015-08-28 11:59:26Z schaap $ + diff --git a/SAS/ResourceAssignment/ResourceAssignmentDatabase/sql/README b/SAS/ResourceAssignment/ResourceAssignmentDatabase/radb/sql/README similarity index 100% rename from SAS/ResourceAssignment/ResourceAssignmentDatabase/sql/README rename to SAS/ResourceAssignment/ResourceAssignmentDatabase/radb/sql/README diff --git a/SAS/ResourceAssignment/ResourceAssignmentDatabase/sql/add_notifications.sql b/SAS/ResourceAssignment/ResourceAssignmentDatabase/radb/sql/add_notifications.sql similarity index 100% rename from SAS/ResourceAssignment/ResourceAssignmentDatabase/sql/add_notifications.sql rename to SAS/ResourceAssignment/ResourceAssignmentDatabase/radb/sql/add_notifications.sql diff --git a/SAS/ResourceAssignment/ResourceAssignmentDatabase/sql/add_resource_allocation_statics.sql b/SAS/ResourceAssignment/ResourceAssignmentDatabase/radb/sql/add_resource_allocation_statics.sql similarity index 100% rename from SAS/ResourceAssignment/ResourceAssignmentDatabase/sql/add_resource_allocation_statics.sql rename to SAS/ResourceAssignment/ResourceAssignmentDatabase/radb/sql/add_resource_allocation_statics.sql diff --git a/SAS/ResourceAssignment/ResourceAssignmentDatabase/sql/add_triggers.sql b/SAS/ResourceAssignment/ResourceAssignmentDatabase/radb/sql/add_triggers.sql similarity index 100% rename from SAS/ResourceAssignment/ResourceAssignmentDatabase/sql/add_triggers.sql rename to SAS/ResourceAssignment/ResourceAssignmentDatabase/radb/sql/add_triggers.sql diff --git a/SAS/ResourceAssignment/ResourceAssignmentDatabase/sql/add_virtual_instrument.sql b/SAS/ResourceAssignment/ResourceAssignmentDatabase/radb/sql/add_virtual_instrument.sql similarity index 100% rename from SAS/ResourceAssignment/ResourceAssignmentDatabase/sql/add_virtual_instrument.sql rename to SAS/ResourceAssignment/ResourceAssignmentDatabase/radb/sql/add_virtual_instrument.sql diff --git a/SAS/ResourceAssignment/ResourceAssignmentDatabase/sql/create_add_notifications.sql.py b/SAS/ResourceAssignment/ResourceAssignmentDatabase/radb/sql/create_add_notifications.sql.py similarity index 100% rename from SAS/ResourceAssignment/ResourceAssignmentDatabase/sql/create_add_notifications.sql.py rename to SAS/ResourceAssignment/ResourceAssignmentDatabase/radb/sql/create_add_notifications.sql.py diff --git a/SAS/ResourceAssignment/ResourceAssignmentDatabase/sql/create_add_virtual_instrument.sql.py b/SAS/ResourceAssignment/ResourceAssignmentDatabase/radb/sql/create_add_virtual_instrument.sql.py similarity index 100% rename from SAS/ResourceAssignment/ResourceAssignmentDatabase/sql/create_add_virtual_instrument.sql.py rename to SAS/ResourceAssignment/ResourceAssignmentDatabase/radb/sql/create_add_virtual_instrument.sql.py diff --git a/SAS/ResourceAssignment/ResourceAssignmentDatabase/sql/create_and_populate_database.sql b/SAS/ResourceAssignment/ResourceAssignmentDatabase/radb/sql/create_and_populate_database.sql similarity index 100% rename from SAS/ResourceAssignment/ResourceAssignmentDatabase/sql/create_and_populate_database.sql rename to SAS/ResourceAssignment/ResourceAssignmentDatabase/radb/sql/create_and_populate_database.sql diff --git a/SAS/ResourceAssignment/ResourceAssignmentDatabase/sql/create_database.sql b/SAS/ResourceAssignment/ResourceAssignmentDatabase/radb/sql/create_database.sql similarity index 100% rename from SAS/ResourceAssignment/ResourceAssignmentDatabase/sql/create_database.sql rename to SAS/ResourceAssignment/ResourceAssignmentDatabase/radb/sql/create_database.sql diff --git a/SAS/ResourceAssignment/ResourceAssignmentDatabase/sql/CMakeLists.txt b/SAS/ResourceAssignment/ResourceAssignmentDatabase/sql/CMakeLists.txt deleted file mode 100644 index b06106cd6da76a87a033d71df6658e4c0c434cc6..0000000000000000000000000000000000000000 --- a/SAS/ResourceAssignment/ResourceAssignmentDatabase/sql/CMakeLists.txt +++ /dev/null @@ -1,11 +0,0 @@ -# $Id: CMakeLists.txt 32341 2015-08-28 11:59:26Z schaap $ - -set(sql_files add_notifications.sql - add_triggers.sql - add_resource_allocation_statics.sql - add_virtual_instrument.sql - create_database.sql - create_and_populate_database.sql) - -install_files(/share/radb/sql FILES ${sql_files}) - diff --git a/SAS/ResourceAssignment/ResourceAssignmentDatabase/tests/t_radb.py b/SAS/ResourceAssignment/ResourceAssignmentDatabase/tests/t_radb.py index 5a053340fba88d50c47e78ab276c8ee154ce01a1..6e6ca59c6f294945698d920aacfdb0cfe9d23477 100755 --- a/SAS/ResourceAssignment/ResourceAssignmentDatabase/tests/t_radb.py +++ b/SAS/ResourceAssignment/ResourceAssignmentDatabase/tests/t_radb.py @@ -22,7 +22,6 @@ import unittest import testing.postgresql import psycopg2 import os -import datetime from dateutil import parser try: @@ -30,14 +29,14 @@ try: except ImportError as e: print str(e) print 'Please install python package mock: sudo pip install mock' - exit(3) #special lofar test exit code: skipped test + exit(3) # special lofar test exit code: skipped test try: import testing.postgresql except ImportError as e: print str(e) print 'Please install python package testing.postgresql: sudo pip install testing.postgresql' - exit(3) #special lofar test exit code: skipped test + exit(3) # special lofar test exit code: skipped test from lofar.common.dbcredentials import Credentials from lofar.sas.resourceassignment.database.radb import RADatabase @@ -45,20 +44,19 @@ from lofar.common.postgres import PostgresListener class ResourceAssignmentDatabaseTest(unittest.TestCase): - # todo: test shared db to improve test speed # share the generated database for faster tests # Postgresql = testing.postgresql.PostgresqlFactory(cache_initialized_db=True) # These are applied in given order to set up test db # Note: cannot use create_and_populate_database.sql since '\i' is not understood by cursor.execute() - sql_basepath = os.environ['LOFARROOT']+"/share/radb/sql/" - sql_createdb_paths = [sql_basepath+"create_database.sql", - sql_basepath+"/add_resource_allocation_statics.sql", - sql_basepath+"/add_virtual_instrument.sql", - sql_basepath+"/add_notifications.sql", - sql_basepath+"/add_triggers.sql" - ] + sql_basepath = os.environ['LOFARROOT'] + "/share/radb/sql/" + sql_createdb_paths = [sql_basepath + "create_database.sql", + sql_basepath + "/add_resource_allocation_statics.sql", + sql_basepath + "/add_virtual_instrument.sql", + sql_basepath + "/add_notifications.sql", + sql_basepath + "/add_triggers.sql" + ] def setUp(self): # set up postgres database @@ -72,15 +70,17 @@ class ResourceAssignmentDatabaseTest(unittest.TestCase): database_credentials.database = self.postgresql.dsn()['database'] database_credentials.port = self.postgresql.dsn()['port'] database_credentials.user = 'resourceassignment' - database_credentials.password = 'blabla' # cannot be empty... + database_credentials.password = 'blabla' # cannot be empty... # Note: NOSUPERUSER currently raises "permission denied for schema virtual_instrument" # Maybe we want to sort out user creation and proper permissions in the sql scripts? - query = "CREATE USER %s WITH SUPERUSER PASSWORD '%s'" % (database_credentials.user, database_credentials.password) + query = "CREATE USER %s WITH SUPERUSER PASSWORD '%s'" % ( + database_credentials.user, + database_credentials.password) self._execute_query(query) for sql_path in self.sql_createdb_paths: - with open(sql_path) as sql: # cursor.execute() does not accept '\i' + with open(sql_path) as sql: # cursor.execute() does not accept '\i' self._execute_query(sql.read()) # reconnect with useradministration role for tests @@ -93,21 +93,19 @@ class ResourceAssignmentDatabaseTest(unittest.TestCase): # set up PostgresListener for notifications: self.listener = PostgresListener(host=database_credentials.host, - username=database_credentials.user, - password=database_credentials.password, - database=database_credentials.database, - port=database_credentials.port) + username=database_credentials.user, + password=database_credentials.password, + database=database_credentials.database, + port=database_credentials.port) # set up radb python module self.radb = RADatabase(database_credentials) - def tearDown(self): self.connection.close() self.postgresql.stop() # self.Postgresql.clear_cache() # todo: use this when using shared db instead of stop(), or remove. - def _execute_query(self, query, fetch=False): cursor = self.connection.cursor() cursor.execute(query) @@ -118,7 +116,7 @@ class ResourceAssignmentDatabaseTest(unittest.TestCase): self.connection.commit() return ret -# --- tests start here + # --- tests start here # # integrity tests of postgres database itself @@ -128,7 +126,6 @@ class ResourceAssignmentDatabaseTest(unittest.TestCase): # Of course new tests can be added here where db functionality like triggers should be tested separately from the # Python part of the job. - # database created? def test_select_tables_contains_tables_for_each_schema(self): query = "SELECT table_schema,table_name FROM information_schema.tables" @@ -149,16 +146,15 @@ class ResourceAssignmentDatabaseTest(unittest.TestCase): fetch = self._execute_query(query, fetch=True) self.assertTrue('rcu_board' in str(fetch)) - def _insert_test_spec(self, - starttime = '2017-05-10 13:00:00', - endtime = '2017-05-10 14:00:00', - content = 'testcontent', - cluster = 'CEP4'): - query = "INSERT INTO resource_allocation.specification (starttime, endtime, content, cluster) " \ - "VALUES ('%s', '%s', '%s', '%s') RETURNING id" % (starttime, endtime, content, cluster) - res = self._execute_query(query, fetch=True) - return res[0][0] + starttime='2017-05-10 13:00:00', + endtime='2017-05-10 14:00:00', + content='testcontent', + cluster='CEP4'): + query = "INSERT INTO resource_allocation.specification (starttime, endtime, content, cluster) " \ + "VALUES ('%s', '%s', '%s', '%s') RETURNING id" % (starttime, endtime, content, cluster) + res = self._execute_query(query, fetch=True) + return res[0][0] def test_insert_specification_creates_new_entry(self): # insert spec @@ -186,7 +182,7 @@ class ResourceAssignmentDatabaseTest(unittest.TestCase): def test_delete_specification(self): # insert spec - content='deletecontent' + content = 'deletecontent' ident = self._insert_test_spec(content=content) # make sure it's there @@ -215,8 +211,6 @@ class ResourceAssignmentDatabaseTest(unittest.TestCase): fetch = self._execute_query(query, fetch=True) self.assertTrue(parser.parse(starttime) == fetch[0][0]) - - # notifications in place? def test_insert_task_triggers_notification(self): # insert specification to not raise INtegrityError @@ -226,7 +220,8 @@ class ResourceAssignmentDatabaseTest(unittest.TestCase): cursor = self.connection.cursor() cursor.execute("LISTEN %s;", (psycopg2.extensions.AsIs('task_insert'),)) - # todo: fix this and use this instead to listen for notifications. Problem: For some reason callback function is not called. + # todo: fix this and use this instead to listen for notifications. + # todo: ...Problem: For some reason callback function is not called. # set up listener in a way we can check it was called # callback = mock.Mock() # callback.listen.return_value = 42 @@ -234,18 +229,18 @@ class ResourceAssignmentDatabaseTest(unittest.TestCase): # trigger notification query = "INSERT INTO resource_allocation.task (mom_id, otdb_id, status_id, type_id, specification_id)" \ - "VALUES (%s, %s, %s, %s, %s)" % (1,1,200,0,ident) + "VALUES (%s, %s, %s, %s, %s)" % (1, 1, 200, 0, ident) self._execute_query(query) # wait for notification notification = '' self.connection.poll() while self.connection.notifies: - try: - notification = self.connection.notifies.pop(0) - break - except Exception as e: - pass + try: + notification = self.connection.notifies.pop(0) + break + except Exception: + pass self.assertTrue('task_insert' in str(notification)) @@ -258,8 +253,8 @@ class ResourceAssignmentDatabaseTest(unittest.TestCase): # def test_getTaskStatuses_contains_scheduled(self): - stat = self.radb.getTaskStatuses() - self.assertTrue('scheduled' in str(stat)) + stat = self.radb.getTaskStatuses() + self.assertTrue('scheduled' in str(stat)) if __name__ == "__main__":