io.fabric8.maven.docker.config.handler.property.PropertyConfigHandler.java Source code

Java tutorial

Introduction

Here is the source code for io.fabric8.maven.docker.config.handler.property.PropertyConfigHandler.java

Source

package io.fabric8.maven.docker.config.handler.property;/*
                                                        *
                                                        * Copyright 2014 Roland Huss
                                                        *
                                                        * Licensed under the Apache License, Version 2.0 (the "License");
                                                        * you may not use this file except in compliance with the License.
                                                        * You may obtain a copy of the License at
                                                        *
                                                        *       http://www.apache.org/licenses/LICENSE-2.0
                                                        *
                                                        * Unless required by applicable law or agreed to in writing, software
                                                        * distributed under the License is distributed on an "AS IS" BASIS,
                                                        * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
                                                        * See the License for the specific language governing permissions and
                                                        * limitations under the License.
                                                        */

import java.util.*;

import io.fabric8.maven.docker.config.*;
import org.apache.maven.execution.MavenSession;
import org.apache.maven.project.MavenProject;

import io.fabric8.maven.docker.config.handler.ExternalConfigHandler;
import io.fabric8.maven.docker.util.EnvUtil;

import static io.fabric8.maven.docker.config.handler.property.ConfigKey.*;
import static io.fabric8.maven.docker.util.EnvUtil.*;

/**
 * @author roland
 * @since 18/11/14
 */
// Moved temporarily to resources/META-INF/plexus/components.xml because of https://github.com/codehaus-plexus/plexus-containers/issues/4
// @Component(role = ExternalConfigHandler.class)
public class PropertyConfigHandler implements ExternalConfigHandler {

    @Override
    public String getType() {
        return "properties";
    }

    @Override
    public List<ImageConfiguration> resolve(ImageConfiguration config, MavenProject project, MavenSession session)
            throws IllegalArgumentException {
        String prefix = getPrefix(config);
        Properties properties = project.getProperties();

        RunImageConfiguration run = extractRunConfiguration(prefix, properties);
        BuildImageConfiguration build = extractBuildConfiguration(prefix, properties);
        WatchImageConfiguration watch = extractWatchConfig(prefix, properties);

        String name = extractName(prefix, properties);
        String alias = withPrefix(prefix, ALIAS, properties);

        return Collections.singletonList(
                new ImageConfiguration.Builder().name(name).alias(alias != null ? alias : config.getAlias())
                        .runConfig(run).buildConfig(build).watchConfig(watch).build());
    }

    // Enable build config only when a `.from.`, `.dockerFile.`, or `.dockerFileDir.` is configured
    private boolean buildConfigured(String prefix, Properties properties) {
        return withPrefix(prefix, FROM, properties) != null || mapWithPrefix(prefix, FROM_EXT, properties) != null
                || withPrefix(prefix, DOCKER_FILE, properties) != null
                || withPrefix(prefix, DOCKER_FILE_DIR, properties) != null;
    }

    private BuildImageConfiguration extractBuildConfiguration(String prefix, Properties properties) {
        if (!buildConfigured(prefix, properties)) {
            return null;
        }
        return new BuildImageConfiguration.Builder().cmd(withPrefix(prefix, CMD, properties))
                .cleanup(withPrefix(prefix, CLEANUP, properties)).nocache(withPrefix(prefix, NOCACHE, properties))
                .optimise(withPrefix(prefix, OPTIMISE, properties))
                .entryPoint(withPrefix(prefix, ENTRYPOINT, properties))
                .assembly(extractAssembly(prefix, properties)).env(mapWithPrefix(prefix, ENV, properties))
                .args(mapWithPrefix(prefix, ARGS, properties)).labels(mapWithPrefix(prefix, LABELS, properties))
                .ports(extractPortValues(prefix, properties)).runCmds(extractRunCommands(prefix, properties))
                .from(withPrefix(prefix, FROM, properties)).fromExt(mapWithPrefix(prefix, FROM_EXT, properties))
                .registry(withPrefix(prefix, REGISTRY, properties))
                .volumes(listWithPrefix(prefix, VOLUMES, properties)).tags(listWithPrefix(prefix, TAGS, properties))
                .maintainer(withPrefix(prefix, MAINTAINER, properties))
                .workdir(withPrefix(prefix, WORKDIR, properties)).skip(withPrefix(prefix, SKIP_BUILD, properties))
                .imagePullPolicy(withPrefix(prefix, IMAGE_PULL_POLICY_BUILD, properties))
                .dockerArchive(withPrefix(prefix, DOCKER_ARCHIVE, properties))
                .buildOptions(mapWithPrefix(prefix, BUILD_OPTIONS, properties))
                .dockerFile(withPrefix(prefix, DOCKER_FILE, properties))
                .dockerFileDir(withPrefix(prefix, DOCKER_FILE_DIR, properties))
                .filter(withPrefix(prefix, FILTER, properties)).user(withPrefix(prefix, USER, properties))
                .healthCheck(extractHealthCheck(prefix, properties)).build();
    }

    private RunImageConfiguration extractRunConfiguration(String prefix, Properties properties) {

        return new RunImageConfiguration.Builder().capAdd(listWithPrefix(prefix, CAP_ADD, properties))
                .capDrop(listWithPrefix(prefix, CAP_DROP, properties))
                .securityOpts(listWithPrefix(prefix, SECURITY_OPTS, properties))
                .cmd(withPrefix(prefix, CMD, properties)).dns(listWithPrefix(prefix, DNS, properties))
                .dependsOn(listWithPrefix(prefix, DEPENDS_ON, properties)).net(withPrefix(prefix, NET, properties))
                .network(extractNetworkConfig(prefix, properties))
                .dnsSearch(listWithPrefix(prefix, DNS_SEARCH, properties))
                .domainname(withPrefix(prefix, DOMAINNAME, properties))
                .entrypoint(withPrefix(prefix, ENTRYPOINT, properties)).env(mapWithPrefix(prefix, ENV, properties))
                .labels(mapWithPrefix(prefix, LABELS, properties))
                .envPropertyFile(withPrefix(prefix, ENV_PROPERTY_FILE, properties))
                .extraHosts(listWithPrefix(prefix, EXTRA_HOSTS, properties))
                .hostname(withPrefix(prefix, HOSTNAME, properties)).links(listWithPrefix(prefix, LINKS, properties))
                .memory(longWithPrefix(prefix, MEMORY, properties))
                .memorySwap(longWithPrefix(prefix, MEMORY_SWAP, properties))
                .namingStrategy(withPrefix(prefix, NAMING_STRATEGY, properties))
                .exposedPropertyKey(withPrefix(prefix, EXPOSED_PROPERTY_KEY, properties))
                .portPropertyFile(withPrefix(prefix, PORT_PROPERTY_FILE, properties))
                .ports(listWithPrefix(prefix, PORTS, properties))
                .shmSize(longWithPrefix(prefix, SHMSIZE, properties))
                .privileged(booleanWithPrefix(prefix, PRIVILEGED, properties))
                .restartPolicy(extractRestartPolicy(prefix, properties)).user(withPrefix(prefix, USER, properties))
                .workingDir(withPrefix(prefix, WORKING_DIR, properties)).log(extractLogConfig(prefix, properties))
                .wait(extractWaitConfig(prefix, properties)).volumes(extractVolumeConfig(prefix, properties))
                .skip(withPrefix(prefix, SKIP_RUN, properties))
                .imagePullPolicy(withPrefix(prefix, IMAGE_PULL_POLICY_RUN, properties))
                .ulimits(extractUlimits(prefix, properties)).tmpfs(listWithPrefix(prefix, TMPFS, properties))
                .build();
    }

    private NetworkConfig extractNetworkConfig(String prefix, Properties properties) {
        return new NetworkConfig.Builder().mode(withPrefix(prefix, NETWORK_MODE, properties))
                .name(withPrefix(prefix, NETWORK_NAME, properties))
                .aliases(listWithPrefix(prefix, NETWORK_ALIAS, properties)).build();
    }

    @SuppressWarnings("deprecation")
    private AssemblyConfiguration extractAssembly(String prefix, Properties properties) {
        return new AssemblyConfiguration.Builder().targetDir(withPrefix(prefix, ASSEMBLY_BASEDIR, properties))
                .descriptor(withPrefix(prefix, ASSEMBLY_DESCRIPTOR, properties))
                .descriptorRef(withPrefix(prefix, ASSEMBLY_DESCRIPTOR_REF, properties))
                .dockerFileDir(withPrefix(prefix, ASSEMBLY_DOCKER_FILE_DIR, properties))
                .exportBasedir(booleanWithPrefix(prefix, ASSEMBLY_EXPORT_BASEDIR, properties))
                .ignorePermissions(booleanWithPrefix(prefix, ASSEMBLY_IGNORE_PERMISSIONS, properties))
                .permissions(withPrefix(prefix, ASSEMBLY_PERMISSIONS, properties))
                .user(withPrefix(prefix, ASSEMBLY_USER, properties))
                .mode(withPrefix(prefix, ASSEMBLY_MODE, properties))
                .tarLongFileMode(withPrefix(prefix, ASSEMBLY_TARLONGFILEMODE, properties)).build();
    }

    private HealthCheckConfiguration extractHealthCheck(String prefix, Properties properties) {
        Map<String, String> healthCheckProperties = mapWithPrefix(prefix, HEALTHCHECK, properties);
        if (healthCheckProperties != null && healthCheckProperties.size() > 0) {
            return new HealthCheckConfiguration.Builder()
                    .interval(withPrefix(prefix, HEALTHCHECK_INTERVAL, properties))
                    .timeout(withPrefix(prefix, HEALTHCHECK_TIMEOUT, properties))
                    .retries(intWithPrefix(prefix, HEALTHCHECK_RETRIES, properties))
                    .mode(withPrefix(prefix, HEALTHCHECK_MODE, properties))
                    .cmd(withPrefix(prefix, HEALTHCHECK_CMD, properties)).build();
        }

        return null;
    }

    private String extractName(String prefix, Properties properties) throws IllegalArgumentException {
        String name = withPrefix(prefix, NAME, properties);
        if (name == null) {
            throw new IllegalArgumentException(String.format("Mandatory property [%s] is not defined", NAME));
        }
        return name;
    }

    // Extract only the values of the port mapping
    private List<String> extractPortValues(String prefix, Properties properties) {
        List<String> ret = new ArrayList<>();
        List<String> ports = listWithPrefix(prefix, PORTS, properties);
        if (ports == null) {
            return null;
        }
        List<String[]> parsedPorts = EnvUtil.splitOnLastColon(ports);
        for (String[] port : parsedPorts) {
            ret.add(port[1]);
        }
        return ret;
    }

    private List<String> extractRunCommands(String prefix, Properties properties) {
        return listWithPrefix(prefix, RUN, properties);
    }

    private RestartPolicy extractRestartPolicy(String prefix, Properties properties) {
        return new RestartPolicy.Builder().name(withPrefix(prefix, RESTART_POLICY_NAME, properties))
                .retry(asInt(withPrefix(prefix, RESTART_POLICY_RETRY, properties))).build();
    }

    private LogConfiguration extractLogConfig(String prefix, Properties properties) {
        LogConfiguration.Builder builder = new LogConfiguration.Builder()
                .color(withPrefix(prefix, LOG_COLOR, properties)).date(withPrefix(prefix, LOG_DATE, properties))
                .prefix(withPrefix(prefix, LOG_PREFIX, properties))
                .logDriverName(withPrefix(prefix, LOG_DRIVER_NAME, properties))
                .logDriverOpts(mapWithPrefix(prefix, LOG_DRIVER_OPTS, properties));
        Boolean enabled = booleanWithPrefix(prefix, LOG_ENABLED, properties);
        if (enabled != null) {
            builder.enabled(enabled);
        }
        return builder.build();
    }

    private WaitConfiguration extractWaitConfig(String prefix, Properties properties) {
        String url = withPrefix(prefix, WAIT_HTTP_URL, properties);
        if (url == null) {
            // Fallback to deprecated old URL
            url = withPrefix(prefix, WAIT_URL, properties);
        }
        return new WaitConfiguration.Builder().time(asInt(withPrefix(prefix, WAIT_TIME, properties))).url(url)
                .preStop(withPrefix(prefix, WAIT_EXEC_PRE_STOP, properties))
                .postStart(withPrefix(prefix, WAIT_EXEC_POST_START, properties))
                .breakOnError(booleanWithPrefix(prefix, WAIT_EXEC_BREAK_ON_ERROR, properties))
                .method(withPrefix(prefix, WAIT_HTTP_METHOD, properties))
                .status(withPrefix(prefix, WAIT_HTTP_STATUS, properties))
                .log(withPrefix(prefix, WAIT_LOG, properties))
                .kill(asInt(withPrefix(prefix, WAIT_KILL, properties)))
                .exit(asInteger(withPrefix(prefix, WAIT_EXIT, properties)))
                .shutdown(asInt(withPrefix(prefix, WAIT_SHUTDOWN, properties)))
                .tcpHost(withPrefix(prefix, WAIT_TCP_HOST, properties))
                .tcpPorts(asIntList(listWithPrefix(prefix, WAIT_TCP_PORT, properties)))
                .tcpMode(withPrefix(prefix, WAIT_TCP_MODE, properties)).build();
    }

    private WatchImageConfiguration extractWatchConfig(String prefix, Properties properties) {
        return new WatchImageConfiguration.Builder().interval(asInt(withPrefix(prefix, WATCH_INTERVAL, properties)))
                .postGoal(withPrefix(prefix, WATCH_POSTGOAL, properties))
                .mode(withPrefix(prefix, WATCH_POSTGOAL, properties)).build();
    }

    private List<UlimitConfig> extractUlimits(String prefix, Properties properties) {
        List<String> ulimits = listWithPrefix(prefix, ConfigKey.ULIMITS, properties);
        if (ulimits == null) {
            return null;
        }
        List<UlimitConfig> ret = new ArrayList<>();
        for (String ulimit : ulimits) {
            ret.add(new UlimitConfig(ulimit));
        }
        return ret;
    }

    private RunVolumeConfiguration extractVolumeConfig(String prefix, Properties properties) {
        return new RunVolumeConfiguration.Builder().bind(listWithPrefix(prefix, BIND, properties))
                .from(listWithPrefix(prefix, VOLUMES_FROM, properties)).build();
    }

    private int asInt(String s) {
        return s != null ? Integer.parseInt(s) : 0;
    }

    private Integer asInteger(String s) {
        return s != null ? new Integer(s) : null;
    }

    private List<Integer> asIntList(List<String> strings) {
        if (strings == null) {
            return null;
        }

        List<Integer> ints = new ArrayList<>();
        for (String s : strings) {
            ints.add(asInt(s));
        }

        return ints;

    }

    private List<String> listWithPrefix(String prefix, ConfigKey key, Properties properties) {
        return extractFromPropertiesAsList(key.asPropertyKey(prefix), properties);
    }

    private Map<String, String> mapWithPrefix(String prefix, ConfigKey key, Properties properties) {
        return extractFromPropertiesAsMap(key.asPropertyKey(prefix), properties);
    }

    private String withPrefix(String prefix, ConfigKey key, Properties properties) {
        return properties.getProperty(key.asPropertyKey(prefix));
    }

    private Integer intWithPrefix(String prefix, ConfigKey key, Properties properties) {
        String prop = withPrefix(prefix, key, properties);
        return prop == null ? null : Integer.valueOf(prop);
    }

    private Long longWithPrefix(String prefix, ConfigKey key, Properties properties) {
        String prop = withPrefix(prefix, key, properties);
        return prop == null ? null : Long.valueOf(prop);
    }

    private Boolean booleanWithPrefix(String prefix, ConfigKey key, Properties properties) {
        String prop = withPrefix(prefix, key, properties);
        return prop == null ? null : Boolean.valueOf(prop);
    }

    private String getPrefix(ImageConfiguration config) {
        String prefix = config.getExternalConfig().get("prefix");
        if (prefix == null) {
            prefix = "docker";
        }
        return prefix;
    }
}