Add stop on certain PELs

Signed-off-by: Michael Shepos <shepos@us.ibm.com>
Change-Id: I0a54f2eeb0362dbd2d02156e4b2263e02d63c102
diff --git a/bin/plug_ins/Stop/cp_stop_check b/bin/plug_ins/Stop/cp_stop_check
index 3bbc299..ba46eb7 100755
--- a/bin/plug_ins/Stop/cp_stop_check
+++ b/bin/plug_ins/Stop/cp_stop_check
@@ -7,6 +7,7 @@
 import sys
 import subprocess
 import os
+import re
 
 from gen_print import *
 from gen_valid import *
@@ -136,6 +137,58 @@
         stop_check()
 
 
+def pel_stop_check():
+    r"""
+    Determine whether any PEL entries found warrant stopping the test
+    run.
+    """
+
+    if STOP_PEL_STOP_FILE_PATH == "":
+        return
+
+    pel_txt_file_path = os.environ.get("AUTOBOOT_FFDC_DIR_PATH", "") + \
+     os.environ.get("AUTOBOOT_FFDC_PREFIX", "") + "PEL_logs_list.json"
+
+    if not os.path.isfile(pel_txt_file_path):
+        qprint_timen("The following file was not present so no further" +
+                     " action will be taken.")
+        qprint_var(pel_txt_file_path)
+        return
+
+    default_stop_dir_path = "/afs/rchland.ibm.com/projects/esw/dvt/"
+
+    # If pel_stop_file_path is unqualified and cannot be found, pre-pend
+    # default_stop_dir_path for the user.
+    pel_stop_file_path = os.environ.get("STOP_PEL_STOP_FILE_PATH", "")
+    if not os.path.isfile(pel_stop_file_path) and \
+       os.path.isfile(default_stop_dir_path + pel_stop_file_path):
+        pel_stop_file_path = default_stop_dir_path + pel_stop_file_path
+        qprint_timen("Using default stop file path.")
+        qprint_var(pel_stop_file_path)
+
+    # First, read the file in and convert it to a list.
+    pel_stop_list = file_to_list(pel_stop_file_path, newlines=0, comments=0)
+
+    if len(pel_stop_list) == 0:
+        print_timen("There are no records to process in " +
+                    pel_stop_file_path + ".")
+        return
+
+    pel_all_list = file_to_list(pel_txt_file_path, newlines=0, comments=0)
+
+    if len(pel_all_list) == 0:
+        print_timen("There are no records to process in " +
+                    pel_txt_file_path + ".")
+        return
+
+    for stop_pel in pel_stop_list:
+        for pel_all in pel_all_list:
+            pel_match = re.search(".*SRC.*" + stop_pel + ".*", pel_all)
+            if pel_match:
+                print_timen("The caller wishes to stop test execution based on the presence of certain PEL entries.")
+                stop_check()
+
+
 def main():
 
     gen_setup()
@@ -159,6 +212,8 @@
 
     esel_stop_check()
 
+    pel_stop_check()
+
     if STOP_VERIFY_HARDWARE_FAIL:
         hardware_error_found = restore_plug_in_value(0, 'Verify_hardware')
         if hardware_error_found:
diff --git a/bin/plug_ins/Stop/parm_def b/bin/plug_ins/Stop/parm_def
index b2574bb..f4f89f2 100755
--- a/bin/plug_ins/Stop/parm_def
+++ b/bin/plug_ins/Stop/parm_def
@@ -1,11 +1,10 @@
-# "command" may contain a bash command string to be run to determine whether
-# the test program should be stopped.  If the command returns non-zero, the
-# test program should be stopped.
+# "command" may contain a bash command string to be run to determine whether the test program should be stopped.  If the command returns non-zero, the test program should be stopped.
 command=string
-# "rest_fail" indicates that the Stop plug-in should fail if REST commands to
-# the BMC are failing.
+# "rest_fail" indicates that the Stop plug-in should fail if REST commands to the BMC are failing.
 rest_fail=boolean
-# "esel_stop_file_path" may contain the path to a file with specifications
-# for which eSELs warrant stopping the test run.  See esel_stop_check help
-# text for details.
+# "esel_stop_file_path" may contain the path to a file with specifications for which eSELs warrant stopping the test run.  See esel_stop_check help text for details.
 esel_stop_file_path=string
+# "pel_stop_file_path" may contain the path to a file with specifications for which PELs warrant stopping the test run.
+pel_stop_file_path=string
+# Indicates that the test should be stopped when the Verify_hardware plug-in fails its analysis.
+verify_hardware_fail=boolean