From b731e2f1dd0972409b136aebc7b463dd72c9cfad Mon Sep 17 00:00:00 2001 From: CNlucius Date: Tue, 13 Sep 2016 11:40:12 +0800 Subject: ONOSFW-171 O/S-SFC-ONOS scenario documentation Change-Id: I51ae1cf736ea24ab6680f8edca1b2bf5dd598365 Signed-off-by: CNlucius --- .../net/intent/impl/IntentManagerTest.java | 672 --------------------- 1 file changed, 672 deletions(-) delete mode 100644 framework/src/onos/core/net/src/test/java/org/onosproject/net/intent/impl/IntentManagerTest.java (limited to 'framework/src/onos/core/net/src/test/java/org/onosproject/net/intent/impl/IntentManagerTest.java') diff --git a/framework/src/onos/core/net/src/test/java/org/onosproject/net/intent/impl/IntentManagerTest.java b/framework/src/onos/core/net/src/test/java/org/onosproject/net/intent/impl/IntentManagerTest.java deleted file mode 100644 index 3f40de09..00000000 --- a/framework/src/onos/core/net/src/test/java/org/onosproject/net/intent/impl/IntentManagerTest.java +++ /dev/null @@ -1,672 +0,0 @@ -/* - * Copyright 2014-2015 Open Networking Laboratory - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.onosproject.net.intent.impl; - -import com.google.common.collect.HashMultimap; -import com.google.common.collect.Lists; -import com.google.common.collect.Maps; -import com.google.common.collect.Multimap; -import com.google.common.collect.Sets; -import org.hamcrest.Description; -import org.hamcrest.TypeSafeMatcher; -import org.junit.After; -import org.junit.Before; -import org.junit.Ignore; -import org.junit.Test; -import org.onosproject.TestApplicationId; -import org.onosproject.cfg.ComponentConfigAdapter; -import org.onosproject.common.event.impl.TestEventDispatcher; -import org.onosproject.core.ApplicationId; -import org.onosproject.core.impl.TestCoreManager; -import org.onosproject.net.NetworkResource; -import org.onosproject.net.intent.FlowRuleIntent; -import org.onosproject.net.intent.Intent; -import org.onosproject.net.intent.IntentCompiler; -import org.onosproject.net.intent.IntentData; -import org.onosproject.net.intent.IntentEvent; -import org.onosproject.net.intent.IntentEvent.Type; -import org.onosproject.net.intent.IntentExtensionService; -import org.onosproject.net.intent.IntentId; -import org.onosproject.net.intent.IntentListener; -import org.onosproject.net.intent.IntentService; -import org.onosproject.net.intent.IntentState; -import org.onosproject.net.intent.Key; -import org.onosproject.net.resource.link.LinkResourceAllocations; -import org.onosproject.store.trivial.SimpleIntentStore; - -import java.util.Collection; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.TimeUnit; -import java.util.stream.Collectors; -import java.util.stream.IntStream; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.hasSize; -import static org.hamcrest.Matchers.is; -import static org.junit.Assert.*; -import static org.onlab.junit.TestTools.assertAfter; -import static org.onlab.util.Tools.delay; -import static org.onosproject.net.NetTestTools.injectEventDispatcher; -import static org.onosproject.net.intent.IntentState.*; -import static org.onosproject.net.intent.IntentTestsMocks.MockFlowRule; -import static org.onosproject.net.intent.IntentTestsMocks.MockIntent; - -/** - * Test intent manager and transitions. - * - * TODO implement the following tests: - * - {submit, withdraw, update, replace} intent - * - {submit, update, recompiling} intent with failed compilation - * - failed reservation - * - push timeout recovery - * - failed items recovery - * - * in general, verify intents store, flow store, and work queue - */ - -public class IntentManagerTest { - - private static final int SUBMIT_TIMEOUT_MS = 1000; - private static final ApplicationId APPID = new TestApplicationId("manager-test"); - - private IntentManager manager; - private MockFlowRuleService flowRuleService; - - protected IntentService service; - protected IntentExtensionService extensionService; - protected TestListener listener = new TestListener(); - protected TestIntentCompiler compiler = new TestIntentCompiler(); - - private static class TestListener implements IntentListener { - final Multimap events = HashMultimap.create(); - Map latchMap = Maps.newHashMap(); - - @Override - public void event(IntentEvent event) { - events.put(event.type(), event); - if (latchMap.containsKey(event.type())) { - latchMap.get(event.type()).countDown(); - } - } - - public int getCounts(IntentEvent.Type type) { - return events.get(type).size(); - } - - public void setLatch(int count, IntentEvent.Type type) { - latchMap.put(type, new CountDownLatch(count)); - } - - public void await(IntentEvent.Type type) { - try { - assertTrue("Timed out waiting for: " + type, - latchMap.get(type).await(5, TimeUnit.SECONDS)); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - } - - private static class TestIntentTracker implements ObjectiveTrackerService { - private TopologyChangeDelegate delegate; - @Override - public void setDelegate(TopologyChangeDelegate delegate) { - this.delegate = delegate; - } - - @Override - public void unsetDelegate(TopologyChangeDelegate delegate) { - if (delegate.equals(this.delegate)) { - this.delegate = null; - } - } - - @Override - public void addTrackedResources(Key key, Collection resources) { - //TODO - } - - @Override - public void removeTrackedResources(Key key, Collection resources) { - //TODO - } - - @Override - public void trackIntent(IntentData intentData) { - //TODO - } - } - - private static class MockInstallableIntent extends FlowRuleIntent { - - public MockInstallableIntent() { - super(APPID, Collections.singletonList(new MockFlowRule(100)), Collections.emptyList()); - } - } - - private static class TestIntentCompiler implements IntentCompiler { - @Override - public List compile(MockIntent intent, List installable, - Set resources) { - return Lists.newArrayList(new MockInstallableIntent()); - } - } - - private static class TestIntentCompilerMultipleFlows implements IntentCompiler { - @Override - public List compile(MockIntent intent, List installable, - Set resources) { - - return IntStream.rangeClosed(1, 5) - .mapToObj(mock -> (new MockInstallableIntent())) - .collect(Collectors.toList()); - } - } - - - private static class TestIntentCompilerError implements IntentCompiler { - @Override - public List compile(MockIntent intent, List installable, - Set resources) { - throw new IntentCompilationException("Compilation always fails"); - } - } - - /** - * Hamcrest matcher to check that a collection of Intents contains an - * Intent with the specified Intent Id. - */ - public static class EntryForIntentMatcher extends TypeSafeMatcher> { - private final IntentId id; - - public EntryForIntentMatcher(IntentId idValue) { - id = idValue; - } - - @Override - public boolean matchesSafely(Collection intents) { - for (Intent intent : intents) { - if (intent.id().equals(id)) { - return true; - } - } - return false; - } - - @Override - public void describeTo(Description description) { - description.appendText("an intent with id \" "). - appendText(id.toString()). - appendText("\""); - } - } - - private static EntryForIntentMatcher hasIntentWithId(IntentId id) { - return new EntryForIntentMatcher(id); - } - - @Before - public void setUp() { - manager = new IntentManager(); - flowRuleService = new MockFlowRuleService(); - manager.store = new SimpleIntentStore(); - injectEventDispatcher(manager, new TestEventDispatcher()); - manager.trackerService = new TestIntentTracker(); - manager.flowRuleService = flowRuleService; - manager.coreService = new TestCoreManager(); - service = manager; - extensionService = manager; - - manager.activate(); - service.addListener(listener); - extensionService.registerCompiler(MockIntent.class, compiler); - - assertTrue("store should be empty", - Sets.newHashSet(service.getIntents()).isEmpty()); - assertEquals(0L, flowRuleService.getFlowRuleCount()); - } - - public void verifyState() { - // verify that all intents are parked and the batch operation is unblocked - Set parked = Sets.newHashSet(INSTALLED, WITHDRAWN, FAILED, CORRUPT); - for (Intent i : service.getIntents()) { - IntentState state = service.getIntentState(i.key()); - assertTrue("Intent " + i.id() + " is in invalid state " + state, - parked.contains(state)); - } - //the batch has not yet been removed when we receive the last event - // FIXME: this doesn't guarantee to avoid the race - - //FIXME -// for (int tries = 0; tries < 10; tries++) { -// if (manager.batchService.getPendingOperations().isEmpty()) { -// break; -// } -// delay(10); -// } -// assertTrue("There are still pending batch operations.", -// manager.batchService.getPendingOperations().isEmpty()); - - } - - @After - public void tearDown() { - extensionService.unregisterCompiler(MockIntent.class); - service.removeListener(listener); - manager.deactivate(); - // TODO null the other refs? - } - - @Test - public void submitIntent() { - flowRuleService.setFuture(true); - - listener.setLatch(1, Type.INSTALL_REQ); - listener.setLatch(1, Type.INSTALLED); - Intent intent = new MockIntent(MockIntent.nextId()); - service.submit(intent); - listener.await(Type.INSTALL_REQ); - listener.await(Type.INSTALLED); - assertEquals(1L, service.getIntentCount()); - assertEquals(1L, flowRuleService.getFlowRuleCount()); - verifyState(); - } - - @Test - public void withdrawIntent() { - flowRuleService.setFuture(true); - - listener.setLatch(1, Type.INSTALLED); - Intent intent = new MockIntent(MockIntent.nextId()); - service.submit(intent); - listener.await(Type.INSTALLED); - assertEquals(1L, service.getIntentCount()); - assertEquals(1L, flowRuleService.getFlowRuleCount()); - - listener.setLatch(1, Type.WITHDRAWN); - service.withdraw(intent); - listener.await(Type.WITHDRAWN); - assertEquals(0L, flowRuleService.getFlowRuleCount()); - verifyState(); - } - - @Test - @Ignore("This is disabled because we are seeing intermittent failures on Jenkins") - public void stressSubmitWithdrawUnique() { - flowRuleService.setFuture(true); - - int count = 500; - Intent[] intents = new Intent[count]; - - listener.setLatch(count, Type.WITHDRAWN); - - for (int i = 0; i < count; i++) { - intents[i] = new MockIntent(MockIntent.nextId()); - service.submit(intents[i]); - } - - for (int i = 0; i < count; i++) { - service.withdraw(intents[i]); - } - - listener.await(Type.WITHDRAWN); - assertEquals(0L, flowRuleService.getFlowRuleCount()); - verifyState(); - } - - @Test - public void stressSubmitWithdrawSame() { - flowRuleService.setFuture(true); - - int count = 50; - - Intent intent = new MockIntent(MockIntent.nextId()); - for (int i = 0; i < count; i++) { - service.submit(intent); - service.withdraw(intent); - } - - assertAfter(SUBMIT_TIMEOUT_MS, () -> { - assertEquals(1L, service.getIntentCount()); - assertEquals(0L, flowRuleService.getFlowRuleCount()); - }); - verifyState(); - } - - - /** - * Tests for proper behavior of installation of an intent that triggers - * a compilation error. - */ - @Test - public void errorIntentCompile() { - final TestIntentCompilerError errorCompiler = new TestIntentCompilerError(); - extensionService.registerCompiler(MockIntent.class, errorCompiler); - MockIntent intent = new MockIntent(MockIntent.nextId()); - listener.setLatch(1, Type.INSTALL_REQ); - listener.setLatch(1, Type.FAILED); - service.submit(intent); - listener.await(Type.INSTALL_REQ); - listener.await(Type.FAILED); - verifyState(); - } - - /** - * Tests handling a future that contains an error as a result of - * installing an intent. - */ - @Ignore("skipping until we fix update ordering problem") - @Test - public void errorIntentInstallFromFlows() { - final Long id = MockIntent.nextId(); - flowRuleService.setFuture(false); - MockIntent intent = new MockIntent(id); - listener.setLatch(1, Type.FAILED); - listener.setLatch(1, Type.INSTALL_REQ); - service.submit(intent); - listener.await(Type.INSTALL_REQ); - listener.await(Type.FAILED); - // FIXME the intent will be moved into INSTALLED immediately which overrides FAILED - // ... the updates come out of order - verifyState(); - } - - /** - * Tests handling a future that contains an unresolvable error as a result of - * installing an intent. - */ - @Test - public void errorIntentInstallNeverTrue() { - final Long id = MockIntent.nextId(); - flowRuleService.setFuture(false); - MockIntent intent = new MockIntent(id); - listener.setLatch(1, Type.CORRUPT); - listener.setLatch(1, Type.INSTALL_REQ); - service.submit(intent); - listener.await(Type.INSTALL_REQ); - // The delay here forces the retry loop in the intent manager to time out - delay(100); - flowRuleService.setFuture(false); - service.withdraw(intent); - listener.await(Type.CORRUPT); - verifyState(); - } - - /** - * Tests that a compiler for a subclass of an intent that already has a - * compiler is automatically added. - */ - @Test - public void intentSubclassCompile() { - class MockIntentSubclass extends MockIntent { - public MockIntentSubclass(Long number) { - super(number); - } - } - flowRuleService.setFuture(true); - - listener.setLatch(1, Type.INSTALL_REQ); - listener.setLatch(1, Type.INSTALLED); - Intent intent = new MockIntentSubclass(MockIntent.nextId()); - service.submit(intent); - listener.await(Type.INSTALL_REQ); - listener.await(Type.INSTALLED); - assertEquals(1L, service.getIntentCount()); - assertEquals(1L, flowRuleService.getFlowRuleCount()); - - final Map, IntentCompiler> compilers = - extensionService.getCompilers(); - assertEquals(2, compilers.size()); - assertNotNull(compilers.get(MockIntentSubclass.class)); - assertNotNull(compilers.get(MockIntent.class)); - verifyState(); - } - - /** - * Tests an intent with no compiler. - */ - @Test - public void intentWithoutCompiler() { - class IntentNoCompiler extends Intent { - IntentNoCompiler() { - super(APPID, null, Collections.emptyList(), - Intent.DEFAULT_INTENT_PRIORITY); - } - } - - Intent intent = new IntentNoCompiler(); - listener.setLatch(1, Type.INSTALL_REQ); - listener.setLatch(1, Type.FAILED); - service.submit(intent); - listener.await(Type.INSTALL_REQ); - listener.await(Type.FAILED); - verifyState(); - } - - /** - * Tests an intent with no installer. - */ - @Test - public void intentWithoutInstaller() { - MockIntent intent = new MockIntent(MockIntent.nextId()); - listener.setLatch(1, Type.INSTALL_REQ); - listener.setLatch(1, Type.CORRUPT); - service.submit(intent); - listener.await(Type.INSTALL_REQ); - listener.await(Type.CORRUPT); - verifyState(); - } - - /** - * Tests that the intent fetching methods are correct. - */ - @Test - public void testIntentFetching() { - List intents; - - flowRuleService.setFuture(true); - - intents = Lists.newArrayList(service.getIntents()); - assertThat(intents, hasSize(0)); - - final MockIntent intent1 = new MockIntent(MockIntent.nextId()); - final MockIntent intent2 = new MockIntent(MockIntent.nextId()); - - listener.setLatch(2, Type.INSTALL_REQ); - listener.setLatch(2, Type.INSTALLED); - service.submit(intent1); - service.submit(intent2); - listener.await(Type.INSTALL_REQ); - listener.await(Type.INSTALL_REQ); - listener.await(Type.INSTALLED); - listener.await(Type.INSTALLED); - - intents = Lists.newArrayList(service.getIntents()); - assertThat(intents, hasSize(2)); - - assertThat(intents, hasIntentWithId(intent1.id())); - assertThat(intents, hasIntentWithId(intent2.id())); - verifyState(); - } - - /** - * Tests that removing all intents results in no flows remaining. - */ - @Test - public void testFlowRemoval() { - List intents; - - flowRuleService.setFuture(true); - - intents = Lists.newArrayList(service.getIntents()); - assertThat(intents, hasSize(0)); - - final MockIntent intent1 = new MockIntent(MockIntent.nextId()); - final MockIntent intent2 = new MockIntent(MockIntent.nextId()); - - listener.setLatch(1, Type.INSTALL_REQ); - listener.setLatch(1, Type.INSTALLED); - - service.submit(intent1); - listener.await(Type.INSTALL_REQ); - listener.await(Type.INSTALLED); - - - listener.setLatch(1, Type.INSTALL_REQ); - listener.setLatch(1, Type.INSTALLED); - - service.submit(intent2); - listener.await(Type.INSTALL_REQ); - listener.await(Type.INSTALLED); - - assertThat(listener.getCounts(Type.INSTALLED), is(2)); - assertThat(flowRuleService.getFlowRuleCount(), is(2)); - - listener.setLatch(1, Type.WITHDRAWN); - service.withdraw(intent1); - listener.await(Type.WITHDRAWN); - - listener.setLatch(1, Type.WITHDRAWN); - service.withdraw(intent2); - listener.await(Type.WITHDRAWN); - - assertThat(listener.getCounts(Type.WITHDRAWN), is(2)); - assertThat(flowRuleService.getFlowRuleCount(), is(0)); - } - - /** - * Test failure to install an intent, then succeed on retry via IntentCleanup. - */ - @Test - public void testCorruptCleanup() { - IntentCleanup cleanup = new IntentCleanup(); - cleanup.service = manager; - cleanup.store = manager.store; - cleanup.cfgService = new ComponentConfigAdapter(); - - try { - cleanup.activate(); - - final TestIntentCompilerMultipleFlows errorCompiler = new TestIntentCompilerMultipleFlows(); - extensionService.registerCompiler(MockIntent.class, errorCompiler); - List intents; - - flowRuleService.setFuture(false); - - intents = Lists.newArrayList(service.getIntents()); - assertThat(intents, hasSize(0)); - - final MockIntent intent1 = new MockIntent(MockIntent.nextId()); - - listener.setLatch(1, Type.INSTALL_REQ); - listener.setLatch(1, Type.CORRUPT); - listener.setLatch(1, Type.INSTALLED); - - service.submit(intent1); - - listener.await(Type.INSTALL_REQ); - listener.await(Type.CORRUPT); - - flowRuleService.setFuture(true); - - listener.await(Type.INSTALLED); - - assertThat(listener.getCounts(Type.CORRUPT), is(1)); - assertThat(listener.getCounts(Type.INSTALLED), is(1)); - assertEquals(INSTALLED, manager.getIntentState(intent1.key())); - assertThat(flowRuleService.getFlowRuleCount(), is(5)); - } finally { - cleanup.deactivate(); - } - } - - /** - * Test failure to install an intent, and verify retries. - */ - @Test - public void testCorruptRetry() { - IntentCleanup cleanup = new IntentCleanup(); - cleanup.service = manager; - cleanup.store = manager.store; - cleanup.cfgService = new ComponentConfigAdapter(); - cleanup.period = 1_000_000; - cleanup.retryThreshold = 3; - - try { - cleanup.activate(); - - final TestIntentCompilerMultipleFlows errorCompiler = new TestIntentCompilerMultipleFlows(); - extensionService.registerCompiler(MockIntent.class, errorCompiler); - List intents; - - flowRuleService.setFuture(false); - - intents = Lists.newArrayList(service.getIntents()); - assertThat(intents, hasSize(0)); - - final MockIntent intent1 = new MockIntent(MockIntent.nextId()); - - listener.setLatch(1, Type.INSTALL_REQ); - listener.setLatch(cleanup.retryThreshold, Type.CORRUPT); - listener.setLatch(1, Type.INSTALLED); - - service.submit(intent1); - - listener.await(Type.INSTALL_REQ); - listener.await(Type.CORRUPT); - assertEquals(CORRUPT, manager.getIntentState(intent1.key())); - assertThat(listener.getCounts(Type.CORRUPT), is(cleanup.retryThreshold)); - - } finally { - cleanup.deactivate(); - } - } - - /** - * Tests that an intent that fails installation results in no flows remaining. - */ - @Test - @Ignore("MockFlowRule numbering issue") //test works if run independently - public void testFlowRemovalInstallError() { - final TestIntentCompilerMultipleFlows errorCompiler = new TestIntentCompilerMultipleFlows(); - extensionService.registerCompiler(MockIntent.class, errorCompiler); - List intents; - - flowRuleService.setFuture(true); - //FIXME relying on "3" is brittle - flowRuleService.setErrorFlow(3); - - intents = Lists.newArrayList(service.getIntents()); - assertThat(intents, hasSize(0)); - - final MockIntent intent1 = new MockIntent(MockIntent.nextId()); - - listener.setLatch(1, Type.INSTALL_REQ); - listener.setLatch(1, Type.CORRUPT); - - service.submit(intent1); - listener.await(Type.INSTALL_REQ); - listener.await(Type.CORRUPT); - - assertThat(listener.getCounts(Type.CORRUPT), is(1)); - // in this test, there will still be flows abandoned on the data plane - //assertThat(flowRuleService.getFlowRuleCount(), is(0)); - } -} -- cgit 1.2.3-korg