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<sup>-9</sup> 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
// "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
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
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.
// 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
KernelMemory: maxRAM, // kernel portion
},
}
-
+ runner.ContainerExecRunner.SetHostConfig(hostConfig)
if runner.Container.RuntimeConstraints.API {
tok, err := runner.ContainerToken()
if err != nil {
"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")
}
}
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) {
}
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
}
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}
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)