Update SubnetConfig Validation 72/3872/5
authorKatelyn Kasperowicz <kkaspero@cisco.com>
Fri, 20 Dec 2013 15:42:15 +0000 (07:42 -0800)
committerKatelyn Kasperowicz <kkaspero@cisco.com>
Mon, 23 Dec 2013 22:17:26 +0000 (14:17 -0800)
-SubnetConfig now validates that the address does not begin with 0 or 255
-Validates that host address is not set to all zeros or ones
-Caught exception when subnet not set to number

Change-Id: I825e2d54b48b7f74e35cfde8dc7e5967dac11684
Signed-off-by: Katelyn Kasperowicz <kkaspero@cisco.com>
opendaylight/switchmanager/api/src/main/java/org/opendaylight/controller/switchmanager/SubnetConfig.java

index 189476a5d1bb1c1420c683bf4ea6a6c2a07b3d7b..4f06b79f490c55ddd530924cab3f75705255c8bc 100644 (file)
@@ -1,4 +1,3 @@
-
 /*
  * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.
  *
@@ -35,8 +34,8 @@ import org.opendaylight.controller.sal.utils.StatusCode;
 @XmlAccessorType(XmlAccessType.NONE)
 public class SubnetConfig implements Cloneable, Serializable {
     private static final long serialVersionUID = 1L;
-    private static final String prettyFields[] = { GUIField.NAME.toString(),
-            GUIField.GATEWAYIP.toString(), GUIField.NODEPORTS.toString() };
+    private static final String prettyFields[] = { GUIField.NAME.toString(), GUIField.GATEWAYIP.toString(),
+            GUIField.NODEPORTS.toString() };
 
     /**
      * Name of the subnet
@@ -44,14 +43,13 @@ public class SubnetConfig implements Cloneable, Serializable {
     @XmlElement
     private String name;
     /**
-     * A.B.C.D/MM  Where A.B.C.D is the Default
-     * Gateway IP (L3) or ARP Querier IP (L2)
+     * A.B.C.D/MM Where A.B.C.D is the Default Gateway IP (L3) or ARP Querier IP
+     * (L2)
      */
     @XmlElement
     private String subnet;
     /**
-     * Set of node connectors in the format:
-     * Port Type|Port Id@Node Type|Node Id
+     * Set of node connectors in the format: Port Type|Port Id@Node Type|Node Id
      */
     @XmlElement
     private List<String> nodeConnectors;
@@ -68,7 +66,8 @@ public class SubnetConfig implements Cloneable, Serializable {
     public SubnetConfig(SubnetConfig subnetConfig) {
         name = subnetConfig.name;
         subnet = subnetConfig.subnet;
-        nodeConnectors = (subnetConfig.nodeConnectors == null) ? null : new ArrayList<String>(subnetConfig.nodeConnectors);
+        nodeConnectors = (subnetConfig.nodeConnectors == null) ? null : new ArrayList<String>(
+                subnetConfig.nodeConnectors);
     }
 
     public String getName() {
@@ -96,22 +95,43 @@ public class SubnetConfig implements Cloneable, Serializable {
     public Short getIPMaskLen() {
         Short maskLen = 0;
         String[] s = subnet.split("/");
-        maskLen = (s.length == 2) ? Short.valueOf(s[1]) : 32;
+
+        try {
+            maskLen = (s.length == 2) ? Short.valueOf(s[1]) : 32;
+        } catch (NumberFormatException e) {
+            maskLen = 32;
+        }
         return maskLen;
     }
 
     private Status validateSubnetAddress() {
         if (!NetUtils.isIPAddressValid(subnet)) {
-            return new Status(StatusCode.BADREQUEST, String.format("Invalid Subnet configuration: Invalid address: %s", subnet));
+            return new Status(StatusCode.BADREQUEST, String.format("Invalid Subnet configuration: Invalid address: %s",
+                    subnet));
+        }
+        if ((this.getIPMaskLen() == 0) || (this.getIPMaskLen() == 32)) {
+            return new Status(StatusCode.BADREQUEST, String.format("Invalid Subnet configuration: Invalid mask: /%s",
+                    this.getIPMaskLen()));
         }
-        if((this.getIPMaskLen() == 0) || (this.getIPMaskLen() == 32)) {
-            return new Status(StatusCode.BADREQUEST, String.format("Invalid Subnet configuration: Invalid mask: /%s", this.getIPMaskLen()));
+
+        //checks that address doesn't start with 0 or 255
+        String address = subnet.split("/")[0];
+        if (address.startsWith("0.") || address.startsWith("255.")) {
+            return  new Status(StatusCode.BADREQUEST, String.format("Invalid Subnet configuration: Invalid address: %s", address));
         }
+
         byte[] bytePrefix = NetUtils.getSubnetPrefix(this.getIPAddress(), this.getIPMaskLen()).getAddress();
         long prefix = BitBufferHelper.getLong(bytePrefix);
         if (prefix == 0) {
             return new Status(StatusCode.BADREQUEST, "Invalid network source address: subnet zero");
         }
+
+        //check that host is not set to all 0's or 1's
+        long hostAddress = BitBufferHelper.getLong(this.getIPAddress().getAddress()) - prefix;
+        if (hostAddress == 0 || hostAddress == Math.pow(2, 32-this.getIPMaskLen()) - 1) {
+            return new Status(StatusCode.BADREQUEST, String.format("Invalid subnet gateway address: /%s", subnet));
+        }
+
         return new Status(StatusCode.SUCCESS);
     }
 
@@ -158,7 +178,8 @@ public class SubnetConfig implements Cloneable, Serializable {
     }
 
     public boolean isGlobal() {
-        // If no ports are specified to be part of the domain, then it's a global domain IP
+        // If no ports are specified to be part of the domain, then it's a
+        // global domain IP
         return (nodeConnectors == null || nodeConnectors.isEmpty());
     }
 
@@ -180,8 +201,7 @@ public class SubnetConfig implements Cloneable, Serializable {
 
     @Override
     public String toString() {
-        return ("SubnetConfig [Name=" + name + ", Subnet=" + subnet
-                + ", NodeConnectors=" + nodeConnectors + "]");
+        return ("SubnetConfig [Name=" + name + ", Subnet=" + subnet + ", NodeConnectors=" + nodeConnectors + "]");
     }
 
     /**