Fix for JIRA ONOS-4620. Whenever networkconfiguration is deleted even the queued will be removed
Change-Id: I8d7f1a873af90cf86ea34f1a2b1585ef4c3e46e4
diff --git a/core/api/src/main/java/org/onosproject/net/config/NetworkConfigService.java b/core/api/src/main/java/org/onosproject/net/config/NetworkConfigService.java
index 09d7b08..0f3e62d 100644
--- a/core/api/src/main/java/org/onosproject/net/config/NetworkConfigService.java
+++ b/core/api/src/main/java/org/onosproject/net/config/NetworkConfigService.java
@@ -177,4 +177,19 @@
* @param <S> type of subject
*/
<S> void removeConfig(String subjectClassKey, S subject, String configKey);
+
+ /**
+ * Clears the configuration including queued based on the subject.
+ * If does not exists this call has no effect.
+ *
+ * @param subject configuration subject
+ */
+ <S> void removeConfig(S subject);
+
+ /**
+ * Clears the complete configuration including queued.
+ * If does not exists this call has no effect.
+ *
+ */
+ <S> void removeConfig();
}
diff --git a/core/api/src/main/java/org/onosproject/net/config/NetworkConfigStore.java b/core/api/src/main/java/org/onosproject/net/config/NetworkConfigStore.java
index b9d93a2..44e8b03 100644
--- a/core/api/src/main/java/org/onosproject/net/config/NetworkConfigStore.java
+++ b/core/api/src/main/java/org/onosproject/net/config/NetworkConfigStore.java
@@ -151,4 +151,19 @@
*/
<S> void clearQueuedConfig(S subject, String configKey);
+ /**
+ * Clears the configuration based on the subject including queued.
+ * If does not exists this call has no effect.
+ *
+ * @param subject configuration subject
+ */
+ <S> void clearConfig(S subject);
+
+ /**
+ * Clears the complete configuration including queued.
+ * If does not exists this call has no effect.
+ *
+ */
+ <S> void clearConfig();
+
}
diff --git a/core/api/src/test/java/org/onosproject/net/config/NetworkConfigServiceAdapter.java b/core/api/src/test/java/org/onosproject/net/config/NetworkConfigServiceAdapter.java
index 0553a2b..cbe94c3 100644
--- a/core/api/src/test/java/org/onosproject/net/config/NetworkConfigServiceAdapter.java
+++ b/core/api/src/test/java/org/onosproject/net/config/NetworkConfigServiceAdapter.java
@@ -95,4 +95,12 @@
@Override
public void removeListener(NetworkConfigListener listener) {
}
+
+ @Override
+ public <S> void removeConfig(S subject) {
+ }
+
+ @Override
+ public <S> void removeConfig() {
+ }
}
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 2353c1e..0cc0f7c 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
@@ -261,6 +261,18 @@
}
}
+ @Override
+ public <S> void removeConfig(S subject) {
+ checkPermission(CONFIG_WRITE);
+ store.clearConfig(subject);
+ }
+
+ @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.
private class InternalStoreDelegate implements NetworkConfigStoreDelegate {
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 2d03bfc..3b6e69e 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
@@ -239,4 +239,43 @@
assertThat(configService.getSubjectFactory(String.class), notNullValue());
assertThat(configService.getSubjectFactory("key1"), notNullValue());
}
+
+ /**
+ * Tests creation, query and removal of a configuration including queued.
+ */
+ @Test
+ public void testRemoveConfig() {
+
+ assertThat(configService.getSubjectFactory(String.class), nullValue());
+ assertThat(configService.getSubjectFactory("key"), nullValue());
+
+ registry.registerConfigFactory(config1Factory);
+ registry.registerConfigFactory(config2Factory);
+ configService.applyConfig("configKey", BasicConfig1.class, new ObjectMapper().createObjectNode());
+
+ configService.applyConfig("key1", "key", "config1", new ObjectMapper().createObjectNode());
+ configService.applyConfig("key1", "keyxx", "config3", new ObjectMapper().createObjectNode());
+ configService.applyConfig("key2", "key1", "config4", new ObjectMapper().createObjectNode());
+
+ configService.removeConfig();
+
+ Set<String> subjects = configService.getSubjects(factory1.subjectClass());
+ assertThat(subjects.size(), is(0));
+
+ Set<String> subjects2 = configService.getSubjects(factory2.subjectClass());
+ assertThat(subjects2.size(), is(0));
+
+ configService.applyConfig("key1", "key", "config1", new ObjectMapper().createObjectNode());
+ configService.applyConfig("key1", "keyxx", "config3", new ObjectMapper().createObjectNode());
+ configService.applyConfig("key1", "key1", "config4", new ObjectMapper().createObjectNode());
+
+ @SuppressWarnings("unchecked")
+ Set<String> configs = configService.getSubjects(
+ configService.getSubjectFactory("key1").subjectClass());
+
+ configs.forEach(c -> configService.removeConfig(c));
+ Set<String> newConfig1 = configService.getSubjects(factory1.subjectClass());
+
+ assertThat(newConfig1, notNullValue());
+ }
}
diff --git a/core/store/dist/src/main/java/org/onosproject/store/config/impl/DistributedNetworkConfigStore.java b/core/store/dist/src/main/java/org/onosproject/store/config/impl/DistributedNetworkConfigStore.java
index 5397f54..96e9501 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/config/impl/DistributedNetworkConfigStore.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/config/impl/DistributedNetworkConfigStore.java
@@ -253,6 +253,24 @@
configs.remove(key(subject, configKey));
}
+ @Override
+ public <S> void clearConfig(S subject) {
+ ImmutableSet.copyOf(configs.keySet()).forEach(k -> {
+ if (Objects.equals(subject, k.subject) && delegate != null) {
+ configs.remove(k);
+ }
+ });
+ }
+
+ @Override
+ public <S> void clearConfig() {
+ ImmutableSet.copyOf(configs.keySet()).forEach(k -> {
+ if (delegate != null) {
+ configs.remove(k);
+ }
+ });
+ }
+
/**
* Produces a config from the specified subject, config class and raw JSON.
*
diff --git a/core/store/dist/src/test/java/org/onosproject/store/config/impl/DistributedNetworkConfigStoreTest.java b/core/store/dist/src/test/java/org/onosproject/store/config/impl/DistributedNetworkConfigStoreTest.java
index 3ae4dc3..8a3db75 100644
--- a/core/store/dist/src/test/java/org/onosproject/store/config/impl/DistributedNetworkConfigStoreTest.java
+++ b/core/store/dist/src/test/java/org/onosproject/store/config/impl/DistributedNetworkConfigStoreTest.java
@@ -31,6 +31,9 @@
import static org.hamcrest.Matchers.nullValue;
import static org.junit.Assert.assertThat;
+import java.util.Set;
+
+
public class DistributedNetworkConfigStoreTest {
private DistributedNetworkConfigStore configStore;
@@ -203,4 +206,33 @@
assertThat(configStore.getSubjects(Integer.class, BasicIntConfig.class), hasSize(1));
assertThat(configStore.getSubjects(Integer.class), hasSize(1));
}
+
+ /**
+ * Tests removal of config including queued.
+ */
+ @Test
+ public void testRemoveConfig() {
+
+ configStore.addConfigFactory(new MockConfigFactory(BasicConfig.class, "config1"));
+ configStore.queueConfig("subject", "config2", new ObjectMapper().createObjectNode());
+ configStore.queueConfig(123, "config2", new ObjectMapper().createObjectNode());
+ configStore.applyConfig("subject1", BasicConfig.class, new ObjectMapper().createObjectNode());
+
+ configStore.clearConfig();
+
+ Set<String> subjects = configStore.getSubjects(String.class);
+ assertThat(subjects.size(), is(0));
+
+ configStore.addConfigFactory(new MockConfigFactory(BasicConfig.class, "config1"));
+ configStore.queueConfig("subject", "config3", new ObjectMapper().createObjectNode());
+ configStore.queueConfig(123, "config3", new ObjectMapper().createObjectNode());
+ configStore.applyConfig("subject1", BasicConfig.class, new ObjectMapper().createObjectNode());
+
+ Set<String> configs = configStore.getSubjects(String.class);
+
+ configs.forEach(c -> configStore.clearConfig(c));
+ Set<String> newConfig1 = configStore.getSubjects(String.class);
+
+ assertThat(newConfig1, notNullValue());
+ }
}
diff --git a/web/api/src/main/java/org/onosproject/rest/resources/NetworkConfigWebResource.java b/web/api/src/main/java/org/onosproject/rest/resources/NetworkConfigWebResource.java
index 9e301f5..240cb55 100644
--- a/web/api/src/main/java/org/onosproject/rest/resources/NetworkConfigWebResource.java
+++ b/web/api/src/main/java/org/onosproject/rest/resources/NetworkConfigWebResource.java
@@ -297,10 +297,7 @@
@SuppressWarnings("unchecked")
public Response delete() {
NetworkConfigService service = get(NetworkConfigService.class);
- service.getSubjectClasses()
- .forEach(subjectClass -> service.getSubjects(subjectClass)
- .forEach(subject -> service.getConfigs(subject)
- .forEach(config -> service.removeConfig(subject, config.getClass()))));
+ service.removeConfig();
return Response.ok().build();
}
@@ -315,8 +312,7 @@
public void delete(@PathParam("subjectClassKey") String subjectClassKey) {
NetworkConfigService service = get(NetworkConfigService.class);
service.getSubjects(service.getSubjectFactory(subjectClassKey).subjectClass())
- .forEach(subject -> service.getConfigs(subject)
- .forEach(config -> service.removeConfig(subject, config.getClass())));
+ .forEach(subject -> service.removeConfig(subject));
}
/**
@@ -331,8 +327,7 @@
public void delete(@PathParam("subjectClassKey") String subjectClassKey,
@PathParam("subjectKey") String subjectKey) {
NetworkConfigService service = get(NetworkConfigService.class);
- Object s = service.getSubjectFactory(subjectClassKey).createSubject(subjectKey);
- service.getConfigs(s).forEach(c -> service.removeConfig(s, c.getClass()));
+ service.removeConfig(subjectKey);
}
/**
@@ -349,8 +344,9 @@
@PathParam("subjectKey") String subjectKey,
@PathParam("configKey") String configKey) {
NetworkConfigService service = get(NetworkConfigService.class);
- service.removeConfig(service.getSubjectFactory(subjectClassKey).createSubject(subjectKey),
- service.getConfigClass(subjectClassKey, configKey));
+ service.removeConfig(subjectClassKey,
+ service.getSubjectFactory(subjectClassKey).createSubject(subjectKey),
+ configKey);
}
}