summaryrefslogtreecommitdiffstats
path: root/node-admin
diff options
context:
space:
mode:
authorValerij Fredriksen <valerijf@oath.com>2019-01-11 12:59:08 +0100
committerValerij Fredriksen <valerij92@gmail.com>2019-01-11 21:19:47 +0100
commit48814afebb0b8a718b873d8bf9794837050a17d4 (patch)
treeda11e7ebc12411a40e54b7c417e898d0c3b501c3 /node-admin
parent50d4755fedcec858bbc124f6a43db71685fea8c6 (diff)
Add support for setting cpu quota with ContainerResources
Diffstat (limited to 'node-admin')
-rw-r--r--node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/docker/DockerOperationsImpl.java8
-rw-r--r--node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeagent/NodeAgentImpl.java2
-rw-r--r--node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/DockerFailTest.java7
-rw-r--r--node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/DockerMock.java43
-rw-r--r--node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/MultiDockerTest.java4
-rw-r--r--node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/RebootTest.java3
-rw-r--r--node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/RestartTest.java3
-rw-r--r--node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/nodeagent/NodeAgentImplTest.java2
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)) :