Skip to content

Commit bdf08c4

Browse files
committed
migration guide
Signed-off-by: Attila Mészáros <[email protected]>
1 parent be27232 commit bdf08c4

File tree

3 files changed

+54
-11
lines changed

3 files changed

+54
-11
lines changed

docs/content/en/docs/migration/v5-2-migration.md

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,32 @@ description: Migrating from v5.1 to v5.2
66
Version 5.2 brings some breaking changes on some components, for those we provide
77
a migration guide. For all the new features see release notes.
88

9-
## Custom ID types and ResourceIDProvider across multiple components
10-
11-
TODO
9+
## Custom ID types across multiple components using ResourceIDMapper and ResourceIDProvider
10+
11+
Working with an id of a resource is needed across various component in the framework.
12+
Until this version the components provided by the framework assumed that you can easily
13+
convert an id of the resource into String representation. So for example
14+
[BulkDependentResources](https://github.com/operator-framework/java-operator-sdk/blob/main/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/BulkDependentResource.java#L46)
15+
worked with a `Map<String,R>` of resources, where id was always type of String.
16+
17+
Mainly because of the need to manage external dependent resources more elegantly
18+
we introduced a cross-cutting concept: [`ResourceIDMapper`](https://github.com/operator-framework/java-operator-sdk/blob/main/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/ResourceIDMapper.java).
19+
That gets the ID of a resource. This is used then across various components, see:
20+
21+
- [`ExternalResourceCachingEventSource`](https://github.com/operator-framework/java-operator-sdk/blob/main/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/ExternalResourceCachingEventSource.java#L66)
22+
- [`ExternalBulkDependentResource`](https://github.com/operator-framework/java-operator-sdk/blob/main/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/ExternalBulkDependentResource.java)
23+
- [`AbstractExternalDependentResource`](https://github.com/operator-framework/java-operator-sdk/blob/main/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/AbstractExternalDependentResource.java#L39)
24+
and it's subclasses.
25+
26+
We also added [`ResourceIDProvider`](https://github.com/operator-framework/java-operator-sdk/blob/main/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/ResourceIDProvider.java)
27+
that you can implement into you Pojo representing a resource.
28+
29+
The easiest way to migrate to this new approach is to implement this interface for your (external) resource,
30+
and set the ID type generics for the components above. The default implementation of the `ResourceIDMapper`
31+
works with `ResourceIDProvider` see [related implementation](https://github.com/operator-framework/java-operator-sdk/blob/main/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/ResourceIDMapper.java#L52).
32+
33+
If you cannot implement `ResourceIDProvider` because for example the class that represents the external resource is generated and final,
34+
you can always set a custom `ResourceIDMapper` on the components above.
1235

1336
See also:
1437
- related issue: [link](https://github.com/operator-framework/java-operator-sdk/issues/2972)

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/external/PerResourcePollingDependentResource.java

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import io.fabric8.kubernetes.api.model.HasMetadata;
2121
import io.javaoperatorsdk.operator.api.reconciler.EventSourceContext;
2222
import io.javaoperatorsdk.operator.api.reconciler.Ignore;
23+
import io.javaoperatorsdk.operator.processing.ResourceIDMapper;
2324
import io.javaoperatorsdk.operator.processing.event.source.ExternalResourceCachingEventSource;
2425
import io.javaoperatorsdk.operator.processing.event.source.polling.PerResourcePollingConfigurationBuilder;
2526
import io.javaoperatorsdk.operator.processing.event.source.polling.PerResourcePollingEventSource;
@@ -29,14 +30,26 @@ public abstract class PerResourcePollingDependentResource<R, P extends HasMetada
2930
extends AbstractPollingDependentResource<R, P, ID>
3031
implements PerResourcePollingEventSource.ResourceFetcher<R, P> {
3132

32-
public PerResourcePollingDependentResource() {}
33+
protected PerResourcePollingDependentResource() {}
3334

34-
public PerResourcePollingDependentResource(Class<R> resourceType) {
35+
protected PerResourcePollingDependentResource(
36+
Class<R> resourceType, ResourceIDMapper<R, ID> resourceIDMapper) {
3537
super(resourceType);
38+
setResourceIDMapper(resourceIDMapper);
3639
}
3740

38-
public PerResourcePollingDependentResource(Class<R> resourceType, Duration pollingPeriod) {
41+
protected PerResourcePollingDependentResource(Class<R> resourceType) {
42+
super(resourceType);
43+
}
44+
45+
protected PerResourcePollingDependentResource(Class<R> resourceType, Duration pollingPeriod) {
46+
super(resourceType, pollingPeriod);
47+
}
48+
49+
protected PerResourcePollingDependentResource(
50+
Class<R> resourceType, Duration pollingPeriod, ResourceIDMapper<R, ID> resourceIDMapper) {
3951
super(resourceType, pollingPeriod);
52+
setResourceIDMapper(resourceIDMapper);
4053
}
4154

4255
@Override

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/external/PollingDependentResource.java

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,17 +30,24 @@ public abstract class PollingDependentResource<R, P extends HasMetadata, ID>
3030
extends AbstractPollingDependentResource<R, P, ID>
3131
implements PollingEventSource.GenericResourceFetcher<R> {
3232

33-
private final ResourceIDMapper<R, ID> resourceIDMapper;
33+
protected PollingDependentResource(Class<R> resourceType) {
34+
super(resourceType);
35+
}
3436

35-
public PollingDependentResource(Class<R> resourceType, ResourceIDMapper<R, ID> resourceIDMapper) {
37+
protected PollingDependentResource(
38+
Class<R> resourceType, ResourceIDMapper<R, ID> resourceIDMapper) {
3639
super(resourceType);
37-
this.resourceIDMapper = resourceIDMapper;
40+
setResourceIDMapper(resourceIDMapper);
41+
}
42+
43+
protected PollingDependentResource(Class<R> resourceType, Duration pollingPeriod) {
44+
super(resourceType, pollingPeriod);
3845
}
3946

40-
public PollingDependentResource(
47+
protected PollingDependentResource(
4148
Class<R> resourceType, Duration pollingPeriod, ResourceIDMapper<R, ID> resourceIDMapper) {
4249
super(resourceType, pollingPeriod);
43-
this.resourceIDMapper = resourceIDMapper;
50+
setResourceIDMapper(resourceIDMapper);
4451
}
4552

4653
@Override

0 commit comments

Comments
 (0)