-
Notifications
You must be signed in to change notification settings - Fork 52
131 lines (105 loc) · 5.82 KB
/
tests_link_nvidia_host_libraries.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
# documentation: https://help.github.com/en/articles/workflow-syntax-for-github-actions
name: Test NVIDIA Host Libraries Linking
on:
push:
pull_request:
permissions:
contents: read # to fetch code (actions/checkout)
jobs:
build:
runs-on: ubuntu-24.04
steps:
- name: checkout
uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0
# we deliberately do not use the eessi/github-action-eessi action,
# because we want to control when the EESSI environment is initialized
- name: Mount EESSI CernVM-FS repository
uses: cvmfs-contrib/github-action-cvmfs@55899ca74cf78ab874bdf47f5a804e47c198743c # v4.0
with:
cvmfs_config_package: https://github.com/EESSI/filesystem-layer/releases/download/latest/cvmfs-config-eessi_latest_all.deb
cvmfs_http_proxy: DIRECT
cvmfs_repositories: software.eessi.io
- name: Create EESSI test directories
run: |
# Create EESSI directories needed for the script
mkdir -p /tmp/eessi/cvmfs/software.eessi.io/host_injections/nvidia/x86_64
echo "EESSI_CVMFS_REPO=/tmp/eessi/cvmfs/software.eessi.io" >> $GITHUB_ENV
echo "EESSI_CPU_FAMILY=x86_64" >> $GITHUB_ENV
echo "EESSI_EPREFIX=/tmp/eessi/cvmfs/software.eessi.io/versions/2023.06" >> $GITHUB_ENV
- name: Setup mock NVIDIA libraries
run: |
# Run the script to create mock libraries
chmod +x ./tests/nvidia-libs/mock-nvidia-libs.sh
./tests/nvidia-libs/mock-nvidia-libs.sh
# Add commands to PATH
echo "PATH=/tmp/nvidia_commands:$PATH" >> $GITHUB_ENV
- name: Setup mock nvidia-smi
run: |
# Create directory for mock nvidia-smi
mkdir -p /tmp/nvidia-bin
# Copy the mock script
chmod +x ./tests/nvidia-libs/mock-nvidia-smi.sh
cp ./tests/nvidia-libs/mock-nvidia-smi.sh /tmp/nvidia-bin/nvidia-smi
# Add to PATH
echo "PATH=/tmp/nvidia-bin:$PATH" >> $GITHUB_ENV
- name: Test LD_PRELOAD mode
run: |
# Run the script with LD_PRELOAD option (shouldn't create symlinks)
output=$(./link_nvidia_host_libraries.sh --show-ld-preload || echo "Script returned non-zero: $?")
# Check for expected outputs
echo "$output" | grep "export EESSI_GPU_COMPAT_LD_PRELOAD=" || { echo "EESSI_GPU_COMPAT_LD_PRELOAD not found in output"; exit 1; }
echo "$output" | grep "export EESSI_GPU_LD_PRELOAD=" || { echo "EESSI_GPU_LD_PRELOAD not found in output"; exit 1; }
echo "$output" | grep "export EESSI_OVERRIDE_GPU_CHECK=" || { echo "EESSI_OVERRIDE_GPU_CHECK not found in output"; exit 1; }
# Verify that no symlinks were created
if [ -e "/tmp/eessi/cvmfs/software.eessi.io/host_injections/nvidia/x86_64/host/driver_version.txt" ]; then
echo "Error: symlinks were created in LD_PRELOAD mode"
exit 1
fi
echo "LD_PRELOAD mode test passed."
- name: Test normal run (first time)
run: |
# Run with verbose mode
output=$(./link_nvidia_host_libraries.sh --verbose || echo "Script returned non-zero: $?")
# Check if NVIDIA GPU was detected
echo "$output" | grep "Found NVIDIA GPU driver version 535.129.03" || { echo "Failed to detect NVIDIA driver version"; exit 1; }
echo "$output" | grep "Found host CUDA version 8.0" || { echo "Failed to detect CUDA version"; exit 1; }
# Check if libraries were found
echo "$output" | grep "Matched.*CUDA Libraries" || { echo "Failed to match CUDA libraries"; exit 1; }
# Verify symlinks were created
if [ ! -d "/tmp/eessi/cvmfs/software.eessi.io/host_injections/nvidia/x86_64/host" ]; then
echo "Error: host directory wasn't created"
exit 1
fi
# Check if version files were created
if [ ! -f "/tmp/eessi/cvmfs/software.eessi.io/host_injections/nvidia/x86_64/host/driver_version.txt" ]; then
echo "Error: driver_version.txt wasn't created"
exit 1
fi
# Check driver version content
grep "535.129.03" "/tmp/eessi/cvmfs/software.eessi.io/host_injections/nvidia/x86_64/host/driver_version.txt" || { echo "Incorrect driver version"; exit 1; }
# Check if latest symlink was created
if [ ! -L "/tmp/eessi/cvmfs/software.eessi.io/host_injections/nvidia/x86_64/latest" ]; then
echo "Error: 'latest' symlink wasn't created"
exit 1
fi
# Check if latest points to host
readlink "/tmp/eessi/cvmfs/software.eessi.io/host_injections/nvidia/x86_64/latest" | grep "host" || { echo "latest doesn't point to host"; exit 1; }
echo "First normal run test passed"
- name: Test normal run (second time)
run: |
# Store file timestamps before second run
stat_before=$(stat "/tmp/eessi/cvmfs/software.eessi.io/host_injections/nvidia/x86_64/host/driver_version.txt")
# Run script again
output=$(./link_nvidia_host_libraries.sh || echo "Script returned non-zero: $?")
# Store file timestamps after second run
stat_after=$(stat "/tmp/eessi/cvmfs/software.eessi.io/host_injections/nvidia/x86_64/host/driver_version.txt")
# Compare timestamps - should be the same (files shouldn't be modified)
if [[ "$stat_before" != "$stat_after" ]]; then
echo "Error: files were modified on second run when they shouldn't have been"
echo "Before: $stat_before"
echo "After: $stat_after"
exit 1
fi
# Check for message indicating that libraries are already linked
echo "$output" | grep "have already been linked" || { echo "Missing 'already linked' message"; exit 1; }
echo "Second normal run test passed"