You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by he...@apache.org on 2021/11/23 17:22:58 UTC

[brooklyn-server] branch master updated (d35d92f -> 2f87e45)

This is an automated email from the ASF dual-hosted git repository.

heneveld pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/brooklyn-server.git.


    from d35d92f  Merge pull request #1275 from algairim/ha-improvements
     new c51471c  take initial deployment metadata from config or tags
     new 421905e  include osgi information as part of server up check
     new 2efc9d6  swagger advertises https only (recommended way to connect)
     new 2f87e45  remove explicit reference to wrong version of snakeyaml

The 4 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../core/effector/AddDeploySensorsInitializer.java | 60 ++++++++++++++++++----
 .../apache/brooklyn/core/mgmt/ha/OsgiManager.java  |  4 +-
 karaf/features/src/main/feature/feature.xml        |  3 +-
 .../brooklyn/launcher/osgi/OsgiLauncherImpl.java   | 32 ++++++++----
 .../brooklyn/rest/resources/ServerResource.java    | 14 +++++
 .../rest/apidoc/RestApiResourceScanner.java        |  2 +-
 6 files changed, 94 insertions(+), 21 deletions(-)

[brooklyn-server] 02/04: include osgi information as part of server up check

Posted by he...@apache.org.
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 <al...@cloudsoftcorp.com>
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(),

[brooklyn-server] 01/04: take initial deployment metadata from config or tags

Posted by he...@apache.org.
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 c51471cdb8cf0b12ec98e70f4ee6c9db9ec9e3ff
Author: Alex Heneveld <al...@cloudsoftcorp.com>
AuthorDate: Tue Nov 23 16:29:41 2021 +0000

    take initial deployment metadata from config or tags
---
 .../core/effector/AddDeploySensorsInitializer.java | 60 ++++++++++++++++++----
 1 file changed, 51 insertions(+), 9 deletions(-)

diff --git a/core/src/main/java/org/apache/brooklyn/core/effector/AddDeploySensorsInitializer.java b/core/src/main/java/org/apache/brooklyn/core/effector/AddDeploySensorsInitializer.java
index 1e9d402..f494540 100644
--- a/core/src/main/java/org/apache/brooklyn/core/effector/AddDeploySensorsInitializer.java
+++ b/core/src/main/java/org/apache/brooklyn/core/effector/AddDeploySensorsInitializer.java
@@ -25,13 +25,48 @@ import org.apache.brooklyn.api.entity.EntityInitializer;
 import org.apache.brooklyn.api.entity.EntityLocal;
 import org.apache.brooklyn.api.mgmt.entitlement.EntitlementContext;
 import org.apache.brooklyn.api.sensor.AttributeSensor;
+import org.apache.brooklyn.core.config.ConfigKeys;
 import org.apache.brooklyn.core.entity.EntityInternal;
+import org.apache.brooklyn.core.mgmt.BrooklynTags;
 import org.apache.brooklyn.core.mgmt.entitlement.Entitlements;
 import org.apache.brooklyn.core.sensor.Sensors;
 
 import java.util.Map;
+import org.apache.brooklyn.util.collections.MutableMap;
+import org.apache.brooklyn.util.core.flags.TypeCoercions;
+import org.apache.brooklyn.util.text.Strings;
 
 public class AddDeploySensorsInitializer implements EntityInitializer {
+
+    public static final String DEPLOYMENT_METADATA = "deployment.metadata";
+
+    public static class DeploymentMetadata {
+        String user;
+        Instant created;
+
+        public void read(Object inputO, boolean overwrite) {
+            Map input;
+            if (inputO==null) return;
+            if (inputO instanceof DeploymentMetadata) {
+                input = MutableMap.of("user", ((DeploymentMetadata)inputO).user,
+                        "created", ((DeploymentMetadata)inputO).created);
+            } else if (!(inputO instanceof Map)) {
+                return;
+            } else {
+                input = (Map)inputO;
+            }
+
+            if (overwrite || Strings.isBlank(user)) {
+                String value = Strings.toString( input.get("user") );
+                if (Strings.isNonBlank(value)) user = value;
+            }
+            if (overwrite || created==null) {
+                Instant value = TypeCoercions.tryCoerce(input.get("created"), Instant.class ).orNull();
+                if (value!=null) created = value;
+            }
+        }
+    }
+
     @Override
     public void apply(EntityLocal entity) {
         // We want to set the metadata only on the root node of an application
@@ -39,18 +74,25 @@ public class AddDeploySensorsInitializer implements EntityInitializer {
             return;
         }
         EntitlementContext entitlementContext = Entitlements.getEntitlementContext();
-        AttributeSensor<Map<String, Object>> sensor = Sensors.newSensor(
-                new TypeToken<Map<String, Object>>() {},
-                "deployment.metadata",
+        AttributeSensor<DeploymentMetadata> sensor = Sensors.newSensor(
+                DeploymentMetadata.class,
+                DEPLOYMENT_METADATA,
                 "A map of metadata information about this particular deployment. Contains at least who triggered it and when.");
         ((EntityInternal) entity).getMutableEntityType().addSensor(sensor);
-        entity.sensors().set(sensor, ImmutableMap.of(
-                "user", entitlementContext != null ? entitlementContext.user() : "Unknown",
 
-                "created", Instant.now()
-                // previously used the below instead
-//                "deploy_time", System.currentTimeMillis()
-        ));
+        DeploymentMetadata result = new DeploymentMetadata();
+
+        // will convert config, then tag, and then republish
+
+        result.read( entity.config().get(ConfigKeys.newConfigKey(Object.class, DEPLOYMENT_METADATA)), false );
+        result.read(BrooklynTags.findSingleKeyMapValue(DEPLOYMENT_METADATA, Object.class, entity.tags().getTags()), false);
+        result.read(ImmutableMap.of(
+                "user", entitlementContext != null
+                        ? entitlementContext.user()
+                        : "Unknown",
+                "created", Instant.now()), false);
+
+        entity.sensors().set(sensor, result);
 
     }
 }

[brooklyn-server] 04/04: remove explicit reference to wrong version of snakeyaml

Posted by he...@apache.org.
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 2f87e454ba38664143b2ac6dd765d911533cc297
Author: Alex Heneveld <al...@cloudsoftcorp.com>
AuthorDate: Tue Nov 23 16:58:14 2021 +0000

    remove explicit reference to wrong version of snakeyaml
    
    even with exclusion in karaf feature xml, it was getting pulled in,
    but with this line removed it does not
---
 karaf/features/src/main/feature/feature.xml | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/karaf/features/src/main/feature/feature.xml b/karaf/features/src/main/feature/feature.xml
index ca33091..0756a44 100644
--- a/karaf/features/src/main/feature/feature.xml
+++ b/karaf/features/src/main/feature/feature.xml
@@ -338,7 +338,8 @@
         <bundle>mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.aopalliance/1.0_5</bundle>
         <bundle>mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.oauth-commons/20100527_1</bundle>
         <bundle>mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.jersey-core/1.11_1</bundle>
-        <bundle>mvn:org.yaml/snakeyaml/${snakeyaml.jclouds.version}</bundle>
+        <!-- <bundle>mvn:org.yaml/snakeyaml/${snakeyaml.jclouds.version}</bundle> --> <!-- prefer our version -->
+        <bundle>mvn:org.yaml/snakeyaml/${snakeyaml.version}</bundle>
 
         <!-- jclouds bundles -->
         <bundle>mvn:org.apache.jclouds.api/atmos/${jclouds.version}</bundle>

[brooklyn-server] 03/04: swagger advertises https only (recommended way to connect)

Posted by he...@apache.org.
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 2efc9d6c0214caeb9b72a3fd52f001ad4827d9ca
Author: Alex Heneveld <al...@cloudsoftcorp.com>
AuthorDate: Tue Nov 23 16:33:35 2021 +0000

    swagger advertises https only (recommended way to connect)
---
 .../java/org/apache/brooklyn/rest/apidoc/RestApiResourceScanner.java    | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/utils/rest-swagger/src/main/java/org/apache/brooklyn/rest/apidoc/RestApiResourceScanner.java b/utils/rest-swagger/src/main/java/org/apache/brooklyn/rest/apidoc/RestApiResourceScanner.java
index 21f92d3..cf9c9c4 100644
--- a/utils/rest-swagger/src/main/java/org/apache/brooklyn/rest/apidoc/RestApiResourceScanner.java
+++ b/utils/rest-swagger/src/main/java/org/apache/brooklyn/rest/apidoc/RestApiResourceScanner.java
@@ -114,7 +114,7 @@ public class RestApiResourceScanner extends AbstractScanner implements JaxrsScan
     @Override
     public Swagger configure(Swagger swagger) {
         swagger.setBasePath("/v1");
-        swagger.setSchemes(Arrays.asList(new Scheme[]{Scheme.HTTPS, Scheme.HTTP}));
+        swagger.setSchemes(Arrays.asList(new Scheme[]{Scheme.HTTPS}));  // only advertise https
 
         swagger.info(getSwaggerInfo());