Merge "Provide consistent hash code for enums and use it too"
authorMadhu Venugopal <vmadhu@cisco.com>
Thu, 19 Sep 2013 15:46:14 +0000 (15:46 +0000)
committerGerrit Code Review <gerrit@opendaylight.org>
Thu, 19 Sep 2013 15:46:14 +0000 (15:46 +0000)
30 files changed:
opendaylight/containermanager/api/src/main/java/org/opendaylight/controller/containermanager/ContainerFlowConfig.java
opendaylight/forwardingrulesmanager/api/src/main/java/org/opendaylight/controller/forwardingrulesmanager/FlowConfig.java
opendaylight/northbound/integrationtest/src/test/java/org/opendaylight/controller/northbound/integrationtest/NorthboundIT.java
opendaylight/northbound/switchmanager/pom.xml
opendaylight/northbound/switchmanager/src/main/java/org/opendaylight/controller/switchmanager/northbound/NodeConnectorProperties.java
opendaylight/northbound/switchmanager/src/main/java/org/opendaylight/controller/switchmanager/northbound/NodeProperties.java
opendaylight/northbound/topology/pom.xml
opendaylight/northbound/topology/src/main/java/org/opendaylight/controller/topology/northbound/EdgeProperties.java
opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/core/Actions.java
opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/core/AdvertisedBandwidth.java
opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/core/Bandwidth.java
opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/core/Buffers.java
opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/core/Capabilities.java
opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/core/Config.java
opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/core/Description.java
opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/core/ForwardingMode.java
opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/core/Latency.java
opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/core/Name.java
opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/core/PeerBandwidth.java
opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/core/Property.java
opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/core/State.java
opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/core/SupportedBandwidth.java
opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/core/Tables.java
opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/core/Tier.java
opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/core/TimeStamp.java
opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/utils/IPProtocols.java
opendaylight/sal/yang-prototype/sal/model/model-flow-base/src/main/yang/group-types.yang
opendaylight/sal/yang-prototype/sal/model/model-flow-base/src/main/yang/meter-types.yang [new file with mode: 0644]
opendaylight/sal/yang-prototype/sal/model/model-flow-service/src/main/yang/group-service.yang
opendaylight/sal/yang-prototype/sal/model/model-flow-service/src/main/yang/meter-service.yang [new file with mode: 0644]

index c0b0a65270ef9184b23216e5e80ad7a725fe4c1e..488f8928de478ec8faab7122d93fd8f21cda0a62 100644 (file)
@@ -529,6 +529,9 @@ public class ContainerFlowConfig implements Serializable {
         if(!hasValidProtocol()) {
             return new Status(StatusCode.BADREQUEST, "Invalid IP protocol");
         }
+        if (!hasValidPorts()) {
+            return new Status(StatusCode.BADREQUEST, "Invalid Source or Destination Port");
+        }
         if (this.getMatches().get(0).getMatches() == 0) {
             return new Status(StatusCode.BADREQUEST, "Flow Spec is empty");
         }
@@ -573,12 +576,54 @@ public class ContainerFlowConfig implements Serializable {
         return new Status(StatusCode.SUCCESS);
     }
 
+    /**
+     * Validate the protocol field. Either it can be a enum defined in IPProtocols.java
+     * or a value between 1 and 255
+     *
+     * @return true if a valid protocol value
+     */
     private boolean hasValidProtocol() {
         if (protocol != null && !protocol.isEmpty()) {
-            return (this.getProtoNum() != 0 || protocol.equalsIgnoreCase("any"));
+            short proto = this.getProtoNum();
+            return (((proto != 0) && (proto > 0) && (proto < 256)) || protocol.equalsIgnoreCase("any"));
         }
         return true;
     }
+
+    /**
+     *
+     * @param tpPort
+     *               String representing the transport protocol port number
+     * @return true if tpPort contains a decimal value between 0 and 65535
+     */
+    private boolean hasValidPort(String tpPort) {
+        try {
+            int port = Integer.decode(tpPort);
+            return ((port >= 0) && (port <= 0xffff));
+        } catch (NumberFormatException e) {
+            return false;
+        }
+    }
+
+    /**
+     * Validate the transport protocol source and destination ports as
+     * entered by users.
+     *
+     * @return true if ports are defined and are in valid range
+     */
+    private boolean hasValidPorts() {
+        if (tpSrc !=null && !tpSrc.isEmpty()) {
+            if (!hasValidPort(tpSrc)) {
+                return false;
+            }
+        }
+
+        if (tpDst !=null && !tpDst.isEmpty()) {
+            return hasValidPort(tpDst);
+        }
+        return true;
+    }
+
     /**
      * Returns the matches.
      * If unidirectional flag is set, there will be only one match in the list
@@ -624,22 +669,10 @@ public class ContainerFlowConfig implements Serializable {
                     .getProtocolNumberByte(this.protocol));
         }
         if (this.tpSrc != null && !this.tpSrc.trim().isEmpty()) {
-            Short srcPort = 0;
-            try {
-                srcPort = Short.parseShort(tpSrc);
-            } catch (NumberFormatException e) {
-                throw e;
-            }
-            match.setField(MatchType.TP_SRC, srcPort);
+            match.setField(MatchType.TP_SRC, Integer.valueOf(tpSrc).shortValue());
         }
         if (this.tpDst != null && !this.tpDst.trim().isEmpty()) {
-            Short dstPort = 0;
-            try {
-                dstPort = Short.parseShort(tpDst);
-            } catch (NumberFormatException e) {
-                throw e;
-            }
-            match.setField(MatchType.TP_DST, dstPort);
+            match.setField(MatchType.TP_DST, Integer.valueOf(tpDst).shortValue());
         }
 
         matches.add(match);
index ba69c8a3d29f8286f2d4f3157f6547a8f54c717b..62d6855e109f77ac97baf5107fb2c0efbcaa603e 100644 (file)
@@ -655,6 +655,14 @@ public class FlowConfig implements Serializable {
         return ((to >= 0) && (to <= 0xffff));
     }
 
+    public boolean isProtocolValid(String protocol) {
+        int protocol_number = IPProtocols.getProtocolNumberInt(protocol);
+        if (protocol_number < 1 || protocol_number > 255) {
+            return false;
+        }
+        return true;
+    }
+
     private Status conflictWithContainerFlow(IContainer container) {
         // Return true if it's default container
         if (container.getName().equals(GlobalConstants.DEFAULT.toString())) {
@@ -762,6 +770,10 @@ public class FlowConfig implements Serializable {
                 }
             }
 
+            if ((protocol != null) && !isProtocolValid(protocol)) {
+                return new Status(StatusCode.BADREQUEST, String.format("Protocol %s is not valid", protocol));
+            }
+
             if ((tosBits != null) && !isTOSBitsValid(tosBits)) {
                 return new Status(StatusCode.BADREQUEST, String.format("IP ToS bits %s is not in the range 0 - 63",
                         tosBits));
index e7ca7f57822a438e4243a29115fd38f854dce5ed..e457cbfd6e92f93913b0261bb28758195091bc41 100644 (file)
@@ -208,47 +208,34 @@ public class NorthboundIT {
         Assert.assertEquals(nodeId, (Integer) nodeInfo.getInt("id"));
         Assert.assertEquals(nodeType, nodeInfo.getString("type"));
 
-        JSONArray propsArray = node.getJSONArray("properties");
-
-        for (int j = 0; j < propsArray.length(); j++) {
-            JSONObject properties = propsArray.getJSONObject(j);
-            String propName = properties.getString("name");
-            if (propName.equals("timeStamp")) {
-                if (timestamp == null || timestampName == null) {
-                    Assert.assertFalse("Timestamp exist", true);
-                } else {
-                    Assert.assertEquals(timestamp, (Integer) properties.getInt("value"));
-                    Assert.assertEquals(timestampName, properties.getString("timestampName"));
-                }
-            }
-            if (propName.equals("actions")) {
-                if (actionsValue == null) {
-                    Assert.assertFalse("Actions exist", true);
-                } else {
-                    Assert.assertEquals(actionsValue, (Integer) properties.getInt("value"));
-                }
-            }
-            if (propName.equals("capabilities")) {
-                if (capabilitiesValue == null) {
-                    Assert.assertFalse("Capabilities exist", true);
-                } else {
-                    Assert.assertEquals(capabilitiesValue, (Integer) properties.getInt("value"));
-                }
-            }
-            if (propName.equals("tables")) {
-                if (tablesValue == null) {
-                    Assert.assertFalse("Tables exist", true);
-                } else {
-                    Assert.assertEquals(tablesValue, (Integer) properties.getInt("value"));
-                }
-            }
-            if (propName.equals("buffers")) {
-                if (buffersValue == null) {
-                    Assert.assertFalse("Buffers exist", true);
-                } else {
-                    Assert.assertEquals(buffersValue, (Integer) properties.getInt("value"));
-                }
-            }
+        JSONObject properties = node.getJSONObject("properties");
+
+        if (timestamp == null || timestampName == null) {
+            Assert.assertFalse(properties.has("timeStamp"));
+        } else {
+            Assert.assertEquals(timestamp, (Integer) properties.getJSONObject("timeStamp").getInt("value"));
+            Assert.assertEquals(timestampName, properties.getJSONObject("timeStamp").getString("name"));
+        }
+        if (actionsValue == null) {
+            Assert.assertFalse(properties.has("actions"));
+        } else {
+            Assert.assertEquals(actionsValue, (Integer) properties.getJSONObject("actions").getInt("value"));
+        }
+        if (capabilitiesValue == null) {
+            Assert.assertFalse(properties.has("capabilities"));
+        } else {
+            Assert.assertEquals(capabilitiesValue,
+                    (Integer) properties.getJSONObject("capabilities").getInt("value"));
+        }
+        if (tablesValue == null) {
+            Assert.assertFalse(properties.has("tables"));
+        } else {
+            Assert.assertEquals(tablesValue, (Integer) properties.getJSONObject("tables").getInt("value"));
+        }
+        if (buffersValue == null) {
+            Assert.assertFalse(properties.has("buffers"));
+        } else {
+            Assert.assertEquals(buffersValue, (Integer) properties.getJSONObject("buffers").getInt("value"));
         }
     }
 
@@ -258,37 +245,27 @@ public class NorthboundIT {
 
         JSONObject nodeConnector = nodeConnectorProperties.getJSONObject("nodeconnector");
         JSONObject node = nodeConnector.getJSONObject("node");
+        JSONObject properties = nodeConnectorProperties.getJSONObject("properties");
 
         Assert.assertEquals(ncId, (Integer) nodeConnector.getInt("id"));
         Assert.assertEquals(ncType, nodeConnector.getString("type"));
         Assert.assertEquals(nodeId, (Integer) node.getInt("id"));
         Assert.assertEquals(nodeType, node.getString("type"));
-
-        JSONArray propsArray = nodeConnectorProperties.getJSONArray("properties");
-        for (int j = 0; j < propsArray.length(); j++) {
-            JSONObject properties = propsArray.getJSONObject(j);
-            String propName = properties.getString("name");
-            if (propName.equals("state")) {
-                if (state == null) {
-                    Assert.assertFalse("State exist", true);
-                } else {
-                    Assert.assertEquals(state, (Integer) properties.getInt("value"));
-                }
-            }
-            if (propName.equals("capabilities")) {
-                if (capabilities == null) {
-                    Assert.assertFalse("Capabilities exist", true);
-                } else {
-                    Assert.assertEquals(capabilities, (Integer) properties.getInt("value"));
-                }
-            }
-            if (propName.equals("bandwidth")) {
-                if (bandwidth == null) {
-                    Assert.assertFalse("bandwidth exist", true);
-                } else {
-                    Assert.assertEquals(bandwidth, (Integer) properties.getInt("value"));
-                }
-            }
+        if (state == null) {
+            Assert.assertFalse(properties.has("state"));
+        } else {
+            Assert.assertEquals(state, (Integer) properties.getJSONObject("state").getInt("value"));
+        }
+        if (capabilities == null) {
+            Assert.assertFalse(properties.has("capabilities"));
+        } else {
+            Assert.assertEquals(capabilities,
+                    (Integer) properties.getJSONObject("capabilities").getInt("value"));
+        }
+        if (bandwidth == null) {
+            Assert.assertFalse(properties.has("bandwidth"));
+        } else {
+            Assert.assertEquals(bandwidth, (Integer) properties.getJSONObject("bandwidth").getInt("value"));
         }
     }
 
@@ -610,19 +587,8 @@ public class NorthboundIT {
         json = new JSONObject(jt);
         node = getJsonInstance(json, "nodeProperties", nodeId_1);
         Assert.assertNotNull(node);
-
-        JSONArray propsArray = node.getJSONArray("properties");
-
-        for (int j = 0; j < propsArray.length(); j++) {
-            JSONObject properties = propsArray.getJSONObject(j);
-            String propName = properties.getString("name");
-            if (propName.equals("tier")) {
-                Assert.assertEquals(1001, properties.getInt("value"));
-            }
-            if (propName.equals("description")) {
-                Assert.assertEquals("node1", properties.getString("value"));
-            }
-        }
+        Assert.assertEquals(1001, node.getJSONObject("properties").getJSONObject("tier").getInt("value"));
+        Assert.assertEquals("node1", node.getJSONObject("properties").getJSONObject("description").getString("value"));
 
         // Test delete nodeConnector property
         // Delete state property of nodeconnector1
@@ -1229,26 +1195,10 @@ public class NorthboundIT {
 
             JSONObject headNC = edge.getJSONObject("headNodeConnector");
             JSONObject headNode = headNC.getJSONObject("node");
-
-            JSONArray propsArray = edgeProp.getJSONArray("properties");
-
-            JSONObject bandw = null;
-            JSONObject stt = null;
-            JSONObject ltc = null;
-
-            for (int j = 0; j < propsArray.length(); j++) {
-                JSONObject props = propsArray.getJSONObject(j);
-                String propName = props.getString("name");
-                if (propName.equals("bandwidth")) {
-                    bandw = props;
-                }
-                if (propName.equals("state")) {
-                    stt = props;
-                }
-                if (propName.equals("latency")) {
-                    ltc = props;
-                }
-            }
+            JSONObject Props = edgeProp.getJSONObject("properties");
+            JSONObject bandw = Props.getJSONObject("bandwidth");
+            JSONObject stt = Props.getJSONObject("state");
+            JSONObject ltc = Props.getJSONObject("latency");
 
             if (headNC.getInt("id") == headNC1_nodeConnId) {
                 Assert.assertEquals(headNode.getString("type"), nodeType);
@@ -1280,7 +1230,6 @@ public class NorthboundIT {
         Integer nodeId_1 = 3366;
         String nodeConnectorType_1 = "STUB";
         Integer nodeConnectorId_1 = 12;
-
         String nodeType_2 = "STUB";
         Integer nodeId_2 = 4477;
         String nodeConnectorType_2 = "STUB";
@@ -1369,7 +1318,6 @@ public class NorthboundIT {
             }
         }
     }
-
     // Configure the OSGi container
     @Configuration
     public Option[] config() {
index d46b17e4f7e2d27bebf7bfb401be64bd038b6806..401cc948b888f5ab38ae99157cb141e551094b4c 100644 (file)
@@ -58,6 +58,7 @@
               org.slf4j,
               org.apache.catalina.filters,
               org.codehaus.jackson.jaxrs,
+              org.codehaus.jackson.annotate,
               !org.codehaus.enunciate.jaxrs
             </Import-Package>
             <Web-ContextPath>/controller/nb/v2/switchmanager</Web-ContextPath>
index 4e67fc405858fed4342d1b0c1921bb1f30ec67f7..43d3aae57c71f33f735f5ad35e1f887e7ad52f1c 100644 (file)
@@ -9,6 +9,9 @@
 
 package org.opendaylight.controller.switchmanager.northbound;
 
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
 import java.util.Set;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlElementRef;
@@ -17,6 +20,8 @@ import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlElementWrapper;
 
+import org.codehaus.jackson.annotate.JsonIgnore;
+import org.codehaus.jackson.annotate.JsonProperty;
 import org.opendaylight.controller.sal.core.NodeConnector;
 import org.opendaylight.controller.sal.core.Property;
 
@@ -31,6 +36,7 @@ public class NodeConnectorProperties {
     private NodeConnector nodeconnector;
     @XmlElementRef
     @XmlElementWrapper
+    @JsonIgnore
     private Set<Property> properties;
 
     // JAXB required constructor
@@ -44,6 +50,19 @@ public class NodeConnectorProperties {
         this.properties = properties;
     }
 
+    @JsonProperty(value="properties")
+    public Map<String, Property> getMapProperties() {
+        Map<String, Property> map = new HashMap<String, Property>();
+        for (Property p : properties) {
+            map.put(p.getName(), p);
+        }
+        return map;
+    }
+
+    public void setMapProperties(Map<String, Property> propertiesMap) {
+        this.properties = new HashSet<Property>(propertiesMap.values());
+    }
+
     public Set<Property> getProperties() {
         return properties;
     }
index 979a8e9776c6faa1ef798cd36a8557e0aa6f73fc..58a024c928d17be3f8060ed5fc812ce10d66f839 100644 (file)
@@ -9,6 +9,9 @@
 
 package org.opendaylight.controller.switchmanager.northbound;
 
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
 import java.util.Set;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlElementRef;
@@ -17,6 +20,8 @@ import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlElementWrapper;
 
+import org.codehaus.jackson.annotate.JsonIgnore;
+import org.codehaus.jackson.annotate.JsonProperty;
 import org.opendaylight.controller.sal.core.Node;
 import org.opendaylight.controller.sal.core.Property;
 
@@ -31,6 +36,7 @@ public class NodeProperties {
     private Node node;
     @XmlElementRef
     @XmlElementWrapper
+    @JsonIgnore
     private Set<Property> properties;
 
     // JAXB required constructor
@@ -44,6 +50,19 @@ public class NodeProperties {
         this.properties = properties;
     }
 
+    @JsonProperty(value="properties")
+    public Map<String, Property> getMapProperties() {
+        Map<String, Property> map = new HashMap<String, Property>();
+        for (Property p : properties) {
+            map.put(p.getName(), p);
+        }
+        return map;
+    }
+
+    public void setMapProperties(Map<String, Property> propertiesMap) {
+        this.properties = new HashSet<Property>(propertiesMap.values());
+    }
+
     public Set<Property> getProperties() {
         return properties;
     }
index ec3489aca2855b6da48f82364c9b175dda8ff6de..d379164a14f483ddf123224bad12cad9996fb345 100644 (file)
@@ -54,6 +54,7 @@
               org.opendaylight.controller.usermanager,
               org.opendaylight.controller.topologymanager,
               com.sun.jersey.spi.container.servlet,
+              org.codehaus.jackson.annotate,
               javax.ws.rs,
               javax.ws.rs.core,
               javax.xml.bind,
index b8be7c18d3e948fe8dc15bb9a1ac1286d59578f6..6614bbe640d804030c5aa8fd49fb9e26a2ccc45f 100644 (file)
@@ -9,6 +9,9 @@
 
 package org.opendaylight.controller.topology.northbound;
 
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
 import java.util.Set;
 
 import javax.xml.bind.annotation.XmlAccessType;
@@ -18,6 +21,8 @@ import javax.xml.bind.annotation.XmlElementRef;
 import javax.xml.bind.annotation.XmlElementWrapper;
 import javax.xml.bind.annotation.XmlRootElement;
 
+import org.codehaus.jackson.annotate.JsonIgnore;
+import org.codehaus.jackson.annotate.JsonProperty;
 import org.opendaylight.controller.sal.core.Edge;
 import org.opendaylight.controller.sal.core.Property;
 
@@ -28,6 +33,7 @@ public class EdgeProperties {
     private Edge edge;
     @XmlElementRef
     @XmlElementWrapper
+    @JsonIgnore
     private Set<Property> properties;
 
     // JAXB required constructor
@@ -41,10 +47,22 @@ public class EdgeProperties {
         this.properties = properties;
     }
 
+    @JsonProperty(value="properties")
+    public Map<String, Property> getMapProperties() {
+        Map<String, Property> map = new HashMap<String, Property>();
+        for (Property p : properties) {
+            map.put(p.getName(), p);
+        }
+        return map;
+    }
+
+    public void setMapProperties(Map<String, Property> propertiesMap) {
+        this.properties = new HashSet<Property>(propertiesMap.values());
+    }
+
     public Set<Property> getProperties() {
         return properties;
     }
-
     public void setProperties(Set<Property> properties) {
         this.properties = properties;
     }
index 7b934edfa78df7ad08cf427545c8d1b3f6f502ff..6cada2c0417788291aa62491513e851645599f08 100644 (file)
@@ -9,6 +9,8 @@
 
 package org.opendaylight.controller.sal.core;
 
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlRootElement;
 
@@ -21,6 +23,7 @@ import javax.xml.bind.annotation.XmlRootElement;
  */
 
 @XmlRootElement
+@XmlAccessorType(XmlAccessType.NONE)
 public class Actions extends Property {
         private static final long serialVersionUID = 1L;
     @XmlElement(name="value")
index ab546d73023c6c5fe45a03387969eba0beff58cb..a0b5c0a18c777d61fb884c3d440762a9193265f2 100644 (file)
@@ -9,6 +9,8 @@
 
 package org.opendaylight.controller.sal.core;
 
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlRootElement;
 
 /**
@@ -21,6 +23,7 @@ import javax.xml.bind.annotation.XmlRootElement;
  * seconds.
  */
 @XmlRootElement
+@XmlAccessorType(XmlAccessType.NONE)
 @SuppressWarnings("serial")
 public class AdvertisedBandwidth extends Bandwidth {
         public static final String AdvertisedBandwidthPropName = "advertisedBandwidth";
index 8c3a97751804215414c9ae9aaa0c3206482921a1..5083cf57d759bb0a9f118f484e5b0dde36283604 100644 (file)
@@ -9,6 +9,8 @@
 
 package org.opendaylight.controller.sal.core;
 
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlRootElement;
 
@@ -22,6 +24,7 @@ import javax.xml.bind.annotation.XmlRootElement;
  * seconds.
  */
 @XmlRootElement
+@XmlAccessorType(XmlAccessType.NONE)
 public class Bandwidth extends Property {
     private static final long serialVersionUID = 1L;
 
index 4c6e08102b214341f237e01d6280d375aaf30eeb..274b0f481d397795651950b9abc75b7bab0ad0c1 100644 (file)
@@ -9,6 +9,8 @@
 
 package org.opendaylight.controller.sal.core;
 
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlRootElement;
 
@@ -20,6 +22,7 @@ import javax.xml.bind.annotation.XmlRootElement;
  * Describes supported buffers (#packets)
  */
 @XmlRootElement
+@XmlAccessorType(XmlAccessType.NONE)
 public class Buffers extends Property {
         private static final long serialVersionUID = 1L;
     @XmlElement(name="value")
index b2005913d0dc214d5f2ef9d496969d1452020fde..147f1b13aedc32e6c3f50ebdf5badcaca010a85b 100644 (file)
@@ -9,6 +9,8 @@
 
 package org.opendaylight.controller.sal.core;
 
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlRootElement;
 
@@ -20,6 +22,7 @@ import javax.xml.bind.annotation.XmlRootElement;
  * Describes supported capabilities
  */
 @XmlRootElement
+@XmlAccessorType(XmlAccessType.NONE)
 public class Capabilities extends Property {
         private static final long serialVersionUID = 1L;
     @XmlElement(name="value")
index 651c2f44e12ac8f3a93612b6dda5c3e8ca820e1c..64562fa6ed9571098edad14c021cafbdd9496f2c 100644 (file)
@@ -8,6 +8,8 @@
 
 package org.opendaylight.controller.sal.core;
 
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlRootElement;
 
@@ -18,6 +20,7 @@ import javax.xml.bind.annotation.XmlRootElement;
  */
 @XmlRootElement
 @SuppressWarnings("serial")
+@XmlAccessorType(XmlAccessType.NONE)
 public class Config extends Property {
     @XmlElement(name="value")
     private short configValue;
index ebc12cdbf7a28d86cdafce135e0e98881846806b..88ab11b354341ac4a4888442611173cdc7e66850 100644 (file)
@@ -1,5 +1,7 @@
 package org.opendaylight.controller.sal.core;
 
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlRootElement;
 
@@ -8,6 +10,7 @@ import javax.xml.bind.annotation.XmlRootElement;
  */
 @XmlRootElement
 @SuppressWarnings("serial")
+@XmlAccessorType(XmlAccessType.NONE)
 public class Description extends Property {
     @XmlElement(name="value")
     private String descriptionValue;
index 1b19f19778ddba6c21ae8437d5e06be44b7d3898..c6d7f634092c2ae8050c54753f2e5d7ae22169d3 100644 (file)
@@ -1,5 +1,7 @@
 package org.opendaylight.controller.sal.core;
 
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlRootElement;
 
@@ -7,6 +9,7 @@ import javax.xml.bind.annotation.XmlRootElement;
  * The class represents the forwarding mode property of a node.
  */
 @XmlRootElement
+@XmlAccessorType(XmlAccessType.NONE)
 @SuppressWarnings("serial")
 public class ForwardingMode extends Property {
     @XmlElement(name="value")
index a64ee105cf0efab3f7f6559a89f85deb6639872b..1320bbb69333b16a14f072a94be72f11e77482ba 100644 (file)
@@ -9,6 +9,8 @@
 
 package org.opendaylight.controller.sal.core;
 
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlRootElement;
 
@@ -20,6 +22,7 @@ import javax.xml.bind.annotation.XmlRootElement;
  * Describe a latency in picoseconds or multiple of its.
  */
 @XmlRootElement
+@XmlAccessorType(XmlAccessType.NONE)
 public class Latency extends Property {
     private static final long serialVersionUID = 1L;
 
index 92c8454a4d6d77d92bb1b669883a252fe7237087..65c089956a95eb876d21ee3e9f0a169f5b1f1c20 100644 (file)
@@ -9,6 +9,8 @@
 
 package org.opendaylight.controller.sal.core;
 
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlRootElement;
 
@@ -16,6 +18,7 @@ import javax.xml.bind.annotation.XmlRootElement;
  * The class represents the Name property of an element.
  */
 @XmlRootElement
+@XmlAccessorType(XmlAccessType.NONE)
 @SuppressWarnings("serial")
 public class Name extends Property {
     @XmlElement(name="value")
index a1b436ef1a24b52b2a6d8f7578c91147ea80875d..d01e528b57d0a54ecdf5982a105ffd11419b1811 100644 (file)
@@ -9,6 +9,8 @@
 
 package org.opendaylight.controller.sal.core;
 
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlRootElement;
 
 /**
@@ -20,6 +22,7 @@ import javax.xml.bind.annotation.XmlRootElement;
  *  bits per seconds.
  */
 @XmlRootElement
+@XmlAccessorType(XmlAccessType.NONE)
 public class PeerBandwidth extends Bandwidth {
         private static final long serialVersionUID = 1L;
 
index a5deb547e351c1f154fd0eade864173aa82c011b..9dc00d0dcd8415bac697b4d9839da226a2e34598 100644 (file)
@@ -10,6 +10,8 @@ package org.opendaylight.controller.sal.core;
 
 import java.io.Serializable;
 
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlSeeAlso;
 
@@ -28,6 +30,7 @@ import javax.xml.bind.annotation.XmlSeeAlso;
  * element
  */
 @XmlRootElement
+@XmlAccessorType(XmlAccessType.NONE)
 @XmlSeeAlso({ Config.class, Name.class, State.class, TimeStamp.class,
     Latency.class, Bandwidth.class, Tier.class, Actions.class,
     AdvertisedBandwidth.class, Buffers.class, Capabilities.class,
index e47542a7bef9f259bfab5ca21bbca82fc528e980..d74f7183deeac4c88cb822df21c3547d1c78e00d 100644 (file)
@@ -9,6 +9,8 @@
 
 package org.opendaylight.controller.sal.core;
 
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlRootElement;
 
@@ -18,6 +20,7 @@ import javax.xml.bind.annotation.XmlRootElement;
  *
  */
 @XmlRootElement
+@XmlAccessorType(XmlAccessType.NONE)
 @SuppressWarnings("serial")
 public class State extends Property {
     @XmlElement(name="value")
index cd6589ed6d3da0d492fa1217dff859dc3dd56d89..7bcc0e01aa7f922af538e688b18a0331199fe859 100644 (file)
@@ -9,6 +9,8 @@
 
 package org.opendaylight.controller.sal.core;
 
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlRootElement;
 
 /**
@@ -21,6 +23,7 @@ import javax.xml.bind.annotation.XmlRootElement;
  * seconds.
  */
 @XmlRootElement
+@XmlAccessorType(XmlAccessType.NONE)
 public class SupportedBandwidth extends Bandwidth {
         private static final long serialVersionUID = 1L;
         public static final String SupportedBandwidthPropName = "supportedBandwidth";
index b92c4b693c063bb6e9a093b84ee32c62de19f8fa..724c8427f6edbe0003ed202930d0267cba04ede4 100644 (file)
@@ -9,6 +9,8 @@
 
 package org.opendaylight.controller.sal.core;
 
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlRootElement;
 
@@ -20,6 +22,7 @@ import javax.xml.bind.annotation.XmlRootElement;
  * Describes supported # of datapath tables
  */
 @XmlRootElement
+@XmlAccessorType(XmlAccessType.NONE)
 public class Tables extends Property {
         private static final long serialVersionUID = 1L;
     @XmlElement(name="value")
index d1af778526bce58b9a1e8841a3cb8d2d64aa5712..33c87db650404f9ca6b79c69e8703844ff047172 100644 (file)
@@ -9,6 +9,8 @@
 
 package org.opendaylight.controller.sal.core;
 
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlRootElement;
 
@@ -18,6 +20,7 @@ import javax.xml.bind.annotation.XmlRootElement;
  *
  */
 @XmlRootElement
+@XmlAccessorType(XmlAccessType.NONE)
 @SuppressWarnings("serial")
 public class Tier extends Property {
     @XmlElement(name="value")
index c0c8da7ae2fa569c20975f91f1ac7f81bd409052..67f2b25bd272a67027a91174163d1b372dc41bb0 100644 (file)
@@ -11,6 +11,8 @@ package org.opendaylight.controller.sal.core;
 
 import java.util.Date;
 
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlRootElement;
 
@@ -25,11 +27,12 @@ import javax.xml.bind.annotation.XmlRootElement;
  * to qualify what are we talking about
  */
 @XmlRootElement
+@XmlAccessorType(XmlAccessType.NONE)
 public class TimeStamp extends Property {
     private static final long serialVersionUID = 1L;
     @XmlElement(name = "value")
     private long timestamp;
-    @XmlElement(name = "timestampName")
+    @XmlElement(name = "name")
     private String timestampName;
 
     public static final String TimeStampPropName = "timeStamp";
index cdb4463c02acb2636a0991053f9e64951e3f3ba5..66e6e65706fc2b23a1498b589a4e94fafbe3e7bf 100644 (file)
@@ -168,7 +168,8 @@ public enum IPProtocols {
      WESP("WESP",141),
      ROHC("ROHC",142);
      */
-    private static final String regexNumberString = "^[0-9]+$";
+    private static final String regexDecimalString = "^[0-9]{3}$";
+    private static final String regexHexString = "^(0(x|X))[0-9a-fA-F]{2}$";
     private String protocolName;
     private int protocolNumber;
 
@@ -215,7 +216,10 @@ public enum IPProtocols {
     }
 
     public static short getProtocolNumberShort(String name) {
-        if (name.matches(regexNumberString)) {
+        if (name.matches(regexHexString)) {
+            return Short.valueOf(Short.decode(name));
+        }
+        if (name.matches(regexDecimalString)) {
             return Short.valueOf(name);
         }
         for (IPProtocols proto : IPProtocols.values()) {
@@ -227,7 +231,10 @@ public enum IPProtocols {
     }
 
     public static int getProtocolNumberInt(String name) {
-        if (name.matches(regexNumberString)) {
+        if (name.matches(regexHexString)) {
+            return Integer.valueOf(Integer.decode(name));
+        }
+        if (name.matches(regexDecimalString)) {
             return Integer.valueOf(name);
         }
         for (IPProtocols proto : IPProtocols.values()) {
@@ -239,7 +246,10 @@ public enum IPProtocols {
     }
 
     public static byte getProtocolNumberByte(String name) {
-        if (name.matches(regexNumberString)) {
+        if (name.matches(regexHexString)) {
+            return Integer.valueOf(Integer.decode(name)).byteValue();
+        }
+        if (name.matches(regexDecimalString)) {
             return Integer.valueOf(name).byteValue();
         }
         for (IPProtocols proto : IPProtocols.values()) {
index 626eabd16a5a452beea20945957d71c17d117912..e0f60e4054e4b919fc5303ec4b062b6a3d1bce07 100644 (file)
@@ -4,92 +4,92 @@ module opendaylight-group-types {
 
     import ietf-inet-types {prefix inet;}
     import ietf-yang-types {prefix yang;}
-       import opendaylight-flow-types {prefix flow-types;}
+    import opendaylight-flow-types {prefix flow-types;}
 
-    revision "2013-09-17" {
+    revision "2013-09-18" {
         description "Initial revision of group service";
     }
 
-       typedef group-ref {
-               type instance-identifier;
-       }
-       
-       grouping group-types {
-               leaf group-type {
-                       type enumeration {
-                               enum group-all;
-                               enum group_select;
-                               enum group_indirect;
-                               enum group_ff;
-                       }
-               }
-       }
-       
-       grouping group {
+    typedef group-ref {
+        type instance-identifier;
+    }
+    
+    grouping group-types {
+        leaf group-type {
+            type enumeration {
+                enum group-all;
+                enum group_select;
+                enum group_indirect;
+                enum group_ff;
+            }
+        }
+    }
+    
+    grouping group {
         
         uses group-types;       
-               
-               leaf group-id {
+        
+        leaf group-id {
             type group-ref;
         }
-               
-               container buckets {
-                       list bucket {
-                               key "order";
-                               leaf order {
-                                       type int32;
-                               }
-                               
-                               leaf weight {
-                                       type uint16;
-                               }
-                               
-                               leaf watch_port {
-                                       type uint32;
-                               }
-                               
-                               leaf watch_group {
-                                       type uint32;
-                               }
-                               
-                               container actions {
-                                       list action {
-                                               key "action-order";
-                                               leaf action-order {
-                                                       type int32;
-                                               }
+        
+        container buckets {
+            list bucket {
+                key "order";
+                leaf order {
+                    type int32;
+                }
+                
+                leaf weight {
+                    type uint16;
+                }
+                
+                leaf watch_port {
+                    type uint32;
+                }
+                
+                leaf watch_group {
+                    type uint32;
+                }
+                
+                container actions {
+                    list action {
+                        key "action-order";
+                        leaf action-order {
+                            type int32;
+                        }
+            
+                        uses flow-types:action;
+                    }
+                }
+            }
+        }
+    }
+    
+    grouping group-statistics-request {
+        list group-stats {
+            key "group-id";         
             
-                                               uses flow-types:action;
-                                       }
-                               }
-                       }
-               }
+            leaf group-id {
+                type int32;
+            }           
+        }
     }
-       
-       grouping group-statistics-request {
-               list group-stats {
-                       key "group-id";                 
-                       
-                       leaf group-id {
-                               type int32;
-                       }                       
-               }
-       }
-       
-       grouping group-statistics {
-                       
-               leaf group-id {
+    
+    grouping group-statistics {
+            
+        leaf group-id {
             type int32;
-               }
-               
-           leaf ref-count {
+        }
+        
+        leaf ref-count {
             type yang:counter32;
-               }
-               
-               leaf packet-count {
+        }
+        
+        leaf packet-count {
             type yang:counter64;
         } 
-               
+        
         leaf byte-count {
             type yang:counter64;
         }
@@ -102,74 +102,74 @@ module opendaylight-group-types {
                 type yang:counter32;
             }
         }
-               
-               container buckets {
-                       list bucket-counter {
-                               key "order";
-                               leaf order {
-                                       type int32;
-                               }
-                               
-                               leaf packet-count {
-                                       type yang:counter64;
-                               
-               
-                               leaf byte-count {
-                                       type yang:counter64;
-                               }
-                       }
-               }               
+        
+        container buckets {
+            list bucket-counter {
+                key "order";
+                leaf order {
+                    type int32;
+                }
+                
+                leaf packet-count {
+                    type yang:counter64;
+                } 
+        
+                leaf byte-count {
+                    type yang:counter64;
+                }
+            }
+        }       
     }
 
-       grouping group-statistics-reply {
-               list group-stats {
-                       key "group-stats-order";
-                       leaf group-stats-order {
-                               type int32;
-                       }
-                       
-                       uses group-statistics;
-               }
-       }
-       
-       grouping group-desc-stats {
-               list group-desc-stats {
-                       key "order-id";                 
-                       
-                       leaf order-id {
-                               type int32;
-                       }
-                       
-                       uses group;
-               }
-       }
-       
+    grouping group-statistics-reply {
+        list group-stats {
+            key "group-stats-order";
+            leaf group-stats-order {
+                type int32;
+            }
+            
+            uses group-statistics;
+        }
+    }
+    
+    grouping group-desc-stats {
+        list group-desc-stats {
+            key "order-id";         
+            
+            leaf order-id {
+                type int32;
+            }
+            
+            uses group;
+        }
+    }
+    
     grouping group-features {
-               list group-features {
-                       key "order";
-                       leaf order {
-                               type int32;
-                       }
-                       
-                       uses group-types;
-                       type capabilities {
-                               enum select-weight;
-                               enum select-liveness;
-                               enum chaining;
-                               enum chaining-checks;
-                       }       
+        list group-features {
+            key "order";
+            leaf order {
+                type int32;
+            }
+            
+            uses group-types;
+            type capabilities {
+                enum select-weight;
+                enum select-liveness;
+                enum chaining;
+                enum chaining-checks;
+            }   
 
-                       leaf-list max-groups {
-                               type uint32;
-                               description "Maximum number of groups for each type";
-                               max-elements 4;
-                       }
-                       
-                       leaf-list actions {
-                               type uint32;
-                               description "Bitmap number OFPAT_* that are supported";
-                               max-elements 4;
-                       }
-               }
-       }    
+            leaf-list max-groups {
+                type uint32;
+                description "Maximum number of groups for each type";
+                max-elements 4;
+            }
+            
+            leaf-list actions {
+                type uint32;
+                description "Bitmap number OFPAT_* that are supported";
+                max-elements 4;
+            }
+        }
+    }    
 }
\ No newline at end of file
diff --git a/opendaylight/sal/yang-prototype/sal/model/model-flow-base/src/main/yang/meter-types.yang b/opendaylight/sal/yang-prototype/sal/model/model-flow-base/src/main/yang/meter-types.yang
new file mode 100644 (file)
index 0000000..cf309f1
--- /dev/null
@@ -0,0 +1,213 @@
+module opendaylight-meter-types {
+    namespace "urn:opendaylight:meter:types";
+    prefix meter;
+
+    import ietf-inet-types {prefix inet;}
+    import ietf-yang-types {prefix yang;}
+
+
+    revision "2013-09-18" {
+        description "Initial revision of meter service";
+    }
+
+    typedef meter-ref {
+            type instance-identifier;
+    }
+    
+    grouping meter-flags {
+        leaf flags {
+            type enumeration {
+                enum meter-kbps;
+                enum meter_pktps;
+                enum meter_burst;
+                enum meter_stats;
+            }
+        }
+    }
+    
+    grouping meter-band-type {
+        leaf flags {
+            type enumeration {
+                enum ofpmbt-drop;
+                enum ofpmbt-dscp-remark;
+                enum ofpmbt-experimenter;               
+            }
+        }
+    }
+    
+    grouping band-type {
+        choice band-type {
+            case drop {
+                leaf rate {
+                    type uint32;
+                }
+                
+                leaf burst-size {
+                    type uint32;
+                }
+            }
+
+            case dscp-remark {
+                leaf rate {
+                    type uint32;
+                }
+                
+                leaf burst-size {
+                    type uint32;
+                }
+                
+                leaf perc_level {
+                    type uint8;
+                }
+            }
+            
+            case experimenter {
+                leaf rate {
+                    type uint32;
+                }
+                
+                leaf burst-size {
+                    type uint32;
+                }
+                
+                leaf experimenter {
+                    type uint32;
+                }
+            }
+        }
+    }
+    
+    grouping meter {
+        
+        uses meter-flags;        
+        
+        leaf meter-id {
+            type meter-ref;
+        }
+        
+        container meter-band-headers {
+            list meter-band-header {
+                key "order";
+                leaf order {
+                    type int32;
+                }
+                
+                container meter-band-types {
+                    uses meter-band-type;
+                }
+            
+                leaf burst-size {
+                    type uint32;
+                }
+                uses band-type;
+            }
+        }
+    }
+    
+    grouping meter-stats-config-request {
+        list meter-stats {
+            key "meter-id";         
+            
+            leaf meter-id {
+                type int32;
+            }           
+        }
+    }
+    
+    grouping meter-statistics {
+            
+        leaf meter-id {
+            type int32;
+        }
+        
+        leaf flow-count {
+            type yang:counter32;
+        }
+        
+        leaf packet-in-count {
+            type yang:counter64;
+        } 
+        
+        leaf byte-in-count {
+            type yang:counter64;
+        }
+
+        container duration {
+            leaf second {
+                type yang:counter32;
+            }
+            leaf nanosecond {
+                type yang:counter32;
+            }
+        }
+        
+        container meter-band-stats {
+            list band-stat {
+                key "order";
+                leaf order {
+                    type int32;
+                }
+            
+                leaf packet-band-count {
+                    type yang:counter64;
+                } 
+        
+                leaf byte-band-count {
+                    type yang:counter64;
+                }
+            }       
+        }
+    }
+
+    grouping meter-statistics-reply {
+        list meter-stats {
+            key "meter-stats-order";
+            leaf meter-stats-order {
+                type int32;
+            }
+            uses meter-statistics;
+        }
+    }
+    
+    grouping meter-config-stats {
+        list meter-config-stats {
+            key "meter-config-order";
+            
+            leaf meter-config-order {
+                type int32;
+            }
+            
+            uses meter;
+        } 
+    }
+    
+    grouping meter-features {
+        list meter-features {
+            key "meter-feature-order";
+            
+            leaf meter-feature-order {
+                type yang:counter32;
+            }          
+            
+            leaf max_meter {
+                type yang:counter32;
+            }
+            
+            leaf band_types {
+                type yang:counter32;
+            }
+            
+            leaf capabilities {
+                type yang:counter32;
+            }
+            
+            leaf max_bands {
+                type uint8;
+            }
+            
+            leaf max_color {
+                type uint8;
+            }
+        }
+    }    
+}
\ No newline at end of file
index 1ea2d34a38ac9e8ad05f5ba7996aca7ffb75e487..866b359c29959ec63c1a6915d51b85dbc23c7407 100644 (file)
@@ -7,10 +7,10 @@ module sal-group {
     import ietf-inet-types {prefix inet;}
     import opendaylight-group-types {prefix group-type;}
 
-    revision "2013-09-17" {
+    revision "2013-09-18" {
         description "Initial revision of group service";
     }        
-       
+    
     grouping node-group {
         leaf node {
             type inv:node-ref;
diff --git a/opendaylight/sal/yang-prototype/sal/model/model-flow-service/src/main/yang/meter-service.yang b/opendaylight/sal/yang-prototype/sal/model/model-flow-service/src/main/yang/meter-service.yang
new file mode 100644 (file)
index 0000000..f9cbd64
--- /dev/null
@@ -0,0 +1,49 @@
+module sal-meter {
+    namespace "urn:opendaylight:meter:service";
+    prefix meter;
+
+    import yang-ext {prefix ext;}
+    import opendaylight-inventory {prefix inv;}
+    import ietf-inet-types {prefix inet;}
+    import opendaylight-meter-types {prefix meter-type;}
+
+    revision "2013-09-18" {
+        description "Initial revision of meter service";
+    }        
+    
+    metering node-meter {
+        leaf node {
+            type inv:node-ref;
+        }
+        
+        uses meter-type:meter;
+    }
+
+    /** Base configuration structure **/
+    metering meter-update {
+        container original-meter {
+            uses meter-type:meter;
+        }
+        container updated-meter {
+            uses meter-type:meter;
+        }
+    }
+
+    rpc add-meter {
+        input {
+            uses node-meter;
+        }
+    }
+
+    rpc remove-meter {
+        input {
+            uses node-meter;
+        }
+    }
+
+    rpc update-meter {
+        input {
+            uses node-meter;
+        }
+    }     
+}
\ No newline at end of file