From: Tom Clegg Date: Mon, 13 Dec 2021 19:23:53 +0000 (-0500) Subject: 12630: Test docker container config setup. X-Git-Tag: 2.4.0~139^2 X-Git-Url: https://git.arvados.org/arvados.git/commitdiff_plain/58ea9370fa7b38382dfa9eea4c42a616e0a699f3 12630: Test docker container config setup. Arvados-DCO-1.1-Signed-off-by: Tom Clegg --- diff --git a/lib/crunchrun/docker.go b/lib/crunchrun/docker.go index c64ff83da3..ab00273ef3 100644 --- a/lib/crunchrun/docker.go +++ b/lib/crunchrun/docker.go @@ -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) diff --git a/lib/crunchrun/docker_test.go b/lib/crunchrun/docker_test.go index 28eb59546a..9a1573193b 100644 --- a/lib/crunchrun/docker_test.go +++ b/lib/crunchrun/docker_test.go @@ -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"}}, + }}) +}