Merge "Config-netconf: Remove unnecessary capability advertistments from hello message"
authorEd Warnicke <eaw@cisco.com>
Sat, 16 Nov 2013 05:10:21 +0000 (05:10 +0000)
committerGerrit Code Review <gerrit@opendaylight.org>
Sat, 16 Nov 2013 05:10:21 +0000 (05:10 +0000)
12 files changed:
opendaylight/forwardingrulesmanager_mdsal/openflow/src/main/java/org/opendaylight/controller/forwardingrulesmanager_mdsal/consumer/impl/FRMUtil.java
opendaylight/md-sal/compatibility/sal-compatibility/src/main/java/org/opendaylight/controller/sal/compatibility/MDFlowMapping.xtend
opendaylight/md-sal/compatibility/sal-compatibility/src/main/java/org/opendaylight/controller/sal/compatibility/ToSalConversionsUtils.java
opendaylight/md-sal/compatibility/sal-compatibility/src/test/java/org/opendaylight/controller/sal/compatibility/test/TestToSalConversionsUtils.java
opendaylight/md-sal/model/model-flow-base/src/main/yang/action-types.yang
opendaylight/md-sal/model/model-flow-base/src/main/yang/flow-types.yang
opendaylight/md-sal/model/model-flow-statistics/src/main/yang/group-statistics.yang
opendaylight/md-sal/model/model-flow-statistics/src/main/yang/meter-statistics.yang
opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/NodeStatistics.java [new file with mode: 0644]
opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/StatisticsProvider.java
opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/StatisticsUpdateCommiter.java
opendaylight/northbound/java-client/pom.xml

index 4acaf7b26e8179e2152b01e8b0ffcdfc6b329cf3..9f186642841ea418622bd280875390dfe89c58b2 100644 (file)
@@ -127,7 +127,7 @@ public class FRMUtil {
                 }
             } else if (action instanceof OutputAction) {
                 Integer length = ((OutputAction) action).getMaxLength();
-                List<Uri> outputnodeconnector = ((OutputAction) action).getOutputNodeConnector();
+                Uri outputnodeconnector = ((OutputAction) action).getOutputNodeConnector();
                 if (length < 0 || length > 65294) {
                     logger.error("OutputAction: MaxLength is not valid");
                     return false;
index 5dd149a99738f2b33fa9e9b024861ee56286835c..1e33481e70a7dae49b1646014f77d422f50648cf 100644 (file)
@@ -190,7 +190,7 @@ public class MDFlowMapping {
     public static dispatch def toAction(Output sourceAction) {
         val actionBuilder = new ActionBuilder();
         val it = new OutputActionBuilder();
-        outputNodeConnector = sourceAction.port.toUriList;
+        outputNodeConnector = sourceAction.port.toUri;
         actionBuilder.action = it.build();
         return actionBuilder.build();
 
@@ -331,7 +331,7 @@ public class MDFlowMapping {
         return it.build()
     }
 
-    public static def List<Uri> toUriList(NodeConnector connector) {
+    public static def Uri toUri(NodeConnector connector) {
         throw new UnsupportedOperationException("TODO: auto-generated method stub")
     }
 
index 96b69618b0db78031a3bf20e2796af99ea42bef2..064b920640fb970afc49c5034554800d6b80f389 100644 (file)
@@ -166,11 +166,11 @@ public class ToSalConversionsUtils {
                 targetAction.add(new Controller());
             } else if (sourceAction instanceof OutputAction) {
 
-                List<Uri> nodeConnectors = ((OutputAction) sourceAction).getOutputNodeConnector();
-                if (nodeConnectors != null) {
-                    for (Uri uri : nodeConnectors) {
-                        targetAction.add(new Output(fromNodeConnectorRef(uri)));
-                    }
+                Uri nodeConnector = ((OutputAction) sourceAction).getOutputNodeConnector();
+                if (nodeConnector != null) {
+                    //for (Uri uri : nodeConnectors) {
+                        targetAction.add(new Output(fromNodeConnectorRef(nodeConnector)));
+                    //}
                 }
             } else if (sourceAction instanceof PopMplsAction) {
                 // TODO: define maping
index e2ae7246063678bca99a9fe9fdce2186323942d1..8108074ed74dc759314238ba7aec9e6836958632 100644 (file)
@@ -175,7 +175,7 @@ public class TestToSalConversionsUtils {
         checkSalAction(actions, FloodAll.class, 1);
         checkSalAction(actions, HwPath.class, 1);
         checkSalAction(actions, Loopback.class, 1);
-        checkSalAction(actions, Output.class, 2, true);
+        checkSalAction(actions, Output.class, 1, true);
         checkSalAction(actions, PopVlan.class, 1);
         checkSalAction(actions, PushVlan.class, 1, true);
         checkSalAction(actions, SetDlDst.class, 1, true);
@@ -451,11 +451,8 @@ public class TestToSalConversionsUtils {
         pushVlanActionBuilder.setTag(0x8100); // 12 bit
     }
 
-    private void prepareActionOutput(OutputActionBuilder outputActionBuilder) {
-        List<Uri> uris = new ArrayList<>();
-        uris.add(new Uri("uri1"));
-        uris.add(new Uri("uri2"));
-        outputActionBuilder.setOutputNodeConnector(uris);
+    private void prepareActionOutput(OutputActionBuilder outputActionBuilder) {       
+        outputActionBuilder.setOutputNodeConnector(new Uri("uri1"));
     }
 
     private Match prepOdMatch(MtchType mt) {
index 3bf7db62976264c9138238b375dfc70c40c1333b..5bfe54e4c32a7132a0fe8e8e9c53908e0e4f6aa0 100644 (file)
@@ -5,6 +5,7 @@ module opendaylight-action-types {
     import ietf-inet-types {prefix inet; revision-date "2010-09-24";}
     import ietf-yang-types {prefix yang; revision-date "2010-09-24";}
     import opendaylight-l2-types {prefix l2t; revision-date "2013-08-27";}
+    import opendaylight-match-types {prefix match; revision-date 2013-10-26";}
     
     revision "2013-11-12" {
         description "Initial revision of action service";
@@ -42,7 +43,7 @@ module opendaylight-action-types {
     grouping action {
         choice action {
             case output-action {
-                leaf-list output-node-connector {
+                leaf output-node-connector {
                     type inet:uri;
                 }
                 
@@ -60,11 +61,21 @@ module opendaylight-action-types {
                     }
                 }
             }
-
+            
+            case set-field {
+                container match {
+                    uses match:match;
+                }
+            }
+            
             case set-queue-action {
                 leaf queue {
                     type string; 
                 }
+                
+                leaf queue-id {
+                    type uint32; 
+                }
             }
 
             case pop-mpls-action {
@@ -168,6 +179,10 @@ module opendaylight-action-types {
                 leaf group {
                     type string;
                 }
+                
+                leaf group-id {
+                    type uint32;
+                }
             }
             
             case set-dl-type-action {
index b5a70ccfe5357a3dec6b91d1ea04aac559a0ec1a..4b50c0ee720488dfd47ead3754099fd05f3ecb10 100644 (file)
@@ -55,6 +55,10 @@ module opendaylight-flow-types {
                 leaf meter {
                     type string;
                 }
+                
+                leaf meter-id {
+                    type uint32;
+                }
             }   
         }
     }
index 043b0077f79defd977170a105a3651a13c8f9332..c1740d8abd27fa04c38fc88670cc755501adff65 100644 (file)
@@ -18,10 +18,9 @@ module opendaylight-group-statistics {
     grouping group-stats-response {
         uses "inv:node-context-ref";
 
-        leaf group-stats-id {
-            type group-stats-ref;
+        list group-statistics{
+               uses group-types:group-statistics;
         }
-        uses group-types:group-statistics;
     }
 
     typedef group-features-ref {
@@ -31,9 +30,6 @@ module opendaylight-group-statistics {
     grouping group-features-response {
         uses "inv:node-context-ref";
 
-        leaf group-features-id {
-            type group-features-ref;
-        }
         uses group-types:group-features;
     }
 
@@ -44,10 +40,23 @@ module opendaylight-group-statistics {
     grouping group-desc-response {
         uses "inv:node-context-ref";
 
-        leaf group-desc-id {
-            type group-desc-ref;
+        list group-desc-stats {
+               uses group-types:group-desc-stats;
         }
-        uses group-types:group-desc-stats;
+    }
+    
+    container group-all-statistics {
+       container group-stats {
+               uses group-stats-response;
+       }
+       
+       container group-features {
+                       uses group-features-response;
+               }
+               
+               container group-desc {
+                       uses group-desc-response;
+               }
     }
 
        // RPC calls
@@ -56,9 +65,7 @@ module opendaylight-group-statistics {
             uses inv:node-context-ref;
         }
         output {
-            list group-statistics {
-                uses group-stats-response;
-            }
+               uses group-stats-response;
             uses tr:transaction-aware;
         }
        
@@ -81,9 +88,6 @@ module opendaylight-group-statistics {
        rpc get-group-description {
                input {
             uses inv:node-context-ref;
-            leaf group-id{
-               type group-types:group-id;
-            }
         }
         output {
             uses group-desc-response;
@@ -94,9 +98,6 @@ module opendaylight-group-statistics {
        rpc get-group-features {
                input {
             uses inv:node-context-ref;
-            leaf group-id{
-               type group-types:group-id;
-            }
         }
         output {
             uses group-features-response;
@@ -108,16 +109,28 @@ module opendaylight-group-statistics {
        //Notification calls
        
        notification group-statistics-updated {
+           leaf group-stats-id {
+            type group-stats-ref;
+        }
+               
                uses group-stats-response;
         uses tr:transaction-aware;
        }
        
        notification group-desc-stats-updated {
+               leaf group-desc-id {
+            type group-desc-ref;
+        }
+       
                uses group-desc-response;
         uses tr:transaction-aware;
        }
 
        notification group-features-updated {
+               leaf group-features-id {
+            type group-features-ref;
+        }
+       
                uses group-features-response;
         uses tr:transaction-aware;
        }
index 18dd60d08ddc87a4f8bf45e76b006e7d3d607818..3561e4f33990751d2379e7f08f51c58c5e36c8d8 100644 (file)
@@ -19,10 +19,9 @@ module opendaylight-meter-statistics {
     grouping meter-stats-response {
         uses "inv:node-context-ref";
 
-        leaf meter-stats-id {
-            type meter-stats-ref;
+        list meter-statistics {
+               uses meter-types:meter-statistics;
         }
-        uses meter-types:meter-statistics;
     }
 
     typedef meter-config-ref {
@@ -32,10 +31,9 @@ module opendaylight-meter-statistics {
     grouping meter-config-response {
         uses "inv:node-context-ref";
 
-        leaf meter-config-id {
-            type meter-config-ref;
+        list meter-config-stats {
+               uses meter-types:meter-config-stats;
         }
-        uses meter-types:meter-config-stats;
     }
 
     typedef meter-features-ref {
@@ -45,28 +43,35 @@ module opendaylight-meter-statistics {
     grouping meter-features-response {
         uses "inv:node-context-ref";
 
-        leaf meter-features-id {
-            type meter-features-ref;
-        }
         uses meter-types:meter-features;
     }
 
+       container meter-all-stats {
+               container meter-stats {
+                       uses meter-stats-response;
+               }
+               
+               container meter-config {
+                       uses meter-config-response;
+               }
+               
+               container meter-features {
+                       uses meter-features-response;
+               }
+       }
        // RPC calls
        rpc get-all-meter-statistics {
                input {
             uses inv:node-context-ref;
         }
         output {
-            list meter-statistics {
-                uses meter-stats-response;
-                uses tr:transaction-aware;
-            }
+                       uses meter-stats-response;
+                       uses tr:transaction-aware;
         }
        
        }
        
        rpc get-meter-statistics {
-               description "RPC Method to send meter statistics request to the give switch for specific meter"; 
                input {
             uses inv:node-context-ref;
             leaf meter-id{
@@ -80,12 +85,9 @@ module opendaylight-meter-statistics {
        
        }
        
-       rpc get-meter-config-statistics {
+       rpc get-all-meter-config-statistics {
                input {
             uses inv:node-context-ref;
-            leaf meter-id{
-               type meter-types:meter-id;
-            }
         }
         output {
                uses meter-config-response;
@@ -96,9 +98,6 @@ module opendaylight-meter-statistics {
        rpc get-meter-features {
                input {
             uses inv:node-context-ref;
-            leaf meter-id{
-               type meter-types:meter-id;
-               }
         }
         output {
                uses meter-features-response;
@@ -110,16 +109,27 @@ module opendaylight-meter-statistics {
        //Notification calls
        
        notification meter-statistics-updated {
-               uses meter-stats-response;
+           leaf meter-stats-id {
+            type meter-stats-ref;
+        }
+       uses meter-stats-response;
         uses tr:transaction-aware;
        }
        
        notification meter-config-stats-updated {
+               leaf meter-config-id {
+            type meter-config-ref;
+        }
+       
                uses meter-config-response;
         uses tr:transaction-aware;
        }
 
        notification meter-features-updated {
+           leaf meter-features-id {
+            type meter-features-ref;
+        }
+       
                uses meter-features-response;
         uses tr:transaction-aware;
        }
diff --git a/opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/NodeStatistics.java b/opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/NodeStatistics.java
new file mode 100644 (file)
index 0000000..8507324
--- /dev/null
@@ -0,0 +1,89 @@
+package org.opendaylight.controller.md.statistics.manager;
+
+import java.util.List;
+
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.group.desc.response.GroupDescStats;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.group.stats.response.GroupStatistics;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.meter.config.response.MeterConfigStats;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.meter.stats.response.MeterStatistics;
+
+public class NodeStatistics {
+
+    private NodeRef targetNode;
+    
+    private List<GroupStatistics> groupStatistics;
+    
+    private List<MeterStatistics> meterStatistics;
+    
+    private List<GroupDescStats> groupDescStats;
+    
+    private List<MeterConfigStats> meterConfigStats;
+    
+    private List<org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.features.GroupFeatures> groupFeatures;
+    
+    private List<org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.features.MeterFeatures> meterFeatures;
+    
+    public NodeStatistics(){
+        
+    }
+
+    public NodeRef getTargetNode() {
+        return targetNode;
+    }
+
+    public void setTargetNode(NodeRef targetNode) {
+        this.targetNode = targetNode;
+    }
+
+    public List<GroupStatistics> getGroupStatistics() {
+        return groupStatistics;
+    }
+
+    public void setGroupStatistics(List<GroupStatistics> groupStatistics) {
+        this.groupStatistics = groupStatistics;
+    }
+
+    public List<MeterStatistics> getMeterStatistics() {
+        return meterStatistics;
+    }
+
+    public void setMeterStatistics(List<MeterStatistics> meterStatistics) {
+        this.meterStatistics = meterStatistics;
+    }
+
+    public List<GroupDescStats> getGroupDescStats() {
+        return groupDescStats;
+    }
+
+    public void setGroupDescStats(List<GroupDescStats> groupDescStats) {
+        this.groupDescStats = groupDescStats;
+    }
+
+    public List<MeterConfigStats> getMeterConfigStats() {
+        return meterConfigStats;
+    }
+
+    public void setMeterConfigStats(List<MeterConfigStats> meterConfigStats) {
+        this.meterConfigStats = meterConfigStats;
+    }
+
+    public List<org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.features.GroupFeatures> getGroupFeatures() {
+        return groupFeatures;
+    }
+
+    public void setGroupFeatures(
+            List<org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.features.GroupFeatures> groupFeatures) {
+        this.groupFeatures = groupFeatures;
+    }
+
+    public List<org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.features.MeterFeatures> getMeterFeatures() {
+        return meterFeatures;
+    }
+
+    public void setMeterFeatures(
+            List<org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.features.MeterFeatures> meterFeatures) {
+        this.meterFeatures = meterFeatures;
+    }
+    
+}
index 073d43ef60df3d944dda0da6512326267be114e5..5c02b6cea069b5266244189990f54e66cddff67f 100644 (file)
@@ -1,13 +1,36 @@
 package org.opendaylight.controller.md.statistics.manager;
 
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.Future;
+
 import org.eclipse.xtext.xbase.lib.Exceptions;
 import org.opendaylight.controller.sal.binding.api.NotificationProviderService;
 import org.opendaylight.controller.sal.binding.api.data.DataModificationTransaction;
 import org.opendaylight.controller.sal.binding.api.data.DataProviderService;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetAllGroupStatisticsInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetAllGroupStatisticsOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetGroupDescriptionInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetGroupDescriptionOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetGroupFeaturesInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetGroupFeaturesOutput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.OpendaylightGroupStatisticsService;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetAllMeterConfigStatisticsInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetAllMeterConfigStatisticsOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetAllMeterStatisticsInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetAllMeterStatisticsOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetMeterFeaturesInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetMeterFeaturesOutput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.OpendaylightMeterStatisticsService;
 import org.opendaylight.yangtools.concepts.Registration;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.binding.NotificationListener;
+import org.opendaylight.yangtools.yang.common.RpcResult;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -23,6 +46,15 @@ public class StatisticsProvider implements AutoCloseable {
     
     private OpendaylightMeterStatisticsService meterStatsService;
     
+    private Thread statisticsRequesterThread;
+    
+    private final  InstanceIdentifier<Nodes> nodesIdentifier = InstanceIdentifier.builder().node(Nodes.class).toInstance();
+    
+    //Local caching of stats
+    
+    private final ConcurrentMap<NodeRef,NodeStatistics> statisticsCache = 
+            new ConcurrentHashMap<NodeRef,NodeStatistics>();
+    
     public DataProviderService getDataService() {
       return this.dps;
     }
@@ -50,10 +82,28 @@ public class StatisticsProvider implements AutoCloseable {
         this.listenerRegistration = registerNotificationListener;
         
         // Get Group/Meter statistics service instance
-        groupStatsService = StatisticsManagerActivator.getProviderContext().getRpcService(OpendaylightGroupStatisticsService.class);
+        groupStatsService = StatisticsManagerActivator.getProviderContext().
+                getRpcService(OpendaylightGroupStatisticsService.class);
         
-        meterStatsService = StatisticsManagerActivator.getProviderContext().getRpcService(OpendaylightMeterStatisticsService.class);
+        meterStatsService = StatisticsManagerActivator.getProviderContext().
+                getRpcService(OpendaylightMeterStatisticsService.class);
+
+        statisticsRequesterThread = new Thread( new Runnable(){
 
+            @Override
+            public void run() {
+                while(true){
+                    try {
+                        statsRequestSender();
+                        
+                        Thread.sleep(5000);
+                    }catch (Exception e){
+                        spLogger.error("Exception occurred while sending stats request : {}",e.getMessage());
+                        e.printStackTrace();
+                    }
+                }
+            }
+        });
         spLogger.info("Statistics Provider started.");
     }
     
@@ -63,6 +113,100 @@ public class StatisticsProvider implements AutoCloseable {
         return dps.beginTransaction();
     }
     
+    private void statsRequestSender(){
+        
+        //Need to call API to receive all the nodes connected to controller.
+        
+        List<NodeRef> targetNodes = new ArrayList<NodeRef>();
+        
+        for (NodeRef targetNode : targetNodes){
+            
+            sendAllGroupStatisticsRequest(targetNode);
+            
+            sendAllMeterStatisticsRequest(targetNode);
+
+            //We need to add check, so see if groups/meters are supported
+            //by the target node.
+            sendGroupDescriptionRequest(targetNode);
+            
+            sendGroupFeaturesRequest(targetNode);
+            
+            sendMeterConfigStatisticsRequest(targetNode);
+            
+            sendMeterFeaturesRequest(targetNode);
+        }
+    }
+    
+    private void sendAllGroupStatisticsRequest(NodeRef targetNode){
+        
+        GetAllGroupStatisticsInputBuilder input = new GetAllGroupStatisticsInputBuilder();
+        
+        input.setNode(targetNode);
+
+        Future<RpcResult<GetAllGroupStatisticsOutput>> response = 
+                groupStatsService.getAllGroupStatistics(input.build());
+    }
+    
+    private void sendGroupDescriptionRequest(NodeRef targetNode){
+        GetGroupDescriptionInputBuilder input = new GetGroupDescriptionInputBuilder();
+        
+        input.setNode(targetNode);
+        
+        Future<RpcResult<GetGroupDescriptionOutput>> response = 
+                groupStatsService.getGroupDescription(input.build());
+    }
+    
+    private void sendGroupFeaturesRequest(NodeRef targetNode){
+        
+        GetGroupFeaturesInputBuilder input = new GetGroupFeaturesInputBuilder();
+        
+        input.setNode(targetNode);
+        
+        Future<RpcResult<GetGroupFeaturesOutput>> response = 
+                groupStatsService.getGroupFeatures(input.build());
+    }
+    
+    private void sendAllMeterStatisticsRequest(NodeRef targenetNode){
+        
+        GetAllMeterStatisticsInputBuilder input = new GetAllMeterStatisticsInputBuilder();
+        
+        input.setNode(targenetNode);
+        
+        Future<RpcResult<GetAllMeterStatisticsOutput>> response = 
+                meterStatsService.getAllMeterStatistics(input.build());
+    }
+    
+    private void sendMeterConfigStatisticsRequest(NodeRef targetNode){
+        
+        GetAllMeterConfigStatisticsInputBuilder input = new GetAllMeterConfigStatisticsInputBuilder();
+        
+        input.setNode(targetNode);
+        
+        Future<RpcResult<GetAllMeterConfigStatisticsOutput>> response = 
+                meterStatsService.getAllMeterConfigStatistics(input.build());
+        
+    }
+    private void sendMeterFeaturesRequest(NodeRef targetNode){
+     
+        GetMeterFeaturesInputBuilder input = new GetMeterFeaturesInputBuilder();
+        
+        input.setNode(targetNode);
+        
+        Future<RpcResult<GetMeterFeaturesOutput>> response = 
+                meterStatsService.getMeterFeatures(input.build());
+    }
+    
+    public ConcurrentMap<NodeRef, NodeStatistics> getStatisticsCache() {
+        return statisticsCache;
+    }
+    
+    private List<Node> getAllConnectedNodes(){
+        
+        Nodes nodes = (Nodes) dps.readOperationalData(nodesIdentifier);
+        return nodes.getNode();
+    }
+
+    @SuppressWarnings("deprecation")
     @Override
     public void close(){
         
@@ -71,6 +215,8 @@ public class StatisticsProvider implements AutoCloseable {
             if (this.listenerRegistration != null) {
               
                 this.listenerRegistration.close();
+                
+                this.statisticsRequesterThread.destroy();
             
             }
           } catch (Throwable e) {
index f952124c91e88488ad60134e67e37ad0b12e6e13..cba039f815126a071e2184f397eca2faa7cf92e2 100644 (file)
@@ -1,13 +1,30 @@
 package org.opendaylight.controller.md.statistics.manager;
 
+import java.util.concurrent.ConcurrentMap;
+
+import org.opendaylight.controller.sal.binding.api.data.DataModificationTransaction;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GroupDescRef;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GroupDescStatsUpdated;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GroupFeaturesRef;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GroupFeaturesUpdated;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GroupStatisticsUpdated;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GroupStatsRef;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.OpendaylightGroupStatisticsListener;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.group.all.statistics.GroupDescBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.group.all.statistics.GroupFeaturesBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.group.all.statistics.GroupStatsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.MeterConfigRef;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.MeterConfigStatsUpdated;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.MeterFeaturesRef;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.MeterFeaturesUpdated;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.MeterStatisticsUpdated;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.MeterStatsRef;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.OpendaylightMeterStatisticsListener;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.meter.all.stats.MeterConfigBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.meter.all.stats.MeterFeaturesBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.meter.all.stats.MeterStatsBuilder;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 
 public class StatisticsUpdateCommiter implements OpendaylightGroupStatisticsListener,
         OpendaylightMeterStatisticsListener {
@@ -23,35 +40,135 @@ public class StatisticsUpdateCommiter implements OpendaylightGroupStatisticsList
     }
     @Override
     public void onMeterConfigStatsUpdated(MeterConfigStatsUpdated notification) {
-        // TODO Auto-generated method stub
+        //Add statistics to local cache
+        ConcurrentMap<NodeRef, NodeStatistics> cache = this.statisticsManager.getStatisticsCache();
+        if(!cache.containsKey(notification.getNode())){
+            cache.put(notification.getNode(), new NodeStatistics());
+        }
+        cache.get(notification.getNode()).setMeterConfigStats(notification.getMeterConfigStats());
+        
+        //Publish data to configuration data store
+        DataModificationTransaction it = this.statisticsManager.startChange();
+        MeterConfigRef ref = notification.getMeterConfigId();
+
+        MeterConfigBuilder meterConfig = new MeterConfigBuilder();
+        meterConfig.setNode(notification.getNode());
+        meterConfig.setMeterConfigStats(notification.getMeterConfigStats());
+        
+        InstanceIdentifier<? extends Object> refValue = ref.getValue();
+        it.putRuntimeData(refValue, meterConfig.build());
+        it.commit();
     }
 
     @Override
     public void onMeterStatisticsUpdated(MeterStatisticsUpdated notification) {
-        // TODO Auto-generated method stub
+        //Add statistics to local cache
+        ConcurrentMap<NodeRef, NodeStatistics> cache = this.statisticsManager.getStatisticsCache();
+        if(!cache.containsKey(notification.getNode())){
+            cache.put(notification.getNode(), new NodeStatistics());
+        }
+        cache.get(notification.getNode()).setMeterStatistics(notification.getMeterStatistics());
+        
+        //Publish data to configuration data store
+        DataModificationTransaction it = this.statisticsManager.startChange();
+        MeterStatsRef ref = notification.getMeterStatsId();
 
+        MeterStatsBuilder meterStats = new MeterStatsBuilder();
+        meterStats.setNode(notification.getNode());
+        meterStats.setMeterStatistics(notification.getMeterStatistics());
+        
+        InstanceIdentifier<? extends Object> refValue = ref.getValue();
+        it.putRuntimeData(refValue, meterStats.build());
+        it.commit();
     }
 
     @Override
     public void onGroupDescStatsUpdated(GroupDescStatsUpdated notification) {
-        // TODO Auto-generated method stub
+        //Add statistics to local cache
+        ConcurrentMap<NodeRef, NodeStatistics> cache = this.statisticsManager.getStatisticsCache();
+        if(!cache.containsKey(notification.getNode())){
+            cache.put(notification.getNode(), new NodeStatistics());
+        }
+        cache.get(notification.getNode()).setGroupDescStats(notification.getGroupDescStats());
+        
+        //Publish data to configuration data store
+        DataModificationTransaction it = this.statisticsManager.startChange();
+        GroupDescRef ref = notification.getGroupDescId();
 
+        GroupDescBuilder descStats = new GroupDescBuilder();
+        descStats.setNode(notification.getNode());
+        descStats.setGroupDescStats(notification.getGroupDescStats());
+        
+        InstanceIdentifier<? extends Object> refValue = ref.getValue();
+        it.putRuntimeData(refValue, descStats.build());
+        it.commit();
     }
 
     @Override
     public void onGroupStatisticsUpdated(GroupStatisticsUpdated notification) {
-        // TODO Auto-generated method stub
+        
+        //Add statistics to local cache
+        ConcurrentMap<NodeRef, NodeStatistics> cache = this.statisticsManager.getStatisticsCache();
+        if(!cache.containsKey(notification.getNode())){
+            cache.put(notification.getNode(), new NodeStatistics());
+        }
+        cache.get(notification.getNode()).setGroupStatistics(notification.getGroupStatistics());
+        
+        //Publish data to configuration data store
+        DataModificationTransaction it = this.statisticsManager.startChange();
+        GroupStatsRef ref = notification.getGroupStatsId();
 
+        GroupStatsBuilder groupStats = new GroupStatsBuilder();
+        groupStats.setNode(notification.getNode());
+        groupStats.setGroupStatistics(notification.getGroupStatistics());
+        
+        InstanceIdentifier<? extends Object> refValue = ref.getValue();
+        it.putRuntimeData(refValue, groupStats.build());
+        it.commit();
     }
     @Override
     public void onMeterFeaturesUpdated(MeterFeaturesUpdated notification) {
-        // TODO Auto-generated method stub
+
+        //Add statistics to local cache
+        ConcurrentMap<NodeRef, NodeStatistics> cache = this.statisticsManager.getStatisticsCache();
+        if(!cache.containsKey(notification.getNode())){
+            cache.put(notification.getNode(), new NodeStatistics());
+        }
+        cache.get(notification.getNode()).setMeterFeatures(notification.getMeterFeatures());
         
+        //Publish data to configuration data store
+        DataModificationTransaction it = this.statisticsManager.startChange();
+        MeterFeaturesRef ref = notification.getMeterFeaturesId();
+
+        MeterFeaturesBuilder meterFeatures = new MeterFeaturesBuilder();
+        meterFeatures.setNode(notification.getNode());
+        meterFeatures.setMeterFeatures(notification.getMeterFeatures());
+        
+        InstanceIdentifier<? extends Object> refValue = ref.getValue();
+        it.putRuntimeData(refValue, meterFeatures.build());
+        it.commit();
     }
+    
     @Override
     public void onGroupFeaturesUpdated(GroupFeaturesUpdated notification) {
-        // TODO Auto-generated method stub
         
-    }
+        //Add statistics to local cache
+        ConcurrentMap<NodeRef, NodeStatistics> cache = this.statisticsManager.getStatisticsCache();
+        if(!cache.containsKey(notification.getNode())){
+            cache.put(notification.getNode(), new NodeStatistics());
+        }
+        cache.get(notification.getNode()).setGroupFeatures(notification.getGroupFeatures());
+        
+        //Publish data to configuration data store
+        DataModificationTransaction it = this.statisticsManager.startChange();
+        GroupFeaturesRef ref = notification.getGroupFeaturesId();
 
+        GroupFeaturesBuilder featuresStats = new GroupFeaturesBuilder();
+        featuresStats.setNode(notification.getNode());
+        featuresStats.setGroupFeatures(notification.getGroupFeatures());
+        
+        InstanceIdentifier<? extends Object> refValue = ref.getValue();
+        it.putRuntimeData(refValue, featuresStats.build());
+        it.commit();
+    }
 }
index b6fd29696fee57a74e72bbbba1674a0b6b59a951..78da7bdcc0ad2fd7653dbb5dc7859634dc00685c 100644 (file)
@@ -40,9 +40,9 @@
         <version>1.5</version>
         <executions>
           <execution>
-            <phase>install</phase>
+            <phase>package</phase>
             <goals>
-                <goal>run</goal>
+              <goal>run</goal>
             </goals>
           </execution>
         </executions>
             <!-- generate index.html -->
             <!-- append header -->
             <echo file="${docs.output.dir}/index.html" append="true">
-&lt;![CDATA[
-&lt;html&gt;
-  &lt;head&gt;
-    &lt;title&gt; OpenDaylight REST API Documentation &lt;/title&gt;
-  &lt;/head&gt;
-  &lt;body&gt;
-  &lt;h2&gt;OpenDaylight REST API Documentation&lt;/h2&gt;
-  &lt;p&gt; OpenDaylight supports the following &lt;a href="http://en.wikipedia.org/wiki/Representational_State_Transfer"&gt;Representational State Transfer (REST)&lt;/a&gt; APIs: &lt;/p&gt;
-  &lt;h4&gt;
-]]&gt;
+              &lt;![CDATA[
+              &lt;html&gt;
+              &lt;head&gt;
+              &lt;title&gt; OpenDaylight REST API Documentation &lt;/title&gt;
+              &lt;/head&gt;
+              &lt;body&gt;
+              &lt;h2&gt;OpenDaylight REST API Documentation&lt;/h2&gt;
+              &lt;p&gt; OpenDaylight supports the following &lt;a href="http://en.wikipedia.org/wiki/Representational_State_Transfer"&gt;Representational State Transfer (REST)&lt;/a&gt; APIs: &lt;/p&gt;
+              &lt;h4&gt;
+              ]]&gt;
             </echo>
             <dirset id="nbset" dir="${docs.output.dir}">
               <include name="*"/>
 
             <!-- append footer -->
             <echo file="${docs.output.dir}/index.html" append="true">
-&lt;![CDATA[
-  &lt;/h4&gt;
-  &lt;i&gt;---&lt;/i&gt;
-  &lt;/body&gt;
-&lt;/html&gt;
-]]&gt;
+              &lt;![CDATA[
+              &lt;/h4&gt;
+              &lt;i&gt;---&lt;/i&gt;
+              &lt;/body&gt;
+              &lt;/html&gt;
+              ]]&gt;
             </echo>
             <!-- archive all the docs excluding whatever is not needed -->
             <echo message="======== Archiving enunciate docs ========"/>
       </plugin>
 
       <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-install-plugin</artifactId>
-        <version>2.5</version>
-        <configuration>
-          <packaging>jar</packaging>
-          <groupId>${project.groupId}</groupId>
-          <version>${project.version}</version>
-        </configuration>
+        <groupId>org.codehaus.mojo</groupId>
+        <artifactId>build-helper-maven-plugin</artifactId>
+        <version>1.8</version>
         <executions>
           <execution>
-            <!-- skip default install -->
-            <id>default-install</id>
-            <phase>install</phase>
-            <goals>
-              <goal>install</goal>
-            </goals>
-            <configuration>
-              <skip>true</skip>
-            </configuration>
-          </execution>
-          <execution>
-            <!-- install full java client -->
-            <id>install-full-client</id>
-            <phase>install</phase>
-            <goals>
-              <goal>install-file</goal>
-            </goals>
-            <configuration>
-              <artifactId>${project.artifactId}.full-client</artifactId>
-              <file>${java-client}</file>
-              <sources>${java-client-sources}</sources>
-            </configuration>
-          </execution>
-          <execution>
-            <!-- install full java json client -->
-            <id>install-full-json-client</id>
-            <phase>install</phase>
+            <id>attach-artifacts</id>
+            <phase>package</phase>
             <goals>
-              <goal>install-file</goal>
+              <goal>attach-artifact</goal>
             </goals>
             <configuration>
-              <artifactId>${project.artifactId}.full-json-client</artifactId>
-              <file>${json-client}</file>
-              <sources>${json-client-sources}</sources>
+              <artifacts>
+                <artifact>
+                  <file>${java-client}</file>
+                  <type>jar</type>
+                  <classifier>full-java-client</classifier>
+                </artifact>
+                <artifact>
+                  <file>${java-client-sources}</file>
+                  <type>jar</type>
+                  <classifier>full-java-client-sources</classifier>
+                </artifact>
+                <artifact>
+                  <file>${json-client}</file>
+                  <type>jar</type>
+                  <classifier>full-json-client</classifier>
+                </artifact>
+                <artifact>
+                  <file>${json-client-sources}</file>
+                  <type>jar</type>
+                  <classifier>full-json-client-sources</classifier>
+                </artifact>
+              </artifacts>
             </configuration>
           </execution>
         </executions>
       </plugin>
-
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-deploy-plugin</artifactId>
-        <version>2.5</version>
-        <configuration>
-          <packaging>jar</packaging>
-          <generatePom>true</generatePom>
-          <groupId>${project.groupId}</groupId>
-          <version>${project.version}</version>
-          <url>${project.distributionManagement.repository.url}</url>
-        </configuration>
-        <executions>
-          <execution>
-            <!-- skip default deploy -->
-            <id>default-deploy</id>
-            <phase>deploy</phase>
-            <goals>
-              <goal>deploy</goal>
-            </goals>
-            <configuration>
-              <skip>true</skip>
-            </configuration>
-          </execution>
-          <execution>
-            <!-- deploy full java client -->
-            <id>deploy-full-client</id>
-            <phase>deploy</phase>
-            <goals>
-              <goal>deploy-file</goal>
-            </goals>
-            <configuration>
-              <artifactId>${project.artifactId}.full-client</artifactId>
-              <file>${java-client}</file>
-              <sources>${java-client-sources}</sources>
-            </configuration>
-          </execution>
-          <execution>
-            <!-- deploy full java json client -->
-            <id>deploy-full-json-client</id>
-            <phase>deploy</phase>
-            <goals>
-              <goal>deploy-file</goal>
-            </goals>
-            <configuration>
-              <artifactId>${project.artifactId}.full-json-client</artifactId>
-              <file>${json-client}</file>
-              <sources>${json-client-sources}</sources>
-            </configuration>
-          </execution>
-       </executions>
-    </plugin>
-
     </plugins>
   </build>
   <dependencies>