diff --git a/application/src/main/java/run/halo/app/core/extension/reconciler/PluginReconciler.java b/application/src/main/java/run/halo/app/core/extension/reconciler/PluginReconciler.java index 441e82a53..cb42c5f06 100644 --- a/application/src/main/java/run/halo/app/core/extension/reconciler/PluginReconciler.java +++ b/application/src/main/java/run/halo/app/core/extension/reconciler/PluginReconciler.java @@ -320,11 +320,12 @@ public class PluginReconciler implements Reconciler { Plugin.PluginStatus status = plugin.statusNonNull(); PluginWrapper pluginWrapper = haloPluginManager.getPlugin(pluginName); - PluginState pluginState = Optional.ofNullable(pluginWrapper) - .map(PluginWrapper::getPluginState) - .orElse(PluginState.FAILED); + if (pluginWrapper != null) { + pluginWrapper.setPluginState(PluginState.FAILED); + pluginWrapper.setFailedException(e); + } - status.setPhase(pluginState); + status.setPhase(PluginState.FAILED); Plugin.PluginStatus oldStatus = JsonUtils.deepCopy(status); Condition condition = Condition.builder() diff --git a/application/src/test/java/run/halo/app/core/extension/reconciler/PluginReconcilerTest.java b/application/src/test/java/run/halo/app/core/extension/reconciler/PluginReconcilerTest.java index 9d6d72094..714cf9b60 100644 --- a/application/src/test/java/run/halo/app/core/extension/reconciler/PluginReconcilerTest.java +++ b/application/src/test/java/run/halo/app/core/extension/reconciler/PluginReconcilerTest.java @@ -115,11 +115,7 @@ class PluginReconcilerTest { // mock start plugin failed when(extensionClient.fetch(eq(Plugin.class), eq("apples"))).thenReturn(Optional.of(plugin)); - when(haloPluginManager.startPlugin(any())).thenAnswer((Answer) invocation -> { - // mock plugin real state is started - when(pluginWrapper.getPluginState()).thenReturn(PluginState.FAILED); - return PluginState.FAILED; - }); + when(haloPluginManager.startPlugin(any())).thenReturn(PluginState.FAILED); // mock plugin real state is started when(pluginWrapper.getPluginState()).thenReturn(PluginState.STOPPED); @@ -497,6 +493,29 @@ class PluginReconcilerTest { } } + @Test + void persistenceFailureStatus() { + String name = "fake-plugin"; + Plugin plugin = new Plugin(); + Plugin.PluginStatus status = new Plugin.PluginStatus(); + plugin.setStatus(status); + when(extensionClient.fetch(eq(Plugin.class), eq(name))) + .thenReturn(Optional.of(plugin)); + PluginWrapper pluginWrapper = mock(PluginWrapper.class); + when(haloPluginManager.getPlugin(eq(name))) + .thenReturn(pluginWrapper); + Throwable error = mock(Throwable.class); + pluginReconciler.persistenceFailureStatus(name, error); + + assertThat(status.getPhase()).isEqualTo(PluginState.FAILED); + assertThat(status.getConditions()).hasSize(1); + assertThat(status.getConditions().peek().getType()) + .isEqualTo(PluginState.FAILED.toString()); + + verify(pluginWrapper).setPluginState(eq(PluginState.FAILED)); + verify(pluginWrapper).setFailedException(eq(error)); + } + private ArgumentCaptor doReconcileNeedRequeue() { ArgumentCaptor pluginCaptor = ArgumentCaptor.forClass(Plugin.class); doNothing().when(extensionClient).update(pluginCaptor.capture());