Fixed as per comments group and meter
[controller.git] / opendaylight / md-sal / forwardingrules-manager / src / main / java / org / opendaylight / controller / forwardingrulesmanager / consumer / impl / MeterConsumerImpl.java
index 7f7db3ba58ccb8d142c91a5b2c679f56213a70c6..aa9d572d79724b27031b3aaa31193ec6d9d2577c 100644 (file)
@@ -2,6 +2,7 @@ package org.opendaylight.controller.forwardingrulesmanager.consumer.impl;
 
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.EnumSet;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -33,10 +34,12 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.Add
 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.MeterAdded;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.MeterRemoved;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.MeterUpdated;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.RemoveMeterInputBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.SalMeterListener;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.SalMeterService;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.UpdateMeterInputBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.meter.update.UpdatedMeterBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.band.type.BandType;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.band.type.band.type.Drop;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.band.type.band.type.DscpRemark;
@@ -45,6 +48,7 @@ import org.opendaylight.yangtools.concepts.Registration;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.binding.NotificationListener;
+import org.opendaylight.yangtools.yang.common.RpcError;
 import org.opendaylight.yangtools.yang.common.RpcResult;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -57,20 +61,20 @@ public class MeterConsumerImpl implements IForwardingRulesManager {
     private MeterDataCommitHandler commitHandler;
 
     private ConcurrentMap<MeterKey, Meter> originalSwMeterView;
+    @SuppressWarnings("unused")
     private ConcurrentMap<MeterKey, Meter> installedSwMeterView;
-
+    @SuppressWarnings("unused")
     private ConcurrentMap<Node, List<Meter>> nodeMeters;
+    @SuppressWarnings("unused")
     private ConcurrentMap<MeterKey, Meter> inactiveMeters;
-
-    private IClusterContainerServices clusterMeterContainerService = null;
+    @SuppressWarnings("unused")
     private IContainer container;
+    private IClusterContainerServices clusterMeterContainerService = null;    
 
     public MeterConsumerImpl() {
-        InstanceIdentifier<? extends DataObject> path = InstanceIdentifier.builder().node(Meters.class)
-                .node(Meter.class).toInstance();
+        InstanceIdentifier<? extends DataObject> path = InstanceIdentifier.builder(Meters.class).toInstance();
         meterService = FRMConsumerImpl.getProviderSession().getRpcService(SalMeterService.class);
         clusterMeterContainerService = FRMConsumerImpl.getClusterContainerService();
-
         container = FRMConsumerImpl.getContainer();
 
         if (!(cacheStartup())) {
@@ -208,22 +212,16 @@ public class MeterConsumerImpl implements IForwardingRulesManager {
      */
     private Status addMeter(InstanceIdentifier<?> path, Meter meterAddDataObject) {
         MeterKey meterKey = meterAddDataObject.getKey();
-
-        if (null != meterKey && validateMeter(meterAddDataObject, FRMUtil.operation.ADD).isSuccess()) {
-            if (meterAddDataObject.isInstall()) {
-                AddMeterInputBuilder meterBuilder = new AddMeterInputBuilder();
-
-                meterBuilder.setContainerName(meterAddDataObject.getContainerName());
-                meterBuilder.setFlags(meterAddDataObject.getFlags());
-                meterBuilder.setMeterBandHeaders(meterAddDataObject.getMeterBandHeaders());
-                meterBuilder.setMeterId(meterAddDataObject.getMeterId());
-                meterBuilder.setNode(meterAddDataObject.getNode());
-                originalSwMeterView.put(meterKey, meterAddDataObject);
-                meterService.addMeter(meterBuilder.build());
-            }
-
-            originalSwMeterView.put(meterKey, meterAddDataObject);
-        } else {
+        
+        if (null != meterKey && validateMeter(meterAddDataObject, FRMUtil.operation.ADD).isSuccess()) {                 
+            AddMeterInputBuilder meterBuilder = new AddMeterInputBuilder();
+            meterBuilder.setContainerName(meterAddDataObject.getContainerName());
+            meterBuilder.setFlags(meterAddDataObject.getFlags());
+            meterBuilder.setMeterBandHeaders(meterAddDataObject.getMeterBandHeaders());
+            meterBuilder.setMeterId(new MeterId(meterAddDataObject.getId()));
+            meterBuilder.setNode(meterAddDataObject.getNode());           
+            meterService.addMeter(meterBuilder.build());
+        } else {       
             return new Status(StatusCode.BADREQUEST, "Meter Key or attribute validation failed");
         }
 
@@ -240,28 +238,12 @@ public class MeterConsumerImpl implements IForwardingRulesManager {
     private Status updateMeter(InstanceIdentifier<?> path, Meter meterUpdateDataObject) {
         MeterKey meterKey = meterUpdateDataObject.getKey();
         UpdatedMeterBuilder updateMeterBuilder = null;
-
-        if (null != meterKey && validateMeter(meterUpdateDataObject, FRMUtil.operation.UPDATE).isSuccess()) {
-
-            if (originalSwMeterView.containsKey(meterKey)) {
-                originalSwMeterView.remove(meterKey);
-                originalSwMeterView.put(meterKey, meterUpdateDataObject);
-            }
-
-            if (meterUpdateDataObject.isInstall()) {
-                UpdateMeterInputBuilder updateMeterInputBuilder = new UpdateMeterInputBuilder();
-                updateMeterBuilder = new UpdatedMeterBuilder();
-                updateMeterBuilder.fieldsFrom(meterUpdateDataObject);
-                updateMeterInputBuilder.setUpdatedMeter(updateMeterBuilder.build());
-
-                if (installedSwMeterView.containsKey(meterKey)) {
-                    installedSwMeterView.remove(meterKey);
-                    installedSwMeterView.put(meterKey, meterUpdateDataObject);
-                }
-
-                meterService.updateMeter(updateMeterInputBuilder.build());
-            }
-
+        
+        if (null != meterKey && validateMeter(meterUpdateDataObject, FRMUtil.operation.UPDATE).isSuccess()) {                UpdateMeterInputBuilder updateMeterInputBuilder = new UpdateMeterInputBuilder();
+            updateMeterBuilder = new UpdatedMeterBuilder();
+            updateMeterBuilder.fieldsFrom(meterUpdateDataObject);
+            updateMeterInputBuilder.setUpdatedMeter(updateMeterBuilder.build());
+            meterService.updateMeter(updateMeterInputBuilder.build());
         } else {
             return new Status(StatusCode.BADREQUEST, "Meter Key or attribute validation failed");
         }
@@ -276,18 +258,18 @@ public class MeterConsumerImpl implements IForwardingRulesManager {
      *
      * @param dataObject
      */
-    private Status RemoveMeter(InstanceIdentifier<?> path, Meter meterUpdateDataObject) {
-        MeterKey meterKey = meterUpdateDataObject.getKey();
-
-        if (null != meterKey && validateMeter(meterUpdateDataObject, FRMUtil.operation.ADD).isSuccess()) {
-            if (meterUpdateDataObject.isInstall()) {
-                UpdateMeterInputBuilder updateMeterBuilder = new UpdateMeterInputBuilder();
-
-                installedSwMeterView.put(meterKey, meterUpdateDataObject);
-                meterService.updateMeter(updateMeterBuilder.build());
-            }
-
-            originalSwMeterView.put(meterKey, meterUpdateDataObject);
+    private Status removeMeter(InstanceIdentifier<?> path, Meter meterRemoveDataObject) {
+        MeterKey meterKey = meterRemoveDataObject.getKey();
+
+        if (null != meterKey && validateMeter(meterRemoveDataObject, FRMUtil.operation.DELETE).isSuccess()) {            
+            RemoveMeterInputBuilder meterBuilder = new RemoveMeterInputBuilder();
+            meterBuilder.setContainerName(meterRemoveDataObject.getContainerName());
+            meterBuilder.setNode(meterRemoveDataObject.getNode());
+            meterBuilder.setFlags(meterRemoveDataObject.getFlags());
+            meterBuilder.setMeterBandHeaders(meterRemoveDataObject.getMeterBandHeaders());
+            meterBuilder.setMeterId(meterRemoveDataObject.getMeterId());
+            meterBuilder.setNode(meterRemoveDataObject.getNode());        
+            meterService.removeMeter(meterBuilder.build());
         } else {
             return new Status(StatusCode.BADREQUEST, "Meter Key or attribute validation failed");
         }
@@ -299,7 +281,6 @@ public class MeterConsumerImpl implements IForwardingRulesManager {
         String containerName;
         String meterName;
         Status returnStatus = null;
-        boolean returnResult;
 
         if (null != meter) {
             containerName = meter.getContainerName();
@@ -319,18 +300,6 @@ public class MeterConsumerImpl implements IForwardingRulesManager {
                 return returnStatus;
             }
 
-            returnResult = doesMeterEntryExists(meter.getKey(), meterName, containerName);
-
-            if (FRMUtil.operation.ADD == operation && returnResult) {
-                logger.error("Record with same Meter Name exists");
-                returnStatus = new Status(StatusCode.BADREQUEST, "Meter record exists");
-                return returnStatus;
-            } else if (!returnResult) {
-                logger.error("Group record does not exist");
-                returnStatus = new Status(StatusCode.BADREQUEST, "Meter record does not exist");
-                return returnStatus;
-            }
-
             for (int i = 0; i < meter.getMeterBandHeaders().getMeterBandHeader().size(); i++) {
                 if (!meter.getFlags().isMeterBurst()) {
                     if (0 < meter.getMeterBandHeaders().getMeterBandHeader().get(i).getBurstSize()) {
@@ -367,47 +336,7 @@ public class MeterConsumerImpl implements IForwardingRulesManager {
         return new Status(StatusCode.SUCCESS);
     }
 
-    private boolean doesMeterEntryExists(MeterKey key, String meterName, String containerName) {
-        if (!originalSwMeterView.containsKey(key)) {
-            return false;
-        }
-
-        for (Entry<MeterKey, Meter> entry : originalSwMeterView.entrySet()) {
-            if (entry.getValue().getMeterName().equals(meterName)) {
-                if (entry.getValue().getContainerName().equals(containerName)) {
-                    return true;
-                }
-            }
-        }
-        return false;
-    }
-
-    private RpcResult<Void> commitToPlugin(internalTransaction transaction) {
-        for (Entry<InstanceIdentifier<?>, Meter> entry : transaction.additions.entrySet()) {
-
-            if (!addMeter(entry.getKey(), entry.getValue()).isSuccess()) {
-                return Rpcs.getRpcResult(false, null, null);
-            }
-        }
-        for (@SuppressWarnings("unused")
-        Entry<InstanceIdentifier<?>, Meter> entry : transaction.updates.entrySet()) {
-
-            if (!updateMeter(entry.getKey(), entry.getValue()).isSuccess()) {
-                return Rpcs.getRpcResult(false, null, null);
-            }
-        }
-
-        for (InstanceIdentifier<?> removal : transaction.removals) {
-            /*
-             * if (!removeMeter(entry.getKey(),entry.getValue()).isSuccess()) {
-             * return Rpcs.getRpcResult(false, null, null); }
-             */
-        }
-
-        return Rpcs.getRpcResult(true, null, null);
-    }
-
-    private final class internalTransaction implements DataCommitTransaction<InstanceIdentifier<?>, DataObject> {
+    final class InternalTransaction implements DataCommitTransaction<InstanceIdentifier<?>, DataObject> {
 
         private final DataModification<InstanceIdentifier<?>, DataObject> modification;
 
@@ -416,7 +345,7 @@ public class MeterConsumerImpl implements IForwardingRulesManager {
             return modification;
         }
 
-        public internalTransaction(DataModification<InstanceIdentifier<?>, DataObject> modification) {
+        public InternalTransaction(DataModification<InstanceIdentifier<?>, DataObject> modification) {
             this.modification = modification;
         }
 
@@ -430,33 +359,30 @@ public class MeterConsumerImpl implements IForwardingRulesManager {
          *
          */
         void prepareUpdate() {
-
-            Set<Entry<InstanceIdentifier<?>, DataObject>> puts = modification.getUpdatedConfigurationData().entrySet();
-            for (Entry<InstanceIdentifier<?>, DataObject> entry : puts) {
+            
+            Set<Entry<InstanceIdentifier<?>, DataObject>> addMeter = modification.getCreatedConfigurationData().entrySet();
+            for (Entry<InstanceIdentifier<?>, DataObject> entry : addMeter) {
                 if (entry.getValue() instanceof Meter) {
-                    Meter Meter = (Meter) entry.getValue();
-                    preparePutEntry(entry.getKey(), Meter);
+                    Meter meter = (Meter) entry.getValue();
+                    additions.put(entry.getKey(), meter);                    
                 }
 
             }
+            
+            Set<Entry<InstanceIdentifier<?>, DataObject>> updateMeter = modification.getUpdatedConfigurationData().entrySet();
+            for (Entry<InstanceIdentifier<?>, DataObject> entry : updateMeter) {
+                if (entry.getValue() instanceof Meter) {
+                    Meter meter = (Meter) entry.getValue();
+                  ///will be fixed once getUpdatedConfigurationData returns only updated data not created data with it.
+                    if (!additions.containsKey(entry.getKey())) {
+                       updates.put(entry.getKey(), meter);       
+                    }
+                }
+            }
 
             removals = modification.getRemovedConfigurationData();
         }
 
-        private void preparePutEntry(InstanceIdentifier<?> key, Meter meter) {
-
-            Meter original = originalSwMeterView.get(key);
-            if (original != null) {
-                // It is update for us
-
-                updates.put(key, meter);
-            } else {
-                // It is addition for us
-
-                additions.put(key, meter);
-            }
-        }
-
         /**
          * We are OK to go with execution of plan
          *
@@ -480,10 +406,37 @@ public class MeterConsumerImpl implements IForwardingRulesManager {
             // NOOP - we did not modified any internal state during
             // requestCommit phase
             // return Rpcs.getRpcResult(true, null, Collections.emptySet());
-            return Rpcs.getRpcResult(true, null, null);
+            return Rpcs.getRpcResult(true, null, Collections.<RpcError>emptySet());
+
+        }
+
+    }
+    
+    private RpcResult<Void> commitToPlugin(InternalTransaction transaction) {
+        for (Entry<InstanceIdentifier<?>, Meter> entry : transaction.additions.entrySet()) {
+
+            if (!addMeter(entry.getKey(), entry.getValue()).isSuccess()) {
+                return Rpcs.getRpcResult(false, null, Collections.<RpcError>emptySet());
+            }
+        }
+        for (Entry<InstanceIdentifier<?>, Meter> entry : transaction.updates.entrySet()) {
+
+            if (!updateMeter(entry.getKey(), entry.getValue()).isSuccess()) {
+                return Rpcs.getRpcResult(false, null, Collections.<RpcError>emptySet());
+            }
+        }
 
+        for (InstanceIdentifier<?> meterId : transaction.removals) {
+            DataObject removeValue = transaction.getModification().getOriginalConfigurationData().get(meterId);        
+                
+                if(removeValue instanceof Meter) {
+                    if(!removeMeter(meterId, (Meter)removeValue).isSuccess()) {
+                        return Rpcs.getRpcResult(false, null, Collections.<RpcError>emptySet());
+                        }
+                }    
         }
 
+        return Rpcs.getRpcResult(true, null, Collections.<RpcError>emptySet());
     }
 
     private final class MeterDataCommitHandler implements DataCommitHandler<InstanceIdentifier<?>, DataObject> {
@@ -491,8 +444,7 @@ public class MeterConsumerImpl implements IForwardingRulesManager {
         public org.opendaylight.controller.md.sal.common.api.data.DataCommitHandler.DataCommitTransaction<InstanceIdentifier<?>, DataObject> requestCommit(
                 DataModification<InstanceIdentifier<?>, DataObject> modification) {
             // We should verify transaction
-            System.out.println("Coming in MeterDataCommitHandler");
-            internalTransaction transaction = new internalTransaction(modification);
+            InternalTransaction transaction = new InternalTransaction(modification);
             transaction.prepareUpdate();
             return transaction;
         }
@@ -546,6 +498,7 @@ public class MeterConsumerImpl implements IForwardingRulesManager {
                 }
             }
         }
+        
         return null;
     }
 }