Skip to content

Commit e376fa2

Browse files
committed
wip
Signed-off-by: Attila Mészáros <csviri@gmail.com>
1 parent fee9a7a commit e376fa2

File tree

15 files changed

+186
-46
lines changed

15 files changed

+186
-46
lines changed

micrometer-support/src/main/java/io/javaoperatorsdk/operator/monitoring/micrometer/MicrometerMetrics.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -291,9 +291,9 @@ private static String getScope(ResourceID resourceID) {
291291
}
292292

293293
private static void addGVKTags(GroupVersionKind gvk, List<Tag> tags, boolean prefixed) {
294-
addTagOmittingOnEmptyValue(GROUP, gvk.group, tags, prefixed);
295-
addTag(VERSION, gvk.version, tags, prefixed);
296-
addTag(KIND, gvk.kind, tags, prefixed);
294+
addTagOmittingOnEmptyValue(GROUP, gvk.getGroup(), tags, prefixed);
295+
addTag(VERSION, gvk.getVersion(), tags, prefixed);
296+
addTag(KIND, gvk.getKind(), tags, prefixed);
297297
}
298298

299299
private void incrementCounter(ResourceID id, String counterName, Map<String, Object> metadata,

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/DefaultResourceConfiguration.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import java.util.Optional;
44
import java.util.Set;
55

6+
import io.fabric8.kubernetes.api.model.GenericKubernetesResource;
67
import io.fabric8.kubernetes.api.model.HasMetadata;
78
import io.fabric8.kubernetes.client.informers.cache.ItemStore;
89
import io.javaoperatorsdk.operator.ReconcilerUtils;
@@ -13,6 +14,7 @@
1314
public class DefaultResourceConfiguration<R extends HasMetadata>
1415
implements ResourceConfiguration<R> {
1516

17+
public static final String GENERIC_KUBERNETES_RESOURCE = "generickubernetesresource";
1618
private final Class<R> resourceClass;
1719
private final String resourceTypeName;
1820
private final OnAddFilter<? super R> onAddFilter;
@@ -28,7 +30,9 @@ protected DefaultResourceConfiguration(Class<R> resourceClass,
2830
OnUpdateFilter<? super R> onUpdateFilter, GenericFilter<? super R> genericFilter,
2931
ItemStore<R> itemStore, Long informerListLimit) {
3032
this.resourceClass = resourceClass;
31-
this.resourceTypeName = ReconcilerUtils.getResourceTypeName(resourceClass);
33+
this.resourceTypeName = resourceClass.isAssignableFrom(GenericKubernetesResource.class)
34+
? GENERIC_KUBERNETES_RESOURCE
35+
: ReconcilerUtils.getResourceTypeName(resourceClass);
3236
this.onAddFilter = onAddFilter;
3337
this.onUpdateFilter = onUpdateFilter;
3438
this.genericFilter = genericFilter;

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ExecutorServiceManager.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ public static <T> void executeAndWaitForAllToComplete(Stream<T> stream,
7878
// to find out any exceptions
7979
f.get();
8080
} catch (ExecutionException e) {
81-
throw new OperatorException(e.getCause());
81+
throw new OperatorException(e);
8282
} catch (InterruptedException e) {
8383
log.warn("Interrupted.", e);
8484
Thread.currentThread().interrupt();

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/informer/InformerConfiguration.java

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,14 @@
44
import java.util.Optional;
55
import java.util.Set;
66

7+
import io.fabric8.kubernetes.api.model.GenericKubernetesResource;
78
import io.fabric8.kubernetes.api.model.HasMetadata;
89
import io.fabric8.kubernetes.client.informers.cache.ItemStore;
910
import io.javaoperatorsdk.operator.api.config.DefaultResourceConfiguration;
1011
import io.javaoperatorsdk.operator.api.config.ResourceConfiguration;
1112
import io.javaoperatorsdk.operator.api.config.Utils;
1213
import io.javaoperatorsdk.operator.api.reconciler.EventSourceContext;
14+
import io.javaoperatorsdk.operator.processing.GroupVersionKind;
1315
import io.javaoperatorsdk.operator.processing.event.source.PrimaryToSecondaryMapper;
1416
import io.javaoperatorsdk.operator.processing.event.source.SecondaryToPrimaryMapper;
1517
import io.javaoperatorsdk.operator.processing.event.source.filter.GenericFilter;
@@ -30,9 +32,11 @@ class DefaultInformerConfiguration<R extends HasMetadata> extends
3032
private final SecondaryToPrimaryMapper<R> secondaryToPrimaryMapper;
3133
private final boolean followControllerNamespaceChanges;
3234
private final OnDeleteFilter<? super R> onDeleteFilter;
35+
private final GroupVersionKind groupVersionKind;
3336

3437
protected DefaultInformerConfiguration(String labelSelector,
3538
Class<R> resourceClass,
39+
GroupVersionKind groupVersionKind,
3640
PrimaryToSecondaryMapper<?> primaryToSecondaryMapper,
3741
SecondaryToPrimaryMapper<R> secondaryToPrimaryMapper,
3842
Set<String> namespaces, boolean followControllerNamespaceChanges,
@@ -44,7 +48,7 @@ protected DefaultInformerConfiguration(String labelSelector,
4448
super(resourceClass, namespaces, labelSelector, onAddFilter, onUpdateFilter, genericFilter,
4549
itemStore, informerListLimit);
4650
this.followControllerNamespaceChanges = followControllerNamespaceChanges;
47-
51+
this.groupVersionKind = groupVersionKind;
4852
this.primaryToSecondaryMapper = primaryToSecondaryMapper;
4953
this.secondaryToPrimaryMapper =
5054
Objects.requireNonNullElse(secondaryToPrimaryMapper,
@@ -72,6 +76,10 @@ public Optional<OnDeleteFilter<? super R>> onDeleteFilter() {
7276
public <P extends HasMetadata> PrimaryToSecondaryMapper<P> getPrimaryToSecondaryMapper() {
7377
return (PrimaryToSecondaryMapper<P>) primaryToSecondaryMapper;
7478
}
79+
80+
public Optional<GroupVersionKind> getGroupVersionKind() {
81+
return Optional.ofNullable(groupVersionKind);
82+
}
7583
}
7684

7785
/**
@@ -109,14 +117,17 @@ public <P extends HasMetadata> PrimaryToSecondaryMapper<P> getPrimaryToSecondary
109117

110118
<P extends HasMetadata> PrimaryToSecondaryMapper<P> getPrimaryToSecondaryMapper();
111119

120+
Optional<GroupVersionKind> getGroupVersionKind();
121+
112122
@SuppressWarnings("unused")
113123
class InformerConfigurationBuilder<R extends HasMetadata> {
114124

125+
private final Class<R> resourceClass;
126+
private final GroupVersionKind groupVersionKind;
115127
private PrimaryToSecondaryMapper<?> primaryToSecondaryMapper;
116128
private SecondaryToPrimaryMapper<R> secondaryToPrimaryMapper;
117129
private Set<String> namespaces;
118130
private String labelSelector;
119-
private final Class<R> resourceClass;
120131
private OnAddFilter<? super R> onAddFilter;
121132
private OnUpdateFilter<? super R> onUpdateFilter;
122133
private OnDeleteFilter<? super R> onDeleteFilter;
@@ -127,6 +138,13 @@ class InformerConfigurationBuilder<R extends HasMetadata> {
127138

128139
private InformerConfigurationBuilder(Class<R> resourceClass) {
129140
this.resourceClass = resourceClass;
141+
this.groupVersionKind = null;
142+
}
143+
144+
@SuppressWarnings("unchecked")
145+
private InformerConfigurationBuilder(GroupVersionKind groupVersionKind) {
146+
this.resourceClass = (Class<R>) GenericKubernetesResource.class;
147+
this.groupVersionKind = groupVersionKind;
130148
}
131149

132150
public <P extends HasMetadata> InformerConfigurationBuilder<R> withPrimaryToSecondaryMapper(
@@ -244,7 +262,7 @@ public InformerConfigurationBuilder<R> withInformerListLimit(Long informerListLi
244262
}
245263

246264
public InformerConfiguration<R> build() {
247-
return new DefaultInformerConfiguration<>(labelSelector, resourceClass,
265+
return new DefaultInformerConfiguration<>(labelSelector, resourceClass, groupVersionKind,
248266
primaryToSecondaryMapper,
249267
secondaryToPrimaryMapper,
250268
namespaces, inheritControllerNamespacesOnChange, onAddFilter, onUpdateFilter,
@@ -257,6 +275,11 @@ static <R extends HasMetadata> InformerConfigurationBuilder<R> from(
257275
return new InformerConfigurationBuilder<>(resourceClass);
258276
}
259277

278+
static <R extends HasMetadata> InformerConfigurationBuilder<R> from(
279+
GroupVersionKind groupVersionKind) {
280+
return new InformerConfigurationBuilder<>(groupVersionKind);
281+
}
282+
260283
/**
261284
* Creates a configuration builder that inherits namespaces from the controller and follows
262285
* namespaces changes.
@@ -272,6 +295,13 @@ static <R extends HasMetadata> InformerConfigurationBuilder<R> from(
272295
.withNamespacesInheritedFromController(eventSourceContext);
273296
}
274297

298+
@SuppressWarnings("unchecked")
299+
static <R extends HasMetadata> InformerConfigurationBuilder<R> from(
300+
GroupVersionKind groupVersionKind, EventSourceContext<?> eventSourceContext) {
301+
return (InformerConfigurationBuilder<R>) new InformerConfigurationBuilder<>(groupVersionKind)
302+
.withNamespacesInheritedFromController(eventSourceContext);
303+
}
304+
275305
@SuppressWarnings("unchecked")
276306
@Override
277307
default Class<R> getResourceClass() {

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/GroupVersionKind.java

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@
33
import io.fabric8.kubernetes.api.model.HasMetadata;
44

55
public class GroupVersionKind {
6-
public final String group;
7-
public final String version;
8-
public final String kind;
6+
private final String group;
7+
private final String version;
8+
private final String kind;
99

10-
GroupVersionKind(String group, String version, String kind) {
10+
public GroupVersionKind(String group, String version, String kind) {
1111
this.group = group;
1212
this.version = version;
1313
this.kind = kind;
@@ -17,4 +17,20 @@ public static GroupVersionKind gvkFor(Class<? extends HasMetadata> resourceClass
1717
return new GroupVersionKind(HasMetadata.getGroup(resourceClass),
1818
HasMetadata.getVersion(resourceClass), HasMetadata.getKind(resourceClass));
1919
}
20+
21+
public String getGroup() {
22+
return group;
23+
}
24+
25+
public String getVersion() {
26+
return version;
27+
}
28+
29+
public String getKind() {
30+
return kind;
31+
}
32+
33+
public String apiVersion() {
34+
return group == null || group.isBlank() ? version : group + "/" + version;
35+
}
2036
}

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/GenericKubernetesDependentResource.java

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,34 @@
22

33
import io.fabric8.kubernetes.api.model.GenericKubernetesResource;
44
import io.fabric8.kubernetes.api.model.HasMetadata;
5+
import io.javaoperatorsdk.operator.api.config.informer.InformerConfiguration;
6+
import io.javaoperatorsdk.operator.api.reconciler.EventSourceContext;
7+
import io.javaoperatorsdk.operator.processing.GroupVersionKind;
8+
import io.javaoperatorsdk.operator.processing.event.source.informer.InformerEventSource;
59

610
public class GenericKubernetesDependentResource<P extends HasMetadata>
711
extends KubernetesDependentResource<GenericKubernetesResource, P> {
812

9-
private final String apiVersion;
10-
private final String kind;
13+
private GroupVersionKind groupVersionKind;
1114

12-
13-
public GenericKubernetesDependentResource(String apiVersion, String kind) {
15+
public GenericKubernetesDependentResource(GroupVersionKind groupVersionKind) {
1416
super(GenericKubernetesResource.class);
15-
this.apiVersion = apiVersion;
16-
this.kind = kind;
17+
this.groupVersionKind = groupVersionKind;
1718
}
1819

20+
// todo super functionality filters etc
21+
@Override
22+
protected InformerEventSource<GenericKubernetesResource, P> createEventSource(
23+
EventSourceContext<P> context) {
24+
var es = new InformerEventSource<>(
25+
InformerConfiguration.<GenericKubernetesResource>from(groupVersionKind, context)
26+
.build(),
27+
context);
1928

29+
return es;
30+
}
2031

32+
public GroupVersionKind getGroupVersionKind() {
33+
return groupVersionKind;
34+
}
2135
}

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/KubernetesDependentResource.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,6 @@ private void configureWith(String labelSelector, Set<String> namespaces,
7474
.build();
7575

7676
configureWith(new InformerEventSource<>(ic, context));
77-
7877
}
7978

8079
@SuppressWarnings("unchecked")

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/informer/InformerEventSource.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
import io.fabric8.kubernetes.api.model.HasMetadata;
1010
import io.fabric8.kubernetes.client.KubernetesClient;
11+
import io.fabric8.kubernetes.client.dsl.MixedOperation;
1112
import io.fabric8.kubernetes.client.informers.ResourceEventHandler;
1213
import io.javaoperatorsdk.operator.api.config.informer.InformerConfiguration;
1314
import io.javaoperatorsdk.operator.api.reconciler.EventSourceContext;
@@ -88,7 +89,11 @@ public InformerEventSource(InformerConfiguration<R> configuration, KubernetesCli
8889

8990
public InformerEventSource(InformerConfiguration<R> configuration, KubernetesClient client,
9091
boolean parseResourceVersions) {
91-
super(client.resources(configuration.getResourceClass()), configuration, parseResourceVersions);
92+
super(
93+
configuration.getGroupVersionKind()
94+
.map(gvk -> client.genericKubernetesResources(gvk.apiVersion(), gvk.getKind()))
95+
.orElseGet(() -> (MixedOperation) client.resources(configuration.getResourceClass())),
96+
configuration, parseResourceVersions);
9297
// If there is a primary to secondary mapper there is no need for primary to secondary index.
9398
primaryToSecondaryMapper = configuration.getPrimaryToSecondaryMapper();
9499
if (primaryToSecondaryMapper == null) {

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/informer/ManagedInformerEventSource.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,7 @@
99
import org.slf4j.LoggerFactory;
1010

1111
import io.fabric8.kubernetes.api.model.HasMetadata;
12-
import io.fabric8.kubernetes.api.model.KubernetesResourceList;
1312
import io.fabric8.kubernetes.client.dsl.MixedOperation;
14-
import io.fabric8.kubernetes.client.dsl.Resource;
1513
import io.fabric8.kubernetes.client.informers.ResourceEventHandler;
1614
import io.javaoperatorsdk.operator.OperatorException;
1715
import io.javaoperatorsdk.operator.api.config.ConfigurationService;
@@ -40,10 +38,12 @@ public abstract class ManagedInformerEventSource<R extends HasMetadata, P extend
4038
private C configuration;
4139
private Map<String, Function<R, List<String>>> indexers = new HashMap<>();
4240
protected TemporaryResourceCache<R> temporaryResourceCache;
43-
protected MixedOperation<R, KubernetesResourceList<R>, Resource<R>> client;
41+
protected MixedOperation client;
42+
43+
4444

4545
protected ManagedInformerEventSource(
46-
MixedOperation<R, KubernetesResourceList<R>, Resource<R>> client, C configuration,
46+
MixedOperation client, C configuration,
4747
boolean parseResourceVersions) {
4848
super(configuration.getResourceClass());
4949
this.parseResourceVersions = parseResourceVersions;

operator-framework/src/test/java/io/javaoperatorsdk/operator/GenericKubernetesDependentStandaloneIT.java

Lines changed: 51 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3,45 +3,79 @@
33
import org.junit.jupiter.api.Test;
44
import org.junit.jupiter.api.extension.RegisterExtension;
55

6+
import io.fabric8.kubernetes.api.model.ConfigMap;
67
import io.fabric8.kubernetes.api.model.GenericKubernetesResource;
8+
import io.fabric8.kubernetes.api.model.ObjectMetaBuilder;
79
import io.fabric8.kubernetes.client.KubernetesClientBuilder;
810
import io.fabric8.kubernetes.client.informers.ResourceEventHandler;
911
import io.javaoperatorsdk.operator.junit.LocallyRunOperatorExtension;
12+
import io.javaoperatorsdk.operator.sample.generickubernetesdependentstandalone.ConfigMapGenericKubernetesDependent;
13+
import io.javaoperatorsdk.operator.sample.generickubernetesdependentstandalone.GenericKubernetesDependentStandaloneCustomResource;
1014
import io.javaoperatorsdk.operator.sample.generickubernetesdependentstandalone.GenericKubernetesDependentStandaloneReconciler;
15+
import io.javaoperatorsdk.operator.sample.generickubernetesdependentstandalone.GenericKubernetesDependentStandaloneSpec;
16+
17+
import static org.assertj.core.api.Assertions.assertThat;
18+
import static org.awaitility.Awaitility.await;
1119

1220
public class GenericKubernetesDependentStandaloneIT {
1321

22+
public static final String INITIAL_DATA = "Initial data";
23+
1424
@RegisterExtension
1525
LocallyRunOperatorExtension operator =
1626
LocallyRunOperatorExtension.builder()
1727
.withConfigurationService(o -> o.withCloseClientOnStop(false))
1828
.withReconciler(new GenericKubernetesDependentStandaloneReconciler())
1929
.build();
2030

31+
2132
@Test
33+
void testReconcile() {
34+
operator.create(testResource());
35+
36+
await().untilAsserted(() -> {
37+
var cm = operator.get(ConfigMap.class, "test1");
38+
assertThat(cm).isNotNull();
39+
assertThat(cm.getData()).containsEntry(ConfigMapGenericKubernetesDependent.KEY, INITIAL_DATA);
40+
});
41+
}
42+
43+
GenericKubernetesDependentStandaloneCustomResource testResource() {
44+
var resource = new GenericKubernetesDependentStandaloneCustomResource();
45+
resource.setMetadata(new ObjectMetaBuilder()
46+
.withName("test1")
47+
.build());
48+
resource.setSpec(new GenericKubernetesDependentStandaloneSpec());
49+
resource.getSpec().setValue(INITIAL_DATA);
50+
51+
return resource;
52+
}
53+
54+
// @Test
2255
void testInformer() {
2356
GenericKubernetesResource res = new GenericKubernetesResource();
2457
res.setApiVersion("v1");
2558
res.setKind("ConfigMap");
2659

2760
try (var client = new KubernetesClientBuilder().build()) {
28-
client.resource(res).inform().addEventHandler(new ResourceEventHandler<>() {
29-
@Override
30-
public void onAdd(GenericKubernetesResource genericKubernetesResource) {
31-
System.out.println(genericKubernetesResource);
32-
}
33-
34-
@Override
35-
public void onUpdate(GenericKubernetesResource genericKubernetesResource,
36-
GenericKubernetesResource t1) {
37-
System.out.println(genericKubernetesResource);
38-
}
39-
40-
@Override
41-
public void onDelete(GenericKubernetesResource genericKubernetesResource, boolean b) {
42-
System.out.println(genericKubernetesResource);
43-
}
44-
});
61+
client.genericKubernetesResources("v1", "ConfigMap").inAnyNamespace().inform()
62+
.addEventHandler(new ResourceEventHandler<>() {
63+
@Override
64+
public void onAdd(GenericKubernetesResource genericKubernetesResource) {
65+
System.out.println(genericKubernetesResource);
66+
}
67+
68+
@Override
69+
public void onUpdate(GenericKubernetesResource genericKubernetesResource,
70+
GenericKubernetesResource t1) {
71+
System.out.println(genericKubernetesResource);
72+
}
73+
74+
@Override
75+
public void onDelete(GenericKubernetesResource genericKubernetesResource, boolean b) {
76+
System.out.println(genericKubernetesResource);
77+
}
78+
});
4579
}
4680
}
4781

0 commit comments

Comments
 (0)