package org.arquillian.cube.docker.impl.client.containerobject.dsl;
import org.arquillian.cube.docker.impl.docker.DockerClientExecutor;
import org.arquillian.cube.docker.impl.model.NetworkRegistry;
import org.arquillian.cube.spi.metadata.IsNetworkContainerObject;
import org.jboss.arquillian.core.api.Instance;
import org.jboss.arquillian.core.api.annotation.Inject;
import org.jboss.arquillian.core.api.annotation.Observes;
import org.jboss.arquillian.test.spi.event.suite.AfterClass;
import java.util.List;
import java.util.logging.Logger;
import java.util.stream.Collectors;
/**
* Observer that removes network objects after test execution.
*/
public class AfterClassNetworkContainerObserver {
private static Logger logger = Logger.getLogger(AfterClassNetworkContainerObserver.class.getName());
@Inject
Instance<DockerClientExecutor> dockerClientExecutorInstance;
@Inject
private Instance<NetworkRegistry> networkRegistryInstance;
//To be executed after container objects are stopped (AfterClassContainerObjectObserver)
public void stopNetworkObjects(@Observes(precedence = 90) AfterClass afterClass) {
final NetworkRegistry networkRegistry = networkRegistryInstance.get();
final List<String> networksToRemove = networkRegistry.getNetworkIds()
.stream()
.filter(id -> networkRegistry.getNetwork(id).hasMetadata(IsNetworkContainerObject.class))
.collect(Collectors.toList());
// To avoid Concurrent modification exception
networksToRemove.stream().forEach(id -> {
logger.fine(String.format("Stopping Network %s", id));
dockerClientExecutorInstance.get().removeNetwork(id);
networkRegistry.removeNetwork(id);
});
}
}