Skip to content

Commit

Permalink
improve: dependent resource can be re-initialized (#2026)
Browse files Browse the repository at this point in the history
  • Loading branch information
csviri authored Aug 24, 2023
1 parent 574eeed commit a973711
Showing 5 changed files with 121 additions and 1 deletion.
Original file line number Diff line number Diff line change
@@ -365,7 +365,7 @@ public void setConfigurationService(ConfigurationService configurationService) {
super.setConfigurationService(configurationService);

cache.addIndexers(indexerBuffer);
indexerBuffer = null;
indexerBuffer = new HashMap<>();
}

public void addIndexers(Map<String, Function<R, List<String>>> indexers) {
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package io.javaoperatorsdk.operator;

import org.junit.jupiter.api.Test;

import io.fabric8.kubernetes.client.KubernetesClient;
import io.fabric8.kubernetes.client.KubernetesClientBuilder;
import io.javaoperatorsdk.operator.junit.LocallyRunOperatorExtension;
import io.javaoperatorsdk.operator.sample.dependentreinitialization.ConfigMapDependentResource;
import io.javaoperatorsdk.operator.sample.dependentreinitialization.DependentReInitializationCustomResource;
import io.javaoperatorsdk.operator.sample.dependentreinitialization.DependentReInitializationReconciler;

class DependentReInitializationIT {

/**
* In case dependent resource is managed by CDI (like in Quarkus) can be handy that the instance
* is reused in tests.
*/
@Test
void dependentCanDeReInitialized() {
var client = new KubernetesClientBuilder().build();
LocallyRunOperatorExtension.applyCrd(DependentReInitializationCustomResource.class, client);

var dependent = new ConfigMapDependentResource();

startEndStopOperator(client, dependent);
startEndStopOperator(client, dependent);
}

private static void startEndStopOperator(KubernetesClient client,
ConfigMapDependentResource dependent) {
Operator o1 = new Operator(o -> o
.withCloseClientOnStop(false)
.withKubernetesClient(client));
o1.register(new DependentReInitializationReconciler(dependent, client));
o1.start();
o1.stop();
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package io.javaoperatorsdk.operator.sample.dependentreinitialization;

import java.util.Map;

import io.fabric8.kubernetes.api.model.ConfigMap;
import io.fabric8.kubernetes.api.model.ConfigMapBuilder;
import io.fabric8.kubernetes.api.model.ObjectMetaBuilder;
import io.javaoperatorsdk.operator.api.reconciler.Context;
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.CRUDKubernetesDependentResource;

public class ConfigMapDependentResource
extends CRUDKubernetesDependentResource<ConfigMap, DependentReInitializationCustomResource> {

public ConfigMapDependentResource() {
super(ConfigMap.class);
}

@Override
protected ConfigMap desired(DependentReInitializationCustomResource primary,
Context<DependentReInitializationCustomResource> context) {
return new ConfigMapBuilder()
.withMetadata(new ObjectMetaBuilder()
.withName(primary.getMetadata().getName())
.withNamespace(primary.getMetadata().getNamespace())
.build())
.withData(Map.of("key", "val"))
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package io.javaoperatorsdk.operator.sample.dependentreinitialization;

import io.fabric8.kubernetes.api.model.Namespaced;
import io.fabric8.kubernetes.client.CustomResource;
import io.fabric8.kubernetes.model.annotation.Group;
import io.fabric8.kubernetes.model.annotation.Version;

@Group("sample.javaoperatorsdk")
@Version("v1")
public class DependentReInitializationCustomResource
extends CustomResource<Void, Void>
implements Namespaced {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package io.javaoperatorsdk.operator.sample.dependentreinitialization;

import java.util.Map;

import io.fabric8.kubernetes.client.KubernetesClient;
import io.javaoperatorsdk.operator.api.reconciler.*;
import io.javaoperatorsdk.operator.processing.event.source.EventSource;

@ControllerConfiguration
public class DependentReInitializationReconciler
implements Reconciler<DependentReInitializationCustomResource>,
EventSourceInitializer<DependentReInitializationCustomResource> {

private final ConfigMapDependentResource configMapDependentResource;

public DependentReInitializationReconciler(ConfigMapDependentResource dependentResource,
KubernetesClient client) {
this.configMapDependentResource = dependentResource;
this.configMapDependentResource.setKubernetesClient(client);
}

@Override
public UpdateControl<DependentReInitializationCustomResource> reconcile(
DependentReInitializationCustomResource resource,
Context<DependentReInitializationCustomResource> context) throws Exception {
configMapDependentResource.reconcile(resource, context);
return UpdateControl.noUpdate();
}

@Override
public Map<String, EventSource> prepareEventSources(
EventSourceContext<DependentReInitializationCustomResource> context) {
return EventSourceInitializer.nameEventSourcesFromDependentResource(context,
configMapDependentResource);
}


}

0 comments on commit a973711

Please sign in to comment.