Andrea Cosentino created CAMEL-24464:
----------------------------------------

             Summary: camel-exec ignores its documented CamelExecCommand* 
headers (executable and args have no effect)
                 Key: CAMEL-24464
                 URL: https://issues.apache.org/jira/browse/CAMEL-24464
             Project: Camel
          Issue Type: Bug
          Components: camel-exec
            Reporter: Andrea Cosentino


h3. Summary

{{camel-exec}} does not honour any of its documented {{CamelExecCommand*}} 
in-headers. The component reads its configuration only from the endpoint URI. 
The component documentation states the opposite.

h3. Documented behaviour

>From the component catalog metadata (4.22.0):

* {{CamelExecCommandExecutable}} — "The name of the system command that will be 
executed. *Overrides executable in the URI.*"
* {{CamelExecCommandArgs}} — "Command-line argument(s) to pass to the executed 
process ... *Overrides any existing args in the URI.*"

h3. Observed behaviour on 4.22.0

*Arguments* — identical route shape in both cases, only the mechanism differs:

|| how the argument is passed || stdout || header after the call ||
| {{exec:echo?args=URIARGS-WORK}} (URI parameter) | {{URIARGS-WORK}} | n/a |
| {{CamelExecCommandArgs}} header, {{exec:echo}} | _(empty)_ | still present, 
unconsumed |

*Executable* — tested in both directions so neither result can be a coincidence 
of which binary was picked:

|| endpoint || {{CamelExecCommandExecutable}} || command that actually ran ||
| {{exec:hostname}} | {{whoami}} | {{hostname}} |
| {{exec:whoami}} | {{hostname}} | {{whoami}} |

In every header case the header was still on the message after the call. 
{{camel-exec}} reads its command headers with {{getAndRemoveHeader}}, so a 
header that survives was never read.

h3. Reproducer

{code:yaml}
- route:
    from:
      uri: "timer:a"
      parameters: {repeatCount: 1}
      steps:
        - setHeader: {name: CamelExecCommandArgs, constant: "ARGS-WORK"}
        - to: "exec:echo"
        - log: "hdrAfter=[${header.CamelExecCommandArgs}]"
        - setBody: {simple: "${body.stdout}"}
        - convertBodyTo: {type: "java.lang.String"}
        - log: "OUT=[${body.trim()}]"
{code}

Run with {{camel run <file>.yaml --camel-version=4.22.0}}. Observed: 
{{hdrAfter=[ARGS-WORK]}} and {{OUT=[]}}. Expected per the documentation: 
{{OUT=[ARGS-WORK]}} and the header consumed.

Replacing the header with {{exec:echo?args=ARGS-WORK}} prints 
{{OUT=[ARGS-WORK]}}, which is the control showing the harness is sound.

h3. Impact

Either the behaviour or the documentation is wrong, and it matters which:

* If the headers are meant to work, this is a functional regression in 
{{camel-exec}} and the header-based interface is unusable.
* If URI-only is intended, the catalog metadata for all {{group: in}} 
{{CamelExecCommand*}} headers is misleading and should be corrected, since it 
is what downstream projects build against.

Concretely downstream: the {{exec-sink}} Kamelet in {{apache/camel-kamelets}} 
documents an {{args}} / {{ce-args}} input header and implements it by setting 
{{CamelExecCommandArgs}}. That interface therefore has no effect today. Filed 
there as apache/camel-kamelets#2980, which is blocked on the answer here.

h3. Notes

Reproduced on Camel 4.22.0 and on the 4.21.0-SNAPSHOT JBang CLI, on Linux.

----
_Reported via Claude Code on behalf of Andrea Cosentino_




--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to