You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2022/10/05 11:26:45 UTC

[camel] branch main updated: CAMEL-18583: [camel-minio] deleteObjects operation does not delete multiple objects (#8483)

This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git


The following commit(s) were added to refs/heads/main by this push:
     new b04bc67e4c6 CAMEL-18583: [camel-minio] deleteObjects operation does not delete multiple objects (#8483)
b04bc67e4c6 is described below

commit b04bc67e4c63ab845669f77cc13a9dee5f54fdbf
Author: Luigi De Masi <55...@users.noreply.github.com>
AuthorDate: Wed Oct 5 13:26:38 2022 +0200

    CAMEL-18583: [camel-minio] deleteObjects operation does not delete multiple objects (#8483)
---
 .../camel/component/minio/MinioProducer.java       |  2 +-
 .../camel/component/minio/MinioTestUtils.java      | 18 ++++++
 .../integration/MinioListObjectsOperationIT.java   | 64 ++++++++++++++++++++--
 3 files changed, 79 insertions(+), 5 deletions(-)

diff --git a/components/camel-minio/src/main/java/org/apache/camel/component/minio/MinioProducer.java b/components/camel-minio/src/main/java/org/apache/camel/component/minio/MinioProducer.java
index b2d11ac703a..9ccaa86571f 100644
--- a/components/camel-minio/src/main/java/org/apache/camel/component/minio/MinioProducer.java
+++ b/components/camel-minio/src/main/java/org/apache/camel/component/minio/MinioProducer.java
@@ -285,7 +285,7 @@ public class MinioProducer extends DefaultProducer {
         if (getConfiguration().isPojoRequest()) {
             RemoveObjectsArgs.Builder payload = exchange.getIn().getMandatoryBody(RemoveObjectsArgs.Builder.class);
             if (isNotEmpty(payload)) {
-                minioClient.removeObjects(payload.build());
+                minioClient.removeObjects(payload.build()).iterator().hasNext();
                 Message message = getMessageForResponse(exchange);
                 message.setBody(true);
             }
diff --git a/components/camel-minio/src/test/java/org/apache/camel/component/minio/MinioTestUtils.java b/components/camel-minio/src/test/java/org/apache/camel/component/minio/MinioTestUtils.java
index ea2153ece03..e3de6e4be10 100644
--- a/components/camel-minio/src/test/java/org/apache/camel/component/minio/MinioTestUtils.java
+++ b/components/camel-minio/src/test/java/org/apache/camel/component/minio/MinioTestUtils.java
@@ -18,9 +18,13 @@ package org.apache.camel.component.minio;
 
 import java.io.IOException;
 import java.io.InputStream;
+import java.util.ArrayList;
 import java.util.Objects;
 import java.util.Properties;
 
+import io.minio.ListObjectsArgs;
+import io.minio.MinioClient;
+
 public final class MinioTestUtils {
 
     private MinioTestUtils() {
@@ -37,4 +41,18 @@ public final class MinioTestUtils {
 
         return properties;
     }
+
+    /**
+     * Counts the objects stored in a bucket
+     *
+     * @param  client the MinioClient
+     * @param  bucket the bucket name
+     * @return        objects count of the specified bucket
+     */
+    public static int countObjectsInBucket(MinioClient client, String bucket) {
+        Iterable result = client.listObjects(ListObjectsArgs.builder().bucket(bucket).build());
+        ArrayList arrayList = new ArrayList<>();
+        result.forEach(arrayList::add);
+        return arrayList.size();
+    }
 }
diff --git a/components/camel-minio/src/test/java/org/apache/camel/component/minio/integration/MinioListObjectsOperationIT.java b/components/camel-minio/src/test/java/org/apache/camel/component/minio/integration/MinioListObjectsOperationIT.java
index 56f24aae29c..978fa5e6819 100644
--- a/components/camel-minio/src/test/java/org/apache/camel/component/minio/integration/MinioListObjectsOperationIT.java
+++ b/components/camel-minio/src/test/java/org/apache/camel/component/minio/integration/MinioListObjectsOperationIT.java
@@ -16,16 +16,23 @@
  */
 package org.apache.camel.component.minio.integration;
 
+import java.util.ArrayList;
 import java.util.Iterator;
+import java.util.List;
 
 import com.google.common.collect.Iterators;
+import io.minio.MakeBucketArgs;
 import io.minio.MinioClient;
+import io.minio.RemoveBucketArgs;
+import io.minio.RemoveObjectsArgs;
 import io.minio.Result;
+import io.minio.messages.DeleteObject;
 import io.minio.messages.Item;
 import org.apache.camel.BindToRegistry;
 import org.apache.camel.EndpointInject;
 import org.apache.camel.Exchange;
 import org.apache.camel.ExchangePattern;
+import org.apache.camel.Processor;
 import org.apache.camel.ProducerTemplate;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.minio.MinioConstants;
@@ -33,10 +40,14 @@ import org.apache.camel.component.minio.MinioOperations;
 import org.apache.camel.component.mock.MockEndpoint;
 import org.junit.jupiter.api.Test;
 
+import static org.apache.camel.component.minio.MinioTestUtils.countObjectsInBucket;
 import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.testcontainers.shaded.org.apache.commons.lang3.RandomStringUtils.randomAlphanumeric;
 
 class MinioListObjectsOperationIT extends MinioIntegrationTestSupport {
 
+    private static final String BUCKET_NAME = "mycamel2";
+
     @BindToRegistry("minioClient")
     MinioClient client = MinioClient.builder()
             .endpoint("http://" + service.host(), service.port(), false)
@@ -55,6 +66,10 @@ class MinioListObjectsOperationIT extends MinioIntegrationTestSupport {
     @SuppressWarnings("unchecked")
     @Test
     void sendIn() throws Exception {
+        client.removeBucket(RemoveBucketArgs.builder().bucket(BUCKET_NAME).build());
+
+        client.makeBucket(MakeBucketArgs.builder().bucket(BUCKET_NAME).build());
+
         result.expectedMessageCount(1);
 
         template.send("direct:listBuckets",
@@ -67,7 +82,7 @@ class MinioListObjectsOperationIT extends MinioIntegrationTestSupport {
         });
 
         Exchange exchange = template.request("direct:listObjects", exchange13 -> {
-            exchange13.getIn().setHeader(MinioConstants.BUCKET_NAME, "mycamel2");
+            exchange13.getIn().setHeader(MinioConstants.BUCKET_NAME, BUCKET_NAME);
             exchange13.getIn().setHeader(MinioConstants.MINIO_OPERATION, MinioOperations.listObjects);
         });
 
@@ -80,24 +95,63 @@ class MinioListObjectsOperationIT extends MinioIntegrationTestSupport {
 
         template.send("direct:deleteObject", ExchangePattern.InOnly, exchange12 -> {
             exchange12.getIn().setHeader(MinioConstants.OBJECT_NAME, "CamelUnitTest2");
-            exchange12.getIn().setHeader(MinioConstants.BUCKET_NAME, "mycamel2");
+            exchange12.getIn().setHeader(MinioConstants.BUCKET_NAME, BUCKET_NAME);
             exchange12.getIn().setHeader(MinioConstants.MINIO_OPERATION, MinioOperations.deleteObject);
         });
 
         template.send("direct:deleteBucket", exchange1 -> {
-            exchange1.getIn().setHeader(MinioConstants.BUCKET_NAME, "mycamel2");
+            exchange1.getIn().setHeader(MinioConstants.BUCKET_NAME, BUCKET_NAME);
             exchange1.getIn().setHeader(MinioConstants.MINIO_OPERATION, MinioOperations.deleteBucket);
         });
 
         MockEndpoint.assertIsSatisfied(context);
     }
 
+    @SuppressWarnings("unchecked")
+    @Test
+    void deleteObjectsTest() throws Exception {
+
+        client.removeBucket(RemoveBucketArgs.builder().bucket(BUCKET_NAME).build());
+
+        client.makeBucket(MakeBucketArgs.builder().bucket(BUCKET_NAME).build());
+
+        final List<DeleteObject> objects = new ArrayList<>(20);
+
+        // set up the environment
+        for (int i = 0; i < 20; i++) {
+            String currentDeleteObjectName = "CamelUnitTest-" + randomAlphanumeric(5);
+            objects.add(new DeleteObject(currentDeleteObjectName));
+            template.send("direct:addObject", ExchangePattern.InOnly, new Processor() {
+                @Override
+                public void process(Exchange exchange) throws Exception {
+                    exchange.getIn().setHeader(MinioConstants.BUCKET_NAME, BUCKET_NAME);
+                    exchange.getIn().setHeader(MinioConstants.OBJECT_NAME, currentDeleteObjectName);
+                    exchange.getIn().setBody("This is my bucket content.");
+                    exchange.getIn().removeHeader(MinioConstants.MINIO_OPERATION);
+                }
+            });
+        }
+
+        assertEquals(20, countObjectsInBucket(client, BUCKET_NAME));
+
+        // delete all objects of the bucket
+
+        template.send("direct:deleteObjects", exchange -> {
+            exchange.getIn().setHeader(MinioConstants.BUCKET_NAME, BUCKET_NAME);
+            exchange.getIn().setHeader(MinioConstants.MINIO_OPERATION, MinioOperations.deleteObjects);
+            exchange.getIn().setBody(RemoveObjectsArgs.builder().bucket(BUCKET_NAME).objects(objects));
+        });
+
+        assertEquals(0, countObjectsInBucket(client, BUCKET_NAME));
+    }
+
     @Override
     protected RouteBuilder createRouteBuilder() {
         return new RouteBuilder() {
             @Override
             public void configure() {
-                String minioEndpoint = "minio://mycamel2?autoCreateBucket=true";
+                String minioEndpoint = "minio://" + BUCKET_NAME + "?autoCreateBucket=true";
+                String minioEndpointPojoEnabled = minioEndpoint + "&pojoRequest=true";
 
                 from("direct:listBucket").to(minioEndpoint);
 
@@ -105,6 +159,8 @@ class MinioListObjectsOperationIT extends MinioIntegrationTestSupport {
 
                 from("direct:deleteObject").to(minioEndpoint);
 
+                from("direct:deleteObjects").to(minioEndpointPojoEnabled);
+
                 from("direct:listObjects").to(minioEndpoint);
 
                 from("direct:deleteBucket").to(minioEndpoint).to("mock:result");