Make IntentManager configurable to tell test mode
This is a quick fix for ONOS-3923, not a long-term solution. Change-Id: I56e8af57de37e6db1f5e2355d5bb60372adc83f6
Showing
1 changed file
with
62 additions
and
0 deletions
| ... | @@ -18,6 +18,8 @@ package org.onosproject.net.intent.impl; | ... | @@ -18,6 +18,8 @@ package org.onosproject.net.intent.impl; |
| 18 | import org.apache.felix.scr.annotations.Activate; | 18 | import org.apache.felix.scr.annotations.Activate; |
| 19 | import org.apache.felix.scr.annotations.Component; | 19 | import org.apache.felix.scr.annotations.Component; |
| 20 | import org.apache.felix.scr.annotations.Deactivate; | 20 | import org.apache.felix.scr.annotations.Deactivate; |
| 21 | +import org.apache.felix.scr.annotations.Modified; | ||
| 22 | +import org.apache.felix.scr.annotations.Property; | ||
| 21 | import org.apache.felix.scr.annotations.Reference; | 23 | import org.apache.felix.scr.annotations.Reference; |
| 22 | import org.apache.felix.scr.annotations.ReferenceCardinality; | 24 | import org.apache.felix.scr.annotations.ReferenceCardinality; |
| 23 | import org.apache.felix.scr.annotations.Service; | 25 | import org.apache.felix.scr.annotations.Service; |
| ... | @@ -42,6 +44,7 @@ import org.onosproject.net.intent.Key; | ... | @@ -42,6 +44,7 @@ import org.onosproject.net.intent.Key; |
| 42 | import org.onosproject.net.intent.impl.phase.FinalIntentProcessPhase; | 44 | import org.onosproject.net.intent.impl.phase.FinalIntentProcessPhase; |
| 43 | import org.onosproject.net.intent.impl.phase.IntentProcessPhase; | 45 | import org.onosproject.net.intent.impl.phase.IntentProcessPhase; |
| 44 | import org.onosproject.net.newresource.ResourceService; | 46 | import org.onosproject.net.newresource.ResourceService; |
| 47 | +import org.osgi.service.component.ComponentContext; | ||
| 45 | import org.slf4j.Logger; | 48 | import org.slf4j.Logger; |
| 46 | 49 | ||
| 47 | import java.util.Collection; | 50 | import java.util.Collection; |
| ... | @@ -55,6 +58,7 @@ import java.util.concurrent.ExecutorService; | ... | @@ -55,6 +58,7 @@ import java.util.concurrent.ExecutorService; |
| 55 | import java.util.stream.Collectors; | 58 | import java.util.stream.Collectors; |
| 56 | 59 | ||
| 57 | import static com.google.common.base.Preconditions.checkNotNull; | 60 | import static com.google.common.base.Preconditions.checkNotNull; |
| 61 | +import static com.google.common.base.Strings.isNullOrEmpty; | ||
| 58 | import static java.util.concurrent.Executors.newFixedThreadPool; | 62 | import static java.util.concurrent.Executors.newFixedThreadPool; |
| 59 | import static java.util.concurrent.Executors.newSingleThreadExecutor; | 63 | import static java.util.concurrent.Executors.newSingleThreadExecutor; |
| 60 | import static org.onlab.util.Tools.groupedThreads; | 64 | import static org.onlab.util.Tools.groupedThreads; |
| ... | @@ -86,6 +90,12 @@ public class IntentManager | ... | @@ -86,6 +90,12 @@ public class IntentManager |
| 86 | = EnumSet.of(INSTALL_REQ, FAILED, WITHDRAW_REQ); | 90 | = EnumSet.of(INSTALL_REQ, FAILED, WITHDRAW_REQ); |
| 87 | private static final EnumSet<IntentState> WITHDRAW | 91 | private static final EnumSet<IntentState> WITHDRAW |
| 88 | = EnumSet.of(WITHDRAW_REQ, WITHDRAWING, WITHDRAWN); | 92 | = EnumSet.of(WITHDRAW_REQ, WITHDRAWING, WITHDRAWN); |
| 93 | + private static final boolean DEFAULT_SKIP_RELEASE_RESOURCES_ON_WITHDRAWAL = false; | ||
| 94 | + | ||
| 95 | + @Property(name = "skipReleaseResourcesOnWithdrawal", | ||
| 96 | + boolValue = DEFAULT_SKIP_RELEASE_RESOURCES_ON_WITHDRAWAL, | ||
| 97 | + label = "Indicates whether skipping resource releases on withdrawal is enabled or not") | ||
| 98 | + private boolean skipReleaseResourcesOnWithdrawal = DEFAULT_SKIP_RELEASE_RESOURCES_ON_WITHDRAWAL; | ||
| 89 | 99 | ||
| 90 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | 100 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) |
| 91 | protected CoreService coreService; | 101 | protected CoreService coreService; |
| ... | @@ -112,6 +122,7 @@ public class IntentManager | ... | @@ -112,6 +122,7 @@ public class IntentManager |
| 112 | private final CompilerRegistry compilerRegistry = new CompilerRegistry(); | 122 | private final CompilerRegistry compilerRegistry = new CompilerRegistry(); |
| 113 | private final InternalIntentProcessor processor = new InternalIntentProcessor(); | 123 | private final InternalIntentProcessor processor = new InternalIntentProcessor(); |
| 114 | private final IntentStoreDelegate delegate = new InternalStoreDelegate(); | 124 | private final IntentStoreDelegate delegate = new InternalStoreDelegate(); |
| 125 | + private final IntentStoreDelegate testOnlyDelegate = new TestOnlyIntentStoreDelegate(); | ||
| 115 | private final TopologyChangeDelegate topoDelegate = new InternalTopoChangeDelegate(); | 126 | private final TopologyChangeDelegate topoDelegate = new InternalTopoChangeDelegate(); |
| 116 | private final IntentBatchDelegate batchDelegate = new InternalBatchDelegate(); | 127 | private final IntentBatchDelegate batchDelegate = new InternalBatchDelegate(); |
| 117 | private IdGenerator idGenerator; | 128 | private IdGenerator idGenerator; |
| ... | @@ -121,7 +132,11 @@ public class IntentManager | ... | @@ -121,7 +132,11 @@ public class IntentManager |
| 121 | @Activate | 132 | @Activate |
| 122 | public void activate() { | 133 | public void activate() { |
| 123 | intentInstaller.init(store, trackerService, flowRuleService, flowObjectiveService); | 134 | intentInstaller.init(store, trackerService, flowRuleService, flowObjectiveService); |
| 135 | + if (skipReleaseResourcesOnWithdrawal) { | ||
| 136 | + store.setDelegate(testOnlyDelegate); | ||
| 137 | + } else { | ||
| 124 | store.setDelegate(delegate); | 138 | store.setDelegate(delegate); |
| 139 | + } | ||
| 125 | trackerService.setDelegate(topoDelegate); | 140 | trackerService.setDelegate(topoDelegate); |
| 126 | eventDispatcher.addSink(IntentEvent.class, listenerRegistry); | 141 | eventDispatcher.addSink(IntentEvent.class, listenerRegistry); |
| 127 | batchExecutor = newSingleThreadExecutor(groupedThreads("onos/intent", "batch")); | 142 | batchExecutor = newSingleThreadExecutor(groupedThreads("onos/intent", "batch")); |
| ... | @@ -134,7 +149,11 @@ public class IntentManager | ... | @@ -134,7 +149,11 @@ public class IntentManager |
| 134 | @Deactivate | 149 | @Deactivate |
| 135 | public void deactivate() { | 150 | public void deactivate() { |
| 136 | intentInstaller.init(null, null, null, null); | 151 | intentInstaller.init(null, null, null, null); |
| 152 | + if (skipReleaseResourcesOnWithdrawal) { | ||
| 153 | + store.unsetDelegate(testOnlyDelegate); | ||
| 154 | + } else { | ||
| 137 | store.unsetDelegate(delegate); | 155 | store.unsetDelegate(delegate); |
| 156 | + } | ||
| 138 | trackerService.unsetDelegate(topoDelegate); | 157 | trackerService.unsetDelegate(topoDelegate); |
| 139 | eventDispatcher.removeSink(IntentEvent.class); | 158 | eventDispatcher.removeSink(IntentEvent.class); |
| 140 | batchExecutor.shutdown(); | 159 | batchExecutor.shutdown(); |
| ... | @@ -143,6 +162,31 @@ public class IntentManager | ... | @@ -143,6 +162,31 @@ public class IntentManager |
| 143 | log.info("Stopped"); | 162 | log.info("Stopped"); |
| 144 | } | 163 | } |
| 145 | 164 | ||
| 165 | + @Modified | ||
| 166 | + public void modified(ComponentContext context) { | ||
| 167 | + if (context == null) { | ||
| 168 | + skipReleaseResourcesOnWithdrawal = DEFAULT_SKIP_RELEASE_RESOURCES_ON_WITHDRAWAL; | ||
| 169 | + logConfig("Default config"); | ||
| 170 | + return; | ||
| 171 | + } | ||
| 172 | + | ||
| 173 | + String s = Tools.get(context.getProperties(), "skipReleaseResourcesOnWithdrawal"); | ||
| 174 | + boolean newTestEnabled = isNullOrEmpty(s) ? skipReleaseResourcesOnWithdrawal : Boolean.parseBoolean(s.trim()); | ||
| 175 | + if (skipReleaseResourcesOnWithdrawal && !newTestEnabled) { | ||
| 176 | + store.unsetDelegate(testOnlyDelegate); | ||
| 177 | + store.setDelegate(delegate); | ||
| 178 | + logConfig("Reconfigured"); | ||
| 179 | + } else if (!skipReleaseResourcesOnWithdrawal && newTestEnabled) { | ||
| 180 | + store.unsetDelegate(delegate); | ||
| 181 | + store.setDelegate(testOnlyDelegate); | ||
| 182 | + logConfig("Reconfigured"); | ||
| 183 | + } | ||
| 184 | + } | ||
| 185 | + | ||
| 186 | + private void logConfig(String prefix) { | ||
| 187 | + log.info("{} with skipReleaseResourcesOnWithdrawal = {}", prefix, skipReleaseResourcesOnWithdrawal); | ||
| 188 | + } | ||
| 189 | + | ||
| 146 | @Override | 190 | @Override |
| 147 | public void submit(Intent intent) { | 191 | public void submit(Intent intent) { |
| 148 | checkPermission(INTENT_WRITE); | 192 | checkPermission(INTENT_WRITE); |
| ... | @@ -261,6 +305,24 @@ public class IntentManager | ... | @@ -261,6 +305,24 @@ public class IntentManager |
| 261 | } | 305 | } |
| 262 | } | 306 | } |
| 263 | 307 | ||
| 308 | + // Store delegate enabled only when performing intent throughput tests | ||
| 309 | + private class TestOnlyIntentStoreDelegate implements IntentStoreDelegate { | ||
| 310 | + @Override | ||
| 311 | + public void process(IntentData data) { | ||
| 312 | + accumulator.add(data); | ||
| 313 | + } | ||
| 314 | + | ||
| 315 | + @Override | ||
| 316 | + public void onUpdate(IntentData data) { | ||
| 317 | + trackerService.trackIntent(data); | ||
| 318 | + } | ||
| 319 | + | ||
| 320 | + @Override | ||
| 321 | + public void notify(IntentEvent event) { | ||
| 322 | + post(event); | ||
| 323 | + } | ||
| 324 | + } | ||
| 325 | + | ||
| 264 | private void buildAndSubmitBatches(Iterable<Key> intentKeys, | 326 | private void buildAndSubmitBatches(Iterable<Key> intentKeys, |
| 265 | boolean compileAllFailed) { | 327 | boolean compileAllFailed) { |
| 266 | // Attempt recompilation of the specified intents first. | 328 | // Attempt recompilation of the specified intents first. | ... | ... |
-
Please register or login to post a comment