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
1 /*
2  * Copyright (c) 2014 Cisco Systems, Inc. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8 package org.opendaylight.controller.configpusherfeature.internal;
9
10 import java.util.ArrayList;
11 import java.util.List;
12 import java.util.concurrent.BlockingQueue;
13 import java.util.concurrent.TimeUnit;
14
15 import org.apache.karaf.features.Feature;
16 import org.apache.karaf.features.FeatureEvent;
17 import org.apache.karaf.features.FeatureEvent.EventType;
18 import org.apache.karaf.features.FeaturesService;
19 import org.opendaylight.controller.config.persist.api.ConfigPusher;
20 import org.slf4j.Logger;
21 import org.slf4j.LoggerFactory;
22
23 import com.google.common.collect.LinkedHashMultimap;
24
25 public class ConfigPushingRunnable implements Runnable {
26     private static final Logger logger = LoggerFactory.getLogger(ConfigPushingRunnable.class);
27     private static final int POLL_TIME = 1;
28     private BlockingQueue<FeatureEvent> queue;
29     private FeatureConfigPusher configPusher;
30     public ConfigPushingRunnable(ConfigPusher p, FeaturesService f,BlockingQueue<FeatureEvent> q) {
31         queue = q;
32         configPusher = new FeatureConfigPusher(p, f);
33     }
34
35     @Override
36     public void run() {
37         List<Feature> toInstall = new ArrayList<Feature>();
38         FeatureEvent event;
39         boolean interuppted = false;
40         while(true) {
41             try {
42                 if(!interuppted) {
43                         if(toInstall.isEmpty()) {
44                             event = queue.take();
45                         } else {
46                             event = queue.poll(POLL_TIME, TimeUnit.MILLISECONDS);
47                         }
48                         if(event != null && event.getFeature() !=null) {
49                             processFeatureEvent(event,toInstall);
50                         }
51                 } else if(toInstall.isEmpty()) {
52                     logger.error("ConfigPushingRunnable - exiting");
53                     return;
54                 }
55             } catch (InterruptedException e) {
56                 logger.error("ConfigPushingRunnable - interupted");
57                 interuppted = true;
58             } catch (Exception e) {
59                 logger.error("Exception while processing features {}", e);
60             }
61         }
62     }
63
64     protected void processFeatureEvent(FeatureEvent event, List<Feature> toInstall) throws InterruptedException, Exception {
65         if(event.getType() == EventType.FeatureInstalled) {
66             toInstall.add(event.getFeature());
67             LinkedHashMultimap<Feature,FeatureConfigSnapshotHolder> result = configPusher.pushConfigs(toInstall);
68             toInstall.removeAll(result.keySet());
69         } else if(event.getType() == EventType.FeatureUninstalled) {
70             toInstall.remove(event.getFeature());
71         }
72     }
73
74     protected void logPushResult(LinkedHashMultimap<Feature,FeatureConfigSnapshotHolder> results) {
75         for(Feature f:results.keySet()) {
76             logger.info("Pushed configs for feature {} {}",f,results.get(f));
77         }
78     }
79 }