From 84a09ef06929869162893c4eff4b8ed2dce673c7 Mon Sep 17 00:00:00 2001
From: Stewart Martin-Haugh <smh@cern.ch>
Date: Wed, 19 Aug 2020 17:20:46 +0200
Subject: [PATCH] Fix reading trigger menu from Frontier in Python 2/3, and add
 functional unit test

---
 .../TrigConfigSvc/CMakeLists.txt              |  4 +
 .../TrigConfigSvc/python/TrigConfFrontier.py  | 94 +++++++------------
 2 files changed, 39 insertions(+), 59 deletions(-)

diff --git a/Trigger/TrigConfiguration/TrigConfigSvc/CMakeLists.txt b/Trigger/TrigConfiguration/TrigConfigSvc/CMakeLists.txt
index 577c0bc9c87..98a05082563 100644
--- a/Trigger/TrigConfiguration/TrigConfigSvc/CMakeLists.txt
+++ b/Trigger/TrigConfiguration/TrigConfigSvc/CMakeLists.txt
@@ -30,3 +30,7 @@ atlas_add_alias( checkTrigger "checkTrigger.py" )
 atlas_add_test( AccumulatorTest
    SCRIPT python -m TrigConfigSvc.TrigConfigSvcConfig
    POST_EXEC_SCRIPT nopost.sh )
+
+atlas_add_test( FrontierTest
+   SCRIPT python -m TrigConfigSvc.TrigConfFrontier
+   POST_EXEC_SCRIPT nopost.sh )
diff --git a/Trigger/TrigConfiguration/TrigConfigSvc/python/TrigConfFrontier.py b/Trigger/TrigConfiguration/TrigConfigSvc/python/TrigConfFrontier.py
index bed6e924df1..66d7e68eb46 100755
--- a/Trigger/TrigConfiguration/TrigConfigSvc/python/TrigConfFrontier.py
+++ b/Trigger/TrigConfiguration/TrigConfigSvc/python/TrigConfFrontier.py
@@ -6,6 +6,12 @@ from __future__ import print_function
 
 from __future__ import print_function
 
+from future import standard_library
+standard_library.install_aliases()
+from builtins import map
+from builtins import str
+from builtins import zip
+from builtins import object
 from AthenaCommon.Logging import logging
 import time
 
@@ -20,7 +26,7 @@ def getFrontierCursor(url, schema, loglevel = logging.INFO):
         return FrontierCursor( url = url, schema = schema)
         
 
-class FrontierCursor2:
+class FrontierCursor2(object):
     def __init__(self, url, schema, refreshFlag=False):
         log = logging.getLogger( "TrigConfFrontier.py" )
         self.url = url
@@ -39,7 +45,7 @@ class FrontierCursor2:
         log = logging.getLogger( "TrigConfFrontier.py" )
         import re
         varsextract = re.findall(':([A-z0-9]*)',query)
-        values = map(bindvars.get, varsextract)
+        values = list(map(bindvars.get, varsextract))
         log.debug("Resolving bound variable %r with %r", varsextract,values)
         appendix = ":".join([str(v) for v in values])
         queryWithQuestionMarks = re.sub(':[A-z0-9]*','?', query)
@@ -53,7 +59,7 @@ class FrontierCursor2:
         """
         log = logging.getLogger( "TrigConfFrontier.py" )
         from builtins import int
-        for var,val in bindvars.items():
+        for var,val in list(bindvars.items()):
             if query.find(":%s" % var)<0:
                 raise NameError("variable '%s' is not a bound variable in this query: %s" % (var, query) )
             if isinstance (val, int):
@@ -117,7 +123,7 @@ Refresh cache:  %s""" % (self.url, self.schema, self.refreshFlag)
 
 
     
-class FrontierCursor:
+class FrontierCursor(object):
     def __init__(self, url, schema, refreshFlag=False, doDecode=True, retrieveZiplevel="zip"):
         if url.startswith('('):
             self.servertype, self.url  = FrontierCursor.getServerUrls(url)[0]
@@ -142,10 +148,10 @@ Refresh cache:  %s""" % (self.url, self.refreshFlag)
 
     @classmethod
     def testUrl(cls, url):
-        import urllib2
+        import urllib.request, urllib.error, urllib.parse
         try:
-            urllib2.urlopen(url)
-        except urllib2.URLError:
+            urllib.request.urlopen(url)
+        except urllib.error.URLError:
             import traceback
             traceback.print_exc()
             
@@ -158,14 +164,16 @@ Refresh cache:  %s""" % (self.url, self.refreshFlag)
         log.debug("Refresh cache     : %s", self.refreshFlag)
         log.debug("Query             : %s", query)
         
-        import base64, zlib, urllib2, time
+        import base64, zlib, urllib.request, urllib.error, urllib.parse, time
 
         self.result = None
 
-        encQuery = base64.binascii.b2a_base64(zlib.compress(query,9)).replace("+", ".").replace("\n","").replace("/","-").replace("=","_")
+        compQuery = zlib.compress(query.encode("utf-8"),9)
+        base64Query = base64.binascii.b2a_base64(compQuery).decode("utf-8")
+        encQuery = base64Query.replace("+", ".").replace("\n","").replace("/","-").replace("=","_")
 
         frontierRequest="%s/type=frontier_request:1:DEFAULT&encoding=BLOB%s&p1=%s" % (self.url, self.retrieveZiplevel, encQuery)
-        request = urllib2.Request(frontierRequest)
+        request = urllib.request.Request(frontierRequest)
 
         if self.refreshFlag:
             request.add_header("pragma", "no-cache")
@@ -177,7 +185,7 @@ Refresh cache:  %s""" % (self.url, self.refreshFlag)
         log.debug("Query started: %s", time.strftime("%m/%d/%y %H:%M:%S %Z", queryStart))
 
         t1 = time.time()
-        result = urllib2.urlopen(request,None,10).read()
+        result = urllib.request.urlopen(request,None,10).read().decode()
         t2 = time.time()
 
         queryEnd = time.localtime()
@@ -215,9 +223,14 @@ Refresh cache:  %s""" % (self.url, self.refreshFlag)
                     print (keepalives, "keepalives received\n")
                     keepalives = 0
             
-                row = base64.decodestring(node.data)
+                row = base64.decodebytes(node.data.encode())
                 if self.retrieveZiplevel != "":
-                    row = zlib.decompress(row)
+                    row = zlib.decompress(row).decode("utf-8")
+
+                #Hack to get these lines to work in python 2
+                import sys
+                if sys.version_info[0] < 3: 
+                    row = row.encode('ascii', 'xmlcharrefreplace')
              
                 endFirstRow = row.find('\x07')
                 firstRow = row[:endFirstRow]
@@ -241,7 +254,7 @@ Refresh cache:  %s""" % (self.url, self.refreshFlag)
                 log.debug("DB Types    : %r", types)
                 log.debug("Python Types: %r", ptypes)
                 
-                row = str(row[endFirstRow+1:])
+                row = row[endFirstRow+1:]
 
                 row_h = row.rstrip('\x07')
                 
@@ -276,55 +289,17 @@ def testConnection():
     tf.triggerUseFrontier = True
 
     from TrigConfigSvc.TrigConfigSvcUtils import interpretConnection
-    connectionParameters = interpretConnection("TRIGGERDBREPR")
-
-    cursor = FrontierCursor2( url = connectionParameters['url'], schema = connectionParameters['schema'])
-
-    query = "select distinct SM.SMT_ID, SM.SMT_NAME, SM.SMT_VERSION, SM.SMT_COMMENT, SM.SMT_ORIGIN, SM.SMT_USERNAME, SM.SMT_STATUS from ATLAS_CONF_TRIGGER_REPR.SUPER_MASTER_TABLE SM order by SM.SMT_ID"
+    connectionParameters = interpretConnection("TRIGGERDBMC")
 
-    cursor.execute(query)
+    cursor = FrontierCursor( url = connectionParameters['url'], schema = connectionParameters['schema'])
 
-    for r in cursor.result[:20]:
-        print (r)
-
-    query = """
-SELECT DISTINCT
-CP.HCP_NAME,
-CP.HCP_ALIAS,
-TE2CP.HTE2CP_ALGORITHM_COUNTER,
-TE.HTE_ID,
-TE.HTE_NAME,
-TE2TE.HTE2TE_TE_INP_ID,
-TE2TE.HTE2TE_TE_INP_TYPE,
-TE2TE.HTE2TE_TE_COUNTER
-FROM
-ATLAS_CONF_TRIGGER_REPR.SUPER_MASTER_TABLE    SM,
-ATLAS_CONF_TRIGGER_REPR.HLT_MASTER_TABLE      HM,
-ATLAS_CONF_TRIGGER_REPR.HLT_TM_TO_TC          M2C,
-ATLAS_CONF_TRIGGER_REPR.HLT_TC_TO_TS          TC2TS,
-ATLAS_CONF_TRIGGER_REPR.HLT_TS_TO_TE          S2TE,
-ATLAS_CONF_TRIGGER_REPR.HLT_TRIGGER_ELEMENT   TE,
-ATLAS_CONF_TRIGGER_REPR.HLT_TE_TO_CP          TE2CP,
-ATLAS_CONF_TRIGGER_REPR.HLT_TE_TO_TE          TE2TE,
-ATLAS_CONF_TRIGGER_REPR.HLT_COMPONENT         CP
-WHERE
-SM.SMT_ID     = 539
-AND HM.HMT_ID = SM.SMT_HLT_MASTER_TABLE_ID
-AND HM.HMT_TRIGGER_MENU_ID = M2C.HTM2TC_TRIGGER_MENU_ID
-AND M2C.HTM2TC_TRIGGER_CHAIN_ID = TC2TS.HTC2TS_TRIGGER_CHAIN_ID
-AND TC2TS.HTC2TS_TRIGGER_SIGNATURE_ID = S2TE.HTS2TE_TRIGGER_SIGNATURE_ID
-AND TE.HTE_ID = S2TE.HTS2TE_TRIGGER_ELEMENT_ID
-AND TE.HTE_ID = TE2CP.HTE2CP_TRIGGER_ELEMENT_ID
-AND TE.HTE_ID = TE2TE.HTE2TE_TE_ID
-AND CP.HCP_ID = TE2CP.HTE2CP_COMPONENT_ID
-ORDER BY
-TE.HTE_ID ASC,
-TE2CP.HTE2CP_ALGORITHM_COUNTER DESC"""
+    query = "select distinct HPS.HPS_NAME from ATLAS_CONF_TRIGGER_RUN2_MC.HLT_PRESCALE_SET HPS where HPS.HPS_ID = '260'"
 
     cursor.execute(query)
-
-    for r in cursor.result[:20]:
-        print (r)
+    print(cursor.result)
+    cursor.decodeResult()
+    print(cursor.result[0][0])
+    assert cursor.result[0][0] == 'MC_pp_v7'
 
     return 0
 
@@ -336,6 +311,7 @@ def testBindVarResolution():
     print(query)
     print("is translated to")
     print(FrontierCursor2.resolvebindvars(query, bindvars))
+    return 0
 
     
 if __name__=="__main__":
-- 
GitLab