1+ #! /bin/bash
2+ # loops over all test cases and executes them
3+
4+ # Read the CSV file
5+ INPUT_FILE=" test_anchor_cases.csv"
6+ TEMPLATE_FILE=" test_anchor_2tag_template.sh"
7+ OUTPUT_FILE=" test_anchor_generated"
8+
9+ DAILYTAGTOTEST=${1:- O2sim:: v20250804-1}
10+
11+ SITES_FILE=" test_GRID_sites.dat"
12+
13+ WORKING_DIR=" ${PWD} /workdir_$( date +%s) _$RANDOM "
14+ echo " WORKING DIR ${WORKING_DIR} "
15+ mkdir -p ${WORKING_DIR}
16+
17+ INPUT_FILE_STRIPPED=${WORKING_DIR} /${INPUT_FILE} _clean
18+
19+ REQUIRE_STRING=" "
20+ {
21+ while read -r -a values; do
22+ if [ ! " ${REQUIRE_STRING} " == " " ]; then
23+ REQUIRE_STRING=" ${REQUIRE_STRING} ||"
24+ fi
25+ REQUIRE_STRING=" ${REQUIRE_STRING} (other.CE == \" ${values} \" )"
26+ done
27+ } < ${SITES_FILE}
28+ REQUIRE_STRING=" (${REQUIRE_STRING} );"
29+
30+ echo " REQUIRE STRING ${REQUIRE_STRING} "
31+
32+ # strip comments from CSV file
33+ grep -v ' #' ${INPUT_FILE} > ${INPUT_FILE_STRIPPED}
34+
35+ # Read the header line and convert it into variable names
36+ IFS=' ,' read -r -a headers < " $INPUT_FILE_STRIPPED "
37+
38+ # Replace placeholders in the header (e.g., %{VAR} → VAR)
39+ for i in " ${! headers[@]} " ; do
40+ headers[$i ]=$( echo " ${headers[$i]} " | sed -E ' s/#?%\{//;s/\}//g' )
41+ done
42+
43+ # Read and process each subsequent line
44+ {
45+ read # Skip the header line
46+
47+ count=1 # Counter for output files
48+ datestring=$( date +" %Y%m%d_%H%M%S" )
49+ while IFS=' ,' read -r -a values; do
50+ # Assign each value to its corresponding variable
51+ for i in " ${! headers[@]} " ; do
52+ declare " ${headers[$i]} " =" ${values[$i]} "
53+ done
54+
55+ PRODUCTION_TAG=" 2tagtest_${datestring} _${count} "
56+ # Example: Print assigned variables
57+ echo " SOFTWARETAG_SIM: $SOFTWARETAG_SIM "
58+ echo " SOFTWARETAG_ASYNC: $SOFTWARETAG_ASYNC "
59+ echo " PASSNAME: $PASSNAME "
60+ echo " COL_SYSTEM: $COL_SYSTEM "
61+ echo " RUN_NUMBER: $RUN_NUMBER "
62+ echo " INTERACTIONTYPE: $INTERACTIONTYPE "
63+ echo " PRODUCTION_TAG: $PRODUCTION_TAG "
64+ echo " ANCHOR_PRODUCTION: $ANCHOR_PRODUCTION "
65+ echo " ANCHORYEAR: $ANCHORYEAR "
66+ echo " SIM_OPTIONS: $SIM_OPTIONS "
67+ echo " --------------------------------"
68+
69+ if [ " ${DAILYTAGTOTEST} " ]; then
70+ SOFTWARETAG_SIM=${DAILYTAGTOTEST}
71+ fi
72+
73+ OUTPUT_FILE_FINAL=" ${WORKING_DIR} /${OUTPUT_FILE} _case${count} .sh"
74+
75+ # create final test script with these values
76+ cp " $TEMPLATE_FILE " " ${OUTPUT_FILE_FINAL} "
77+ for var in " ${headers[@]} " ; do
78+ sed -i " s|%{$var }|${! var} |g" " $OUTPUT_FILE_FINAL "
79+ done
80+ # put the require spec
81+ sed -i " s/%{JDL_REQUIREMENT}/${REQUIRE_STRING} /g" " $OUTPUT_FILE_FINAL "
82+
83+ # we submit the test to the GRID (multiplicity of 4)
84+ # ${WORKING_DIR}/submit_case${count}_${SOFTWARETAG_ASYNC//::/-}
85+ echo " ${O2DPG_ROOT} /GRID/utils/grid_submit.sh --prodsplit 4 --singularity --ttl 3600 --script ${OUTPUT_FILE_FINAL} --jobname " anchorTest_${count} " --wait-any --topworkdir 2tag_release_testing_${SOFTWARETAG_SIM} " > ${WORKING_DIR} /submit_case${count} .sh
86+ # TODO: optional local execution with --local option
87+
88+ (( count++ )) # Increment counter for next row
89+ done
90+ } < " ${INPUT_FILE_STRIPPED} " # Redirect file input here to avoid subshell issues
91+
92+ cd ${WORKING_DIR}
93+
94+ # now we submit all the jobs in the background and wait for them to return
95+ for s in ` ls submit* .sh` ; do
96+ echo " submitting ${s} "
97+ export GRID_SUBMIT_WORKDIR=" ${WORKING_DIR} /${s} _workdir"
98+ (
99+ bash ${s} & > log_${s}
100+ echo " Job ${s} returned"
101+ ) &
102+ done
103+
104+ # for for all (GRID) jobs to return
105+ echo " Waiting for jobs to return/finish"
106+ wait
107+
108+ # verify / validate the output produced from these jobs
109+ # The test is successfull if at least one subjob from each test
110+ # produced the AO2D output.
111+ echo " -- Jobs done ... validating --"
112+
113+ FINAL_SUCCESS=0
114+ for s in ` ls submit* .sh` ; do
115+ # find output path
116+ TEST_OUTPUT_PATH=" ${WORKING_DIR} /${s} _workdir" # $(grep "Local working directory is" log_${s} | awk '//{print $5}')
117+
118+ # get the Output path on JAlien from the JDL
119+ ALIEN_OUTPUT_FOLDER=$( grep ' OutputDir' ${TEST_OUTPUT_PATH} /* .jdl | cut -d' "' -f2 | sed ' s|/[^/]*#.*#.*$||' )
120+
121+ # see if there is an AO2D.root and a workflow.json in one of the jobs in that folder
122+ AODS_FOUND=$( alien.py find ${ALIEN_OUTPUT_FOLDER} AO2D.root)
123+ WORKFLOWS_FOUND=$( alien.py find ${ALIEN_OUTPUT_FOLDER} workflow.json)
124+
125+ if [[ -z ${WORKFLOWS_FOUND} || -z ${AODS_FOUND} ]]; then
126+ echo " ❌ Missing files for case $s "
127+ FINAL_SUCCESS=1 # mark as failure
128+ else
129+ echo " ✅ Files found in $s "
130+ fi
131+ done
132+
133+ if [[ ${FINAL_SUCCESS} -eq 0 ]]; then
134+ echo " ✅ All submissions have required files."
135+ else
136+ echo " ❌ Some submissions are missing required files."
137+ fi
138+
139+ # TODO: echo "-- Cleaning up ... "
140+ cd ..
141+
142+ exit ${FINAL_SUCCESS}
0 commit comments