blob: 71c4f90298cc7c471c1f3fc7f8aec18700e49950 [file] [log] [blame]
yoonseon94672112017-01-31 13:46:21 -08001/*
2 * Copyright 2017-present Open Networking Foundation
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 com.google.common.collect.Maps;
20import org.junit.After;
21import org.junit.Before;
22import org.junit.Test;
23import org.onlab.junit.TestUtils;
24import org.onlab.osgi.ServiceDirectory;
25import org.onlab.osgi.TestServiceDirectory;
26import org.onlab.packet.IpAddress;
27import org.onosproject.TestApplicationId;
28import org.onosproject.cluster.NodeId;
29import org.onosproject.common.event.impl.TestEventDispatcher;
30import org.onosproject.core.ApplicationId;
31import org.onosproject.core.CoreService;
32import org.onosproject.event.EventDeliveryService;
33import org.onosproject.incubator.net.virtual.NetworkId;
34import org.onosproject.incubator.net.virtual.VirtualNetwork;
35import org.onosproject.incubator.net.virtual.VirtualNetworkMeterStore;
36import org.onosproject.incubator.net.virtual.VirtualNetworkStore;
37import org.onosproject.incubator.net.virtual.event.VirtualListenerRegistryManager;
38import org.onosproject.incubator.net.virtual.impl.provider.VirtualProviderManager;
39import org.onosproject.incubator.net.virtual.provider.AbstractVirtualProvider;
40import org.onosproject.incubator.net.virtual.provider.VirtualMeterProvider;
41import org.onosproject.incubator.net.virtual.provider.VirtualMeterProviderService;
42import org.onosproject.incubator.net.virtual.provider.VirtualProviderRegistryService;
43import org.onosproject.incubator.store.virtual.impl.DistributedVirtualNetworkStore;
44import org.onosproject.incubator.store.virtual.impl.SimpleVirtualMeterStore;
45import org.onosproject.net.DeviceId;
46import org.onosproject.net.NetTestTools;
47import org.onosproject.net.intent.FakeIntentManager;
48import org.onosproject.net.intent.TestableIntentService;
49import org.onosproject.net.meter.Band;
50import org.onosproject.net.meter.DefaultBand;
51import org.onosproject.net.meter.DefaultMeter;
52import org.onosproject.net.meter.DefaultMeterFeatures;
53import org.onosproject.net.meter.DefaultMeterRequest;
54import org.onosproject.net.meter.Meter;
55import org.onosproject.net.meter.MeterFeaturesKey;
56import org.onosproject.net.meter.MeterId;
57import org.onosproject.net.meter.MeterOperation;
58import org.onosproject.net.meter.MeterOperations;
59import org.onosproject.net.meter.MeterRequest;
60import org.onosproject.net.meter.MeterState;
61import org.onosproject.net.provider.ProviderId;
62import org.onosproject.store.service.StorageService;
63import org.onosproject.store.service.TestStorageService;
64
65import java.util.Collections;
66import java.util.HashSet;
67import java.util.Map;
68
69import static org.hamcrest.Matchers.is;
70import static org.junit.Assert.*;
71
72/**
73 * Virtual Network meter manager tests.
74 */
75public class VirtualNetworkMeterManagerTest extends VirtualNetworkTestUtil {
76 private static final ProviderId PID = new ProviderId("of", "foo");
77 private static final NodeId NID_LOCAL = new NodeId("local");
78 private static final IpAddress LOCALHOST = IpAddress.valueOf("127.0.0.1");
79
80 private VirtualNetworkManager manager;
81 private DistributedVirtualNetworkStore virtualNetworkManagerStore;
82 private TestableIntentService intentService = new FakeIntentManager();
83 private ServiceDirectory testDirectory;
84 private VirtualProviderManager providerRegistryService;
85
86 private EventDeliveryService eventDeliveryService;
87 VirtualListenerRegistryManager listenerRegistryManager =
88 VirtualListenerRegistryManager.getInstance();
89
90 private VirtualNetwork vnet1;
91 private VirtualNetwork vnet2;
92
93 private SimpleVirtualMeterStore meterStore;
94
95 private VirtualNetworkMeterManager meterManager1;
96 private VirtualNetworkMeterManager meterManager2;
97
98 private TestProvider provider = new TestProvider();
99 private VirtualMeterProviderService providerService1;
100 private VirtualMeterProviderService providerService2;
101
102 private ApplicationId appId;
103
104 private Meter m1;
105 private Meter m2;
106 private MeterRequest.Builder m1Request;
107 private MeterRequest.Builder m2Request;
108
109 private Map<MeterId, Meter> meters = Maps.newHashMap();
110
111 @Before
112 public void setUp() throws Exception {
113 virtualNetworkManagerStore = new DistributedVirtualNetworkStore();
114 CoreService coreService = new TestCoreService();
115 TestStorageService storageService = new TestStorageService();
116 TestUtils.setField(virtualNetworkManagerStore, "coreService", coreService);
117 TestUtils.setField(virtualNetworkManagerStore, "storageService", storageService);
118 virtualNetworkManagerStore.activate();
119
120 meterStore = new SimpleVirtualMeterStore();
121
122 providerRegistryService = new VirtualProviderManager();
123 providerRegistryService.registerProvider(provider);
124
125 manager = new VirtualNetworkManager();
126 manager.store = virtualNetworkManagerStore;
127 TestUtils.setField(manager, "coreService", coreService);
128
129 eventDeliveryService = new TestEventDispatcher();
130 NetTestTools.injectEventDispatcher(manager, eventDeliveryService);
131// eventDeliveryService.addSink(VirtualEvent.class, listenerRegistryManager);
132
133 appId = new TestApplicationId("MeterManagerTest");
134
135 testDirectory = new TestServiceDirectory()
136 .add(VirtualNetworkStore.class, virtualNetworkManagerStore)
137 .add(CoreService.class, coreService)
138 .add(VirtualProviderRegistryService.class, providerRegistryService)
139 .add(EventDeliveryService.class, eventDeliveryService)
140 .add(StorageService.class, storageService)
141 .add(VirtualNetworkMeterStore.class, meterStore);
142 TestUtils.setField(manager, "serviceDirectory", testDirectory);
143
144 manager.activate();
145
146 vnet1 = setupVirtualNetworkTopology(manager, TID1);
147 vnet2 = setupVirtualNetworkTopology(manager, TID2);
148
149 meterManager1 = new VirtualNetworkMeterManager(manager, vnet1.id());
150 meterManager2 = new VirtualNetworkMeterManager(manager, vnet2.id());
151
152 providerService1 = (VirtualMeterProviderService)
153 providerRegistryService.getProviderService(vnet1.id(), VirtualMeterProvider.class);
154 providerService2 = (VirtualMeterProviderService)
155 providerRegistryService.getProviderService(vnet2.id(), VirtualMeterProvider.class);
156
157 assertTrue("provider should be registered",
158 providerRegistryService.getProviders().contains(provider.id()));
159
160 setupMeterTestVariables();
161 }
162
163 @After
164 public void tearDown() {
165 providerRegistryService.unregisterProvider(provider);
166 assertFalse("provider should not be registered",
167 providerRegistryService.getProviders().contains(provider.id()));
168
169 manager.deactivate();
170 NetTestTools.injectEventDispatcher(manager, null);
171
172 virtualNetworkManagerStore.deactivate();
173 }
174
175 /** Test for meter submit(). */
176 @Test
177 public void testAddition() {
178 meterManager1.submit(m1Request.add());
179
180 assertTrue("The meter was not added",
181 meterManager1.getAllMeters().size() == 1);
182 assertThat(meterManager1.getMeter(VDID1, MeterId.meterId(1)), is(m1));
183
184 assertTrue("The meter shouldn't be added for vnet2",
185 meterManager2.getAllMeters().size() == 0);
186 }
187
188 /** Test for meter remove(). */
189 @Test
190 public void testRemove() {
191 meterManager1.submit(m1Request.add());
192 meterManager1.withdraw(m1Request.remove(), m1.id());
193
194 assertThat(meterManager1.getMeter(VDID1, MeterId.meterId(1)).state(),
195 is(MeterState.PENDING_REMOVE));
196
197 providerService1.pushMeterMetrics(m1.deviceId(), Collections.emptyList());
198
199 assertTrue("The meter was not removed", meterManager1.getAllMeters().size() == 0);
200 assertTrue("The meter shouldn't be added for vnet2",
201 meterManager2.getAllMeters().size() == 0);
202 }
203
204 /** Test for meter submit with multiple devices. */
205 @Test
206 public void testMultipleDevice() {
207 meterManager1.submit(m1Request.add());
208 meterManager1.submit(m2Request.add());
209
210 assertTrue("The meters were not added",
211 meterManager1.getAllMeters().size() == 2);
212 assertTrue("The meter shouldn't be added for vnet2",
213 meterManager2.getAllMeters().size() == 0);
214
215 assertThat(meterManager1.getMeter(VDID1, MeterId.meterId(1)), is(m1));
216 assertThat(meterManager1.getMeter(VDID2, MeterId.meterId(1)), is(m2));
217 }
218
219 /** Test for meter features inside store. */
220 @Test
221 public void testMeterFeatures() {
222 //Test for virtual network 1
223 assertEquals(meterStore.getMaxMeters(vnet1.id(),
224 MeterFeaturesKey.key(VDID1)), 255L);
225 assertEquals(meterStore.getMaxMeters(vnet1.id(),
226 MeterFeaturesKey.key(VDID2)), 2);
227 //Test for virtual network 2
228 assertEquals(meterStore.getMaxMeters(vnet2.id(),
229 MeterFeaturesKey.key(VDID1)), 100);
230 assertEquals(meterStore.getMaxMeters(vnet2.id(),
231 MeterFeaturesKey.key(VDID2)), 10);
232 }
233
234 /** Set variables such as meters and request required for testing. */
235 private void setupMeterTestVariables() {
236 Band band = DefaultBand.builder()
237 .ofType(Band.Type.DROP)
238 .withRate(500)
239 .build();
240
241 m1 = DefaultMeter.builder()
242 .forDevice(VDID1)
243 .fromApp(appId)
244 .withId(MeterId.meterId(1))
245 .withUnit(Meter.Unit.KB_PER_SEC)
246 .withBands(Collections.singletonList(band))
247 .build();
248
249 m2 = DefaultMeter.builder()
250 .forDevice(VDID2)
251 .fromApp(appId)
252 .withId(MeterId.meterId(1))
253 .withUnit(Meter.Unit.KB_PER_SEC)
254 .withBands(Collections.singletonList(band))
255 .build();
256
257 m1Request = DefaultMeterRequest.builder()
258 .forDevice(VDID1)
259 .fromApp(appId)
260 .withUnit(Meter.Unit.KB_PER_SEC)
261 .withBands(Collections.singletonList(band));
262
263 m2Request = DefaultMeterRequest.builder()
264 .forDevice(VDID2)
265 .fromApp(appId)
266 .withUnit(Meter.Unit.KB_PER_SEC)
267 .withBands(Collections.singletonList(band));
268
269 meterStore.storeMeterFeatures(vnet1.id(),
270 DefaultMeterFeatures.builder().forDevice(VDID1)
271 .withMaxMeters(255L)
272 .withBandTypes(new HashSet<>())
273 .withUnits(new HashSet<>())
274 .hasStats(false)
275 .hasBurst(false)
276 .withMaxBands((byte) 0)
277 .withMaxColors((byte) 0)
278 .build());
279 meterStore.storeMeterFeatures(vnet1.id(),
280 DefaultMeterFeatures.builder().forDevice(VDID2)
281 .withMaxMeters(2)
282 .withBandTypes(new HashSet<>())
283 .withUnits(new HashSet<>())
284 .hasBurst(false)
285 .hasStats(false)
286 .withMaxBands((byte) 0)
287 .withMaxColors((byte) 0)
288 .build());
289
290 meterStore.storeMeterFeatures(vnet2.id(),
291 DefaultMeterFeatures.builder().forDevice(VDID1)
292 .withMaxMeters(100L)
293 .withBandTypes(new HashSet<>())
294 .withUnits(new HashSet<>())
295 .hasStats(false)
296 .hasBurst(false)
297 .withMaxBands((byte) 0)
298 .withMaxColors((byte) 0)
299 .build());
300 meterStore.storeMeterFeatures(vnet2.id(),
301 DefaultMeterFeatures.builder().forDevice(VDID2)
302 .withMaxMeters(10)
303 .withBandTypes(new HashSet<>())
304 .withUnits(new HashSet<>())
305 .hasBurst(false)
306 .hasStats(false)
307 .withMaxBands((byte) 0)
308 .withMaxColors((byte) 0)
309 .build());
310 }
311
312 private class TestProvider
313 extends AbstractVirtualProvider
314 implements VirtualMeterProvider {
315
316 protected TestProvider() {
317 super(PID);
318 }
319
320 @Override
321 public void performMeterOperation(NetworkId networkId, DeviceId deviceId,
322 MeterOperations meterOps) {
323
324 }
325
326 @Override
327 public void performMeterOperation(NetworkId networkId, DeviceId deviceId,
328 MeterOperation meterOp) {
329 meters.put(meterOp.meter().id(), meterOp.meter());
330 }
331 }
332}