From fe373794642f662d0f11d2f6dab5fc3c8767a9d3 Mon Sep 17 00:00:00 2001 From: Valerij Fredriksen Date: Fri, 3 Nov 2017 16:54:28 +0100 Subject: Take in ContainerResources in createContainerCommand() --- .../dockerapi/CreateContainerCommandImpl.java | 25 ++++++---------------- .../com/yahoo/vespa/hosted/dockerapi/Docker.java | 3 +-- .../yahoo/vespa/hosted/dockerapi/DockerImpl.java | 5 +++-- .../yahoo/vespa/hosted/dockerapi/DockerTest.java | 23 ++++++++++++-------- .../vespa/hosted/dockerapi/RunSystemTests.java | 1 + 5 files changed, 26 insertions(+), 31 deletions(-) (limited to 'docker-api') diff --git a/docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/CreateContainerCommandImpl.java b/docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/CreateContainerCommandImpl.java index 8e8a650d906..485de99082b 100644 --- a/docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/CreateContainerCommandImpl.java +++ b/docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/CreateContainerCommandImpl.java @@ -25,6 +25,7 @@ import java.util.stream.IntStream; class CreateContainerCommandImpl implements Docker.CreateContainerCommand { private final DockerClient docker; private final DockerImage dockerImage; + private final ContainerResources containerResources; private final ContainerName containerName; private final String hostName; private final Map labels = new HashMap<>(); @@ -32,8 +33,6 @@ class CreateContainerCommandImpl implements Docker.CreateContainerCommand { private final List volumeBindSpecs = new ArrayList<>(); private final List ulimits = new ArrayList<>(); - private Optional memoryInB = Optional.empty(); - private Optional cpuShares = Optional.empty(); private Optional networkMode = Optional.empty(); private Optional ipv4Address = Optional.empty(); private Optional ipv6Address = Optional.empty(); @@ -43,10 +42,12 @@ class CreateContainerCommandImpl implements Docker.CreateContainerCommand { CreateContainerCommandImpl(DockerClient docker, DockerImage dockerImage, + ContainerResources containerResources, ContainerName containerName, String hostName) { this.docker = docker; this.dockerImage = dockerImage; + this.containerResources = containerResources; this.containerName = containerName; this.hostName = hostName; } @@ -102,18 +103,6 @@ class CreateContainerCommandImpl implements Docker.CreateContainerCommand { return this; } - @Override - public Docker.CreateContainerCommand withMemoryInMb(long megaBytes) { - memoryInB = Optional.of(megaBytes * 1024 * 1024); - return this; - } - - @Override - public Docker.CreateContainerCommand withCpuShares(int shares) { - cpuShares = Optional.of(shares); - return this; - } - @Override public Docker.CreateContainerCommand withNetworkMode(String mode) { networkMode = Optional.of(mode); @@ -144,6 +133,8 @@ class CreateContainerCommandImpl implements Docker.CreateContainerCommand { final CreateContainerCmd containerCmd = docker .createContainerCmd(dockerImage.asString()) + .withCpuShares(containerResources.cpuShares) + .withMemory(containerResources.memoryBytes) .withName(containerName.asString()) .withHostName(hostName) .withLabels(labels) @@ -157,8 +148,6 @@ class CreateContainerCommandImpl implements Docker.CreateContainerCommand { .filter(mode -> ! mode.toLowerCase().equals("host")) .ifPresent(mode -> containerCmd.withMacAddress(generateMACAddress(hostName, ipv4Address, ipv6Address))); - memoryInB.ifPresent(containerCmd::withMemory); - cpuShares.ifPresent(containerCmd::withCpuShares); networkMode.ifPresent(containerCmd::withNetworkMode); ipv4Address.ifPresent(containerCmd::withIpv4Address); ipv6Address.ifPresent(containerCmd::withIpv6Address); @@ -191,14 +180,14 @@ class CreateContainerCommandImpl implements Docker.CreateContainerCommand { return "--name " + containerName.asString() + " " + "--hostname " + hostName + " " + + "--cpu-shares " + containerResources.cpuShares + " " + + "--memory " + containerResources.memoryBytes + " " + toRepeatedOption("--label", labelList) + toRepeatedOption("--ulimit", ulimitList) + toRepeatedOption("--env", environmentAssignments) + toRepeatedOption("--volume", volumeBindSpecs) + toRepeatedOption("--cap-add", addCapabilitiesList) + toRepeatedOption("--cap-drop", dropCapabilitiesList) - + toOptionalOption("--memory", memoryInB) - + toOptionalOption("--cpu-shares", cpuShares) + toOptionalOption("--net", networkMode) + toOptionalOption("--ip", ipv4Address) + toOptionalOption("--ip6", ipv6Address) diff --git a/docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/Docker.java b/docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/Docker.java index 865908bdc8e..2bf3f0f8d84 100644 --- a/docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/Docker.java +++ b/docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/Docker.java @@ -16,8 +16,6 @@ public interface Docker { CreateContainerCommand withLabel(String name, String value); CreateContainerCommand withEnvironment(String name, String value); CreateContainerCommand withVolume(String path, String volumePath); - CreateContainerCommand withMemoryInMb(long megaBytes); - CreateContainerCommand withCpuShares(int shares); CreateContainerCommand withNetworkMode(String mode); CreateContainerCommand withIpAddress(InetAddress address); CreateContainerCommand withUlimit(String name, int softLimit, int hardLimit); @@ -31,6 +29,7 @@ public interface Docker { CreateContainerCommand createContainerCommand( DockerImage dockerImage, + ContainerResources containerResources, ContainerName containerName, String hostName); diff --git a/docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/DockerImpl.java b/docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/DockerImpl.java index 9f278139a0d..9de2cae604f 100644 --- a/docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/DockerImpl.java +++ b/docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/DockerImpl.java @@ -202,8 +202,9 @@ public class DockerImpl implements Docker { } @Override - public CreateContainerCommand createContainerCommand(DockerImage image, ContainerName name, String hostName) { - return new CreateContainerCommandImpl(dockerClient, image, name, hostName); + public CreateContainerCommand createContainerCommand(DockerImage image, ContainerResources containerResources, + ContainerName name, String hostName) { + return new CreateContainerCommandImpl(dockerClient, image, containerResources, name, hostName); } @Override diff --git a/docker-api/src/test/java/com/yahoo/vespa/hosted/dockerapi/DockerTest.java b/docker-api/src/test/java/com/yahoo/vespa/hosted/dockerapi/DockerTest.java index 310fb4ffdd3..18f87e5ae17 100644 --- a/docker-api/src/test/java/com/yahoo/vespa/hosted/dockerapi/DockerTest.java +++ b/docker-api/src/test/java/com/yahoo/vespa/hosted/dockerapi/DockerTest.java @@ -41,18 +41,18 @@ public class DockerTest { InetAddress inetAddress1 = InetAddress.getByName("172.18.10.10"); InetAddress inetAddress2 = InetAddress.getByName("172.18.10.11"); - docker.createContainerCommand(dockerImage, containerName1, hostName1) + docker.createContainerCommand(dockerImage, ContainerResources.from(0, 0.1), containerName1, hostName1) .withManagedBy(MANAGER_NAME) .withNetworkMode(DockerImpl.DOCKER_CUSTOM_MACVLAN_NETWORK_NAME) .withIpAddress(inetAddress1) - .withMemoryInMb(100).create(); + .create(); docker.startContainer(containerName1); - docker.createContainerCommand(dockerImage, containerName2, hostName2) + docker.createContainerCommand(dockerImage, ContainerResources.from(0, 0.1), containerName2, hostName2) .withManagedBy(MANAGER_NAME) .withNetworkMode(DockerImpl.DOCKER_CUSTOM_MACVLAN_NETWORK_NAME) .withIpAddress(inetAddress2) - .withMemoryInMb(100).create(); + .create(); docker.startContainer(containerName2); // 137 = 128 + 9 = kill -9 (SIGKILL), doesn't need to be run as "root", but "yahoo" does not exist in this basic image @@ -74,7 +74,8 @@ public class DockerTest { final ContainerName containerName = new ContainerName("docker-test-foo"); final String containerHostname = "hostName1"; - docker.createContainerCommand(dockerImage, containerName, containerHostname).withManagedBy(MANAGER_NAME).create(); + docker.createContainerCommand(dockerImage, ContainerResources.UNLIMITED, containerName, containerHostname) + .withManagedBy(MANAGER_NAME).create(); Optional container = docker.getContainer(containerName); assertTrue(container.isPresent()); assertEquals(container.get().state, Container.State.CREATED); @@ -110,7 +111,8 @@ public class DockerTest { final ContainerName containerName = new ContainerName("docker-test-foo"); final String containerHostname = "hostName1"; - docker.createContainerCommand(dockerImage, containerName, containerHostname).withManagedBy(MANAGER_NAME).create(); + docker.createContainerCommand(dockerImage, ContainerResources.UNLIMITED, containerName, containerHostname) + .withManagedBy(MANAGER_NAME).create(); docker.startContainer(containerName); docker.executeInContainerAsRoot(containerName, 1L, "sh", "-c", "sleep 5"); } @@ -128,7 +130,8 @@ public class DockerTest { final ContainerName containerName = new ContainerName("docker-test-foo"); final String containerHostname = "hostName1"; - docker.createContainerCommand(dockerImage, containerName, containerHostname).withManagedBy(MANAGER_NAME).create(); + docker.createContainerCommand(dockerImage, ContainerResources.UNLIMITED, containerName, containerHostname) + .withManagedBy(MANAGER_NAME).create(); docker.startContainer(containerName); docker.executeInContainerAsRoot(containerName, 2L, "sh", "-c", "echo hei"); @@ -145,11 +148,13 @@ public class DockerTest { InetAddress inetAddress1 = InetAddress.getByName("172.18.10.10"); InetAddress inetAddress2 = InetAddress.getByName("172.18.10.11"); - docker.createContainerCommand(dockerImage, containerName1, hostName1).withManagedBy(MANAGER_NAME) + docker.createContainerCommand(dockerImage, ContainerResources.UNLIMITED, containerName1, hostName1) + .withManagedBy(MANAGER_NAME) .withNetworkMode(DockerImpl.DOCKER_CUSTOM_MACVLAN_NETWORK_NAME).withIpAddress(inetAddress1).create(); docker.startContainer(containerName1); - docker.createContainerCommand(dockerImage, containerName2, hostName2).withManagedBy(MANAGER_NAME) + docker.createContainerCommand(dockerImage, ContainerResources.UNLIMITED, containerName2, hostName2) + .withManagedBy(MANAGER_NAME) .withNetworkMode(DockerImpl.DOCKER_CUSTOM_MACVLAN_NETWORK_NAME).withIpAddress(inetAddress2).create(); docker.startContainer(containerName2); diff --git a/docker-api/src/test/java/com/yahoo/vespa/hosted/dockerapi/RunSystemTests.java b/docker-api/src/test/java/com/yahoo/vespa/hosted/dockerapi/RunSystemTests.java index 9613470a735..715c839e531 100644 --- a/docker-api/src/test/java/com/yahoo/vespa/hosted/dockerapi/RunSystemTests.java +++ b/docker-api/src/test/java/com/yahoo/vespa/hosted/dockerapi/RunSystemTests.java @@ -126,6 +126,7 @@ public class RunSystemTests { InetAddress nodeInetAddress = InetAddress.getByName(containerName.asString()); docker.createContainerCommand( SYSTEMTESTS_DOCKER_IMAGE, + ContainerResources.UNLIMITED, containerName, containerName.asString()) .withNetworkMode(DockerImpl.DOCKER_CUSTOM_MACVLAN_NETWORK_NAME) -- cgit v1.2.3