This is an automated email from the ASF dual-hosted git repository. heneveld pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/brooklyn-server.git
commit 421905ef1b065cc63970feda7c48dbba449a4242 Author: Alex Heneveld <[email protected]> AuthorDate: Tue Nov 23 16:32:11 2021 +0000 include osgi information as part of server up check * if osgi is starting, don't report up until startup complete * return dedicated osgiUp as well, whether osgi is running or not --- .../apache/brooklyn/core/mgmt/ha/OsgiManager.java | 4 ++- .../brooklyn/launcher/osgi/OsgiLauncherImpl.java | 32 ++++++++++++++++------ .../brooklyn/rest/resources/ServerResource.java | 14 ++++++++++ 3 files changed, 40 insertions(+), 10 deletions(-) diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/ha/OsgiManager.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/ha/OsgiManager.java index 273cdb0..213b8a1 100644 --- a/core/src/main/java/org/apache/brooklyn/core/mgmt/ha/OsgiManager.java +++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/ha/OsgiManager.java @@ -92,7 +92,9 @@ public class OsgiManager { * a start from scratch; however if we leave it running, uninstalling any extra bundles, then tests are fast and don't leak. * See OsgiTestingLeaksAndSpeedTest. */ protected static final boolean REUSED_FRAMEWORKS_ARE_KEPT_RUNNING = true; - + + public static final ConfigKey<Boolean> OSGI_STARTUP_COMPLETE = ConfigKeys.newBooleanConfigKey("brooklyn.osgi.startup.complete"); + /* see `Osgis` class for info on starting framework etc */ final ManagementContext mgmt; diff --git a/karaf/init/src/main/java/org/apache/brooklyn/launcher/osgi/OsgiLauncherImpl.java b/karaf/init/src/main/java/org/apache/brooklyn/launcher/osgi/OsgiLauncherImpl.java index c45b6ea..64edcfa 100644 --- a/karaf/init/src/main/java/org/apache/brooklyn/launcher/osgi/OsgiLauncherImpl.java +++ b/karaf/init/src/main/java/org/apache/brooklyn/launcher/osgi/OsgiLauncherImpl.java @@ -16,18 +16,20 @@ package org.apache.brooklyn.launcher.osgi; import com.google.common.base.Stopwatch; -import java.util.Arrays; +import java.io.IOException; import java.util.List; +import java.util.Map; import java.util.concurrent.atomic.AtomicBoolean; -import java.util.stream.Collectors; +import javax.annotation.Nullable; import org.apache.brooklyn.api.mgmt.ManagementContext; import org.apache.brooklyn.api.mgmt.ha.HighAvailabilityMode; import org.apache.brooklyn.core.BrooklynVersionService; import org.apache.brooklyn.core.catalog.internal.CatalogInitialization; import org.apache.brooklyn.core.internal.BrooklynProperties; +import org.apache.brooklyn.core.mgmt.ha.OsgiManager; import org.apache.brooklyn.core.mgmt.internal.BrooklynShutdownHooks; +import org.apache.brooklyn.core.mgmt.internal.ManagementContextInternal; import org.apache.brooklyn.core.mgmt.persist.PersistMode; -import org.apache.brooklyn.core.typereg.BrooklynCatalogBundleResolver; import org.apache.brooklyn.launcher.common.BasicLauncher; import org.apache.brooklyn.launcher.common.BrooklynPropertiesFactoryHelper; import org.apache.brooklyn.rest.BrooklynWebConfig; @@ -41,19 +43,21 @@ import org.apache.brooklyn.util.text.Strings; import org.apache.brooklyn.util.time.CountdownTimer; import org.apache.brooklyn.util.time.Duration; import org.apache.brooklyn.util.time.Time; -import org.osgi.framework.*; +import org.osgi.framework.Bundle; +import org.osgi.framework.BundleContext; +import org.osgi.framework.Constants; +import org.osgi.framework.FrameworkUtil; +import org.osgi.framework.InvalidSyntaxException; +import org.osgi.framework.ServiceEvent; +import org.osgi.framework.ServiceListener; +import org.osgi.framework.ServiceReference; import org.osgi.framework.launch.Framework; import org.osgi.framework.startlevel.FrameworkStartLevel; import org.osgi.service.cm.Configuration; import org.osgi.service.cm.ConfigurationAdmin; -import org.osgi.util.tracker.ServiceTracker; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.annotation.Nullable; -import java.io.IOException; -import java.util.Map; - /** * Initializer for brooklyn-core when running in an OSGi environment. */ @@ -94,6 +98,8 @@ public class OsgiLauncherImpl extends BasicLauncher<OsgiLauncherImpl> implements // make sure brooklyn-core bundle is started brooklynVersion.getVersion(); + if (getManagementContext()!=null) ((ManagementContextInternal)getManagementContext()).getBrooklynProperties().put(OsgiManager.OSGI_STARTUP_COMPLETE, false); + Configuration brooklynConfig = getConfiguration(BROOKLYN_CONFIG_PID); // Note that this doesn't check whether the files exist, just that there are potential alternative sources for configuration. if (brooklynConfig == null && Strings.isEmpty(globalBrooklynProperties) && Strings.isEmpty(localBrooklynProperties)) { @@ -121,9 +127,16 @@ public class OsgiLauncherImpl extends BasicLauncher<OsgiLauncherImpl> implements } } + @Override + protected void initManagementContext() { + super.initManagementContext(); + ((ManagementContextInternal)getManagementContext()).getBrooklynProperties().put(OsgiManager.OSGI_STARTUP_COMPLETE, false); + } + // init-method can't find the start method for some reason, provide an alternative. @Override public void initOsgi() { + if (getManagementContext()!=null) ((ManagementContextInternal)getManagementContext()).getBrooklynProperties().put(OsgiManager.OSGI_STARTUP_COMPLETE, false); synchronized (reloadLock) { final Stopwatch startupTimer = Stopwatch.createStarted(); BrooklynShutdownHooks.resetShutdownFlag(); @@ -289,6 +302,7 @@ public class OsgiLauncherImpl extends BasicLauncher<OsgiLauncherImpl> implements final Stopwatch startupTimer = Stopwatch.createStarted(); LOG.debug("OsgiLauncher catalog/rebind running initialization (part two)"); startPartTwo(); + ((ManagementContextInternal)getManagementContext()).getBrooklynProperties().put(OsgiManager.OSGI_STARTUP_COMPLETE, true); startupTimer.stop(); LOG.info("Brooklyn initialization (part two) complete after {}", startupTimer.toString()); } diff --git a/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/ServerResource.java b/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/ServerResource.java index 81948f3..65617b1 100644 --- a/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/ServerResource.java +++ b/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/ServerResource.java @@ -59,6 +59,7 @@ import org.apache.brooklyn.core.internal.BrooklynProperties; import org.apache.brooklyn.core.mgmt.ShutdownHandler; import org.apache.brooklyn.core.mgmt.entitlement.Entitlements; import org.apache.brooklyn.core.mgmt.ha.OsgiBundleInstallationResult; +import org.apache.brooklyn.core.mgmt.ha.OsgiManager; import org.apache.brooklyn.core.mgmt.internal.LocalManagementContext; import org.apache.brooklyn.core.mgmt.internal.ManagementContextInternal; import org.apache.brooklyn.core.mgmt.persist.*; @@ -369,12 +370,23 @@ public class ServerResource extends AbstractBrooklynRestResource implements Serv @Override public boolean isUp() { + return isRestUp() && isOsgiUp(false); + } + + public boolean isRestUp() { if (!Entitlements.isEntitled(mgmt().getEntitlementManager(), Entitlements.SERVER_STATUS, null)) throw WebResourceUtils.forbidden(USER_OPERATION_NOT_AUTHORIZED_MSG, Entitlements.getEntitlementContext().user()); Maybe<ManagementContext> mm = mgmtMaybe(); return !mm.isAbsent() && mm.get().isStartupComplete() && mm.get().isRunning(); } + + /** returns whether up if known to be starting or up; else returns false if required and true if not */ + public boolean isOsgiUp(boolean osgiRequired) { + Boolean up = mgmtInternal().getBrooklynProperties().getConfig(OsgiManager.OSGI_STARTUP_COMPLETE); + if (up!=null) return up; + return !osgiRequired; + } @Override public boolean isShuttingDown() { @@ -399,6 +411,8 @@ public class ServerResource extends AbstractBrooklynRestResource implements Serv "shuttingDown", isShuttingDown(), "healthy", isHealthy(), "ha", getHighAvailabilityPlaneStates(), + "osgiUp", isOsgiUp(true), + "brooklyn.security.sensitive.fields", MutableMap.of( "tokens", Sanitizer.getSensitiveFieldsTokens(),
