[ONOS-7377] Fix: Removing Config Factory only if last element in cluster

Change-Id: Ib9f627891b8e862dc96866d9f40d4f1694f9b3b4
diff --git a/core/net/src/main/java/org/onosproject/net/config/impl/NetworkConfigManager.java b/core/net/src/main/java/org/onosproject/net/config/impl/NetworkConfigManager.java
index 600b703..f6d9b51 100644
--- a/core/net/src/main/java/org/onosproject/net/config/impl/NetworkConfigManager.java
+++ b/core/net/src/main/java/org/onosproject/net/config/impl/NetworkConfigManager.java
@@ -24,6 +24,7 @@
 import org.apache.felix.scr.annotations.Reference;
 import org.apache.felix.scr.annotations.ReferenceCardinality;
 import org.apache.felix.scr.annotations.Service;
+import org.onosproject.cluster.ClusterService;
 import org.onosproject.event.AbstractListenerManager;
 import org.onosproject.net.config.Config;
 import org.onosproject.net.config.ConfigFactory;
@@ -78,6 +79,9 @@
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected NetworkConfigStore store;
 
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected ClusterService clusterService;
+
 
     @Activate
     public void activate() {
@@ -125,8 +129,13 @@
             factories.remove(key(configFactory));
             configClasses.remove(identifier(configFactory));
 
-            // Note that we are deliberately not removing subject factory key bindings.
-            store.removeConfigFactory(configFactory);
+            // Removing the config factory only if this is the only ONOS instance or if it's the last
+            // instance active in a cluster. otherwise the other instances lose access to the config factory
+            // and can't use the associated net-cfgs.
+            if (clusterService.getNodes().size() == 1) {
+                // Note that we are deliberately not removing subject factory key bindings.
+                store.removeConfigFactory(configFactory);
+            }
         }
     }
 
@@ -271,20 +280,20 @@
             store.clearConfig(subject, configClass);
         } else {
             store.clearQueuedConfig(subject, configKey);
-         }
+        }
     }
 
-     @Override
-     public <S> void removeConfig(S subject) {
+    @Override
+    public <S> void removeConfig(S subject) {
         checkPermission(CONFIG_WRITE);
         store.clearConfig(subject);
-     }
+    }
 
-     @Override
-     public <S> void removeConfig() {
-         checkPermission(CONFIG_WRITE);
-         store.clearConfig();
-     }
+    @Override
+    public <S> void removeConfig() {
+        checkPermission(CONFIG_WRITE);
+        store.clearConfig();
+    }
 
     // Auxiliary store delegate to receive notification about changes in
     // the network configuration store state - by the store itself.
diff --git a/core/net/src/test/java/org/onosproject/net/config/impl/NetworkConfigManagerTest.java b/core/net/src/test/java/org/onosproject/net/config/impl/NetworkConfigManagerTest.java
index 532488c..89f8a80 100644
--- a/core/net/src/test/java/org/onosproject/net/config/impl/NetworkConfigManagerTest.java
+++ b/core/net/src/test/java/org/onosproject/net/config/impl/NetworkConfigManagerTest.java
@@ -21,6 +21,8 @@
 import org.junit.Before;
 import org.junit.Test;
 import org.onlab.junit.TestUtils;
+import org.onosproject.cluster.ClusterService;
+import org.onosproject.cluster.ClusterServiceAdapter;
 import org.onosproject.event.EventDeliveryServiceAdapter;
 import org.onosproject.net.config.Config;
 import org.onosproject.net.config.ConfigFactory;
@@ -45,6 +47,9 @@
  * Unit tests for network config registry.
  */
 public class NetworkConfigManagerTest {
+
+    private final ClusterService clusterService = new ClusterServiceAdapter();
+
     private NetworkConfigManager manager;
     private NetworkConfigRegistry registry;
     private NetworkConfigService configService;
@@ -111,6 +116,7 @@
         manager = new NetworkConfigManager();
         manager.store = configStore;
         NetTestTools.injectEventDispatcher(manager, new EventDeliveryServiceAdapter());
+        manager.clusterService = clusterService;
         manager.activate();
         registry = manager;
         configService = manager;