Search in sources :

Example 1 with TestResource

use of org.entando.kubernetes.fluentspi.TestResource in project entando-k8s-controller-coordinator by entando-k8s.

the class DefaultSimpleEntandoOperationsTest method shouldWatchInAnyNamespace.

@Test
@Description("Should watch in any namespace")
void shouldWatchInAnyNamespace() {
    final Map<String, SerializedEntandoResource> resourcesObserved = new ConcurrentHashMap<>();
    step("Given I have registered a Watcher for TestResource in any namespace", () -> {
        getMyOperations().inAnyNamespace().watch((action, serializedEntandoResource) -> resourcesObserved.put(serializedEntandoResource.getMetadata().getName(), serializedEntandoResource));
    });
    step(format("When  I create two TestResource in namespaces %s and %s", MY_APP_NAMESPACE_1, MY_APP_NAMESPACE_1 + "1"), () -> {
        final TestResource testResource1 = createTestResource(new TestResource().withNames(MY_APP_NAMESPACE_1, "my-test-resource1"));
        attachment("TestResource 1", objectMapper.writeValueAsString(testResource1));
        final TestResource testResource2 = createTestResource(new TestResource().withNames(MY_APP_NAMESPACE_2, "my-test-resource2"));
        attachment("TestResource 2", objectMapper.writeValueAsString(testResource2));
    });
    step("Then both resources were observed", () -> {
        await().atMost(10, TimeUnit.SECONDS).ignoreExceptions().until(() -> resourcesObserved.containsKey("my-test-resource2"));
        assertThat(resourcesObserved).containsKeys("my-test-resource1", "my-test-resource2");
        attachment("TestResources", objectMapper.writeValueAsString(resourcesObserved));
    });
}
Also used : SerializedEntandoResource(org.entando.kubernetes.controller.spi.client.SerializedEntandoResource) TestResource(org.entando.kubernetes.fluentspi.TestResource) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) Description(io.qameta.allure.Description) Test(org.junit.jupiter.api.Test)

Example 2 with TestResource

use of org.entando.kubernetes.fluentspi.TestResource in project entando-k8s-controller-coordinator by entando-k8s.

the class DefaultSimpleEntandoOperationsTest method shouldListInAnyNamespace.

@Test
@Description("Should list in any namespace")
void shouldListInAnyNamespace() {
    step(format("Given I have created two TestResource in namespaces %s and %s", MY_APP_NAMESPACE_1, MY_APP_NAMESPACE_1 + "1"), () -> {
        final TestResource testResource1 = createTestResource(new TestResource().withNames(MY_APP_NAMESPACE_1, "my-test-resource1"));
        attachment("TestResource 1", objectMapper.writeValueAsString(testResource1));
        final TestResource testResource2 = createTestResource(new TestResource().withNames(MY_APP_NAMESPACE_2, "my-test-resource2"));
        attachment("TestResource 2", objectMapper.writeValueAsString(testResource2));
    });
    List<SerializedEntandoResource> actual = new ArrayList<>();
    step("When I list TestResources in any namespace", () -> {
        actual.addAll(getMyOperations().inAnyNamespace().list());
    });
    step("Then both resources are found", () -> {
        assertThat(actual).anyMatch(r -> r.getMetadata().getName().equals("my-test-resource1"));
        assertThat(actual).anyMatch(r -> r.getMetadata().getName().equals("my-test-resource2"));
        attachment("TestResources", objectMapper.writeValueAsString(actual));
    });
}
Also used : SerializedEntandoResource(org.entando.kubernetes.controller.spi.client.SerializedEntandoResource) ArrayList(java.util.ArrayList) TestResource(org.entando.kubernetes.fluentspi.TestResource) Description(io.qameta.allure.Description) Test(org.junit.jupiter.api.Test)

Example 3 with TestResource

use of org.entando.kubernetes.fluentspi.TestResource in project entando-k8s-controller-coordinator by entando-k8s.

the class DefaultSimpleEntandoOperationsTest method shouldListInSingleNamespace.

@Test
@Description("Should list in a single namespace")
void shouldListInSingleNamespace() {
    step(format("Given I have created two TestResource in namespaces %s and %s", MY_APP_NAMESPACE_1, MY_APP_NAMESPACE_1 + "1"), () -> {
        final TestResource testResource1 = createTestResource(new TestResource().withNames(MY_APP_NAMESPACE_1, "my-test-resource1"));
        attachment("TestResource 1", objectMapper.writeValueAsString(testResource1));
        final TestResource testResource2 = createTestResource(new TestResource().withNames(MY_APP_NAMESPACE_2, "my-test-resource2"));
        attachment("TestResource 2", objectMapper.writeValueAsString(testResource2));
    });
    List<SerializedEntandoResource> actual = new ArrayList<>();
    step("When I list TestResources in any namespace", () -> {
        actual.addAll(getMyOperations().inNamespace(MY_APP_NAMESPACE_1).list());
    });
    step("Then both resources are found", () -> {
        await().atMost(10, TimeUnit.SECONDS).ignoreExceptions().until(() -> actual.size() == 1);
        assertThat(actual).size().isEqualTo(1);
        assertThat(actual).anyMatch(r -> r.getMetadata().getName().equals("my-test-resource1"));
        attachment("TestResource 1", objectMapper.writeValueAsString(actual));
    });
}
Also used : SerializedEntandoResource(org.entando.kubernetes.controller.spi.client.SerializedEntandoResource) ArrayList(java.util.ArrayList) TestResource(org.entando.kubernetes.fluentspi.TestResource) Description(io.qameta.allure.Description) Test(org.junit.jupiter.api.Test)

Example 4 with TestResource

use of org.entando.kubernetes.fluentspi.TestResource in project entando-k8s-controller-coordinator by entando-k8s.

the class PodManagementTests method shouldKillAllPreviousPods.

@Test
@Description("Should always kill existing pods running against the same resource to avoid racing conditions")
void shouldKillAllPreviousPods() {
    step("Given the Coordinator observes its own namespace", () -> {
        System.setProperty(EntandoOperatorConfigProperty.ENTANDO_NAMESPACES_TO_OBSERVE.getJvmSystemProperty(), clientDouble.getNamespace());
        coordinator.onStartup(new StartupEvent());
    });
    step("And automatic controller pod garbage collections has been switched off", () -> System.setProperty(EntandoOperatorConfigProperty.ENTANDO_K8S_OPERATOR_GC_CONTROLLER_PODS.getJvmSystemProperty(), "false"));
    ValueHolder<SerializedEntandoResource> testResource = new ValueHolder<>();
    step("And I have created a new TestResource resource", () -> {
        final TestResource entandoCustomResource = new TestResource().withNames(clientDouble.getNamespace(), "test-keycloak").withSpec(new BasicDeploymentSpecBuilder().withDbms(DbmsVendor.EMBEDDED).build());
        testResource.set(clientDouble.createOrPatchEntandoResource(CoordinatorTestUtils.toSerializedResource(entandoCustomResource)));
        attachment("TestResource", objectMapper.writeValueAsString(testResource.get()));
    });
    ValueHolder<Pod> firstPod = new ValueHolder<>();
    step("And I have waited to see at least one controller pod", () -> {
        await().ignoreExceptions().atMost(5, TimeUnit.SECONDS).until(() -> clientDouble.loadPod(clientDouble.getNamespace(), labelsFromResource(testResource.get())) != null);
        firstPod.set(clientDouble.loadPod(clientDouble.getNamespace(), labelsFromResource(testResource.get())));
        attachment("FirstPod", objectMapper.writeValueAsString(firstPod.get()));
    });
    step("When I force a second attempt at processing the resource", () -> {
        final SerializedEntandoResource reloaded = clientDouble.reload(testResource.get());
        reloaded.getMetadata().setAnnotations(Map.of(AnnotationNames.PROCESSING_INSTRUCTION.getName(), "force"));
        clientDouble.createOrPatchEntandoResource(reloaded);
    });
    step("Then a new pod was created", () -> {
        await().atMost(4, TimeUnit.SECONDS).ignoreExceptions().until(() -> {
            final List<Pod> pods = clientDouble.loadPods(clientDouble.getNamespace(), labelsFromResource(testResource.get()));
            return !pods.get(pods.size() - 1).getMetadata().getUid().equals(firstPod.get().getMetadata().getUid());
        });
        final List<Pod> pods = clientDouble.loadPods(clientDouble.getNamespace(), labelsFromResource(testResource.get()));
        attachment("Second Pod", objectMapper.writeValueAsString(pods.get(pods.size() - 1)));
    });
    step("And the old pod was removed", () -> {
        final List<Pod> pods = clientDouble.loadPods(clientDouble.getNamespace(), labelsFromResource(testResource.get()));
        assertThat(pods.size()).isOne();
    });
}
Also used : SerializedEntandoResource(org.entando.kubernetes.controller.spi.client.SerializedEntandoResource) Pod(io.fabric8.kubernetes.api.model.Pod) StartupEvent(io.quarkus.runtime.StartupEvent) TestResource(org.entando.kubernetes.fluentspi.TestResource) ValueHolder(org.entando.kubernetes.test.common.ValueHolder) BasicDeploymentSpecBuilder(org.entando.kubernetes.fluentspi.BasicDeploymentSpecBuilder) Description(io.qameta.allure.Description) Test(org.junit.jupiter.api.Test)

Example 5 with TestResource

use of org.entando.kubernetes.fluentspi.TestResource in project entando-k8s-controller-coordinator by entando-k8s.

the class ControllerCoordinatorProcessingCriteriaTest method testDuplicatesIgnored.

@Test
@Description("Resource modification events should be ignored when Kubernetes it twice with the same resource version")
void testDuplicatesIgnored() {
    step("Given the Coordinator observes this namespace", () -> {
        System.setProperty(EntandoOperatorConfigProperty.ENTANDO_NAMESPACES_TO_OBSERVE.getJvmSystemProperty(), OBSERVED_NAMESPACE);
        coordinator.onStartup(new StartupEvent());
    });
    final ValueHolder<SerializedEntandoResource> testResource = new ValueHolder<>();
    step("And I have created an TestResource resource", () -> {
        testResource.set(createTestResource(1L, Collections.emptyMap()));
        attachment("TestResource", objectMapper.writeValueAsString(testResource.get()));
    });
    final ValueHolder<Pod> oldPod = new ValueHolder<>();
    step("And its controller pod has been created", () -> {
        await().ignoreExceptions().atMost(3, TimeUnit.SECONDS).until(() -> clientDouble.loadPod(CONTROLLER_NAMESPACE, labelsFromResource(testResource.get())) != null);
        oldPod.set(clientDouble.loadPod(CONTROLLER_NAMESPACE, labelsFromResource(testResource.get())));
        attachment("Controller Pod", objectMapper.writeValueAsString(oldPod.get()));
    });
    step("When a duplicate event is fired", () -> {
        // NB we have to invoke the observer directly as our test double doesn't generate duplicate events
        coordinator.getObserver(CustomResourceDefinitionContext.fromCustomResourceType(TestResource.class)).eventReceived(Action.ADDED, testResource.get());
        coordinator.shutdownObservers(10, TimeUnit.SECONDS);
        attachment("Duplicate Resource", objectMapper.writeValueAsString(testResource.get()));
    });
    step("Then no new pod gets created", () -> {
        // NB This assertion assumes the ClientDouble is storing the objects without cloning/serialization
        assertThat(clientDouble.loadPod(CONTROLLER_NAMESPACE, labelsFromResource(testResource.get()))).isSameAs(oldPod.get());
    });
    step("And the duplicate event was logged", () -> {
        final Optional<String> logEntry = LogInterceptor.getLogEntries().stream().filter(s -> s.startsWith("Duplicate event")).findFirst();
        assertThat(logEntry).isPresent();
    });
}
Also used : BeforeEach(org.junit.jupiter.api.BeforeEach) Allure.attachment(io.qameta.allure.Allure.attachment) SerializedEntandoResource(org.entando.kubernetes.controller.spi.client.SerializedEntandoResource) DbmsVendor(org.entando.kubernetes.model.common.DbmsVendor) Assertions.assertThat(org.assertj.core.api.Assertions.assertThat) TimeoutException(java.util.concurrent.TimeoutException) Action(io.fabric8.kubernetes.client.Watcher.Action) ValueHolder(org.entando.kubernetes.test.common.ValueHolder) CustomResourceDefinitionContext(io.fabric8.kubernetes.client.dsl.base.CustomResourceDefinitionContext) EntandoOperatorConfigProperty(org.entando.kubernetes.controller.support.common.EntandoOperatorConfigProperty) Feature(io.qameta.allure.Feature) LabelNames(org.entando.kubernetes.controller.spi.common.LabelNames) ExtendWith(org.junit.jupiter.api.extension.ExtendWith) LogInterceptor(org.entando.kubernetes.test.common.LogInterceptor) Map(java.util.Map) YAMLFactory(com.fasterxml.jackson.dataformat.yaml.YAMLFactory) ResourceUtils(org.entando.kubernetes.controller.spi.common.ResourceUtils) Tag(org.junit.jupiter.api.Tag) Issue(io.qameta.allure.Issue) CoordinatorTestUtils(org.entando.kubernetes.controller.coordinator.common.CoordinatorTestUtils) BasicDeploymentSpecBuilder(org.entando.kubernetes.fluentspi.BasicDeploymentSpecBuilder) ObjectMetaBuilder(io.fabric8.kubernetes.api.model.ObjectMetaBuilder) SimpleKubernetesClientDouble(org.entando.kubernetes.controller.coordinator.common.SimpleKubernetesClientDouble) CommonLabels(org.entando.kubernetes.test.common.CommonLabels) FluentIntegrationTesting(org.entando.kubernetes.controller.support.client.impl.integrationtesthelpers.FluentIntegrationTesting) MockitoExtension(org.mockito.junit.jupiter.MockitoExtension) ObjectMapper(com.fasterxml.jackson.databind.ObjectMapper) Pod(io.fabric8.kubernetes.api.model.Pod) JsonProcessingException(com.fasterxml.jackson.core.JsonProcessingException) IOException(java.io.IOException) CustomResourceDefinitionBuilder(io.fabric8.kubernetes.api.model.apiextensions.v1beta1.CustomResourceDefinitionBuilder) StandardCapability(org.entando.kubernetes.model.capability.StandardCapability) TestResource(org.entando.kubernetes.fluentspi.TestResource) TimeUnit(java.util.concurrent.TimeUnit) Test(org.junit.jupiter.api.Test) EntandoResourceClientDouble(org.entando.kubernetes.controller.support.client.doubles.EntandoResourceClientDouble) AfterEach(org.junit.jupiter.api.AfterEach) Allure.step(io.qameta.allure.Allure.step) ProvidedCapabilityBuilder(org.entando.kubernetes.model.capability.ProvidedCapabilityBuilder) Optional(java.util.Optional) Tags(org.junit.jupiter.api.Tags) RandomStringUtils(org.apache.commons.lang3.RandomStringUtils) StartupEvent(io.quarkus.runtime.StartupEvent) Description(io.qameta.allure.Description) Collections(java.util.Collections) CustomResourceDefinition(io.fabric8.kubernetes.api.model.apiextensions.v1beta1.CustomResourceDefinition) EntandoDeploymentPhase(org.entando.kubernetes.model.common.EntandoDeploymentPhase) SerializedEntandoResource(org.entando.kubernetes.controller.spi.client.SerializedEntandoResource) Pod(io.fabric8.kubernetes.api.model.Pod) StartupEvent(io.quarkus.runtime.StartupEvent) ValueHolder(org.entando.kubernetes.test.common.ValueHolder) Description(io.qameta.allure.Description) Test(org.junit.jupiter.api.Test)

Aggregations

TestResource (org.entando.kubernetes.fluentspi.TestResource)17 Description (io.qameta.allure.Description)15 SerializedEntandoResource (org.entando.kubernetes.controller.spi.client.SerializedEntandoResource)15 Test (org.junit.jupiter.api.Test)15 BasicDeploymentSpecBuilder (org.entando.kubernetes.fluentspi.BasicDeploymentSpecBuilder)10 ValueHolder (org.entando.kubernetes.test.common.ValueHolder)10 StartupEvent (io.quarkus.runtime.StartupEvent)8 Pod (io.fabric8.kubernetes.api.model.Pod)7 ObjectMapper (com.fasterxml.jackson.databind.ObjectMapper)5 YAMLFactory (com.fasterxml.jackson.dataformat.yaml.YAMLFactory)5 ObjectMetaBuilder (io.fabric8.kubernetes.api.model.ObjectMetaBuilder)5 CustomResourceDefinition (io.fabric8.kubernetes.api.model.apiextensions.v1beta1.CustomResourceDefinition)5 CustomResourceDefinitionBuilder (io.fabric8.kubernetes.api.model.apiextensions.v1beta1.CustomResourceDefinitionBuilder)5 Allure.attachment (io.qameta.allure.Allure.attachment)5 Allure.step (io.qameta.allure.Allure.step)5 Feature (io.qameta.allure.Feature)5 Issue (io.qameta.allure.Issue)5 IOException (java.io.IOException)5 Map (java.util.Map)5 TimeUnit (java.util.concurrent.TimeUnit)5