Skip to content

Commit 92f2f28

Browse files
authored
feat: add support for additional Kubernetes resource pre processors (#1909)
1 parent 56e3565 commit 92f2f28

11 files changed

+162
-53
lines changed

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

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

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import io.javaoperatorsdk.operator.processing.dependent.AbstractEventSourceHolderDependentResource;
2525
import io.javaoperatorsdk.operator.processing.dependent.Matcher;
2626
import io.javaoperatorsdk.operator.processing.dependent.Matcher.Result;
27+
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.processors.GenericResourceUpdatePreProcessor;
2728
import io.javaoperatorsdk.operator.processing.event.ResourceID;
2829
import io.javaoperatorsdk.operator.processing.event.source.SecondaryToPrimaryMapper;
2930
import io.javaoperatorsdk.operator.processing.event.source.informer.InformerEventSource;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package io.javaoperatorsdk.operator.processing.dependent.kubernetes.processors;
2+
3+
import io.fabric8.kubernetes.api.model.rbac.ClusterRoleBinding;
4+
5+
public class ClusterRoleBindingResourceUpdatePreProcessor
6+
extends GenericResourceUpdatePreProcessor<ClusterRoleBinding> {
7+
8+
@Override
9+
protected void updateClonedActual(ClusterRoleBinding actual, ClusterRoleBinding desired) {
10+
actual.setRoleRef(desired.getRoleRef());
11+
actual.setSubjects(desired.getSubjects());
12+
}
13+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package io.javaoperatorsdk.operator.processing.dependent.kubernetes.processors;
2+
3+
import io.fabric8.kubernetes.api.model.rbac.ClusterRole;
4+
5+
public class ClusterRoleResourceUpdatePreProcessor
6+
extends GenericResourceUpdatePreProcessor<ClusterRole> {
7+
8+
@Override
9+
protected void updateClonedActual(ClusterRole actual, ClusterRole desired) {
10+
actual.setAggregationRule(desired.getAggregationRule());
11+
actual.setRules(desired.getRules());
12+
}
13+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package io.javaoperatorsdk.operator.processing.dependent.kubernetes.processors;
2+
3+
import io.fabric8.kubernetes.api.model.ConfigMap;
4+
5+
public class ConfigMapResourceUpdatePreProcessor
6+
extends GenericResourceUpdatePreProcessor<ConfigMap> {
7+
8+
@Override
9+
protected void updateClonedActual(ConfigMap actual, ConfigMap desired) {
10+
actual.setData(desired.getData());
11+
actual.setBinaryData((desired.getBinaryData()));
12+
actual.setImmutable(desired.getImmutable());
13+
}
14+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package io.javaoperatorsdk.operator.processing.dependent.kubernetes.processors;
2+
3+
import java.util.Map;
4+
5+
import javax.management.relation.Role;
6+
7+
import io.fabric8.kubernetes.api.model.ConfigMap;
8+
import io.fabric8.kubernetes.api.model.HasMetadata;
9+
import io.fabric8.kubernetes.api.model.Secret;
10+
import io.fabric8.kubernetes.api.model.ServiceAccount;
11+
import io.fabric8.kubernetes.api.model.rbac.ClusterRole;
12+
import io.fabric8.kubernetes.api.model.rbac.ClusterRoleBinding;
13+
import io.fabric8.kubernetes.api.model.rbac.RoleBinding;
14+
import io.javaoperatorsdk.operator.ReconcilerUtils;
15+
import io.javaoperatorsdk.operator.api.config.ConfigurationServiceProvider;
16+
import io.javaoperatorsdk.operator.api.reconciler.Context;
17+
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.ResourceUpdatePreProcessor;
18+
19+
public class GenericResourceUpdatePreProcessor<R extends HasMetadata> implements
20+
ResourceUpdatePreProcessor<R> {
21+
private static final ResourceUpdatePreProcessor<?> INSTANCE =
22+
new GenericResourceUpdatePreProcessor<>();
23+
24+
@SuppressWarnings("rawtypes")
25+
private static final Map<Class, ResourceUpdatePreProcessor> processors = Map.of(
26+
Secret.class, new SecretResourceUpdatePreProcessor(),
27+
ConfigMap.class, new ConfigMapResourceUpdatePreProcessor(),
28+
ServiceAccount.class, new ServiceAccountResourceUpdateProcessor(),
29+
Role.class, new RoleResourceUpdatePreProcessor(),
30+
ClusterRole.class, new ClusterRoleResourceUpdatePreProcessor(),
31+
RoleBinding.class, new RoleBindingResourceUpdatePreProcessor(),
32+
ClusterRoleBinding.class, new ClusterRoleBindingResourceUpdatePreProcessor());
33+
34+
protected GenericResourceUpdatePreProcessor() {}
35+
36+
@SuppressWarnings("unchecked")
37+
public static <R extends HasMetadata> ResourceUpdatePreProcessor<R> processorFor(
38+
Class<R> resourceType) {
39+
final var processor = processors.get(resourceType);
40+
return processor != null ? processor : (ResourceUpdatePreProcessor<R>) INSTANCE;
41+
}
42+
43+
public R replaceSpecOnActual(R actual, R desired, Context<?> context) {
44+
var clonedActual = ConfigurationServiceProvider.instance().getResourceCloner().clone(actual);
45+
updateClonedActual(clonedActual, desired);
46+
return clonedActual;
47+
}
48+
49+
protected void updateClonedActual(R actual, R desired) {
50+
var desiredSpec = ReconcilerUtils.getSpec(desired);
51+
ReconcilerUtils.setSpec(actual, desiredSpec);
52+
}
53+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package io.javaoperatorsdk.operator.processing.dependent.kubernetes.processors;
2+
3+
import io.fabric8.kubernetes.api.model.rbac.RoleBinding;
4+
5+
public class RoleBindingResourceUpdatePreProcessor
6+
extends GenericResourceUpdatePreProcessor<RoleBinding> {
7+
8+
@Override
9+
protected void updateClonedActual(RoleBinding actual, RoleBinding desired) {
10+
actual.setRoleRef(desired.getRoleRef());
11+
actual.setSubjects(desired.getSubjects());
12+
}
13+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package io.javaoperatorsdk.operator.processing.dependent.kubernetes.processors;
2+
3+
import io.fabric8.kubernetes.api.model.rbac.Role;
4+
5+
public class RoleResourceUpdatePreProcessor extends GenericResourceUpdatePreProcessor<Role> {
6+
7+
@Override
8+
protected void updateClonedActual(Role actual, Role desired) {
9+
actual.setRules(desired.getRules());
10+
}
11+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package io.javaoperatorsdk.operator.processing.dependent.kubernetes.processors;
2+
3+
import io.fabric8.kubernetes.api.model.Secret;
4+
5+
public class SecretResourceUpdatePreProcessor extends GenericResourceUpdatePreProcessor<Secret> {
6+
7+
@Override
8+
protected void updateClonedActual(Secret actual, Secret desired) {
9+
actual.setData(desired.getData());
10+
actual.setStringData(desired.getStringData());
11+
actual.setImmutable(desired.getImmutable());
12+
actual.setType(desired.getType());
13+
}
14+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package io.javaoperatorsdk.operator.processing.dependent.kubernetes.processors;
2+
3+
import io.fabric8.kubernetes.api.model.ServiceAccount;
4+
5+
public class ServiceAccountResourceUpdateProcessor
6+
extends GenericResourceUpdatePreProcessor<ServiceAccount> {
7+
8+
@Override
9+
protected void updateClonedActual(ServiceAccount actual, ServiceAccount desired) {
10+
actual.setAutomountServiceAccountToken(desired.getAutomountServiceAccountToken());
11+
actual.setImagePullSecrets(desired.getImagePullSecrets());
12+
actual.setSecrets(desired.getSecrets());
13+
}
14+
}

operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/GenericResourceUpdatePreProcessorTest.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,13 @@
99
import io.fabric8.kubernetes.api.model.Namespace;
1010
import io.fabric8.kubernetes.api.model.NamespaceBuilder;
1111
import io.fabric8.kubernetes.api.model.NamespaceSpec;
12+
import io.fabric8.kubernetes.api.model.Secret;
13+
import io.fabric8.kubernetes.api.model.SecretBuilder;
1214
import io.fabric8.kubernetes.api.model.apps.Deployment;
1315
import io.javaoperatorsdk.operator.ReconcilerUtils;
1416
import io.javaoperatorsdk.operator.api.config.ControllerConfiguration;
1517
import io.javaoperatorsdk.operator.api.reconciler.Context;
18+
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.processors.GenericResourceUpdatePreProcessor;
1619

1720
import static org.assertj.core.api.Assertions.assertThat;
1821
import static org.mockito.Mockito.mock;
@@ -74,6 +77,19 @@ void checkNamespaces() {
7477
assertThat(result.getSpec()).isNull();
7578
}
7679

80+
@Test
81+
void checkSecret() {
82+
var processor = GenericResourceUpdatePreProcessor.processorFor(Secret.class);
83+
var desired =
84+
new SecretBuilder().withImmutable().withType("Opaque").addToData("foo", "bar").build();
85+
var actual = new SecretBuilder().build();
86+
87+
final var secret = processor.replaceSpecOnActual(actual, desired, context);
88+
assertThat(secret.getImmutable()).isTrue();
89+
assertThat(secret.getType()).isEqualTo("Opaque");
90+
assertThat(secret.getData()).containsOnlyKeys("foo");
91+
}
92+
7793
Deployment createDeployment() {
7894
return ReconcilerUtils.loadYaml(
7995
Deployment.class, GenericResourceUpdatePreProcessorTest.class, "nginx-deployment.yaml");

0 commit comments

Comments
 (0)