[ 
https://issues.apache.org/jira/browse/CAMEL-25898?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Work on CAMEL-25898 started by shashank.
----------------------------------------
> camel-ibm-cos - the producer stores a consumed object back in the bucket it 
> was consumed from, so a route from one bucket to another loses the object
> -----------------------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: CAMEL-25898
>                 URL: https://issues.apache.org/jira/browse/CAMEL-25898
>             Project: Camel
>          Issue Type: Bug
>            Reporter: shashank
>            Assignee: shashank
>            Priority: Major
>
> {{IBMCOSProducer.determineBucketName}} (main 74ee085f7d64, line 357) takes 
> the bucket of every producer operation from the {{CamelIBMCOSBucketName}} 
> header, and only falls back to the bucket of the endpoint when the header is 
> not set:
> {code:java}
> private String determineBucketName(Exchange exchange) {
>     String bucketName = 
> exchange.getIn().getHeader(IBMCOSConstants.BUCKET_NAME, String.class);
>     if (bucketName == null) {
>         bucketName = getConfiguration().getBucketName();
>     }
>     return bucketName;
> }
> {code}
> {{IBMCOSConsumer}} (line 223) sets the same header on every object it 
> consumes, to the bucket the object was consumed from. So a route that moves 
> objects from one bucket to another:
> {code:java}
> from("ibm-cos://source?cosClient=#cos")
>     .to("ibm-cos://target?cosClient=#cos");
> {code}
> puts every object back into {{source}}, under the same key (the producer also 
> takes the key from the {{CamelIBMCOSKey}} header the consumer set), and 
> nothing reaches {{target}}. With the default {{deleteAfterRead=true}} the 
> consumer then deletes the object from {{source}} when the exchange completes: 
> the object is in neither bucket, and the exchange completed without an error. 
> With {{deleteAfterRead=false}} each object is rewritten in place and the 
> target bucket stays empty. The same applies to every other producer operation 
> that follows such a consumer ({{copyObject}} source bucket, {{getObject}}, 
> {{deleteObject}}, ...).
> camel-aws2-s3, camel-minio and camel-google-storage had the same problem and 
> fixed it in 4.10 (CAMEL-21680, CAMEL-21678, CAMEL-21682): the producer reads 
> a separate {{...OverrideBucketName}} header, and the bucket header the 
> consumer sets is no longer used by the producer. camel-ibm-cos was added 
> after that (CAMEL-22598) with the earlier pattern. CAMEL-25888 (open) 
> proposes the same split for camel-pubnub ({{CamelPubNubOverrideChannel}}).
> *Fix*: the same as in camel-aws2-s3: a new producer header 
> {{CamelIBMCOSOverrideBucketName}} ({{IBMCOSConstants.OVERRIDE_BUCKET_NAME}}) 
> selects another bucket than the one of the endpoint; 
> {{CamelIBMCOSBucketName}} is documented as a consumer header and no longer 
> read by the producer. The {{createBucket}} example of the component page, the 
> integration test that creates and deletes a bucket, and the generated 
> metadata (component and catalog JSON, endpoint DSL header names) use the new 
> header. Upgrade note in the 4.24 guide, marked as a breaking change: a route 
> that sets {{CamelIBMCOSBucketName}} to choose the bucket of a producer 
> operation must set {{CamelIBMCOSOverrideBucketName}} instead (code that uses 
> the Java constant has to switch to the new constant).
> *Tests*: new {{IBMCOSProducerBucketHeaderTest}} (2 tests). 
> {{consumedObjectIsStoredInTheBucketOfTheProducerEndpoint}}: the real consumer 
> reads {{a.txt}} from bucket {{source}} of the module's in-process fake S3 
> server, the producer endpoint {{ibm-cos://target}} uses a recording client; 
> on main it fails with {{expected: <[target/a.txt]> but was: 
> <[source/a.txt]>}}. {{overrideBucketNameHeaderSelectsTheBucket}}: without a 
> header the endpoint bucket is used, with the override header the named one; 
> on main {{expected: <[target/b.txt, other/c.txt]> but was: <[target/b.txt, 
> target/c.txt]>}}. camel-ibm-cos unit tests: 8 run, 0 failures.
> *How it was found*: a sweep of the producers for headers that their own 
> component's consumer sets and the producer reads as a destination (bucket, 
> topic, queue, channel), after the CAMEL-21680 family. The JUnit tests above 
> are the evidence; nothing was run against IBM Cloud Object Storage.
> *Affected*: main, camel-4.23.x, camel-4.22.x and camel-4.18.x (the same 
> {{determineBucketName}} and the same header set by the consumer; read, not 
> run).
> _Filed with Claude Code on behalf of allthingssecurity._



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

Reply via email to