Skip to content

AggregatedOperatorException: Exception(s) during workflow execution #189

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
cmoulliard opened this issue May 27, 2025 · 3 comments
Open

Comments

@cmoulliard
Copy link

Issue

The following template definition

apiVersion: io.javaoperatorsdk.operator.glue/v1beta1
kind: GlueOperator
metadata:
  name: ingress-platform
spec:
  parent:
    apiVersion: halkyon.io/v1alpha1
    kind: Platform
  childResources:
    - name: jobs
      bulk: true
      resourceTemplate: |
        items:
        {#for pkg in parent.spec.packages}
        {#for s in pkg.pipeline.steps}
        - apiVersion: batch/v1
          kind: Job
          metadata:
            name: {s.name}
            namespace: default
          spec:
            template:
              spec:
                containers:
                  - name: {s.name}
                    image: {s.image}
                    command:
                    {#if s.script??}
                    - /bin/sh
                    - -exc
                    - |
                      echo "Helm values ..."
                      {#if s.values??}
                      echo {s.values}
                      {/if}
                      {s.script}
                    {/if}
                restartPolicy: Never
            backoffLimit: 4
        {/for}
        {/for}

Data

spec:
  version: 0.1.0
  description: "A simple platform"
  packages:
    - name: nginx-ingress
      description: "nginx-ingress package"
      pipeline:
        steps:
        - name: pre-install
          image: registry.access.redhat.com/ubi9
          script: |
            echo "This is a pre-installation running a job"
        - name: install-nginx-ingress
          image: dtzar/helm-kubectl
          repoUrl: https://kubernetes.github.io/ingress-nginx
          version: 4.12.2
          script: |
            helm version
          values: |
            ingress:
              enabled: true
        - name: post-install
          image: registry.access.redhat.com/ubi9
          script: |
            echo "This is a post-installation running a job"

raises this error

2025-05-27 17:34:49,353 ERROR [io.jav.ope.pro.eve.EventProcessor] (ReconcilerExecutor-glue-179) Error during event processing ExecutionScope{ resource id: ResourceID{name='simple-platform-platform', namespace='default'}, version: 98104}

Exception in GlueReconciler.java:90
          88      addFinalizersToParentResource(primary, context);
          89      var actualWorkflow = buildWorkflowAndRegisterInformers(primary, context);
        → 90      var result = actualWorkflow.reconcile(primary, context);
          91      cleanupRemovedResourcesFromWorkflow(context, primary);
          92      informerRegister.deRegisterInformerOnResourceFlowChange(context, primary);

Exception in GlueReconciler.java:39
          37  import static io.javaoperatorsdk.operator.glue.reconciler.operator.GlueOperatorReconciler.PARENT_RELATED_RESOURCE_NAME;
          38  
        → 39  @ControllerConfiguration(name = GlueReconciler.GLUE_RECONCILER_NAME)
          40  public class GlueReconciler implements Reconciler<Glue>, Cleaner<Glue> {
          41  

: io.javaoperatorsdk.operator.AggregatedOperatorException: Exception(s) during workflow execution. Details:
 - jobs -> while parsing a block mapping
 in reader, line 1, column 1:
    items:
    ^
expected <block end>, but found ']'
 in reader, line 19, column 1:
    ]
    ^

        at org.snakeyaml.engine.v2.parser.ParserImpl$ParseBlockMappingKey.produce(ParserImpl.java:729)
        at org.snakeyaml.engine.v2.parser.ParserImpl.lambda$produce$1(ParserImpl.java:232)
        at java.base/java.util.Optional.ifPresent(Optional.java:178)
        at org.snakeyaml.engine.v2.parser.ParserImpl.produce(ParserImpl.java:232)
        at org.snakeyaml.engine.v2.parser.ParserImpl.peekEvent(ParserImpl.java:206)
        at org.snakeyaml.engine.v2.comments.CommentEventsCollector$1.peek(CommentEventsCollector.java:57)
        at org.snakeyaml.engine.v2.comments.CommentEventsCollector$1.peek(CommentEventsCollector.java:43)
        at org.snakeyaml.engine.v2.comments.CommentEventsCollector.collectEvents(CommentEventsCollector.java:135)
        at org.snakeyaml.engine.v2.comments.CommentEventsCollector.collectEvents(CommentEventsCollector.java:115)
        at org.snakeyaml.engine.v2.composer.Composer.composeSequenceNode(Composer.java:284)
        at org.snakeyaml.engine.v2.composer.Composer.composeNode(Composer.java:208)
        at org.snakeyaml.engine.v2.composer.Composer.composeValueNode(Composer.java:364)
        at org.snakeyaml.engine.v2.composer.Composer.composeMappingChildren(Composer.java:343)
        at org.snakeyaml.engine.v2.composer.Composer.composeMappingNode(Composer.java:321)
        at org.snakeyaml.engine.v2.composer.Composer.composeNode(Composer.java:210)
        at org.snakeyaml.engine.v2.composer.Composer.next(Composer.java:162)
        at org.snakeyaml.engine.v2.api.Load$YamlIterator.next(Load.java:234)
        at io.fabric8.kubernetes.client.utils.KubernetesSerialization.parseYaml(KubernetesSerialization.java:274)
        at io.fabric8.kubernetes.client.utils.KubernetesSerialization.unmarshal(KubernetesSerialization.java:255)
        at io.fabric8.kubernetes.client.utils.KubernetesSerialization.unmarshal(KubernetesSerialization.java:345)
        at io.fabric8.kubernetes.client.utils.KubernetesSerialization.unmarshal(KubernetesSerialization.java:330)
        at io.fabric8.kubernetes.client.utils.Serialization.unmarshal(Serialization.java:186)
        at io.javaoperatorsdk.operator.glue.dependent.GenericBulkDependentResource.desiredResources(GenericBulkDependentResource.java:33)
        at io.javaoperatorsdk.operator.glue.dependent.GenericBulkDependentResource.desiredResources(GenericBulkDependentResource.java:17)
        at io.javaoperatorsdk.operator.processing.dependent.BulkDependentResourceReconciler.reconcile(BulkDependentResourceReconciler.java:36)
        at io.javaoperatorsdk.operator.processing.dependent.AbstractDependentResource.reconcile(AbstractDependentResource.java:66)
        at io.javaoperatorsdk.operator.processing.dependent.workflow.WorkflowReconcileExecutor$NodeReconcileExecutor.doRun(WorkflowReconcileExecutor.java:145)
        at io.javaoperatorsdk.operator.processing.dependent.workflow.NodeExecutor.run(NodeExecutor.java:20)
        at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:572)
        at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317)
        at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
        at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
        at java.base/java.lang.Thread.run(Thread.java:1583)

        at io.javaoperatorsdk.operator.processing.dependent.workflow.BaseWorkflowResult.throwAggregateExceptionIfErrorsPresent(BaseWorkflowResult.java:95)
        at io.javaoperatorsdk.operator.processing.dependent.workflow.DefaultWorkflow.reconcile(DefaultWorkflow.java:103)
        at io.javaoperatorsdk.operator.glue.reconciler.glue.GlueReconciler.reconcile(GlueReconciler.java:90)
        at io.javaoperatorsdk.operator.glue.reconciler.glue.GlueReconciler.reconcile(GlueReconciler.java:39)
        at io.javaoperatorsdk.operator.glue.reconciler.glue.GlueReconciler_ClientProxy.reconcile(Unknown Source)

@cmoulliard
Copy link
Author

Apparently this is the content of the values string field which is responsible of such errors. Here is another example

: io.javaoperatorsdk.operator.AggregatedOperatorException: Exception(s) during workflow execution. Details:
 - jobs -> while scanning a simple key
 in reader, line 41, column 1:
    EOF
    ^
could not find expected ':'
 in reader, line 42, column 1:
    helm repo add https://kubernetes ... 
    ^

        at org.snakeyaml.engine.v2.scanner.ScannerImpl.stalePossibleSimpleKeys(ScannerImpl.java:475)
        at org.snakeyaml.engine.v2.scanner.ScannerImpl.needMoreTokens(ScannerImpl.java:294)
        at org.snakeyaml.engine.v2.scanner.ScannerImpl.checkToken(ScannerImpl.java:192)
        at org.snakeyaml.engine.v2.parser.ParserImpl$ParseBlockMappingKey.produce(ParserImpl.java:712)
        at org.snakeyaml.engine.v2.parser.ParserImpl.lambda$produce$1(ParserImpl.java:232)
        at java.base/java.util.Optional.ifPresent(Optional.java:178)

when

          script: |
            cat << EOF > values.yml
            ingress:
              enabled: true
            EOF
            helm repo add https://kubernetes.github.io/ingress-nginx
            helm repo update
            helm install nginx-ingress ingress-nginx/ingress-nginx \
               --version 4.12.2 \
               --namespace ingress-nginx \
               --create-namespace \
               -f values.yml

and

        {#for pkg in parent.spec.packages}
        {#for s in pkg.pipeline.steps}
        - apiVersion: batch/v1
          kind: Job
          metadata:
            name: {s.name}
            namespace: default
          spec:
            template:
              spec:
                containers:
                  - name: {s.name}
                    image: {s.image}
                    command:
                    {#if s.script??}
                    - /bin/sh
                    - -exc
                    - |
                      {s.script}
                    {/if}
                restartPolicy: Never
            backoffLimit: 4
        {/for}
        {/for}

@cmoulliard
Copy link
Author

We can reproduce the issue using the following test

  @Test
  void testMultilinesScript() {
    var bashScript = """
       cat << EOF > values.yml
       ingress:
         enabled: true
       EOF
       helm repo add kubernetes.github.io/ingress-nginx
       helm repo update
       helm install nginx-ingress ingress-nginx/ingress-nginx \\
          --version 4.12.2 \\
          --namespace ingress-nginx \\
          --create-namespace \\
          -f values.yml
    """;
    var template = """
        spec:
          template:
            spec:
              containers:
                - name: {s.name}
                  image: {s.image}
                  command:
                    - /bin/sh
                    - -exc
                    - |
                      "{s.script}"
        """;

    Map<String, Map<?, ?>> data = new HashMap<>();

    Map values = new HashMap();
    values.put("name", "helm-install");
    values.put("image", "dtzar/helm-kubectl");
    values.put("script", bashScript);
    data.put("s", values);

    var result = templateHandler.processTemplate(data, template, true);

    Map mapResult = Serialization.unmarshal(result, Map.class);
    assertEquals(bashScript, mapResult.get("script"));
  }

Error

r, line 2, column 3:
      template:
      ^
expected <block end>, but found '<block mapping start>'
 in reader, line 12, column 4:
       ingress:
       ^


	at org.snakeyaml.engine.v2.parser.ParserImpl$ParseBlockMappingKey.produce(ParserImpl.java:729)
	at org.snakeyaml.engine.v2.parser.ParserImpl.lambda$produce$1(ParserImpl.java:232)
	at java.base/java.util.Optional.ifPresent(Optional.java:178)
	at org.snakeyaml.engine.v2.parser.ParserImpl.produce(ParserImpl.java:232)
	at org.snakeyaml.engine.v2.parser.ParserImpl.peekEvent(ParserImpl.java:206)
	at org.snakeyaml.engine.v2.comments.CommentEventsCollector$1.peek(CommentEventsCollector.java:57)
	at org.snakeyaml.engine.v2.comments.CommentEventsCollector$1.peek(CommentEventsCollector.java:43)
	at org.snakeyaml.engine.v2.comments.CommentEventsCollector.collectEvents(CommentEventsCollector.java:135)
	at org.snakeyaml.engine.v2.comments.CommentEventsCollector.collectEvents(CommentEventsCollector.java:115)
	at org.snakeyaml.engine.v2.composer.Composer.composeMappingNode(Composer.java:328)
	at org.snakeyaml.engine.v2.composer.Composer.composeNode(Composer.java:210)
	at org.snakeyaml.engine.v2.composer.Composer.composeValueNode(Composer.java:364)
	at org.snakeyaml.engine.v2.composer.Composer.composeMappingChildren(Composer.java:343)
	at org.snakeyaml.engine.v2.composer.Composer.composeMappingNode(Composer.java:321)
	at org.snakeyaml.engine.v2.composer.Composer.composeNode(Composer.java:210)
	at org.snakeyaml.engine.v2.composer.Composer.composeValueNode(Composer.java:364)
	at org.snakeyaml.engine.v2.composer.Composer.composeMappingChildren(Composer.java:343)
	at org.snakeyaml.engine.v2.composer.Composer.composeMappingNode(Composer.java:321)
	at org.snakeyaml.engine.v2.composer.Composer.composeNode(Composer.java:210)
	at org.snakeyaml.engine.v2.composer.Composer.next(Composer.java:162)
	at org.snakeyaml.engine.v2.api.Load$YamlIterator.next(Load.java:234)
	at io.fabric8.kubernetes.client.utils.KubernetesSerialization.parseYaml(KubernetesSerialization.java:274)

@cmoulliard
Copy link
Author

cmoulliard commented May 28, 2025

I created a simple testcase showing where the issue occurs and which is releated to a wrong indentation

  @Test
  void testMultilinesScript() {
    var bashScript = """
       /bin/sh
       helm repo add kubernetes.github.io/ingress-nginx
       helm repo update
       helm install nginx-ingress ingress-nginx/ingress-nginx \
          --version 4.12.2 \
          --namespace ingress-nginx \
          --create-namespace \
          -f ingress.enabled=true
    """;

    var template = """
        spec:
          template:
            spec:
              containers:
                - name: {s.name}
                  image: {s.image}
                  command:
                  - /bin/sh
                  - -c
                  - |
                    {s.script}
        """;

    Map<String, Map<?, ?>> data = new HashMap<>();

    Map values = new HashMap();
    values.put("name", "helm-install");
    values.put("image", "dtzar/helm-kubectl");
    values.put("script", bashScript);
    data.put("s", values);

    final Engine engine = Engine.builder().addDefaults()
        .build();
    Template parsedTemplate = engine.parse(template);
    var result = parsedTemplate.data(data).render();
    System.out.println(result);

This will produce the following YAML having a wrong indentation

spec:
  template:
    spec:
      containers:
        - name: helm-install
          image: dtzar/helm-kubectl
          command:
          - /bin/sh
          - -c
          - |
                cat << EOF > values.yml
    ingress:
      enabled: true
    EOF
    helm repo add kubernetes.github.io/ingress-nginx
    helm repo update
    helm install nginx-ingress ingress-nginx/ingress-nginx \\
       --version 4.12.2 \\
       --namespace ingress-nginx \\
       --create-namespace \\
       -f values.yml

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant