Trivial change to add support for non-PLC aggregates
[sfa.git] / sfa / plc / api.py
index 9ca932b..a1e702f 100644 (file)
@@ -117,8 +117,12 @@ class GeniAPI:
         self.key_file = key_file
         self.cert_file = cert_file
         self.credential = None
-        self.plshell = self.getPLCShell()
-        self.plshell_version = self.getPLCShellVersion()
+        
+        # Initialize the PLC shell only if SFA wraps a myPLC
+        if (self.config.get_aggregate_rspec_type() == 'pl'):
+            self.plshell = self.getPLCShell()
+            self.plshell_version = self.getPLCShellVersion()
+
         self.hrn = self.config.SFA_INTERFACE_HRN
         self.time_format = "%Y-%m-%d %H:%M:%S"
         self.logger=get_sfa_logger()
@@ -128,14 +132,15 @@ class GeniAPI:
                        'AuthMethod': 'password',
                        'AuthString': self.config.SFA_PLC_PASSWORD}
         try:
+            self.plshell_type = 'direct'
             import PLC.Shell
             shell = PLC.Shell.Shell(globals = globals())
             shell.AuthCheck(self.plauth)
             return shell
         except ImportError:
+            self.plshell_type = 'xmlrpc' 
             # connect via xmlrpc
             url = self.config.SFA_PLC_URL
-             
             shell = xmlrpclib.Server(url, verbose = 0, allow_none = True)
             shell.AuthCheck(self.plauth)
             return shell
@@ -195,7 +200,7 @@ class GeniAPI:
             auth_hrn = hrn
         auth_info = self.auth.get_auth_info(auth_hrn)
         table = GeniTable()
-        records = table.find(hrn)
+        records = table.findObjects(hrn)
         if not records:
             raise RecordNotFound
         record = records[0]
@@ -309,7 +314,7 @@ class GeniAPI:
             record.update({})
             return
 
-        if (type in ["authority", "sa", "ma"]):
+        if (type in ["authority"]):
             pl_res = self.plshell.GetSites(self.plauth, [pointer])
         elif (type == "slice"):
             pl_res = self.plshell.GetSlices(self.plauth, [pointer])
@@ -361,34 +366,42 @@ class GeniAPI:
         record.update(pl_record)
 
 
-    def lookup_users(self, user_id_list, role="*"):
-        table = GeniTable() 
-        record_list = []
-        for person_id in user_id_list:
-            user_records = table.find({'type': 'user', 'pointer': person_id})
-            for user_record in user_records:
-                self.fill_record_info(user_record)
-                user_roles = user_record.get("roles")
-                if (role=="*") or (role in user_roles):
-                    record_list.append(user_record['hrn'])
-        return record_list
 
     def fill_record_geni_info(self, record):
         geni_info = {}
         type = record['type']
+        table = GeniTable()
         if (type == "slice"):
             person_ids = record.get("person_ids", [])
-            researchers = self.lookup_users(person_ids)
+            persons = table.find({'type': 'user', 'pointer': person_ids})
+            researchers = [person['hrn'] for person in persons]
             geni_info['researcher'] = researchers
 
         elif (type == "authority"):
             person_ids = record.get("person_ids", [])
-            pis = self.lookup_users(person_ids, "pi")
-            operators = self.lookup_users(person_ids, "tech")
-            owners = self.lookup_users(person_ids, "admin")
-            geni_info['pi'] = pis
-            geni_info['operator'] = operators
-            geni_info['owner'] = owners
+            persons = table.find({'type': 'user', 'pointer': person_ids})
+            persons_dict = {}
+            for person in persons:
+                persons_dict[person['pointer']] = person 
+            pl_persons = self.plshell.GetPersons(self.plauth, person_ids, ['person_id', 'roles'])
+            pis, techs, admins = [], [], []
+            for person in pl_persons:
+                pointer = person['person_id']
+                
+                if pointer not in persons_dict:
+                    # this means there is not sfa record for this user
+                    continue    
+                hrn = persons_dict[pointer]['hrn']    
+                if 'pi' in person['roles']:
+                    pis.append(hrn)
+                if 'tech' in person['roles']:
+                    techs.append(hrn)
+                if 'admin' in person['roles']:
+                    admins.append(hrn)
+            
+            geni_info['PI'] = pis
+            geni_info['operator'] = techs
+            geni_info['owner'] = admins
             # xxx TODO: OrganizationName
 
         elif (type == "node"):
@@ -442,13 +455,11 @@ class GeniAPI:
     # add people who are in the new list, but not the oldList
         for personId in newIdList:
             if not (personId in oldIdList):
-                print "adding id", personId, "to", record.get_name()
                 addFunc(self.plauth, personId, containerId)
 
         # remove people who are in the old list, but not the new list
         for personId in oldIdList:
             if not (personId in newIdList):
-                print "removing id", personId, "from", record.get_name()
                 delFunc(self.plauth, personId, containerId)
 
     def update_membership(self, oldRecord, record):