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
+}