blob: f12ffdce7c1b0207f962a85a122025d36b9efc86 [file] [log] [blame]
yoonseon86bebed2017-02-03 15:23:57 -08001/*
2 * Copyright 2017-present Open Networking Laboratory
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package org.onosproject.incubator.net.virtual.impl;
18
19import org.junit.After;
20import org.junit.Before;
21import org.junit.Test;
22import org.onlab.junit.TestTools;
23import org.onlab.junit.TestUtils;
24import org.onlab.osgi.ServiceDirectory;
25import org.onlab.osgi.TestServiceDirectory;
26import org.onosproject.TestApplicationId;
27import org.onosproject.common.event.impl.TestEventDispatcher;
28import org.onosproject.core.ApplicationId;
29import org.onosproject.core.CoreService;
30import org.onosproject.event.EventDeliveryService;
31import org.onosproject.incubator.net.virtual.NetworkId;
32import org.onosproject.incubator.net.virtual.VirtualNetwork;
33import org.onosproject.incubator.net.virtual.VirtualNetworkFlowObjectiveStore;
34import org.onosproject.incubator.net.virtual.VirtualNetworkFlowRuleStore;
35import org.onosproject.incubator.net.virtual.VirtualNetworkStore;
yoonseon86bebed2017-02-03 15:23:57 -080036import org.onosproject.incubator.net.virtual.impl.provider.VirtualProviderManager;
37import org.onosproject.incubator.net.virtual.provider.AbstractVirtualProvider;
38import org.onosproject.incubator.net.virtual.provider.VirtualFlowRuleProvider;
39import org.onosproject.incubator.net.virtual.provider.VirtualProviderRegistryService;
40import org.onosproject.incubator.store.virtual.impl.DistributedVirtualNetworkStore;
41import org.onosproject.incubator.store.virtual.impl.SimpleVirtualFlowObjectiveStore;
42import org.onosproject.incubator.store.virtual.impl.SimpleVirtualFlowRuleStore;
43import org.onosproject.net.NetTestTools;
44import org.onosproject.net.flow.DefaultTrafficSelector;
45import org.onosproject.net.flow.DefaultTrafficTreatment;
46import org.onosproject.net.flow.FlowRule;
47import org.onosproject.net.flow.FlowRuleBatchOperation;
48import org.onosproject.net.flow.TrafficSelector;
49import org.onosproject.net.flow.TrafficTreatment;
Claudine Chiue502e9d2017-03-27 11:00:50 -040050import org.onosproject.net.flow.criteria.Criteria;
51import org.onosproject.net.flowobjective.DefaultFilteringObjective;
yoonseon86bebed2017-02-03 15:23:57 -080052import org.onosproject.net.flowobjective.DefaultForwardingObjective;
Claudine Chiue502e9d2017-03-27 11:00:50 -040053import org.onosproject.net.flowobjective.DefaultNextObjective;
54import org.onosproject.net.flowobjective.FilteringObjective;
yoonseon86bebed2017-02-03 15:23:57 -080055import org.onosproject.net.flowobjective.FlowObjectiveService;
56import org.onosproject.net.flowobjective.ForwardingObjective;
Claudine Chiue502e9d2017-03-27 11:00:50 -040057import org.onosproject.net.flowobjective.NextObjective;
yoonseon86bebed2017-02-03 15:23:57 -080058import org.onosproject.net.intent.FakeIntentManager;
59import org.onosproject.net.intent.TestableIntentService;
60import org.onosproject.net.provider.ProviderId;
61import org.onosproject.store.service.StorageService;
62import org.onosproject.store.service.TestStorageService;
63
Claudine Chiu465a2602017-03-17 18:33:36 -040064import static org.junit.Assert.assertEquals;
yoonseon86bebed2017-02-03 15:23:57 -080065
66/**
67 * Junit tests for VirtualNetworkFlowObjectiveManager.
68 */
69public class VirtualNetworkFlowObjectiveManagerTest
70 extends VirtualNetworkTestUtil {
71
72 private static final int RETRY_MS = 250;
73
74 private VirtualNetworkManager manager;
75 private DistributedVirtualNetworkStore virtualNetworkManagerStore;
76 private TestableIntentService intentService = new FakeIntentManager();
77 private ServiceDirectory testDirectory;
Claudine Chiucdc4b8c2017-03-30 00:34:39 -040078 protected SimpleVirtualFlowObjectiveStore flowObjectiveStore;
yoonseon86bebed2017-02-03 15:23:57 -080079
80 private VirtualProviderManager providerRegistryService;
81 private EventDeliveryService eventDeliveryService;
yoonseon86bebed2017-02-03 15:23:57 -080082
83 private ApplicationId appId;
84
85 private VirtualNetwork vnet1;
86 private VirtualNetwork vnet2;
87
88 private FlowObjectiveService service1;
89 private FlowObjectiveService service2;
90
91 //FIXME: referring flowrule service, store, and provider shouldn't be here
92 private VirtualFlowRuleProvider flowRuleProvider = new TestProvider();
93 private SimpleVirtualFlowRuleStore flowRuleStore;
Claudine Chiucdc4b8c2017-03-30 00:34:39 -040094 protected StorageService storageService = new TestStorageService();
yoonseon86bebed2017-02-03 15:23:57 -080095
96 @Before
97 public void setUp() throws Exception {
98 virtualNetworkManagerStore = new DistributedVirtualNetworkStore();
99
100 CoreService coreService = new TestCoreService();
101 TestUtils.setField(virtualNetworkManagerStore, "coreService", coreService);
yoonseon86bebed2017-02-03 15:23:57 -0800102 TestUtils.setField(virtualNetworkManagerStore, "storageService", storageService);
103 virtualNetworkManagerStore.activate();
104
105 flowObjectiveStore = new SimpleVirtualFlowObjectiveStore();
106 TestUtils.setField(flowObjectiveStore, "storageService", storageService);
107 flowObjectiveStore.activate();
108 flowRuleStore = new SimpleVirtualFlowRuleStore();
109 flowRuleStore.activate();
110
111 manager = new VirtualNetworkManager();
112 manager.store = virtualNetworkManagerStore;
113 manager.intentService = intentService;
114 TestUtils.setField(manager, "coreService", coreService);
115
116 providerRegistryService = new VirtualProviderManager();
117 providerRegistryService.registerProvider(flowRuleProvider);
118
119 eventDeliveryService = new TestEventDispatcher();
120 NetTestTools.injectEventDispatcher(manager, eventDeliveryService);
yoonseon86bebed2017-02-03 15:23:57 -0800121
122 appId = new TestApplicationId("FlowRuleManagerTest");
123
124 testDirectory = new TestServiceDirectory()
125 .add(VirtualNetworkStore.class, virtualNetworkManagerStore)
126 .add(CoreService.class, coreService)
127 .add(EventDeliveryService.class, eventDeliveryService)
128 .add(VirtualProviderRegistryService.class, providerRegistryService)
129 .add(VirtualNetworkFlowRuleStore.class, flowRuleStore)
130 .add(VirtualNetworkFlowObjectiveStore.class, flowObjectiveStore);
131 TestUtils.setField(manager, "serviceDirectory", testDirectory);
132
133 manager.activate();
134
135 vnet1 = setupVirtualNetworkTopology(manager, TID1);
136 vnet2 = setupVirtualNetworkTopology(manager, TID2);
137
138 service1 = new VirtualNetworkFlowObjectiveManager(manager, vnet1.id());
139 service2 = new VirtualNetworkFlowObjectiveManager(manager, vnet2.id());
140 }
141
142 @After
143 public void tearDownTest() {
144 manager.deactivate();
145 virtualNetworkManagerStore.deactivate();
146 }
147
148 /**
149 * Tests adding a forwarding objective.
150 */
151 @Test
152 public void forwardingObjective() {
153 TrafficSelector selector = DefaultTrafficSelector.emptySelector();
154 TrafficTreatment treatment = DefaultTrafficTreatment.emptyTreatment();
155 ForwardingObjective forward =
156 DefaultForwardingObjective.builder()
157 .fromApp(NetTestTools.APP_ID)
158 .withFlag(ForwardingObjective.Flag.SPECIFIC)
159 .withSelector(selector)
160 .withTreatment(treatment)
161 .makePermanent()
162 .add();
163
164 service1.forward(VDID1, forward);
165
166 TestTools.assertAfter(RETRY_MS, () ->
167 assertEquals("1 flowrule entry expected",
168 1, flowRuleStore.getFlowRuleCount(vnet1.id())));
169 TestTools.assertAfter(RETRY_MS, () ->
170 assertEquals("0 flowrule entry expected",
171 0, flowRuleStore.getFlowRuleCount(vnet2.id())));
172 }
173
Claudine Chiue502e9d2017-03-27 11:00:50 -0400174 /**
175 * Tests adding a next objective.
176 */
177 @Test
178 public void nextObjective() {
179 TrafficTreatment treatment = DefaultTrafficTreatment.emptyTreatment();
180 NextObjective nextObjective = DefaultNextObjective.builder()
181 .withId(service1.allocateNextId())
182 .fromApp(NetTestTools.APP_ID)
183 .addTreatment(treatment)
184 .withType(NextObjective.Type.BROADCAST)
185 .makePermanent()
186 .add();
187
188 service1.next(VDID1, nextObjective);
189
190 TestTools.assertAfter(RETRY_MS, () ->
191 assertEquals("1 next map entry expected",
192 1, service1.getNextMappings().size()));
193 TestTools.assertAfter(RETRY_MS, () ->
194 assertEquals("0 next map entry expected",
195 0, service2.getNextMappings().size()));
196 }
197
198 /**
199 * Tests adding a filtering objective.
200 */
201 @Test
202 public void filteringObjective() {
203 TrafficTreatment treatment = DefaultTrafficTreatment.emptyTreatment();
204 FilteringObjective filter =
205 DefaultFilteringObjective.builder()
206 .fromApp(NetTestTools.APP_ID)
207 .withMeta(treatment)
208 .makePermanent()
209 .deny()
210 .addCondition(Criteria.matchEthType(12))
211 .add();
212
213 service1.filter(VDID1, filter);
214
215 TestTools.assertAfter(RETRY_MS, () ->
216 assertEquals("1 flowrule entry expected",
217 1, flowRuleStore.getFlowRuleCount(vnet1.id())));
218 TestTools.assertAfter(RETRY_MS, () ->
219 assertEquals("0 flowrule entry expected",
220 0, flowRuleStore.getFlowRuleCount(vnet2.id())));
221 }
222
yoonseon86bebed2017-02-03 15:23:57 -0800223 //TODO: More test cases for filter, foward, and next
224
225 private class TestProvider extends AbstractVirtualProvider
226 implements VirtualFlowRuleProvider {
227
228 protected TestProvider() {
229 super(new ProviderId("test", "org.onosproject.virtual.testprovider"));
230 }
231
232 @Override
233 public void applyFlowRule(NetworkId networkId, FlowRule... flowRules) {
234
235 }
236
237 @Override
238 public void removeFlowRule(NetworkId networkId, FlowRule... flowRules) {
239
240 }
241
242 @Override
243 public void executeBatch(NetworkId networkId, FlowRuleBatchOperation batch) {
244
245 }
246 }
Claudine Chiue502e9d2017-03-27 11:00:50 -0400247}