Merge branch 'stable-2.16' * stable-2.16: Replace DestinationFactory with Guice generated Factory and assisted injection Revert "DestinationFactory: remove @Singleton annotation" DestinationFactory: remove @Singleton annotation Updated docs to clarify that SSH config is not optional Introduce DynamicSet of ReplicationStateListener Remove unneeded RemoteSiteUser.Factory Make SecureCredentialsProvider public for reuse Change-Id: I52bc2580bef89d40f9b02749550cdbbd6e7a26dc
diff --git a/src/main/java/com/googlesource/gerrit/plugins/replication/Destination.java b/src/main/java/com/googlesource/gerrit/plugins/replication/Destination.java index 46484d0..56a341e 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/replication/Destination.java +++ b/src/main/java/com/googlesource/gerrit/plugins/replication/Destination.java
@@ -123,14 +123,13 @@ @Inject protected Destination( Injector injector, - RemoteSiteUser.Factory replicationUserFactory, PluginUser pluginUser, GitRepositoryManager gitRepositoryManager, PermissionBackend permissionBackend, Provider<CurrentUser> userProvider, ProjectCache projectCache, GroupBackend groupBackend, - ReplicationStateListener stateLog, + ReplicationStateListeners stateLog, GroupIncludeCache groupIncludeCache, DynamicItem<EventDispatcher> eventDispatcher, @Assisted DestinationConfiguration cfg) { @@ -153,7 +152,7 @@ repLog.warn("Group \"{}\" not recognized, removing from authGroup", name); } } - remoteUser = replicationUserFactory.create(new ListGroupMembership(builder.build())); + remoteUser = new RemoteSiteUser(new ListGroupMembership(builder.build())); } else { remoteUser = pluginUser; }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/replication/PushAll.java b/src/main/java/com/googlesource/gerrit/plugins/replication/PushAll.java index db067e2..833b02b 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/replication/PushAll.java +++ b/src/main/java/com/googlesource/gerrit/plugins/replication/PushAll.java
@@ -43,7 +43,7 @@ WorkQueue wq, ProjectCache projectCache, ReplicationQueue rq, - ReplicationStateListener stateLog, + ReplicationStateListeners stateLog, @Assisted @Nullable String urlMatch, @Assisted ReplicationFilter filter, @Assisted ReplicationState state,
diff --git a/src/main/java/com/googlesource/gerrit/plugins/replication/PushOne.java b/src/main/java/com/googlesource/gerrit/plugins/replication/PushOne.java index d73947c..9c1de54 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/replication/PushOne.java +++ b/src/main/java/com/googlesource/gerrit/plugins/replication/PushOne.java
@@ -125,7 +125,7 @@ CredentialsFactory cpFactory, PerThreadRequestScope.Scoper ts, IdGenerator ig, - ReplicationStateListener sl, + ReplicationStateListeners sl, ReplicationMetrics m, ProjectCache pc, CreateProjectTask.Factory cpf,
diff --git a/src/main/java/com/googlesource/gerrit/plugins/replication/RemoteSiteUser.java b/src/main/java/com/googlesource/gerrit/plugins/replication/RemoteSiteUser.java index 31d10b6..c3556af 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/replication/RemoteSiteUser.java +++ b/src/main/java/com/googlesource/gerrit/plugins/replication/RemoteSiteUser.java
@@ -16,18 +16,11 @@ import com.google.gerrit.server.CurrentUser; import com.google.gerrit.server.account.GroupMembership; -import com.google.inject.Inject; -import com.google.inject.assistedinject.Assisted; public class RemoteSiteUser extends CurrentUser { - public interface Factory { - RemoteSiteUser create(@Assisted GroupMembership authGroups); - } - private final GroupMembership effectiveGroups; - @Inject - RemoteSiteUser(@Assisted GroupMembership authGroups) { + public RemoteSiteUser(GroupMembership authGroups) { effectiveGroups = authGroups; }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationModule.java b/src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationModule.java index b0a0e75..9b7e8e6 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationModule.java +++ b/src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationModule.java
@@ -56,11 +56,11 @@ .to(StartReplicationCapability.class); install(new FactoryModuleBuilder().build(PushAll.Factory.class)); - install(new FactoryModuleBuilder().build(RemoteSiteUser.Factory.class)); install(new FactoryModuleBuilder().build(ReplicationState.Factory.class)); bind(ReplicationConfig.class).to(AutoReloadConfigDecorator.class); - bind(ReplicationStateListener.class).to(ReplicationStateLogger.class); + DynamicSet.setOf(binder(), ReplicationStateListener.class); + DynamicSet.bind(binder(), ReplicationStateListener.class).to(ReplicationStateLogger.class); EventTypes.register(RefReplicatedEvent.TYPE, RefReplicatedEvent.class); EventTypes.register(RefReplicationDoneEvent.TYPE, RefReplicationDoneEvent.class);
diff --git a/src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationQueue.java b/src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationQueue.java index 8b4b980..d2a34be 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationQueue.java +++ b/src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationQueue.java
@@ -53,7 +53,7 @@ WorkQueue wq, ReplicationConfig rc, DynamicItem<EventDispatcher> dis, - ReplicationStateListener sl, + ReplicationStateListeners sl, ReplicationState.Factory rsf, EventsStorage es) { workQueue = wq;
diff --git a/src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationStateListeners.java b/src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationStateListeners.java new file mode 100644 index 0000000..d7bf227 --- /dev/null +++ b/src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationStateListeners.java
@@ -0,0 +1,48 @@ +// Copyright (C) 2019 The Android Open Source Project +// +// Licensed 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 com.googlesource.gerrit.plugins.replication; + +import com.google.gerrit.extensions.registration.DynamicSet; +import com.google.inject.Inject; + +public class ReplicationStateListeners implements ReplicationStateListener { + private final DynamicSet<ReplicationStateListener> listeners; + + @Inject + ReplicationStateListeners(DynamicSet<ReplicationStateListener> stateListeners) { + this.listeners = stateListeners; + } + + @Override + public void warn(String msg, ReplicationState... states) { + for (ReplicationStateListener listener : listeners) { + listener.warn(msg, states); + } + } + + @Override + public void error(String msg, ReplicationState... states) { + for (ReplicationStateListener listener : listeners) { + listener.error(msg, states); + } + } + + @Override + public void error(String msg, Throwable t, ReplicationState... states) { + for (ReplicationStateListener listener : listeners) { + listener.error(msg, t, states); + } + } +}
diff --git a/src/main/resources/Documentation/config.md b/src/main/resources/Documentation/config.md index 135d866..6493761 100644 --- a/src/main/resources/Documentation/config.md +++ b/src/main/resources/Documentation/config.md
@@ -13,6 +13,11 @@ sudo su -c 'ssh mirror1.us.some.org echo' gerrit2 ``` +*NOTE:* make sure the local user's ssh keys format is PEM, here how to generate them: +``` + ssh-keygen -m PEM -t rsa -C "your_email@example.com" +``` + <a name="example_file"> Next, create `$site_path/etc/replication.config` as a Git-style config file, for example to replicate in parallel to four different hosts:</a> @@ -310,7 +315,7 @@ If the remote site was not available at the moment when a new project was created, it will be created if during the replication of a ref it is found to be missing. - + If false, repositories are never created automatically on this remote. @@ -410,7 +415,7 @@ File `~/.ssh/config` -------------------- -If present, Gerrit reads and caches `~/.ssh/config` at startup, and +Gerrit reads and caches the `~/.ssh/config` at startup, and supports most SSH configuration options. For example: ``` @@ -424,6 +429,15 @@ PreferredAuthentications publickey ``` +*IdentityFile* and *PreferredAuthentications* must be defined for all the hosts. +Here an example of the minimum `~/.ssh/config` needed: + +``` + Host * + IdentityFile ~/.ssh/id_rsa + PreferredAuthentications publickey +``` + Supported options: * Host