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