diff --git a/src/main/java/run/halo/app/core/extension/reconciler/PluginReconciler.java b/src/main/java/run/halo/app/core/extension/reconciler/PluginReconciler.java index 24f3d2b98..da2329cf3 100644 --- a/src/main/java/run/halo/app/core/extension/reconciler/PluginReconciler.java +++ b/src/main/java/run/halo/app/core/extension/reconciler/PluginReconciler.java @@ -36,6 +36,7 @@ import run.halo.app.infra.utils.JsonUtils; import run.halo.app.infra.utils.PathUtils; import run.halo.app.plugin.HaloPluginManager; import run.halo.app.plugin.PluginConst; +import run.halo.app.plugin.PluginNotFoundException; import run.halo.app.plugin.PluginStartingError; import run.halo.app.plugin.event.PluginCreatedEvent; import run.halo.app.plugin.resources.BundleResourceUtils; @@ -82,24 +83,13 @@ public class PluginReconciler implements Reconciler { ensurePluginLoaded(); } + if (!checkPluginState(name)) { + return; + } + client.fetch(Plugin.class, name).ifPresent(plugin -> { Plugin oldPlugin = JsonUtils.deepCopy(plugin); Plugin.PluginStatus pluginStatus = plugin.statusNonNull(); - PluginWrapper pluginWrapper = haloPluginManager.getPlugin(name); - if (pluginWrapper == null) { - pluginStatus.setPhase(PluginState.FAILED); - pluginStatus.setReason("PluginNotFound"); - pluginStatus.setMessage("Plugin " + name + " not found in plugin manager"); - } else { - // Set to the correct state - pluginStatus.setPhase(pluginWrapper.getPluginState()); - - if (haloPluginManager.getUnresolvedPlugins().contains(pluginWrapper)) { - // load and resolve plugin - haloPluginManager.loadPlugin(pluginWrapper.getPluginPath()); - } - } - String logo = plugin.getSpec().getLogo(); if (PathUtils.isAbsoluteUri(logo)) { pluginStatus.setLogo(logo); @@ -119,6 +109,36 @@ public class PluginReconciler implements Reconciler { stopPlugin(name); } + private boolean checkPluginState(String name) { + // check plugin state + return client.fetch(Plugin.class, name) + .map(plugin -> { + Plugin oldPlugin = JsonUtils.deepCopy(plugin); + Plugin.PluginStatus pluginStatus = plugin.statusNonNull(); + PluginWrapper pluginWrapper = haloPluginManager.getPlugin(name); + if (pluginWrapper == null) { + pluginStatus.setPhase(PluginState.FAILED); + pluginStatus.setReason("PluginNotFound"); + pluginStatus.setMessage( + "Plugin " + plugin.getMetadata().getName() + + " not found in plugin manager."); + if (!plugin.equals(oldPlugin)) { + client.update(plugin); + } + return false; + } + // Set to the correct state + pluginStatus.setPhase(pluginWrapper.getPluginState()); + + if (haloPluginManager.getUnresolvedPlugins().contains(pluginWrapper)) { + // load and resolve plugin + haloPluginManager.loadPlugin(pluginWrapper.getPluginPath()); + } + return true; + }) + .orElse(false); + } + private void ensurePluginLoaded() { // load plugin if exists in plugin root paths. List loadedPlugins = haloPluginManager.getPlugins(); @@ -172,20 +192,15 @@ public class PluginReconciler implements Reconciler { private boolean verifyStartCondition(String pluginName) { PluginWrapper pluginWrapper = haloPluginManager.getPlugin(pluginName); + if (pluginWrapper == null) { + throw new PluginNotFoundException( + "Plugin " + pluginName + " not found in plugin manager."); + } return client.fetch(Plugin.class, pluginName).map(plugin -> { Plugin.PluginStatus oldStatus = JsonUtils.deepCopy(plugin.statusNonNull()); Plugin.PluginStatus status = plugin.statusNonNull(); status.setLastTransitionTime(Instant.now()); - if (pluginWrapper == null) { - status.setPhase(PluginState.FAILED); - status.setReason("PluginNotFound"); - status.setMessage("Plugin [" + pluginName + "] not found in plugin manager"); - if (!oldStatus.equals(status)) { - client.update(plugin); - } - return false; - } // Check if this plugin version is match requires param. if (!haloPluginManager.validatePluginVersion(pluginWrapper)) { @@ -206,6 +221,9 @@ public class PluginReconciler implements Reconciler { status.setPhase(pluginState); status.setReason("PluginDisabled"); status.setMessage("The plugin is disabled for some reason and cannot be started."); + if (!oldStatus.equals(status)) { + client.update(plugin); + } } return true; }).orElse(false);