[java-identity-provider] branch main updated: IDP-1691 Re-Enable modules after an installation update

Rod Widdowson rdw at steadingsoftware.com
Sat Nov 21 11:05:18 UTC 2020


This is an automated email from the git hooks/post-receive script.

rdw pushed a commit to branch main
in repository java-identity-provider.

View the commit online:
http://git.shibboleth.net/view/?p=java-identity-provider.git;a=commit;h=7415b09444a65fc8e608abe6943560500c825d6f

The following commit(s) were added to refs/heads/main by this push:
       new  7415b0944 IDP-1691  Re-Enable modules after an installation update
7415b0944 is described below

commit 7415b09444a65fc8e608abe6943560500c825d6f
Author: Rod Widdowson <rdw at steadingsoftware.com>
AuthorDate: Sat Nov 21 11:04:29 2020 +0000

    IDP-1691  Re-Enable modules after an installation update
    
    https://issues.shibboleth.net/jira/browse/IDP-1691
---
 .../idp/installer/CurrentInstallState.java         |  9 ++++
 .../net/shibboleth/idp/installer/V4Install.java    | 33 ++++++++++++++
 .../installer/impl/CurrentInstallStateImpl.java    | 50 ++++++++++++++++++++--
 3 files changed, 89 insertions(+), 3 deletions(-)

diff --git a/idp-installer/src/main/java/net/shibboleth/idp/installer/CurrentInstallState.java b/idp-installer/src/main/java/net/shibboleth/idp/installer/CurrentInstallState.java
index f2c589f80..8c54b2358 100644
--- a/idp-installer/src/main/java/net/shibboleth/idp/installer/CurrentInstallState.java
+++ b/idp-installer/src/main/java/net/shibboleth/idp/installer/CurrentInstallState.java
@@ -18,6 +18,8 @@
 package net.shibboleth.idp.installer;
 
 import java.nio.file.Path;
+import java.util.Collection;
+import java.util.Collections;
 import java.util.List;
 import java.util.Properties;
 
@@ -74,4 +76,11 @@ public interface CurrentInstallState extends InitializableComponent {
     default boolean isSystemPresent() {
         return true;
     }
+
+    /** Which modules (by ID) are enabled for this release.
+     * @return those modules enabled.
+     */
+    default @Nonnull Collection<String> getEnabledModules() {
+        return Collections.emptySet();
+    }
 }
diff --git a/idp-installer/src/main/java/net/shibboleth/idp/installer/V4Install.java b/idp-installer/src/main/java/net/shibboleth/idp/installer/V4Install.java
index 0f535bf89..ddc829c43 100644
--- a/idp-installer/src/main/java/net/shibboleth/idp/installer/V4Install.java
+++ b/idp-installer/src/main/java/net/shibboleth/idp/installer/V4Install.java
@@ -28,7 +28,10 @@ import java.nio.file.Files;
 import java.nio.file.Path;
 import java.time.Instant;
 import java.util.Collections;
+import java.util.Iterator;
 import java.util.Properties;
+import java.util.ServiceConfigurationError;
+import java.util.ServiceLoader;
 import java.util.Set;
 
 import javax.annotation.Nonnull;
@@ -45,6 +48,9 @@ import org.springframework.core.io.Resource;
 
 import net.shibboleth.ext.spring.util.ApplicationContextBuilder;
 import net.shibboleth.idp.Version;
+import net.shibboleth.idp.module.IdPModule;
+import net.shibboleth.idp.module.ModuleContext;
+import net.shibboleth.idp.module.ModuleException;
 import net.shibboleth.idp.spring.IdPPropertiesApplicationContextInitializer;
 import net.shibboleth.utilities.java.support.component.AbstractInitializableComponent;
 import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
@@ -106,6 +112,7 @@ public class V4Install extends AbstractInitializableComponent {
         populatePropertyFiles(keyManager.isCreatedSealer());
         handleEditWebApp();
         populateUserDirectories();
+        reEnableModules();
         deleteSpuriousFiles();
         generateMetadata();
         reprotect();
@@ -388,6 +395,32 @@ public class V4Install extends AbstractInitializableComponent {
         InstallerSupport.createDirectory(targetBase.resolve("logs"));
     }
     
+    /** ReEnable modules which were already enabled.
+     * @throws BuildException if badness occurs
+     */
+    protected void reEnableModules() throws BuildException {
+        final ModuleContext moduleContext = new ModuleContext(installerProps.getTargetDir());
+        final Iterator<IdPModule> modules = ServiceLoader.load(IdPModule.class).iterator();
+
+        while (modules.hasNext()) {
+            try {
+                final IdPModule module = modules.next();
+                final String id = module.getId();
+                if (currentState.getEnabledModules().contains(id)) {
+                    log.debug("Re-enabling Module {}", id);
+                    try {
+                        module.enable(moduleContext);
+                    } catch (final ModuleException e) {
+                        log.error("Error re-enabling module {}", id, e);
+                        throw new BuildException(e);
+                    }
+                }
+            } catch (final ServiceConfigurationError e) {
+                log.error("Error loading modules", e);
+            }
+        }
+    }
+
     /** Delete those files which were created but not needed.
      * @throws BuildException if badness occurs
      */
diff --git a/idp-installer/src/main/java/net/shibboleth/idp/installer/impl/CurrentInstallStateImpl.java b/idp-installer/src/main/java/net/shibboleth/idp/installer/impl/CurrentInstallStateImpl.java
index 0adf3e43d..566447fc7 100644
--- a/idp-installer/src/main/java/net/shibboleth/idp/installer/impl/CurrentInstallStateImpl.java
+++ b/idp-installer/src/main/java/net/shibboleth/idp/installer/impl/CurrentInstallStateImpl.java
@@ -24,9 +24,15 @@ import java.io.InputStream;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Collections;
+import java.util.HashSet;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Properties;
+import java.util.ServiceConfigurationError;
+import java.util.ServiceLoader;
+import java.util.Set;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -37,6 +43,8 @@ import org.slf4j.LoggerFactory;
 import net.shibboleth.idp.installer.CurrentInstallState;
 import net.shibboleth.idp.installer.InstallerProperties;
 import net.shibboleth.idp.installer.InstallerSupport;
+import net.shibboleth.idp.module.IdPModule;
+import net.shibboleth.idp.module.ModuleContext;
 import net.shibboleth.idp.spring.IdPPropertiesApplicationContextInitializer;
 import net.shibboleth.utilities.java.support.annotation.constraint.NonnullAfterInit;
 import net.shibboleth.utilities.java.support.component.AbstractInitializableComponent;
@@ -53,8 +61,10 @@ public final class CurrentInstallStateImpl extends AbstractInitializableComponen
     private final Path targetDir;
     
     /** The files we will delete if they created on upgrade. */
-    private final String[][] deleteAfterUpgrades = { { "credentials", "secrets.properties", },
-                                                   }; 
+    private final String[][] deleteAfterUpgrades = { { "credentials", "secrets.properties", }, };
+
+    /** The module IDs which are enabled. */
+    private Set<String> enabledModules = Collections.emptySet();
 
     /** Whether the IdP properties file exists.*/
     private boolean idpPropertiesPresent;
@@ -118,8 +128,9 @@ public final class CurrentInstallStateImpl extends AbstractInitializableComponen
 
     /** Populate {{@link #props} from idp.properties and other files pointed to by
      * {@value IdPPropertiesApplicationContextInitializer#IDP_ADDITIONAL_PROPERTY}.
+     * @throws ComponentInitializationException
      */
-    private void setupPreviousProps() {
+    private void setupPreviousProps() throws ComponentInitializationException {
         if (!isIdPPropertiesPresent()) {
             return ;
         }
@@ -147,7 +158,34 @@ public final class CurrentInstallStateImpl extends AbstractInitializableComponen
                     props.load(stream);
                 } catch (final IOException e) {
                     log.error("Error loading {}", path, e);
+                    throw new ComponentInitializationException(e);
+                }
+            }
+        }
+    }
+
+    /**
+     * Populate {{@link #enabledModules} from the current classpath and the new IdP home.
+     */
+    private void findEnabledModules() {
+        if (getInstalledVersion()==null) {
+            return;
+        }
+        final ModuleContext moduleContext = new ModuleContext(targetDir);
+        enabledModules = new HashSet<>();
+        final Iterator<IdPModule> modules = ServiceLoader.load(IdPModule.class).iterator();
+
+        while (modules.hasNext()) {
+            try {
+                final IdPModule module = modules.next();
+                if (module.isEnabled(moduleContext)) {
+                    log.debug("Detected enabled Module {}", module.getId());
+                    enabledModules.add(module.getId());
+                } else {
+                    log.debug("Detected disabled Module {}", module.getId());
                 }
+            } catch (final ServiceConfigurationError e) {
+                log.error("Error loading modules", e);
             }
         }
     }
@@ -160,6 +198,7 @@ public final class CurrentInstallStateImpl extends AbstractInitializableComponen
         systemPresent = Files.exists(targetDir.resolve("system"));
         findPreviousVersion();
         setupPreviousProps();
+        findEnabledModules();
 
         if (null == getInstalledVersion()) {
             // New install.  We need all files
@@ -209,4 +248,9 @@ public final class CurrentInstallStateImpl extends AbstractInitializableComponen
     public boolean isSystemPresent() {
         return systemPresent;
     }
+
+    /** {@inheritDoc} */
+    @Nonnull public Collection<String> getEnabledModules() {
+        return enabledModules;
+    }
 }

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the commits mailing list