12630: Test docker container config setup.
authorTom Clegg <tom@curii.com>
Mon, 13 Dec 2021 19:23:53 +0000 (14:23 -0500)
committerTom Clegg <tom@curii.com>
Mon, 13 Dec 2021 19:23:53 +0000 (14:23 -0500)
Arvados-DCO-1.1-Signed-off-by: Tom Clegg <tom@curii.com>

lib/crunchrun/docker.go
lib/crunchrun/docker_test.go

index c64ff83da38ada46a19fc15153f11a42270e28bf..ab00273ef3a8eda38fccfc67b2a6e0b3c00659d3 100644 (file)
@@ -71,7 +71,7 @@ func (e *dockerExecutor) LoadImage(imageID string, imageTarballPath string, cont
        return nil
 }
 
-func (e *dockerExecutor) Create(spec containerSpec) error {
+func (e *dockerExecutor) config(spec containerSpec) (dockercontainer.Config, dockercontainer.HostConfig) {
        e.logf("Creating Docker container")
        cfg := dockercontainer.Config{
                Image:        spec.Image,
@@ -123,7 +123,11 @@ func (e *dockerExecutor) Create(spec containerSpec) error {
        if spec.EnableNetwork {
                hostCfg.NetworkMode = dockercontainer.NetworkMode(spec.NetworkMode)
        }
+       return cfg, hostCfg
+}
 
+func (e *dockerExecutor) Create(spec containerSpec) error {
+       cfg, hostCfg := e.config(spec)
        created, err := e.dockerclient.ContainerCreate(context.TODO(), &cfg, &hostCfg, nil, e.containerUUID)
        if err != nil {
                return fmt.Errorf("While creating container: %v", err)
index 28eb59546a69ea36ecfbabf2a7bad8dc4ebb69e3..9a1573193b6801d7ffd1c32ae73a2d7a9c188784 100644 (file)
@@ -8,6 +8,7 @@ import (
        "os/exec"
        "time"
 
+       dockercontainer "github.com/docker/docker/api/types/container"
        . "gopkg.in/check.v1"
 )
 
@@ -29,3 +30,35 @@ func (s *dockerSuite) SetUpSuite(c *C) {
                c.Assert(err, IsNil)
        }
 }
+
+var _ = Suite(&dockerStubSuite{})
+
+// dockerStubSuite tests don't really connect to the docker service,
+// so we can run them even if docker is not installed.
+type dockerStubSuite struct{}
+
+func (s *dockerStubSuite) TestDockerContainerConfig(c *C) {
+       e, err := newDockerExecutor("zzzzz-zzzzz-zzzzzzzzzzzzzzz", c.Logf, time.Second/2)
+       c.Assert(err, IsNil)
+       cfg, hostCfg := e.config(containerSpec{
+               VCPUs:           4,
+               RAM:             123123123,
+               WorkingDir:      "/WorkingDir",
+               Env:             map[string]string{"FOO": "bar"},
+               BindMounts:      map[string]bindmount{"/mnt": {HostPath: "/hostpath", ReadOnly: true}},
+               EnableNetwork:   false,
+               CUDADeviceCount: 3,
+       })
+       c.Check(cfg.WorkingDir, Equals, "/WorkingDir")
+       c.Check(cfg.Env, DeepEquals, []string{"FOO=bar"})
+       c.Check(hostCfg.NetworkMode, Equals, dockercontainer.NetworkMode("none"))
+       c.Check(hostCfg.Resources.NanoCPUs, Equals, int64(4000000000))
+       c.Check(hostCfg.Resources.Memory, Equals, int64(123123123))
+       c.Check(hostCfg.Resources.MemorySwap, Equals, int64(123123123))
+       c.Check(hostCfg.Resources.KernelMemory, Equals, int64(123123123))
+       c.Check(hostCfg.Resources.DeviceRequests, DeepEquals, []dockercontainer.DeviceRequest{{
+               Driver:       "nvidia",
+               Count:        3,
+               Capabilities: [][]string{{"gpu", "nvidia", "compute"}},
+       }})
+}