[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;