Initial implementation of Meter Service (needs testing)

Change-Id: Ie07bd3e2bd7c67a6499c965d8926eb361ad16462

store impl started

Change-Id: Ib8b474f40dcecff335a421c12ad149fe9830c427

full implementation

Change-Id: Ie59fd61d02972bd04d887bdcca9745793b880681
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 6039247..b0726d6 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
@@ -21,6 +21,7 @@
 import org.apache.felix.scr.annotations.Reference;
 import org.apache.felix.scr.annotations.ReferenceCardinality;
 import org.apache.felix.scr.annotations.Service;
+import org.onosproject.incubator.net.meter.DefaultMeter;
 import org.onosproject.incubator.net.meter.Meter;
 import org.onosproject.incubator.net.meter.MeterEvent;
 import org.onosproject.incubator.net.meter.MeterFailReason;
@@ -31,6 +32,8 @@
 import org.onosproject.incubator.net.meter.MeterProviderRegistry;
 import org.onosproject.incubator.net.meter.MeterProviderService;
 import org.onosproject.incubator.net.meter.MeterService;
+import org.onosproject.incubator.net.meter.MeterState;
+import org.onosproject.incubator.net.meter.MeterStore;
 import org.onosproject.incubator.net.meter.MeterStoreDelegate;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.provider.AbstractListenerProviderRegistry;
@@ -41,6 +44,7 @@
 
 import java.util.Collection;
 
+import static com.google.common.base.Preconditions.checkNotNull;
 import static org.slf4j.LoggerFactory.getLogger;
 
 
@@ -60,6 +64,9 @@
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected StorageService storageService;
 
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    MeterStore store;
+
     private AtomicCounter meterIdCounter;
 
     @Activate
@@ -82,27 +89,35 @@
 
     @Override
     public void addMeter(Meter meter) {
-
+        DefaultMeter m = (DefaultMeter) meter;
+        m.setState(MeterState.PENDING_ADD);
+        store.storeMeter(m);
     }
 
     @Override
     public void updateMeter(Meter meter) {
-
+        DefaultMeter m = (DefaultMeter) meter;
+        m.setState(MeterState.PENDING_ADD);
+        store.updateMeter(m);
     }
 
     @Override
     public void removeMeter(Meter meter) {
-
+        DefaultMeter m = (DefaultMeter) meter;
+        m.setState(MeterState.PENDING_REMOVE);
+        store.deleteMeter(m);
     }
 
     @Override
     public void removeMeter(MeterId id) {
-
+        DefaultMeter meter = (DefaultMeter) store.getMeter(id);
+        checkNotNull(meter, "No such meter {}", id);
+        removeMeter(meter);
     }
 
     @Override
     public Meter getMeter(MeterId id) {
-        return null;
+        return store.getMeter(id);
     }
 
     @Override
@@ -125,13 +140,14 @@
         }
 
         @Override
-        public void meterOperationFailed(MeterOperation operation, MeterFailReason reason) {
-
+        public void meterOperationFailed(MeterOperation operation,
+                                         MeterFailReason reason) {
+            store.failedMeter(operation, reason);
         }
 
         @Override
         public void pushMeterMetrics(DeviceId deviceId, Collection<Meter> meterEntries) {
-
+            meterEntries.forEach(m -> store.updateMeterState(m));
         }
     }
 
@@ -139,6 +155,21 @@
 
         @Override
         public void notify(MeterEvent event) {
+            DeviceId deviceId = event.subject().meter().deviceId();
+            MeterProvider p = getProvider(event.subject().meter().deviceId());
+            switch (event.type()) {
+                case METER_UPDATED:
+                    break;
+                case METER_OP_FAILED:
+                    event.subject().meter().context().ifPresent(c ->
+                        c.onError(event.subject(), event.reason()));
+                    break;
+                case METER_OP_REQ:
+                    p.performMeterOperation(deviceId, event.subject());
+                    break;
+                default:
+                    log.warn("Unknown meter event {}", event.type());
+            }
 
         }
     }