aboutsummaryrefslogtreecommitdiffstats
path: root/node-admin
diff options
context:
space:
mode:
authorValerij Fredriksen <valerijf@oath.com>2018-08-29 23:05:00 +0200
committerValerij Fredriksen <valerij92@gmail.com>2018-08-29 23:37:51 +0200
commitc2a3a001bbc086a307f7900c02ed14798ffb6f61 (patch)
tree14d8ab93318116753ec547e7e017e40cd4bd1278 /node-admin
parent19afff03f1b594b558a19b62352aeb43a8f9b204 (diff)
Do not NodeSpec to start/remove container
Diffstat (limited to 'node-admin')
-rw-r--r--node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/docker/DockerOperations.java4
-rw-r--r--node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/docker/DockerOperationsImpl.java45
-rw-r--r--node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeagent/NodeAgentImpl.java12
-rw-r--r--node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/nodeagent/NodeAgentImplTest.java44
4 files changed, 46 insertions, 59 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 baf1be41c36..37ab6a08ffb 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
@@ -16,9 +16,9 @@ public interface DockerOperations {
void createContainer(ContainerName containerName, NodeSpec node, ContainerData containerData);
- void startContainer(ContainerName containerName, NodeSpec node);
+ void startContainer(ContainerName containerName);
- void removeContainer(Container existingContainer, NodeSpec node);
+ void removeContainer(Container existingContainer);
Optional<Container> getContainer(ContainerName containerName);
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 03ff1760158..7a51b7243f3 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
@@ -180,36 +180,29 @@ public class DockerOperationsImpl implements DockerOperations {
}
@Override
- public void startContainer(ContainerName containerName, final NodeSpec node) {
+ public void startContainer(ContainerName containerName) {
PrefixLogger logger = PrefixLogger.getNodeAgentLogger(DockerOperationsImpl.class, containerName);
logger.info("Starting container " + containerName);
- try {
- InetAddress nodeInetAddress = environment.getInetAddressForHost(node.getHostname());
- boolean isIPv6 = nodeInetAddress instanceof Inet6Address;
- if (isIPv6) {
- if (!docker.networkNATed()) {
- docker.connectContainerToNetwork(containerName, "bridge");
- }
+ if (!docker.networkNATed()) {
+ docker.connectContainerToNetwork(containerName, "bridge");
+ }
- docker.startContainer(containerName);
- setupContainerNetworkConnectivity(containerName);
- } else {
- docker.startContainer(containerName);
- }
+ docker.startContainer(containerName);
- directoriesToMount.entrySet().stream()
- .filter(Map.Entry::getValue)
- .map(Map.Entry::getKey)
- .forEach(path ->
- docker.executeInContainerAsRoot(containerName, "chmod", "-R", "a+w", path.toString()));
- } catch (IOException e) {
- throw new RuntimeException("Failed to start container " + containerName.asString(), e);
+ if (!docker.networkNATed()) {
+ setupContainerNetworkConnectivity(containerName);
}
+
+ directoriesToMount.entrySet().stream()
+ .filter(Map.Entry::getValue)
+ .map(Map.Entry::getKey)
+ .forEach(path ->
+ docker.executeInContainerAsRoot(containerName, "chmod", "-R", "a+w", path.toString()));
}
@Override
- public void removeContainer(final Container existingContainer, NodeSpec node) {
+ public void removeContainer(Container existingContainer) {
final ContainerName containerName = existingContainer.name;
PrefixLogger logger = PrefixLogger.getNodeAgentLogger(DockerOperationsImpl.class, containerName);
if (existingContainer.state.isRunning()) {
@@ -252,12 +245,10 @@ public class DockerOperationsImpl implements DockerOperations {
* Due to a bug in docker (https://github.com/docker/libnetwork/issues/1443), we need to manually set
* IPv6 gateway in containers connected to more than one docker network
*/
- private void setupContainerNetworkConnectivity(ContainerName containerName) throws IOException {
- if (!docker.networkNATed()) {
- InetAddress hostDefaultGateway = DockerNetworkCreator.getDefaultGatewayLinux(true);
- executeCommandInNetworkNamespace(containerName,
- "route", "-A", "inet6", "add", "default", "gw", hostDefaultGateway.getHostAddress(), "dev", "eth1");
- }
+ private void setupContainerNetworkConnectivity(ContainerName containerName) {
+ InetAddress hostDefaultGateway = uncheck(() -> DockerNetworkCreator.getDefaultGatewayLinux(true));
+ executeCommandInNetworkNamespace(containerName,
+ "route", "-A", "inet6", "add", "default", "gw", hostDefaultGateway.getHostAddress(), "dev", "eth1");
}
@Override
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 9d43e0b8b4f..5f2093c4719 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
@@ -26,7 +26,6 @@ import com.yahoo.vespa.hosted.node.admin.maintenance.identity.AthenzCredentialsM
import com.yahoo.vespa.hosted.node.admin.util.PrefixLogger;
import com.yahoo.vespa.hosted.provision.Node;
-import java.nio.file.Path;
import java.text.SimpleDateFormat;
import java.time.Clock;
import java.time.Duration;
@@ -276,7 +275,7 @@ public class NodeAgentImpl implements NodeAgent {
private void startContainer(NodeSpec node) {
ContainerData containerData = createContainerData(environment, node);
dockerOperations.createContainer(containerName, node, containerData);
- dockerOperations.startContainer(containerName, node);
+ dockerOperations.startContainer(containerName);
lastCpuMetric = new CpuUsageReporter();
resumeScriptRun = false;
@@ -364,7 +363,7 @@ public class NodeAgentImpl implements NodeAgent {
}
}
stopFilebeatSchedulerIfNeeded();
- dockerOperations.removeContainer(existingContainer, node);
+ dockerOperations.removeContainer(existingContainer);
containerState = ABSENT;
logger.info("Container successfully removed, new containerState is " + containerState);
return Optional.empty();
@@ -738,11 +737,8 @@ public class NodeAgentImpl implements NodeAgent {
}
protected ContainerData createContainerData(Environment environment, NodeSpec node) {
- return new ContainerData() {
- @Override
- public void addFile(Path pathInContainer, String data) {
- throw new UnsupportedOperationException("addFile not implemented");
- }
+ return (pathInContainer, data) -> {
+ throw new UnsupportedOperationException("addFile not implemented");
};
}
}
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 782917ab7c0..f5d4dcf4e5e 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
@@ -123,7 +123,7 @@ public class NodeAgentImplTest {
nodeAgent.converge();
- verify(dockerOperations, never()).removeContainer(any(), any());
+ verify(dockerOperations, never()).removeContainer(any());
verify(orchestrator, never()).suspend(any(String.class));
verify(dockerOperations, never()).pullImageAsyncIfNeeded(any());
verify(storageMaintainer, never()).removeOldFilesFromNode(eq(containerName));
@@ -182,13 +182,13 @@ public class NodeAgentImplTest {
nodeAgent.converge();
- verify(dockerOperations, never()).removeContainer(any(), any());
+ verify(dockerOperations, never()).removeContainer(any());
verify(orchestrator, never()).suspend(any(String.class));
final InOrder inOrder = inOrder(dockerOperations, orchestrator, nodeRepository, aclMaintainer);
inOrder.verify(dockerOperations, times(1)).pullImageAsyncIfNeeded(eq(dockerImage));
inOrder.verify(dockerOperations, times(1)).createContainer(eq(containerName), eq(node), any());
- inOrder.verify(dockerOperations, times(1)).startContainer(eq(containerName), eq(node));
+ inOrder.verify(dockerOperations, times(1)).startContainer(eq(containerName));
inOrder.verify(aclMaintainer, times(1)).run();
inOrder.verify(dockerOperations, times(1)).resumeNode(eq(containerName));
inOrder.verify(nodeRepository).updateNodeAttributes(
@@ -224,7 +224,7 @@ public class NodeAgentImplTest {
verify(orchestrator, never()).suspend(any(String.class));
verify(orchestrator, never()).resume(any(String.class));
- verify(dockerOperations, never()).removeContainer(any(), any());
+ verify(dockerOperations, never()).removeContainer(any());
final InOrder inOrder = inOrder(dockerOperations);
inOrder.verify(dockerOperations, times(1)).pullImageAsyncIfNeeded(eq(newDockerImage));
@@ -264,9 +264,9 @@ public class NodeAgentImplTest {
inOrder.verify(orchestrator).resume(any(String.class));
inOrder.verify(orchestrator).resume(any(String.class));
inOrder.verify(orchestrator).suspend(any(String.class));
- inOrder.verify(dockerOperations).removeContainer(any(), any());
+ inOrder.verify(dockerOperations).removeContainer(any());
inOrder.verify(dockerOperations, times(1)).createContainer(eq(containerName), eq(thirdSpec), any());
- inOrder.verify(dockerOperations).startContainer(eq(containerName), eq(thirdSpec));
+ inOrder.verify(dockerOperations).startContainer(eq(containerName));
inOrder.verify(orchestrator).resume(any(String.class));
}
@@ -292,7 +292,7 @@ public class NodeAgentImplTest {
} catch (Exception ignored) { }
verify(dockerOperations, never()).createContainer(eq(containerName), eq(node), any());
- verify(dockerOperations, never()).startContainer(eq(containerName), eq(node));
+ verify(dockerOperations, never()).startContainer(eq(containerName));
verify(orchestrator, never()).resume(any(String.class));
verify(nodeRepository, never()).updateNodeAttributes(any(String.class), any(NodeAttributes.class));
}
@@ -316,7 +316,7 @@ public class NodeAgentImplTest {
nodeAgent.converge();
- verify(dockerOperations, never()).removeContainer(any(), any());
+ verify(dockerOperations, never()).removeContainer(any());
verify(orchestrator, never()).resume(any(String.class));
verify(nodeRepository, never()).updateNodeAttributes(eq(hostName), any());
}
@@ -342,9 +342,9 @@ public class NodeAgentImplTest {
// Should only be called once, when we initialize
verify(dockerOperations, times(1)).getContainer(eq(containerName));
- verify(dockerOperations, never()).removeContainer(any(), any());
+ verify(dockerOperations, never()).removeContainer(any());
verify(dockerOperations, never()).createContainer(eq(containerName), eq(node), any());
- verify(dockerOperations, never()).startContainer(eq(containerName), eq(node));
+ verify(dockerOperations, never()).startContainer(eq(containerName));
verify(orchestrator, never()).resume(any(String.class));
verify(nodeRepository, never()).updateNodeAttributes(eq(hostName), any());
}
@@ -372,7 +372,7 @@ public class NodeAgentImplTest {
nodeAgent.converge();
final InOrder inOrder = inOrder(storageMaintainer, dockerOperations);
- inOrder.verify(dockerOperations, never()).removeContainer(any(), any());
+ inOrder.verify(dockerOperations, never()).removeContainer(any());
verify(orchestrator, never()).resume(any(String.class));
verify(nodeRepository, never()).updateNodeAttributes(eq(hostName), any());
@@ -419,12 +419,12 @@ public class NodeAgentImplTest {
nodeAgent.converge();
final InOrder inOrder = inOrder(storageMaintainer, dockerOperations, nodeRepository);
- inOrder.verify(dockerOperations, times(1)).removeContainer(any(), any());
+ inOrder.verify(dockerOperations, times(1)).removeContainer(any());
inOrder.verify(storageMaintainer, times(1)).cleanupNodeStorage(eq(containerName), eq(node));
inOrder.verify(nodeRepository, times(1)).setNodeState(eq(hostName), eq(Node.State.ready));
verify(dockerOperations, never()).createContainer(eq(containerName), any(), any());
- verify(dockerOperations, never()).startContainer(eq(containerName), any());
+ verify(dockerOperations, never()).startContainer(eq(containerName));
verify(orchestrator, never()).resume(any(String.class));
verify(orchestrator, never()).suspend(any(String.class));
// current Docker image and vespa version should be cleared
@@ -477,9 +477,9 @@ public class NodeAgentImplTest {
nodeAgent.tick();
- verify(dockerOperations, times(1)).removeContainer(any(), any());
+ verify(dockerOperations, times(1)).removeContainer(any());
verify(dockerOperations, times(1)).createContainer(eq(containerName), eq(node), any());
- verify(dockerOperations, times(1)).startContainer(eq(containerName), eq(node));
+ verify(dockerOperations, times(1)).startContainer(eq(containerName));
}
@Test
@@ -568,16 +568,16 @@ public class NodeAgentImplTest {
when(pathResolver.getApplicationStoragePathForHost()).thenReturn(Files.createTempDirectory("bar"));
when(dockerOperations.pullImageAsyncIfNeeded(eq(dockerImage))).thenReturn(false);
when(storageMaintainer.getDiskUsageFor(eq(containerName))).thenReturn(Optional.of(201326592000L));
- doThrow(new DockerException("Failed to set up network")).doNothing().when(dockerOperations).startContainer(eq(containerName), eq(node));
+ doThrow(new DockerException("Failed to set up network")).doNothing().when(dockerOperations).startContainer(eq(containerName));
try {
nodeAgent.converge();
fail("Expected to get DockerException");
} catch (DockerException ignored) { }
- verify(dockerOperations, never()).removeContainer(any(), any());
+ verify(dockerOperations, never()).removeContainer(any());
verify(dockerOperations, times(1)).createContainer(eq(containerName), eq(node), any());
- verify(dockerOperations, times(1)).startContainer(eq(containerName), eq(node));
+ verify(dockerOperations, times(1)).startContainer(eq(containerName));
verify(nodeAgent, never()).runLocalResumeScriptIfNeeded(any());
// The docker container was actually started and is running, but subsequent exec calls to set up
@@ -585,9 +585,9 @@ public class NodeAgentImplTest {
mockGetContainer(dockerImage, true);
nodeAgent.converge();
- verify(dockerOperations, times(1)).removeContainer(any(), eq(node));
+ verify(dockerOperations, times(1)).removeContainer(any());
verify(dockerOperations, times(2)).createContainer(eq(containerName), eq(node), any());
- verify(dockerOperations, times(2)).startContainer(eq(containerName), eq(node));
+ verify(dockerOperations, times(2)).startContainer(eq(containerName));
verify(nodeAgent, times(1)).runLocalResumeScriptIfNeeded(any());
}
@@ -695,13 +695,13 @@ public class NodeAgentImplTest {
nodeAgent.converge();
- verify(dockerOperations, never()).removeContainer(any(), any());
+ verify(dockerOperations, never()).removeContainer(any());
verify(orchestrator, never()).suspend(any(String.class));
final InOrder inOrder = inOrder(dockerOperations, orchestrator, nodeRepository, aclMaintainer);
inOrder.verify(dockerOperations, times(1)).pullImageAsyncIfNeeded(eq(dockerImage));
inOrder.verify(dockerOperations, times(1)).createContainer(eq(containerName), eq(node), any());
- inOrder.verify(dockerOperations, times(1)).startContainer(eq(containerName), eq(node));
+ inOrder.verify(dockerOperations, times(1)).startContainer(eq(containerName));
inOrder.verify(aclMaintainer, times(1)).run();
inOrder.verify(dockerOperations, times(1)).resumeNode(eq(containerName));
inOrder.verify(nodeRepository).updateNodeAttributes(