/*******************************************************************************
* Copyright (c) 2014 Red Hat.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Red Hat - Initial Contribution
*******************************************************************************/
package org.eclipse.linuxtools.internal.docker.core;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.linuxtools.docker.core.IDockerConnection;
import org.eclipse.linuxtools.docker.core.IDockerContainer;
import org.eclipse.linuxtools.docker.core.IDockerContainerInfo;
import org.eclipse.linuxtools.docker.core.IDockerPortMapping;
import com.spotify.docker.client.DockerClient;
import com.spotify.docker.client.messages.Container;
public class DockerContainer implements IDockerContainer, IAdaptable {
private IDockerConnection parent;
private String id;
private List<String> names;
private String image;
private String command;
private Long created;
private String status;
private List<IDockerPortMapping> ports;
private Long sizeRw;
private Long sizeRootFs;
private IDockerContainerInfo containerInfo;
/**
* Constructor.
*
* @param connection
* the Docker connection
* @param container
* the underlying {@link Container} data returned by the
* {@link DockerClient}
*/
public DockerContainer(final IDockerConnection connection,
final Container container) {
this.parent = connection;
this.id = container.id();
this.image = container.image();
this.command = container.command();
this.created = container.created();
this.status = container.status();
this.names = new ArrayList<>();
for (String name : container.names()) {
if (name.startsWith("/")) {
this.names.add(name.substring(1));
} else {
this.names.add(name);
}
}
this.sizeRw = container.sizeRw();
this.sizeRootFs = container.sizeRootFs();
this.ports = new ArrayList<>();
for (Container.PortMapping port : container.ports()) {
final DockerPortMapping portMapping = new DockerPortMapping(this,
port.getPrivatePort(), port.getPublicPort(), port.getType(),
port.getIp());
ports.add(portMapping);
}
// TODO: include volumes
}
/**
* Constructor.
*
* @param connection
* the Docker connection
* @param container
* the underlying {@link Container} data returned by the
* {@link DockerClient}
* @param containerInfo
* the {@link IDockerContainerInfo} that was previously retrieved
* for this {@link IDockerContainer}, assuming it did not change
* in the mean time.
*/
public DockerContainer(final IDockerConnection connection,
final Container container,
final IDockerContainerInfo containerInfo) {
this(connection, container);
this.containerInfo = containerInfo;
}
@Override
public IDockerConnection getConnection() {
return parent;
}
@Override
public String id() {
return id;
}
@Override
public String image() {
return image;
}
@Override
public String command() {
return command;
}
@Override
public Long created() {
return created;
}
@Override
public String status() {
return status;
}
@Override
public Long sizeRw() {
return sizeRw;
}
@Override
public Long sizeRootFs() {
return sizeRootFs;
}
@Override
public List<IDockerPortMapping> ports() {
return ports;
}
@Override
public String name() {
if (names != null && names.size() > 0)
return names.get(0);
return ""; //$NON-NLS-1$
}
@Override
public List<String> names() {
return names;
}
@Override
public IDockerContainerInfo info() {
return info(false);
}
/**
* @param force
* <code>true</code> to force refresh, <code>false</code> to use
* existing {@link IDockerContainerInfo} if it was loaded before.
* @return the {@link IDockerContainerInfo} by calling the Docker daemon
* using the {@link IDockerConnection} associated with this
* {@link IDockerContainer}.
*/
// TODO: add this method in the public interface
public IDockerContainerInfo info(final boolean force) {
if (force || isInfoLoaded()) {
this.containerInfo = this.parent.getContainerInfo(id);
}
return this.containerInfo;
}
/**
* @return <code>true</code> if the {@link IDockerContainerInfo} has been
* loaded, <code>false</code> otherwise.
*/
// TODO: add this method in the public interface
public boolean isInfoLoaded() {
return this.containerInfo != null;
}
@Override
public String toString() {
return "Container: id=" + id() + "\n" + " image=" + image() + "\n"
+ " created=" + created() + "\n" + " command=" + command()
+ "\n" + " status=<" + status() + ">\n" + " name="
+ name() + "\n";
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((id == null) ? 0 : id.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
DockerContainer other = (DockerContainer) obj;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
return true;
}
@SuppressWarnings("unchecked")
@Override
public <T> T getAdapter(Class<T> adapter) {
if (adapter.equals(IDockerConnection.class))
return (T) this.parent;
return null;
}
}