aboutsummaryrefslogtreecommitdiffstats
path: root/node-admin
diff options
context:
space:
mode:
authorValerij Fredriksen <valerijf@verizonmedia.com>2021-01-06 08:46:26 +0100
committerValerij Fredriksen <valerijf@verizonmedia.com>2021-01-06 09:43:37 +0100
commit4c9fff6e2773ce76529f7f406089dd2b5b2d5d90 (patch)
treea440f9b9d300e6a91aa8d1292cdff0cd27a3788f /node-admin
parent06069e0d77a03bb94888d344b1ac83bd58a5cdd6 (diff)
Add method to retain managed containers
Diffstat (limited to 'node-admin')
-rw-r--r--node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/docker/ContainerOperations.java5
-rw-r--r--node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/docker/ContainerOperationsImpl.java13
-rw-r--r--node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/docker/ContainerOperationsImplTest.java14
-rw-r--r--node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/ContainerEngineMock.java5
4 files changed, 36 insertions, 1 deletions
diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/docker/ContainerOperations.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/docker/ContainerOperations.java
index 8d62196d092..c8fd4c077ce 100644
--- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/docker/ContainerOperations.java
+++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/docker/ContainerOperations.java
@@ -3,6 +3,7 @@ package com.yahoo.vespa.hosted.node.admin.docker;
import com.yahoo.config.provision.DockerImage;
import com.yahoo.vespa.hosted.dockerapi.Container;
+import com.yahoo.vespa.hosted.dockerapi.ContainerName;
import com.yahoo.vespa.hosted.dockerapi.ContainerResources;
import com.yahoo.vespa.hosted.dockerapi.ContainerStats;
import com.yahoo.vespa.hosted.dockerapi.ProcessResult;
@@ -14,6 +15,7 @@ import com.yahoo.vespa.hosted.node.admin.task.util.process.CommandResult;
import java.time.Duration;
import java.util.List;
import java.util.Optional;
+import java.util.Set;
/**
* @author hakonhall
@@ -59,6 +61,9 @@ public interface ContainerOperations {
boolean noManagedContainersRunning();
+ /** Stops and removes all managed containers except the ones given in {@code containerNames} */
+ boolean retainManagedContainers(Set<ContainerName> containerNames);
+
/** Deletes the local images that are currently not in use by any container and not recently used. */
boolean deleteUnusedContainerImages(List<DockerImage> excludes, Duration minImageAgeToDelete);
diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/docker/ContainerOperationsImpl.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/docker/ContainerOperationsImpl.java
index a6f2184179e..0a1cac73882 100644
--- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/docker/ContainerOperationsImpl.java
+++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/docker/ContainerOperationsImpl.java
@@ -8,6 +8,7 @@ import com.yahoo.config.provision.NodeType;
import com.yahoo.config.provision.SystemName;
import com.yahoo.vespa.hosted.dockerapi.Container;
import com.yahoo.vespa.hosted.dockerapi.ContainerEngine;
+import com.yahoo.vespa.hosted.dockerapi.ContainerName;
import com.yahoo.vespa.hosted.dockerapi.ContainerResources;
import com.yahoo.vespa.hosted.dockerapi.ContainerStats;
import com.yahoo.vespa.hosted.dockerapi.ProcessResult;
@@ -43,7 +44,7 @@ public class ContainerOperationsImpl implements ContainerOperations {
private static final Logger logger = Logger.getLogger(ContainerOperationsImpl.class.getName());
- private static final String MANAGER_NAME = "node-admin";
+ static final String MANAGER_NAME = "node-admin";
private static final InetAddress IPV6_NPT_PREFIX = InetAddresses.forString("fd00::");
private static final InetAddress IPV4_NPT_PREFIX = InetAddresses.forString("172.17.0.0");
@@ -325,6 +326,16 @@ public class ContainerOperationsImpl implements ContainerOperations {
}
@Override
+ public boolean retainManagedContainers(Set<ContainerName> containerNames) {
+ return containerEngine.listManagedContainers(MANAGER_NAME).stream()
+ .filter(containerName -> ! containerNames.contains(containerName))
+ .peek(containerName -> {
+ containerEngine.stopContainer(containerName);
+ containerEngine.deleteContainer(containerName);
+ }).count() > 0;
+ }
+
+ @Override
public boolean deleteUnusedContainerImages(List<DockerImage> excludes, Duration minImageAgeToDelete) {
return containerEngine.deleteUnusedDockerImages(excludes, minImageAgeToDelete);
}
diff --git a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/docker/ContainerOperationsImplTest.java b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/docker/ContainerOperationsImplTest.java
index 4bbe7354ecb..b8eb9187265 100644
--- a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/docker/ContainerOperationsImplTest.java
+++ b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/docker/ContainerOperationsImplTest.java
@@ -19,8 +19,10 @@ import org.mockito.InOrder;
import java.net.InetAddress;
import java.nio.file.FileSystem;
+import java.util.List;
import java.util.Optional;
import java.util.OptionalLong;
+import java.util.Set;
import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertThat;
@@ -123,4 +125,16 @@ public class ContainerOperationsImplTest {
"0:0:0:0:0:0:0:1 hostname\n" +
"127.0.0.1 hostname\n");
}
+
+ @Test
+ public void retainContainersTest() {
+ when(containerEngine.listManagedContainers(ContainerOperationsImpl.MANAGER_NAME))
+ .thenReturn(List.of(new ContainerName("cnt1"), new ContainerName("cnt2"), new ContainerName("cnt3")));
+ dockerOperations.retainManagedContainers(Set.of(new ContainerName("cnt2"), new ContainerName("cnt4")));
+
+ verify(containerEngine).stopContainer(eq(new ContainerName("cnt1")));
+ verify(containerEngine).deleteContainer(eq(new ContainerName("cnt1")));
+ verify(containerEngine).stopContainer(eq(new ContainerName("cnt3")));
+ verify(containerEngine).deleteContainer(eq(new ContainerName("cnt3")));
+ }
}
diff --git a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/ContainerEngineMock.java b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/ContainerEngineMock.java
index 121dca54e37..ef6564db2a5 100644
--- a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/ContainerEngineMock.java
+++ b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/ContainerEngineMock.java
@@ -97,6 +97,11 @@ public class ContainerEngineMock implements ContainerEngine {
return false;
}
+ @Override
+ public List<ContainerName> listManagedContainers(String manager) {
+ return List.copyOf(containersByContainerName.keySet());
+ }
+
public class StartContainerCommandMock implements CreateContainerCommand {
private final DockerImage dockerImage;