Skip to content

Commit

Permalink
Add option to keep trying to remove containers, even if one fails (#1251
Browse files Browse the repository at this point in the history
)

Signed-off-by: Jeschke, Peter Rene <jeschke@gemtec.eu>
  • Loading branch information
peterjeschke authored and rhuss committed Jan 8, 2020
1 parent b5bf2a7 commit 8d207af
Show file tree
Hide file tree
Showing 2 changed files with 68 additions and 18 deletions.
45 changes: 34 additions & 11 deletions src/main/java/io/fabric8/maven/docker/StopMojo.java
Original file line number Diff line number Diff line change
@@ -1,15 +1,23 @@
package io.fabric8.maven.docker;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;

import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugins.annotations.LifecyclePhase;
import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.Parameter;

import io.fabric8.maven.docker.access.DockerAccessException;
import io.fabric8.maven.docker.access.ExecException;
import io.fabric8.maven.docker.config.ImageConfiguration;
import io.fabric8.maven.docker.config.NetworkConfig;
Expand All @@ -23,10 +31,6 @@
import io.fabric8.maven.docker.util.GavLabel;
import io.fabric8.maven.docker.util.NamePatternUtil;

import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugins.annotations.LifecyclePhase;
import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.Parameter;

/**
* Mojo for stopping containers. If called together with <code>docker:start</code> (i.e.
Expand Down Expand Up @@ -92,29 +96,48 @@ private void stopContainers(QueryService queryService, RunService runService, Ga
throws MojoExecutionException, IOException, ExecException {

Collection<Network> networksToRemove = getNetworksToRemove(queryService, gavLabel);

List<DockerAccessException> thrownExceptions = new ArrayList<>();
for (ImageConfiguration image : getResolvedImages()) {

Collection<Container> existingContainers
= getContainersForImage(queryService, image);

for (Container container : existingContainers) {
if (shouldStopContainer(container, gavLabel)) {
runService.stopContainer(container.getId(), image, keepContainer, removeVolumes);
try {
runService.stopContainer(container.getId(), image, keepContainer, removeVolumes);
} catch (DockerAccessException exc) {
thrownExceptions.add(exc);
}
}
}
}

// If the mojo has a stopNamePattern, check to see if there are matching containers
for (Container container : getContainersForMojo(queryService)) {
if (shouldStopContainer(container, gavLabel)) {
runService.stopContainer(container.getId(),
new ImageConfiguration.Builder().name(container.getImage()).build(),
keepContainer, removeVolumes);
try {
runService.stopContainer(container.getId(),
new ImageConfiguration.Builder().name(container.getImage()).build(),
keepContainer, removeVolumes);
} catch (DockerAccessException exc) {
thrownExceptions.add(exc);
}
}
}

runService.removeCustomNetworks(networksToRemove);
try {
runService.removeCustomNetworks(networksToRemove);
} catch (DockerAccessException exc) {
thrownExceptions.add(exc);
}

if (!thrownExceptions.isEmpty()) {
DockerAccessException exception = new DockerAccessException("At least one exception thrown during container removal.");
for (DockerAccessException dae : thrownExceptions) {
exception.addSuppressed(dae);
}
throw exception;
}
}

private Collection<Container> getContainersForPattern(QueryService queryService, Matcher imageNameMatcher,
Expand Down
41 changes: 34 additions & 7 deletions src/main/java/io/fabric8/maven/docker/service/RunService.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package io.fabric8.maven.docker.service;

import static io.fabric8.maven.docker.util.VolumeBindingUtil.resolveRelativeVolumeBindings;

/*
*
* Copyright 2014 Roland Huss
Expand All @@ -21,7 +23,6 @@
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
Expand Down Expand Up @@ -61,8 +62,6 @@
import io.fabric8.maven.docker.wait.WaitTimeoutException;
import io.fabric8.maven.docker.wait.WaitUtil;

import static io.fabric8.maven.docker.util.VolumeBindingUtil.resolveRelativeVolumeBindings;


/**
* Service class for helping in running containers.
Expand Down Expand Up @@ -207,12 +206,28 @@ public void stopStartedContainers(boolean keepContainer,
boolean removeCustomNetworks,
GavLabel gavLabel)
throws DockerAccessException, ExecException {
List<DockerAccessException> thrownExceptions = new ArrayList<>();
Set<Network> networksToRemove = new HashSet<>();
for (ContainerTracker.ContainerShutdownDescriptor descriptor : tracker.removeShutdownDescriptors(gavLabel)) {
collectCustomNetworks(networksToRemove, descriptor, removeCustomNetworks);
shutdown(descriptor, keepContainer, removeVolumes);
try {
collectCustomNetworks(networksToRemove, descriptor, removeCustomNetworks);
shutdown(descriptor, keepContainer, removeVolumes);
} catch (DockerAccessException exc) {
thrownExceptions.add(exc);
}
}
try {
removeCustomNetworks(networksToRemove);
} catch (DockerAccessException exc) {
thrownExceptions.add(exc);
}
removeCustomNetworks(networksToRemove);
if (!thrownExceptions.isEmpty()) {
DockerAccessException exception = new DockerAccessException("At least one exception thrown during container removal.");
for (DockerAccessException dae : thrownExceptions) {
exception.addSuppressed(dae);
}
throw exception;
}
}

private void collectCustomNetworks(Set<Network> networksToRemove, ContainerTracker.ContainerShutdownDescriptor descriptor, boolean removeCustomNetworks) throws DockerAccessException {
Expand Down Expand Up @@ -506,8 +521,20 @@ public void createCustomNetworkIfNotExistant(String customNetwork) throws Docker
}

public void removeCustomNetworks(Collection<Network> networks) throws DockerAccessException {
List<DockerAccessException> thrownExceptions = new ArrayList<>();
for (Network network : networks) {
docker.removeNetwork(network.getId());
try {
docker.removeNetwork(network.getId());
} catch (DockerAccessException exc) {
thrownExceptions.add(exc);
}
}
if (!thrownExceptions.isEmpty()) {
DockerAccessException exception = new DockerAccessException("At least one exception was thrown while trying to remove custom networks.");
for (DockerAccessException dae : thrownExceptions) {
exception.addSuppressed(dae);
}
throw exception;
}
}

Expand Down

0 comments on commit 8d207af

Please sign in to comment.