Structural changes in Server Device Driver

This patch groups together Network Interface Card (NIC)-related
functionality in devices/nic folder because a subsequent patch
will further extend the functionality of NIC devices with the
ability to implement programmable FlowRules
(i.e, by implementing FlowRuleProgrammable).

Also, some common functionality is moved to BasicServerDriver,
thus removing redundancy from ServerDevicesDiscovery.

Removed forgotten dead code

Change-Id: Ic9088ad5a577608a628d5f62fbc1d08326801f3b
Signed-off-by: Georgios Katsikas <katsikas.gp@gmail.com>
diff --git a/drivers/server/src/main/java/org/onosproject/drivers/server/BasicServerDriver.java b/drivers/server/src/main/java/org/onosproject/drivers/server/BasicServerDriver.java
index ba16a3a..3cc18e0 100644
--- a/drivers/server/src/main/java/org/onosproject/drivers/server/BasicServerDriver.java
+++ b/drivers/server/src/main/java/org/onosproject/drivers/server/BasicServerDriver.java
@@ -46,6 +46,16 @@
     public    static final String BASE_URL = ROOT_URL + "/metron";
 
     /**
+     * Common parameters to be exchanged with the server's agent.
+     */
+    public static final String PARAM_ID             = "id";
+    public static final String PARAM_NICS           = "nics";
+    public static final String PARAM_CPUS           = "cpus";
+    public static final String NIC_PARAM_RX_FILTER  = "rxFilter";
+    public static final String NIC_PARAM_RX_METHOD  = "method";
+
+
+    /**
      * Successful HTTP status codes.
      */
     private static final int STATUS_OK = Response.Status.OK.getStatusCode();
@@ -99,7 +109,7 @@
      *
      * @return RestSBController instance
      */
-    protected RestSBController getController() {
+    public RestSBController getController() {
         synchronized (CONTROLLER_LOCK) {
             if (controller == null) {
                 init();
diff --git a/drivers/server/src/main/java/org/onosproject/drivers/server/ServerDevicesDiscovery.java b/drivers/server/src/main/java/org/onosproject/drivers/server/ServerDevicesDiscovery.java
index 8d08585..8a009f3 100644
--- a/drivers/server/src/main/java/org/onosproject/drivers/server/ServerDevicesDiscovery.java
+++ b/drivers/server/src/main/java/org/onosproject/drivers/server/ServerDevicesDiscovery.java
@@ -20,9 +20,9 @@
 import org.onosproject.drivers.server.behavior.MonitoringStatisticsDiscovery;
 import org.onosproject.drivers.server.devices.CpuDevice;
 import org.onosproject.drivers.server.devices.CpuVendor;
-import org.onosproject.drivers.server.devices.NicDevice;
-import org.onosproject.drivers.server.devices.NicRxFilter;
-import org.onosproject.drivers.server.devices.NicRxFilter.RxFilter;
+import org.onosproject.drivers.server.devices.nic.NicDevice;
+import org.onosproject.drivers.server.devices.nic.NicRxFilter;
+import org.onosproject.drivers.server.devices.nic.NicRxFilter.RxFilter;
 import org.onosproject.drivers.server.devices.ServerDeviceDescription;
 import org.onosproject.drivers.server.devices.RestServerSBDevice;
 import org.onosproject.drivers.server.stats.CpuStatistics;
@@ -104,13 +104,10 @@
     /**
      * Parameters to be exchanged with the server's agent.
      */
-    private static final String PARAM_ID               = "id";
-    private static final String PARAM_CPUS             = "cpus";
     private static final String PARAM_MANUFACTURER     = "manufacturer";
     private static final String PARAM_HW_VENDOR        = "hwVersion";
     private static final String PARAM_SW_VENDOR        = "swVersion";
     private static final String PARAM_SERIAL           = "serial";
-    private static final String PARAM_NICS             = "nics";
     private static final String PARAM_TIMING_STATS     = "timing_stats";
     private static final String PARAM_TIMING_AUTOSCALE = "autoscale_timing_stats";
 
@@ -121,9 +118,6 @@
     private static final String NIC_PARAM_SPEED            = "speed";
     private static final String NIC_PARAM_STATUS           = "status";
     private static final String NIC_PARAM_HW_ADDR          = "hwAddr";
-    private static final String NIC_PARAM_RX_FILTER        = "rxFilter";
-    private static final String NIC_PARAM_RX_METHOD        = "method";
-    private static final String NIC_PARAM_RX_METHOD_VALUES = "values";
 
     /**
      * NIC statistics.
@@ -260,7 +254,7 @@
         }
 
         // Get all the attributes
-        String id     = get(jsonNode, PARAM_ID);
+        String id     = get(jsonNode, BasicServerDriver.PARAM_ID);
         String vendor = get(jsonNode, PARAM_MANUFACTURER);
         String hw     = get(jsonNode, PARAM_HW_VENDOR);
         String sw     = get(jsonNode, PARAM_SW_VENDOR);
@@ -268,7 +262,7 @@
 
         // CPUs are composite attributes
         Set<CpuDevice> cpuSet = new HashSet<CpuDevice>();
-        JsonNode cpuNode = objNode.path(PARAM_CPUS);
+        JsonNode cpuNode = objNode.path(BasicServerDriver.PARAM_CPUS);
 
         // Construct CPU objects
         for (JsonNode cn : cpuNode) {
@@ -311,7 +305,7 @@
             }
             boolean status     = nicObjNode.path(NIC_PARAM_STATUS).asInt() > 0;
             String hwAddr      = get(nn, NIC_PARAM_HW_ADDR);
-            JsonNode tagNode   = nicObjNode.path(NIC_PARAM_RX_FILTER);
+            JsonNode tagNode   = nicObjNode.path(BasicServerDriver.NIC_PARAM_RX_FILTER);
             if (tagNode == null) {
                 throw new IllegalArgumentException(
                     "The Rx filters of NIC " + nicId + " are not reported"
@@ -348,11 +342,9 @@
             nicSet.add(nic);
         }
 
-        /**
-         * Construct a complete server device object.
-         * Lists of NICs and CPUs extend the information
-         * already in RestSBDevice (parent class).
-         */
+        // Construct a complete server device object.
+        // Lists of NICs and CPUs extend the information
+        // already in RestSBDevice (parent class).
         RestServerSBDevice dev = new DefaultRestServerSBDevice(
             device.ip(), device.port(), device.username(),
             device.password(), device.protocol(), device.url(),
@@ -400,10 +392,8 @@
         // .. and object
         RestServerSBDevice device = null;
 
-        /*
-         * In case this method is called before discoverDeviceDetails,
-         * there is missing information to be gathered.
-         */
+        // In case this method is called before discoverDeviceDetails,
+        // there is missing information to be gathered.
         short i = 0;
         while ((device == null) && (i < DISCOVERY_RETRIES)) {
             i++;
@@ -517,7 +507,7 @@
      * @param deviceId the device ID to be queried
      * @return list of (per core) CpuStatistics
      */
-     private Collection<CpuStatistics> getCpuStatistics(DeviceId deviceId) {
+     public Collection<CpuStatistics> getCpuStatistics(DeviceId deviceId) {
         // List of port statistics to return
         Collection<CpuStatistics> cpuStats = null;
 
@@ -589,11 +579,10 @@
         // Load the JSON into objects
         ObjectMapper mapper = new ObjectMapper();
         Map<String, Object> jsonMap = null;
-        JsonNode jsonNode  = null;
         ObjectNode objNode = null;
         try {
             jsonMap  = mapper.readValue(response, Map.class);
-            jsonNode = mapper.convertValue(jsonMap, JsonNode.class);
+            JsonNode jsonNode = mapper.convertValue(jsonMap, JsonNode.class);
             objNode = (ObjectNode) jsonNode;
         } catch (IOException ioEx) {
             log.error(
@@ -773,7 +762,7 @@
             return cpuStats;
         }
 
-        JsonNode cpuNode = objNode.path(PARAM_CPUS);
+        JsonNode cpuNode = objNode.path(BasicServerDriver.PARAM_CPUS);
 
         for (JsonNode cn : cpuNode) {
             ObjectNode cpuObjNode = (ObjectNode) cn;
diff --git a/drivers/server/src/main/java/org/onosproject/drivers/server/devices/RestServerSBDevice.java b/drivers/server/src/main/java/org/onosproject/drivers/server/devices/RestServerSBDevice.java
index a1172f8..f57e734 100644
--- a/drivers/server/src/main/java/org/onosproject/drivers/server/devices/RestServerSBDevice.java
+++ b/drivers/server/src/main/java/org/onosproject/drivers/server/devices/RestServerSBDevice.java
@@ -16,6 +16,7 @@
 
 package org.onosproject.drivers.server.devices;
 
+import org.onosproject.drivers.server.devices.nic.NicDevice;
 import org.onosproject.protocol.rest.RestSBDevice;
 
 import java.util.Collection;
diff --git a/drivers/server/src/main/java/org/onosproject/drivers/server/devices/ServerDeviceDescription.java b/drivers/server/src/main/java/org/onosproject/drivers/server/devices/ServerDeviceDescription.java
index dced9cd..02c9a11 100644
--- a/drivers/server/src/main/java/org/onosproject/drivers/server/devices/ServerDeviceDescription.java
+++ b/drivers/server/src/main/java/org/onosproject/drivers/server/devices/ServerDeviceDescription.java
@@ -16,6 +16,7 @@
 
 package org.onosproject.drivers.server.devices;
 
+import org.onosproject.drivers.server.devices.nic.NicDevice;
 import org.onosproject.net.device.DeviceDescription;
 
 import java.util.Collection;
diff --git a/drivers/server/src/main/java/org/onosproject/drivers/server/devices/MacRxFilterValue.java b/drivers/server/src/main/java/org/onosproject/drivers/server/devices/nic/MacRxFilterValue.java
similarity index 90%
rename from drivers/server/src/main/java/org/onosproject/drivers/server/devices/MacRxFilterValue.java
rename to drivers/server/src/main/java/org/onosproject/drivers/server/devices/nic/MacRxFilterValue.java
index b5dfe12..dec0276 100644
--- a/drivers/server/src/main/java/org/onosproject/drivers/server/devices/MacRxFilterValue.java
+++ b/drivers/server/src/main/java/org/onosproject/drivers/server/devices/nic/MacRxFilterValue.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.onosproject.drivers.server.devices;
+package org.onosproject.drivers.server.devices.nic;
 
 import org.onlab.packet.MacAddress;
 
@@ -24,32 +24,23 @@
 /**
  * A MAC Rx filter value.
  */
-public class MacRxFilterValue extends RxFilterValue implements Comparable  {
+public class MacRxFilterValue extends RxFilterValue implements Comparable {
 
     private MacAddress mac;
 
     public MacRxFilterValue() {
         super();
-
         this.mac = null;
     }
 
     public MacRxFilterValue(MacAddress mac) {
         super();
-
-        checkNotNull(mac, "MAC address of Rx filter is NULL");
-
-        this.mac = mac;
+        setValue(mac);
     }
 
     public MacRxFilterValue(MacRxFilterValue other) {
         super();
-
-        if (other.value() == null) {
-            return;
-        }
-
-        this.mac = other.value();
+        setValue(other.value());
     }
 
     /**
@@ -68,7 +59,6 @@
      */
     public void setValue(MacAddress mac) {
         checkNotNull(mac, "MAC address of Rx filter is NULL");
-
         this.mac = mac;
     }
 
diff --git a/drivers/server/src/main/java/org/onosproject/drivers/server/devices/MplsRxFilterValue.java b/drivers/server/src/main/java/org/onosproject/drivers/server/devices/nic/MplsRxFilterValue.java
similarity index 88%
rename from drivers/server/src/main/java/org/onosproject/drivers/server/devices/MplsRxFilterValue.java
rename to drivers/server/src/main/java/org/onosproject/drivers/server/devices/nic/MplsRxFilterValue.java
index 21ea37d..1d4c155 100644
--- a/drivers/server/src/main/java/org/onosproject/drivers/server/devices/MplsRxFilterValue.java
+++ b/drivers/server/src/main/java/org/onosproject/drivers/server/devices/nic/MplsRxFilterValue.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.onosproject.drivers.server.devices;
+package org.onosproject.drivers.server.devices.nic;
 
 import org.onlab.packet.MplsLabel;
 
@@ -30,26 +30,17 @@
 
     public MplsRxFilterValue() {
         super();
-
         this.mplsLabel = null;
     }
 
     public MplsRxFilterValue(MplsLabel mplsLabel) {
         super();
-
-        checkNotNull(mplsLabel, "MPLS label of Rx filter is NULL");
-
-        this.mplsLabel = mplsLabel;
+        setValue(mplsLabel);
     }
 
     public MplsRxFilterValue(MplsRxFilterValue other) {
         super();
-
-        if (other.value() == null) {
-            return;
-        }
-
-        this.mplsLabel = other.value();
+        setValue(other.value());
     }
 
     /**
@@ -68,7 +59,6 @@
      */
     public void setValue(MplsLabel mplsLabel) {
         checkNotNull(mplsLabel, "MPLS label of Rx filter is NULL");
-
         this.mplsLabel = mplsLabel;
     }
 
diff --git a/drivers/server/src/main/java/org/onosproject/drivers/server/devices/NicDevice.java b/drivers/server/src/main/java/org/onosproject/drivers/server/devices/nic/NicDevice.java
similarity index 97%
rename from drivers/server/src/main/java/org/onosproject/drivers/server/devices/NicDevice.java
rename to drivers/server/src/main/java/org/onosproject/drivers/server/devices/nic/NicDevice.java
index 0416a6c..91cd7f9 100644
--- a/drivers/server/src/main/java/org/onosproject/drivers/server/devices/NicDevice.java
+++ b/drivers/server/src/main/java/org/onosproject/drivers/server/devices/nic/NicDevice.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package org.onosproject.drivers.server.devices;
+package org.onosproject.drivers.server.devices.nic;
 
 import org.onlab.packet.MacAddress;
 
diff --git a/drivers/server/src/main/java/org/onosproject/drivers/server/devices/NicRxFilter.java b/drivers/server/src/main/java/org/onosproject/drivers/server/devices/nic/NicRxFilter.java
similarity index 77%
rename from drivers/server/src/main/java/org/onosproject/drivers/server/devices/NicRxFilter.java
rename to drivers/server/src/main/java/org/onosproject/drivers/server/devices/nic/NicRxFilter.java
index ffddc9b..e2d5758 100644
--- a/drivers/server/src/main/java/org/onosproject/drivers/server/devices/NicRxFilter.java
+++ b/drivers/server/src/main/java/org/onosproject/drivers/server/devices/nic/NicRxFilter.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package org.onosproject.drivers.server.devices;
+package org.onosproject.drivers.server.devices.nic;
 
 import org.apache.commons.lang.ArrayUtils;
 import com.google.common.base.MoreObjects;
@@ -35,9 +35,27 @@
      * Supported Rx filters.
      */
     public enum RxFilter {
+        /**
+         * NIC dispatches traffic according to VLAN tags.
+         */
         VLAN("vlan"),
+        /**
+         * NIC dispatches traffic according to the destination MAC addresses.
+         */
         MAC("mac"),
-        MPLS("mpls");
+        /**
+         * NIC dispatches traffic according to MPLS tags.
+         */
+        MPLS("mpls"),
+        /**
+         * NIC dispatches traffic according to (generic) flow rules.
+         */
+        FLOW("flow"),
+        /**
+         * NIC dispatches traffic by hashing the values of some header fields.
+         * This is also known as Receive-Side Scaling (RSS).
+         */
+        RSS("rss");
 
         private String rxFilter;
 
@@ -57,6 +75,15 @@
             return MAP.containsKey(rxFilter.toString());
         }
 
+        public static boolean isSupportedSet(Set<RxFilter> rxFilters) {
+            for (RxFilter rf : rxFilters) {
+                if (!MAP.containsKey(rf.toString())) {
+                    return false;
+                }
+            }
+            return true;
+        }
+
         private RxFilter(String rxFilter) {
             this.rxFilter = rxFilter;
         }
@@ -65,6 +92,7 @@
         public String toString() {
             return this.rxFilter;
         }
+
     }
 
     private Set<RxFilter> rxFilters;
diff --git a/drivers/server/src/main/java/org/onosproject/drivers/server/devices/RxFilterValue.java b/drivers/server/src/main/java/org/onosproject/drivers/server/devices/nic/RxFilterValue.java
similarity index 93%
rename from drivers/server/src/main/java/org/onosproject/drivers/server/devices/RxFilterValue.java
rename to drivers/server/src/main/java/org/onosproject/drivers/server/devices/nic/RxFilterValue.java
index 29d2c99..10ebe04 100644
--- a/drivers/server/src/main/java/org/onosproject/drivers/server/devices/RxFilterValue.java
+++ b/drivers/server/src/main/java/org/onosproject/drivers/server/devices/nic/RxFilterValue.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.onosproject.drivers.server.devices;
+package org.onosproject.drivers.server.devices.nic;
 
 /**
  * The base class that holds the value of a NIC's Rx filter.
diff --git a/drivers/server/src/main/java/org/onosproject/drivers/server/devices/VlanRxFilterValue.java b/drivers/server/src/main/java/org/onosproject/drivers/server/devices/nic/VlanRxFilterValue.java
similarity index 87%
rename from drivers/server/src/main/java/org/onosproject/drivers/server/devices/VlanRxFilterValue.java
rename to drivers/server/src/main/java/org/onosproject/drivers/server/devices/nic/VlanRxFilterValue.java
index a984810..86cec25 100644
--- a/drivers/server/src/main/java/org/onosproject/drivers/server/devices/VlanRxFilterValue.java
+++ b/drivers/server/src/main/java/org/onosproject/drivers/server/devices/nic/VlanRxFilterValue.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.onosproject.drivers.server.devices;
+package org.onosproject.drivers.server.devices.nic;
 
 import org.onlab.packet.VlanId;
 
@@ -30,26 +30,17 @@
 
     public VlanRxFilterValue() {
         super();
-
-        this.vlanId = null;
+        this.vlanId = VlanId.NONE;
     }
 
     public VlanRxFilterValue(VlanId vlanId) {
         super();
-
-        checkNotNull(vlanId, "VLAN ID of Rx filter is NULL");
-
-        this.vlanId = vlanId;
+        setValue(vlanId);
     }
 
     public VlanRxFilterValue(VlanRxFilterValue other) {
         super();
-
-        if (other.value() == null) {
-            return;
-        }
-
-        this.vlanId = other.value();
+        setValue(other.value());
     }
 
     /**
diff --git a/drivers/server/src/main/java/org/onosproject/drivers/server/devices/RxFilterValue.java b/drivers/server/src/main/java/org/onosproject/drivers/server/devices/nic/package-info.java
similarity index 70%
copy from drivers/server/src/main/java/org/onosproject/drivers/server/devices/RxFilterValue.java
copy to drivers/server/src/main/java/org/onosproject/drivers/server/devices/nic/package-info.java
index 29d2c99..a2e5cf7 100644
--- a/drivers/server/src/main/java/org/onosproject/drivers/server/devices/RxFilterValue.java
+++ b/drivers/server/src/main/java/org/onosproject/drivers/server/devices/nic/package-info.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2017-present Open Networking Foundation
+ * Copyright 2018-present Open Networking Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -13,14 +13,8 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.onosproject.drivers.server.devices;
 
 /**
- * The base class that holds the value of a NIC's Rx filter.
+ * API for NIC server devices.
  */
-public abstract class RxFilterValue {
-
-    public RxFilterValue() {
-    }
-
-}
+package org.onosproject.drivers.server.devices.nic;
diff --git a/drivers/server/src/main/java/org/onosproject/drivers/server/impl/devices/DefaultNicDevice.java b/drivers/server/src/main/java/org/onosproject/drivers/server/impl/devices/DefaultNicDevice.java
index d69ff23..3ff5e65 100644
--- a/drivers/server/src/main/java/org/onosproject/drivers/server/impl/devices/DefaultNicDevice.java
+++ b/drivers/server/src/main/java/org/onosproject/drivers/server/impl/devices/DefaultNicDevice.java
@@ -16,8 +16,8 @@
 
 package org.onosproject.drivers.server.impl.devices;
 
-import org.onosproject.drivers.server.devices.NicDevice;
-import org.onosproject.drivers.server.devices.NicRxFilter;
+import org.onosproject.drivers.server.devices.nic.NicDevice;
+import org.onosproject.drivers.server.devices.nic.NicRxFilter;
 
 import org.onlab.packet.MacAddress;
 
diff --git a/drivers/server/src/main/java/org/onosproject/drivers/server/impl/devices/DefaultRestServerSBDevice.java b/drivers/server/src/main/java/org/onosproject/drivers/server/impl/devices/DefaultRestServerSBDevice.java
index 7232ed5..410a5b4 100644
--- a/drivers/server/src/main/java/org/onosproject/drivers/server/impl/devices/DefaultRestServerSBDevice.java
+++ b/drivers/server/src/main/java/org/onosproject/drivers/server/impl/devices/DefaultRestServerSBDevice.java
@@ -17,7 +17,7 @@
 package org.onosproject.drivers.server.impl.devices;
 
 import org.onosproject.drivers.server.devices.CpuDevice;
-import org.onosproject.drivers.server.devices.NicDevice;
+import org.onosproject.drivers.server.devices.nic.NicDevice;
 import org.onosproject.drivers.server.devices.RestServerSBDevice;
 
 import org.onosproject.protocol.rest.DefaultRestSBDevice;
diff --git a/drivers/server/src/main/java/org/onosproject/drivers/server/impl/devices/DefaultServerDeviceDescription.java b/drivers/server/src/main/java/org/onosproject/drivers/server/impl/devices/DefaultServerDeviceDescription.java
index 50aeb02..c5ac09a 100644
--- a/drivers/server/src/main/java/org/onosproject/drivers/server/impl/devices/DefaultServerDeviceDescription.java
+++ b/drivers/server/src/main/java/org/onosproject/drivers/server/impl/devices/DefaultServerDeviceDescription.java
@@ -17,7 +17,7 @@
 package org.onosproject.drivers.server.impl.devices;
 
 import org.onosproject.drivers.server.devices.CpuDevice;
-import org.onosproject.drivers.server.devices.NicDevice;
+import org.onosproject.drivers.server.devices.nic.NicDevice;
 import org.onosproject.drivers.server.devices.ServerDeviceDescription;
 
 import org.onosproject.net.device.DefaultDeviceDescription;