Skip to content

Commit 0d27a05

Browse files
committed
wip
Signed-off-by: Attila Mészáros <[email protected]>
1 parent fee18ed commit 0d27a05

File tree

9 files changed

+84
-36
lines changed

9 files changed

+84
-36
lines changed

src/main/java/io/csviri/operator/glue/customresource/operator/GlueMetadata.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@
44

55
public class GlueMetadata {
66

7-
String name;
8-
String namespace;
7+
private String name;
8+
private String namespace;
99

1010
public String getName() {
1111
return name;
Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,21 @@
11
package io.csviri.operator.glue.dependent;
22

33
import io.csviri.operator.glue.customresource.glue.Glue;
4+
import io.csviri.operator.glue.templating.GenericTemplateHandler;
45
import io.fabric8.kubernetes.api.model.GenericKubernetesResource;
56
import io.javaoperatorsdk.operator.api.reconciler.dependent.GarbageCollected;
67

78
public class GCGenericDependentResource extends GenericDependentResource
89
implements GarbageCollected<Glue> {
910

10-
public GCGenericDependentResource(GenericKubernetesResource desired, String name,
11+
public GCGenericDependentResource(GenericTemplateHandler genericTemplateHandler,
12+
GenericKubernetesResource desired, String name,
1113
boolean clusterScoped) {
12-
super(desired, name, clusterScoped);
14+
super(genericTemplateHandler, desired, name, clusterScoped);
1315
}
1416

15-
public GCGenericDependentResource(String desiredTemplate, String name, boolean clusterScoped) {
16-
super(desiredTemplate, name, clusterScoped);
17+
public GCGenericDependentResource(GenericTemplateHandler genericTemplateHandler,
18+
String desiredTemplate, String name, boolean clusterScoped) {
19+
super(genericTemplateHandler, desiredTemplate, name, clusterScoped);
1720
}
1821
}

src/main/java/io/csviri/operator/glue/dependent/GenericDependentResource.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,20 +25,24 @@ public class GenericDependentResource
2525
private final boolean clusterScoped;
2626

2727
// optimize share between instances
28-
private final GenericTemplateHandler genericTemplateHandler = new GenericTemplateHandler();
28+
private final GenericTemplateHandler genericTemplateHandler;
2929

30-
public GenericDependentResource(GenericKubernetesResource desired, String name,
30+
public GenericDependentResource(GenericTemplateHandler genericTemplateHandler,
31+
GenericKubernetesResource desired, String name,
3132
boolean clusterScoped) {
3233
super(new GroupVersionKind(desired.getApiVersion(), desired.getKind()));
3334
this.desired = desired;
3435
this.desiredTemplate = null;
3536
this.name = name;
3637
this.clusterScoped = clusterScoped;
38+
this.genericTemplateHandler = genericTemplateHandler;
3739
}
3840

39-
public GenericDependentResource(String desiredTemplate, String name, boolean clusterScoped) {
41+
public GenericDependentResource(GenericTemplateHandler genericTemplateHandler,
42+
String desiredTemplate, String name, boolean clusterScoped) {
4043
super(new GroupVersionKind(Utils.getApiVersionFromTemplate(desiredTemplate),
4144
Utils.getKindFromTemplate(desiredTemplate)));
45+
this.genericTemplateHandler = genericTemplateHandler;
4246
this.name = name;
4347
this.desiredTemplate = desiredTemplate;
4448
this.desired = null;

src/main/java/io/csviri/operator/glue/reconciler/glue/GlueReconciler.java

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -49,13 +49,14 @@ public class GlueReconciler implements Reconciler<Glue>, Cleaner<Glue>, ErrorSta
4949
private final KubernetesResourceDeletedCondition deletePostCondition =
5050
new KubernetesResourceDeletedCondition();
5151

52-
private final GenericTemplateHandler genericTemplateHandler = new GenericTemplateHandler();
53-
52+
private final GenericTemplateHandler genericTemplateHandler;
5453

5554
public GlueReconciler(ValidationAndErrorHandler validationAndErrorHandler,
56-
InformerRegister informerRegister) {
55+
InformerRegister informerRegister,
56+
GenericTemplateHandler genericTemplateHandler) {
5757
this.validationAndErrorHandler = validationAndErrorHandler;
5858
this.informerRegister = informerRegister;
59+
this.genericTemplateHandler = genericTemplateHandler;
5960
}
6061

6162
/**
@@ -199,21 +200,23 @@ private void createAndAddDependentToWorkflow(Glue primary, Context<Glue> context
199200
.ifPresent(c -> builder.withReconcilePrecondition(toCondition(c)));
200201
}
201202

202-
private static GenericDependentResource createDependentResource(DependentResourceSpec spec,
203+
private GenericDependentResource createDependentResource(DependentResourceSpec spec,
203204
boolean leafDependent, Boolean resourceInSameNamespaceAsPrimary) {
204205

205206
if (leafDependent && resourceInSameNamespaceAsPrimary && !spec.isClusterScoped()) {
206207
return spec.getResourceTemplate() != null
207-
? new GCGenericDependentResource(spec.getResourceTemplate(), spec.getName(),
208+
? new GCGenericDependentResource(genericTemplateHandler, spec.getResourceTemplate(),
209+
spec.getName(),
208210
spec.isClusterScoped())
209-
: new GCGenericDependentResource(spec.getResource(), spec.getName(),
211+
: new GCGenericDependentResource(genericTemplateHandler, spec.getResource(),
212+
spec.getName(),
210213
spec.isClusterScoped());
211214
} else {
212215
return spec.getResourceTemplate() != null
213-
? new GenericDependentResource(spec.getResourceTemplate(), spec.getName(),
214-
spec.isClusterScoped())
215-
: new GenericDependentResource(spec.getResource(), spec.getName(),
216-
spec.isClusterScoped());
216+
? new GenericDependentResource(genericTemplateHandler,
217+
spec.getResourceTemplate(), spec.getName(), spec.isClusterScoped())
218+
: new GenericDependentResource(genericTemplateHandler,
219+
spec.getResource(), spec.getName(), spec.isClusterScoped());
217220
}
218221
}
219222

src/main/java/io/csviri/operator/glue/reconciler/operator/GlueOperatorReconciler.java

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import io.csviri.operator.glue.customresource.operator.GlueOperatorSpec;
1616
import io.csviri.operator.glue.customresource.operator.ResourceFlowOperatorStatus;
1717
import io.csviri.operator.glue.reconciler.ValidationAndErrorHandler;
18+
import io.csviri.operator.glue.templating.GenericTemplateHandler;
1819
import io.fabric8.kubernetes.api.model.GenericKubernetesResource;
1920
import io.fabric8.kubernetes.api.model.ObjectMeta;
2021
import io.fabric8.kubernetes.api.model.ObjectMetaBuilder;
@@ -27,7 +28,6 @@
2728
import io.javaoperatorsdk.operator.processing.event.source.informer.InformerEventSource;
2829

2930
import jakarta.annotation.PostConstruct;
30-
import jakarta.inject.Inject;
3131

3232
import static io.csviri.operator.glue.reconciler.glue.GlueReconciler.GLUE_RECONCILER_NAME;
3333

@@ -43,19 +43,25 @@ public class GlueOperatorReconciler
4343
public static final String PARENT_RELATED_RESOURCE_NAME = "parent";
4444
public static final String GLUE_OPERATOR_RECONCILER_NAME = "glue-operator";
4545

46-
@Inject
47-
ValidationAndErrorHandler validationAndErrorHandler;
48-
4946
@ConfigProperty(name = "quarkus.operator-sdk.controllers." + GLUE_RECONCILER_NAME + ".selector")
5047
Optional<String> glueLabelSelector;
5148

52-
@Inject
53-
ControllerConfig controllerConfig;
49+
private final ControllerConfig controllerConfig;
50+
private final ValidationAndErrorHandler validationAndErrorHandler;
51+
private final GenericTemplateHandler genericTemplateHandler;
5452

5553
private Map<String, String> defaultGlueLabels;
5654

5755
private InformerEventSource<Glue, GlueOperator> glueEventSource;
5856

57+
public GlueOperatorReconciler(ControllerConfig controllerConfig,
58+
ValidationAndErrorHandler validationAndErrorHandler,
59+
GenericTemplateHandler genericTemplateHandler) {
60+
this.controllerConfig = controllerConfig;
61+
this.validationAndErrorHandler = validationAndErrorHandler;
62+
this.genericTemplateHandler = genericTemplateHandler;
63+
}
64+
5965
@PostConstruct
6066
void init() {
6167
defaultGlueLabels = initDefaultLabelsToAddToGlue();
@@ -120,13 +126,24 @@ private Glue createGlue(GenericKubernetesResource targetParentResource,
120126
}
121127

122128
private ObjectMeta glueMetadata(GlueOperator glueOperator,
123-
GenericKubernetesResource targetParentResource) {
129+
GenericKubernetesResource parent) {
124130

125131
ObjectMetaBuilder objectMetaBuilder = new ObjectMetaBuilder();
126132

127-
objectMetaBuilder.withName(
128-
glueName(targetParentResource.getMetadata().getName(), targetParentResource.getKind()))
129-
.withNamespace(targetParentResource.getMetadata().getNamespace());
133+
var glueMeta = glueOperator.getSpec().getGlueMetadata();
134+
if (glueMeta != null) {
135+
// todo optimize
136+
var data = Map.of(PARENT_RELATED_RESOURCE_NAME, parent);
137+
var glueName = genericTemplateHandler.processInputAndTemplate(data, glueMeta.getName());
138+
var glueNamespace =
139+
genericTemplateHandler.processInputAndTemplate(data, glueMeta.getNamespace());
140+
objectMetaBuilder.withName(glueName);
141+
objectMetaBuilder.withName(glueNamespace);
142+
} else {
143+
objectMetaBuilder.withName(
144+
glueName(parent.getMetadata().getName(), parent.getKind()))
145+
.withNamespace(parent.getMetadata().getNamespace());
146+
}
130147

131148
objectMetaBuilder
132149
.withLabels(Map.of(FOR_GLUE_OPERATOR_LABEL_KEY, FOR_GLUE_OPERATOR_LABEL_VALUE));

src/main/java/io/csviri/operator/glue/templating/GenericTemplateHandler.java

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,31 +5,46 @@
55

66
import io.csviri.operator.glue.Utils;
77
import io.csviri.operator.glue.customresource.glue.Glue;
8+
import io.fabric8.kubernetes.api.model.GenericKubernetesResource;
89
import io.javaoperatorsdk.operator.api.reconciler.Context;
910
import io.quarkus.qute.Engine;
1011
import io.quarkus.qute.Template;
1112

1213
import com.fasterxml.jackson.databind.ObjectMapper;
1314

15+
import jakarta.inject.Singleton;
16+
17+
@Singleton
1418
public class GenericTemplateHandler {
1519

1620
public static final String WORKFLOW_METADATA_KEY = "glueMetadata";
1721

1822
private static final ObjectMapper objectMapper = new ObjectMapper();
1923
private static final Engine engine = Engine.builder().addDefaults().build();
2024

25+
public String processTemplate(Map<String, Map<?, ?>> data, String template) {
26+
Template parsedTemplate = engine.parse(template);
27+
return parsedTemplate.data(data).render();
28+
}
29+
30+
public String processInputAndTemplate(Map<String, GenericKubernetesResource> data,
31+
String template) {
32+
Map<String, Map<?, ?>> res = new HashMap<>();
33+
data.forEach((key, value) -> res.put(key,
34+
value == null ? null : objectMapper.convertValue(value, Map.class)));
35+
return processTemplate(res, template);
36+
}
37+
2138
public String processTemplate(String template, Glue primary,
2239
Context<Glue> context) {
2340

24-
Template hello = engine.parse(template);
2541
var data = createDataWithResources(primary, context);
26-
return hello.data(data).render();
42+
return processTemplate(data, template);
2743
}
2844

29-
@SuppressWarnings("rawtypes")
30-
private static Map<String, Map> createDataWithResources(Glue primary,
45+
private static Map<String, Map<?, ?>> createDataWithResources(Glue primary,
3146
Context<Glue> context) {
32-
Map<String, Map> res = new HashMap<>();
47+
Map<String, Map<?, ?>> res = new HashMap<>();
3348
var actualResourcesByName = Utils.getActualResourcesByNameInWorkflow(context, primary);
3449

3550
actualResourcesByName.forEach((key, value) -> res.put(key,

src/test/java/io/csviri/operator/glue/GlueOperatorTest.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import java.util.stream.IntStream;
66

77
import org.junit.jupiter.api.BeforeEach;
8+
import org.junit.jupiter.api.Disabled;
89
import org.junit.jupiter.api.Test;
910

1011
import io.csviri.operator.glue.customresource.TestCustomResource;
@@ -189,9 +190,11 @@ void parentWithLabelSelector() {
189190
}
190191

191192

193+
@Disabled
192194
@Test
193195
void secretCopySample() {
194-
196+
create(TestUtils
197+
.loadGlueOperator("/glueoperator/ParentLabelSelector.yaml"));
195198
}
196199

197200

src/test/java/io/csviri/operator/glue/TestUtils.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424

2525
public class TestUtils {
2626

27-
public static final Duration GC_WAIT_TIMEOUT = Duration.ofSeconds(90);
27+
public static final Duration GC_WAIT_TIMEOUT = Duration.ofSeconds(120);
2828
public static final Duration INITIAL_RECONCILE_WAIT_TIMEOUT = Duration.ofMillis(150);
2929

3030
public static final int CRD_READY_WAIT = 1000;

src/test/resources/sample/secretcopy/secret.copy.operator.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@ spec:
66
parent:
77
apiVersion: v1
88
kind: Namespace
9+
glueMetadata:
10+
name: copied-secret-glue
11+
namespace: {parent.metadata.name}
912
childResources:
1013
- name: secret
1114
resource:

0 commit comments

Comments
 (0)