You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by du...@apache.org on 2018/06/04 09:18:06 UTC

svn commit: r1832805 - in /felix/trunk/systemready/src: main/java/org/apache/felix/systemready/ main/java/org/apache/felix/systemready/impl/ main/java/org/apache/felix/systemready/impl/servlet/ test/java/org/apache/felix/systemready/osgi/ test/java/org...

Author: dulvac
Date: Mon Jun  4 09:18:06 2018
New Revision: 1832805

URL: http://svn.apache.org/viewvc?rev=1832805&view=rev
Log:
FELIX-5848 FrameworkStartCheck and general improvements

Added:
    felix/trunk/systemready/src/test/java/org/apache/felix/systemready/osgi/FrameworkStartTestGreen.java
      - copied, changed from r1832804, felix/trunk/systemready/src/test/java/org/apache/felix/systemready/osgi/FrameworkStartTest.java
    felix/trunk/systemready/src/test/java/org/apache/felix/systemready/osgi/FrameworkStartTestYellow.java
Removed:
    felix/trunk/systemready/src/test/java/org/apache/felix/systemready/osgi/FrameworkStartTest.java
Modified:
    felix/trunk/systemready/src/main/java/org/apache/felix/systemready/SystemReadyMonitor.java
    felix/trunk/systemready/src/main/java/org/apache/felix/systemready/impl/ComponentsCheck.java
    felix/trunk/systemready/src/main/java/org/apache/felix/systemready/impl/FrameworkStartCheck.java
    felix/trunk/systemready/src/main/java/org/apache/felix/systemready/impl/ServicesCheck.java
    felix/trunk/systemready/src/main/java/org/apache/felix/systemready/impl/SystemReadyMonitorImpl.java
    felix/trunk/systemready/src/main/java/org/apache/felix/systemready/impl/servlet/SystemReadyServlet.java
    felix/trunk/systemready/src/test/java/org/apache/felix/systemready/osgi/ComponentsCheckTest.java
    felix/trunk/systemready/src/test/java/org/apache/felix/systemready/osgi/ServicesCheckTest.java
    felix/trunk/systemready/src/test/java/org/apache/felix/systemready/osgi/util/BaseTest.java

Modified: felix/trunk/systemready/src/main/java/org/apache/felix/systemready/SystemReadyMonitor.java
URL: http://svn.apache.org/viewvc/felix/trunk/systemready/src/main/java/org/apache/felix/systemready/SystemReadyMonitor.java?rev=1832805&r1=1832804&r2=1832805&view=diff
==============================================================================
--- felix/trunk/systemready/src/main/java/org/apache/felix/systemready/SystemReadyMonitor.java (original)
+++ felix/trunk/systemready/src/main/java/org/apache/felix/systemready/SystemReadyMonitor.java Mon Jun  4 09:18:06 2018
@@ -23,6 +23,9 @@ package org.apache.felix.systemready;
  * The aggregated state is the worst state of all checks.
  */
 public interface SystemReadyMonitor  {
+
+    String PID = "org.apache.felix.systemready.SystemReadyMonitor";
+
     /**
      * @return true if aggregated state is GREEN
      */

Modified: felix/trunk/systemready/src/main/java/org/apache/felix/systemready/impl/ComponentsCheck.java
URL: http://svn.apache.org/viewvc/felix/trunk/systemready/src/main/java/org/apache/felix/systemready/impl/ComponentsCheck.java?rev=1832805&r1=1832804&r2=1832805&view=diff
==============================================================================
--- felix/trunk/systemready/src/main/java/org/apache/felix/systemready/impl/ComponentsCheck.java (original)
+++ felix/trunk/systemready/src/main/java/org/apache/felix/systemready/impl/ComponentsCheck.java Mon Jun  4 09:18:06 2018
@@ -39,12 +39,14 @@ import org.osgi.service.metatype.annotat
 import org.osgi.service.metatype.annotations.ObjectClassDefinition;
 
 @Component(
-        name = "ComponentsCheck",
+        name = ComponentsCheck.PID,
         configurationPolicy = ConfigurationPolicy.REQUIRE
 )
 @Designate(ocd=ComponentsCheck.Config.class)
 public class ComponentsCheck implements SystemReadyCheck {
 
+    public static final String PID = "org.apache.felix.systemready.impl.ComponentsCheck";
+
     @ObjectClassDefinition(
             name="DS Components System Ready Check",
             description="System ready check that checks a list of DS components"

Modified: felix/trunk/systemready/src/main/java/org/apache/felix/systemready/impl/FrameworkStartCheck.java
URL: http://svn.apache.org/viewvc/felix/trunk/systemready/src/main/java/org/apache/felix/systemready/impl/FrameworkStartCheck.java?rev=1832805&r1=1832804&r2=1832805&view=diff
==============================================================================
--- felix/trunk/systemready/src/main/java/org/apache/felix/systemready/impl/FrameworkStartCheck.java (original)
+++ felix/trunk/systemready/src/main/java/org/apache/felix/systemready/impl/FrameworkStartCheck.java Mon Jun  4 09:18:06 2018
@@ -22,6 +22,7 @@ import org.apache.felix.systemready.Stat
 import org.apache.felix.systemready.SystemReadyCheck;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
+import org.osgi.framework.Constants;
 import org.osgi.framework.FrameworkEvent;
 import org.osgi.framework.startlevel.FrameworkStartLevel;
 import org.osgi.service.component.annotations.Activate;
@@ -34,41 +35,67 @@ import org.osgi.service.metatype.annotat
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.util.ArrayList;
+import java.util.List;
+
 @Component(
-        name = "FrameworkStartCheck",
+        name = FrameworkStartCheck.PID,
+        immediate=true,
         configurationPolicy = ConfigurationPolicy.OPTIONAL
 )
 @Designate(ocd=FrameworkStartCheck.Config.class)
 public class FrameworkStartCheck implements SystemReadyCheck {
 
-    public static final String FRAMEWORK_STARTED = "Framework started";
-    public static final String FRAMEWORK_START_CHECK_NAME = "Framework Start Check";
+    public static final String PID = "org.apache.felix.systemready.impl.FrameworkStartCheck";
+    public static final String FRAMEWORK_STARTED = "Framework started. ";
+    public static final String FRAMEWORK_NOT_STARTED = "Framework NOT started. ";
+    public static final String FRAMEWORK_START_CHECK_NAME = "Framework Start Ready Check";
+
     @ObjectClassDefinition(
-            name="OSGi Installer System Ready Check",
-            description="System ready that waits for the framework started OSGi event"
+            name=FRAMEWORK_START_CHECK_NAME,
+            description="System ready that waits for the system bundle to be active"
     )
     public @interface Config {
 
         @AttributeDefinition(name = "Timeout (seconds)", description = "Number of seconds after which this is considered a failure")
         long timeout() default 1000;
 
+        @AttributeDefinition(name = "Target start level", description = "The target start level at which the Framework " +
+                "is considered started. If zero or negative, it will default to the default bundle start level + 1")
+        int target_start_level() default 0;
+
+        @AttributeDefinition(name = "Target start level OSGi property name",
+                description = "The name of the OSGi property which holds the " + "\"Target start level\". " +
+                        "It takes precedence over the target.start.level config. " +
+                        "If the startlevel cannot be derived from the osgi property, this config attribute is ignored.")
+        String target_start_level_prop_name() default "";
+
     }
 
     private final Logger log = LoggerFactory.getLogger(getClass());
     private BundleContext bundleContext;
-    private Status state;
+    private long targetStartLevel;
 
     @Activate
     protected void activate(final BundleContext ctx, final Config config) throws InterruptedException {
         this.bundleContext = ctx;
-        this.bundleContext.addFrameworkListener(this::frameworkEvent);
-
-        if (bundleContext.getBundle(0).getState() == Bundle.ACTIVE) {
-            // The system bundle was already started when I joined
-            this.state = new Status(Status.State.GREEN, FRAMEWORK_STARTED);
+        final FrameworkStartLevel fsl = bundleContext.getBundle(Constants.SYSTEM_BUNDLE_ID).adapt(FrameworkStartLevel.class);
+        final long initial = fsl.getInitialBundleStartLevel();
+        // get the configured target start level, otherwise use the initial bundle start level
+        this.targetStartLevel = config.target_start_level() > 0 ? config.target_start_level() : initial + 1;
+
+        // overwrite with the value from #target_start_level_prop_name if present
+        final String targetStartLevelKey = config.target_start_level_prop_name();
+        if (null != targetStartLevelKey && !targetStartLevelKey.trim().isEmpty()) {
+            try {
+                this.targetStartLevel = Long.valueOf(bundleContext.getProperty(targetStartLevelKey));
+            } catch (NumberFormatException e) {
+                log.info("Ignoring {} as it can't be parsed: {}", targetStartLevelKey, e.getMessage());
+            }
         } else {
-            this.state = new Status(Status.State.YELLOW, "No OSGi Framework events received so far. " + getFrameworkDetails());
+            log.info("Ignoring target.start.level.prop.name because it's not set.");
         }
+
         log.info("Activated");
     }
 
@@ -84,19 +111,14 @@ public class FrameworkStartCheck impleme
 
     @Override
     public Status getStatus() {
-        return this.state;
-    }
-
-    public void frameworkEvent(FrameworkEvent event) {
-        if (event.getType() == FrameworkEvent.STARTLEVEL_CHANGED) {
-            this.state = new Status(Status.State.YELLOW, getFrameworkDetails());
-        } else if (event.getType() == FrameworkEvent.STARTED) {
-            this.state = new Status(Status.State.GREEN, FRAMEWORK_STARTED);
-        } // TODO: RED on timeout?
-    }
-
-    private String getFrameworkDetails() {
-        FrameworkStartLevel fsl = bundleContext.getBundle(0).adapt(FrameworkStartLevel.class);
-        return String.format("Framework is at start level {} in state {}", fsl.getStartLevel(), fsl.getBundle().getState());
+        Bundle systemBundle = bundleContext.getBundle(Constants.SYSTEM_BUNDLE_ID);
+        FrameworkStartLevel fsl = systemBundle.adapt(FrameworkStartLevel.class);
+        String message = String.format("Start level: %d; Target start level: %d; Framework state: %d",
+                fsl.getStartLevel(), targetStartLevel, fsl.getBundle().getState());
+        if ((systemBundle.getState() == Bundle.ACTIVE) && (fsl.getStartLevel() >= targetStartLevel)) {
+            return new Status(Status.State.GREEN, FRAMEWORK_STARTED + message);
+        } else {
+            return new Status(Status.State.YELLOW, FRAMEWORK_NOT_STARTED + message);
+        }
     }
 }

Modified: felix/trunk/systemready/src/main/java/org/apache/felix/systemready/impl/ServicesCheck.java
URL: http://svn.apache.org/viewvc/felix/trunk/systemready/src/main/java/org/apache/felix/systemready/impl/ServicesCheck.java?rev=1832805&r1=1832804&r2=1832805&view=diff
==============================================================================
--- felix/trunk/systemready/src/main/java/org/apache/felix/systemready/impl/ServicesCheck.java (original)
+++ felix/trunk/systemready/src/main/java/org/apache/felix/systemready/impl/ServicesCheck.java Mon Jun  4 09:18:06 2018
@@ -40,12 +40,14 @@ import org.osgi.service.metatype.annotat
 import org.osgi.service.metatype.annotations.ObjectClassDefinition;
 
 @Component(
-        name = "ServicesCheck",
+        name = ServicesCheck.PID,
         configurationPolicy = ConfigurationPolicy.REQUIRE
 )
 @Designate(ocd=ServicesCheck.Config.class)
 public class ServicesCheck implements SystemReadyCheck {
 
+    public static final String PID = "org.apache.felix.systemready.impl.ServicesCheck";
+
     @ObjectClassDefinition(
             name="Services Registered System Ready Check",
             description="System ready check that waits for a list of services to be registered"

Modified: felix/trunk/systemready/src/main/java/org/apache/felix/systemready/impl/SystemReadyMonitorImpl.java
URL: http://svn.apache.org/viewvc/felix/trunk/systemready/src/main/java/org/apache/felix/systemready/impl/SystemReadyMonitorImpl.java?rev=1832805&r1=1832804&r2=1832805&view=diff
==============================================================================
--- felix/trunk/systemready/src/main/java/org/apache/felix/systemready/impl/SystemReadyMonitorImpl.java (original)
+++ felix/trunk/systemready/src/main/java/org/apache/felix/systemready/impl/SystemReadyMonitorImpl.java Mon Jun  4 09:18:06 2018
@@ -47,7 +47,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Component(
-        name = "SystemReadyMonitor"
+        name = SystemReadyMonitor.PID
 )
 @Designate(ocd = SystemReadyMonitorImpl.Config.class)
 public class SystemReadyMonitorImpl implements SystemReadyMonitor {

Modified: felix/trunk/systemready/src/main/java/org/apache/felix/systemready/impl/servlet/SystemReadyServlet.java
URL: http://svn.apache.org/viewvc/felix/trunk/systemready/src/main/java/org/apache/felix/systemready/impl/servlet/SystemReadyServlet.java?rev=1832805&r1=1832804&r2=1832805&view=diff
==============================================================================
--- felix/trunk/systemready/src/main/java/org/apache/felix/systemready/impl/servlet/SystemReadyServlet.java (original)
+++ felix/trunk/systemready/src/main/java/org/apache/felix/systemready/impl/servlet/SystemReadyServlet.java Mon Jun  4 09:18:06 2018
@@ -46,7 +46,7 @@ import org.slf4j.LoggerFactory;
  * Provide aggregated ready information using a servlet
  */
 @Component(
-        name = "SystemReadyServlet",
+        name = SystemReadyServlet.PID,
         service = Servlet.class,
         property = {
                 HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN + "=" + "/system/console/ready",
@@ -55,6 +55,9 @@ import org.slf4j.LoggerFactory;
 )
 @Designate(ocd=SystemReadyServlet.Config.class)
 public class SystemReadyServlet extends HttpServlet {
+
+    public static final String PID = "org.apache.felix.systemready.impl.servlet.SystemReadyServlet";
+
     private static final long serialVersionUID = 1L;
 
     @ObjectClassDefinition(

Modified: felix/trunk/systemready/src/test/java/org/apache/felix/systemready/osgi/ComponentsCheckTest.java
URL: http://svn.apache.org/viewvc/felix/trunk/systemready/src/test/java/org/apache/felix/systemready/osgi/ComponentsCheckTest.java?rev=1832805&r1=1832804&r2=1832805&view=diff
==============================================================================
--- felix/trunk/systemready/src/test/java/org/apache/felix/systemready/osgi/ComponentsCheckTest.java (original)
+++ felix/trunk/systemready/src/test/java/org/apache/felix/systemready/osgi/ComponentsCheckTest.java Mon Jun  4 09:18:06 2018
@@ -29,6 +29,7 @@ import javax.inject.Inject;
 
 import org.apache.felix.systemready.Status;
 import org.apache.felix.systemready.SystemReadyCheck;
+import org.apache.felix.systemready.impl.ComponentsCheck;
 import org.apache.felix.systemready.osgi.examples.CompWithoutService2;
 import org.apache.felix.systemready.osgi.util.BaseTest;
 import org.apache.felix.systemready.osgi.examples.CompWithoutService;
@@ -46,7 +47,7 @@ import org.osgi.service.cm.Configuration
 public class ComponentsCheckTest extends BaseTest {
 
     @Inject
-    @Filter("(component.name=ComponentsCheck)")
+    @Filter("(component.name=" + ComponentsCheck.PID + ")")
     SystemReadyCheck check;
     
     @Inject

Copied: felix/trunk/systemready/src/test/java/org/apache/felix/systemready/osgi/FrameworkStartTestGreen.java (from r1832804, felix/trunk/systemready/src/test/java/org/apache/felix/systemready/osgi/FrameworkStartTest.java)
URL: http://svn.apache.org/viewvc/felix/trunk/systemready/src/test/java/org/apache/felix/systemready/osgi/FrameworkStartTestGreen.java?p2=felix/trunk/systemready/src/test/java/org/apache/felix/systemready/osgi/FrameworkStartTestGreen.java&p1=felix/trunk/systemready/src/test/java/org/apache/felix/systemready/osgi/FrameworkStartTest.java&r1=1832804&r2=1832805&rev=1832805&view=diff
==============================================================================
--- felix/trunk/systemready/src/test/java/org/apache/felix/systemready/osgi/FrameworkStartTest.java (original)
+++ felix/trunk/systemready/src/test/java/org/apache/felix/systemready/osgi/FrameworkStartTestGreen.java Mon Jun  4 09:18:06 2018
@@ -25,6 +25,7 @@ import javax.inject.Inject;
 
 import org.apache.felix.systemready.Status;
 import org.apache.felix.systemready.SystemReadyCheck;
+import org.apache.felix.systemready.impl.FrameworkStartCheck;
 import org.apache.felix.systemready.osgi.util.BaseTest;
 import org.junit.Assert;
 import org.junit.Test;
@@ -35,17 +36,17 @@ import org.ops4j.pax.exam.junit.PaxExam;
 import org.ops4j.pax.exam.util.Filter;
 
 @RunWith(PaxExam.class)
-public class FrameworkStartTest extends BaseTest {
+public class FrameworkStartTestGreen extends BaseTest {
 
     @Inject
-    @Filter("(component.name=FrameworkStartCheck)")
+    @Filter("(component.name=" + FrameworkStartCheck.PID + ")")
     SystemReadyCheck check;
 
     @Configuration
     public Option[] configuration() {
         return new Option[] {
                 baseConfiguration(),
-                newConfiguration("FrameworkStartCheck")
+                newConfiguration(FrameworkStartCheck.PID)
                         .asOption()
         };
     }

Added: felix/trunk/systemready/src/test/java/org/apache/felix/systemready/osgi/FrameworkStartTestYellow.java
URL: http://svn.apache.org/viewvc/felix/trunk/systemready/src/test/java/org/apache/felix/systemready/osgi/FrameworkStartTestYellow.java?rev=1832805&view=auto
==============================================================================
--- felix/trunk/systemready/src/test/java/org/apache/felix/systemready/osgi/FrameworkStartTestYellow.java (added)
+++ felix/trunk/systemready/src/test/java/org/apache/felix/systemready/osgi/FrameworkStartTestYellow.java Mon Jun  4 09:18:06 2018
@@ -0,0 +1,59 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.felix.systemready.osgi;
+
+import org.apache.felix.systemready.Status;
+import org.apache.felix.systemready.SystemReadyCheck;
+import org.apache.felix.systemready.impl.FrameworkStartCheck;
+import org.apache.felix.systemready.osgi.util.BaseTest;
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.ops4j.pax.exam.Configuration;
+import org.ops4j.pax.exam.Option;
+import org.ops4j.pax.exam.junit.PaxExam;
+import org.ops4j.pax.exam.util.Filter;
+
+import javax.inject.Inject;
+
+import static org.ops4j.pax.exam.cm.ConfigurationAdminOptions.newConfiguration;
+
+@RunWith(PaxExam.class)
+public class FrameworkStartTestYellow extends BaseTest {
+
+    @Inject
+    @Filter("(component.name=" + FrameworkStartCheck.PID + ")")
+    SystemReadyCheck check;
+
+    @Configuration
+    public Option[] configuration() {
+        return new Option[] {
+                baseConfiguration(),
+                newConfiguration(FrameworkStartCheck.PID)
+                        .put("target.start.level", 100)
+                        .asOption()
+        };
+    }
+
+    @Test
+    public void test() {
+        Status status = check.getStatus();
+        Assert.assertEquals(Status.State.YELLOW, status.getState());
+    }
+}

Modified: felix/trunk/systemready/src/test/java/org/apache/felix/systemready/osgi/ServicesCheckTest.java
URL: http://svn.apache.org/viewvc/felix/trunk/systemready/src/test/java/org/apache/felix/systemready/osgi/ServicesCheckTest.java?rev=1832805&r1=1832804&r2=1832805&view=diff
==============================================================================
--- felix/trunk/systemready/src/test/java/org/apache/felix/systemready/osgi/ServicesCheckTest.java (original)
+++ felix/trunk/systemready/src/test/java/org/apache/felix/systemready/osgi/ServicesCheckTest.java Mon Jun  4 09:18:06 2018
@@ -28,6 +28,7 @@ import javax.inject.Inject;
 import org.apache.felix.systemready.SystemReadyCheck;
 import org.apache.felix.systemready.Status;
 import org.apache.felix.systemready.Status.State;
+import org.apache.felix.systemready.impl.ServicesCheck;
 import org.apache.felix.systemready.osgi.util.BaseTest;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -41,7 +42,7 @@ import org.osgi.service.component.runtim
 public class ServicesCheckTest extends BaseTest {
 
     @Inject
-    @Filter("(component.name=ServicesCheck)")
+    @Filter("(component.name=" + ServicesCheck.PID + ")")
     SystemReadyCheck check;
 
     @Configuration

Modified: felix/trunk/systemready/src/test/java/org/apache/felix/systemready/osgi/util/BaseTest.java
URL: http://svn.apache.org/viewvc/felix/trunk/systemready/src/test/java/org/apache/felix/systemready/osgi/util/BaseTest.java?rev=1832805&r1=1832804&r2=1832805&view=diff
==============================================================================
--- felix/trunk/systemready/src/test/java/org/apache/felix/systemready/osgi/util/BaseTest.java (original)
+++ felix/trunk/systemready/src/test/java/org/apache/felix/systemready/osgi/util/BaseTest.java Mon Jun  4 09:18:06 2018
@@ -25,6 +25,11 @@ import static org.ops4j.pax.exam.cm.Conf
 
 import javax.inject.Inject;
 
+import org.apache.felix.systemready.SystemReadyMonitor;
+import org.apache.felix.systemready.impl.ComponentsCheck;
+import org.apache.felix.systemready.impl.FrameworkStartCheck;
+import org.apache.felix.systemready.impl.ServicesCheck;
+import org.apache.felix.systemready.impl.servlet.SystemReadyServlet;
 import org.ops4j.pax.exam.CoreOptions;
 import org.ops4j.pax.exam.Option;
 import org.osgi.framework.BundleContext;
@@ -66,19 +71,19 @@ public class BaseTest {
     }
     
     public Option servicesCheckConfig(String... services) {
-        return newConfiguration("ServicesCheck")
+        return newConfiguration(ServicesCheck.PID)
                 .put("services.list", services)
                 .asOption();
     }
     
     public Option componentsCheckConfig(String... components) {
-        return newConfiguration("ComponentsCheck")
+        return newConfiguration(ComponentsCheck.PID)
                 .put("components.list", components)
                 .asOption();
     }
     
     public Option monitorConfig() {
-        return newConfiguration("SystemReadyMonitor")
+        return newConfiguration(SystemReadyMonitor.PID)
                 .put("poll.interval", 50)
                 .asOption();
     }
@@ -91,7 +96,7 @@ public class BaseTest {
     }
 
     public Option servletConfig(String path) {
-        return newConfiguration("SystemReadyServlet")
+        return newConfiguration(SystemReadyServlet.PID)
                 .put("osgi.http.whiteboard.servlet.pattern", path)
                 .asOption();
     }
@@ -121,7 +126,7 @@ public class BaseTest {
     }
 
     public void disableFrameworkStartCheck() {
-        disableComponent("FrameworkStartCheck");
+        disableComponent(FrameworkStartCheck.PID);
     }
 
 }