You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@james.apache.org by rc...@apache.org on 2020/10/02 08:48:37 UTC

[james-project] 01/08: JAMES-3028 Apply default bucket name on top of S3 blobStore

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

rcordier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit c9d50e49a95cd39bc02bf18a84da48635b02ceba
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Thu Oct 1 13:27:52 2020 +0700

    JAMES-3028 Apply default bucket name on top of S3 blobStore
---
 .../CassandraRabbitMQAwsS3SmtpTestRuleFactory.java |  2 +
 .../mpt/smtp/CassandraSmtpTestRuleFactory.java     |  2 +
 .../objectstorage/DefaultBucketModule.java}        | 39 +++++-----
 .../modules/objectstorage/S3BlobStoreModule.java   |  7 --
 .../org/apache/james/CassandraJamesServerMain.java |  2 +
 .../CassandraBlobStoreDependenciesModule.java      |  7 --
 ...nciesModule.java => CassandraBucketModule.java} | 16 +----
 .../james/CassandraRabbitMQJamesServerMain.java    |  5 +-
 .../modules/blobstore/BlobStoreModulesChooser.java |  4 ++
 .../apache/james/NamespaceConfigurationTest.java   | 82 ++++++++++++++++++++++
 10 files changed, 114 insertions(+), 52 deletions(-)

diff --git a/mpt/impl/smtp/cassandra-rabbitmq-object-storage/src/test/java/org/apache/james/mpt/smtp/CassandraRabbitMQAwsS3SmtpTestRuleFactory.java b/mpt/impl/smtp/cassandra-rabbitmq-object-storage/src/test/java/org/apache/james/mpt/smtp/CassandraRabbitMQAwsS3SmtpTestRuleFactory.java
index df46507..ae2271e 100644
--- a/mpt/impl/smtp/cassandra-rabbitmq-object-storage/src/test/java/org/apache/james/mpt/smtp/CassandraRabbitMQAwsS3SmtpTestRuleFactory.java
+++ b/mpt/impl/smtp/cassandra-rabbitmq-object-storage/src/test/java/org/apache/james/mpt/smtp/CassandraRabbitMQAwsS3SmtpTestRuleFactory.java
@@ -32,6 +32,7 @@ import org.apache.james.blob.objectstorage.aws.S3BlobStoreDAO;
 import org.apache.james.dnsservice.api.DNSService;
 import org.apache.james.modules.TestRabbitMQModule;
 import org.apache.james.modules.mailbox.KeyspacesConfiguration;
+import org.apache.james.modules.objectstorage.DefaultBucketModule;
 import org.apache.james.modules.objectstorage.aws.s3.DockerAwsS3TestRule;
 import org.apache.james.modules.protocols.SmtpGuiceProbe.SmtpServerConnectedType;
 import org.apache.james.modules.rabbitmq.RabbitMQModule;
@@ -72,6 +73,7 @@ public final class CassandraRabbitMQAwsS3SmtpTestRuleFactory {
 
         return GuiceJamesServer.forConfiguration(configuration)
             .combineWith(CassandraJamesServerMain.CASSANDRA_SERVER_CORE_MODULE,
+                new DefaultBucketModule(),
                 SmtpTestRule.SMTP_PROTOCOL_MODULE,
                 binder -> binder.bind(MailQueueItemDecoratorFactory.class).to(RawMailQueueItemDecoratorFactory.class),
                 binder -> binder.bind(CamelMailetContainerModule.DefaultProcessorsConfigurationSupplier.class)
diff --git a/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/CassandraSmtpTestRuleFactory.java b/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/CassandraSmtpTestRuleFactory.java
index 97b73de..cddc8dd 100644
--- a/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/CassandraSmtpTestRuleFactory.java
+++ b/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/CassandraSmtpTestRuleFactory.java
@@ -25,6 +25,7 @@ import org.apache.james.backends.cassandra.DockerCassandra;
 import org.apache.james.backends.cassandra.init.configuration.ClusterConfiguration;
 import org.apache.james.dnsservice.api.DNSService;
 import org.apache.james.modules.mailbox.CassandraBlobStoreModule;
+import org.apache.james.modules.mailbox.CassandraBucketModule;
 import org.apache.james.modules.mailbox.KeyspacesConfiguration;
 import org.apache.james.modules.protocols.SmtpGuiceProbe.SmtpServerConnectedType;
 import org.apache.james.modules.server.CamelMailetContainerModule;
@@ -50,6 +51,7 @@ public final class CassandraSmtpTestRuleFactory {
         return GuiceJamesServer.forConfiguration(configuration)
             .combineWith(CassandraJamesServerMain.CASSANDRA_SERVER_CORE_MODULE,
                 new CassandraBlobStoreModule(),
+                new CassandraBucketModule(),
                 SmtpTestRule.SMTP_PROTOCOL_MODULE,
                 binder -> binder.bind(MailQueueItemDecoratorFactory.class).to(RawMailQueueItemDecoratorFactory.class),
                 binder -> binder.bind(CamelMailetContainerModule.DefaultProcessorsConfigurationSupplier.class)
diff --git a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraBlobStoreDependenciesModule.java b/server/container/guice/blob-s3-guice/src/main/java/org/apache/james/modules/objectstorage/DefaultBucketModule.java
similarity index 50%
copy from server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraBlobStoreDependenciesModule.java
copy to server/container/guice/blob-s3-guice/src/main/java/org/apache/james/modules/objectstorage/DefaultBucketModule.java
index d5570de..6996163 100644
--- a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraBlobStoreDependenciesModule.java
+++ b/server/container/guice/blob-s3-guice/src/main/java/org/apache/james/modules/objectstorage/DefaultBucketModule.java
@@ -17,33 +17,28 @@
  * under the License.                                           *
  ****************************************************************/
 
-package org.apache.james.modules.mailbox;
+package org.apache.james.modules.objectstorage;
+
+import javax.inject.Named;
+import javax.inject.Singleton;
 
-import org.apache.james.backends.cassandra.components.CassandraModule;
 import org.apache.james.blob.api.BucketName;
-import org.apache.james.blob.cassandra.CassandraBlobModule;
-import org.apache.james.blob.cassandra.CassandraBlobStoreDAO;
-import org.apache.james.blob.cassandra.CassandraBlobStoreFactory;
-import org.apache.james.blob.cassandra.CassandraDefaultBucketDAO;
-import org.apache.james.server.blob.deduplication.DeDuplicationBlobStore;
+import org.apache.james.blob.objectstorage.aws.S3BlobStoreConfiguration;
 
 import com.google.inject.AbstractModule;
-import com.google.inject.Scopes;
-import com.google.inject.multibindings.Multibinder;
-import com.google.inject.name.Names;
-
-public class CassandraBlobStoreDependenciesModule extends AbstractModule {
-    @Override
-    protected void configure() {
-        bind(CassandraDefaultBucketDAO.class).in(Scopes.SINGLETON);
-        bind(CassandraBlobStoreFactory.class).in(Scopes.SINGLETON);
-        bind(CassandraBlobStoreDAO.class).in(Scopes.SINGLETON);
+import com.google.inject.Provides;
 
-        bind(BucketName.class)
-            .annotatedWith(Names.named(DeDuplicationBlobStore.DEFAULT_BUCKET()))
-            .toInstance(BucketName.DEFAULT);
+public class DefaultBucketModule extends AbstractModule {
+    @Provides
+    @Singleton
+    private BucketName defaultBucket(S3BlobStoreConfiguration s3BlobStoreConfiguration) {
+        return s3BlobStoreConfiguration.getNamespace().orElse(BucketName.DEFAULT);
+    }
 
-        Multibinder<CassandraModule> cassandraDataDefinitions = Multibinder.newSetBinder(binder(), CassandraModule.class);
-        cassandraDataDefinitions.addBinding().toInstance(CassandraBlobModule.MODULE);
+    @Provides
+    @Named("defaultBucket")
+    @Singleton
+    private BucketName annotatedDefaultBucket(BucketName defaultBucket) {
+        return defaultBucket;
     }
 }
diff --git a/server/container/guice/blob-s3-guice/src/main/java/org/apache/james/modules/objectstorage/S3BlobStoreModule.java b/server/container/guice/blob-s3-guice/src/main/java/org/apache/james/modules/objectstorage/S3BlobStoreModule.java
index 02103be..ad70751 100644
--- a/server/container/guice/blob-s3-guice/src/main/java/org/apache/james/modules/objectstorage/S3BlobStoreModule.java
+++ b/server/container/guice/blob-s3-guice/src/main/java/org/apache/james/modules/objectstorage/S3BlobStoreModule.java
@@ -25,7 +25,6 @@ import javax.inject.Singleton;
 
 import org.apache.commons.configuration2.Configuration;
 import org.apache.commons.configuration2.ex.ConfigurationException;
-import org.apache.james.blob.api.BucketName;
 import org.apache.james.blob.objectstorage.aws.AwsS3AuthConfiguration;
 import org.apache.james.blob.objectstorage.aws.Region;
 import org.apache.james.blob.objectstorage.aws.S3BlobStoreConfiguration;
@@ -60,12 +59,6 @@ public class S3BlobStoreModule extends AbstractModule {
 
     @Provides
     @Singleton
-    private BucketName defaultBucket(S3BlobStoreConfiguration s3BlobStoreConfiguration) {
-        return s3BlobStoreConfiguration.getNamespace().orElse(BucketName.DEFAULT);
-    }
-
-    @Provides
-    @Singleton
     private Region region(S3BlobStoreConfiguration s3BlobStoreConfiguration) {
         return s3BlobStoreConfiguration.getRegion();
     }
diff --git a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/CassandraJamesServerMain.java b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/CassandraJamesServerMain.java
index 934538e..752c386 100644
--- a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/CassandraJamesServerMain.java
+++ b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/CassandraJamesServerMain.java
@@ -38,6 +38,7 @@ import org.apache.james.modules.eventstore.CassandraEventStoreModule;
 import org.apache.james.modules.mailbox.BlobStoreAPIModule;
 import org.apache.james.modules.mailbox.CassandraBlobStoreDependenciesModule;
 import org.apache.james.modules.mailbox.CassandraBlobStoreModule;
+import org.apache.james.modules.mailbox.CassandraBucketModule;
 import org.apache.james.modules.mailbox.CassandraDeletedMessageVaultModule;
 import org.apache.james.modules.mailbox.CassandraMailboxModule;
 import org.apache.james.modules.mailbox.CassandraQuotaMailingModule;
@@ -153,6 +154,7 @@ public class CassandraJamesServerMain implements JamesServerMain {
         new DKIMMailetModule());
 
     protected static Module ALL_BUT_JMX_CASSANDRA_MODULE = Modules.combine(
+        new CassandraBucketModule(),
         new CassandraBlobStoreModule(),
         REQUIRE_TASK_MANAGER_MODULE,
         new TaskManagerModule(),
diff --git a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraBlobStoreDependenciesModule.java b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraBlobStoreDependenciesModule.java
index d5570de..686be65 100644
--- a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraBlobStoreDependenciesModule.java
+++ b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraBlobStoreDependenciesModule.java
@@ -20,17 +20,14 @@
 package org.apache.james.modules.mailbox;
 
 import org.apache.james.backends.cassandra.components.CassandraModule;
-import org.apache.james.blob.api.BucketName;
 import org.apache.james.blob.cassandra.CassandraBlobModule;
 import org.apache.james.blob.cassandra.CassandraBlobStoreDAO;
 import org.apache.james.blob.cassandra.CassandraBlobStoreFactory;
 import org.apache.james.blob.cassandra.CassandraDefaultBucketDAO;
-import org.apache.james.server.blob.deduplication.DeDuplicationBlobStore;
 
 import com.google.inject.AbstractModule;
 import com.google.inject.Scopes;
 import com.google.inject.multibindings.Multibinder;
-import com.google.inject.name.Names;
 
 public class CassandraBlobStoreDependenciesModule extends AbstractModule {
     @Override
@@ -39,10 +36,6 @@ public class CassandraBlobStoreDependenciesModule extends AbstractModule {
         bind(CassandraBlobStoreFactory.class).in(Scopes.SINGLETON);
         bind(CassandraBlobStoreDAO.class).in(Scopes.SINGLETON);
 
-        bind(BucketName.class)
-            .annotatedWith(Names.named(DeDuplicationBlobStore.DEFAULT_BUCKET()))
-            .toInstance(BucketName.DEFAULT);
-
         Multibinder<CassandraModule> cassandraDataDefinitions = Multibinder.newSetBinder(binder(), CassandraModule.class);
         cassandraDataDefinitions.addBinding().toInstance(CassandraBlobModule.MODULE);
     }
diff --git a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraBlobStoreDependenciesModule.java b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraBucketModule.java
similarity index 64%
copy from server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraBlobStoreDependenciesModule.java
copy to server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraBucketModule.java
index d5570de..fd52218 100644
--- a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraBlobStoreDependenciesModule.java
+++ b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraBucketModule.java
@@ -19,31 +19,17 @@
 
 package org.apache.james.modules.mailbox;
 
-import org.apache.james.backends.cassandra.components.CassandraModule;
 import org.apache.james.blob.api.BucketName;
-import org.apache.james.blob.cassandra.CassandraBlobModule;
-import org.apache.james.blob.cassandra.CassandraBlobStoreDAO;
-import org.apache.james.blob.cassandra.CassandraBlobStoreFactory;
-import org.apache.james.blob.cassandra.CassandraDefaultBucketDAO;
 import org.apache.james.server.blob.deduplication.DeDuplicationBlobStore;
 
 import com.google.inject.AbstractModule;
-import com.google.inject.Scopes;
-import com.google.inject.multibindings.Multibinder;
 import com.google.inject.name.Names;
 
-public class CassandraBlobStoreDependenciesModule extends AbstractModule {
+public class CassandraBucketModule extends AbstractModule {
     @Override
     protected void configure() {
-        bind(CassandraDefaultBucketDAO.class).in(Scopes.SINGLETON);
-        bind(CassandraBlobStoreFactory.class).in(Scopes.SINGLETON);
-        bind(CassandraBlobStoreDAO.class).in(Scopes.SINGLETON);
-
         bind(BucketName.class)
             .annotatedWith(Names.named(DeDuplicationBlobStore.DEFAULT_BUCKET()))
             .toInstance(BucketName.DEFAULT);
-
-        Multibinder<CassandraModule> cassandraDataDefinitions = Multibinder.newSetBinder(binder(), CassandraModule.class);
-        cassandraDataDefinitions.addBinding().toInstance(CassandraBlobModule.MODULE);
     }
 }
diff --git a/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/CassandraRabbitMQJamesServerMain.java b/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/CassandraRabbitMQJamesServerMain.java
index 322acd3..2e1dde8 100644
--- a/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/CassandraRabbitMQJamesServerMain.java
+++ b/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/CassandraRabbitMQJamesServerMain.java
@@ -38,7 +38,10 @@ public class CassandraRabbitMQJamesServerMain implements JamesServerMain {
     protected static final Module MODULES =
         Modules
             .override(Modules.combine(REQUIRE_TASK_MANAGER_MODULE, new DistributedTaskManagerModule()))
-            .with(new RabbitMQModule(), new RabbitMailQueueRoutesModule(), new RabbitMQEventBusModule(), new DistributedTaskSerializationModule());
+            .with(new RabbitMQModule(),
+                new RabbitMailQueueRoutesModule(),
+                new RabbitMQEventBusModule(),
+                new DistributedTaskSerializationModule());
 
     public static void main(String[] args) throws Exception {
         CassandraRabbitMQJamesConfiguration configuration = CassandraRabbitMQJamesConfiguration.builder()
diff --git a/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/modules/blobstore/BlobStoreModulesChooser.java b/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/modules/blobstore/BlobStoreModulesChooser.java
index 0dfbdcd..dfa2292 100644
--- a/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/modules/blobstore/BlobStoreModulesChooser.java
+++ b/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/modules/blobstore/BlobStoreModulesChooser.java
@@ -33,6 +33,8 @@ import org.apache.james.lifecycle.api.StartUpCheck;
 import org.apache.james.modules.blobstore.validation.EventsourcingStorageStrategy;
 import org.apache.james.modules.blobstore.validation.StorageStrategyModule;
 import org.apache.james.modules.mailbox.CassandraBlobStoreDependenciesModule;
+import org.apache.james.modules.mailbox.CassandraBucketModule;
+import org.apache.james.modules.objectstorage.DefaultBucketModule;
 import org.apache.james.modules.objectstorage.S3BlobStoreModule;
 import org.apache.james.server.blob.deduplication.DeDuplicationBlobStore;
 import org.apache.james.server.blob.deduplication.PassThroughBlobStore;
@@ -52,6 +54,7 @@ public class BlobStoreModulesChooser {
         @Override
         protected void configure() {
             install(new CassandraBlobStoreDependenciesModule());
+            install(new CassandraBucketModule());
 
             bind(BlobStoreDAO.class).to(CassandraBlobStoreDAO.class);
         }
@@ -61,6 +64,7 @@ public class BlobStoreModulesChooser {
         @Override
         protected void configure() {
             install(new S3BlobStoreModule());
+            install(new DefaultBucketModule());
 
             bind(BlobStoreDAO.class).to(S3BlobStoreDAO.class);
         }
diff --git a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/NamespaceConfigurationTest.java b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/NamespaceConfigurationTest.java
new file mode 100644
index 0000000..bd933b8
--- /dev/null
+++ b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/NamespaceConfigurationTest.java
@@ -0,0 +1,82 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import javax.inject.Inject;
+
+import org.apache.james.blob.api.BlobStore;
+import org.apache.james.blob.api.BucketName;
+import org.apache.james.modules.AwsS3BlobStoreExtension;
+import org.apache.james.modules.RabbitMQExtension;
+import org.apache.james.modules.TestJMAPServerModule;
+import org.apache.james.modules.blobstore.BlobStoreConfiguration;
+import org.apache.james.utils.GuiceProbe;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.RegisterExtension;
+
+import com.google.inject.multibindings.Multibinder;
+
+class NamespaceConfigurationTest {
+    static class DefaultBucketProbe implements GuiceProbe {
+        private final BlobStore blobStore;
+
+        @Inject
+        DefaultBucketProbe(BlobStore blobStore) {
+            this.blobStore = blobStore;
+        }
+
+        public BucketName getDefaultBucket() {
+            return blobStore.getDefaultBucketName();
+        }
+    }
+
+    @RegisterExtension
+    static JamesServerExtension jamesServerExtension = new JamesServerBuilder<CassandraRabbitMQJamesConfiguration>(tmpDir ->
+        CassandraRabbitMQJamesConfiguration.builder()
+            .workingDirectory(tmpDir)
+            .configurationFromClasspath()
+            .blobStore(BlobStoreConfiguration.builder()
+                .s3()
+                .disableCache()
+                .deduplication())
+            .searchConfiguration(SearchConfiguration.elasticSearch())
+            .build())
+        .extension(new DockerElasticSearchExtension())
+        .extension(new CassandraExtension())
+        .extension(new RabbitMQExtension())
+        .server(configuration -> CassandraRabbitMQJamesServerMain.createServer(configuration)
+            .overrideWith(new TestJMAPServerModule())
+            .overrideWith(binder -> Multibinder.newSetBinder(binder, GuiceProbe.class)
+                .addBinding()
+                .to(DefaultBucketProbe.class)))
+        .extension(new AwsS3BlobStoreExtension())
+        .lifeCycle(JamesServerExtension.Lifecycle.PER_TEST)
+        .build();
+
+    @Test
+    void defaultBucketShouldBeTheConfiguredOne(GuiceJamesServer server) {
+        // AwsS3BlobStoreExtension relies on a randomly generated bucket for isolation purposes
+        assertThat(server.getProbe(DefaultBucketProbe.class)
+                .getDefaultBucket())
+            .isNotEqualTo(BucketName.DEFAULT);
+    }
+}
\ No newline at end of file


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@james.apache.org
For additional commands, e-mail: notifications-help@james.apache.org