blob: ba73e65539ad1d8c603c5d662c15409b08f51e43 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2014, 2020 Red Hat.
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Red Hat - Initial Contribution
*******************************************************************************/
package org.eclipse.linuxtools.internal.docker.ui.views;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.linuxtools.docker.core.IDockerContainerConfig;
import org.eclipse.linuxtools.docker.core.IDockerContainerInfo;
import org.eclipse.linuxtools.docker.core.IDockerContainerInfo2;
import org.eclipse.linuxtools.docker.core.IDockerContainerState;
import org.eclipse.linuxtools.docker.core.IDockerHostConfig;
import org.eclipse.linuxtools.docker.core.IDockerNetworkSettings;
import org.eclipse.linuxtools.docker.core.IDockerPortBinding;
import org.eclipse.linuxtools.internal.docker.core.DockerContainerConfig;
import org.eclipse.linuxtools.internal.docker.core.DockerHostConfig;
public class ContainerInspectContentProvider implements ITreeContentProvider {
private static final Object[] EMPTY = new Object[0];
@Override
public void dispose() {
}
@Override
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}
@Override
public Object[] getElements(Object inputElement) {
if(inputElement instanceof IDockerContainerInfo) {
final IDockerContainerInfo info = (IDockerContainerInfo) inputElement;
return new Object[] {
new Object[]{"Id", info.id().substring(0, 12)}, //$NON-NLS-1$
new Object[]{"Name", info.name()}, //$NON-NLS-1$
new Object[]{"Created", LabelProviderUtils.toCreatedDate(info.created())}, //$NON-NLS-1$
new Object[]{"State", info.state()}, //$NON-NLS-1$
new Object[]{"Args", LabelProviderUtils.reduce(info.args())}, //$NON-NLS-1$
new Object[]{"Driver", info.driver()}, //$NON-NLS-1$
new Object[]{"ExecDriver", info.execDriver()}, //$NON-NLS-1$
new Object[] { "Config", info.config() }, //$NON-NLS-1$
new Object[]{"HostConfig", info.hostConfig()}, //$NON-NLS-1$
new Object[]{"HostnamePath", info.hostnamePath()}, //$NON-NLS-1$
new Object[]{"HostsPath", info.hostsPath()}, //$NON-NLS-1$
new Object[]{"Image", info.image()}, //$NON-NLS-1$
new Object[]{"MountLabel", info.mountLabel()}, //$NON-NLS-1$
new Object[]{"NetworkSettings", info.networkSettings()}, //$NON-NLS-1$
new Object[]{"Path", info.path()}, //$NON-NLS-1$
new Object[]{"ProcessLabel", info.processLabel()}, //$NON-NLS-1$
new Object[]{"ResolvConfPath", info.resolvConfPath()}, //$NON-NLS-1$
new Object[] { "Mounts", ((IDockerContainerInfo2) info).mounts() }, //$NON-NLS-1$
};
}return EMPTY;
}
@Override
public Object[] getChildren(Object parentElement) {
final Object propertyValue = ((Object[])parentElement)[1];
if(propertyValue instanceof IDockerContainerState) {
final IDockerContainerState containerState = (IDockerContainerState) propertyValue;
return new Object[] {
new Object[]{"ExitCode", containerState.exitCode()}, //$NON-NLS-1$
new Object[]{"Finished at", LabelProviderUtils.toFinishedDate(containerState.finishDate())}, //$NON-NLS-1$
new Object[]{"Running", containerState.running()}, //$NON-NLS-1$
new Object[]{"Paused", containerState.paused()}, //$NON-NLS-1$
new Object[]{"Pid", containerState.pid()}, //$NON-NLS-1$
};
} else if(propertyValue instanceof IDockerHostConfig) {
final DockerHostConfig hostConfig = (DockerHostConfig) propertyValue;
return new Object[] {
new Object[]{"Binds", LabelProviderUtils.reduce(hostConfig.binds())}, //$NON-NLS-1$
new Object[] { "CapAdd", hostConfig.capAdd() }, //$NON-NLS-1$
new Object[] { "CapDrop", hostConfig.capDrop() }, //$NON-NLS-1$
new Object[]{"ContainerIDFile", hostConfig.containerIDFile()}, //$NON-NLS-1$
new Object[]{"Dns", LabelProviderUtils.reduce(hostConfig.dns())}, //$NON-NLS-1$
new Object[]{"DnsSearch", LabelProviderUtils.reduce(hostConfig.dnsSearch())}, //$NON-NLS-1$
new Object[]{"Links", splitLinks(hostConfig.links())}, //$NON-NLS-1$
new Object[]{"LxcConf", hostConfig.lxcConf()}, //$NON-NLS-1$
new Object[]{"NetworkMode", hostConfig.networkMode()}, //$NON-NLS-1$
new Object[]{"PortBindings", LabelProviderUtils.reduce(hostConfig.portBindings())}, //$NON-NLS-1$
new Object[]{"Privileged", hostConfig.privileged()}, //$NON-NLS-1$
new Object[]{"PublishAllPorts", hostConfig.publishAllPorts()}, //$NON-NLS-1$
new Object[] { "ReadonlyRootfs", //$NON-NLS-1$
hostConfig.readonlyRootfs() },
new Object[] { "SecurityOpt", hostConfig.securityOpt() }, //$NON-NLS-1$
new Object[] { "Tmpfs", hostConfig.tmpfs() }, //$NON-NLS-1$
new Object[]{"VolumesFrom", LabelProviderUtils.reduce(hostConfig.volumesFrom())}, //$NON-NLS-1$
};
} else if(propertyValue instanceof IDockerContainerConfig) {
final IDockerContainerConfig config = (IDockerContainerConfig) propertyValue;
return new Object[] {
new Object[]{"AttachStderr", config.attachStderr()}, //$NON-NLS-1$
new Object[]{"AttachStdin", config.attachStdin()}, //$NON-NLS-1$
new Object[]{"AttachStdout", config.attachStdout()}, //$NON-NLS-1$
new Object[]{"Cmd", LabelProviderUtils.reduce(config.cmd())}, //$NON-NLS-1$
new Object[]{"CpuSet", config.cpuset()}, //$NON-NLS-1$
new Object[]{"CpuShares", config.cpuShares()}, //$NON-NLS-1$
new Object[]{"Domainname", config.domainname()}, //$NON-NLS-1$
new Object[]{"Entrypoint", LabelProviderUtils.reduce(config.entrypoint())}, //$NON-NLS-1$
new Object[]{"Env", LabelProviderUtils.reduce(config.env())}, //$NON-NLS-1$
new Object[]{"ExposedPorts", LabelProviderUtils.reduce(config.exposedPorts())}, //$NON-NLS-1$
new Object[]{"Hostname", config.hostname()}, //$NON-NLS-1$
new Object[]{"Image", config.image()}, //$NON-NLS-1$
new Object[] { "Labels", //$NON-NLS-1$
((DockerContainerConfig) config).labels() },
new Object[]{"Memory", config.memory()}, //$NON-NLS-1$
new Object[]{"MemorySwap", config.memorySwap()}, //$NON-NLS-1$
new Object[]{"NetworkDisabled", config.networkDisabled()}, //$NON-NLS-1$
new Object[]{"OnBuild", config.onBuild()}, //$NON-NLS-1$
new Object[]{"OpenStdin", config.openStdin()}, //$NON-NLS-1$
new Object[]{"PortSpecs", LabelProviderUtils.reduce(config.portSpecs())}, //$NON-NLS-1$
new Object[]{"StdinOnce", config.stdinOnce()}, //$NON-NLS-1$
new Object[]{"Tty", config.tty()}, //$NON-NLS-1$
new Object[] { "Volumes", //$NON-NLS-1$
LabelProviderUtils.reduce(config.volumes().keySet()) },
new Object[]{"WorkingDir", config.workingDir()}, //$NON-NLS-1$
};
} else if(propertyValue instanceof IDockerPortBinding) {
final IDockerPortBinding portBinding = (IDockerPortBinding) propertyValue;
return new Object[] {
new Object[]{"Host IP/Port", LabelProviderUtils.toString(portBinding)} //$NON-NLS-1$
};
} else if(propertyValue instanceof IDockerNetworkSettings) {
final IDockerNetworkSettings networkSettings = (IDockerNetworkSettings) propertyValue;
return new Object[] {
new Object[]{"Bridge", networkSettings.bridge()}, //$NON-NLS-1$
new Object[]{"Gateway", networkSettings.gateway()}, //$NON-NLS-1$
new Object[]{"IPAddress", networkSettings.ipAddress()}, //$NON-NLS-1$
new Object[]{"IPPrefixLen", networkSettings.ipPrefixLen()}, //$NON-NLS-1$
new Object[]{"PortMapping", networkSettings.portMapping()}, //$NON-NLS-1$
new Object[]{"Ports", LabelProviderUtils.reduce(networkSettings.ports())}, //$NON-NLS-1$
};
} else if(propertyValue instanceof List<?>) {
@SuppressWarnings("unchecked")
final List<Object> propertyValues = (List<Object>)propertyValue;
final Object[] result = new Object[propertyValues.size()];
for (int i = 0; i < propertyValues.size(); i++) {
result[i] = new Object[]{"", LabelProviderUtils.toString(propertyValues.get(i))}; //$NON-NLS-1$
}
return result;
} else if (propertyValue instanceof Set<?>) {
@SuppressWarnings("unchecked")
final Set<Object> propertyValues = (Set<Object>) propertyValue;
final Object[] result = new Object[propertyValues.size()];
Iterator<Object> iterator = propertyValues.iterator();
for (int i = 0; i < propertyValues.size(); i++) {
result[i] = new Object[] { "", //$NON-NLS-1$
LabelProviderUtils.toString(iterator.next()) };
}
return result;
} else if(propertyValue instanceof Map<?,?>) {
final Map<?,?> propertyValues = (Map<?,?>)propertyValue;
final Object[] result = new Object[propertyValues.size()];
int i = 0;
for (Entry<?, ?> entry : propertyValues.entrySet()) {
result[i] = new Object[]{entry.getKey(), entry.getValue()};
i++;
}
return result;
}
return EMPTY;
}
private Object splitLinks(final List<String> links) {
if(links == null || links.isEmpty()) {
return ""; //$NON-NLS-1$
} else if(links.size() == 1) {
return links.get(0);
} else {
final Object[] result = new Object[links.size()];
for(int i = 0; i < links.size(); i++) {
final String[] split = links.get(i).split(":");
result[i] = new Object[]{split[0], split[1]};
}
return links;
}
}
@Override
public Object getParent(Object element) {
return null;
}
@Override
public boolean hasChildren(Object element) {
if(element instanceof Object[]) {
final Object value = ((Object[])element)[1];
return (value instanceof List || value instanceof Map
|| value instanceof IDockerContainerState
|| value instanceof IDockerNetworkSettings
|| value instanceof IDockerHostConfig
|| value instanceof IDockerPortBinding
|| value instanceof IDockerContainerConfig);
}
return false;
}
}