Propagate FetchRefReplicatedEvent upon a Ref fetch
Bug: Issue 13893
Change-Id: I9e7b03b11a11fcd9c19d80dede17100a8c1f7534
diff --git a/src/main/java/com/googlesource/gerrit/plugins/replication/pull/FetchResultProcessing.java b/src/main/java/com/googlesource/gerrit/plugins/replication/pull/FetchResultProcessing.java
index cffc1f6..2d51239 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/replication/pull/FetchResultProcessing.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/replication/pull/FetchResultProcessing.java
@@ -18,6 +18,7 @@
import com.google.gerrit.server.events.EventDispatcher;
import com.google.gerrit.server.events.RefEvent;
import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.inject.Inject;
import java.lang.ref.WeakReference;
import java.util.concurrent.atomic.AtomicBoolean;
import org.eclipse.jgit.lib.RefUpdate;
@@ -69,11 +70,15 @@
}
public static class CommandProcessing extends FetchResultProcessing {
+ private static final FluentLogger logger = FluentLogger.forEnclosingClass();
private WeakReference<Command> sshCommand;
private AtomicBoolean hasError = new AtomicBoolean();
+ private final EventDispatcher dispatcher;
- public CommandProcessing(Command sshCommand) {
+ @Inject
+ public CommandProcessing(Command sshCommand, EventDispatcher dispatcher) {
this.sshCommand = new WeakReference<>(sshCommand);
+ this.dispatcher = dispatcher;
}
@Override
@@ -112,6 +117,14 @@
sb.append(")");
}
writeStdOut(sb.toString());
+ try {
+ dispatcher.postEvent(
+ new FetchRefReplicatedEvent(
+ project, ref, resolveNodeName(uri), status, refUpdateResult));
+ } catch (PermissionBackendException e) {
+ logger.atSevere().withCause(e).log(
+ "Cannot post event for ref '%s', project %s", ref, project);
+ }
}
@Override
diff --git a/src/main/java/com/googlesource/gerrit/plugins/replication/pull/StartFetchCommand.java b/src/main/java/com/googlesource/gerrit/plugins/replication/pull/StartFetchCommand.java
index a3497e6..6ababe9 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/replication/pull/StartFetchCommand.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/replication/pull/StartFetchCommand.java
@@ -15,6 +15,8 @@
package com.googlesource.gerrit.plugins.replication.pull;
import com.google.gerrit.extensions.annotations.RequiresCapability;
+import com.google.gerrit.extensions.registration.DynamicItem;
+import com.google.gerrit.server.events.EventDispatcher;
import com.google.gerrit.sshd.CommandMetaData;
import com.google.gerrit.sshd.SshCommand;
import com.google.inject.Inject;
@@ -54,6 +56,8 @@
@Inject private ReplicationState.Factory fetchReplicationStateFactory;
+ @Inject private DynamicItem<EventDispatcher> eventDispatcher;
+
@Override
protected void run() throws Failure {
if (all && projectPatterns.size() > 0) {
@@ -61,7 +65,8 @@
}
ReplicationState state =
- fetchReplicationStateFactory.create(new FetchResultProcessing.CommandProcessing(this));
+ fetchReplicationStateFactory.create(
+ new FetchResultProcessing.CommandProcessing(this, eventDispatcher.get()));
Future<?> future = null;
ReplicationFilter projectFilter;
diff --git a/src/main/java/com/googlesource/gerrit/plugins/replication/pull/api/FetchCommand.java b/src/main/java/com/googlesource/gerrit/plugins/replication/pull/api/FetchCommand.java
index 7470c2c..1088d9b 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/replication/pull/api/FetchCommand.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/replication/pull/api/FetchCommand.java
@@ -15,6 +15,8 @@
package com.googlesource.gerrit.plugins.replication.pull.api;
import com.google.gerrit.entities.Project;
+import com.google.gerrit.extensions.registration.DynamicItem;
+import com.google.gerrit.server.events.EventDispatcher;
import com.google.inject.Inject;
import com.googlesource.gerrit.plugins.replication.pull.Command;
import com.googlesource.gerrit.plugins.replication.pull.FetchResultProcessing;
@@ -34,22 +36,26 @@
private ReplicationState.Factory fetchReplicationStateFactory;
private PullReplicationStateLogger fetchStateLog;
private SourcesCollection sources;
+ private final DynamicItem<EventDispatcher> eventDispatcher;
@Inject
public FetchCommand(
ReplicationState.Factory fetchReplicationStateFactory,
PullReplicationStateLogger fetchStateLog,
- SourcesCollection sources) {
+ SourcesCollection sources,
+ DynamicItem<EventDispatcher> eventDispatcher) {
this.fetchReplicationStateFactory = fetchReplicationStateFactory;
this.fetchStateLog = fetchStateLog;
this.sources = sources;
+ this.eventDispatcher = eventDispatcher;
}
public void fetch(Project.NameKey name, String label, String refName)
throws InterruptedException, ExecutionException, RemoteConfigurationMissingException,
TimeoutException {
ReplicationState state =
- fetchReplicationStateFactory.create(new FetchResultProcessing.CommandProcessing(this));
+ fetchReplicationStateFactory.create(
+ new FetchResultProcessing.CommandProcessing(this, eventDispatcher.get()));
Optional<Source> source =
sources.getAll().stream().filter(s -> s.getRemoteConfigName().equals(label)).findFirst();
if (!source.isPresent()) {
diff --git a/src/test/java/com/googlesource/gerrit/plugins/replication/pull/FetchGitUpdateProcessingTest.java b/src/test/java/com/googlesource/gerrit/plugins/replication/pull/FetchGitUpdateProcessingTest.java
index f0f1c54..77dc947 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/replication/pull/FetchGitUpdateProcessingTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/replication/pull/FetchGitUpdateProcessingTest.java
@@ -21,6 +21,7 @@
import com.google.gerrit.server.events.EventDispatcher;
import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.googlesource.gerrit.plugins.replication.pull.FetchResultProcessing.CommandProcessing;
import com.googlesource.gerrit.plugins.replication.pull.FetchResultProcessing.GitUpdateProcessing;
import com.googlesource.gerrit.plugins.replication.pull.ReplicationState.RefFetchResult;
import java.net.URISyntaxException;
@@ -32,15 +33,20 @@
public class FetchGitUpdateProcessingTest {
private EventDispatcher dispatcherMock;
private GitUpdateProcessing gitUpdateProcessing;
+ private CommandProcessing commandProcessing;
+ private Command sshCommandMock;
@Before
public void setUp() throws Exception {
dispatcherMock = mock(EventDispatcher.class);
gitUpdateProcessing = new GitUpdateProcessing(dispatcherMock);
+ sshCommandMock = mock(Command.class);
+ commandProcessing = new CommandProcessing(sshCommandMock, dispatcherMock);
}
@Test
- public void headRefReplicated() throws URISyntaxException, PermissionBackendException {
+ public void headRefReplicatedInGitUpdateProcessing()
+ throws URISyntaxException, PermissionBackendException {
FetchRefReplicatedEvent expectedEvent =
new FetchRefReplicatedEvent(
"someProject",
@@ -59,6 +65,26 @@
}
@Test
+ public void headRefReplicatedInCommandProcessing()
+ throws URISyntaxException, PermissionBackendException {
+ FetchRefReplicatedEvent expectedEvent =
+ new FetchRefReplicatedEvent(
+ "someProject",
+ "refs/heads/master",
+ "someHost",
+ RefFetchResult.SUCCEEDED,
+ RefUpdate.Result.NEW);
+
+ commandProcessing.onOneProjectReplicationDone(
+ "someProject",
+ "refs/heads/master",
+ new URIish("git://someHost/someProject.git"),
+ RefFetchResult.SUCCEEDED,
+ RefUpdate.Result.NEW);
+ verify(dispatcherMock, times(1)).postEvent(eq(expectedEvent));
+ }
+
+ @Test
public void changeRefReplicated() throws URISyntaxException, PermissionBackendException {
FetchRefReplicatedEvent expectedEvent =
new FetchRefReplicatedEvent(
diff --git a/src/test/java/com/googlesource/gerrit/plugins/replication/pull/api/FetchCommandTest.java b/src/test/java/com/googlesource/gerrit/plugins/replication/pull/api/FetchCommandTest.java
index e625e0f..4cdad48 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/replication/pull/api/FetchCommandTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/replication/pull/api/FetchCommandTest.java
@@ -25,6 +25,8 @@
import com.google.common.collect.Lists;
import com.google.gerrit.entities.Project;
+import com.google.gerrit.extensions.registration.DynamicItem;
+import com.google.gerrit.server.events.EventDispatcher;
import com.googlesource.gerrit.plugins.replication.pull.PullReplicationStateLogger;
import com.googlesource.gerrit.plugins.replication.pull.ReplicationState;
import com.googlesource.gerrit.plugins.replication.pull.Source;
@@ -51,6 +53,7 @@
@Mock PullReplicationStateLogger fetchStateLog;
@Mock Source source;
@Mock SourcesCollection sources;
+ @Mock DynamicItem<EventDispatcher> eventDispatcher;
@SuppressWarnings("rawtypes")
@Mock
@@ -73,7 +76,8 @@
when(sources.getAll()).thenReturn(Lists.newArrayList(source));
when(source.schedule(projectName, REF_NAME_TO_FETCH, state, true))
.thenReturn(CompletableFuture.completedFuture(null));
- objectUnderTest = new FetchCommand(fetchReplicationStateFactory, fetchStateLog, sources);
+ objectUnderTest =
+ new FetchCommand(fetchReplicationStateFactory, fetchStateLog, sources, eventDispatcher);
}
@Test