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 new naming strategy "auto" #944

Closed
wants to merge 1 commit into from
Closed
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
50 changes: 43 additions & 7 deletions src/main/java/io/fabric8/maven/docker/StartMojo.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,25 +8,48 @@
* the License.
*/

import java.io.IOException;
import java.util.*;
import java.util.concurrent.*;

import com.google.common.util.concurrent.MoreExecutors;
import io.fabric8.maven.docker.access.DockerAccessException;
import io.fabric8.maven.docker.access.ExecException;
import io.fabric8.maven.docker.access.PortMapping;
import io.fabric8.maven.docker.config.*;
import io.fabric8.maven.docker.config.ConfigHelper;
import io.fabric8.maven.docker.config.ImageConfiguration;
import io.fabric8.maven.docker.config.LogConfiguration;
import io.fabric8.maven.docker.config.NamingStrategy;
import io.fabric8.maven.docker.config.NetworkConfig;
import io.fabric8.maven.docker.config.RunImageConfiguration;
import io.fabric8.maven.docker.config.WaitConfiguration;
import io.fabric8.maven.docker.log.LogDispatcher;
import io.fabric8.maven.docker.model.Container;
import io.fabric8.maven.docker.service.*;
import io.fabric8.maven.docker.service.ImagePullManager;
import io.fabric8.maven.docker.service.QueryService;
import io.fabric8.maven.docker.service.RegistryService;
import io.fabric8.maven.docker.service.RunService;
import io.fabric8.maven.docker.service.ServiceHub;
import io.fabric8.maven.docker.util.StartOrderResolver;
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 org.codehaus.plexus.util.StringUtils;

import java.io.IOException;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Queue;
import java.util.Set;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorCompletionService;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;


/**
* Goal for creating and starting a docker container. This goal evaluates the image configuration
Expand Down Expand Up @@ -73,6 +96,19 @@ public class StartMojo extends AbstractDockerMojo {
@Parameter(property = "docker.autoCreateCustomNetworks", defaultValue = "false")
protected boolean autoCreateCustomNetworks;

/**
* Default value for the naming strategy for containers.
*/
@Parameter(property = "docker.namingStrategy", defaultValue = "auto")
protected NamingStrategy namingStrategy;

/**
* Container prefix for the naming strategy auto, the final container name will be
* <prefix>_<image name>
*/
@Parameter(property = "docker.containerPrefix", defaultValue = "${project.name}")
protected String containerPrefix;

// property file to write out with port mappings
@Parameter
protected String portPropertyFile;
Expand Down Expand Up @@ -244,7 +280,7 @@ private void startImage(final ImageConfiguration image,
startingContainers.submit(new Callable<StartedContainer>() {
@Override
public StartedContainer call() throws Exception {
final String containerId = runService.createAndStartContainer(image, portMapping, getPomLabel(), projProperties, project.getBasedir());
final String containerId = runService.createAndStartContainer(image, portMapping, namingStrategy, containerPrefix, getPomLabel(), projProperties, project.getBasedir());

// Update port-mapping writer
portMappingPropertyWriteHelper.add(portMapping, runConfig.getPortPropertyFile());
Expand Down
44 changes: 29 additions & 15 deletions src/main/java/io/fabric8/maven/docker/StopMojo.java
Original file line number Diff line number Diff line change
@@ -1,30 +1,30 @@
package io.fabric8.maven.docker;

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 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.NamingStrategy;
import io.fabric8.maven.docker.config.NetworkConfig;
import io.fabric8.maven.docker.config.RunImageConfiguration;
import io.fabric8.maven.docker.log.LogDispatcher;
import io.fabric8.maven.docker.model.Container;
import io.fabric8.maven.docker.model.Network;
import io.fabric8.maven.docker.service.QueryService;
import io.fabric8.maven.docker.service.RunService;
import io.fabric8.maven.docker.service.ServiceHub;
import io.fabric8.maven.docker.util.ContainerName;
import io.fabric8.maven.docker.util.PomLabel;

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 java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
* Mojo for stopping containers. If called together with <code>docker:start</code> (i.e.
* when configured for integration testing in a lifefcycle phase), then only the container
Expand All @@ -50,6 +50,19 @@ public class StopMojo extends AbstractDockerMojo {
@Parameter(property = "docker.autoCreateCustomNetworks", defaultValue = "false")
protected boolean autoCreateCustomNetworks;

/**
* Default value for the naming strategy for containers.
*/
@Parameter(property = "docker.namingStrategy", defaultValue = "auto")
protected NamingStrategy namingStrategy;

/**
* Container prefix for the naming strategy auto, the final container name will be
* &lt;prefix&gt;_&lt;image name&gt;
*/
@Parameter(property = "docker.containerPrefix", defaultValue = "${project.name}")
protected String containerPrefix;

@Parameter( property = "docker.allContainers", defaultValue = "false" )
private boolean allContainers;

Expand Down Expand Up @@ -90,10 +103,10 @@ private void stopContainers(QueryService queryService, RunService runService, Po

// If naming strategy is alias stop a container with this name, otherwise get all containers with this image's name
private List<Container> getContainersToStop(QueryService queryService, ImageConfiguration image) throws DockerAccessException {
RunImageConfiguration.NamingStrategy strategy = image.getRunConfiguration().getNamingStrategy();
NamingStrategy strategy = image.getRunConfiguration().getNamingStrategy();

if (strategy == RunImageConfiguration.NamingStrategy.alias) {
Container container = queryService.getContainer(image.getAlias());
if (!NamingStrategy.none.equals(strategy)) {
Container container = queryService.getContainer(ContainerName.calculate(image.getAlias(), strategy, namingStrategy, containerPrefix, image.getName()));
return container != null ? Collections.singletonList(container) : Collections.<Container>emptyList();
} else {
return queryService.getContainersForImage(image.getName());
Expand All @@ -105,9 +118,10 @@ private boolean shouldStopContainer(Container container, PomLabel pomLabel, Imag
return true;
}

RunImageConfiguration.NamingStrategy strategy = image.getRunConfiguration().getNamingStrategy();
if (RunImageConfiguration.NamingStrategy.alias.equals(strategy)) {
return container.getName().equals(image.getAlias());
final NamingStrategy strategy = image.getRunConfiguration().getNamingStrategy();
if (!NamingStrategy.none.equals(strategy)) {
final String name = ContainerName.calculate(image.getAlias(), strategy, namingStrategy, containerPrefix, image.getName());
return container.getName().equals(name);
}

String key = pomLabel.getKey();
Expand Down
17 changes: 16 additions & 1 deletion src/main/java/io/fabric8/maven/docker/WatchMojo.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,11 @@
*/

import io.fabric8.maven.docker.access.DockerAccessException;
import io.fabric8.maven.docker.config.NamingStrategy;
import io.fabric8.maven.docker.config.WatchMode;
import io.fabric8.maven.docker.service.BuildService;
import io.fabric8.maven.docker.service.ServiceHub;
import io.fabric8.maven.docker.service.WatchService;

import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.Parameter;
Expand Down Expand Up @@ -66,6 +66,19 @@ public class WatchMojo extends AbstractBuildSupportMojo {
@Parameter(property = "docker.autoCreateCustomNetworks", defaultValue = "false")
protected boolean autoCreateCustomNetworks;

/**
* Default value for the naming strategy for containers.
*/
@Parameter(property = "docker.namingStrategy", defaultValue = "auto")
protected NamingStrategy namingStrategy;

/**
* Container prefix for the naming strategy auto, the final container name will be
* &lt;prefix&gt;_&lt;image name&gt;
*/
@Parameter(property = "docker.containerPrefix", defaultValue = "${project.name}")
protected String containerPrefix;

@Override
protected synchronized void executeInternal(ServiceHub hub) throws DockerAccessException,
MojoExecutionException {
Expand All @@ -83,6 +96,8 @@ protected WatchService.WatchContext getWatchContext() throws MojoExecutionExcept
.watchPostGoal(watchPostGoal)
.watchPostExec(watchPostExec)
.autoCreateCustomNetworks(autoCreateCustomNetworks)
.defaultNamingStrategy(namingStrategy)
.containerPrefix(containerPrefix)
.keepContainer(keepContainer)
.keepRunning(keepRunning)
.removeVolumes(removeVolumes)
Expand Down
20 changes: 20 additions & 0 deletions src/main/java/io/fabric8/maven/docker/config/NamingStrategy.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package io.fabric8.maven.docker.config;

/**
* @author marcus
* @since 1.0.0
*/ // Naming scheme for how to name container
public enum NamingStrategy {
/**
* No extra naming
*/
none,
/**
* Use the alias as defined in the configuration
*/
alias,
/**
* Use the image name plus a prefix
*/
auto
}
Original file line number Diff line number Diff line change
@@ -1,15 +1,13 @@
package io.fabric8.maven.docker.config;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

import io.fabric8.maven.docker.util.DeepCopy;
import org.apache.maven.plugins.annotations.Parameter;

import io.fabric8.maven.docker.util.EnvUtil;
import org.apache.maven.plugins.annotations.Parameter;

import javax.annotation.Nonnull;
import java.io.Serializable;
import java.util.List;
import java.util.Map;

/**
* @author roland
Expand Down Expand Up @@ -292,20 +290,8 @@ public List<String> getTmpfs() {
return tmpfs;
}

// Naming scheme for how to name container
public enum NamingStrategy {
/**
* No extra naming
*/
none,
/**
* Use the alias as defined in the configuration
*/
alias
}

public NamingStrategy getNamingStrategy() {
return namingStrategy == null ? NamingStrategy.none : namingStrategy;
return namingStrategy;
}

public String getExposedPropertyKey() {
Expand Down
63 changes: 40 additions & 23 deletions src/main/java/io/fabric8/maven/docker/service/RunService.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,22 +17,46 @@
* limitations under the License.
*/

import java.io.File;
import java.util.*;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;

import io.fabric8.maven.docker.access.ContainerCreateConfig;
import io.fabric8.maven.docker.access.ContainerHostConfig;
import io.fabric8.maven.docker.access.ContainerNetworkingConfig;
import io.fabric8.maven.docker.access.DockerAccess;
import io.fabric8.maven.docker.access.DockerAccessException;
import io.fabric8.maven.docker.access.ExecException;
import io.fabric8.maven.docker.access.NetworkCreateConfig;
import io.fabric8.maven.docker.access.PortMapping;
import io.fabric8.maven.docker.config.Arguments;
import io.fabric8.maven.docker.config.ImageConfiguration;
import io.fabric8.maven.docker.config.NamingStrategy;
import io.fabric8.maven.docker.config.NetworkConfig;
import io.fabric8.maven.docker.config.RestartPolicy;
import io.fabric8.maven.docker.config.RunImageConfiguration;
import io.fabric8.maven.docker.config.RunVolumeConfiguration;
import io.fabric8.maven.docker.log.LogOutputSpecFactory;
import io.fabric8.maven.docker.model.Container;
import io.fabric8.maven.docker.model.ContainerDetails;
import io.fabric8.maven.docker.model.ExecDetails;
import io.fabric8.maven.docker.log.LogOutputSpecFactory;
import io.fabric8.maven.docker.access.*;
import io.fabric8.maven.docker.config.*;
import io.fabric8.maven.docker.model.Network;
import io.fabric8.maven.docker.util.*;
import io.fabric8.maven.docker.wait.WaitUtil;
import io.fabric8.maven.docker.util.ContainerName;
import io.fabric8.maven.docker.util.EnvUtil;
import io.fabric8.maven.docker.util.Logger;
import io.fabric8.maven.docker.util.PomLabel;
import io.fabric8.maven.docker.util.StartOrderResolver;
import io.fabric8.maven.docker.wait.WaitTimeoutException;
import io.fabric8.maven.docker.wait.WaitUtil;

import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;

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

Expand Down Expand Up @@ -99,21 +123,25 @@ public String execInContainer(String containerId, String command, ImageConfigura
* Create and start a container with the given image configuration.
* @param imageConfig image configuration holding the run information and the image name
* @param portMapping container port mapping
* @param mavenProps properties to fill in with dynamically assigned ports
* @param defaultNamingStrategy default naming strategy if any
* @param containerPrefix the container prefix
* @param pomLabel label to tag the started container with
*
* @param mavenProps properties to fill in with dynamically assigned ports
* @return the container id
*
* @throws DockerAccessException if access to the docker backend fails
*/
public String createAndStartContainer(ImageConfiguration imageConfig,
PortMapping portMapping,
final NamingStrategy defaultNamingStrategy,
final String containerPrefix,
PomLabel pomLabel,
Properties mavenProps,
File baseDir) throws DockerAccessException {
RunImageConfiguration runConfig = imageConfig.getRunConfiguration();
String imageName = imageConfig.getName();
String containerName = calculateContainerName(imageConfig.getAlias(), runConfig.getNamingStrategy());
String containerName = ContainerName.calculate(imageConfig.getAlias(), runConfig.getNamingStrategy(), defaultNamingStrategy, containerPrefix, imageName);
ContainerCreateConfig config = createContainerConfig(imageName, runConfig, portMapping, pomLabel, mavenProps, baseDir);

String id = docker.createContainer(config, containerName);
Expand Down Expand Up @@ -380,17 +408,6 @@ private List<String> findVolumesFromContainers(List<String> images) throws Docke
return list;
}


private String calculateContainerName(String alias, RunImageConfiguration.NamingStrategy namingStrategy) {
if (namingStrategy == RunImageConfiguration.NamingStrategy.none) {
return null;
}
if (alias == null) {
throw new IllegalArgumentException("A naming scheme 'alias' requires an image alias to be set");
}
return alias;
}

// checkAllContainers: false = only running containers are considered
private String findContainerId(String imageNameOrAlias, boolean checkAllContainers) throws DockerAccessException {
String id = lookupContainer(imageNameOrAlias);
Expand Down
Loading