package org.arquillian.cube.docker.impl.client.metadata;
import java.util.EnumSet;
import org.arquillian.cube.docker.impl.client.config.CubeContainer;
import org.arquillian.cube.docker.impl.model.DockerCube;
import org.arquillian.cube.docker.impl.reporter.DockerContainerSection;
import org.arquillian.cube.spi.Cube;
import org.arquillian.cube.spi.metadata.CanReportMetrics;
import org.arquillian.reporter.api.builder.Reporter;
import org.arquillian.reporter.api.builder.report.ReportBuilder;
import org.arquillian.reporter.api.builder.report.ReportInSectionBuilder;
import static org.arquillian.cube.impl.reporter.DockerReportKey.BINDS;
import static org.arquillian.cube.impl.reporter.DockerReportKey.BUILD_LOCATION;
import static org.arquillian.cube.impl.reporter.DockerReportKey.CONTAINER_NAME;
import static org.arquillian.cube.impl.reporter.DockerReportKey.DOCKER_CONTAINER_CONFIGURATION;
import static org.arquillian.cube.impl.reporter.DockerReportKey.ENTRY_POINT;
import static org.arquillian.cube.impl.reporter.DockerReportKey.ERROR_DURING_LIFECYCLE;
import static org.arquillian.cube.impl.reporter.DockerReportKey.EXPOSED_PORTS;
import static org.arquillian.cube.impl.reporter.DockerReportKey.IMAGE_NAME;
import static org.arquillian.cube.impl.reporter.DockerReportKey.LINKS;
import static org.arquillian.cube.impl.reporter.DockerReportKey.NETWORK_MODE;
import static org.arquillian.cube.impl.reporter.DockerReportKey.PORT_BINDING;
import static org.arquillian.cube.impl.reporter.DockerReportKey.STARTING_TIME;
import static org.arquillian.cube.impl.reporter.DockerReportKey.STOPPING_TIME;
import static org.arquillian.cube.impl.reporter.DockerReportKey.VOLUMES;
/**
* Reporting metrics capabilities for Docker Cube.
*/
public class ReportMetrics implements CanReportMetrics {
private DockerCube dockerCube;
public ReportMetrics(DockerCube dockerCube) {
this.dockerCube = dockerCube;
}
@Override
public ReportInSectionBuilder report() {
boolean error = EnumSet.of(Cube.State.START_FAILED, Cube.State.CREATE_FAILED,
Cube.State.STOP_FAILED, Cube.State.DESTORY_FAILED)
.contains(dockerCube.state());
final ReportBuilder reportBuilder = Reporter.createReport(DOCKER_CONTAINER_CONFIGURATION)
.addKeyValueEntry(CONTAINER_NAME, dockerCube.getId())
.addKeyValueEntry(ERROR_DURING_LIFECYCLE, Boolean.toString(error))
.addKeyValueEntry(STARTING_TIME, String.format("%s ms", dockerCube.getStartingTimeInMillis()))
.addKeyValueEntry(STOPPING_TIME, String.format("%s ms", dockerCube.getStoppingTimeInMillis()));
final CubeContainer configuration = dockerCube.configuration();
if (configuration.getImage() != null) {
reportBuilder.addKeyValueEntry(IMAGE_NAME, configuration.getImage().toString());
} else {
reportBuilder.addKeyValueEntry(BUILD_LOCATION, configuration.getBuildImage().getDockerfileLocation());
}
if (configuration.getExposedPorts() != null) {
reportBuilder.addKeyValueEntry(EXPOSED_PORTS, configuration.getExposedPorts().toString());
}
if (configuration.getPortBindings() != null) {
reportBuilder.addKeyValueEntry(PORT_BINDING, configuration.getPortBindings().toString());
}
if (configuration.getLinks() != null) {
reportBuilder.addKeyValueEntry(LINKS, configuration.getLinks().toString());
}
if (configuration.getVolumes() != null) {
reportBuilder.addKeyValueEntry(VOLUMES, configuration.getVolumes().toString());
}
if (configuration.getBinds() != null) {
reportBuilder.addKeyValueEntry(BINDS, configuration.getBinds().toString());
}
if (configuration.getEntryPoint() != null) {
reportBuilder.addKeyValueEntry(ENTRY_POINT, configuration.getEntryPoint().toString());
}
if (configuration.getNetworkMode() != null) {
reportBuilder.addKeyValueEntry(NETWORK_MODE, configuration.getNetworkMode());
}
return reportBuilder.inSection(new DockerContainerSection(dockerCube.getId()));
}
}