From d8da7640543dda798a9bdf9633af3f532023fbe2 Mon Sep 17 00:00:00 2001
From: Jorrit Schaap <schaap@astron.nl>
Date: Tue, 5 Apr 2016 08:47:57 +0000
Subject: [PATCH] Task #8887: adapted resource_types with args resource_types
 and include_availability

---
 .../ResourceAssignmentDatabase/radb.py        | 49 +++++++++++++++----
 .../ResourceAssignmentService/rpc.py          |  4 +-
 .../ResourceAssignmentService/service.py      |  5 +-
 3 files changed, 45 insertions(+), 13 deletions(-)

diff --git a/SAS/ResourceAssignment/ResourceAssignmentDatabase/radb.py b/SAS/ResourceAssignment/ResourceAssignmentDatabase/radb.py
index 4254df129c0..4489152a7b0 100644
--- a/SAS/ResourceAssignment/ResourceAssignmentDatabase/radb.py
+++ b/SAS/ResourceAssignment/ResourceAssignmentDatabase/radb.py
@@ -27,6 +27,7 @@ import psycopg2
 import psycopg2.extras
 from datetime import datetime, timedelta
 import time
+import collections
 from optparse import OptionParser
 from lofar.common import dbcredentials
 from lofar.common.util import to_csv_string
@@ -435,14 +436,35 @@ class RADatabase:
 
         raise KeyError('No such unit: %s Valid values are: %s' % (unit_name, ', '.join(self.getUnitNames())))
 
-    def getResources(self):
-        query = '''SELECT r.*, rt.name as type, rtu.units as unit
-        from virtual_instrument.resource r
-        inner join virtual_instrument.resource_type rt on rt.id = r.type_id
-        inner join virtual_instrument.unit rtu on rtu.id = rt.unit_id;
-        '''
+    def getResources(self, resource_types=None, include_availability=False):
+        if include_availability:
+            query = '''SELECT * from resource_monitoring.resource_view'''
+        else:
+            query = '''SELECT * from virtual_instrument.resource_view'''
 
-        return list(self._executeQuery(query, fetch=_FETCH_ALL))
+        conditions = []
+        qargs = []
+
+        if resource_types is not None:
+            if isinstance(resource_types, basestring):
+                resource_types = [resource_types]
+            elif not isinstance(resource_types, collections.Iterable):
+                resource_types = [resource_types]
+
+            # convert any resource_type name to id
+            resource_type_names = set([x for x in resource_types if isinstance(x, basestring)])
+            if resource_type_names:
+                resource_type_name_to_id = {x['name']:x['id'] for x in self.getResourceTypes()}
+                resource_types = [resource_type_name_to_id[x] if isinstance(x, basestring) else x
+                                  for x in resource_types]
+
+            conditions.append('type_id in %s')
+            qargs.append(tuple(resource_types))
+
+        if conditions:
+            query += ' WHERE ' + ' AND '.join(conditions)
+
+        return list(self._executeQuery(query, qargs, fetch=_FETCH_ALL))
 
     def getResourceGroups(self):
         query = '''SELECT rg.*, rgt.name as type
@@ -1113,8 +1135,17 @@ if __name__ == '__main__':
         print '\n-- ' + str(method.__name__) + ' --'
         print '\n'.join([str(x) for x in method()])
 
-    #print db.getResourceClaims()
-    #print
+    print db.getResources()
+    print
+
+    print db.getResources('storage')
+    print
+
+    print db.getResources(['storage', 'processor'], False)
+    print
+
+    exit()
+
     #print db.getResourceClaims(task_id=440)
     #print
     #print db.getResourceClaims(lower_bound=datetime.utcnow() + timedelta(days=9))
diff --git a/SAS/ResourceAssignment/ResourceAssignmentService/rpc.py b/SAS/ResourceAssignment/ResourceAssignmentService/rpc.py
index ae3d904124a..a01530f8175 100644
--- a/SAS/ResourceAssignment/ResourceAssignmentService/rpc.py
+++ b/SAS/ResourceAssignment/ResourceAssignmentService/rpc.py
@@ -115,8 +115,8 @@ class RARPC(RPCWrapper):
     def getResourceTypes(self):
         return self.rpc('GetResourceTypes')
 
-    def getResources(self):
-        return self.rpc('GetResources')
+    def getResources(self, resource_types=None, include_availability=False):
+        return self.rpc('GetResources', resource_types=resource_types, include_availability=include_availability)
 
     def getTask(self, id=None, mom_id=None, otdb_id=None):
         '''get a task for either the given (task)id, or for the given mom_id, or for the given otdb_id'''
diff --git a/SAS/ResourceAssignment/ResourceAssignmentService/service.py b/SAS/ResourceAssignment/ResourceAssignmentService/service.py
index 73262c6ee1a..cc86971c6ee 100644
--- a/SAS/ResourceAssignment/ResourceAssignmentService/service.py
+++ b/SAS/ResourceAssignment/ResourceAssignmentService/service.py
@@ -190,8 +190,9 @@ class RADBHandler(MessageHandlerInterface):
     def _getResourceTypes(self):
         return self.radb.getResourceTypes()
 
-    def _getResources(self):
-        return self.radb.getResources()
+    def _getResources(self, **kwargs):
+        return self.radb.getResources(resource_types=kwargs.get('resource_types'),
+                                      include_availability=kwargs.get('include_availability', False))
 
     def _getTasks(self):
         return self.radb.getTasks()
-- 
GitLab