Explorar o código

HPCC-10531 Regression suite fails when authentication enabled

Fix authentication error.
Add network related connection (no connection to LDAP, wrong username, etc)
error handling and debug logs.

Signed-off-by: Attila Vamos <attila.vamos@gmail.com>
Attila Vamos %!s(int64=11) %!d(string=hai) anos
pai
achega
72c2c3270d

+ 12 - 0
testing/regress/README.rst

@@ -371,4 +371,16 @@ So if you have a new test case and it works well on all clusters (or some of the
         "timeout":"600",                                - Default test case timeout in sec. Can be override by command line parameter or //timeout tag in ECL file
         "maxAttemptCount":"3"                           - Max retry count to reset timeout if a testcase in any early stage (compiled, blocked) of execution pipeline.
 
+
+8. Authentication:
+------------------
+
+If your HPCC System is configured to use LDAP authentication you should change value of "username" and "password" fields in regress.json file to yours.
+
+Alternatively, ensure that your test system has a user "regress" with password "regress" and appropriate rights to be able to run the suite.
+
+
+Misc.
+-----
+
 **Important! Actually regression suite compares the test case result with xml files stored in testing/regression/ecl/key independently from the cluster.**

+ 6 - 1
testing/regress/hpcc/common/report.py

@@ -48,6 +48,7 @@ class Report:
         self.name = name
 
     def display(self, log=None,  elapsTime = 0):
+        logging.debug("Report::display(log='%s', elapsTime:%d",  log,  elapsTime)
         reportStr = "\n"
         reportStr += "Results\n"
         reportStr += "-------------------------------------------------\n"
@@ -56,7 +57,11 @@ class Report:
         reportStr += "-------------------------------------------------\n"
         if self.report._fail:
             for result in self.report._fail:
-                reportStr += result.Diff
+                try:
+                    reportStr += result.Diff
+                except Exception as ex:
+#                   logging.debug("Exception:'%s'",  str(ex))
+                    reportStr += str(result.Diff)
                 reportStr += "\n"
             reportStr += "-------------------------------------------------\n"
         if log:

+ 3 - 2
testing/regress/hpcc/regression/regress.py

@@ -199,7 +199,7 @@ class Regression:
                             self.loggermutex.release()
                         if self.timeouts[threadId] == 0:
                             # time out occured
-                            wuid =  queryWuid(self.taskParam[threadId]['jobName'])
+                            wuid =  queryWuid(self.taskParam[threadId]['jobName'],  self.taskParam[threadId]['taskId']+1)
                             if ("Not found" in wuid['wuid'] ) or (wuid['state'] in self.goodStates):
                                 #Possible blocked, give it more time if it is possible
                                 self.taskParam[threadId]['retryCount'] -= 1;
@@ -280,7 +280,7 @@ class Regression:
                 sleepTime = 1.0
             if self.timeouts[thread] == 0:
                 # time out, abort tast
-                wuid =  queryWuid(query.getJobname())
+                wuid =  queryWuid(query.getJobname(),  query.getTaskId())
                 abortWorkunit(wuid['wuid'])
                 query.setAborReason('Timeout')
                 self.loggermutex.acquire()
@@ -312,6 +312,7 @@ class Regression:
             self.StartTimeoutThread()
             for query in suite.getSuite():
                 query.setJobname(time.strftime("%y%m%d-%H%M%S"))
+                query.setTaskId(cnt)
                 self.timeouts[th] = self.timeout
                 timeout = query.getTimeout()
                 if timeout != -1:

+ 13 - 9
testing/regress/hpcc/util/ecl/command.py

@@ -37,23 +37,27 @@ class ECLcmd(Shell):
         args.append(cmd)
         args.append('-v')
         args.append('--cluster=' + cluster)
+
+        username = kwargs.pop('username', False)
+        if username:
+                args.append("--username=" + username)
+
+        password = kwargs.pop('password', False)
+        if password:
+            args.append("--password=" + password)
+
         if cmd == 'publish':
             args.append(eclfile.getEcl())
         else:
             args.append('--noroot')
-            name = kwargs.pop('name', False)
-            username = kwargs.pop('username', False)
-            password = kwargs.pop('password', False)
             server = kwargs.pop('server', False)
             if server:
                 args.append('--server=' + server)
+
+            name = kwargs.pop('name', False)
             if not name:
-                #name = eclfile.ecl
                 name = eclfile.getJobname()
-            if username:
-                args.append("--username=" + username)
-            if password:
-                args.append("--password=" + password)
+
             args.append("--name=" + name)
             args.append(eclfile.getArchive())
         data = ""
@@ -93,7 +97,7 @@ class ECLcmd(Shell):
                     test = False
                     eclfile.diff = 'Error'
             else:
-                if queryWuid(eclfile.getJobname())['state'] == 'aborted':
+                if queryWuid(eclfile.getJobname(), eclfile.getTaskId())['state'] == 'aborted':
                     eclfile.diff = eclfile.ecl+'\n\t'+'Aborted ( reason: '+eclfile.getAbortReason()+' )'
                     test = False
                 else:

+ 21 - 2
testing/regress/hpcc/util/util.py

@@ -19,6 +19,7 @@
 
 import argparse
 import platform
+import logging
 
 def isPositiveIntNum(string):
     for i in range(0,  len(string)):
@@ -56,10 +57,20 @@ def setConfig(config):
     global gConfig
     gConfig = config
 
-def queryWuid(jobname):
+def queryWuid(jobname,  taskId):
     server = gConfig.server
     host = "http://"+server+"/WsWorkunits/WUQuery.json?Jobname="+jobname
     wuid="Not found"
+    auth_handler = urllib2.HTTPBasicAuthHandler()
+    auth_handler.add_password(realm='ESP (Authentication: LDAP server process)',
+                              uri=server,
+                              user=gConfig.username,
+                              passwd=gConfig.password)
+#    opener = urllib2.build_opener(auth_handler,  urllib2.HTTPHandler(debuglevel=1))
+    opener = urllib2.build_opener(auth_handler)
+    opener.add_handler(auth_handler)
+    urllib2.install_opener(opener)
+
     try:
         response_stream = urllib2.urlopen(host)
         json_response = response_stream.read()
@@ -71,8 +82,16 @@ def queryWuid(jobname):
             state = jobname+' not found'
     except KeyError as ke:
         state = "Key error:"+ke.str()
+        logging.debug("%3d. %s in queryWuid(%s)",  taskId,  state,  jobname)
+    except urllib2.HTTPError as ex:
+        state = "HTTP Error: "+ str(ex.reason)
+        logging.debug("%3d. %s in queryWuid(%s)",  taskId,  state,  jobname)
+    except urllib2.URLError as ex:
+        state = "URL Error: "+ str(ex.reason)
+        logging.error("%3d. %s in queryWuid(%s)",  taskId,  state,  jobname)
     except Exception as ex:
-        state = "Unable to query "+ ex.reason.strerror
+        state = "Unable to query "+ str(ex.reason)
+        logging.debug("%3d. %s in queryWuid(%s)",  taskId,  state,  jobname)
     return {'wuid':wuid, 'state':state}
 
 def abortWorkunit(wuid):

+ 1 - 1
testing/regress/regress

@@ -38,7 +38,7 @@ if __name__ == "__main__":
     description = 'HPCC Platform Regression suite'
     parser = argparse.ArgumentParser(prog=prog, description=description)
     parser.add_argument('--version', '-v', action='version',
-                        version='%(prog)s 0.0.4')
+                        version='%(prog)s 0.0.6')
     parser.add_argument('--config', help="config file to use. Default: regress.json",
                         nargs='?', default="regress.json")
     parser.add_argument('--loglevel', help="set the log level. Use debug for more detailed logfile.",