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..933fe40 --- /dev/null +++ b/src/main/java/io/javaoperatorsdk/operator/glue/conditions/QuteCondition.java @@ -0,0 +1,41 @@ +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; +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 static final Logger LOG = LoggerFactory.getLogger(QuteCondition.class); + + 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) { + + 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/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); } 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);