From b7d3f9c95d57da7505aa2ec901be2bcb8e92ef78 Mon Sep 17 00:00:00 2001 From: Jorrit Schaap <schaap@astron.nl> Date: Tue, 15 Mar 2016 15:01:43 +0000 Subject: [PATCH] Task #8887: modified getResourceClaims so we can query for time-window, status, resource_type or task_id --- .../ResourceAssignmentDatabase/radb.py | 106 +++++++++++++----- .../ResourceAssignmentService/rpc.py | 9 +- .../ResourceAssignmentService/service.py | 11 +- 3 files changed, 93 insertions(+), 33 deletions(-) diff --git a/SAS/ResourceAssignment/ResourceAssignmentDatabase/radb.py b/SAS/ResourceAssignment/ResourceAssignmentDatabase/radb.py index 5519d9019e4..6b5a10f3f7d 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentDatabase/radb.py +++ b/SAS/ResourceAssignment/ResourceAssignmentDatabase/radb.py @@ -25,7 +25,7 @@ TODO: documentation import logging import psycopg2 import psycopg2.extras -import datetime +from datetime import datetime, timedelta import time from optparse import OptionParser from lofar.common import dbcredentials @@ -505,10 +505,53 @@ class RADatabase: return result - def getResourceClaims(self): - query = '''SELECT * from resource_allocation.resource_claim_view''' + def getResourceClaims(self, lower_bound=None, upper_bound=None, task_id=None, status=None, resource_type=None, extended=False): + extended |= resource_type is not None + query = '''SELECT * from %s''' % ('resource_allocation.resource_claim_extended_view' if extended else 'resource_allocation.resource_claim_view') - return list(self._executeQuery(query, fetch=_FETCH_ALL)) + if lower_bound and not isinstance(lower_bound, datetime): + lower_bound = None + + if upper_bound and not isinstance(upper_bound, datetime): + upper_bound = None + + if status is not None and isinstance(status, basestring): + #convert status string to status.id + status = self.getResourceClaimStatusId(status) + + if resource_type is not None and isinstance(resource_type, basestring): + #convert resource_type string to resource_type.id + resource_type = self.getResourceTypeId(resource_type) + + qargs = None + + if lower_bound or upper_bound or task_id is not None or status is not None or resource_type is not None: + conditions = [] + qargs = [] + + if lower_bound: + conditions.append('endtime >= %s') + qargs.append(lower_bound) + + if upper_bound: + conditions.append('starttime <= %s') + qargs.append(upper_bound) + + if task_id is not None: + conditions.append('task_id = %s') + qargs.append(task_id) + + if status is not None: + conditions.append('status_id = %s') + qargs.append(status) + + if resource_type is not None and extended: + conditions.append('resource_type_id = %s') + qargs.append(resource_type) + + query += ' WHERE ' + ' AND '.join(conditions) + + return list(self._executeQuery(query, qargs, fetch=_FETCH_ALL)) def getResourceClaim(self, id): query = '''SELECT * from resource_allocation.resource_claim_view rcv @@ -622,11 +665,6 @@ class RADatabase: return self.cursor.rowcount > 0 - def getResourceClaimsForTask(self, task_id): - query = '''SELECT * from resource_allocation.resource_claim_view - WHERE resource_allocation.resource_claim_view.task_id = %s''' - - return list(self._executeQuery(query, [task_id], fetch=_FETCH_ALL)) def updateTaskAndResourceClaims(self, task_id, starttime=None, endtime=None, task_status=None, claim_status=None, session_id=None, username=None, user_id=None, commit=True): if claim_status and isinstance(claim_status, basestring): @@ -729,7 +767,19 @@ if __name__ == '__main__': print '\n-- ' + str(method.__name__) + ' --' print '\n'.join([str(x) for x in method()]) - + print db.getResourceClaims() + print + print db.getResourceClaims(task_id=440) + print + print db.getResourceClaims(lower_bound=datetime.utcnow() + timedelta(days=9)) + print + print db.getResourceClaims(upper_bound=datetime.utcnow() + timedelta(days=19)) + print + print db.getResourceClaims(status='allocated') + print + print db.getResourceClaims(status='claimed') + print + print db.getResourceClaims(resource_type='storage') #resultPrint(db.getTaskStatuses) #resultPrint(db.getTaskStatusNames) #resultPrint(db.getTaskTypes) @@ -754,27 +804,27 @@ if __name__ == '__main__': #for s in db.getSpecifications(): #db.deleteSpecification()) - result = db.insertSpecificationAndTask(1234, 5678, 600, 0, datetime.datetime.utcnow(), datetime.datetime.utcnow() + datetime.timedelta(hours=1), "", False) - print result + #result = db.insertSpecificationAndTask(1234, 5678, 600, 0, datetime.utcnow(), datetime.utcnow() + timedelta(hours=1), "", False) + #print result - resultPrint(db.getSpecifications) - resultPrint(db.getTasks) + #resultPrint(db.getSpecifications) + #resultPrint(db.getTasks) - task = db.getTask(result['task_id']) - resources = db.getResources() + #task = db.getTask(result['task_id']) + #resources = db.getResources() - claims = [{'resource_id':r['id'], - 'starttime':task['starttime'], - 'endtime':task['endtime'], - 'status':'claimed', - 'claim_size':1} for r in resources] + #claims = [{'resource_id':r['id'], + #'starttime':task['starttime'], + #'endtime':task['endtime'], + #'status':'claimed', + #'claim_size':1} for r in resources] - db.insertResourceClaims(task['id'], claims, 1, 'paulus', 1, False) + #db.insertResourceClaims(task['id'], claims, 1, 'paulus', 1, False) - resultPrint(db.getResourceClaims) - raw_input() + #resultPrint(db.getResourceClaims) + #raw_input() - db.commit() + #db.commit() @@ -785,7 +835,7 @@ if __name__ == '__main__': #predTaskId = None #for i in range(2): - #specId = db.insertSpecification(datetime.datetime.utcnow(), datetime.datetime.utcnow() + datetime.timedelta(hours=4), "") + #specId = db.insertSpecification(datetime.utcnow(), datetime.utcnow() + timedelta(hours=4), "") #taskId = db.insertTask(1234+i, 5678+i, 600, 0, specId) #if predTaskId: @@ -794,7 +844,7 @@ if __name__ == '__main__': #resources = db.getResources() #for r in resources: - #rcId = db.insertResourceClaim(r['id'], taskId, datetime.datetime.utcnow() + datetime.timedelta(hours=2*i), datetime.datetime.utcnow() + datetime.timedelta(hours=2*(i+1)), 0, 1, 10, 'einstein', -1) + #rcId = db.insertResourceClaim(r['id'], taskId, datetime.utcnow() + timedelta(hours=2*i), datetime.utcnow() + timedelta(hours=2*(i+1)), 0, 1, 10, 'einstein', -1) ##tasks = db.getTasks() @@ -808,7 +858,7 @@ if __name__ == '__main__': ##for i in range(1): ##taskId = db.insertTask(1234, 5678, 600, 0, 1) ##for j in range(2*i): - ##rcId = db.insertResourceClaim(j, taskId, datetime.datetime.utcnow() + datetime.timedelta(hours=4*i), datetime.datetime.utcnow() + datetime.timedelta(hours=4*i+3.5), 0, 4, 10, 'einstein', -1) + ##rcId = db.insertResourceClaim(j, taskId, datetime.utcnow() + timedelta(hours=4*i), datetime.utcnow() + timedelta(hours=4*i+3.5), 0, 4, 10, 'einstein', -1) ##time.sleep(0.5) diff --git a/SAS/ResourceAssignment/ResourceAssignmentService/rpc.py b/SAS/ResourceAssignment/ResourceAssignmentService/rpc.py index 15fd8d451a1..1e0c0f856d5 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentService/rpc.py +++ b/SAS/ResourceAssignment/ResourceAssignmentService/rpc.py @@ -27,8 +27,13 @@ class RARPC(RPCWrapper): def getResourceClaimStatuses(self): return self.rpc('GetResourceClaimStatuses') - def getResourceClaims(self): - claims = self.rpc('GetResourceClaims') + def getResourceClaims(self, lower_bound=None, upper_bound=None, task_id=None, status=None, resource_type=None, extended=False): + claims = self.rpc('GetResourceClaims', lower_bound=lower_bound, + upper_bound=upper_bound, + task_id=task_id, + status=status, + resource_type=resource_type, + extended=extended) for claim in claims: claim['starttime'] = claim['starttime'].datetime() claim['endtime'] = claim['endtime'].datetime() diff --git a/SAS/ResourceAssignment/ResourceAssignmentService/service.py b/SAS/ResourceAssignment/ResourceAssignmentService/service.py index c897492d289..d7e79faf338 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentService/service.py +++ b/SAS/ResourceAssignment/ResourceAssignmentService/service.py @@ -78,8 +78,13 @@ class RADBHandler(MessageHandlerInterface): def _getResourceClaimStatuses(self): return self.radb.getResourceClaimStatuses() - def _getResourceClaims(self): - return self.radb.getResourceClaims() + def _getResourceClaims(self, **kwargs): + return self.radb.getResourceClaims(lower_bound=kwargs.get('lower_bound'), + upper_bound=kwargs.get('upper_bound'), + task_id=kwargs.get('task_id'), + status=kwargs.get('status'), + resource_type=kwargs.get('resource_type'), + extended=kwargs.get('extended', False)) def _getResourceClaim(self, **kwargs): claim = self.radb.getResourceClaim(kwargs['id']) @@ -122,7 +127,7 @@ class RADBHandler(MessageHandlerInterface): return {'id': id, 'updated': updated} def _getResourceClaimsForTask(self, task_id): - claims = self.radb.getResourceClaimsForTask(task_id) + claims = self.radb.getResourceClaims(task_id=task_id) return claims def _updateTaskAndResourceClaims(self, **kwargs): -- GitLab