config-persister-feature-adapter to push configs from karaf features
[controller.git] / opendaylight / config / config-persister-feature-adapter / src / main / java / org / opendaylight / controller / configpusherfeature / internal / ConfigPushingRunnable.java
diff --git a/opendaylight/config/config-persister-feature-adapter/src/main/java/org/opendaylight/controller/configpusherfeature/internal/ConfigPushingRunnable.java b/opendaylight/config/config-persister-feature-adapter/src/main/java/org/opendaylight/controller/configpusherfeature/internal/ConfigPushingRunnable.java
new file mode 100644 (file)
index 0000000..06c5c92
--- /dev/null
@@ -0,0 +1,79 @@
+/*
+ * Copyright (c) 2014 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.controller.configpusherfeature.internal;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.karaf.features.Feature;
+import org.apache.karaf.features.FeatureEvent;
+import org.apache.karaf.features.FeatureEvent.EventType;
+import org.apache.karaf.features.FeaturesService;
+import org.opendaylight.controller.config.persist.api.ConfigPusher;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.collect.LinkedHashMultimap;
+
+public class ConfigPushingRunnable implements Runnable {
+    private static final Logger logger = LoggerFactory.getLogger(ConfigPushingRunnable.class);
+    private static final int POLL_TIME = 1;
+    private BlockingQueue<FeatureEvent> queue;
+    private FeatureConfigPusher configPusher;
+    public ConfigPushingRunnable(ConfigPusher p, FeaturesService f,BlockingQueue<FeatureEvent> q) {
+        queue = q;
+        configPusher = new FeatureConfigPusher(p, f);
+    }
+
+    @Override
+    public void run() {
+        List<Feature> toInstall = new ArrayList<Feature>();
+        FeatureEvent event;
+        boolean interuppted = false;
+        while(true) {
+            try {
+                if(!interuppted) {
+                        if(toInstall.isEmpty()) {
+                            event = queue.take();
+                        } else {
+                            event = queue.poll(POLL_TIME, TimeUnit.MILLISECONDS);
+                        }
+                        if(event != null && event.getFeature() !=null) {
+                            processFeatureEvent(event,toInstall);
+                        }
+                } else if(toInstall.isEmpty()) {
+                    logger.error("ConfigPushingRunnable - exiting");
+                    return;
+                }
+            } catch (InterruptedException e) {
+                logger.error("ConfigPushingRunnable - interupted");
+                interuppted = true;
+            } catch (Exception e) {
+                logger.error("Exception while processing features {}", e);
+            }
+        }
+    }
+
+    protected void processFeatureEvent(FeatureEvent event, List<Feature> toInstall) throws InterruptedException, Exception {
+        if(event.getType() == EventType.FeatureInstalled) {
+            toInstall.add(event.getFeature());
+            LinkedHashMultimap<Feature,FeatureConfigSnapshotHolder> result = configPusher.pushConfigs(toInstall);
+            toInstall.removeAll(result.keySet());
+        } else if(event.getType() == EventType.FeatureUninstalled) {
+            toInstall.remove(event.getFeature());
+        }
+    }
+
+    protected void logPushResult(LinkedHashMultimap<Feature,FeatureConfigSnapshotHolder> results) {
+        for(Feature f:results.keySet()) {
+            logger.info("Pushed configs for feature {} {}",f,results.get(f));
+        }
+    }
+}