mirror of
				https://github.com/scm-manager/scm-manager.git
				synced 2025-10-31 10:35:56 +01:00 
			
		
		
		
	Enable Health Checks (#1621)
In the release of version 2.0.0 of SCM-Manager, the health checks had been neglected. This makes them visible again in the frontend and adds the ability to trigger them. In addition there are two types of health checks: The "normal" ones, now called "light checks", that are run on startup, and more intense checks run only on request. As a change to version 1.x, health checks will no longer be persisted for repositories. Co-authored-by: Eduard Heimbuch <eduard.heimbuch@cloudogu.com>
This commit is contained in:
		| @@ -0,0 +1,57 @@ | ||||
| /* | ||||
|  * MIT License | ||||
|  * | ||||
|  * Copyright (c) 2020-present Cloudogu GmbH and Contributors | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in all | ||||
|  * copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
|  * SOFTWARE. | ||||
|  */ | ||||
|  | ||||
| package sonia.scm.repository.spi; | ||||
|  | ||||
| import org.slf4j.Logger; | ||||
| import org.slf4j.LoggerFactory; | ||||
| import org.tmatesoft.svn.core.SVNException; | ||||
| import org.tmatesoft.svn.core.wc.SVNClientManager; | ||||
| import org.tmatesoft.svn.core.wc.admin.SVNAdminClient; | ||||
| import sonia.scm.repository.HealthCheckFailure; | ||||
| import sonia.scm.repository.HealthCheckResult; | ||||
|  | ||||
| public class SvnFullHealthCheckCommand extends AbstractSvnCommand implements FullHealthCheckCommand{ | ||||
|  | ||||
|   private static final Logger LOG = LoggerFactory.getLogger(SvnFullHealthCheckCommand.class); | ||||
|  | ||||
|   protected SvnFullHealthCheckCommand(SvnContext context) { | ||||
|     super(context); | ||||
|   } | ||||
|  | ||||
|   @Override | ||||
|   public HealthCheckResult check() { | ||||
|     SVNClientManager clientManager= SVNClientManager.newInstance(); | ||||
|     SVNAdminClient adminClient = clientManager.getAdminClient(); | ||||
|     try { | ||||
|       adminClient.doVerify(context.getDirectory()); | ||||
|     } catch (SVNException e) { | ||||
|       LOG.warn("svn verify failed for repository {}", context.get(), e); | ||||
|       return HealthCheckResult.unhealthy(new HealthCheckFailure("5FSV2kreE1", | ||||
|         "svn verify failed", "The check 'svn verify' failed for the repository.")); | ||||
|     } | ||||
|  | ||||
|     return HealthCheckResult.healthy(); | ||||
|   } | ||||
| } | ||||
| @@ -42,8 +42,16 @@ public class SvnRepositoryServiceProvider extends RepositoryServiceProvider { | ||||
|  | ||||
|   //J- | ||||
|   public static final Set<Command> COMMANDS = ImmutableSet.of( | ||||
|     Command.BLAME, Command.BROWSE, Command.CAT, Command.DIFF, | ||||
|     Command.LOG, Command.BUNDLE, Command.UNBUNDLE, Command.MODIFY, Command.LOOKUP | ||||
|     Command.BLAME, | ||||
|     Command.BROWSE, | ||||
|     Command.CAT, | ||||
|     Command.DIFF, | ||||
|     Command.LOG, | ||||
|     Command.BUNDLE, | ||||
|     Command.UNBUNDLE, | ||||
|     Command.MODIFY, | ||||
|     Command.LOOKUP, | ||||
|     Command.FULL_HEALTH_CHECK | ||||
|   ); | ||||
|   //J+ | ||||
|  | ||||
| @@ -120,4 +128,9 @@ public class SvnRepositoryServiceProvider extends RepositoryServiceProvider { | ||||
|   public UnbundleCommand getUnbundleCommand() { | ||||
|     return new SvnUnbundleCommand(context, hookContextFactory, new SvnLogCommand(context)); | ||||
|   } | ||||
|  | ||||
|   @Override | ||||
|   public FullHealthCheckCommand getFullHealthCheckCommand() { | ||||
|     return new SvnFullHealthCheckCommand(context); | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -0,0 +1,52 @@ | ||||
| /* | ||||
|  * MIT License | ||||
|  * | ||||
|  * Copyright (c) 2020-present Cloudogu GmbH and Contributors | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in all | ||||
|  * copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
|  * SOFTWARE. | ||||
|  */ | ||||
|  | ||||
| package sonia.scm.repository.spi; | ||||
|  | ||||
| import org.junit.Test; | ||||
| import sonia.scm.repository.HealthCheckResult; | ||||
|  | ||||
| import java.io.File; | ||||
|  | ||||
| import static org.assertj.core.api.Assertions.assertThat; | ||||
|  | ||||
| public class SvnFullHealthCheckCommandTest extends AbstractSvnCommandTestBase { | ||||
|  | ||||
|   @Test | ||||
|   public void shouldBeOkForValidRepository() { | ||||
|     HealthCheckResult check = new SvnFullHealthCheckCommand(createContext()).check(); | ||||
|  | ||||
|     assertThat(check.isHealthy()).isTrue(); | ||||
|   } | ||||
|  | ||||
|   @Test | ||||
|   public void shouldDetectMissingFile() { | ||||
|     File revision4 = new File(createContext().getDirectory(), "db/revs/0/4"); | ||||
|     revision4.delete(); | ||||
|  | ||||
|     HealthCheckResult check = new SvnFullHealthCheckCommand(createContext()).check(); | ||||
|  | ||||
|     assertThat(check.isHealthy()).isFalse(); | ||||
|   } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user