Introduce driver property to suppress group feature

Change-Id: I7bf9857a7a71e3b4ef64aa7fd2c8777ff20dc95b
diff --git a/core/api/src/main/java/org/onosproject/net/group/GroupProvider.java b/core/api/src/main/java/org/onosproject/net/group/GroupProvider.java
index 4ad0769..3c5d1a3 100644
--- a/core/api/src/main/java/org/onosproject/net/group/GroupProvider.java
+++ b/core/api/src/main/java/org/onosproject/net/group/GroupProvider.java
@@ -22,6 +22,14 @@
  * Abstraction of group provider.
  */
 public interface GroupProvider extends Provider {
+    /**
+     * Group capable property name.
+     * A driver is assumed to be group capable if this property is undefined. If
+     * the driver is group capable, then it supports group descriptions and
+     * optionally group statistics. If the driver is not group capable, then it
+     * supports neither group descriptions nor group statistics.
+     */
+    String GROUP_CAPABLE = "groupCapable";
 
     /**
      * Performs a batch of group operation in the specified device with the
diff --git a/drivers/optical/src/main/resources/optical-drivers.xml b/drivers/optical/src/main/resources/optical-drivers.xml
index 55b4d17..ea670fc 100644
--- a/drivers/optical/src/main/resources/optical-drivers.xml
+++ b/drivers/optical/src/main/resources/optical-drivers.xml
@@ -105,6 +105,7 @@
                    impl="org.onosproject.driver.optical.query.OpenFlowLambdaQuery"/>
         <property name="meterCapable">false</property>
         <property name="uiType">policon</property>
+        <property name="groupCapable">false</property>
     </driver>
 
     <driver name="optical-config" manufacturer="config" hwVersion="config" swVersion="config">
diff --git a/providers/openflow/group/src/main/java/org/onosproject/provider/of/group/impl/OpenFlowGroupProvider.java b/providers/openflow/group/src/main/java/org/onosproject/provider/of/group/impl/OpenFlowGroupProvider.java
index df1bb6a..c60a58c 100644
--- a/providers/openflow/group/src/main/java/org/onosproject/provider/of/group/impl/OpenFlowGroupProvider.java
+++ b/providers/openflow/group/src/main/java/org/onosproject/provider/of/group/impl/OpenFlowGroupProvider.java
@@ -41,6 +41,7 @@
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.PortNumber;
 import org.onosproject.net.device.DeviceService;
+import org.onosproject.net.driver.Driver;
 import org.onosproject.net.driver.DriverService;
 import org.onosproject.net.group.DefaultGroup;
 import org.onosproject.net.group.Group;
@@ -366,13 +367,29 @@
     private boolean isGroupSupported(OpenFlowSwitch sw) {
         if (sw.factory().getVersion() == OFVersion.OF_10 ||
                 sw.factory().getVersion() == OFVersion.OF_11 ||
-                sw.factory().getVersion() == OFVersion.OF_12) {
+                sw.factory().getVersion() == OFVersion.OF_12 ||
+                !isGroupCapable(sw)) {
             return false;
         }
 
         return true;
     }
 
+    /**
+     * Determine whether the given switch is group-capable.
+     *
+     * @param sw switch
+     * @return the boolean value of groupCapable property, or true if it is not configured.
+     */
+    private boolean isGroupCapable(OpenFlowSwitch sw) {
+        Driver driver = driverService.getDriver(DeviceId.deviceId(Dpid.uri(sw.getDpid())));
+        if (driver == null) {
+            return true;
+        }
+        String isGroupCapable = driver.getProperty(GROUP_CAPABLE);
+        return isGroupCapable == null || Boolean.parseBoolean(isGroupCapable);
+    }
+
     private class InternalGroupProvider
             implements OpenFlowSwitchListener, OpenFlowEventListener {
 
diff --git a/providers/openflow/group/src/test/java/org/onosproject/provider/of/group/impl/OpenFlowGroupProviderTest.java b/providers/openflow/group/src/test/java/org/onosproject/provider/of/group/impl/OpenFlowGroupProviderTest.java
index 0b95f1d..9b87b22 100644
--- a/providers/openflow/group/src/test/java/org/onosproject/provider/of/group/impl/OpenFlowGroupProviderTest.java
+++ b/providers/openflow/group/src/test/java/org/onosproject/provider/of/group/impl/OpenFlowGroupProviderTest.java
@@ -24,6 +24,7 @@
 import org.onosproject.net.Device;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.PortNumber;
+import org.onosproject.net.driver.DriverServiceAdapter;
 import org.onosproject.net.flow.DefaultTrafficTreatment;
 import org.onosproject.net.flow.TrafficTreatment;
 import org.onosproject.net.group.DefaultGroupBucket;
@@ -82,6 +83,7 @@
         provider.controller = controller;
         provider.providerRegistry = providerRegistry;
         provider.cfgService = new ComponentConfigAdapter();
+        provider.driverService = new DriverServiceAdapter();
         provider.activate(null);
     }
 
@@ -435,4 +437,4 @@
             return null;
         }
     }
-}
\ No newline at end of file
+}