All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.fabric8.maven.docker.model.ContainerDetails Maven / Gradle / Ivy

There is a newer version: 0.45.0
Show newest version
package io.fabric8.maven.docker.model;

import com.google.common.base.Joiner;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;

import java.time.Instant;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;


public class ContainerDetails implements Container {

    static final String CONFIG = "Config";
    static final String CREATED = "Created";
    static final String HOST_IP = "HostIp";
    static final String HOST_PORT = "HostPort";
    static final String ID = "Id";
    static final String IMAGE = "Image";
    static final String LABELS = "Labels";
    static final String NAME = "Name";
    static final String IP = "IPAddress";
    static final String HOST_CONFIG = "HostConfig";
    static final String NETWORK_MODE = "NetworkMode";
    static final String NETWORK_SETTINGS = "NetworkSettings";
    static final String NETWORKS = "Networks";
    static final String PORTS = "Ports";
    static final String SLASH = "/";
    static final String STATE = "State";
    static final String HEALTH = "Health";
    static final String STATUS = "Status";
    static final String HEALTH_STATUS_HEALTHY = "healthy";
    static final String HEALTHCHECK = "Healthcheck";
    static final String TEST = "Test";

    private static final String EXIT_CODE = "ExitCode";
    private static final String RUNNING = "Running";

    private final JsonObject json;

    public ContainerDetails(JsonObject json) {
        this.json = json;
    }

    @Override
    public long getCreated() {
        String date = json.get(CREATED).getAsString();
        Instant instant = Instant.parse(date);
        return instant.toEpochMilli();
    }

    @Override
    public String getId() {
        // only need first 12 to id a container
        return json.get(ID).getAsString().substring(0, 12);
    }

    @Override
    public String getImage() {
        // ID: json.getString("Image");
        return json.getAsJsonObject(CONFIG).get(IMAGE).getAsString();
    }

    @Override
    public Map getLabels() {
        JsonObject config = json.getAsJsonObject(CONFIG);
        return config.has(LABELS) ?
                mapLabels(config.getAsJsonObject(LABELS)) :
                Collections.emptyMap();
    }

    @Override
    public String getName() {
        String name = json.get(NAME).getAsString();

        return name.startsWith(SLASH) ? name.substring(1) :
          name;
    }

    @Override
    public String getIPAddress() {
        if (json.has(NETWORK_SETTINGS) && !json.get(NETWORK_SETTINGS).isJsonNull()) {
            JsonObject networkSettings = json.getAsJsonObject(NETWORK_SETTINGS);
            if (!networkSettings.get(IP).isJsonNull()) {
                return networkSettings.get(IP).getAsString();
            }
        }
        return null;
    }

		@Override
		public String getNetworkMode() {
			if (json.has(HOST_CONFIG) && !json.get(HOST_CONFIG).isJsonNull()) {
				final JsonObject hostConfig = json.getAsJsonObject(HOST_CONFIG);
				if (!hostConfig.get(NETWORK_MODE).isJsonNull()) {
          return hostConfig.get(NETWORK_MODE).getAsString();
				}
			}
			return null;
		}

    @Override
    public Map getCustomNetworkIpAddresses() {
        if (json.has(NETWORK_SETTINGS) && !json.get(NETWORK_SETTINGS).isJsonNull()) {
            JsonObject networkSettings = json.getAsJsonObject(NETWORK_SETTINGS);
            if (networkSettings.has(NETWORKS) && !networkSettings.get(NETWORKS).isJsonNull()) {
                return extractNetworks(networkSettings);
            }
        }
        return null;
    }

    private Map extractNetworks(JsonObject networkSettings) {
        JsonObject networks = networkSettings.getAsJsonObject(NETWORKS);
        Set keys = networks.keySet();
        if (keys == null || keys.isEmpty()) {
            return null;
        }
        Map results = new HashMap<>();
        for (String key : keys) {
            JsonObject net = networks.getAsJsonObject(key);
            if (net.has(IP) && !net.get(IP).isJsonNull()) {
                results.put(key, net.get(IP).getAsString());
            }
        }

        return results;
    }

    @Override
    public Map getPortBindings() {
        if (json.has(NETWORK_SETTINGS) && !json.get(NETWORK_SETTINGS).isJsonNull()) {
            JsonObject networkSettings = json.getAsJsonObject(NETWORK_SETTINGS);
            if (networkSettings.has(PORTS) && !networkSettings.get(PORTS).isJsonNull()) {
                return createPortBindings(networkSettings.getAsJsonObject(PORTS));
            }
        }

        return new HashMap<>();
    }

    @Override
    public boolean isRunning() {
        JsonObject state = json.getAsJsonObject(STATE);
        return state.get(RUNNING).getAsBoolean();
    }

    @Override
    public Integer getExitCode() {
        if (isRunning()) {
            return null;
        }
        JsonObject state = json.getAsJsonObject(STATE);
        return state.get(EXIT_CODE).getAsInt();
    }

    public boolean isHealthy() {
        final JsonObject state = json.getAsJsonObject(STATE);
        // always indicate healthy for docker hosts that do not support health checks.
        return !state.has(HEALTH) || HEALTH_STATUS_HEALTHY.equals(state.getAsJsonObject(HEALTH).get(STATUS).getAsString());
    }

    public String getHealthcheck() {
        if (!json.getAsJsonObject(CONFIG).has(HEALTHCHECK) ||
            !json.getAsJsonObject(CONFIG).getAsJsonObject(HEALTHCHECK).has(TEST)) {
            return null;
        }

        return Joiner.on(", ").join(json.getAsJsonObject(CONFIG).getAsJsonObject(HEALTHCHECK).getAsJsonArray(TEST));
    }

    private void addPortMapping(String port, JsonObject hostConfig, Map portBindings) {
        String hostIp = hostConfig.get(HOST_IP).getAsString();
        Integer hostPort = Integer.valueOf(hostConfig.get(HOST_PORT).getAsInt());

        addPortMapping(port, new PortBinding(hostPort, hostIp), portBindings);
    }

    private void addPortMapping(String port, PortBinding binding, Map portBindings) {
        if (port.indexOf('/') == -1) {
            port = port + "/tcp";
        }

        portBindings.put(port, binding);
    }

    private Map createPortBindings(JsonObject ports) {
        Map portBindings = new HashMap<>();

        for (Object obj : ports.keySet()) {
            String port = obj.toString();
            if (ports.get(port).isJsonNull()) {
                addPortMapping(port, (PortBinding) null, portBindings);
            } else {
                JsonArray hostMappings = ports.getAsJsonArray(port);
                if (hostMappings.isJsonNull() || hostMappings.size() == 0) {
                    throw new PortBindingException(port, ports);
                }
                // use the first entry in the array
                JsonObject hostConfig = hostMappings.get(0).getAsJsonObject();
                addPortMapping(port, hostConfig, portBindings);
            }
        }

        return portBindings;
    }

    private Map mapLabels(JsonObject labels) {
        int length = labels.size();
        Map mapped = new HashMap<>(length);

        Iterator iterator = labels.keySet().iterator();
        while (iterator.hasNext()) {
            String key = iterator.next();
            mapped.put(key, labels.get(key).getAsString());
        }

        return mapped;
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy