From 0a27815bdf3f1d1bc1eb3771bcee9294b6f4136f Mon Sep 17 00:00:00 2001 From: Nico Cesar Date: Tue, 16 Mar 2021 14:13:05 -0400 Subject: [PATCH] moving HostConfig into the ThinContainerExecRunner interface Arvados-DCO-1.1-Signed-off-by: Nico Cesar --- lib/crunchrun/container_exec_types.go | 31 ++++++++++++++++--- lib/crunchrun/crunchrun.go | 19 +++++------- lib/crunchrun/docker_adapter.go | 43 +++++++++++++++++++++++++-- lib/crunchrun/singularity.go | 13 ++++++++ 4 files changed, 88 insertions(+), 18 deletions(-) diff --git a/lib/crunchrun/container_exec_types.go b/lib/crunchrun/container_exec_types.go index fc865af73e..1b8f8876ab 100644 --- a/lib/crunchrun/container_exec_types.go +++ b/lib/crunchrun/container_exec_types.go @@ -32,6 +32,23 @@ type ContainerConfig struct { Volumes map[string]struct{} } +// LogConfig represents the logging configuration of the container. +type LogConfig struct { + Type string + Config map[string]string +} + +// Resources contains container's resources (cgroups config, ulimits...) +type Resources struct { + Memory int64 // Memory limit (in bytes) + NanoCPUs int64 `json:"NanoCpus"` // CPU quota in units of 10-9 CPUs. + CgroupParent string // Parent cgroup. + MemorySwap int64 // Total memory usage (memory + swap); set `-1` to enable unlimited swap + KernelMemory int64 // Kernel memory limit (in bytes) +} + +type NetworkMode string + // HostConfig holds all values needed for Docker and Singularity // to run a container related to the host. In the case of docker is // similar to github.com/docker/docker/api/types/container/HostConfig @@ -39,11 +56,13 @@ type ContainerConfig struct { // "dependent of the host we are running on". // and for Singularity TBD type HostConfig struct { + NetworkMode NetworkMode + Binds []string // List of volume bindings for this container //important bits: - // - Binds: - // LogConfig - // Resources: see dockercontainer.Resources - // NetworkMode: see dockercontainer.NetworkMode + LogConfig LogConfig // Configuration of the logs for this container + + // Contains container's resources (cgroups, ulimits) + Resources } // ---- NETROWKING STUFF @@ -284,6 +303,10 @@ type ThinContainerExecRunner interface { GetImage() (imageID string) SetImage(imageID string) + SetHostConfig(hostConfig HostConfig) error + GetNetworkMode() (networkMode NetworkMode) + SetNetworkMode(networkMode NetworkMode) + ContainerAttach(ctx context.Context, container string, options ContainerAttachOptions) (HijackedResponse, error) ContainerCreate(ctx context.Context, config ContainerConfig, hostConfig HostConfig, networkingConfig *NetworkingConfig, containerName string) (ContainerCreateResponse, error) ContainerStart(ctx context.Context, container string, options ContainerStartOptions) error diff --git a/lib/crunchrun/crunchrun.go b/lib/crunchrun/crunchrun.go index ad10b6f9cf..8c989d533b 100644 --- a/lib/crunchrun/crunchrun.go +++ b/lib/crunchrun/crunchrun.go @@ -97,11 +97,6 @@ type PsProcess interface { type ContainerRunner struct { ContainerExecRunner ThinContainerExecRunner - //Docker ThinDockerClient - //ContainerConfig dockercontainer.Config //FIXME: translate this to the ThinContainerRunner interface - HostConfig dockercontainer.HostConfig //FIXME: translate this to the ThinContainerRunner interface - //-------------- - // Dispatcher client is initialized with the Dispatcher token. // This is a privileged token used to manage container status // and logs. @@ -1086,12 +1081,12 @@ func (runner *ContainerRunner) CreateContainer() error { // Docker daemon won't let you set a limit less than ~10 MiB maxRAM = minDockerRAM * 1024 * 1024 } - runner.HostConfig = dockercontainer.HostConfig{ + hostConfig = HostConfig{ Binds: runner.Binds, - LogConfig: dockercontainer.LogConfig{ + LogConfig: LogConfig{ Type: "none", }, - Resources: dockercontainer.Resources{ + Resources: Resources{ CgroupParent: runner.setCgroupParent, NanoCPUs: int64(runner.Container.RuntimeConstraints.VCPUs) * 1000000000, Memory: maxRAM, // RAM @@ -1099,7 +1094,7 @@ func (runner *ContainerRunner) CreateContainer() error { KernelMemory: maxRAM, // kernel portion }, } - + runner.ContainerExecRunner.SetHostConfig(hostConfig) if runner.Container.RuntimeConstraints.API { tok, err := runner.ContainerToken() if err != nil { @@ -1110,12 +1105,12 @@ func (runner *ContainerRunner) CreateContainer() error { "ARVADOS_API_HOST="+os.Getenv("ARVADOS_API_HOST"), "ARVADOS_API_HOST_INSECURE="+os.Getenv("ARVADOS_API_HOST_INSECURE"), ) - runner.HostConfig.NetworkMode = dockercontainer.NetworkMode(runner.networkMode) + runner.ContainerExecRunner.SetNetworkMode(NetworkMode(runner.networkMode)) } else { if runner.enableNetwork == "always" { - runner.HostConfig.NetworkMode = dockercontainer.NetworkMode(runner.networkMode) + runner.ContainerExecRunner.SetNetworkMode(NetworkMode(runner.networkMode)) } else { - runner.HostConfig.NetworkMode = dockercontainer.NetworkMode("none") + runner.ContainerExecRunner.SetNetworkMode("none") } } diff --git a/lib/crunchrun/docker_adapter.go b/lib/crunchrun/docker_adapter.go index 1019e7df7b..f6c1a1a618 100644 --- a/lib/crunchrun/docker_adapter.go +++ b/lib/crunchrun/docker_adapter.go @@ -16,7 +16,7 @@ import ( type DockerAdapter struct { docker ThinDockerClient containerConfig ContainerConfig - hostConfig HostConfig + hostConfig dockercontainer.HostConfig } func (a *DockerAdapter) ContainerAttach(ctx context.Context, container string, options ContainerAttachOptions) (HijackedResponse, error) { @@ -209,8 +209,40 @@ func (a *DockerAdapter) GetContainerConfig() (ContainerConfig, error) { } func (a *DockerAdapter) GetHostConfig() (HostConfig, error) { - return a.hostConfig, nil + adapterHostConfig := HostConfig{ + Binds: a.hostConfig.Binds, + LogConfig: LogConfig{ + Type: a.hostConfig.LogConfig.Type, + }, + Resources: Resources{ + CgroupParent: a.hostConfig.CgroupParent, + NanoCPUs: a.hostConfig.NanoCPUs, + Memory: a.hostConfig.Memory, + MemorySwap: a.hostConfig.MemorySwap, + KernelMemory: a.hostConfig.KernelMemory, + }, + } + return adapterHostConfig, nil +} + +func (a *DockerAdapter) SetHostConfig(adapterHostConfig HostConfig) error { + dockerHostConfig := dockercontainer.HostConfig{ + Binds: adapterHostConfig.Binds, + LogConfig: dockercontainer.LogConfig{ + Type: adapterHostConfig.LogConfig.Type, + }, + Resources: dockercontainer.Resources{ + CgroupParent: adapterHostConfig.CgroupParent, + NanoCPUs: adapterHostConfig.NanoCPUs, + Memory: adapterHostConfig.Memory, + MemorySwap: adapterHostConfig.MemorySwap, + KernelMemory: adapterHostConfig.KernelMemory, + }, + } + a.hostConfig = dockerHostConfig + return nil } + func (a *DockerAdapter) GetImage() (imageID string) { return a.containerConfig.Image } @@ -218,6 +250,13 @@ func (a *DockerAdapter) GetImage() (imageID string) { func (a *DockerAdapter) SetImage(imageID string) { a.containerConfig.Image = imageID } +func (a *DockerAdapter) GetNetworkMode() (networkMode NetworkMode) { + return NetworkMode(a.hostConfig.NetworkMode) +} + +func (a *DockerAdapter) SetNetworkMode(networkMode NetworkMode) { + a.hostConfig.NetworkMode = dockercontainer.NetworkMode(networkMode) +} func adapter(docker ThinDockerClient) ThinContainerExecRunner { return_object := &DockerAdapter{docker: docker} diff --git a/lib/crunchrun/singularity.go b/lib/crunchrun/singularity.go index 6b36e68669..d83cf2804a 100644 --- a/lib/crunchrun/singularity.go +++ b/lib/crunchrun/singularity.go @@ -32,6 +32,19 @@ func (c SingularityClient) SetImage(imageID string) { c.containerConfig.Image = imageID } +func (c SingularityClient) GetNetworkMode() (networkMode NetworkMode) { + return c.hostConfig.NetworkMode +} + +func (c SingularityClient) SetNetworkMode(networkMode NetworkMode) { + c.hostConfig.NetworkMode = networkMode +} + +func (c SingularityClient) SetHostConfig(hostConfig HostConfig) error { + c.hostConfig = hostConfig + return nil +} + func (c SingularityClient) ContainerAttach(ctx context.Context, container string, options ContainerAttachOptions) (HijackedResponse, error) { fmt.Printf("placeholder for container ContainerAttach %s", container) -- 2.30.2