use of org.entando.kubernetes.controller.spi.client.SerializedEntandoResource in project entando-k8s-controller-coordinator by entando-k8s.
the class ControllerCoordinatorProcessingCriteriaTest method testIgnoredWhenOwnedByResourceOfInterest.
@Test
@Description("Resources should be ignored when they are owned by other resources of interest")
void testIgnoredWhenOwnedByResourceOfInterest() {
step("Given the Coordinator observes this namespace", () -> System.setProperty(EntandoOperatorConfigProperty.ENTANDO_NAMESPACES_TO_OBSERVE.getJvmSystemProperty(), OBSERVED_NAMESPACE));
ValueHolder<SerializedEntandoResource> owningResource = new ValueHolder<>();
step("And I have created another resource of interest, a ProvidedCapability", () -> {
owningResource.set(clientDouble.createOrPatchEntandoResource(CoordinatorTestUtils.toSerializedResource(new ProvidedCapabilityBuilder().withNewMetadata().withName("my-capability").withNamespace(OBSERVED_NAMESPACE).endMetadata().withNewSpec().withCapability(StandardCapability.DBMS).endSpec().build())));
attachment("CapabilityResource", objectMapper.writeValueAsString(owningResource.get()));
});
ValueHolder<SerializedEntandoResource> testResource = new ValueHolder<>();
step("And I have created an TestResource resource that is owned by another resource of interest", () -> {
testResource.set(createTestResource(1L, Collections.emptyMap()));
testResource.get().getMetadata().getOwnerReferences().add(ResourceUtils.buildOwnerReference(owningResource.get()));
clientDouble.createOrPatchEntandoResource(testResource.get());
});
step("when I start the ControllerCoordinator", () -> coordinator.onStartup(new StartupEvent()));
step("Then a new pod gets created for the owning resource", () -> {
await().ignoreExceptions().atMost(10, SECONDS).until(() -> clientDouble.loadPod(CONTROLLER_NAMESPACE, labelsFromResource(owningResource.get())) != null);
attachment("Controller Pod", objectMapper.writeValueAsString(clientDouble.loadPod(CONTROLLER_NAMESPACE, labelsFromResource(owningResource.get()))));
});
step("Then no new pod gets created for the owned resource", () -> {
assertThat(clientDouble.loadPod(CONTROLLER_NAMESPACE, labelsFromResource(testResource.get()))).isNull();
});
step("And the ignored event was logged", () -> {
final Optional<String> logEntry = LogInterceptor.getLogEntries().stream().filter(s -> s.contains("is ignored because it is not a top level resource")).findFirst();
assertThat(logEntry).isPresent();
});
}
use of org.entando.kubernetes.controller.spi.client.SerializedEntandoResource in project entando-k8s-controller-coordinator by entando-k8s.
the class ControllerCoordinatorProcessingCriteriaTest method testUpgrade.
@Test
@Description("A resource should be processed again when the ControllerCoordinator starts up if it was processed with a version of the" + " Operator that is now being replaced")
void testUpgrade() {
step("Given the Coordinator observes this namespace", () -> System.setProperty(EntandoOperatorConfigProperty.ENTANDO_NAMESPACES_TO_OBSERVE.getJvmSystemProperty(), OBSERVED_NAMESPACE));
step("And the current version of the operator is 6.3.1", () -> System.setProperty(ControllerCoordinatorProperty.ENTANDO_K8S_OPERATOR_VERSION.getJvmSystemProperty(), "6.3.1"));
step("And the version of the operator to replace was 6.3.0", () -> System.setProperty(ControllerCoordinatorProperty.ENTANDO_K8S_OPERATOR_VERSION_TO_REPLACE.getJvmSystemProperty(), "6.3.0"));
final ValueHolder<SerializedEntandoResource> testResource = new ValueHolder<>();
step("And I have created an TestResource resource that was processed by version 6.3.0", () -> testResource.set(createTestResource(10L, Collections.singletonMap(AnnotationNames.PROCESSED_BY_OPERATOR_VERSION.getName(), "6.3.0"))));
step("And it has been successfully deployed previously", () -> {
testResource.set(clientDouble.updatePhase(testResource.get(), EntandoDeploymentPhase.SUCCESSFUL));
attachment("Processed Resource", objectMapper.writeValueAsString(testResource.get()));
});
step("When I start the ControllerCoordinator", () -> coordinator.onStartup(new StartupEvent()));
step("Then a new controller pod is created", () -> {
await().ignoreExceptions().atMost(3, TimeUnit.SECONDS).until(() -> clientDouble.loadPod(CONTROLLER_NAMESPACE, labelsFromResource(testResource.get())) != null);
attachment("Controller Pod", objectMapper.writeValueAsString(clientDouble.loadPod(CONTROLLER_NAMESPACE, labelsFromResource(testResource.get()))));
});
step("And the resource is marked as having been processed by version 6.3.1 when its deployment succeeds", () -> {
clientDouble.updatePhase(testResource.get(), EntandoDeploymentPhase.SUCCESSFUL);
SerializedEntandoResource latestKeycloakServer = clientDouble.load(TestResource.class, testResource.get().getMetadata().getNamespace(), testResource.get().getMetadata().getName());
assertThat(CoordinatorUtils.resolveAnnotation(latestKeycloakServer, AnnotationNames.PROCESSED_BY_OPERATOR_VERSION)).contains("6.3.1");
});
step("And the upgrade event was logged", () -> {
final Optional<String> logEntry = LogInterceptor.getLogEntries().stream().filter(s -> s.contains("needs to be processed as part of the upgrade to the version")).findFirst();
assertThat(logEntry).isPresent();
});
}
use of org.entando.kubernetes.controller.spi.client.SerializedEntandoResource in project entando-k8s-controller-coordinator by entando-k8s.
the class ControllerCoordinatorProcessingCriteriaTest method testProcessedByVersion.
@Test
@Description("When a resource is processed successfully, the annotation 'entando.org/processed-by-version' should reflect the current" + " version of the operator")
void testProcessedByVersion() {
step("Given the Coordinator observes this namespace", () -> System.setProperty(EntandoOperatorConfigProperty.ENTANDO_NAMESPACES_TO_OBSERVE.getJvmSystemProperty(), OBSERVED_NAMESPACE));
step("And the current version of the operator is 6.3.1", () -> System.setProperty(ControllerCoordinatorProperty.ENTANDO_K8S_OPERATOR_VERSION.getJvmSystemProperty(), "6.3.1"));
final ValueHolder<SerializedEntandoResource> testResource = new ValueHolder<>();
step("And I have created an TestResource resource with the version annotation set to 6.3.0", () -> {
testResource.set(createTestResource(10L, Collections.singletonMap(AnnotationNames.PROCESSED_BY_OPERATOR_VERSION.getName(), "6.3.0")));
attachment("TestResource", objectMapper.writeValueAsString(testResource.get()));
});
step("And I have start the ControllerCoordinator", () -> coordinator.onStartup(new StartupEvent()));
step("And a new controller pod was created", () -> {
await().ignoreExceptions().atMost(3, TimeUnit.SECONDS).until(() -> clientDouble.loadPod(CONTROLLER_NAMESPACE, labelsFromResource(testResource.get())) != null);
attachment("Controller Pod", objectMapper.writeValueAsString(clientDouble.loadPod(CONTROLLER_NAMESPACE, labelsFromResource(testResource.get()))));
});
step("When I update the deployment Phase of the resource to 'successful'", () -> {
SerializedEntandoResource latestKeycloakServer = clientDouble.updatePhase(testResource.get(), EntandoDeploymentPhase.SUCCESSFUL);
attachment("Successful Resource", objectMapper.writeValueAsString(latestKeycloakServer));
});
step("Then the TestResource has been annotated with the version 6.3.1", () -> {
coordinator.shutdownObservers(10, TimeUnit.SECONDS);
SerializedEntandoResource latestKeycloakServer = clientDouble.load(TestResource.class, testResource.get().getMetadata().getNamespace(), testResource.get().getMetadata().getName());
assertThat(CoordinatorUtils.resolveAnnotation(latestKeycloakServer, AnnotationNames.PROCESSED_BY_OPERATOR_VERSION)).contains("6.3.1");
});
}
use of org.entando.kubernetes.controller.spi.client.SerializedEntandoResource in project entando-k8s-controller-coordinator by entando-k8s.
the class ControllerCoordinatorProcessingCriteriaTest method createTestResource.
protected SerializedEntandoResource createTestResource(Long generation, Map<String, String> annotations) throws JsonProcessingException {
TestResource keycloakServer = new TestResource().withSpec(new BasicDeploymentSpecBuilder().withDbms(DbmsVendor.MYSQL).build());
keycloakServer.setMetadata(new ObjectMetaBuilder().withGeneration(generation).withUid(RandomStringUtils.randomAlphanumeric(12)).withName("test-keycloak").withNamespace(OBSERVED_NAMESPACE).withAnnotations(annotations).build());
final SerializedEntandoResource serializedResource = CoordinatorTestUtils.toSerializedResource(keycloakServer);
serializedResource.setDefinition(CustomResourceDefinitionContext.fromCustomResourceType(TestResource.class));
final SerializedEntandoResource createdResource = clientDouble.createOrPatchEntandoResource(serializedResource);
attachment("TestResource", objectMapper.writeValueAsString(createdResource));
return createdResource;
}
use of org.entando.kubernetes.controller.spi.client.SerializedEntandoResource in project entando-k8s-controller-coordinator by entando-k8s.
the class CrdManagementTest method testCustomResourceEventWithNoControllerImage.
@Test
@Description("The operator should automatically mark new instances of my CustomResourceDefinitions to 'successful' when I don't have " + "a controller image for it (yet)")
void testCustomResourceEventWithNoControllerImage() throws IOException {
step("Given I have prepared a cluster scoped deployment of the EntandoOperator", () -> System.setProperty(EntandoOperatorConfigProperty.ENTANDO_NAMESPACES_TO_OBSERVE.getJvmSystemProperty(), "*"));
step("And I have started the Entando Operator", () -> entandoControllerCoordinator.onStartup(new StartupEvent()));
ObjectMapper objectMapper = new ObjectMapper(new YAMLFactory());
final CustomResourceDefinition value = objectMapper.readValue(Thread.currentThread().getContextClassLoader().getResource("mycrds.test.org.crd.yaml"), CustomResourceDefinition.class);
final MetadataNested<CustomResourceDefinitionBuilder> builder = new CustomResourceDefinitionBuilder(value).editMetadata();
step("And I have a CustomResourceDefinition with", () -> {
step(format("the %s label ", LabelNames.CRD_OF_INTEREST.getName()), () -> {
builder.addToLabels(LabelNames.CRD_OF_INTEREST.getName(), "MyCRD");
});
step(format("but no %s annotation ", AnnotationNames.CONTROLLER_IMAGE.getName()), () -> {
});
});
step("And I have registered my custom resource definition", () -> {
client.getCluster().putCustomResourceDefinition(builder.endMetadata().build());
});
final SerializedEntandoResource resource = new SerializedEntandoResource();
resource.setMetadata(new ObjectMetaBuilder().withName("my-resource").withNamespace(MY_NAMESPACE).build());
resource.setDefinition(CustomResourceDefinitionContext.fromCrd(builder.endMetadata().build()));
step("When I create a new custom resource based on my CustomResourceDefinition my controller image is used to execute a " + "Controller pod that runs to completion", () -> client.createOrPatchEntandoResource(resource));
step("The phase on the resource status was updated to 'successful", () -> {
await().atMost(3, TimeUnit.SECONDS).ignoreExceptions().until(() -> client.reload(resource).getStatus().getPhase().equals(EntandoDeploymentPhase.SUCCESSFUL));
});
step("But no controller pod has been created", () -> assertThat(client.loadPod(AbstractK8SClientDouble.CONTROLLER_NAMESPACE, CoordinatorUtils.podLabelsFor(resource))).isNull());
step("And the fact that no image was found was logged", () -> assertThat(LogInterceptor.getLogEntries().stream().anyMatch(s -> s.contains("has neither the entando.org/controller-image annotation, nor is there an entry in the configmap " + "entando-controller-image-overrides")))).isTrue();
}
Aggregations