diff options
author | Valerij Fredriksen <valerijf@oath.com> | 2019-01-11 12:59:08 +0100 |
---|---|---|
committer | Valerij Fredriksen <valerij92@gmail.com> | 2019-01-11 21:19:47 +0100 |
commit | 48814afebb0b8a718b873d8bf9794837050a17d4 (patch) | |
tree | da11e7ebc12411a40e54b7c417e898d0c3b501c3 /node-admin | |
parent | 50d4755fedcec858bbc124f6a43db71685fea8c6 (diff) |
Add support for setting cpu quota with ContainerResources
Diffstat (limited to 'node-admin')
8 files changed, 41 insertions, 31 deletions
diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/docker/DockerOperationsImpl.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/docker/DockerOperationsImpl.java index e1b77b6a41b..5edbf98e4bb 100644 --- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/docker/DockerOperationsImpl.java +++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/docker/DockerOperationsImpl.java @@ -63,10 +63,10 @@ public class DockerOperationsImpl implements DockerOperations { ". Missing an AAAA DNS entry?")); Docker.CreateContainerCommand command = docker.createContainerCommand( - context.node().getWantedDockerImage().get(), - ContainerResources.from(context.node().getMinCpuCores(), context.node().getMinMainMemoryAvailableGb()), - context.containerName(), - context.node().getHostname()) + context.node().getWantedDockerImage().get(), context.containerName()) + .withHostName(context.node().getHostname()) + .withResources(ContainerResources.from( + 0, context.node().getMinCpuCores(), context.node().getMinMainMemoryAvailableGb())) .withManagedBy(MANAGER_NAME) .withUlimit("nofile", 262_144, 262_144) // The nproc aka RLIMIT_NPROC resource limit works as follows: diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeagent/NodeAgentImpl.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeagent/NodeAgentImpl.java index 0bfff82a055..a58aaa24575 100644 --- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeagent/NodeAgentImpl.java +++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeagent/NodeAgentImpl.java @@ -311,7 +311,7 @@ public class NodeAgentImpl implements NodeAgent { } ContainerResources wantedContainerResources = ContainerResources.from( - node.getMinCpuCores(), node.getMinMainMemoryAvailableGb()); + 0, node.getMinCpuCores(), node.getMinMainMemoryAvailableGb()); if (!wantedContainerResources.equals(existingContainer.resources)) { return Optional.of("Container should be running with different resource allocation, wanted: " + wantedContainerResources + ", actual: " + existingContainer.resources); diff --git a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/DockerFailTest.java b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/DockerFailTest.java index b3bf2282988..c7bc8f16477 100644 --- a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/DockerFailTest.java +++ b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/DockerFailTest.java @@ -3,7 +3,6 @@ package com.yahoo.vespa.hosted.node.admin.integrationTests; import com.yahoo.config.provision.NodeType; import com.yahoo.vespa.hosted.dockerapi.ContainerName; -import com.yahoo.vespa.hosted.dockerapi.ContainerResources; import com.yahoo.vespa.hosted.dockerapi.DockerImage; import com.yahoo.vespa.hosted.node.admin.configserver.noderepository.NodeSpec; import com.yahoo.vespa.hosted.provision.Node; @@ -39,16 +38,14 @@ public class DockerFailTest { .minDiskAvailableGb(1) .build()); - tester.inOrder(tester.docker).createContainerCommand( - eq(dockerImage), eq(ContainerResources.from(1, 1)), eq(containerName), eq(hostname)); + tester.inOrder(tester.docker).createContainerCommand(eq(dockerImage), eq(containerName)); tester.inOrder(tester.docker).executeInContainerAsUser( eq(containerName), eq("root"), any(), eq(DockerTester.NODE_PROGRAM), eq("resume")); tester.docker.deleteContainer(new ContainerName("host1")); tester.inOrder(tester.docker).deleteContainer(eq(containerName)); - tester.inOrder(tester.docker).createContainerCommand( - eq(dockerImage), eq(ContainerResources.from(1, 1)), eq(containerName), eq(hostname)); + tester.inOrder(tester.docker).createContainerCommand(eq(dockerImage), eq(containerName)); tester.inOrder(tester.docker).executeInContainerAsUser( eq(containerName), eq("root"), any(), eq(DockerTester.NODE_PROGRAM), eq("resume")); diff --git a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/DockerMock.java b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/DockerMock.java index 75bdaed60cf..f980642a7b8 100644 --- a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/DockerMock.java +++ b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/DockerMock.java @@ -29,17 +29,8 @@ public class DockerMock implements Docker { private static final Object monitor = new Object(); @Override - public CreateContainerCommand createContainerCommand( - DockerImage dockerImage, - ContainerResources containerResources, - ContainerName containerName, - String hostName) { - synchronized (monitor) { - containersByContainerName.put( - containerName, new Container(hostName, dockerImage, containerResources, containerName, Container.State.RUNNING, 2)); - } - - return new StartContainerCommandMock(); + public CreateContainerCommand createContainerCommand(DockerImage dockerImage, ContainerName containerName) { + return new StartContainerCommandMock(dockerImage, containerName); } @Override @@ -100,7 +91,30 @@ public class DockerMock implements Docker { } - public static class StartContainerCommandMock implements CreateContainerCommand { + public class StartContainerCommandMock implements CreateContainerCommand { + + private final DockerImage dockerImage; + private final ContainerName containerName; + private String hostName; + private ContainerResources containerResources; + + public StartContainerCommandMock(DockerImage dockerImage, ContainerName containerName) { + this.dockerImage = dockerImage; + this.containerName = containerName; + } + + @Override + public CreateContainerCommand withHostName(String hostname) { + this.hostName = hostname; + return this; + } + + @Override + public CreateContainerCommand withResources(ContainerResources containerResources) { + this.containerResources = containerResources; + return this; + } + @Override public CreateContainerCommand withLabel(String name, String value) { return this; @@ -163,7 +177,10 @@ public class DockerMock implements Docker { @Override public void create() { - + synchronized (monitor) { + containersByContainerName.put( + containerName, new Container(hostName, dockerImage, containerResources, containerName, Container.State.RUNNING, 2)); + } } } } diff --git a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/MultiDockerTest.java b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/MultiDockerTest.java index 48fdc564aac..16c9239dcd7 100644 --- a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/MultiDockerTest.java +++ b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/MultiDockerTest.java @@ -3,7 +3,6 @@ package com.yahoo.vespa.hosted.node.admin.integrationTests; import com.yahoo.config.provision.NodeType; import com.yahoo.vespa.hosted.dockerapi.ContainerName; -import com.yahoo.vespa.hosted.dockerapi.ContainerResources; import com.yahoo.vespa.hosted.dockerapi.DockerImage; import com.yahoo.vespa.hosted.node.admin.configserver.noderepository.NodeAttributes; import com.yahoo.vespa.hosted.node.admin.configserver.noderepository.NodeSpec; @@ -60,8 +59,7 @@ public class MultiDockerTest { tester.addChildNodeRepositoryNode(nodeSpec); ContainerName containerName = ContainerName.fromHostname(hostName); - tester.inOrder(tester.docker).createContainerCommand( - eq(dockerImage), eq(ContainerResources.from(2, 4)), eq(containerName), eq(hostName)); + tester.inOrder(tester.docker).createContainerCommand(eq(dockerImage), eq(containerName)); tester.inOrder(tester.docker).executeInContainerAsUser( eq(containerName), eq("root"), any(), eq(DockerTester.NODE_PROGRAM), eq("resume")); tester.inOrder(tester.nodeRepository).updateNodeAttributes(eq(hostName), eq(new NodeAttributes().withDockerImage(dockerImage))); diff --git a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/RebootTest.java b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/RebootTest.java index 7e17e2df530..295368e0426 100644 --- a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/RebootTest.java +++ b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/RebootTest.java @@ -33,8 +33,7 @@ public class RebootTest { try (DockerTester tester = new DockerTester()) { tester.addChildNodeRepositoryNode(createNodeRepositoryNode()); - tester.inOrder(tester.docker).createContainerCommand( - eq(dockerImage), eq(ContainerResources.from(0, 0)), eq(new ContainerName("host1")), eq(hostname)); + tester.inOrder(tester.docker).createContainerCommand(eq(dockerImage), eq(new ContainerName("host1"))); try { tester.setWantedState(NodeAdminStateUpdater.State.SUSPENDED); diff --git a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/RestartTest.java b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/RestartTest.java index 4cf349562a3..f9f455cca79 100644 --- a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/RestartTest.java +++ b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/RestartTest.java @@ -36,8 +36,7 @@ public class RestartTest { .currentRestartGeneration(1) .build()); - tester.inOrder(tester.docker).createContainerCommand( - eq(dockerImage), any(), eq(new ContainerName("host1")), eq(hostname)); + tester.inOrder(tester.docker).createContainerCommand(eq(dockerImage), eq(new ContainerName("host1"))); tester.inOrder(tester.nodeRepository).updateNodeAttributes( eq(hostname), eq(new NodeAttributes().withDockerImage(dockerImage))); diff --git a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/nodeagent/NodeAgentImplTest.java b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/nodeagent/NodeAgentImplTest.java index e392ac34414..7eee068e472 100644 --- a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/nodeagent/NodeAgentImplTest.java +++ b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/nodeagent/NodeAgentImplTest.java @@ -715,7 +715,7 @@ public class NodeAgentImplTest { Optional.of(new Container( hostName, dockerImage, - ContainerResources.from(MIN_CPU_CORES, MIN_MAIN_MEMORY_AVAILABLE_GB), + ContainerResources.from(0, MIN_CPU_CORES, MIN_MAIN_MEMORY_AVAILABLE_GB), ContainerName.fromHostname(hostName), isRunning ? Container.State.RUNNING : Container.State.EXITED, isRunning ? 1 : 0)) : |