def test_pulse_extension(self): plugins = list_plugins() pulse_plugin = plugins['pulse'] self.assertEqual(pulse_plugin.get_name(), 'pulse') p = pulse_plugin() self.assertTrue(plugin_load_parser_correctly(pulse_plugin)) mock_cliargs = {} snippet = p.get_snippet(mock_cliargs) #first line self.assertIn('RUN mkdir -p /etc/pulse', snippet) self.assertIn('default-server = unix:/run/user/', snippet) #skipping user id that's system dependent self.assertIn('autospawn = no', snippet) self.assertIn('daemon-binary = /bin/true', snippet) #last line self.assertIn('> /etc/pulse/client.conf', snippet) self.assertEqual(p.get_preamble(mock_cliargs), '') docker_args = p.get_docker_args(mock_cliargs) self.assertIn('-v /run/user/', docker_args) self.assertIn('/pulse:/run/user/', docker_args) self.assertIn('/pulse --device /dev/snd ', docker_args) self.assertIn(' -e PULSE_SERVER=unix', docker_args) self.assertIn('/pulse/native -v', docker_args) self.assertIn('/pulse/native:', docker_args) self.assertIn('/pulse/native --group-add', docker_args)
def test_user_extension(self): plugins = list_plugins() user_plugin = plugins['user'] self.assertEqual(user_plugin.get_name(), 'user') p = user_plugin() self.assertTrue(plugin_load_parser_correctly(user_plugin)) env_subs = p.get_environment_subs() self.assertEqual(env_subs['gid'], os.getgid()) self.assertEqual(env_subs['uid'], os.getuid()) self.assertEqual(env_subs['name'], getpass.getuser()) self.assertEqual(env_subs['dir'], str(Path.home())) self.assertEqual(env_subs['gecos'], pwd.getpwuid(os.getuid()).pw_gecos) self.assertEqual(env_subs['shell'], pwd.getpwuid(os.getuid()).pw_shell) mock_cliargs = {} snippet = p.get_snippet(mock_cliargs).splitlines() passwd_line = [l for l in snippet if 'chpasswd' in l][0] self.assertTrue(getpass.getuser() in passwd_line) uid_line = [l for l in snippet if '--uid' in l][0] self.assertTrue(str(os.getuid()) in uid_line) self.assertEqual(p.get_preamble(mock_cliargs), '') self.assertEqual(p.get_docker_args(mock_cliargs), '')
def test_list_plugins(self): plugins_found = list_plugins() plugin_names = plugins_found.keys() self.assertTrue('nvidia' in plugin_names) self.assertTrue('pulse' in plugin_names) self.assertTrue('user' in plugin_names) self.assertTrue('home' in plugin_names)
def test_git_extension(self): plugins = list_plugins() git_plugin = plugins['git'] self.assertEqual(git_plugin.get_name(), 'git') p = git_plugin() self.assertTrue(plugin_load_parser_correctly(git_plugin)) mock_cliargs = {} self.assertEqual(p.get_snippet(mock_cliargs), '') self.assertEqual(p.get_preamble(mock_cliargs), '') args = p.get_docker_args(mock_cliargs) # self.assertFalse(args) system_gitconfig = '/etc/gitconfig' user_gitconfig = os.path.expanduser('~/.gitconfig') user_gitconfig_target = '/root/.gitconfig' if os.path.exists(system_gitconfig): # TODO(tfoote) This isn't exercised on most systems, it would need to be mocked self.assertIn('-v %s:%s' % (system_gitconfig, system_gitconfig), args) if os.path.exists(user_gitconfig): self.assertIn('-v %s:%s' % (user_gitconfig, user_gitconfig_target), args) # Test with user "enabled" mock_cliargs = {'user': True} user_args = p.get_docker_args(mock_cliargs) if os.path.exists(user_gitconfig): self.assertIn('-v %s:%s' % (user_gitconfig, user_gitconfig), user_args)
def test_return_code_multiple_extensions(self): plugins = list_plugins() desired_plugins = ['home', 'user'] active_extensions = [ e() for e in plugins.values() if e.get_name() in desired_plugins ] dig = DockerImageGenerator(active_extensions, {}, 'ubuntu:bionic') self.assertEqual(dig.build(), 0) self.assertEqual(dig.run('true'), 0) self.assertEqual(dig.run('false'), 1)
def test_x11_xpdyinfo(self): plugins = list_plugins() desired_plugins = ['x11'] active_extensions = [ e() for e in plugins.values() if e.get_name() in desired_plugins ] for tag in self.dockerfile_tags: dig = DockerImageGenerator(active_extensions, {}, tag) self.assertEqual(dig.build(), 0) self.assertEqual(dig.run(), 0)
def test_pulse_extension(self): plugins = list_plugins() dev_helper_plugin = plugins['dev_helpers'] self.assertEqual(dev_helper_plugin.get_name(), 'dev_helpers') p = dev_helper_plugin() self.assertTrue(plugin_load_parser_correctly(dev_helper_plugin)) mock_cliargs = {} self.assertEqual(p.get_snippet(mock_cliargs), EXPECTED_DEV_HELPERS_SNIPPET) self.assertEqual(p.get_preamble(mock_cliargs), '')
def test_nvidia_glmark2(self): plugins = list_plugins() desired_plugins = [ 'x11', 'nvidia', 'user' ] #TODO(Tfoote) encode the x11 dependency into the plugin and remove from test here active_extensions = [ e() for e in plugins.values() if e.get_name() in desired_plugins ] for tag in self.dockerfile_tags: dig = DockerImageGenerator(active_extensions, {}, tag) self.assertEqual(dig.build(), 0) self.assertEqual(dig.run(), 0)
def test_home_extension(self): plugins = list_plugins() home_plugin = plugins['home'] self.assertEqual(home_plugin.get_name(), 'home') p = home_plugin() self.assertTrue(plugin_load_parser_correctly(home_plugin)) mock_cliargs = {} self.assertEqual(p.get_snippet(mock_cliargs), '') self.assertEqual(p.get_preamble(mock_cliargs), '') args = p.get_docker_args(mock_cliargs) self.assertTrue('-v %s:%s' % (Path.home(), Path.home()) in args)
def test_env_extension(self): plugins = list_plugins() env_plugin = plugins['env'] self.assertEqual(env_plugin.get_name(), 'env') p = env_plugin() self.assertTrue(plugin_load_parser_correctly(env_plugin)) mock_cliargs = {'env': ['ENVVARNAME=envvar_value', 'ENV2=val2']} self.assertEqual(p.get_snippet(mock_cliargs), '') self.assertEqual(p.get_preamble(mock_cliargs), '') self.assertEqual(p.get_docker_args(mock_cliargs), ' -e ENVVARNAME=envvar_value -e ENV2=val2')
def test_x11_extension_basic(self): plugins = list_plugins() x11_plugin = plugins['x11'] self.assertEqual(x11_plugin.get_name(), 'x11') self.assertTrue(plugin_load_parser_correctly(x11_plugin)) p = x11_plugin() mock_cliargs = {'base_image': 'ubuntu:xenial'} docker_args = p.get_docker_args(mock_cliargs) self.assertIn(' -e DISPLAY -e TERM', docker_args) self.assertIn(' -e QT_X11_NO_MITSHM=1', docker_args) self.assertIn(' -e XAUTHORITY=', docker_args) self.assertIn(' -v /tmp/.X11-unix:/tmp/.X11-unix ', docker_args) self.assertIn(' -v /etc/localtime:/etc/localtime:ro ', docker_args)
def test_nvidia_extension_basic(self): plugins = list_plugins() nvidia_plugin = plugins['nvidia'] self.assertEqual(nvidia_plugin.get_name(), 'nvidia') self.assertTrue(plugin_load_parser_correctly(nvidia_plugin)) p = nvidia_plugin() mock_cliargs = {'base_image': 'ubuntu:xenial'} snippet = p.get_snippet(mock_cliargs) self.assertIn( 'COPY --from=glvnd /usr/local/lib/x86_64-linux-gnu /usr/local/lib/x86_64-linux-gnu', snippet) self.assertIn( 'COPY --from=glvnd /usr/local/lib/i386-linux-gnu /usr/local/lib/i386-linux-gnu', snippet) self.assertIn( 'ENV LD_LIBRARY_PATH /usr/local/lib/x86_64-linux-gnu:/usr/local/lib/i386-linux-gnu', snippet) self.assertIn('NVIDIA_VISIBLE_DEVICES', snippet) self.assertIn('NVIDIA_DRIVER_CAPABILITIES', snippet) mock_cliargs = {'base_image': 'ubuntu:bionic'} snippet = p.get_snippet(mock_cliargs) self.assertIn( 'RUN apt-get update && apt-get install -y --no-install-recommends', snippet) self.assertIn(' libglvnd0 ', snippet) self.assertIn(' libgles2 ', snippet) self.assertIn( 'COPY --from=glvnd /usr/share/glvnd/egl_vendor.d/10_nvidia.json /usr/share/glvnd/egl_vendor.d/10_nvidia.json', snippet) self.assertIn('NVIDIA_VISIBLE_DEVICES', snippet) self.assertIn('NVIDIA_DRIVER_CAPABILITIES', snippet) preamble = p.get_preamble(mock_cliargs) self.assertIn('FROM nvidia/opengl:1.0-glvnd-devel-', preamble) docker_args = p.get_docker_args(mock_cliargs) #TODO(tfoote) restore with #37 self.assertIn(' -e DISPLAY -e TERM', docker_args) #TODO(tfoote) restore with #37 self.assertIn(' -e QT_X11_NO_MITSHM=1', docker_args) #TODO(tfoote) restore with #37 self.assertIn(' -e XAUTHORITY=', docker_args) #TODO(tfoote) restore with #37 self.assertIn(' -v /tmp/.X11-unix:/tmp/.X11-unix ', docker_args) #TODO(tfoote) restore with #37 self.assertIn(' -v /etc/localtime:/etc/localtime:ro ', docker_args) self.assertIn(' --runtime=nvidia ', docker_args) self.assertIn(' --security-opt seccomp=unconfined', docker_args)
def test_ssh_extension(self): plugins = list_plugins() ssh_plugin = plugins['ssh'] self.assertEqual(ssh_plugin.get_name(), 'ssh') p = ssh_plugin() self.assertTrue(plugin_load_parser_correctly(ssh_plugin)) mock_cliargs = {} self.assertEqual(p.get_snippet(mock_cliargs), '') self.assertEqual(p.get_preamble(mock_cliargs), '') # with SSH_AUTH_SOCK set os.environ['SSH_AUTH_SOCK'] = 'foo' args = p.get_docker_args(mock_cliargs) self.assertIn( '-e SSH_AUTH_SOCK -v ' + shlex.quote( '{SSH_AUTH_SOCK}:{SSH_AUTH_SOCK}'.format(**os.environ)), args) #without it set del os.environ['SSH_AUTH_SOCK'] args = p.get_docker_args(mock_cliargs) self.assertNotIn('SSH_AUTH_SOCK', args)