Skip to content

Commit 7f0c93d

Browse files
committed
add nvidia lib path to env before running
1 parent d35e1e0 commit 7f0c93d

3 files changed

Lines changed: 48 additions & 2 deletions

File tree

tests/unit/test_nvidia.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
from unittest.mock import patch, Mock
1010
from udocker.config import Config
1111
from udocker.engine.nvidia import NvidiaMode
12+
from udocker.utils.uenv import Uenv
1213

1314
collections.Callable = collections.abc.Callable
1415

@@ -350,6 +351,29 @@ def test_13__copy_single_file(self, mock_exists, mock_statmod, mock_copy2,
350351
self.assertTrue(mock_copy2.called) # should copy file
351352
self.assertTrue(mock_chmod.called)
352353

354+
@patch('udocker.engine.nvidia.os.path.isdir')
355+
def test_14_merge_path_env(self, mock_isdir):
356+
"""Test14 NvidiaMode.merge_path_env()."""
357+
nvmode = NvidiaMode(self.local, self.cont_id)
358+
env_path = "/opt/python/bin"
359+
nvi_lib_dir = nvmode._find_cont_dir()
360+
mock_isdir.return_value = True
361+
362+
# Case 1: LD_LIBRARY_PATH not in env
363+
env = Uenv(["PATH=%s" % env_path])
364+
nvmode.merge_path_env(env)
365+
self.assertEqual(nvi_lib_dir, env.getenv("LD_LIBRARY_PATH"))
366+
self.assertEqual(env_path, env.getenv("PATH"))
367+
self.assertTrue(mock_isdir.called)
368+
369+
# Case 2: LD_LIBRARY_PATH in env
370+
original_ld_library_path = "/usr/local/nvidia/lib:/usr/local/nvidia/lib64"
371+
env = Uenv(["PATH=%s" % env_path, "LD_LIBRARY_PATH=%s" % original_ld_library_path])
372+
nvmode.merge_path_env(env)
373+
self.assertTrue(nvi_lib_dir in env.getenv("LD_LIBRARY_PATH"))
374+
self.assertTrue(original_ld_library_path in env.getenv("LD_LIBRARY_PATH"))
375+
self.assertEqual(env_path, env.getenv("PATH"))
376+
353377

354378
if __name__ == '__main__':
355379
main()

udocker/engine/base.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
from udocker.genstr import is_genstr
1010
from udocker.msg import Msg
1111
from udocker.config import Config
12+
from udocker.engine.nvidia import NvidiaMode
1213
from udocker.helper.nixauth import NixAuthentication
1314
from udocker.helper.hostinfo import HostInfo
1415
from udocker.helper.osinfo import OSInfo
@@ -566,6 +567,10 @@ def _run_env_set(self):
566567
self.opt["env"].append("container_execmode=" +
567568
self.exec_mode.get_mode())
568569
cont_name = self.container_names
570+
# Add nvidia library path to LD_LIBRARY_PATH
571+
nvidia_mode = NvidiaMode(self.localrepo, self.container_id)
572+
if nvidia_mode.get_mode():
573+
nvidia_mode.merge_path_env(self.opt["env"])
569574
# if Python 3
570575
if sys.version_info[0] >= 3:
571576
names = str(cont_name).translate(str.maketrans('', '', " '\"[]"))

udocker/engine/nvidia.py

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ def _find_host_dir(self):
149149

150150
def _find_cont_dir(self):
151151
"""Find the location of the host target directory for libraries"""
152-
# Ensure these directories exist in the container
152+
# Support different linux distributions
153153
for dst_dir in ("/usr/lib/x86_64-linux-gnu", "/usr/lib64"):
154154
if os.path.isdir(self.container_root + '/' + dst_dir):
155155
Msg().out("Debug: Cont. location nvidia", dst_dir, l=Msg.DBG)
@@ -164,8 +164,9 @@ def _installation_exists(self, nvi_host_dir_list, nvi_cont_dir):
164164
self._files_exist(nvi_cont_dir, lib_list)
165165
self._files_exist("/etc", Config.conf['nvi_etc_list'])
166166
self._files_exist("/usr/bin", Config.conf['nvi_bin_list'])
167-
Msg().out("Info: Cont, has files from previous nvidia install")
167+
Msg().out("Info: Cont, nvidia not set up")
168168
except OSError:
169+
Msg().out("Info: Cont, has files from previous nvidia install")
169170
return True
170171
return False
171172

@@ -209,3 +210,19 @@ def get_devices(self):
209210
dev_list.append(expanded_devs)
210211
Msg().out("Debug: nvidia device list", dev_list, l=Msg.DBG)
211212
return dev_list
213+
214+
def merge_path_env(self, env):
215+
"""Add nvidia library path into LD_LIBRARY_PATH of env(Uenv)"""
216+
nvi_cont_dir = self._find_cont_dir()
217+
if not nvi_cont_dir:
218+
return
219+
ld_library_path = env.getenv("LD_LIBRARY_PATH")
220+
if not ld_library_path:
221+
ld_library_list = []
222+
else:
223+
ld_library_list = [p.strip() for p in ld_library_path.split(':')]
224+
if nvi_cont_dir in ld_library_list:
225+
return
226+
ld_library_list.append(nvi_cont_dir)
227+
env.setenv("LD_LIBRARY_PATH", ':'.join(ld_library_list))
228+
Msg().out("Debug: add nvidia library path", nvi_cont_dir, "to LD_LIBRARY_PATH", l=Msg.DBG)

0 commit comments

Comments
 (0)