Committed by
Gerrit Code Review
Fix for wipe-out please command ONOS-4653
Change-Id: I26c841f2d67bc915b7e02e6d1e792a7e2d9ea329
Showing
8 changed files
with
105 additions
and
2 deletions
| ... | @@ -21,11 +21,18 @@ import org.onosproject.net.Device; | ... | @@ -21,11 +21,18 @@ import org.onosproject.net.Device; |
| 21 | import org.onosproject.net.Host; | 21 | import org.onosproject.net.Host; |
| 22 | import org.onosproject.net.Link; | 22 | import org.onosproject.net.Link; |
| 23 | import org.onosproject.net.device.DeviceAdminService; | 23 | import org.onosproject.net.device.DeviceAdminService; |
| 24 | +import org.onosproject.net.flow.FlowRuleService; | ||
| 25 | +import org.onosproject.net.group.GroupService; | ||
| 24 | import org.onosproject.net.host.HostAdminService; | 26 | import org.onosproject.net.host.HostAdminService; |
| 25 | import org.onosproject.net.intent.Intent; | 27 | import org.onosproject.net.intent.Intent; |
| 26 | import org.onosproject.net.intent.IntentService; | 28 | import org.onosproject.net.intent.IntentService; |
| 27 | import org.onosproject.net.intent.IntentState; | 29 | import org.onosproject.net.intent.IntentState; |
| 28 | import org.onosproject.net.link.LinkAdminService; | 30 | import org.onosproject.net.link.LinkAdminService; |
| 31 | +import java.util.EnumSet; | ||
| 32 | +import java.util.concurrent.CountDownLatch; | ||
| 33 | +import java.util.concurrent.TimeUnit; | ||
| 34 | +import static org.onosproject.net.intent.IntentState.FAILED; | ||
| 35 | +import static org.onosproject.net.intent.IntentState.WITHDRAWN; | ||
| 29 | 36 | ||
| 30 | /** | 37 | /** |
| 31 | * Wipes-out the entire network information base, i.e. devices, links, hosts, intents. | 38 | * Wipes-out the entire network information base, i.e. devices, links, hosts, intents. |
| ... | @@ -35,7 +42,7 @@ import org.onosproject.net.link.LinkAdminService; | ... | @@ -35,7 +42,7 @@ import org.onosproject.net.link.LinkAdminService; |
| 35 | public class WipeOutCommand extends ClustersListCommand { | 42 | public class WipeOutCommand extends ClustersListCommand { |
| 36 | 43 | ||
| 37 | private static final String PLEASE = "please"; | 44 | private static final String PLEASE = "please"; |
| 38 | - | 45 | + private static final EnumSet<IntentState> CAN_PURGE = EnumSet.of(WITHDRAWN, FAILED); |
| 39 | @Argument(index = 0, name = "please", description = "Confirmation phrase", | 46 | @Argument(index = 0, name = "please", description = "Confirmation phrase", |
| 40 | required = false, multiValued = false) | 47 | required = false, multiValued = false) |
| 41 | String please = null; | 48 | String please = null; |
| ... | @@ -49,6 +56,8 @@ public class WipeOutCommand extends ClustersListCommand { | ... | @@ -49,6 +56,8 @@ public class WipeOutCommand extends ClustersListCommand { |
| 49 | 56 | ||
| 50 | wipeOutIntents(); | 57 | wipeOutIntents(); |
| 51 | wipeOutHosts(); | 58 | wipeOutHosts(); |
| 59 | + wipeOutFlows(); | ||
| 60 | + wipeOutGroups(); | ||
| 52 | wipeOutDevices(); | 61 | wipeOutDevices(); |
| 53 | wipeOutLinks(); | 62 | wipeOutLinks(); |
| 54 | } | 63 | } |
| ... | @@ -56,11 +65,38 @@ public class WipeOutCommand extends ClustersListCommand { | ... | @@ -56,11 +65,38 @@ public class WipeOutCommand extends ClustersListCommand { |
| 56 | private void wipeOutIntents() { | 65 | private void wipeOutIntents() { |
| 57 | print("Wiping intents"); | 66 | print("Wiping intents"); |
| 58 | IntentService intentService = get(IntentService.class); | 67 | IntentService intentService = get(IntentService.class); |
| 68 | + final CountDownLatch withdrawLatch; | ||
| 69 | + withdrawLatch = new CountDownLatch(1); | ||
| 59 | for (Intent intent : intentService.getIntents()) { | 70 | for (Intent intent : intentService.getIntents()) { |
| 60 | if (intentService.getIntentState(intent.key()) != IntentState.WITHDRAWN) { | 71 | if (intentService.getIntentState(intent.key()) != IntentState.WITHDRAWN) { |
| 61 | intentService.withdraw(intent); | 72 | intentService.withdraw(intent); |
| 73 | + try { // wait for withdraw event | ||
| 74 | + withdrawLatch.await(5, TimeUnit.SECONDS); | ||
| 75 | + } catch (InterruptedException e) { | ||
| 76 | + print("Timed out waiting for intent {} withdraw"); | ||
| 77 | + } | ||
| 78 | + } | ||
| 79 | + if (CAN_PURGE.contains(intentService.getIntentState(intent.key()))) { | ||
| 80 | + intentService.purge(intent); | ||
| 81 | + } | ||
| 62 | } | 82 | } |
| 63 | - intentService.purge(intent); | 83 | + } |
| 84 | + | ||
| 85 | + private void wipeOutFlows() { | ||
| 86 | + print("Wiping Flows"); | ||
| 87 | + FlowRuleService flowRuleService = get(FlowRuleService.class); | ||
| 88 | + DeviceAdminService deviceAdminService = get(DeviceAdminService.class); | ||
| 89 | + for (Device device : deviceAdminService.getDevices()) { | ||
| 90 | + flowRuleService.purgeFlowRules(device.id()); | ||
| 91 | + } | ||
| 92 | + } | ||
| 93 | + | ||
| 94 | + private void wipeOutGroups() { | ||
| 95 | + print("Wiping groups"); | ||
| 96 | + GroupService groupService = get(GroupService.class); | ||
| 97 | + DeviceAdminService deviceAdminService = get(DeviceAdminService.class); | ||
| 98 | + for (Device device : deviceAdminService.getDevices()) { | ||
| 99 | + groupService.purgeGroupEntries(device.id()); | ||
| 64 | } | 100 | } |
| 65 | } | 101 | } |
| 66 | 102 | ... | ... |
| ... | @@ -63,6 +63,12 @@ public interface FlowRuleService | ... | @@ -63,6 +63,12 @@ public interface FlowRuleService |
| 63 | void applyFlowRules(FlowRule... flowRules); | 63 | void applyFlowRules(FlowRule... flowRules); |
| 64 | 64 | ||
| 65 | /** | 65 | /** |
| 66 | + * Purges all the flow rules on the specified device. | ||
| 67 | + * @param deviceId device identifier | ||
| 68 | + */ | ||
| 69 | + void purgeFlowRules(DeviceId deviceId); | ||
| 70 | + | ||
| 71 | + /** | ||
| 66 | * Removes the specified flow rules from their respective devices. If the | 72 | * Removes the specified flow rules from their respective devices. If the |
| 67 | * device is not presently connected to the controller, these flow will | 73 | * device is not presently connected to the controller, these flow will |
| 68 | * be removed once the device reconnects. | 74 | * be removed once the device reconnects. | ... | ... |
| ... | @@ -107,6 +107,12 @@ public interface GroupService | ... | @@ -107,6 +107,12 @@ public interface GroupService |
| 107 | ApplicationId appId); | 107 | ApplicationId appId); |
| 108 | 108 | ||
| 109 | /** | 109 | /** |
| 110 | + * Purges all the group entries on the specified device. | ||
| 111 | + * @param deviceId device identifier | ||
| 112 | + */ | ||
| 113 | + void purgeGroupEntries(DeviceId deviceId); | ||
| 114 | + | ||
| 115 | + /** | ||
| 110 | * Deletes a group associated to an application cookie. | 116 | * Deletes a group associated to an application cookie. |
| 111 | * GROUP_DELETED or GROUP_DELETE_FAILED notifications would be | 117 | * GROUP_DELETED or GROUP_DELETE_FAILED notifications would be |
| 112 | * provided along with cookie depending on the result of the | 118 | * provided along with cookie depending on the result of the | ... | ... |
| ... | @@ -38,6 +38,10 @@ public class FlowRuleServiceAdapter implements FlowRuleService { | ... | @@ -38,6 +38,10 @@ public class FlowRuleServiceAdapter implements FlowRuleService { |
| 38 | } | 38 | } |
| 39 | 39 | ||
| 40 | @Override | 40 | @Override |
| 41 | + public void purgeFlowRules(DeviceId deviceId){ | ||
| 42 | + } | ||
| 43 | + | ||
| 44 | + @Override | ||
| 41 | public void removeFlowRules(FlowRule... flowRules) { | 45 | public void removeFlowRules(FlowRule... flowRules) { |
| 42 | } | 46 | } |
| 43 | 47 | ... | ... |
| ... | @@ -260,6 +260,12 @@ public class FlowRuleManager | ... | @@ -260,6 +260,12 @@ public class FlowRuleManager |
| 260 | } | 260 | } |
| 261 | 261 | ||
| 262 | @Override | 262 | @Override |
| 263 | + public void purgeFlowRules(DeviceId deviceId) { | ||
| 264 | + checkPermission(FLOWRULE_WRITE); | ||
| 265 | + store.purgeFlowRule(deviceId); | ||
| 266 | + } | ||
| 267 | + | ||
| 268 | + @Override | ||
| 263 | public void removeFlowRules(FlowRule... flowRules) { | 269 | public void removeFlowRules(FlowRule... flowRules) { |
| 264 | checkPermission(FLOWRULE_WRITE); | 270 | checkPermission(FLOWRULE_WRITE); |
| 265 | 271 | ... | ... |
| ... | @@ -242,6 +242,13 @@ public class GroupManager | ... | @@ -242,6 +242,13 @@ public class GroupManager |
| 242 | newCookie); | 242 | newCookie); |
| 243 | } | 243 | } |
| 244 | 244 | ||
| 245 | + @Override | ||
| 246 | + public void purgeGroupEntries(DeviceId deviceId) { | ||
| 247 | + checkPermission(GROUP_WRITE); | ||
| 248 | + store.purgeGroupEntry(deviceId); | ||
| 249 | + } | ||
| 250 | + | ||
| 251 | + | ||
| 245 | /** | 252 | /** |
| 246 | * Delete a group associated to an application cookie. | 253 | * Delete a group associated to an application cookie. |
| 247 | * GROUP_DELETED or GROUP_DELETE_FAILED notifications would be | 254 | * GROUP_DELETED or GROUP_DELETE_FAILED notifications would be | ... | ... |
| ... | @@ -260,6 +260,22 @@ public class FlowRuleManagerTest { | ... | @@ -260,6 +260,22 @@ public class FlowRuleManagerTest { |
| 260 | } | 260 | } |
| 261 | 261 | ||
| 262 | @Test | 262 | @Test |
| 263 | + public void purgeFlowRules() { | ||
| 264 | + FlowRule f1 = addFlowRule(1); | ||
| 265 | + FlowRule f2 = addFlowRule(2); | ||
| 266 | + FlowRule f3 = addFlowRule(3); | ||
| 267 | + assertEquals("3 rules should exist", 3, flowCount()); | ||
| 268 | + FlowEntry fe1 = new DefaultFlowEntry(f1); | ||
| 269 | + FlowEntry fe2 = new DefaultFlowEntry(f2); | ||
| 270 | + FlowEntry fe3 = new DefaultFlowEntry(f3); | ||
| 271 | + providerService.pushFlowMetrics(DID, ImmutableList.of(fe1, fe2, fe3)); | ||
| 272 | + validateEvents(RULE_ADD_REQUESTED, RULE_ADD_REQUESTED, RULE_ADD_REQUESTED, | ||
| 273 | + RULE_ADDED, RULE_ADDED, RULE_ADDED); | ||
| 274 | + mgr.purgeFlowRules(DID); | ||
| 275 | + assertEquals("0 rule should exist", 0, flowCount()); | ||
| 276 | + } | ||
| 277 | + | ||
| 278 | + @Test | ||
| 263 | public void removeFlowRules() { | 279 | public void removeFlowRules() { |
| 264 | FlowRule f1 = addFlowRule(1); | 280 | FlowRule f1 = addFlowRule(1); |
| 265 | FlowRule f2 = addFlowRule(2); | 281 | FlowRule f2 = addFlowRule(2); | ... | ... |
| ... | @@ -188,6 +188,21 @@ public class GroupManagerTest { | ... | @@ -188,6 +188,21 @@ public class GroupManagerTest { |
| 188 | } | 188 | } |
| 189 | 189 | ||
| 190 | /** | 190 | /** |
| 191 | + * Tests group Purge Operation. | ||
| 192 | + */ | ||
| 193 | + @Test | ||
| 194 | + public void testPurgeGroups() { | ||
| 195 | + //Test Group creation before AUDIT process | ||
| 196 | + testGroupCreationBeforeAudit(DID); | ||
| 197 | + programmableTestCleanUp(); | ||
| 198 | + testAuditWithExtraneousMissingGroups(DID); | ||
| 199 | + // Test group add bucket operations | ||
| 200 | + testAddBuckets(DID); | ||
| 201 | + // Test group Purge operations | ||
| 202 | + testPurgeGroupEntry(DID); | ||
| 203 | + } | ||
| 204 | + | ||
| 205 | + /** | ||
| 191 | * Tests group bucket modifications (additions and deletions) and | 206 | * Tests group bucket modifications (additions and deletions) and |
| 192 | * Tests group deletion. | 207 | * Tests group deletion. |
| 193 | */ | 208 | */ |
| ... | @@ -507,6 +522,13 @@ public class GroupManagerTest { | ... | @@ -507,6 +522,13 @@ public class GroupManagerTest { |
| 507 | internalListener.validateEvent(Collections.singletonList(GroupEvent.Type.GROUP_UPDATED)); | 522 | internalListener.validateEvent(Collections.singletonList(GroupEvent.Type.GROUP_UPDATED)); |
| 508 | } | 523 | } |
| 509 | 524 | ||
| 525 | + // Test purge group entry operations | ||
| 526 | + private void testPurgeGroupEntry(DeviceId deviceId) { | ||
| 527 | + assertEquals(1, Iterables.size(groupService.getGroups(deviceId, appId))); | ||
| 528 | + groupService.purgeGroupEntries(deviceId); | ||
| 529 | + assertEquals(0, Iterables.size(groupService.getGroups(deviceId, appId))); | ||
| 530 | + } | ||
| 531 | + | ||
| 510 | // Test group remove operations | 532 | // Test group remove operations |
| 511 | private void testRemoveGroup(DeviceId deviceId) { | 533 | private void testRemoveGroup(DeviceId deviceId) { |
| 512 | GroupKey currKey = new DefaultGroupKey("group1RemoveBuckets".getBytes()); | 534 | GroupKey currKey = new DefaultGroupKey("group1RemoveBuckets".getBytes()); | ... | ... |
-
Please register or login to post a comment