killbill-aplcache

nodes: Compute localnode versions earlier so this becomes

3/24/2016 12:29:26 AM

Details

diff --git a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestWithFakeKPMPlugin.java b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestWithFakeKPMPlugin.java
index 4a351ac..4113d01 100644
--- a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestWithFakeKPMPlugin.java
+++ b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestWithFakeKPMPlugin.java
@@ -37,6 +37,7 @@ import org.killbill.billing.notification.plugin.api.ExtBusEvent;
 import org.killbill.billing.notification.plugin.api.ExtBusEventType;
 import org.killbill.billing.osgi.BundleRegistry;
 import org.killbill.billing.osgi.BundleWithConfig;
+import org.killbill.billing.osgi.FileInstall;
 import org.killbill.billing.osgi.PureOSGIBundleFinder;
 import org.killbill.billing.osgi.api.PluginInfo;
 import org.killbill.billing.osgi.api.PluginStateChange;
@@ -50,6 +51,7 @@ import org.killbill.billing.osgi.pluginconf.PluginConfigException;
 import org.killbill.billing.osgi.pluginconf.PluginFinder;
 import org.killbill.billing.platform.api.KillbillConfigSource;
 import org.killbill.billing.util.jackson.ObjectMapper;
+import org.killbill.billing.util.nodes.KillbillNodesApi;
 import org.killbill.billing.util.nodes.NodeCommand;
 import org.killbill.billing.util.nodes.NodeCommandMetadata;
 import org.killbill.billing.util.nodes.NodeCommandProperty;
@@ -223,8 +225,8 @@ public class TestWithFakeKPMPlugin extends TestIntegrationBase {
         private final List<BundleWithMetadata> bundles;
 
         @Inject
-        public FakeBundleRegistry(final PureOSGIBundleFinder osgiBundleFinder, final PluginFinder pluginFinder, final PluginConfigServiceApi pluginConfigServiceApi) {
-            super(osgiBundleFinder, pluginFinder, pluginConfigServiceApi);
+        public FakeBundleRegistry() {
+            super(null);
             bundles = new ArrayList<BundleWithMetadata>();
         }
 
diff --git a/util/src/main/java/org/killbill/billing/util/nodes/DefaultKillbillNodesApi.java b/util/src/main/java/org/killbill/billing/util/nodes/DefaultKillbillNodesApi.java
index 13bcb98..3d097f4 100644
--- a/util/src/main/java/org/killbill/billing/util/nodes/DefaultKillbillNodesApi.java
+++ b/util/src/main/java/org/killbill/billing/util/nodes/DefaultKillbillNodesApi.java
@@ -20,6 +20,8 @@ package org.killbill.billing.util.nodes;
 import java.io.IOException;
 import java.util.List;
 
+import javax.annotation.Nullable;
+
 import org.killbill.CreatorName;
 import org.killbill.billing.broadcast.BroadcastApi;
 import org.killbill.billing.osgi.api.PluginInfo;
@@ -34,6 +36,7 @@ import org.slf4j.LoggerFactory;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.google.common.base.Function;
+import com.google.common.base.Predicate;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Iterables;
 import com.google.inject.Inject;
@@ -47,6 +50,7 @@ public class DefaultKillbillNodesApi implements KillbillNodesApi {
     private final NodeInfoMapper mapper;
     private final Clock clock;
     private final PluginsInfoApi pluginInfoApi;
+    private final Function<NodeInfoModelDao, NodeInfo> nodeTransfomer;
 
     @Inject
     public DefaultKillbillNodesApi(final NodeInfoDao nodeInfoDao, final BroadcastApi broadcastApi, final NodeInfoMapper mapper, final Clock clock, final PluginsInfoApi pluginInfoApi) {
@@ -55,29 +59,35 @@ public class DefaultKillbillNodesApi implements KillbillNodesApi {
         this.pluginInfoApi = pluginInfoApi;
         this.clock = clock;
         this.mapper = mapper;
-    }
-
-    @Override
-    public Iterable<NodeInfo> getNodesInfo() {
-        final List<NodeInfoModelDao> allNodes = nodeInfoDao.getAll();
-
-        final Iterable<NodeInfoModelJson> allModelNodes = Iterables.transform(allNodes, new Function<NodeInfoModelDao, NodeInfoModelJson>() {
+        this.nodeTransfomer = new Function<NodeInfoModelDao, NodeInfo>() {
             @Override
-            public NodeInfoModelJson apply(final NodeInfoModelDao input) {
+            public NodeInfo apply(final NodeInfoModelDao input) {
                 try {
-                    return mapper.deserializeNodeInfo(input.getNodeInfo());
-                } catch (IOException e) {
+                    final NodeInfoModelJson nodeInfoModelJson = mapper.deserializeNodeInfo(input.getNodeInfo());
+                    return new DefaultNodeInfo(nodeInfoModelJson);
+                } catch (final IOException e) {
                     throw new RuntimeException(e);
                 }
             }
-        });
+        };
+    }
+
+    @Override
+    public Iterable<NodeInfo> getNodesInfo() {
+        final List<NodeInfoModelDao> allNodes = nodeInfoDao.getAll();
+        return Iterables.transform(allNodes, nodeTransfomer);
+    }
 
-        return Iterables.transform(allModelNodes, new Function<NodeInfoModelJson, NodeInfo>() {
+    @Override
+    public NodeInfo getCurrentNodeInfo() {
+        final List<NodeInfoModelDao> allNodes = nodeInfoDao.getAll();
+        final NodeInfoModelDao current = Iterables.find(allNodes, new Predicate<NodeInfoModelDao>() {
             @Override
-            public NodeInfo apply(final NodeInfoModelJson input) {
-                return new DefaultNodeInfo(input);
+            public boolean apply(final NodeInfoModelDao input) {
+                return input.getNodeName().equals(CreatorName.get());
             }
         });
+        return nodeTransfomer.apply(current);
     }
 
     @Override
diff --git a/util/src/main/java/org/killbill/billing/util/nodes/DefaultKillbillNodesService.java b/util/src/main/java/org/killbill/billing/util/nodes/DefaultKillbillNodesService.java
index a5b2a74..6236bb3 100644
--- a/util/src/main/java/org/killbill/billing/util/nodes/DefaultKillbillNodesService.java
+++ b/util/src/main/java/org/killbill/billing/util/nodes/DefaultKillbillNodesService.java
@@ -66,10 +66,22 @@ public class DefaultKillbillNodesService implements KillbillNodesService {
         return NODES_SERVICE_NAME;
     }
 
-    @LifecycleHandlerType(LifecycleHandlerType.LifecycleLevel.START_SERVICE)
+    @LifecycleHandlerType(LifecycleLevel.BOOT)
+    public void init() {
+        try {
+            // Compute a first version early on before plugins were installed to at least provide info about Kill Bill component versions
+            createBootNodeInfo(true);
+        } catch (JsonProcessingException e) {
+            logger.error("Failed to create bootNodeInfo", e);
+        }
+    }
+
+
+    @LifecycleHandlerType(LifecycleLevel.START_SERVICE)
     public void start() {
         try {
-            createBootNodeInfo();
+            // Re-Compute including the plugins
+            createBootNodeInfo(false);
         } catch (JsonProcessingException e) {
             logger.error("Failed to create bootNodeInfo", e);
         }
@@ -80,10 +92,10 @@ public class DefaultKillbillNodesService implements KillbillNodesService {
         nodeInfoDao.delete(CreatorName.get());
     }
 
-    private void createBootNodeInfo() throws JsonProcessingException {
+    private void createBootNodeInfo(final boolean skipPlugins) throws JsonProcessingException {
 
         final DateTime bootTime = clock.getUTCNow();
-        final Iterable<PluginInfo> rawPluginInfo = pluginInfoApi.getPluginsInfo();
+        final Iterable<PluginInfo> rawPluginInfo = skipPlugins ? ImmutableList.<PluginInfo>of() : pluginInfoApi.getPluginsInfo();
         final List<PluginInfo> pluginInfo = rawPluginInfo.iterator().hasNext() ? ImmutableList.<PluginInfo>copyOf(rawPluginInfo) : ImmutableList.<PluginInfo>of();
         final String kbVersion = org.killbill.billing.util.nodes.KillbillVersions.getKillbillVersion();
         final String kbApiVersion  = org.killbill.billing.util.nodes.KillbillVersions.getApiVersion();