Committed by
Gerrit Code Review
ONOS-4129 Fixing issue where two pending configurations with the same config key…
…, but for two different subject classes are encountered. Change-Id: I4de7f6e22bdf038dff91630f4cf576d9c38e9807
Showing
2 changed files
with
77 additions
and
8 deletions
| ... | @@ -29,7 +29,6 @@ import com.fasterxml.jackson.databind.node.ShortNode; | ... | @@ -29,7 +29,6 @@ import com.fasterxml.jackson.databind.node.ShortNode; |
| 29 | import com.fasterxml.jackson.databind.node.TextNode; | 29 | import com.fasterxml.jackson.databind.node.TextNode; |
| 30 | import com.google.common.collect.ImmutableSet; | 30 | import com.google.common.collect.ImmutableSet; |
| 31 | import com.google.common.collect.Maps; | 31 | import com.google.common.collect.Maps; |
| 32 | -import com.google.common.collect.Sets; | ||
| 33 | import org.apache.felix.scr.annotations.Activate; | 32 | import org.apache.felix.scr.annotations.Activate; |
| 34 | import org.apache.felix.scr.annotations.Component; | 33 | import org.apache.felix.scr.annotations.Component; |
| 35 | import org.apache.felix.scr.annotations.Deactivate; | 34 | import org.apache.felix.scr.annotations.Deactivate; |
| ... | @@ -124,14 +123,18 @@ public class DistributedNetworkConfigStore | ... | @@ -124,14 +123,18 @@ public class DistributedNetworkConfigStore |
| 124 | 123 | ||
| 125 | // Sweep through any pending configurations, validate them and then prune them. | 124 | // Sweep through any pending configurations, validate them and then prune them. |
| 126 | private void processPendingConfigs(ConfigFactory configFactory) { | 125 | private void processPendingConfigs(ConfigFactory configFactory) { |
| 127 | - Set<ConfigKey> toBePruned = Sets.newHashSet(); | 126 | + ImmutableSet.copyOf(configs.keySet()).forEach(k -> { |
| 128 | - configs.keySet().forEach(k -> { | 127 | + if (Objects.equals(k.configKey, configFactory.configKey()) && |
| 129 | - if (Objects.equals(k.configKey, configFactory.configKey())) { | 128 | + isAssignableFrom(configFactory, k)) { |
| 130 | validateConfig(k, configFactory, configs.get(k).value()); | 129 | validateConfig(k, configFactory, configs.get(k).value()); |
| 131 | - toBePruned.add(k); // Prune whether valid or not | 130 | + configs.remove(k); // Prune whether valid or not |
| 132 | } | 131 | } |
| 133 | }); | 132 | }); |
| 134 | - toBePruned.forEach(configs::remove); | 133 | + } |
| 134 | + | ||
| 135 | + @SuppressWarnings("unchecked") | ||
| 136 | + private boolean isAssignableFrom(ConfigFactory configFactory, ConfigKey k) { | ||
| 137 | + return configFactory.subjectFactory().subjectClass().isAssignableFrom(k.subject.getClass()); | ||
| 135 | } | 138 | } |
| 136 | 139 | ||
| 137 | @SuppressWarnings("unchecked") | 140 | @SuppressWarnings("unchecked") | ... | ... |
| ... | @@ -59,6 +59,11 @@ public class DistributedNetworkConfigStoreTest { | ... | @@ -59,6 +59,11 @@ public class DistributedNetworkConfigStoreTest { |
| 59 | public class BasicConfig extends Config<String> { } | 59 | public class BasicConfig extends Config<String> { } |
| 60 | 60 | ||
| 61 | /** | 61 | /** |
| 62 | + * Config class for testing. | ||
| 63 | + */ | ||
| 64 | + public class BasicIntConfig extends Config<Integer> { } | ||
| 65 | + | ||
| 66 | + /** | ||
| 62 | * Config factory class for testing. | 67 | * Config factory class for testing. |
| 63 | */ | 68 | */ |
| 64 | public class MockConfigFactory extends ConfigFactory<String, BasicConfig> { | 69 | public class MockConfigFactory extends ConfigFactory<String, BasicConfig> { |
| ... | @@ -72,6 +77,19 @@ public class DistributedNetworkConfigStoreTest { | ... | @@ -72,6 +77,19 @@ public class DistributedNetworkConfigStoreTest { |
| 72 | } | 77 | } |
| 73 | 78 | ||
| 74 | /** | 79 | /** |
| 80 | + * Config factory class for testing. | ||
| 81 | + */ | ||
| 82 | + public class MockIntConfigFactory extends ConfigFactory<Integer, BasicIntConfig> { | ||
| 83 | + protected MockIntConfigFactory(Class<BasicIntConfig> configClass, String configKey) { | ||
| 84 | + super(new MockIntSubjectFactory("strings"), configClass, configKey); | ||
| 85 | + } | ||
| 86 | + @Override | ||
| 87 | + public BasicIntConfig createConfig() { | ||
| 88 | + return new BasicIntConfig(); | ||
| 89 | + } | ||
| 90 | + } | ||
| 91 | + | ||
| 92 | + /** | ||
| 75 | * Subject factory class for testing. | 93 | * Subject factory class for testing. |
| 76 | */ | 94 | */ |
| 77 | public class MockSubjectFactory extends SubjectFactory<String> { | 95 | public class MockSubjectFactory extends SubjectFactory<String> { |
| ... | @@ -86,6 +104,19 @@ public class DistributedNetworkConfigStoreTest { | ... | @@ -86,6 +104,19 @@ public class DistributedNetworkConfigStoreTest { |
| 86 | } | 104 | } |
| 87 | 105 | ||
| 88 | /** | 106 | /** |
| 107 | + * Subject factory class for testing. | ||
| 108 | + */ | ||
| 109 | + public class MockIntSubjectFactory extends SubjectFactory<Integer> { | ||
| 110 | + protected MockIntSubjectFactory(String subjectClassKey) { | ||
| 111 | + super(Integer.class, subjectClassKey); | ||
| 112 | + } | ||
| 113 | + | ||
| 114 | + @Override | ||
| 115 | + public Integer createSubject(String subjectKey) { | ||
| 116 | + return Integer.parseInt(subjectKey); | ||
| 117 | + } | ||
| 118 | + } | ||
| 119 | + /** | ||
| 89 | * Tests creation, query and removal of a config. | 120 | * Tests creation, query and removal of a config. |
| 90 | */ | 121 | */ |
| 91 | @Test | 122 | @Test |
| ... | @@ -132,9 +163,44 @@ public class DistributedNetworkConfigStoreTest { | ... | @@ -132,9 +163,44 @@ public class DistributedNetworkConfigStoreTest { |
| 132 | public void testApplyConfig() { | 163 | public void testApplyConfig() { |
| 133 | configStore.addConfigFactory(new MockConfigFactory(BasicConfig.class, "config1")); | 164 | configStore.addConfigFactory(new MockConfigFactory(BasicConfig.class, "config1")); |
| 134 | 165 | ||
| 135 | - configStore.applyConfig("config1", BasicConfig.class, new ObjectMapper().createObjectNode()); | 166 | + configStore.applyConfig("subject", BasicConfig.class, new ObjectMapper().createObjectNode()); |
| 136 | - assertThat(configStore.getConfigClasses("config1"), hasSize(1)); | 167 | + assertThat(configStore.getConfigClasses("subject"), hasSize(1)); |
| 137 | assertThat(configStore.getSubjects(String.class, BasicConfig.class), hasSize(1)); | 168 | assertThat(configStore.getSubjects(String.class, BasicConfig.class), hasSize(1)); |
| 138 | assertThat(configStore.getSubjects(String.class), hasSize(1)); | 169 | assertThat(configStore.getSubjects(String.class), hasSize(1)); |
| 139 | } | 170 | } |
| 171 | + | ||
| 172 | + /** | ||
| 173 | + * Tests inserting a pending configuration. | ||
| 174 | + */ | ||
| 175 | + @Test | ||
| 176 | + public void testPendingConfig() { | ||
| 177 | + configStore.queueConfig("subject", "config1", new ObjectMapper().createObjectNode()); | ||
| 178 | + configStore.addConfigFactory(new MockConfigFactory(BasicConfig.class, "config1")); | ||
| 179 | + | ||
| 180 | + assertThat(configStore.getConfigClasses("subject"), hasSize(1)); | ||
| 181 | + assertThat(configStore.getSubjects(String.class, BasicConfig.class), hasSize(1)); | ||
| 182 | + assertThat(configStore.getSubjects(String.class), hasSize(1)); | ||
| 183 | + } | ||
| 184 | + | ||
| 185 | + /** | ||
| 186 | + * Tests inserting a pending configuration for the same key, different subject. | ||
| 187 | + */ | ||
| 188 | + @Test | ||
| 189 | + public void testPendingConfigSameKey() { | ||
| 190 | + configStore.queueConfig("subject", "config1", new ObjectMapper().createObjectNode()); | ||
| 191 | + configStore.queueConfig(123, "config1", new ObjectMapper().createObjectNode()); | ||
| 192 | + configStore.addConfigFactory(new MockConfigFactory(BasicConfig.class, "config1")); | ||
| 193 | + | ||
| 194 | + assertThat(configStore.getConfigClasses("subject"), hasSize(1)); | ||
| 195 | + assertThat(configStore.getConfigClasses(123), hasSize(0)); | ||
| 196 | + assertThat(configStore.getSubjects(String.class, BasicConfig.class), hasSize(1)); | ||
| 197 | + assertThat(configStore.getSubjects(String.class), hasSize(1)); | ||
| 198 | + | ||
| 199 | + configStore.addConfigFactory(new MockIntConfigFactory(BasicIntConfig.class, "config1")); | ||
| 200 | + | ||
| 201 | + assertThat(configStore.getConfigClasses("subject"), hasSize(1)); | ||
| 202 | + assertThat(configStore.getConfigClasses(123), hasSize(1)); | ||
| 203 | + assertThat(configStore.getSubjects(Integer.class, BasicIntConfig.class), hasSize(1)); | ||
| 204 | + assertThat(configStore.getSubjects(Integer.class), hasSize(1)); | ||
| 205 | + } | ||
| 140 | } | 206 | } | ... | ... |
-
Please register or login to post a comment