package org.arquillian.cube.kubernetes.reporter; import io.fabric8.kubernetes.clnt.v2_2.KubernetesClient; import java.io.File; import java.io.IOException; import java.net.URL; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; import java.util.List; import org.arquillian.cube.kubernetes.api.Configuration; import org.arquillian.cube.kubernetes.api.DependencyResolver; import org.arquillian.cube.kubernetes.api.Session; import org.arquillian.cube.kubernetes.impl.event.AfterStart; import org.arquillian.cube.kubernetes.impl.event.Start; import org.arquillian.reporter.api.builder.Reporter; import org.arquillian.reporter.api.builder.report.ReportBuilder; import org.arquillian.reporter.api.event.SectionEvent; import org.arquillian.reporter.api.model.entry.FileEntry; import org.jboss.arquillian.core.api.Event; import org.jboss.arquillian.core.api.Instance; import org.jboss.arquillian.core.api.annotation.Inject; import org.jboss.arquillian.core.api.annotation.Observes; import static org.arquillian.cube.kubernetes.reporter.KubernetesReportKey.CONFIGURATION; import static org.arquillian.cube.kubernetes.reporter.KubernetesReportKey.KUBERNETES_SECTION_NAME; import static org.arquillian.cube.kubernetes.reporter.KubernetesReportKey.MASTER_URL; import static org.arquillian.cube.kubernetes.reporter.KubernetesReportKey.NAMESPACE; import static org.arquillian.cube.kubernetes.reporter.KubernetesReportKey.SESSION_STATUS; public class TakeKubernetesResourcesInformation { @Inject Event<SectionEvent> sectionEvent; @Inject Instance<DependencyResolver> dependencyResolver; public void reportKubernetesConfiguration(@Observes Start start, Configuration configuration, org.arquillian.reporter.config.ReporterConfiguration reporterConfiguration) throws IOException { final ReportBuilder reportBuilder = Reporter.createReport(CONFIGURATION); Session session = start.getSession(); if (configuration != null) { reportBuilder.addEntries(getFilesForResourcesConfiguration(session, configuration, reporterConfiguration)); } Reporter.createReport(KUBERNETES_SECTION_NAME) .addReport(reportBuilder) .inSection(new KubernetesSection()).fire(sectionEvent); } public void reportSessionStatus(@Observes AfterStart afterStart, KubernetesClient kubernetesClient) { Session session = afterStart.getSession(); if (session != null) { String namespace = session.getNamespace(); Reporter.createReport(SESSION_STATUS) .addKeyValueEntry(NAMESPACE, namespace) .addKeyValueEntry(MASTER_URL, String.valueOf(kubernetesClient.getMasterUrl())) .inSection(new KubernetesSection()) .asSubReport() .fire(sectionEvent); } } /* private TableEntry getTableForReplicationControllers(KubernetesClient kubernetesClient, String namespace) { TableEntry tableEntry = createTableEntryWithTHead(REPLICATION_CONTROLLER, REPLICATION_CONTROLLER, REPLICAS); for (ReplicationController replicationController : kubernetesClient.replicationControllers().inNamespace(namespace).list().getItems()) { TableRowEntry tableRowEntry = new TableRowEntry(); tableRowEntry.addCells(new TableCellEntry(replicationController.getMetadata().getName()), new TableCellEntry(String.valueOf(replicationController.getSpec().getReplicas()))); tableEntry.getTableBody().getRows().add(tableRowEntry); } return tableEntry; } private TableEntry getTableForServices(KubernetesClient kubernetesClient, String namespace) { TableEntry tableEntry = createTableEntryWithTHead(SERVICE, SERVICE, CLUSTER_IP, PORTS); for (Service service : kubernetesClient.services().inNamespace(namespace).list().getItems()) { TableRowEntry tableRowEntry = new TableRowEntry(); tableRowEntry.addCells( new TableCellEntry(service.getMetadata().getName()), new TableCellEntry(String.valueOf(service.getSpec().getClusterIP())), new TableCellEntry(getPortsForService(service))); tableEntry.getTableBody().getRows().add(tableRowEntry); } return tableEntry; } private TableEntry getTableForPods(KubernetesClient kubernetesClient, String namespace) { TableEntry tableEntry = createTableEntryWithTHead(POD, POD, STATUS); for (Pod pod : kubernetesClient.pods().inNamespace(namespace).list().getItems()) { TableRowEntry tableRowEntry = new TableRowEntry(); tableRowEntry.addCells(new TableCellEntry(pod.getMetadata().getName()), new TableCellEntry(pod.getStatus().getPhase())); tableEntry.getTableBody().getRows().add(tableRowEntry); } return tableEntry; } private TableEntry createTableEntryWithTHead(String name, String... heads) { TableEntry tableEntry = new TableEntry(); tableEntry.setTableName(name); for (String head : heads) { tableEntry.getTableHead().getRow().addCell(new TableCellEntry(head)); } return tableEntry; }*/ private List<FileEntry> getFilesForResourcesConfiguration(Session session, Configuration configuration, org.arquillian.reporter.config.ReporterConfiguration reporterConfiguration) throws IOException { final List<FileEntry> fileEntries = new ArrayList<>(); URL environmentConfigUrl = configuration.getEnvironmentConfigUrl(); if (environmentConfigUrl != null) { fileEntries.add(getFileForResourcesConfiguration(environmentConfigUrl, reporterConfiguration)); } if (configuration.isEnvironmentInitEnabled()) { List<URL> dependencyUrls = !configuration.getEnvironmentDependencies().isEmpty() ? configuration.getEnvironmentDependencies() : dependencyResolver.get().resolve(session); for (URL dependencyUrl : dependencyUrls) { fileEntries.add(getFileForResourcesConfiguration(dependencyUrl, reporterConfiguration)); } } return fileEntries; } private FileEntry getFileForResourcesConfiguration(URL url, org.arquillian.reporter.config.ReporterConfiguration reporterConfiguration) throws IOException { final Path rootDir = Paths.get(reporterConfiguration.getRootDirectory()); final String filePath = relativizePath(url, rootDir); return new org.arquillian.reporter.api.model.entry.FileEntry(filePath); } private String relativizePath(URL url, Path rootDir) { String filePath; final String pathURL = url.toString(); final String absoluteRootDir = new File(rootDir.toString()).getAbsolutePath(); if (pathURL.contains(absoluteRootDir)) { final Path rootDirPath = Paths.get(absoluteRootDir); final Path configFilePath = Paths.get(url.getFile()); final Path relativize = rootDirPath.relativize(configFilePath); filePath = relativize.toString(); } else { filePath = pathURL; } return filePath; } /*private String getPortsForService(Service service) { StringBuilder sb = new StringBuilder(); for (ServicePort servicePort : service.getSpec().getPorts()) { sb.append(servicePort.getPort()).append(" "); } return sb.toString(); } */ }