[ONOS-7279] Fix for illegal state exception when deactivating driver providers

Change-Id: I9a8c16e33cac40b91c2b6f405e66f94bcdf5e0e0
diff --git a/core/net/src/main/java/org/onosproject/net/flow/impl/FlowRuleDriverProvider.java b/core/net/src/main/java/org/onosproject/net/flow/impl/FlowRuleDriverProvider.java
index c058ab6..abda2bf 100644
--- a/core/net/src/main/java/org/onosproject/net/flow/impl/FlowRuleDriverProvider.java
+++ b/core/net/src/main/java/org/onosproject/net/flow/impl/FlowRuleDriverProvider.java
@@ -104,6 +104,15 @@
                                               pollFrequency, TimeUnit.SECONDS);
     }
 
+    void terminate() {
+        deviceService.removeListener(deviceListener);
+        deviceService = null;
+        providerService = null;
+        mastershipService = null;
+        poller.cancel(true);
+        executor.shutdown();
+    }
+
     @Override
     public void applyFlowRule(FlowRule... flowRules) {
         rulesByDevice(flowRules).asMap().forEach(this::applyFlowRules);
diff --git a/core/net/src/main/java/org/onosproject/net/flow/impl/FlowRuleManager.java b/core/net/src/main/java/org/onosproject/net/flow/impl/FlowRuleManager.java
index 47623a7..994303e 100644
--- a/core/net/src/main/java/org/onosproject/net/flow/impl/FlowRuleManager.java
+++ b/core/net/src/main/java/org/onosproject/net/flow/impl/FlowRuleManager.java
@@ -165,6 +165,7 @@
 
     @Deactivate
     public void deactivate() {
+        driverProvider.terminate();
         deviceService.removeListener(deviceListener);
         cfgService.unregisterProperties(getClass(), false);
         deviceInstallers.shutdownNow();
diff --git a/core/net/src/main/java/org/onosproject/net/group/impl/GroupDriverProvider.java b/core/net/src/main/java/org/onosproject/net/group/impl/GroupDriverProvider.java
index 6eea583..f86e4a1 100644
--- a/core/net/src/main/java/org/onosproject/net/group/impl/GroupDriverProvider.java
+++ b/core/net/src/main/java/org/onosproject/net/group/impl/GroupDriverProvider.java
@@ -99,6 +99,15 @@
 
     }
 
+    void terminate() {
+        deviceService.removeListener(deviceListener);
+        deviceService = null;
+        groupProviderService = null;
+        mastershipService = null;
+        poller.cancel(true);
+        executor.shutdown();
+    }
+
     @Override
     public void performGroupOperation(DeviceId deviceId, GroupOperations groupOps) {
         GroupProgrammable programmable = getGroupProgrammable(deviceId);
diff --git a/core/net/src/main/java/org/onosproject/net/group/impl/GroupManager.java b/core/net/src/main/java/org/onosproject/net/group/impl/GroupManager.java
index 9b82f5f..c78108c 100644
--- a/core/net/src/main/java/org/onosproject/net/group/impl/GroupManager.java
+++ b/core/net/src/main/java/org/onosproject/net/group/impl/GroupManager.java
@@ -120,6 +120,7 @@
 
     @Deactivate
     public void deactivate() {
+        defaultProvider.terminate();
         deviceService.removeListener(deviceListener);
         cfgService.unregisterProperties(getClass(), false);
         store.unsetDelegate(delegate);