Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add option to keep trying to remove containers, even if one fails #1251

Merged
merged 2 commits into from
Jan 8, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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