Skip to content

Commit 983ce46

Browse files
csvirimetacosm
andauthored
Configuration polish (#926)
Co-authored-by: Chris Laprun <metacosm@gmail.com>
1 parent 6a05ebc commit 983ce46

File tree

42 files changed

+671
-768
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+671
-768
lines changed

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
import io.fabric8.kubernetes.api.model.HasMetadata;
99
import io.javaoperatorsdk.operator.ReconcilerUtils;
10-
import io.javaoperatorsdk.operator.api.config.dependent.DependentResourceConfiguration;
10+
import io.javaoperatorsdk.operator.api.config.dependent.DependentResourceSpec;
1111
import io.javaoperatorsdk.operator.api.reconciler.Constants;
1212
import io.javaoperatorsdk.operator.processing.event.source.controller.ResourceEventFilter;
1313
import io.javaoperatorsdk.operator.processing.event.source.controller.ResourceEventFilters;
@@ -50,7 +50,7 @@ default ResourceEventFilter<R> getEventFilter() {
5050
return ResourceEventFilters.passthrough();
5151
}
5252

53-
default List<DependentResourceConfiguration> getDependentResources() {
53+
default List<DependentResourceSpec> getDependentResources() {
5454
return Collections.emptyList();
5555
}
5656

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

Lines changed: 41 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,12 @@
33
import java.time.Duration;
44
import java.util.HashSet;
55
import java.util.List;
6+
import java.util.Optional;
67
import java.util.Set;
78

89
import io.fabric8.kubernetes.api.model.HasMetadata;
10+
import io.javaoperatorsdk.operator.api.config.dependent.DependentResourceSpec;
11+
import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResource;
912
import io.javaoperatorsdk.operator.processing.event.source.controller.ResourceEventFilter;
1013

1114
public class ControllerConfigurationOverrider<R extends HasMetadata> {
@@ -18,6 +21,7 @@ public class ControllerConfigurationOverrider<R extends HasMetadata> {
1821
private ResourceEventFilter<R> customResourcePredicate;
1922
private final ControllerConfiguration<R> original;
2023
private Duration reconciliationMaxInterval;
24+
private List<DependentResourceSpec> dependentResourceSpecs;
2125

2226
private ControllerConfigurationOverrider(ControllerConfiguration<R> original) {
2327
finalizer = original.getFinalizer();
@@ -27,8 +31,8 @@ private ControllerConfigurationOverrider(ControllerConfiguration<R> original) {
2731
labelSelector = original.getLabelSelector();
2832
customResourcePredicate = original.getEventFilter();
2933
reconciliationMaxInterval = original.reconciliationMaxInterval().orElse(null);
34+
dependentResourceSpecs = original.getDependentResources();
3035
this.original = original;
31-
3236
}
3337

3438
public ControllerConfigurationOverrider<R> withFinalizer(String finalizer) {
@@ -84,6 +88,41 @@ public ControllerConfigurationOverrider<R> withReconciliationMaxInterval(
8488
return this;
8589
}
8690

91+
/**
92+
* If a {@link DependentResourceSpec} already exists with the same dependentResourceClass it will
93+
* be replaced. Otherwise, an exception is thrown;
94+
*
95+
* @param dependentResourceSpec to add or replace
96+
*/
97+
public void replaceDependentResourceConfig(DependentResourceSpec dependentResourceSpec) {
98+
var currentConfig =
99+
findConfigForDependentResourceClass(dependentResourceSpec.getDependentResourceClass());
100+
if (currentConfig.isEmpty()) {
101+
throw new IllegalStateException("Cannot find DependentResource config for class: "
102+
+ dependentResourceSpec.getDependentResourceClass());
103+
}
104+
dependentResourceSpecs.remove(currentConfig.get());
105+
dependentResourceSpecs.add(dependentResourceSpec);
106+
}
107+
108+
public void addNewDependentResourceConfig(DependentResourceSpec dependentResourceSpec) {
109+
var currentConfig =
110+
findConfigForDependentResourceClass(dependentResourceSpec.getDependentResourceClass());
111+
if (currentConfig.isPresent()) {
112+
throw new IllegalStateException(
113+
"Config already present for class: "
114+
+ dependentResourceSpec.getDependentResourceClass());
115+
}
116+
dependentResourceSpecs.add(dependentResourceSpec);
117+
}
118+
119+
private Optional<DependentResourceSpec> findConfigForDependentResourceClass(
120+
Class<? extends DependentResource> dependentResourceClass) {
121+
return dependentResourceSpecs.stream()
122+
.filter(dc -> dc.getDependentResourceClass().equals(dependentResourceClass))
123+
.findFirst();
124+
}
125+
87126
public ControllerConfiguration<R> build() {
88127
return new DefaultControllerConfiguration<>(
89128
original.getAssociatedReconcilerClassName(),
@@ -98,7 +137,7 @@ public ControllerConfiguration<R> build() {
98137
original.getResourceClass(),
99138
reconciliationMaxInterval,
100139
original.getConfigurationService(),
101-
original.getDependentResources());
140+
dependentResourceSpecs);
102141
}
103142

104143
public static <R extends HasMetadata> ControllerConfigurationOverrider<R> override(

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
import java.util.Set;
88

99
import io.fabric8.kubernetes.api.model.HasMetadata;
10-
import io.javaoperatorsdk.operator.api.config.dependent.DependentResourceConfiguration;
10+
import io.javaoperatorsdk.operator.api.config.dependent.DependentResourceSpec;
1111
import io.javaoperatorsdk.operator.processing.event.source.controller.ResourceEventFilter;
1212

1313
public class DefaultControllerConfiguration<R extends HasMetadata>
@@ -21,7 +21,7 @@ public class DefaultControllerConfiguration<R extends HasMetadata>
2121
private final boolean generationAware;
2222
private final RetryConfiguration retryConfiguration;
2323
private final ResourceEventFilter<R> resourceEventFilter;
24-
private final List<DependentResourceConfiguration> dependents;
24+
private final List<DependentResourceSpec> dependents;
2525
private final Duration reconciliationMaxInterval;
2626

2727
// NOSONAR constructor is meant to provide all information
@@ -38,7 +38,7 @@ public DefaultControllerConfiguration(
3838
Class<R> resourceClass,
3939
Duration reconciliationMaxInterval,
4040
ConfigurationService service,
41-
List<DependentResourceConfiguration> dependents) {
41+
List<DependentResourceSpec> dependents) {
4242
super(labelSelector, resourceClass, namespaces);
4343
this.associatedControllerClassName = associatedControllerClassName;
4444
this.name = name;
@@ -102,7 +102,7 @@ public ResourceEventFilter<R> getEventFilter() {
102102
}
103103

104104
@Override
105-
public List<DependentResourceConfiguration> getDependentResources() {
105+
public List<DependentResourceSpec> getDependentResources() {
106106
return dependents;
107107
}
108108

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@
22

33
import java.io.IOException;
44
import java.lang.reflect.ParameterizedType;
5+
import java.lang.reflect.Type;
56
import java.text.SimpleDateFormat;
67
import java.time.Instant;
78
import java.util.Date;
89
import java.util.Properties;
10+
import java.util.function.Function;
911

1012
import org.slf4j.Logger;
1113
import org.slf4j.LoggerFactory;
@@ -69,8 +71,17 @@ public static boolean debugThreadPool() {
6971
return Boolean.getBoolean(System.getProperty(DEBUG_THREAD_POOL_ENV_KEY, "false"));
7072
}
7173

74+
public static Class<?> getFirstTypeArgumentFromExtendedClass(Class<?> clazz) {
75+
Type type = clazz.getGenericSuperclass();
76+
return (Class<?>) ((ParameterizedType) type).getActualTypeArguments()[0];
77+
}
78+
7279
public static Class<?> getFirstTypeArgumentFromInterface(Class<?> clazz) {
7380
ParameterizedType type = (ParameterizedType) clazz.getGenericInterfaces()[0];
7481
return (Class<?>) type.getActualTypeArguments()[0];
7582
}
83+
84+
public static <C, T> T valueOrDefault(C annotation, Function<C, T> mapper, T defaultValue) {
85+
return annotation == null ? defaultValue : mapper.apply(annotation);
86+
}
7687
}

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

Lines changed: 0 additions & 10 deletions
This file was deleted.

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

Lines changed: 0 additions & 11 deletions
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package io.javaoperatorsdk.operator.api.config.dependent;
2+
3+
import java.util.Optional;
4+
5+
import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResource;
6+
7+
public class DependentResourceSpec<T extends DependentResource<?, ?, C>, C> {
8+
9+
private final Class<T> dependentResourceClass;
10+
11+
private final C dependentResourceConfig;
12+
13+
public DependentResourceSpec(Class<T> dependentResourceClass) {
14+
this(dependentResourceClass, null);
15+
}
16+
17+
public DependentResourceSpec(Class<T> dependentResourceClass, C dependentResourceConfig) {
18+
this.dependentResourceClass = dependentResourceClass;
19+
this.dependentResourceConfig = dependentResourceConfig;
20+
}
21+
22+
public Class<T> getDependentResourceClass() {
23+
return dependentResourceClass;
24+
}
25+
26+
public Optional<C> getDependentResourceConfiguration() {
27+
return Optional.ofNullable(dependentResourceConfig);
28+
}
29+
}

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

Lines changed: 0 additions & 66 deletions
This file was deleted.

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

Lines changed: 2 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -22,21 +22,19 @@ class DefaultInformerConfiguration<R extends HasMetadata, P extends HasMetadata>
2222

2323
private final PrimaryResourcesRetriever<R> secondaryToPrimaryResourcesIdSet;
2424
private final AssociatedSecondaryResourceIdentifier<P> associatedWith;
25-
private final boolean skipUpdateEventPropagationIfNoChange;
2625

2726
protected DefaultInformerConfiguration(ConfigurationService service, String labelSelector,
2827
Class<R> resourceClass,
2928
PrimaryResourcesRetriever<R> secondaryToPrimaryResourcesIdSet,
3029
AssociatedSecondaryResourceIdentifier<P> associatedWith,
31-
boolean skipUpdateEventPropagationIfNoChange, Set<String> namespaces) {
30+
Set<String> namespaces) {
3231
super(labelSelector, resourceClass, namespaces);
3332
setConfigurationService(service);
3433
this.secondaryToPrimaryResourcesIdSet =
3534
Objects.requireNonNullElse(secondaryToPrimaryResourcesIdSet,
3635
Mappers.fromOwnerReference());
3736
this.associatedWith =
3837
Objects.requireNonNullElseGet(associatedWith, () -> ResourceID::fromResource);
39-
this.skipUpdateEventPropagationIfNoChange = skipUpdateEventPropagationIfNoChange;
4038
}
4139

4240
public PrimaryResourcesRetriever<R> getPrimaryResourcesRetriever() {
@@ -47,22 +45,16 @@ public AssociatedSecondaryResourceIdentifier<P> getAssociatedResourceIdentifier(
4745
return associatedWith;
4846
}
4947

50-
public boolean isSkipUpdateEventPropagationIfNoChange() {
51-
return skipUpdateEventPropagationIfNoChange;
52-
}
5348
}
5449

5550
PrimaryResourcesRetriever<R> getPrimaryResourcesRetriever();
5651

5752
AssociatedSecondaryResourceIdentifier<P> getAssociatedResourceIdentifier();
5853

59-
boolean isSkipUpdateEventPropagationIfNoChange();
60-
6154
class InformerConfigurationBuilder<R extends HasMetadata, P extends HasMetadata> {
6255

6356
private PrimaryResourcesRetriever<R> secondaryToPrimaryResourcesIdSet;
6457
private AssociatedSecondaryResourceIdentifier<P> associatedWith;
65-
private boolean skipUpdateEventPropagationIfNoChange = true;
6658
private Set<String> namespaces;
6759
private String labelSelector;
6860
private final Class<R> resourceClass;
@@ -86,16 +78,6 @@ public InformerConfigurationBuilder<R, P> withAssociatedSecondaryResourceIdentif
8678
return this;
8779
}
8880

89-
public InformerConfigurationBuilder<R, P> withoutSkippingEventPropagationIfUnchanged() {
90-
this.skipUpdateEventPropagationIfNoChange = false;
91-
return this;
92-
}
93-
94-
public InformerConfigurationBuilder<R, P> skippingEventPropagationIfUnchanged(
95-
boolean skipIfUnchanged) {
96-
this.skipUpdateEventPropagationIfNoChange = skipIfUnchanged;
97-
return this;
98-
}
9981

10082
public InformerConfigurationBuilder<R, P> withNamespaces(String... namespaces) {
10183
this.namespaces = namespaces != null ? Set.of(namespaces) : Collections.emptySet();
@@ -115,7 +97,7 @@ public InformerConfigurationBuilder<R, P> withLabelSelector(String labelSelector
11597

11698
public InformerConfiguration<R, P> build() {
11799
return new DefaultInformerConfiguration<>(configurationService, labelSelector, resourceClass,
118-
secondaryToPrimaryResourcesIdSet, associatedWith, skipUpdateEventPropagationIfNoChange,
100+
secondaryToPrimaryResourcesIdSet, associatedWith,
119101
namespaces);
120102
}
121103
}
@@ -136,8 +118,6 @@ static <R extends HasMetadata, P extends HasMetadata> InformerConfigurationBuild
136118
configuration.getConfigurationService())
137119
.withNamespaces(configuration.getNamespaces())
138120
.withLabelSelector(configuration.getLabelSelector())
139-
.skippingEventPropagationIfUnchanged(
140-
configuration.isSkipUpdateEventPropagationIfNoChange())
141121
.withAssociatedSecondaryResourceIdentifier(
142122
configuration.getAssociatedResourceIdentifier())
143123
.withPrimaryResourcesRetriever(configuration.getPrimaryResourcesRetriever());

0 commit comments

Comments
 (0)