package org.arquillian.cube.kubernetes.reporter;
import io.fabric8.kubernetes.api.model.v2_2.NamespaceBuilder;
import io.fabric8.kubernetes.api.model.v2_2.Pod;
import io.fabric8.kubernetes.api.model.v2_2.PodBuilder;
import io.fabric8.kubernetes.api.model.v2_2.PodListBuilder;
import io.fabric8.kubernetes.api.model.v2_2.ReplicationController;
import io.fabric8.kubernetes.api.model.v2_2.ReplicationControllerBuilder;
import io.fabric8.kubernetes.api.model.v2_2.ReplicationControllerListBuilder;
import io.fabric8.kubernetes.api.model.v2_2.Service;
import io.fabric8.kubernetes.api.model.v2_2.ServiceBuilder;
import io.fabric8.kubernetes.api.model.v2_2.ServiceListBuilder;
import io.fabric8.kubernetes.clnt.v2_2.server.mock.KubernetesMockServer;
import java.io.IOException;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
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.DefaultConfiguration;
import org.arquillian.cube.kubernetes.impl.DefaultSession;
import org.arquillian.cube.kubernetes.impl.event.AfterStart;
import org.arquillian.cube.kubernetes.impl.event.Start;
import org.arquillian.cube.kubernetes.impl.log.SimpleLogger;
import org.arquillian.cube.kubernetes.impl.resolve.ShrinkwrapResolver;
import org.arquillian.reporter.api.builder.BuilderLoader;
import org.arquillian.reporter.api.event.SectionEvent;
import org.arquillian.reporter.api.model.StringKey;
import org.arquillian.reporter.api.model.entry.FileEntry;
import org.arquillian.reporter.api.model.entry.KeyValueEntry;
import org.arquillian.reporter.api.model.report.BasicReport;
import org.arquillian.reporter.api.model.report.Report;
import org.arquillian.reporter.config.ReporterConfiguration;
import org.jboss.arquillian.core.api.Event;
import org.jboss.arquillian.core.api.Instance;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
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.reporter.impl.asserts.ReportAssert.assertThatReport;
import static org.arquillian.reporter.impl.asserts.SectionAssert.assertThatSection;
import static org.mockito.Mockito.verify;
@RunWith(MockitoJUnitRunner.class)
public class TakeKubernetesResourcesInformationTest {
private static final KubernetesMockServer server = new KubernetesMockServer();
/*
private static final String TABLE_ENTRY = "TableEntry";
private static final String TABLE_HEAD = "tableHead";
private static final String TABLE_BODY = "tableBody";
private static final String CELLS = "cells";
private static final String ROW = "row";
private static final String ROWS = "rows";*/
private static final String TEST_CLASSES = "test-classes/";
private static final String FILE_NAME = "kubernetes1.json";
private static final String RELATIVE_PATH = TEST_CLASSES + Configuration.DEFAULT_CONFIG_FILE_NAME;
private static final String SERVICES_FILE_NAME = "services.json";
private static final String REPLICATION_CONTROLLER_FILE_NAME = "replication_controller.json";
private static final String SERVICE_PATH = "http://foo.com/services.json";
private static final String REPLICATION_CONTROLLER_PATH = "http://foo.com/replication_controller.json";
@Mock
Event<SectionEvent> sectionEvent;
@Captor
ArgumentCaptor<SectionEvent> reportEventArgumentCaptor;
@BeforeClass
public static void setUpClass() throws IOException {
Pod testPod = new PodBuilder()
.withNewMetadata()
.withName("test-pod")
.endMetadata()
.withNewStatus()
.withPhase("Running")
.endStatus()
.build();
Service testService = new ServiceBuilder()
.withNewMetadata()
.withName("test-service")
.endMetadata()
.withNewSpec()
.withClusterIP("10.0.0.1")
.addNewPort()
.withPort(8080)
.endPort()
.endSpec()
.build();
ReplicationController testController = new ReplicationControllerBuilder()
.withNewMetadata()
.withName("test-controller")
.endMetadata()
.withNewSpec()
.addToSelector("name", "somelabel")
.withReplicas(1)
.withNewTemplate()
.withNewMetadata()
.addToLabels("name", "somelabel")
.endMetadata()
.withNewSpec()
.addNewContainer()
.withName("test-container2")
.withImage("test/image2")
.endContainer()
.endSpec()
.endTemplate()
.endSpec()
.build();
server.expect().get().withPath("/api/v1/namespaces/arquillian").andReturn(200, new NamespaceBuilder()
.withNewMetadata()
.withName("arquillian")
.and().build()).always();
//test-controller
server.expect()
.get()
.withPath("/api/v1/namespaces/arquillian/replicationcontrollers/test-controller")
.andReturn(200, testController)
.always();
server.expect()
.get()
.withPath("/api/v1/namespaces/arquillian/replicationcontrollers")
.andReturn(200, new ReplicationControllerListBuilder()
.withItems(testController).build())
.always();
//test-pod
server.expect().get().withPath("/api/v1/namespaces/arquillian/pods/test-pod").andReturn(200, testPod).always();
server.expect().get().withPath("/api/v1/namespaces/arquillian/pods").andReturn(200, new PodListBuilder()
.withItems(testPod)
.build()).always();
//test-service
server.expect()
.get()
.withPath("/api/v1/namespaces/arquillian/services/test-service")
.andReturn(200, testService)
.always();
server.expect().get().withPath("/api/v1/namespaces/arquillian/services").andReturn(200, new ServiceListBuilder()
.withItems(testService)
.build()).always();
}
@Before
public void setUp() {
BuilderLoader.load();
}
@Test
public void should_report_environment_configuration_file_from_test_resources() throws IOException {
//given
Configuration configuration = DefaultConfiguration.fromMap(addEnvironmentConfigUrl(getConfig(), FILE_NAME));
TakeKubernetesResourcesInformation takeKubernetesResourcesInformation = new TakeKubernetesResourcesInformation();
takeKubernetesResourcesInformation.sectionEvent = sectionEvent;
takeKubernetesResourcesInformation.dependencyResolver = getDependencyResolverInstance();
//when
takeKubernetesResourcesInformation.reportKubernetesConfiguration(new Start(getDefaultSession(configuration)),
configuration, getReporterConfiguration());
//then
verify(sectionEvent).fire(reportEventArgumentCaptor.capture());
final SectionEvent sectionEvent = reportEventArgumentCaptor.getValue();
final Report report = sectionEvent.getReport();
assertSectionEvent(sectionEvent, KUBERNETES_SECTION_NAME);
final List<Report> subReports = report.getSubReports();
assertThatReport(subReports.get(0))
.hasName(CONFIGURATION)
.hasNumberOfEntries(1)
.hasEntriesContaining(new FileEntry(TEST_CLASSES + FILE_NAME));
}
@Test
public void should_report_environment_configuration_file_from_default_location() throws IOException {
//given
Configuration configuration = getConfiguration();
TakeKubernetesResourcesInformation takeKubernetesResourcesInformation = new TakeKubernetesResourcesInformation();
takeKubernetesResourcesInformation.sectionEvent = sectionEvent;
takeKubernetesResourcesInformation.dependencyResolver = getDependencyResolverInstance();
//when
takeKubernetesResourcesInformation.reportKubernetesConfiguration(new Start(getDefaultSession(configuration)),
configuration, getReporterConfiguration());
//then
verify(sectionEvent).fire(reportEventArgumentCaptor.capture());
final SectionEvent sectionEvent = reportEventArgumentCaptor.getValue();
final Report report = sectionEvent.getReport();
assertSectionEvent(sectionEvent, KUBERNETES_SECTION_NAME);
final List<Report> subReports = report.getSubReports();
assertThatReport(subReports.get(0))
.hasName(CONFIGURATION)
.hasNumberOfEntries(1)
.hasEntriesContaining(new FileEntry(RELATIVE_PATH));
}
@Test
public void should_report_environment_dependencies_from_http_url_and_configuration_from_default_location()
throws IOException {
//given
String resourceName = SERVICE_PATH + " " + REPLICATION_CONTROLLER_PATH;
Configuration configuration = DefaultConfiguration.fromMap(addEnvironmentDependencies(getConfig(), resourceName));
TakeKubernetesResourcesInformation takeKubernetesResourcesInformation = new TakeKubernetesResourcesInformation();
takeKubernetesResourcesInformation.sectionEvent = sectionEvent;
takeKubernetesResourcesInformation.dependencyResolver = getDependencyResolverInstance();
//when
takeKubernetesResourcesInformation.reportKubernetesConfiguration(new Start(getDefaultSession(configuration)),
configuration, getReporterConfiguration());
//then
verify(sectionEvent).fire(reportEventArgumentCaptor.capture());
final SectionEvent sectionEvent = reportEventArgumentCaptor.getValue();
final Report report = sectionEvent.getReport();
assertSectionEvent(sectionEvent, KUBERNETES_SECTION_NAME);
final List<Report> subReports = report.getSubReports();
assertThatReport(subReports.get(0))
.hasName(CONFIGURATION)
.hasNumberOfEntries(3)
.hasEntriesContaining(
new FileEntry(RELATIVE_PATH),
new FileEntry(SERVICE_PATH),
new FileEntry(REPLICATION_CONTROLLER_PATH));
}
@Test
public void should_report_environment_dependencies_from_file_url_and_configuration_from_default_location()
throws IOException {
//given
String resouceName = getResourceURL(SERVICES_FILE_NAME) + " " + getResourceURL(REPLICATION_CONTROLLER_FILE_NAME);
Configuration configuration = DefaultConfiguration.fromMap(addEnvironmentDependencies(getConfig(), resouceName));
TakeKubernetesResourcesInformation takeKubernetesResourcesInformation = new TakeKubernetesResourcesInformation();
takeKubernetesResourcesInformation.sectionEvent = sectionEvent;
takeKubernetesResourcesInformation.dependencyResolver = (() -> new ShrinkwrapResolver("pom.xml", false));
//when
takeKubernetesResourcesInformation.reportKubernetesConfiguration(new Start(getDefaultSession(configuration)),
configuration, getReporterConfiguration());
//then
verify(sectionEvent).fire(reportEventArgumentCaptor.capture());
final SectionEvent sectionEvent = reportEventArgumentCaptor.getValue();
final Report report = sectionEvent.getReport();
assertSectionEvent(sectionEvent, KUBERNETES_SECTION_NAME);
final List<Report> subReports = report.getSubReports();
assertThatReport(subReports.get(0))
.hasName(CONFIGURATION)
.hasNumberOfEntries(3)
.hasEntriesContaining(
new FileEntry(RELATIVE_PATH),
new FileEntry(TEST_CLASSES + SERVICES_FILE_NAME),
new FileEntry(TEST_CLASSES + REPLICATION_CONTROLLER_FILE_NAME));
}
@Test
public void should_report_master_url_and_namespace() {
String masterURL = "http://" + server.getHostName() + ":" + server.getPort() + "/";
configureTakeKubernetesInformation();
verify(sectionEvent).fire(reportEventArgumentCaptor.capture());
final SectionEvent sectionEvent = reportEventArgumentCaptor.getValue();
final Report report = sectionEvent.getReport();
assertThatSection(sectionEvent).hasSectionId("k8s").hasReportOfTypeThatIsAssignableFrom(BasicReport.class);
assertThatReport(sectionEvent.getReport())
.hasNumberOfEntries(2);
assertThatReport(report).hasEntriesContaining(
new KeyValueEntry(NAMESPACE, "arquillian"),
new KeyValueEntry(MASTER_URL, masterURL));
}
/*@Test
public void should_report_replication_controllers() {
configureTakeKubernetesInformation();
verify(sectionEvent).fire(reportEventArgumentCaptor.capture());
final PropertyReportEvent propertyReportEvent = reportEventArgumentCaptor.getValue();
List<PropertyEntry> rootEntries = assertPropertyEntryAndGetAllEntries(propertyReportEvent);
assertSizeAndType(rootEntries);
PropertyEntry entryList = rootEntries.get(2);
TableEntry tableEntry = (TableEntry) entryList;
assertThat(tableEntry).extracting(TABLE_HEAD).extracting(ROW).flatExtracting(CELLS).
hasSize(2).containsExactly(
new TableCellEntry(REPLICATION_CONTROLLER),
new TableCellEntry(TakeKubernetesResourcesInformation.REPLICAS));
assertThat(tableEntry).extracting(TABLE_BODY).flatExtracting(ROWS).hasSize(1);
assertThat(tableEntry.getTableBody().getRows().get(0).getCells()).hasSize(2).extractingResultOf(GET_CONTENT)
.containsExactly("test-controller", "1");
}
@Test
public void should_report_services() {
configureTakeKubernetesInformation();
verify(sectionEvent).fire(reportEventArgumentCaptor.capture());
final PropertyReportEvent propertyReportEvent = reportEventArgumentCaptor.getValue();
List<PropertyEntry> rootEntries = assertPropertyEntryAndGetAllEntries(propertyReportEvent);
assertSizeAndType(rootEntries);
PropertyEntry entryList = rootEntries.get(4);
TableEntry tableEntry = (TableEntry) entryList;
assertThat(tableEntry).extracting(TABLE_HEAD).extracting(ROW).flatExtracting(CELLS).
hasSize(3).containsExactly(
new TableCellEntry(TakeKubernetesResourcesInformation.SERVICE),
new TableCellEntry(TakeKubernetesResourcesInformation.CLUSTER_IP),
new TableCellEntry(TakeKubernetesResourcesInformation.PORTS));
assertThat(tableEntry).extracting(TABLE_BODY).flatExtracting(ROWS).hasSize(1);
assertThat(tableEntry.getTableBody().getRows().get(0).getCells()).hasSize(3).extractingResultOf(GET_CONTENT)
.containsExactly("test-service", "10.0.0.1", "8080 ");
}
@Test
public void should_report_pods() {
configureTakeKubernetesInformation();
verify(sectionEvent).fire(reportEventArgumentCaptor.capture());
final PropertyReportEvent propertyReportEvent = reportEventArgumentCaptor.getValue();
List<PropertyEntry> rootEntries = assertPropertyEntryAndGetAllEntries(propertyReportEvent);
assertSizeAndType(rootEntries);
PropertyEntry entryList = rootEntries.get(3);
TableEntry tableEntry = (TableEntry) entryList;
assertThat(tableEntry).extracting(TABLE_HEAD).extracting(ROW).flatExtracting(CELLS).
hasSize(2).containsExactly(
new TableCellEntry(TakeKubernetesResourcesInformation.POD),
new TableCellEntry(TakeKubernetesResourcesInformation.STATUS));
assertThat(tableEntry).extracting(TABLE_BODY).flatExtracting(ROWS).hasSize(1);
assertThat(tableEntry.getTableBody().getRows().get(0).getCells()).hasSize(2).extractingResultOf(GET_CONTENT)
.containsExactly("test-pod", "Running");
}
*/
private void assertSectionEvent(SectionEvent sectionEvent, StringKey name) {
assertThatSection(sectionEvent).hasSectionId("k8s").hasReportOfTypeThatIsAssignableFrom(BasicReport.class);
assertThatReport(sectionEvent.getReport())
.hasName(name)
.hasNumberOfEntries(0).hasNumberOfSubReports(1);
}
private TakeKubernetesResourcesInformation configureTakeKubernetesInformation() {
Configuration configuration = getConfiguration();
TakeKubernetesResourcesInformation takeKubernetesResourcesInformation = new TakeKubernetesResourcesInformation();
takeKubernetesResourcesInformation.sectionEvent = sectionEvent;
takeKubernetesResourcesInformation.reportSessionStatus(new AfterStart(getDefaultSession(configuration)),
server.createClient());
return takeKubernetesResourcesInformation;
}
private Session getDefaultSession(Configuration configuration) {
return new DefaultSession(configuration.getSessionId(), configuration.getNamespace(), new SimpleLogger());
}
private Configuration getConfiguration() {
return DefaultConfiguration.fromMap(getConfig());
}
private Map<String, String> addEnvironmentConfigUrl(Map<String, String> config, String resourceName) {
config.put(Configuration.ENVIRONMENT_CONFIG_URL, getResourceURL(resourceName));
return config;
}
private String getResourceURL(String resourceName) {
return TakeKubernetesResourcesInformationTest.class.getResource("/" + resourceName).toString();
}
private Map<String, String> getConfig() {
Map<String, String> config = new LinkedHashMap();
config.put(Configuration.NAMESPACE_TO_USE, "arquillian");
return config;
}
private Map<String, String> addEnvironmentDependencies(Map<String, String> config, String resourceName) {
config.put(Configuration.ENVIRONMENT_DEPENDENCIES, resourceName);
return config;
}
private Instance<DependencyResolver> getDependencyResolverInstance() {
return () -> new ShrinkwrapResolver("pom.xml", false);
}
public ReporterConfiguration getReporterConfiguration() {
return ReporterConfiguration.fromMap(new LinkedHashMap<>());
}
}