Skip to content
Snippets Groups Projects
Commit 5a1dc1cb authored by Jorrit Schaap's avatar Jorrit Schaap
Browse files

SW-41: reuse the common radb testing code with a fresh testing database for each run

parent b4cc17c3
No related branches found
No related tags found
No related merge requests found
...@@ -18,96 +18,84 @@ ...@@ -18,96 +18,84 @@
# with the LOFAR software suite. If not, see <http://www.gnu.org/licenses/>. # with the LOFAR software suite. If not, see <http://www.gnu.org/licenses/>.
# $Id: $ # $Id: $
from optparse import OptionParser import unittest
import psycopg2
import os import os
from datetime import datetime, timedelta from datetime import datetime, timedelta
import logging from dateutil import parser
from pprint import pformat
from random import randint from random import randint
from lofar.common.datetimeutils import totalSeconds
import logging
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
from lofar.common import dbcredentials
from lofar.sas.resourceassignment.database.radb import RADatabase
from lofar.common.datetimeutils import totalSeconds
def test_resource_usages_performance(radb): import radb_common_testing
radb.updateResourceAvailability(117, available_capacity=10000000, total_capacity=10000000)
def setUpModule():
now = datetime.utcnow() return radb_common_testing.setUpModule()
now -= timedelta(minutes=now.minute, seconds=now.second, microseconds=now.microsecond) # round to full hour
spec_ids = [] def tearDownModule():
filename = 'resource_usages_performance%s.csv' % (datetime.utcnow().strftime('%Y%m%dT%H%M%S'),) return radb_common_testing.tearDownModule()
with open(filename, 'w') as file:
file.write('#claims, elapsed_insert, elapsed_rebuild\n') class ResourceAssignmentDatabaseTest(radb_common_testing.RADBCommonTest):
counter = 0 def test_resource_usages_performance(self):
for k in range(20): self.radb.updateResourceAvailability(117, available_capacity=10000000, total_capacity=10000000)
num_claims_to_insert = 20
num_insert_repeats = 10 now = datetime.utcnow()
elapsed_insert = 0 now -= timedelta(minutes=now.minute, seconds=now.second, microseconds=now.microsecond) # round to full hour
for i in range(num_insert_repeats): spec_ids = []
counter += 1 filename = 'resource_usages_performance%s.csv' % (datetime.utcnow().strftime('%Y%m%dT%H%M%S'),)
result = radb.insertSpecificationAndTask(counter, counter, 'approved', 'observation', with open(filename, 'w') as file:
now+timedelta(hours=3*counter), file.write('#claims, elapsed_insert, elapsed_rebuild\n')
now + timedelta(hours=1 + 3*counter), counter = 0
'content', 'CEP4') for k in range(20):
task_id = result['task_id'] num_claims_to_insert = 20
task = radb.getTask(task_id) num_insert_repeats = 10
spec_ids.append(task['specification_id']) elapsed_insert = 0
for i in range(num_insert_repeats):
claims = [{'resource_id': 117, counter += 1
'starttime': task['starttime']-timedelta(minutes=randint(0, 1800)), result = self.radb.insertSpecificationAndTask(counter, counter, 'approved', 'observation',
'endtime': task['starttime']+timedelta(seconds=randint(1801, 3600)), now+timedelta(hours=3*counter),
'status': 'tentative', now + timedelta(hours=1 + 3*counter),
'claim_size': q} 'content', 'CEP4')
for q in range(num_claims_to_insert)] task_id = result['task_id']
task = self.radb.getTask(task_id)
spec_ids.append(task['specification_id'])
claims = [{'resource_id': 117,
'starttime': task['starttime']-timedelta(minutes=randint(0, 1800)),
'endtime': task['starttime']+timedelta(seconds=randint(1801, 3600)),
'status': 'tentative',
'claim_size': q}
for q in range(num_claims_to_insert)]
start = datetime.utcnow()
self.radb.insertResourceClaims(task_id, claims, 'foo', 1, 1)
elapsed_insert += totalSeconds(datetime.utcnow() - start)
elapsed_insert /= num_insert_repeats
start = datetime.utcnow() start = datetime.utcnow()
radb.insertResourceClaims(task_id, claims, 'foo', 1, 1) # make sure the usage table is wiped, so asserts fail when rebuild_resource_usages_from_claims is erroneously roll'ed back.
elapsed_insert += totalSeconds(datetime.utcnow() - start) self.radb.rebuild_resource_usages_from_claims(117, 'tentative')
elapsed_insert /= 10 elapsed_rebuild = totalSeconds(datetime.utcnow() - start)
start = datetime.utcnow()
# make sure the usage table is wiped, so asserts fail when rebuild_resource_usages_from_claims is erroneously roll'ed back.
radb.rebuild_resource_usages_from_claims(117, 'tentative')
elapsed_rebuild = totalSeconds(datetime.utcnow() - start)
logger.info('TEST RESULT: radb now contains %d claims, insert of %d claims takes on average %.3fsec and a rebuild of the whole usage table takes %.3fsec',
len(radb.getResourceClaims()), num_claims_to_insert, elapsed_insert, elapsed_rebuild)
file.write('%d, %.3f, %.3f\n' % (len(radb.getResourceClaims()), elapsed_insert, elapsed_rebuild))
file.flush()
logger.info('removing all test specs/tasks/claims from db')
for spec_id in spec_ids:
radb.deleteSpecification(spec_id)
logger.info('Done. Results can be found in file: %s', filename)
if __name__ == '__main__':
logging.basicConfig(format='%(asctime)s %(levelname)s %(message)s',level=logging.INFO)
# Check the invocation arguments logger.info('TEST RESULT: radb now contains %d claims, insert of %d claims takes on average %.3fsec and a rebuild of the whole usage table takes %.3fsec',
parser = OptionParser("%prog [options]", description='runs some test queries on the radb') len(self.radb.getResourceClaims()), num_claims_to_insert, elapsed_insert, elapsed_rebuild)
parser.add_option('-V', '--verbose', dest='verbose', action='store_true', help='verbose logging') file.write('%d, %.3f, %.3f\n' % (len(self.radb.getResourceClaims()), elapsed_insert, elapsed_rebuild))
parser.add_option_group(dbcredentials.options_group(parser)) file.flush()
parser.set_defaults(dbcredentials="RADB")
(options, args) = parser.parse_args()
dbcreds = dbcredentials.parse_options(options) logger.info('removing all test specs/tasks/claims from db')
print for spec_id in spec_ids:
print 'Using dbcreds: %s' % dbcreds.stringWithHiddenPassword() self.radb.deleteSpecification(spec_id)
print 'Are you sure you want to run the performance tests on this database? Tables will be modified! Precious data might be lost!'
print 'This test gives the most reproducable results when run on a clean database.'
print
answer = raw_input('CONTINUE? y/<n>: ')
if 'y' not in answer.lower():
print 'Exiting without running the test...'
exit(1)
print 'Starting test....' logger.info('Done. Results can be found in file: %s', filename)
radb = RADatabase(dbcreds=dbcreds, log_queries=options.verbose)
test_resource_usages_performance(radb) if __name__ == "__main__":
os.environ['TZ'] = 'UTC'
logging.basicConfig(format='%(asctime)s %(levelname)s %(message)s', level=logging.INFO)
unittest.main()
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment