diff --git a/operator/pom.xml b/operator/pom.xml index 0a9793b..2434857 100644 --- a/operator/pom.xml +++ b/operator/pom.xml @@ -15,7 +15,67 @@ Operator Test Operator + + true + + + io.quarkiverse.operatorsdk + quarkus-operator-sdk + + + io.quarkiverse.operatorsdk + quarkus-operator-sdk-bundle-generator + + + io.quarkus + quarkus-openshift + + + io.quarkiverse.operatorsdk + quarkus-operator-sdk-bundle-generator-deployment + provided + + + io.quarkus + quarkus-junit5 + test + + + io.quarkus + quarkus-junit5-mockito + test + + + org.awaitility + awaitility + test + + + + + io.quarkus + quarkus-maven-plugin + + + + build + + + + + + + + + + native + + native + + + + \ No newline at end of file diff --git a/operator/src/main/java/io/javaoperatorsdk/operator/longevitytest/ConfigMapReconciler.java b/operator/src/main/java/io/javaoperatorsdk/operator/longevitytest/ConfigMapReconciler.java new file mode 100644 index 0000000..c320b00 --- /dev/null +++ b/operator/src/main/java/io/javaoperatorsdk/operator/longevitytest/ConfigMapReconciler.java @@ -0,0 +1,78 @@ +package io.javaoperatorsdk.operator.longevitytest; + +import java.util.Map; + +import javax.inject.Inject; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import io.fabric8.kubernetes.api.model.ConfigMap; +import io.fabric8.kubernetes.api.model.ObjectMetaBuilder; +import io.fabric8.kubernetes.api.model.Secret; +import io.fabric8.kubernetes.api.model.SecretBuilder; +import io.fabric8.kubernetes.client.KubernetesClient; +import io.javaoperatorsdk.operator.api.config.informer.InformerConfiguration; +import io.javaoperatorsdk.operator.api.reconciler.*; +import io.javaoperatorsdk.operator.processing.event.source.EventSource; +import io.javaoperatorsdk.operator.processing.event.source.informer.InformerEventSource; + +@ControllerConfiguration(labelSelector = "app=longevity-test") +public class ConfigMapReconciler + implements Reconciler, EventSourceInitializer { + + private static final Logger log = LoggerFactory.getLogger(ConfigMapReconciler.class); + + private static final String DATA_KEY = "key"; + + @Inject + private KubernetesClient client; + + @Override + public UpdateControl reconcile(ConfigMap configMap, Context context) { + log.debug("Reconciling ConfigMap name: {}, namespace: {}", + configMap.getMetadata().getName(), + configMap.getMetadata().getNamespace()); + + var maybeSecret = context.getSecondaryResource(Secret.class); + maybeSecret.ifPresentOrElse(secret -> { + if (!match(secret, configMap)) { + log.debug("Updating Secret, name:{}, namespace:{}", configMap.getMetadata().getName(), + configMap.getMetadata().getName()); + secret.setData(Map.of(DATA_KEY, configMap.getData().get(DATA_KEY))); + client.resource(secret).replace(); + } + }, () -> { + log.debug("Creating Secret, name:{}, namespace:{}", configMap.getMetadata().getName(), + configMap.getMetadata().getName()); + client.resource(desired(configMap)).create(); + }); + return UpdateControl.noUpdate(); + } + + private boolean match(Secret secret, ConfigMap configMap) { + return secret.getData().get(DATA_KEY).equals(configMap.getData().get(DATA_KEY)); + } + + @Override + public Map prepareEventSources(EventSourceContext context) { + InformerEventSource secretES = + new InformerEventSource<>(InformerConfiguration.from(Secret.class, context) + .build(), context); + return EventSourceInitializer.nameEventSources(secretES); + } + + private Secret desired(ConfigMap configMap) { + var secret = new SecretBuilder() + .withMetadata(new ObjectMetaBuilder() + .withName(configMap.getMetadata().getName()) + .withNamespace(configMap.getMetadata().getNamespace()) + .withLabels(Map.of("app", "longevity-test")) + .build()) + .withData(Map.of(DATA_KEY, configMap.getData().get(DATA_KEY))) + .build(); + secret.addOwnerReference(configMap); + return secret; + } + +} diff --git a/pom.xml b/pom.xml index 88e9879..6053103 100644 --- a/pom.xml +++ b/pom.xml @@ -57,6 +57,8 @@ 2.21.0 1.0 1.8.0 + 2.16.3.Final + 5.1.0 @@ -67,6 +69,13 @@ + + io.quarkiverse.operatorsdk + quarkus-operator-sdk-bom + ${quarkus.operator.sdk.version} + pom + import + org.junit junit-bom @@ -168,7 +177,7 @@ initialize - longevitytest.project.root + longevity.test.project.root