aboutsummaryrefslogtreecommitdiffstats
path: root/node-admin/src
diff options
context:
space:
mode:
authorValerij Fredriksen <valerijf@verizonmedia.com>2019-03-08 12:33:44 +0100
committerValerij Fredriksen <valerijf@verizonmedia.com>2019-03-08 12:33:44 +0100
commitb172653f49ecd77d998e7a0161a96f6110dfcb1a (patch)
tree506331bc3fc67947e5ef59a3bc9641c9cef174c2 /node-admin/src
parent7e51084bc313996886f4398818a55989a4ad95e4 (diff)
Set container CPU cap on container create
Diffstat (limited to 'node-admin/src')
-rw-r--r--node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/docker/DockerOperations.java2
-rw-r--r--node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/docker/DockerOperationsImpl.java5
-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/nodeagent/NodeAgentImplTest.java24
4 files changed, 16 insertions, 17 deletions
diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/docker/DockerOperations.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/docker/DockerOperations.java
index 3a01bc0bbd3..5c0e8f81704 100644
--- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/docker/DockerOperations.java
+++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/docker/DockerOperations.java
@@ -13,7 +13,7 @@ import java.util.Optional;
public interface DockerOperations {
- void createContainer(NodeAgentContext context, ContainerData containerData);
+ void createContainer(NodeAgentContext context, ContainerData containerData, ContainerResources containerResources);
void startContainer(NodeAgentContext context);
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 38dbd8e05f6..42d442deddf 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
@@ -53,7 +53,7 @@ public class DockerOperationsImpl implements DockerOperations {
}
@Override
- public void createContainer(NodeAgentContext context, ContainerData containerData) {
+ public void createContainer(NodeAgentContext context, ContainerData containerData, ContainerResources containerResources) {
context.log(logger, "Creating container");
// IPv6 - Assume always valid
@@ -64,8 +64,7 @@ public class DockerOperationsImpl implements DockerOperations {
Docker.CreateContainerCommand command = docker.createContainerCommand(
context.node().getWantedDockerImage().get(), context.containerName())
.withHostName(context.node().getHostname())
- .withResources(ContainerResources.from(
- 0, context.node().getMinCpuCores(), context.node().getMinMainMemoryAvailableGb()))
+ .withResources(containerResources)
.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 781b036e484..c4bef1fcc2f 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
@@ -202,7 +202,7 @@ public class NodeAgentImpl implements NodeAgent {
private void startContainer(NodeAgentContext context) {
ContainerData containerData = createContainerData(context);
- dockerOperations.createContainer(context, containerData);
+ dockerOperations.createContainer(context, containerData, getContainerResources(context.node()));
dockerOperations.startContainer(context);
lastCpuMetric = new CpuUsageReporter();
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 577f8e9573d..bb11961d346 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
@@ -168,7 +168,7 @@ public class NodeAgentImplTest {
nodeAgent.stopForHostSuspension();
nodeAgent.doConverge(context);
- inOrder.verify(dockerOperations, times(1)).createContainer(eq(context), any());
+ inOrder.verify(dockerOperations, times(1)).createContainer(eq(context), any(), any());
inOrder.verify(dockerOperations, times(1)).startContainer(eq(context));
inOrder.verify(dockerOperations, times(0)).startServices(eq(context)); // done as part of startContainer
inOrder.verify(dockerOperations, times(1)).resumeNode(eq(context));
@@ -200,7 +200,7 @@ public class NodeAgentImplTest {
final InOrder inOrder = inOrder(dockerOperations, orchestrator, nodeRepository, aclMaintainer, healthChecker);
inOrder.verify(dockerOperations, times(1)).pullImageAsyncIfNeeded(eq(dockerImage));
- inOrder.verify(dockerOperations, times(1)).createContainer(eq(context), any());
+ inOrder.verify(dockerOperations, times(1)).createContainer(eq(context), any(), any());
inOrder.verify(dockerOperations, times(1)).startContainer(eq(context));
inOrder.verify(aclMaintainer, times(1)).converge(eq(context));
inOrder.verify(dockerOperations, times(1)).resumeNode(eq(context));
@@ -310,7 +310,7 @@ public class NodeAgentImplTest {
inOrder.verify(orchestrator).resume(any(String.class));
inOrder.verify(orchestrator).suspend(any(String.class));
inOrder.verify(dockerOperations).removeContainer(eq(secondContext), any());
- inOrder.verify(dockerOperations, times(1)).createContainer(eq(secondContext), any());
+ inOrder.verify(dockerOperations, times(1)).createContainer(eq(secondContext), any(), any());
inOrder.verify(dockerOperations).startContainer(eq(secondContext));
inOrder.verify(dockerOperations, never()).updateContainer(any(), any());
@@ -343,7 +343,7 @@ public class NodeAgentImplTest {
fail("Expected to throw an exception");
} catch (OrchestratorException ignored) { }
- verify(dockerOperations, never()).createContainer(eq(context), any());
+ verify(dockerOperations, never()).createContainer(eq(context), any(), any());
verify(dockerOperations, never()).startContainer(eq(context));
verify(orchestrator, never()).resume(any(String.class));
verify(nodeRepository, never()).updateNodeAttributes(any(String.class), any(NodeAttributes.class));
@@ -382,7 +382,7 @@ public class NodeAgentImplTest {
// First time we fail to resume because health verification fails
verify(orchestrator, times(1)).suspend(eq(hostName));
verify(dockerOperations, times(1)).removeContainer(eq(context), any());
- verify(dockerOperations, times(1)).createContainer(eq(context), any());
+ verify(dockerOperations, times(1)).createContainer(eq(context), any(), any());
verify(dockerOperations, times(1)).startContainer(eq(context));
verify(orchestrator, never()).resume(eq(hostName));
verify(nodeRepository, never()).updateNodeAttributes(any(), any());
@@ -391,7 +391,7 @@ public class NodeAgentImplTest {
// Do not reboot the container again
verify(dockerOperations, times(1)).removeContainer(eq(context), any());
- verify(dockerOperations, times(1)).createContainer(eq(context), any());
+ verify(dockerOperations, times(1)).createContainer(eq(context), any(), any());
verify(orchestrator, times(1)).resume(eq(hostName));
verify(nodeRepository, times(1)).updateNodeAttributes(eq(hostName), eq(new NodeAttributes()
.withRebootGeneration(wantedRebootGeneration)));
@@ -437,7 +437,7 @@ public class NodeAgentImplTest {
// Should only be called once, when we initialize
verify(dockerOperations, times(1)).getContainer(eq(context));
verify(dockerOperations, never()).removeContainer(eq(context), any());
- verify(dockerOperations, never()).createContainer(eq(context), any());
+ verify(dockerOperations, never()).createContainer(eq(context), any(), any());
verify(dockerOperations, never()).startContainer(eq(context));
verify(orchestrator, never()).resume(any(String.class));
verify(nodeRepository, never()).updateNodeAttributes(eq(hostName), any());
@@ -510,7 +510,7 @@ public class NodeAgentImplTest {
inOrder.verify(storageMaintainer, times(1)).archiveNodeStorage(eq(context));
inOrder.verify(nodeRepository, times(1)).setNodeState(eq(hostName), eq(NodeState.ready));
- verify(dockerOperations, never()).createContainer(eq(context), any());
+ verify(dockerOperations, never()).createContainer(eq(context), any(), any());
verify(dockerOperations, never()).startContainer(eq(context));
verify(dockerOperations, never()).suspendNode(eq(context));
verify(dockerOperations, times(1)).stopServices(eq(context));
@@ -564,7 +564,7 @@ public class NodeAgentImplTest {
nodeAgent.doConverge(context);
verify(dockerOperations, times(1)).removeContainer(eq(context), any());
- verify(dockerOperations, times(1)).createContainer(eq(context), any());
+ verify(dockerOperations, times(1)).createContainer(eq(context), any(), any());
verify(dockerOperations, times(1)).startContainer(eq(context));
}
@@ -626,7 +626,7 @@ public class NodeAgentImplTest {
} catch (DockerException ignored) { }
verify(dockerOperations, never()).removeContainer(eq(context), any());
- verify(dockerOperations, times(1)).createContainer(eq(context), any());
+ verify(dockerOperations, times(1)).createContainer(eq(context), any(), any());
verify(dockerOperations, times(1)).startContainer(eq(context));
verify(nodeAgent, never()).resumeNodeIfNeeded(any());
@@ -636,7 +636,7 @@ public class NodeAgentImplTest {
nodeAgent.doConverge(context);
verify(dockerOperations, times(1)).removeContainer(eq(context), any());
- verify(dockerOperations, times(2)).createContainer(eq(context), any());
+ verify(dockerOperations, times(2)).createContainer(eq(context), any(), any());
verify(dockerOperations, times(2)).startContainer(eq(context));
verify(nodeAgent, times(1)).resumeNodeIfNeeded(any());
}
@@ -746,7 +746,7 @@ public class NodeAgentImplTest {
final InOrder inOrder = inOrder(dockerOperations, orchestrator, nodeRepository, aclMaintainer);
inOrder.verify(dockerOperations, times(1)).pullImageAsyncIfNeeded(eq(dockerImage));
- inOrder.verify(dockerOperations, times(1)).createContainer(eq(context), any());
+ inOrder.verify(dockerOperations, times(1)).createContainer(eq(context), any(), any());
inOrder.verify(dockerOperations, times(1)).startContainer(eq(context));
inOrder.verify(aclMaintainer, times(1)).converge(eq(context));
inOrder.verify(dockerOperations, times(1)).resumeNode(eq(context));