1 // Copyright (C) The Arvados Authors. All rights reserved.
3 // SPDX-License-Identifier: AGPL-3.0
13 var _ = Suite(&singularitySuite{})
15 type singularitySuite struct {
19 func (s *singularitySuite) SetUpSuite(c *C) {
20 _, err := exec.LookPath("singularity")
22 c.Skip("looks like singularity is not installed")
24 s.newExecutor = func(c *C) {
26 s.executor, err = newSingularityExecutor(c.Logf)
31 func (s *singularitySuite) TearDownSuite(c *C) {
32 if s.executor != nil {
37 func (s *singularitySuite) TestIPAddress(c *C) {
38 // In production, executor will choose --network=bridge
39 // because uid=0 under arvados-dispatch-cloud. But in test
40 // cases, uid!=0, which means --network=bridge is conditional
42 s.executor.(*singularityExecutor).fakeroot = true
43 s.executorSuite.TestIPAddress(c)
46 func (s *singularitySuite) TestInject(c *C) {
47 path, err := exec.LookPath("nsenter")
48 if err != nil || path != "/var/lib/arvados/bin/nsenter" {
49 c.Skip("looks like /var/lib/arvados/bin/nsenter is not installed -- re-run `arvados-server install`?")
51 s.executorSuite.TestInject(c)
54 var _ = Suite(&singularityStubSuite{})
56 // singularityStubSuite tests don't really invoke singularity, so we
57 // can run them even if singularity is not installed.
58 type singularityStubSuite struct{}
60 func (s *singularityStubSuite) TestSingularityExecArgs(c *C) {
61 e, err := newSingularityExecutor(c.Logf)
63 err = e.Create(containerSpec{
64 WorkingDir: "/WorkingDir",
65 Env: map[string]string{"FOO": "bar"},
66 BindMounts: map[string]bindmount{"/mnt": {HostPath: "/hostpath", ReadOnly: true}},
71 e.imageFilename = "/fake/image.sif"
72 cmd := e.execCmd("./singularity")
73 c.Check(cmd.Args, DeepEquals, []string{"./singularity", "exec", "--containall", "--cleanenv", "--pwd=/WorkingDir", "--net", "--network=none", "--nv", "--bind", "/hostpath:/mnt:ro", "/fake/image.sif"})
74 c.Check(cmd.Env, DeepEquals, []string{"SINGULARITYENV_FOO=bar"})