From b9f469de1333c194dcbf69290d5190356decce56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Attila=20M=C3=A9sz=C3=A1ros?= Date: Sun, 27 Apr 2025 12:36:26 +0200 Subject: [PATCH 1/2] feat: qute condition MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Attila Mészáros --- .../glue/conditions/QuteCondition.java | 26 +++++++++++++++++++ .../glue/condition/ConditionSpec.java | 3 ++- .../glue/condition/QuteConditionSpec.java | 14 ++++++++++ .../glue/reconciler/glue/GlueReconciler.java | 4 +++ 4 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 src/main/java/io/javaoperatorsdk/operator/glue/conditions/QuteCondition.java create mode 100644 src/main/java/io/javaoperatorsdk/operator/glue/customresource/glue/condition/QuteConditionSpec.java diff --git a/src/main/java/io/javaoperatorsdk/operator/glue/conditions/QuteCondition.java b/src/main/java/io/javaoperatorsdk/operator/glue/conditions/QuteCondition.java new file mode 100644 index 0000000..74e5244 --- /dev/null +++ b/src/main/java/io/javaoperatorsdk/operator/glue/conditions/QuteCondition.java @@ -0,0 +1,26 @@ +package io.javaoperatorsdk.operator.glue.conditions; + +import io.fabric8.kubernetes.api.model.GenericKubernetesResource; +import io.javaoperatorsdk.operator.api.reconciler.Context; +import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResource; +import io.javaoperatorsdk.operator.glue.customresource.glue.Glue; +import io.javaoperatorsdk.operator.glue.templating.GenericTemplateHandler; +import io.javaoperatorsdk.operator.processing.dependent.workflow.Condition; + +public class QuteCondition implements Condition { + + private final GenericTemplateHandler genericTemplateHandler; + private final String template; + + public QuteCondition(GenericTemplateHandler genericTemplateHandler, String template) { + this.genericTemplateHandler = genericTemplateHandler; + this.template = template; + } + + @Override + public boolean isMet(DependentResource dependentResource, + Glue primary, Context context) { + // TODO + return false; + } +} diff --git a/src/main/java/io/javaoperatorsdk/operator/glue/customresource/glue/condition/ConditionSpec.java b/src/main/java/io/javaoperatorsdk/operator/glue/customresource/glue/condition/ConditionSpec.java index 0c4b1bd..ce5acce 100644 --- a/src/main/java/io/javaoperatorsdk/operator/glue/customresource/glue/condition/ConditionSpec.java +++ b/src/main/java/io/javaoperatorsdk/operator/glue/customresource/glue/condition/ConditionSpec.java @@ -8,7 +8,8 @@ property = "type") @JsonSubTypes({ @JsonSubTypes.Type(value = ReadyConditionSpec.class, name = "ReadyCondition"), - @JsonSubTypes.Type(value = JavaScriptConditionSpec.class, name = "JSCondition") + @JsonSubTypes.Type(value = JavaScriptConditionSpec.class, name = "JSCondition"), + @JsonSubTypes.Type(value = QuteConditionSpec.class, name = "QuteCondition") }) public class ConditionSpec { diff --git a/src/main/java/io/javaoperatorsdk/operator/glue/customresource/glue/condition/QuteConditionSpec.java b/src/main/java/io/javaoperatorsdk/operator/glue/customresource/glue/condition/QuteConditionSpec.java new file mode 100644 index 0000000..14c7e2c --- /dev/null +++ b/src/main/java/io/javaoperatorsdk/operator/glue/customresource/glue/condition/QuteConditionSpec.java @@ -0,0 +1,14 @@ +package io.javaoperatorsdk.operator.glue.customresource.glue.condition; + +public class QuteConditionSpec extends ConditionSpec { + + private String template; + + public String getTemplate() { + return template; + } + + public void setTemplate(String template) { + this.template = template; + } +} diff --git a/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/GlueReconciler.java b/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/GlueReconciler.java index 1dd2e47..b954c69 100644 --- a/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/GlueReconciler.java +++ b/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/GlueReconciler.java @@ -14,12 +14,14 @@ import io.javaoperatorsdk.operator.api.reconciler.*; import io.javaoperatorsdk.operator.glue.Utils; import io.javaoperatorsdk.operator.glue.conditions.JavaScripCondition; +import io.javaoperatorsdk.operator.glue.conditions.QuteCondition; import io.javaoperatorsdk.operator.glue.conditions.ReadyCondition; import io.javaoperatorsdk.operator.glue.customresource.glue.DependentResourceSpec; import io.javaoperatorsdk.operator.glue.customresource.glue.Glue; import io.javaoperatorsdk.operator.glue.customresource.glue.GlueStatus; import io.javaoperatorsdk.operator.glue.customresource.glue.condition.ConditionSpec; import io.javaoperatorsdk.operator.glue.customresource.glue.condition.JavaScriptConditionSpec; +import io.javaoperatorsdk.operator.glue.customresource.glue.condition.QuteConditionSpec; import io.javaoperatorsdk.operator.glue.customresource.glue.condition.ReadyConditionSpec; import io.javaoperatorsdk.operator.glue.dependent.GCGenericBulkDependentResource; import io.javaoperatorsdk.operator.glue.dependent.GCGenericDependentResource; @@ -287,6 +289,8 @@ private Condition toCondition(ConditionSpec condition) { return new ReadyCondition(readyConditionSpec.isNegated()); } else if (condition instanceof JavaScriptConditionSpec jsCondition) { return new JavaScripCondition(jsCondition.getScript()); + } else if (condition instanceof QuteConditionSpec quteConditionSpec) { + return new QuteCondition(genericTemplateHandler, quteConditionSpec.getTemplate()); } throw new IllegalStateException("Unknown condition: " + condition); } From 253adb182af19ee1b0fe795596a6d7638d0ee7c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Attila=20M=C3=A9sz=C3=A1ros?= Date: Mon, 28 Apr 2025 10:51:39 +0200 Subject: [PATCH 2/2] condition impl MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Attila Mészáros --- .../glue/conditions/QuteCondition.java | 19 +++++++++++++++++-- .../templating/GenericTemplateHandler.java | 4 ++++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/main/java/io/javaoperatorsdk/operator/glue/conditions/QuteCondition.java b/src/main/java/io/javaoperatorsdk/operator/glue/conditions/QuteCondition.java index 74e5244..933fe40 100644 --- a/src/main/java/io/javaoperatorsdk/operator/glue/conditions/QuteCondition.java +++ b/src/main/java/io/javaoperatorsdk/operator/glue/conditions/QuteCondition.java @@ -1,5 +1,8 @@ package io.javaoperatorsdk.operator.glue.conditions; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import io.fabric8.kubernetes.api.model.GenericKubernetesResource; import io.javaoperatorsdk.operator.api.reconciler.Context; import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResource; @@ -9,6 +12,8 @@ public class QuteCondition implements Condition { + private static final Logger LOG = LoggerFactory.getLogger(QuteCondition.class); + private final GenericTemplateHandler genericTemplateHandler; private final String template; @@ -20,7 +25,17 @@ public QuteCondition(GenericTemplateHandler genericTemplateHandler, String templ @Override public boolean isMet(DependentResource dependentResource, Glue primary, Context context) { - // TODO - return false; + + LOG.debug("Evaluating condition with template: {}", template); + + var data = GenericTemplateHandler.createDataWithResources(primary, context); + data.put("target", GenericTemplateHandler + .convertToValue(dependentResource.getSecondaryResource(primary, context))); + + var res = genericTemplateHandler.processTemplate(data, template, false); + + LOG.debug("Qute condition result: {}", res); + + return "true".equalsIgnoreCase(res.trim()); } } diff --git a/src/main/java/io/javaoperatorsdk/operator/glue/templating/GenericTemplateHandler.java b/src/main/java/io/javaoperatorsdk/operator/glue/templating/GenericTemplateHandler.java index 66c28f7..8bfd72a 100644 --- a/src/main/java/io/javaoperatorsdk/operator/glue/templating/GenericTemplateHandler.java +++ b/src/main/java/io/javaoperatorsdk/operator/glue/templating/GenericTemplateHandler.java @@ -78,6 +78,10 @@ public String processTemplate(String template, Glue primary, boolean objectTempl return res; } + public static Map convertToValue(Object value) { + return objectMapper.convertValue(value, Map.class); + } + @SuppressWarnings("unchecked") public static Map parseTemplateToMapObject(String template) { return Serialization.unmarshal(template, Map.class);