Skip to content

Commit 409c2f4

Browse files
committed
name in ES configuration
Signed-off-by: Attila Mészáros <csviri@gmail.com>
1 parent 64346e8 commit 409c2f4

File tree

19 files changed

+84
-44
lines changed

19 files changed

+84
-44
lines changed

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

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,16 @@ public interface InformerConfiguration<R extends HasMetadata>
3030
class DefaultInformerConfiguration<R extends HasMetadata> extends
3131
DefaultResourceConfiguration<R> implements InformerConfiguration<R> {
3232

33+
private final String name;
3334
private final PrimaryToSecondaryMapper<?> primaryToSecondaryMapper;
3435
private final SecondaryToPrimaryMapper<R> secondaryToPrimaryMapper;
3536
private final boolean followControllerNamespaceChanges;
3637
private final OnDeleteFilter<? super R> onDeleteFilter;
3738
private final GroupVersionKind groupVersionKind;
3839

39-
protected DefaultInformerConfiguration(String labelSelector,
40+
protected DefaultInformerConfiguration(
41+
String name,
42+
String labelSelector,
4043
Class<R> resourceClass,
4144
GroupVersionKind groupVersionKind,
4245
PrimaryToSecondaryMapper<?> primaryToSecondaryMapper,
@@ -49,6 +52,7 @@ protected DefaultInformerConfiguration(String labelSelector,
4952
ItemStore<R> itemStore, Long informerListLimit) {
5053
super(resourceClass, namespaces, labelSelector, onAddFilter, onUpdateFilter, genericFilter,
5154
itemStore, informerListLimit);
55+
this.name = name;
5256
this.followControllerNamespaceChanges = followControllerNamespaceChanges;
5357
this.groupVersionKind = groupVersionKind;
5458
this.primaryToSecondaryMapper = primaryToSecondaryMapper;
@@ -77,10 +81,16 @@ public <P extends HasMetadata> PrimaryToSecondaryMapper<P> getPrimaryToSecondary
7781
return (PrimaryToSecondaryMapper<P>) primaryToSecondaryMapper;
7882
}
7983

84+
@Override
8085
public Optional<GroupVersionKind> getGroupVersionKind() {
8186
return Optional.ofNullable(groupVersionKind);
8287
}
8388

89+
@Override
90+
public String name() {
91+
return name;
92+
}
93+
8494
public boolean inheritsNamespacesFromController() {
8595
return InformerConfiguration.inheritsNamespacesFromController(getNamespaces());
8696
}
@@ -132,6 +142,8 @@ public Set<String> getEffectiveNamespaces(ControllerConfiguration<?> controllerC
132142

133143
Optional<GroupVersionKind> getGroupVersionKind();
134144

145+
String name();
146+
135147
static boolean inheritsNamespacesFromController(Set<String> namespaces) {
136148
return SAME_AS_CONTROLLER_NAMESPACES_SET.equals(namespaces);
137149
}
@@ -142,6 +154,7 @@ class InformerConfigurationBuilder<R extends HasMetadata> {
142154
private final Class<R> resourceClass;
143155
private final GroupVersionKind groupVersionKind;
144156
private final Class<? extends HasMetadata> primaryResourceClass;
157+
private String name;
145158
private PrimaryToSecondaryMapper<?> primaryToSecondaryMapper;
146159
private SecondaryToPrimaryMapper<R> secondaryToPrimaryMapper;
147160
private Set<String> namespaces = SAME_AS_CONTROLLER_NAMESPACES_SET;
@@ -173,6 +186,11 @@ private InformerConfigurationBuilder(Class<R> resourceClass,
173186
this.primaryResourceClass = primaryResourceClass;
174187
}
175188

189+
public InformerConfigurationBuilder<R> withName(String name) {
190+
this.name = name;
191+
return this;
192+
}
193+
176194
public <P extends HasMetadata> InformerConfigurationBuilder<R> withPrimaryToSecondaryMapper(
177195
PrimaryToSecondaryMapper<P> primaryToSecondaryMapper) {
178196
this.primaryToSecondaryMapper = primaryToSecondaryMapper;
@@ -288,7 +306,8 @@ public InformerConfigurationBuilder<R> withInformerListLimit(Long informerListLi
288306
public InformerConfiguration<R> build() {
289307
Objects.requireNonNull(secondaryToPrimaryMapper, "SecondaryToPrimaryMapper must not be null");
290308

291-
return new DefaultInformerConfiguration<>(labelSelector, resourceClass, groupVersionKind,
309+
return new DefaultInformerConfiguration<>(name, labelSelector, resourceClass,
310+
groupVersionKind,
292311
primaryToSecondaryMapper,
293312
Objects.requireNonNullElse(secondaryToPrimaryMapper,
294313
Mappers.fromOwnerReferences(HasMetadata.getApiVersion(primaryResourceClass),

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,11 @@ public PerResourcePollingDependentResource(Class<R> resourceType, Duration polli
2727
protected ExternalResourceCachingEventSource<R, P> createEventSource(
2828
EventSourceContext<P> context) {
2929

30-
return new PerResourcePollingEventSource<>(name(), resourceType(), context,
30+
return new PerResourcePollingEventSource<>(resourceType(), context,
3131
new PerResourcePollingConfigurationBuilder<>(
3232
this, getPollingPeriod())
3333
.withCacheKeyMapper(this)
34+
.withName(name())
3435
.build());
3536
}
3637
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,8 @@ public PollingDependentResource(Class<R> resourceType, Duration pollingPeriod,
3131
@Override
3232
protected ExternalResourceCachingEventSource<R, P> createEventSource(
3333
EventSourceContext<P> context) {
34-
return new PollingEventSource<>(name(), resourceType(),
35-
new PollingConfiguration<>(this, getPollingPeriod(), cacheKeyMapper));
34+
return new PollingEventSource<>(resourceType(),
35+
new PollingConfiguration<>(name(), this, getPollingPeriod(), cacheKeyMapper));
3636
}
3737

3838
}

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ public KubernetesDependentResourceConfig<R> configFrom(KubernetesDependent confi
4747

4848
}
4949

50+
@SuppressWarnings("unchecked")
5051
private InformerConfiguration<R> createInformerConfiguration(KubernetesDependent configAnnotation,
5152
ControllerConfiguration<?> controllerConfig,
5253
Class<KubernetesDependentResource<R, P>> originatingClass) {
@@ -61,6 +62,12 @@ private InformerConfiguration<R> createInformerConfiguration(KubernetesDependent
6162

6263
if (configAnnotation != null) {
6364

65+
if (Constants.NO_VALUE_SET.equals(configAnnotation.informerConfig().name())) {
66+
informerConfig.withName(dependentInstance.name());
67+
} else {
68+
informerConfig.withName(configAnnotation.informerConfig().name());
69+
}
70+
6471
var namespaces = Set.of(configAnnotation.informerConfig().namespaces());
6572
informerConfig.withNamespaces(namespaces);
6673

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,7 @@ protected InformerEventSource<R, P> createEventSource(EventSourceContext<P> cont
234234
.withSecondaryToPrimaryMapper(getSecondaryToPrimaryMapper().orElseThrow())
235235
.build();
236236
}
237-
var es = new InformerEventSource<>(name(), config, context);
237+
var es = new InformerEventSource<>(config, context);
238238
setEventSource(es);
239239
return eventSource().orElseThrow();
240240
}

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

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -76,28 +76,21 @@ public class InformerEventSource<R extends HasMetadata, P extends HasMetadata>
7676
private final PrimaryToSecondaryMapper<P> primaryToSecondaryMapper;
7777
private final String id = UUID.randomUUID().toString();
7878

79-
public InformerEventSource(String name,
80-
InformerConfiguration<R> configuration, EventSourceContext<P> context) {
81-
this(name, configuration, context.getClient(),
82-
context.getControllerConfiguration().getConfigurationService()
83-
.parseResourceVersionsForEventFilteringAndCaching());
84-
}
85-
8679
public InformerEventSource(
8780
InformerConfiguration<R> configuration, EventSourceContext<P> context) {
88-
this(null, configuration, context.getClient(),
81+
this(configuration, context.getClient(),
8982
context.getControllerConfiguration().getConfigurationService()
9083
.parseResourceVersionsForEventFilteringAndCaching());
9184
}
9285

9386
public InformerEventSource(InformerConfiguration<R> configuration, KubernetesClient client) {
94-
this(null, configuration, client, false);
87+
this(configuration, client, false);
9588
}
9689

97-
public InformerEventSource(String name, InformerConfiguration<R> configuration,
90+
public InformerEventSource(InformerConfiguration<R> configuration,
9891
KubernetesClient client,
9992
boolean parseResourceVersions) {
100-
super(name,
93+
super(configuration.name(),
10194
configuration.getGroupVersionKind()
10295
.map(gvk -> client.genericKubernetesResources(gvk.apiVersion(), gvk.getKind()))
10396
.orElseGet(() -> (MixedOperation) client.resources(configuration.getResourceClass())),

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/polling/PerResourcePollingConfiguration.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,17 +9,20 @@
99
import io.fabric8.kubernetes.api.model.HasMetadata;
1010
import io.javaoperatorsdk.operator.processing.event.source.CacheKeyMapper;
1111

12-
public record PerResourcePollingConfiguration<R, P extends HasMetadata>(ScheduledExecutorService executorService, CacheKeyMapper<R> cacheKeyMapper,
12+
public record PerResourcePollingConfiguration<R, P extends HasMetadata>(String name,ScheduledExecutorService executorService, CacheKeyMapper<R> cacheKeyMapper,
1313
PerResourcePollingEventSource.ResourceFetcher<R, P> resourceFetcher,
1414
Predicate<P> registerPredicate, Duration defaultPollingPeriod) {
1515

1616
public static final int DEFAULT_EXECUTOR_THREAD_NUMBER = 1;
1717

18-
public PerResourcePollingConfiguration(ScheduledExecutorService executorService,
18+
public PerResourcePollingConfiguration(
19+
String name,
20+
ScheduledExecutorService executorService,
1921
CacheKeyMapper<R> cacheKeyMapper,
2022
PerResourcePollingEventSource.ResourceFetcher<R, P> resourceFetcher,
2123
Predicate<P> registerPredicate,
2224
Duration defaultPollingPeriod) {
25+
this.name = name;
2326
this.executorService = executorService == null ? new ScheduledThreadPoolExecutor(DEFAULT_EXECUTOR_THREAD_NUMBER)
2427
: executorService;
2528
this.cacheKeyMapper = cacheKeyMapper == null ? CacheKeyMapper.singleResourceCacheKeyMapper() : cacheKeyMapper;

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/polling/PerResourcePollingConfigurationBuilder.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ public final class PerResourcePollingConfigurationBuilder<R, P extends HasMetada
1212
private final Duration defaultPollingPeriod;
1313
private final PerResourcePollingEventSource.ResourceFetcher<R, P> resourceFetcher;
1414

15+
private String name;
1516
private Predicate<P> registerPredicate;
1617
private ScheduledExecutorService executorService;
1718
private CacheKeyMapper<R> cacheKeyMapper;
@@ -42,8 +43,13 @@ public PerResourcePollingConfigurationBuilder<R, P> withCacheKeyMapper(
4243
return this;
4344
}
4445

46+
public PerResourcePollingConfigurationBuilder<R, P> withName(String name) {
47+
this.name = name;
48+
return this;
49+
}
50+
4551
public PerResourcePollingConfiguration<R, P> build() {
46-
return new PerResourcePollingConfiguration<>(executorService, cacheKeyMapper,
52+
return new PerResourcePollingConfiguration<>(name, executorService, cacheKeyMapper,
4753
resourceFetcher, registerPredicate, defaultPollingPeriod);
4854
}
4955
}

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/polling/PerResourcePollingEventSource.java

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -50,15 +50,12 @@ public class PerResourcePollingEventSource<R, P extends HasMetadata>
5050
private final Predicate<P> registerPredicate;
5151
private final Duration period;
5252

53-
public PerResourcePollingEventSource(Class<R> resourceClass, EventSourceContext<P> context,
54-
PerResourcePollingConfiguration<R, P> config) {
55-
this(null, resourceClass, context, config);
56-
}
5753

58-
public PerResourcePollingEventSource(String name, Class<R> resourceClass,
54+
55+
public PerResourcePollingEventSource(Class<R> resourceClass,
5956
EventSourceContext<P> context,
6057
PerResourcePollingConfiguration<R, P> config) {
61-
super(name, resourceClass, config.cacheKeyMapper());
58+
super(config.name(), resourceClass, config.cacheKeyMapper());
6259
this.primaryResourceCache = context.getPrimaryCache();
6360
this.resourceFetcher = config.resourceFetcher();
6461
this.registerPredicate = config.registerPredicate();

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/polling/PollingConfiguration.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,12 @@
55

66
import io.javaoperatorsdk.operator.processing.event.source.CacheKeyMapper;
77

8-
public record PollingConfiguration<R>(PollingEventSource.GenericResourceFetcher<R> genericResourceFetcher,
8+
public record PollingConfiguration<R>(String name,PollingEventSource.GenericResourceFetcher<R> genericResourceFetcher,
99
Duration period, CacheKeyMapper<R> cacheKeyMapper) {
1010

11-
public PollingConfiguration(PollingEventSource.GenericResourceFetcher<R> genericResourceFetcher, Duration period,
11+
public PollingConfiguration(String name,PollingEventSource.GenericResourceFetcher<R> genericResourceFetcher, Duration period,
1212
CacheKeyMapper<R> cacheKeyMapper) {
13+
this.name = name;
1314
this.genericResourceFetcher = Objects.requireNonNull(genericResourceFetcher);
1415
this.period = period;
1516
this.cacheKeyMapper =

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/polling/PollingConfigurationBuilder.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ public final class PollingConfigurationBuilder<R> {
88
private final Duration period;
99
private final PollingEventSource.GenericResourceFetcher<R> genericResourceFetcher;
1010
private CacheKeyMapper<R> cacheKeyMapper;
11+
private String name;
1112

1213
public PollingConfigurationBuilder(PollingEventSource.GenericResourceFetcher<R> fetcher,
1314
Duration period) {
@@ -20,7 +21,12 @@ public PollingConfigurationBuilder<R> withCacheKeyMapper(CacheKeyMapper<R> cache
2021
return this;
2122
}
2223

24+
public PollingConfigurationBuilder<R> withName(String name) {
25+
this.name = name;
26+
return this;
27+
}
28+
2329
public PollingConfiguration<R> build() {
24-
return new PollingConfiguration<>(genericResourceFetcher, period, cacheKeyMapper);
30+
return new PollingConfiguration<>(name, genericResourceFetcher, period, cacheKeyMapper);
2531
}
2632
}

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/polling/PollingEventSource.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -52,12 +52,10 @@ public class PollingEventSource<R, P extends HasMetadata>
5252
private final Duration period;
5353
private final AtomicBoolean healthy = new AtomicBoolean(true);
5454

55-
public PollingEventSource(Class<R> resourceClass, PollingConfiguration<R> config) {
56-
this(null, resourceClass, config);
57-
}
5855

59-
public PollingEventSource(String name, Class<R> resourceClass, PollingConfiguration<R> config) {
60-
super(name, resourceClass, config.cacheKeyMapper());
56+
57+
public PollingEventSource(Class<R> resourceClass, PollingConfiguration<R> config) {
58+
super(config.name(), resourceClass, config.cacheKeyMapper());
6159
this.genericResourceFetcher = config.genericResourceFetcher();
6260
this.period = config.period();
6361
}

operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/event/source/polling/PollingEventSourceTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ class PollingEventSourceTest
3232
mock(PollingEventSource.GenericResourceFetcher.class);
3333
private final PollingEventSource<SampleExternalResource, HasMetadata> pollingEventSource =
3434
new PollingEventSource<>(SampleExternalResource.class,
35-
new PollingConfiguration<>(resourceFetcher, POLL_PERIOD,
35+
new PollingConfiguration<>(null, resourceFetcher, POLL_PERIOD,
3636
(SampleExternalResource er) -> er.getName() + "#" + er.getValue()));
3737

3838
@BeforeEach

operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/complexdependent/ComplexDependentReconciler.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,12 +54,15 @@ public UpdateControl<ComplexDependentCustomResource> reconcile(
5454
public List<EventSource> prepareEventSources(
5555
EventSourceContext<ComplexDependentCustomResource> context) {
5656
InformerEventSource<Service, ComplexDependentCustomResource> serviceEventSource =
57-
new InformerEventSource<>(SERVICE_EVENT_SOURCE_NAME,
58-
InformerConfiguration.from(Service.class, ComplexDependentCustomResource.class).build(),
57+
new InformerEventSource<>(
58+
InformerConfiguration.from(Service.class, ComplexDependentCustomResource.class)
59+
.withName(SERVICE_EVENT_SOURCE_NAME)
60+
.build(),
5961
context);
6062
InformerEventSource<StatefulSet, ComplexDependentCustomResource> statefulSetEventSource =
61-
new InformerEventSource<>(STATEFUL_SET_EVENT_SOURCE_NAME,
63+
new InformerEventSource<>(
6264
InformerConfiguration.from(StatefulSet.class, ComplexDependentCustomResource.class)
65+
.withName(STATEFUL_SET_EVENT_SOURCE_NAME)
6366
.build(),
6467
context);
6568
return List.of(serviceEventSource, statefulSetEventSource);

operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/dynamicgenericeventsourceregistration/DynamicGenericEventSourceRegistrationReconciler.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,9 +74,11 @@ private InformerEventSource<GenericKubernetesResource, DynamicGenericEventSource
7474
Class<? extends HasMetadata> clazz,
7575
Context<DynamicGenericEventSourceRegistrationCustomResource> context) {
7676

77-
return new InformerEventSource<>(clazz.getSimpleName(),
77+
return new InformerEventSource<>(
7878
InformerConfiguration
79-
.from(gvkFor(clazz), DynamicGenericEventSourceRegistrationCustomResource.class).build(),
79+
.from(gvkFor(clazz), DynamicGenericEventSourceRegistrationCustomResource.class)
80+
.withName(clazz.getSimpleName())
81+
.build(),
8082
context.eventSourceRetriever().eventSourceContextForDynamicRegistration());
8183
}
8284

operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/multipledrsametypenodiscriminator/MultipleManagedDependentSameTypeNoDiscriminatorReconciler.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,10 @@ public int getNumberOfExecutions() {
4949
public List<EventSource> prepareEventSources(
5050
EventSourceContext<MultipleManagedDependentNoDiscriminatorCustomResource> context) {
5151
InformerEventSource<ConfigMap, MultipleManagedDependentNoDiscriminatorCustomResource> ies =
52-
new InformerEventSource<>(CONFIG_MAP_EVENT_SOURCE,
52+
new InformerEventSource<>(
5353
InformerConfiguration.from(ConfigMap.class,
5454
MultipleManagedDependentNoDiscriminatorCustomResource.class)
55+
.withName(CONFIG_MAP_EVENT_SOURCE)
5556
.build(),
5657
context);
5758

operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/multiplemanageddependentsametype/MultipleManagedDependentResourceReconciler.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,10 @@ public int getNumberOfExecutions() {
4949
public List<EventSource> prepareEventSources(
5050
EventSourceContext<MultipleManagedDependentResourceCustomResource> context) {
5151
InformerEventSource<ConfigMap, MultipleManagedDependentResourceCustomResource> ies =
52-
new InformerEventSource<>(CONFIG_MAP_EVENT_SOURCE,
52+
new InformerEventSource<>(
5353
InformerConfiguration
5454
.from(ConfigMap.class, MultipleManagedDependentResourceCustomResource.class)
55+
.withName(CONFIG_MAP_EVENT_SOURCE)
5556
.build(),
5657
context);
5758
return List.of(ies);

operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/multiplemanagedexternaldependenttype/MultipleManagedExternalDependentResourceReconciler.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,8 +71,9 @@ public List<EventSource> prepareEventSources(
7171
};
7272

7373
PollingEventSource<ExternalResource, MultipleManagedExternalDependentResourceCustomResource> pollingEventSource =
74-
new PollingEventSource<>(EVENT_SOURCE_NAME, ExternalResource.class,
74+
new PollingEventSource<>(ExternalResource.class,
7575
new PollingConfigurationBuilder<>(fetcher, Duration.ofMillis(1000L))
76+
.withName(EVENT_SOURCE_NAME)
7677
.withCacheKeyMapper(ExternalResource::getId)
7778
.build());
7879

operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/primarytosecondaydependent/PrimaryToSecondaryDependentReconciler.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,9 @@ public List<EventSource> prepareEventSources(
6666
context.getPrimaryCache().addIndexer(CONFIG_MAP_INDEX, (primary -> List
6767
.of(indexKey(primary.getSpec().getConfigMapName(), primary.getMetadata().getNamespace()))));
6868

69-
var es = new InformerEventSource<>(CONFIG_MAP_EVENT_SOURCE, InformerConfiguration
69+
var es = new InformerEventSource<>(InformerConfiguration
7070
.from(ConfigMap.class, PrimaryToSecondaryDependentCustomResource.class)
71+
.withName(CONFIG_MAP_EVENT_SOURCE)
7172
// if there is a many-to-many relationship (thus no direct owner reference)
7273
// PrimaryToSecondaryMapper needs to be added
7374
.withPrimaryToSecondaryMapper(

0 commit comments

Comments
 (0)