use of io.quarkus.runtime.StartupEvent in project AD482-apps by RedHatTraining.
the class TransformTemperature method onStart.
void onStart(@Observes StartupEvent startupEvent) {
StreamsBuilder builder = new StreamsBuilder();
ObjectMapperSerde<TemperatureWasMeasuredInCelsius> temperaturesEventSerde = new ObjectMapperSerde<>(TemperatureWasMeasuredInCelsius.class);
ObjectMapperSerde<TemperatureWasTransformed> temperaturesTransformedEventSerde = new ObjectMapperSerde<>(TemperatureWasTransformed.class);
KStream<String, TemperatureWasMeasuredInCelsius> stream = builder.stream(TEMPERATURES_TOPIC, Consumed.with(Serdes.String(), temperaturesEventSerde));
stream.map((key, measure) -> {
LOGGER.infov("Transforming {0}ºC to ºF...", measure.measure);
// Simulate a slow calculation
try {
Thread.sleep(CALCULATION_DELAY);
} catch (InterruptedException e) {
e.printStackTrace();
}
Double fahrenheit = ((double) measure.measure * 9 / 5) + 32;
LOGGER.infov("Temp. transformed {0}ºC -> {1}ºF (ID: {2})", measure.measure, fahrenheit, measure.locationId);
return new KeyValue<>(measure.locationId, new TemperatureWasTransformed(measure.locationId, measure.measure, fahrenheit));
}).to(MEASURED_TEMPERATURES_TOPIC, Produced.with(Serdes.Integer(), temperaturesTransformedEventSerde));
streams = new KafkaStreams(builder.build(), generateStreamConfig());
streams.start();
}
use of io.quarkus.runtime.StartupEvent in project entando-k8s-controller-coordinator by entando-k8s.
the class LivenessTests method shouldCreateControllerPodPointingToResource.
@Test
@Description("Should create a controller pod that points to the newly created resource")
void shouldCreateControllerPodPointingToResource() {
System.setProperty(EntandoOperatorSpiConfigProperty.ENTANDO_CONTROLLER_POD_NAME.getJvmSystemProperty(), "my-pod");
step("Given the Coordinator observes its own namespace", () -> {
System.setProperty(EntandoOperatorConfigProperty.ENTANDO_NAMESPACES_TO_OBSERVE.getJvmSystemProperty(), clientDouble.getNamespace());
coordinator.onStartup(new StartupEvent());
});
ValueHolder<SerializedEntandoResource> testResource = new ValueHolder<>();
step("And I have created a new TestResource resource", () -> {
final TestResource r = new TestResource().withNames(clientDouble.getNamespace(), "test-keycloak").withSpec(new BasicDeploymentSpecBuilder().withDbms(DbmsVendor.EMBEDDED).build());
r.getMetadata().setGeneration(1L);
testResource.set(clientDouble.createOrPatchEntandoResource(CoordinatorTestUtils.toSerializedResource(r)));
attachment("TestResource", objectMapper.writeValueAsString(testResource.get()));
});
final File file = Paths.get("/tmp/EntandoControllerCoordinator.ready").toFile();
clientDouble.getCluster().getResourceProcessor().getAllWatchers().forEach(watcher -> {
Liveness.alive();
step(format("When the watcher %s is closed", watcher.getClass().getSimpleName()), () -> {
watcher.onClose(new WatcherException("Closed"));
});
step("Then the liveness probe will fail", () -> {
assertThat(file).doesNotExist();
});
});
}
use of io.quarkus.runtime.StartupEvent in project entando-k8s-controller-coordinator by entando-k8s.
the class ControllerCoordinatorProcessingCriteriaTest method testGenerationObservedIsCurrentButForceInstructed.
@Test
@Description("Resource modification events should be processed when using the annotation 'entando.org/processing-instruction=force' even " + "when the 'generation' property on the metadata of the resource is the same as the 'observedGeneration' property on" + " its status")
void testGenerationObservedIsCurrentButForceInstructed() {
step("Given the Coordinator observes this namespace", () -> System.setProperty(EntandoOperatorConfigProperty.ENTANDO_NAMESPACES_TO_OBSERVE.getJvmSystemProperty(), OBSERVED_NAMESPACE));
final ValueHolder<SerializedEntandoResource> testResource = new ValueHolder<>();
step("And I have created an TestResource resource with the 'force' processing instruction", () -> {
testResource.set(createTestResource(10L, Collections.singletonMap(AnnotationNames.PROCESSING_INSTRUCTION.getName(), "force")));
attachment("TestResource", objectMapper.writeValueAsString(testResource.get()));
});
step("And the generation in the metadata is the same as the observedGeneration in the status", () -> {
// NB This step assumes that the ClientDouble is holding this exact instance of the resource when the ControllerCoordinator
// starts
testResource.get().getStatus().updateDeploymentPhase(EntandoDeploymentPhase.STARTED, 10L);
attachment("TestResource", objectMapper.writeValueAsString(testResource.get()));
});
step("When I start the ControllerCoordinator", () -> coordinator.onStartup(new StartupEvent()));
step("Then a new pod gets created", () -> {
coordinator.getObserver(CustomResourceDefinitionContext.fromCustomResourceType(TestResource.class)).shutDownAndWait(1, SECONDS);
await().ignoreExceptions().atMost(3, TimeUnit.SECONDS).until(() -> {
final Map<String, String> labels = labelsFromResource(testResource.get());
return clientDouble.loadPod(CONTROLLER_NAMESPACE, labels) != null;
});
});
step("And the 'force' processing instruction has been removed to avoid recursive processing", () -> {
final SerializedEntandoResource latestKeycloakServer = clientDouble.load(TestResource.class, testResource.get().getMetadata().getNamespace(), testResource.get().getMetadata().getName());
assertThat(CoordinatorUtils.resolveProcessingInstruction(latestKeycloakServer)).isEqualTo(OperatorProcessingInstruction.NONE);
attachment("TestResource", objectMapper.writeValueAsString(testResource.get()));
});
step("And the forced event was logged", () -> {
final Optional<String> logEntry = LogInterceptor.getLogEntries().stream().filter(s -> s.contains("has been forced")).findFirst();
assertThat(logEntry).isPresent();
});
}
use of io.quarkus.runtime.StartupEvent 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 io.quarkus.runtime.StartupEvent 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();
});
}
Aggregations