From 7d285718c2b56f7c0ffe486ccbf1bc8c1c10bc52 Mon Sep 17 00:00:00 2001 From: Vincent Latombe Date: Wed, 20 Sep 2023 20:44:29 +0200 Subject: [PATCH] LogRecorder programmatic deletion support (#8489) * Add programmatic deletion support for LogRecorder. * Also added event handling through SaveableListener whenever it gets deleted. --- .../main/java/hudson/logging/LogRecorder.java | 12 ++++++- .../logging/LogRecorderManagerTest.java | 34 +++++++++++++++++++ 2 files changed, 45 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/hudson/logging/LogRecorder.java b/core/src/main/java/hudson/logging/LogRecorder.java index ae00f8510f09..bb90e789f109 100644 --- a/core/src/main/java/hudson/logging/LogRecorder.java +++ b/core/src/main/java/hudson/logging/LogRecorder.java @@ -535,6 +535,16 @@ public int hashCode() { */ @RequirePOST public synchronized void doDoDelete(StaplerResponse rsp) throws IOException, ServletException { + delete(); + rsp.sendRedirect2(".."); + } + + /** + * Deletes this log recorder. + * @throws IOException In case anything went wrong while deleting the configuration file. + * @since TODO + */ + public void delete() throws IOException { Jenkins.get().checkPermission(Jenkins.ADMINISTER); getConfigFile().delete(); @@ -544,7 +554,7 @@ public synchronized void doDoDelete(StaplerResponse rsp) throws IOException, Ser loggers.forEach(Target::disable); getParent().getRecorders().forEach(logRecorder -> logRecorder.getLoggers().forEach(Target::enable)); - rsp.sendRedirect2(".."); + SaveableListener.fireOnChange(this, getConfigFile()); } /** diff --git a/test/src/test/java/hudson/logging/LogRecorderManagerTest.java b/test/src/test/java/hudson/logging/LogRecorderManagerTest.java index 2cdfe6a0e688..608e7eb0b464 100644 --- a/test/src/test/java/hudson/logging/LogRecorderManagerTest.java +++ b/test/src/test/java/hudson/logging/LogRecorderManagerTest.java @@ -26,7 +26,9 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.empty; import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.is; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -34,7 +36,10 @@ import static org.junit.Assert.assertThrows; import static org.junit.Assert.assertTrue; +import hudson.XmlFile; import hudson.model.Computer; +import hudson.model.Saveable; +import hudson.model.listeners.SaveableListener; import hudson.remoting.VirtualChannel; import hudson.util.FormValidation; import java.io.IOException; @@ -52,6 +57,7 @@ import org.junit.Test; import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.JenkinsRule; +import org.jvnet.hudson.test.TestExtension; import org.jvnet.hudson.test.Url; /** @@ -204,6 +210,34 @@ public void addingLogRecorderToListAddsToLegacyRecordersMap() throws IOException assertThat(log.getRecorders().size(), is(1)); } + @Test + public void deletingLogRecorder() throws IOException { + LogRecorderManager log = j.jenkins.getLog(); + assertThat(log.getRecorders(), empty()); + LogRecorder logRecorder = new LogRecorder("dummy"); + logRecorder.getLoggers().add(new LogRecorder.Target("dummy", Level.ALL)); + log.getRecorders().add(logRecorder); + logRecorder.save(); + assertThat(log.getRecorders(), hasSize(1)); + logRecorder.delete(); + assertThat(log.getRecorders(), empty()); + assertTrue(DeletingLogRecorderListener.recordDeletion); + } + + @TestExtension("deletingLogRecorder") + public static class DeletingLogRecorderListener extends SaveableListener { + private static boolean recordDeletion; + + @Override + public void onChange(Saveable o, XmlFile file) { + if (o instanceof LogRecorder && "dummy".equals(((LogRecorder) o).getName())) { + if (!file.exists()) { + recordDeletion = true; + } + } + } + } + private static final class Log extends MasterToSlaveCallable { private final Level level; private final String logger;