Extend JGitHealthcheck to check for multiple repos
Gerrit health might be dependent on multiple repositories, (for example
All-Projects and All-Users).
This change extends the existing JGit healthcheck logic to check against
a list of repositories configured in the healthcheck.config file.
Defaults to: All-Projects and All-Users
Change-Id: I29900c12a584191491bbcae95c9fb67892745520
diff --git a/src/main/java/com/googlesource/gerrit/plugins/healthcheck/HealthCheckConfig.java b/src/main/java/com/googlesource/gerrit/plugins/healthcheck/HealthCheckConfig.java
index 6c93e91..98df366 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/healthcheck/HealthCheckConfig.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/healthcheck/HealthCheckConfig.java
@@ -18,10 +18,16 @@
import com.google.common.base.MoreObjects;
import com.google.common.base.Strings;
import com.google.gerrit.extensions.annotations.PluginName;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.config.AllProjectsName;
+import com.google.gerrit.server.config.AllUsersName;
import com.google.gerrit.server.config.PluginConfigFactory;
import com.google.inject.Inject;
import com.google.inject.Singleton;
+import java.util.Set;
import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
import org.eclipse.jgit.errors.ConfigInvalidException;
import org.eclipse.jgit.lib.Config;
@@ -32,12 +38,20 @@
private static final long HEALTHCHECK_TIMEOUT_DEFAULT = 500L;
private static final String QUERY_DEFAULT = "status:open";
private static final int LIMIT_DEFAULT = 10;
+ private final AllProjectsName allProjectsName;
+ private final AllUsersName allUsersName;
private final Config config;
@Inject
- public HealthCheckConfig(PluginConfigFactory configFactory, @PluginName String pluginName) {
+ public HealthCheckConfig(
+ PluginConfigFactory configFactory,
+ @PluginName String pluginName,
+ AllProjectsName allProjectsName,
+ AllUsersName allUsersName) {
config = configFactory.getGlobalPluginConfig(pluginName);
+ this.allProjectsName = allProjectsName;
+ this.allUsersName = allUsersName;
}
@VisibleForTesting
@@ -50,6 +64,8 @@
throw new IllegalArgumentException("Invalid configuration " + configText, e);
}
}
+ allProjectsName = new AllProjectsName("All-Projects");
+ allUsersName = new AllUsersName("All-Users");
}
public long getTimeout() {
@@ -72,4 +88,14 @@
int defaultLimit = healthCheckName == null ? LIMIT_DEFAULT : getLimit(null);
return config.getInt(HEALTHCHECK, healthCheckName, "limit", defaultLimit);
}
+
+ public Set<Project.NameKey> getJGITRepositories(String healthCheckName) {
+ Set<Project.NameKey> repos =
+ Stream.of(config.getStringList(HEALTHCHECK, healthCheckName, "project"))
+ .map(Project.NameKey::new)
+ .collect(Collectors.toSet());
+ repos.add(allProjectsName);
+ repos.add(allUsersName);
+ return repos;
+ }
}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/healthcheck/check/JGitHealthCheck.java b/src/main/java/com/googlesource/gerrit/plugins/healthcheck/check/JGitHealthCheck.java
index 73fa88d..fe59bbb 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/healthcheck/check/JGitHealthCheck.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/healthcheck/check/JGitHealthCheck.java
@@ -17,37 +17,37 @@
import static com.googlesource.gerrit.plugins.healthcheck.check.HealthCheckNames.JGIT;
import com.google.common.util.concurrent.ListeningExecutorService;
-import com.google.gerrit.server.config.AllProjectsName;
+import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.server.git.GitRepositoryManager;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import com.googlesource.gerrit.plugins.healthcheck.HealthCheckConfig;
-import org.eclipse.jgit.lib.ObjectId;
+import java.util.Set;
import org.eclipse.jgit.lib.Repository;
@Singleton
public class JGitHealthCheck extends AbstractHealthCheck {
private final GitRepositoryManager repositoryManager;
- private final AllProjectsName allProjectsName;
+ private final Set<Project.NameKey> repositoryNameKeys;
@Inject
public JGitHealthCheck(
ListeningExecutorService executor,
HealthCheckConfig config,
- GitRepositoryManager repositoryManager,
- AllProjectsName allProjectsName) {
+ GitRepositoryManager repositoryManager) {
super(executor, config, JGIT);
this.repositoryManager = repositoryManager;
- this.allProjectsName = allProjectsName;
+ this.repositoryNameKeys = config.getJGITRepositories(JGIT);
}
@Override
protected Result doCheck() throws Exception {
- try (Repository allProjects = repositoryManager.openRepository(allProjectsName)) {
- ObjectId headObj = allProjects.resolve("refs/meta/config");
- allProjects.open(headObj).getType();
- return Result.PASSED;
+ for (Project.NameKey repoNameKey : repositoryNameKeys) {
+ try (Repository repo = repositoryManager.openRepository(repoNameKey)) {
+ repo.open(repo.resolve("refs/meta/config")).getType();
+ }
}
+ return Result.PASSED;
}
}
diff --git a/src/main/resources/Documentation/config.md b/src/main/resources/Documentation/config.md
index 74ad62c..c064bc3 100644
--- a/src/main/resources/Documentation/config.md
+++ b/src/main/resources/Documentation/config.md
@@ -63,4 +63,10 @@
- `healthcheck.<checkName>.limit` : Maximum number of elements to retrieve from
the the check results.
- Default: 10
\ No newline at end of file
+ Default: 10
+
+- `healthcheck.jgit.project` : A project name to check for accessibility of its refs/meta/config.
+ Multiple occurrences are allowed to configure more projects, in addition
+ to the default ones that are always included.
+
+ Default: All-Projects, All-Users
\ No newline at end of file
diff --git a/src/test/java/com/googlesource/gerrit/plugins/healthcheck/JGitHealthCheckTest.java b/src/test/java/com/googlesource/gerrit/plugins/healthcheck/JGitHealthCheckTest.java
index b44ca9a..f41d33f 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/healthcheck/JGitHealthCheckTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/healthcheck/JGitHealthCheckTest.java
@@ -16,11 +16,13 @@
import static com.google.common.truth.Truth.assertThat;
import static com.googlesource.gerrit.plugins.healthcheck.HealthCheckConfig.DEFAULT_CONFIG;
+import static com.googlesource.gerrit.plugins.healthcheck.check.HealthCheckNames.JGIT;
import static org.eclipse.jgit.lib.RefUpdate.Result.NEW;
import com.google.common.util.concurrent.ListeningExecutorService;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.server.config.AllProjectsName;
+import com.google.gerrit.server.config.AllUsersName;
import com.google.gerrit.server.git.GitRepositoryManager;
import com.google.gerrit.server.git.RepositoryCaseMismatchException;
import com.google.gerrit.testutil.InMemoryRepositoryManager;
@@ -44,6 +46,7 @@
public class JGitHealthCheckTest {
private AllProjectsName allProjectsName = new AllProjectsName("All-Projects");
+ private AllUsersName allUsersName = new AllUsersName("All-Users");
private InMemoryRepositoryManager inMemoryRepositoryManager = new InMemoryRepositoryManager();
private PersonIdent personIdent = new PersonIdent("Gerrit Rietveld", "gerrit@rietveld.nl");
@@ -53,24 +56,40 @@
public void setupAllProjects() throws Exception {
Guice.createInjector(new HealthCheckModule()).injectMembers(this);
- InMemoryRepositoryManager.Repo repo =
+ InMemoryRepositoryManager.Repo allProjects =
inMemoryRepositoryManager.createRepository(allProjectsName);
- createCommit(repo, "refs/meta/config");
+ createCommit(allProjects, "refs/meta/config");
+
+ InMemoryRepositoryManager.Repo allUsers =
+ inMemoryRepositoryManager.createRepository(allUsersName);
+ createCommit(allUsers, "refs/meta/config");
}
@Test
public void shouldBeHealthyWhenJGitIsWorking() {
JGitHealthCheck reviewDbCheck =
- new JGitHealthCheck(
- executor, DEFAULT_CONFIG, getWorkingRepositoryManager(), allProjectsName);
+ new JGitHealthCheck(executor, DEFAULT_CONFIG, getWorkingRepositoryManager());
assertThat(reviewDbCheck.run().result).isEqualTo(Result.PASSED);
}
@Test
- public void shouldBeUnhealthyWhenJGitIsFailing() {
+ public void shouldBeUnhealthyWhenJGitIsFailingForAllRepos() {
JGitHealthCheck jGitHealthCheck =
- new JGitHealthCheck(
- executor, DEFAULT_CONFIG, getFailingGitRepositoryManager(), allProjectsName);
+ new JGitHealthCheck(executor, DEFAULT_CONFIG, getFailingGitRepositoryManager());
+ assertThat(jGitHealthCheck.run().result).isEqualTo(Result.FAILED);
+ }
+
+ @Test
+ public void shouldBeUnhealthyWhenJGitIsFailingSomeRepos() {
+ HealthCheckConfig config =
+ new HealthCheckConfig(
+ "[healthcheck \""
+ + JGIT
+ + "\"]\n"
+ + " project = All-Users\n"
+ + " project = Not-Existing-Repo");
+ JGitHealthCheck jGitHealthCheck =
+ new JGitHealthCheck(executor, config, getWorkingRepositoryManager());
assertThat(jGitHealthCheck.run().result).isEqualTo(Result.FAILED);
}
@@ -80,7 +99,7 @@
@Override
public Repository openRepository(Project.NameKey name)
throws RepositoryNotFoundException, IOException {
- throw new RepositoryNotFoundException("Can't fine repository " + name);
+ throw new RepositoryNotFoundException("Can't find repository " + name);
}
@Override