Brian O'Connor

ONOS-5268 Intents don't properly transition from WITHDRAWING to INSTALLED

If the same path is selected, the flows will not be reinstalled.
This patch fixes that.

Change-Id: I78da0015f7e3b39f3b7ff842f821053c2494b8e6
...@@ -215,10 +215,8 @@ class IntentInstaller { ...@@ -215,10 +215,8 @@ class IntentInstaller {
215 } else { 215 } else {
216 IntentData uninstall = uninstallData.get(); 216 IntentData uninstall = uninstallData.get();
217 IntentData install = installData.get(); 217 IntentData install = installData.get();
218 - List<Intent> uninstallIntents = new ArrayList<>(); 218 + List<Intent> uninstallIntents = Lists.newArrayList(uninstall.installables());
219 - uninstallIntents.addAll(uninstall.installables()); 219 + List<Intent> installIntents = Lists.newArrayList(install.installables());
220 - List<Intent> installIntents = new ArrayList<>();
221 - installIntents.addAll(install.installables());
222 220
223 checkState(uninstallIntents.stream().allMatch(this::isSupported), 221 checkState(uninstallIntents.stream().allMatch(this::isSupported),
224 "Unsupported installable intents detected"); 222 "Unsupported installable intents detected");
...@@ -234,6 +232,8 @@ class IntentInstaller { ...@@ -234,6 +232,8 @@ class IntentInstaller {
234 if (uIntent.equals(installIntent)) { 232 if (uIntent.equals(installIntent)) {
235 return true; 233 return true;
236 } else if (uIntent instanceof FlowRuleIntent && installIntent instanceof FlowRuleIntent) { 234 } else if (uIntent instanceof FlowRuleIntent && installIntent instanceof FlowRuleIntent) {
235 + //FIXME we can further optimize this by doing the filtering on a flow-by-flow basis
236 + // (direction can be implied from intent state)
237 return ((FlowRuleIntent) uIntent).flowRules() 237 return ((FlowRuleIntent) uIntent).flowRules()
238 .containsAll(((FlowRuleIntent) installIntent).flowRules()); 238 .containsAll(((FlowRuleIntent) installIntent).flowRules());
239 } else { 239 } else {
...@@ -241,7 +241,12 @@ class IntentInstaller { ...@@ -241,7 +241,12 @@ class IntentInstaller {
241 } 241 }
242 }).findFirst().ifPresent(common -> { 242 }).findFirst().ifPresent(common -> {
243 uninstallIntents.remove(common); 243 uninstallIntents.remove(common);
244 - iterator.remove(); 244 + if (INSTALLED.equals(uninstall.state())) {
245 + // only remove the install intent if the existing
246 + // intent (i.e. the uninstall one) is already
247 + // installed or installing
248 + iterator.remove();
249 + }
245 }); 250 });
246 } 251 }
247 252
......