fixes for Meter Service

Change-Id: I83d5b8a2e0a955c050f7afe96761d5709d4f9f18
diff --git a/incubator/net/src/main/java/org/onosproject/incubator/net/meter/impl/MeterManager.java b/incubator/net/src/main/java/org/onosproject/incubator/net/meter/impl/MeterManager.java
index a0c1dfc..4e75301 100644
--- a/incubator/net/src/main/java/org/onosproject/incubator/net/meter/impl/MeterManager.java
+++ b/incubator/net/src/main/java/org/onosproject/incubator/net/meter/impl/MeterManager.java
@@ -52,7 +52,7 @@
 /**
  * Provides implementation of the meter service APIs.
  */
-@Component(immediate = true)
+@Component(immediate = true, enabled = true)
 @Service
 public class MeterManager extends AbstractListenerProviderRegistry<MeterEvent, MeterListener,
         MeterProvider, MeterProviderService>
@@ -66,7 +66,7 @@
     protected StorageService storageService;
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    MeterStore store;
+    protected MeterStore store;
 
     private AtomicCounter meterIdCounter;
 
@@ -78,6 +78,8 @@
                 .withName(meterIdentifier)
                 .build();
 
+        store.setDelegate(delegate);
+
         onComplete = (op, result, error) ->
             {
                 op.context().ifPresent(c -> {
@@ -98,6 +100,7 @@
 
     @Deactivate
     public void deactivate() {
+        store.unsetDelegate(delegate);
         log.info("Stopped");
     }
 
@@ -136,6 +139,11 @@
     }
 
     @Override
+    public Collection<Meter> getAllMeters() {
+        return store.getAllMeters();
+    }
+
+    @Override
     public MeterId allocateMeterId() {
         // FIXME: This will break one day.
         return MeterId.meterId((int) meterIdCounter.getAndIncrement());
diff --git a/incubator/store/src/main/java/org/onosproject/incubator/store/meter/impl/DistributedMeterStore.java b/incubator/store/src/main/java/org/onosproject/incubator/store/meter/impl/DistributedMeterStore.java
index ed7c9bf..bc8456e 100644
--- a/incubator/store/src/main/java/org/onosproject/incubator/store/meter/impl/DistributedMeterStore.java
+++ b/incubator/store/src/main/java/org/onosproject/incubator/store/meter/impl/DistributedMeterStore.java
@@ -18,11 +18,16 @@
 import com.google.common.collect.Collections2;
 import com.google.common.collect.Maps;
 import org.apache.felix.scr.annotations.Activate;
+import org.apache.felix.scr.annotations.Component;
 import org.apache.felix.scr.annotations.Deactivate;
 import org.apache.felix.scr.annotations.Reference;
 import org.apache.felix.scr.annotations.ReferenceCardinality;
+import org.apache.felix.scr.annotations.Service;
 import org.onosproject.cluster.ClusterService;
 import org.onosproject.cluster.NodeId;
+import org.onosproject.mastership.MastershipService;
+import org.onosproject.net.meter.Band;
+import org.onosproject.net.meter.DefaultBand;
 import org.onosproject.net.meter.DefaultMeter;
 import org.onosproject.net.meter.Meter;
 import org.onosproject.net.meter.MeterEvent;
@@ -33,7 +38,6 @@
 import org.onosproject.net.meter.MeterStore;
 import org.onosproject.net.meter.MeterStoreDelegate;
 import org.onosproject.net.meter.MeterStoreResult;
-import org.onosproject.mastership.MastershipService;
 import org.onosproject.store.AbstractStore;
 import org.onosproject.store.serializers.KryoNamespaces;
 import org.onosproject.store.service.ConsistentMap;
@@ -56,6 +60,8 @@
  * A distributed meter store implementation. Meters are stored consistently
  * across the cluster.
  */
+@Component(immediate = true)
+@Service
 public class DistributedMeterStore extends AbstractStore<MeterEvent, MeterStoreDelegate>
                     implements MeterStore {
 
@@ -89,8 +95,14 @@
         meters = storageService.<MeterId, MeterData>consistentMapBuilder()
                     .withName(METERSTORE)
                     .withSerializer(Serializer.using(Arrays.asList(KryoNamespaces.API),
-                                                     MeterData.class))
-                    .build();
+                                                     MeterData.class,
+                                                     DefaultMeter.class,
+                                                     DefaultBand.class,
+                                                     Band.Type.class,
+                                                     MeterState.class,
+                                                     Meter.Unit.class,
+                                                     MeterFailReason.class,
+                                                     MeterId.class)).build();
 
         meters.addListener(mapListener);
 
@@ -205,13 +217,13 @@
                                 } else if (data.reason().isPresent() && local.equals(data.origin())) {
                                     MeterStoreResult msr = MeterStoreResult.fail(data.reason().get());
                                     //TODO: No future -> no friend
-                                    futures.get(data.meter().id()).complete(msr);
+                                    futures.remove(data.meter().id()).complete(msr);
                                 }
                                 break;
                             case ADDED:
                             case REMOVED:
                                 if (local.equals(data.origin())) {
-                                    futures.get(data.meter().id()).complete(MeterStoreResult.success());
+                                    futures.remove(data.meter().id()).complete(MeterStoreResult.success());
                                 }
                                 break;
                             default: