package org.arquillian.cube.kubernetes.impl.visitor;
import io.fabric8.kubernetes.api.builder.v2_2.TypedVisitor;
import io.fabric8.kubernetes.api.model.v2_2.ContainerBuilder;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.arquillian.cube.impl.util.Strings;
import org.arquillian.cube.kubernetes.api.Configuration;
import org.jboss.arquillian.core.api.Instance;
import org.jboss.arquillian.core.api.annotation.Inject;
public class DockerRegistryVisitor extends TypedVisitor<ContainerBuilder> {
private static final Pattern IMAGE_PATTERN = Pattern.compile("^(.+?)(?::([^:/]+))?$");
private static final String SPLIT_REGEX = "\\s*/\\s*";
private static final String DOT = ".";
private static final String COLN = ":";
private static final String SEPARATOR = "/";
@Inject
Instance<Configuration> configuration;
/**
* Checks to see if there's a registry name already provided in the image name
* <p>
* Code influenced from <a href="https://github.com/rhuss/docker-maven-plugin/blob/master/src/main/java/org/jolokia/docker/maven/util/ImageName.java">docker-maven-plugin</a>
*
* @return true if the image name contains a registry
*/
public static boolean hasRegistry(String imageName) {
if (imageName == null) {
throw new NullPointerException("Image name must not be null");
}
Matcher matcher = IMAGE_PATTERN.matcher(imageName);
if (!matcher.matches()) {
throw new IllegalArgumentException(imageName + " is not a proper image name ([registry/][repo][:port]");
}
String rest = matcher.group(1);
String[] parts = rest.split(SPLIT_REGEX);
String part = parts[0];
return part.contains(DOT) || part.contains(COLN);
}
@Override
public void visit(ContainerBuilder containerBuilder) {
String registry = configuration.get().getDockerRegistry();
if (Strings.isNotNullOrEmpty(registry) && !hasRegistry(containerBuilder.getImage())) {
containerBuilder.withImage(registry + SEPARATOR + containerBuilder.getImage());
}
}
}