blob: 030b9e6effd4adc4db62c3f9bd91efec2e2775e5 [file] [log] [blame]
alshabibe1248b62015-08-20 17:21:55 -07001/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2015-present Open Networking Foundation
alshabibe1248b62015-08-20 17:21:55 -07003 *
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 */
Ray Milkeyebdd4852017-10-18 16:19:28 -070016package org.onosproject.net.meter.impl;
alshabibe1248b62015-08-20 17:21:55 -070017
Andrea Campanellae3708782017-10-16 16:00:21 +020018import com.google.common.collect.ImmutableList;
19import com.google.common.collect.ImmutableMap;
Charles Chan593acf92017-11-22 13:55:41 -080020import com.google.common.collect.Lists;
alshabibe1248b62015-08-20 17:21:55 -070021import com.google.common.collect.Sets;
22import org.junit.After;
23import org.junit.Before;
24import org.junit.Test;
Andrea Campanellae3708782017-10-16 16:00:21 +020025import org.onlab.junit.TestTools;
alshabibe1248b62015-08-20 17:21:55 -070026import org.onlab.junit.TestUtils;
27import org.onlab.packet.IpAddress;
Charles Chan593acf92017-11-22 13:55:41 -080028import org.onlab.util.KryoNamespace;
29import org.onosproject.TestApplicationId;
Andrea Campanellae3708782017-10-16 16:00:21 +020030import org.onosproject.cfg.ComponentConfigAdapter;
alshabibe1248b62015-08-20 17:21:55 -070031import org.onosproject.cluster.ClusterServiceAdapter;
32import org.onosproject.cluster.ControllerNode;
33import org.onosproject.cluster.DefaultControllerNode;
34import org.onosproject.cluster.NodeId;
35import org.onosproject.common.event.impl.TestEventDispatcher;
alshabibe1248b62015-08-20 17:21:55 -070036import org.onosproject.mastership.MastershipServiceAdapter;
Andrea Campanellae3708782017-10-16 16:00:21 +020037import org.onosproject.net.AnnotationKeys;
38import org.onosproject.net.DefaultAnnotations;
39import org.onosproject.net.DefaultDevice;
40import org.onosproject.net.Device;
alshabibe1248b62015-08-20 17:21:55 -070041import org.onosproject.net.DeviceId;
Andrea Campanellae3708782017-10-16 16:00:21 +020042import org.onosproject.net.MastershipRole;
43import org.onosproject.net.behaviour.MeterQuery;
Thomas Vachuska164ecf62018-05-08 17:29:55 -070044import org.onosproject.net.config.NetworkConfigService;
45import org.onosproject.net.config.NetworkConfigServiceAdapter;
Andrea Campanellae3708782017-10-16 16:00:21 +020046import org.onosproject.net.device.DeviceService;
47import org.onosproject.net.device.DeviceServiceAdapter;
48import org.onosproject.net.driver.AbstractHandlerBehaviour;
49import org.onosproject.net.driver.DefaultDriver;
50import org.onosproject.net.driver.DriverRegistry;
51import org.onosproject.net.driver.impl.DriverManager;
52import org.onosproject.net.driver.impl.DriverRegistryManager;
alshabibe1248b62015-08-20 17:21:55 -070053import org.onosproject.net.meter.Band;
54import org.onosproject.net.meter.DefaultBand;
55import org.onosproject.net.meter.DefaultMeter;
Jordi Ortizaa8de492016-12-01 00:21:36 +010056import org.onosproject.net.meter.DefaultMeterFeatures;
alshabibe1248b62015-08-20 17:21:55 -070057import org.onosproject.net.meter.DefaultMeterRequest;
58import org.onosproject.net.meter.Meter;
Pier Luigif094c612017-10-14 12:15:02 +020059import org.onosproject.net.meter.MeterFeatures;
alshabibe1248b62015-08-20 17:21:55 -070060import org.onosproject.net.meter.MeterId;
61import org.onosproject.net.meter.MeterOperation;
62import org.onosproject.net.meter.MeterOperations;
Andrea Campanellae3708782017-10-16 16:00:21 +020063import org.onosproject.net.meter.MeterProgrammable;
alshabibe1248b62015-08-20 17:21:55 -070064import org.onosproject.net.meter.MeterProvider;
65import org.onosproject.net.meter.MeterProviderRegistry;
66import org.onosproject.net.meter.MeterProviderService;
67import org.onosproject.net.meter.MeterRequest;
Andrea Campanellae3708782017-10-16 16:00:21 +020068import org.onosproject.net.meter.MeterService;
alshabibe1248b62015-08-20 17:21:55 -070069import org.onosproject.net.meter.MeterState;
Carmelo Cascone0761cd32018-08-29 19:22:50 -070070import org.onosproject.net.pi.PiPipeconfServiceAdapter;
alshabibe1248b62015-08-20 17:21:55 -070071import org.onosproject.net.provider.AbstractProvider;
72import org.onosproject.net.provider.ProviderId;
Thomas Vachuska52f2cd12018-11-08 21:20:04 -080073import org.onosproject.store.meter.impl.DistributedMeterStore;
Charles Chan593acf92017-11-22 13:55:41 -080074import org.onosproject.store.service.Serializer;
alshabibe1248b62015-08-20 17:21:55 -070075import org.onosproject.store.service.TestStorageService;
76
Andrea Campanellae3708782017-10-16 16:00:21 +020077import java.util.ArrayList;
78import java.util.Collection;
Carmelo Cascone0761cd32018-08-29 19:22:50 -070079import java.util.Collections;
80import java.util.HashSet;
Andrea Campanellae3708782017-10-16 16:00:21 +020081import java.util.List;
alshabibe1248b62015-08-20 17:21:55 -070082import java.util.Set;
Andrea Campanellae3708782017-10-16 16:00:21 +020083import java.util.concurrent.CompletableFuture;
alshabibe1248b62015-08-20 17:21:55 -070084
85import static org.hamcrest.Matchers.is;
Carmelo Cascone0761cd32018-08-29 19:22:50 -070086import static org.junit.Assert.assertEquals;
87import static org.junit.Assert.assertFalse;
88import static org.junit.Assert.assertNull;
89import static org.junit.Assert.assertThat;
90import static org.junit.Assert.assertTrue;
alshabibe1248b62015-08-20 17:21:55 -070091import static org.onosproject.net.NetTestTools.APP_ID;
92import static org.onosproject.net.NetTestTools.did;
93import static org.onosproject.net.NetTestTools.injectEventDispatcher;
94
95/**
96 * Meter manager tests.
97 */
98public class MeterManagerTest {
99
Pier Luigif094c612017-10-14 12:15:02 +0200100 // Test node id
alshabibe1248b62015-08-20 17:21:55 -0700101 private static final NodeId NID_LOCAL = new NodeId("local");
Pier Luigif094c612017-10-14 12:15:02 +0200102
103 // Test ip address
alshabibe1248b62015-08-20 17:21:55 -0700104 private static final IpAddress LOCALHOST = IpAddress.valueOf("127.0.0.1");
105
Pier Luigif094c612017-10-14 12:15:02 +0200106 private static final ProviderId PID = new ProviderId("of", "foo");
alshabibe1248b62015-08-20 17:21:55 -0700107
Andrea Campanellae3708782017-10-16 16:00:21 +0200108 private static final ProviderId PROGRAMMABLE_PROVIDER = new ProviderId("foo", "foo");
109 private static final DeviceId PROGRAMMABLE_DID = DeviceId.deviceId("test:002");
110
111 private static final DefaultAnnotations ANNOTATIONS =
112 DefaultAnnotations.builder().set(AnnotationKeys.DRIVER, "foo").build();
113
114 private static final Device PROGRAMMABLE_DEV =
115 new DefaultDevice(PROGRAMMABLE_PROVIDER, PROGRAMMABLE_DID, Device.Type.SWITCH,
116 "", "", "", "", null, ANNOTATIONS);
117
118
119 private MeterService service;
120
121 // Test Driver service used during the tests
122 private DriverManager driverService;
123
124 // Test device service used during the tests
125 private DeviceService deviceService;
126
Pier Luigif094c612017-10-14 12:15:02 +0200127 // Test provider used during the tests
alshabibe1248b62015-08-20 17:21:55 -0700128 private TestProvider provider;
129
Pier Luigif094c612017-10-14 12:15:02 +0200130 // Meter manager
131 private MeterManager manager;
alshabibe1248b62015-08-20 17:21:55 -0700132
Pier Luigif094c612017-10-14 12:15:02 +0200133 // Meter provider registry
134 private MeterProviderRegistry registry;
alshabibe1248b62015-08-20 17:21:55 -0700135
Pier Luigif094c612017-10-14 12:15:02 +0200136 // Meter provider service
137 private MeterProviderService providerService;
alshabibe1248b62015-08-20 17:21:55 -0700138
Pier Luigif094c612017-10-14 12:15:02 +0200139 // Store under testing
140 private DistributedMeterStore meterStore;
141
142 // Device ids used during the tests
143 private DeviceId did1 = did("1");
144 private DeviceId did2 = did("2");
145
146 // Meter ids used during the tests
147 private MeterId mid1 = MeterId.meterId(1);
148
149 // Bands used during the tests
Andrea Campanellae3708782017-10-16 16:00:21 +0200150 private static Band b1 = DefaultBand.builder()
Pier Luigif094c612017-10-14 12:15:02 +0200151 .ofType(Band.Type.DROP)
152 .withRate(500)
153 .build();
154
155 // Meters used during the tests
156 private Meter m1 = DefaultMeter.builder()
157 .forDevice(did1)
158 .fromApp(APP_ID)
159 .withId(mid1)
160 .withUnit(Meter.Unit.KB_PER_SEC)
161 .withBands(Collections.singletonList(b1))
162 .build();
163 private Meter m2 = DefaultMeter.builder()
164 .forDevice(did2)
165 .fromApp(APP_ID)
166 .withId(mid1)
167 .withUnit(Meter.Unit.KB_PER_SEC)
168 .withBands(Collections.singletonList(b1))
169 .build();
170
Andrea Campanellae3708782017-10-16 16:00:21 +0200171 private static Meter mProgrammable = DefaultMeter.builder()
172 .forDevice(PROGRAMMABLE_DID)
173 .fromApp(APP_ID)
174 .withId(MeterId.meterId(1))
175 .withUnit(Meter.Unit.KB_PER_SEC)
176 .withBands(Collections.singletonList(b1))
177 .build();
178
Pier Luigif094c612017-10-14 12:15:02 +0200179 // Meter requests used during the tests
180 private MeterRequest.Builder m1Request = DefaultMeterRequest.builder()
181 .forDevice(did1)
182 .fromApp(APP_ID)
183 .withUnit(Meter.Unit.KB_PER_SEC)
184 .withBands(Collections.singletonList(b1));
185 private MeterRequest.Builder m2Request = DefaultMeterRequest.builder()
186 .forDevice(did2)
187 .fromApp(APP_ID)
188 .withUnit(Meter.Unit.KB_PER_SEC)
189 .withBands(Collections.singletonList(b1));
190
Andrea Campanellae3708782017-10-16 16:00:21 +0200191 private MeterRequest.Builder mProgrammableRequest = DefaultMeterRequest.builder()
192 .forDevice(PROGRAMMABLE_DID)
193 .fromApp(APP_ID)
194 .withUnit(Meter.Unit.KB_PER_SEC)
195 .withBands(Collections.singletonList(b1));
196
Pier Luigif094c612017-10-14 12:15:02 +0200197 // Meter features used during the tests
198 private MeterFeatures mef1 = DefaultMeterFeatures.builder().forDevice(did1)
199 .withMaxMeters(3L)
200 .withBandTypes(new HashSet<>())
201 .withUnits(new HashSet<>())
202 .hasStats(false)
203 .hasBurst(false)
204 .withMaxBands((byte) 0)
205 .withMaxColors((byte) 0)
206 .build();
207 private MeterFeatures mef2 = DefaultMeterFeatures.builder().forDevice(did2)
208 .withMaxMeters(10L)
209 .withBandTypes(new HashSet<>())
210 .withUnits(new HashSet<>())
211 .hasStats(false)
212 .hasBurst(false)
213 .withMaxBands((byte) 0)
214 .withMaxColors((byte) 0)
215 .build();
alshabibe1248b62015-08-20 17:21:55 -0700216
Andrea Campanellae3708782017-10-16 16:00:21 +0200217
alshabibe1248b62015-08-20 17:21:55 -0700218 @Before
Pier Luigif094c612017-10-14 12:15:02 +0200219 public void setup() {
Andrea Campanellae3708782017-10-16 16:00:21 +0200220 //Init step for the deviceService
221 deviceService = new TestDeviceService();
222 //Init step for the driver registry and driver service.
223 DriverRegistryManager driverRegistry = new DriverRegistryManager();
Thomas Vachuska164ecf62018-05-08 17:29:55 -0700224 driverService = new TestDriverManager(driverRegistry, deviceService, new NetworkConfigServiceAdapter());
Andrea Campanellae3708782017-10-16 16:00:21 +0200225 driverRegistry.addDriver(new DefaultDriver("foo", ImmutableList.of(), "",
226 "", "",
227 ImmutableMap.of(MeterProgrammable.class,
228 TestMeterProgrammable.class, MeterQuery.class, TestMeterQuery.class),
229 ImmutableMap.of()));
230
Pier Luigif094c612017-10-14 12:15:02 +0200231 // Init step for the store
alshabibe1248b62015-08-20 17:21:55 -0700232 meterStore = new DistributedMeterStore();
Pier Luigif094c612017-10-14 12:15:02 +0200233 // Let's initialize some internal services of the store
alshabibe1248b62015-08-20 17:21:55 -0700234 TestUtils.setField(meterStore, "storageService", new TestStorageService());
235 TestUtils.setField(meterStore, "clusterService", new TestClusterService());
236 TestUtils.setField(meterStore, "mastershipService", new TestMastershipService());
Andrea Campanellae3708782017-10-16 16:00:21 +0200237 TestUtils.setField(meterStore, "driverService", driverService);
Charles Chan593acf92017-11-22 13:55:41 -0800238
239 // Inject TestApplicationId into the DistributedMeterStore serializer
240 KryoNamespace.Builder testKryoBuilder = TestUtils.getField(meterStore, "APP_KRYO_BUILDER");
241 testKryoBuilder.register(TestApplicationId.class);
242 Serializer testSerializer = Serializer.using(Lists.newArrayList(testKryoBuilder.build()));
243 TestUtils.setField(meterStore, "serializer", testSerializer);
244
Pier Luigif094c612017-10-14 12:15:02 +0200245 // Activate the store
alshabibe1248b62015-08-20 17:21:55 -0700246 meterStore.activate();
Pier Luigif094c612017-10-14 12:15:02 +0200247 // Init step for the manager
alshabibe1248b62015-08-20 17:21:55 -0700248 manager = new MeterManager();
Pier Luigif094c612017-10-14 12:15:02 +0200249 // Let's initialize some internal services of the manager
250 TestUtils.setField(manager, "store", meterStore);
alshabibe1248b62015-08-20 17:21:55 -0700251 injectEventDispatcher(manager, new TestEventDispatcher());
Andrea Campanellae3708782017-10-16 16:00:21 +0200252 manager.deviceService = deviceService;
253 manager.mastershipService = new TestMastershipService();
254 manager.cfgService = new ComponentConfigAdapter();
255 TestUtils.setField(manager, "storageService", new TestStorageService());
Pier Luigif094c612017-10-14 12:15:02 +0200256 // Init the reference of the registry
alshabibe1248b62015-08-20 17:21:55 -0700257 registry = manager;
Andrea Campanellae3708782017-10-16 16:00:21 +0200258
259 manager.driverService = driverService;
260
Pier Luigif094c612017-10-14 12:15:02 +0200261 // Activate the manager
Andrea Campanellae3708782017-10-16 16:00:21 +0200262 manager.activate(null);
Pier Luigif094c612017-10-14 12:15:02 +0200263 // Initialize the test provider
Andrea Campanellae3708782017-10-16 16:00:21 +0200264
alshabibe1248b62015-08-20 17:21:55 -0700265 provider = new TestProvider(PID);
Pier Luigif094c612017-10-14 12:15:02 +0200266 // Register the provider against the manager
alshabibe1248b62015-08-20 17:21:55 -0700267 providerService = registry.register(provider);
Pier Luigif094c612017-10-14 12:15:02 +0200268 // Verify register
alshabibe1248b62015-08-20 17:21:55 -0700269 assertTrue("provider should be registered",
270 registry.getProviders().contains(provider.id()));
alshabibe1248b62015-08-20 17:21:55 -0700271 }
272
273 @After
274 public void tearDown() {
Pier Luigif094c612017-10-14 12:15:02 +0200275 // Unregister provider
alshabibe1248b62015-08-20 17:21:55 -0700276 registry.unregister(provider);
Pier Luigif094c612017-10-14 12:15:02 +0200277 // Verify unregister
alshabibe1248b62015-08-20 17:21:55 -0700278 assertFalse("provider should not be registered",
279 registry.getProviders().contains(provider.id()));
Pier Luigif094c612017-10-14 12:15:02 +0200280 // Deactivate manager
alshabibe1248b62015-08-20 17:21:55 -0700281 manager.deactivate();
Pier Luigif094c612017-10-14 12:15:02 +0200282 // Remove event dispatcher
alshabibe1248b62015-08-20 17:21:55 -0700283 injectEventDispatcher(manager, null);
Pier Luigif094c612017-10-14 12:15:02 +0200284 // Deactivate store
285 meterStore.deactivate();
alshabibe1248b62015-08-20 17:21:55 -0700286 }
287
Pier Luigif094c612017-10-14 12:15:02 +0200288 private void initMeterStore() {
289 // Let's store feature for device 1
290 meterStore.storeMeterFeatures(mef1);
291 // Let's store feature for device 2
292 meterStore.storeMeterFeatures(mef2);
293 }
294
295 // Emulate metrics coming from the dataplane
296 private void pushMetrics(MeterOperation.Type type, Meter meter) {
297 // If it is an add operation
298 if (type == MeterOperation.Type.ADD) {
299 // Update state to added
300 ((DefaultMeter) meter).setState(MeterState.ADDED);
301 // Push the update in the store
302 providerService.pushMeterMetrics(meter.deviceId(), Collections.singletonList(meter));
303 } else {
304 providerService.pushMeterMetrics(meter.deviceId(), Collections.emptyList());
305 }
306 }
307
308 /**
309 * Test add meter.
310 */
alshabibe1248b62015-08-20 17:21:55 -0700311 @Test
Pier Luigif094c612017-10-14 12:15:02 +0200312 public void testAdd() {
313 // Init store
314 initMeterStore();
315 // Submit meter request
alshabibe1248b62015-08-20 17:21:55 -0700316 manager.submit(m1Request.add());
Pier Luigif094c612017-10-14 12:15:02 +0200317 // Verify add
alshabibe1248b62015-08-20 17:21:55 -0700318 assertTrue("The meter was not added", manager.getAllMeters().size() == 1);
Pier Luigif094c612017-10-14 12:15:02 +0200319 assertTrue("The meter was not added", manager.getMeters(did1).size() == 1);
320 // Get Meter
321 Meter installingMeter = manager.getMeter(did1, mid1);
322 // Verify add of installingMeter and pending add state
323 assertThat(installingMeter, is(m1));
324 // Verify pending add state
325 assertThat(installingMeter.state(), is(MeterState.PENDING_ADD));
326 // Let's simulate a working data-plane
327 pushMetrics(MeterOperation.Type.ADD, installingMeter);
328 // Get meter
329 Meter installedMeter = manager.getMeter(did1, mid1);
330 // Verify installation
331 assertThat(installedMeter.state(), is(MeterState.ADDED));
332 assertTrue("The meter was not installed", manager.getAllMeters().size() == 1);
333 assertTrue("The meter was not installed", manager.getMeters(did1).size() == 1);
alshabibe1248b62015-08-20 17:21:55 -0700334 }
335
Pier Luigif094c612017-10-14 12:15:02 +0200336 /**
337 * Test remove meter.
338 */
alshabibe1248b62015-08-20 17:21:55 -0700339 @Test
340 public void testRemove() {
Pier Luigif094c612017-10-14 12:15:02 +0200341 // Init store
342 initMeterStore();
343 // Submit meter request
alshabibe1248b62015-08-20 17:21:55 -0700344 manager.submit(m1Request.add());
Pier Luigif094c612017-10-14 12:15:02 +0200345 // Withdraw meter
alshabibe1248b62015-08-20 17:21:55 -0700346 manager.withdraw(m1Request.remove(), m1.id());
Pier Luigif094c612017-10-14 12:15:02 +0200347 // Get Meter
348 Meter withdrawingMeter = manager.getMeter(did1, mid1);
349 // Verify withdrawing
350 assertThat(withdrawingMeter.state(), is(MeterState.PENDING_REMOVE));
351 assertTrue("The meter was not withdrawn", manager.getAllMeters().size() == 1);
352 assertTrue("The meter was not withdrawn", manager.getMeters(did1).size() == 1);
353 // Let's simulate a working data-plane
354 pushMetrics(MeterOperation.Type.REMOVE, withdrawingMeter);
355 // Verify withdrawn
356 assertNull(manager.getMeter(did1, mid1));
alshabibe1248b62015-08-20 17:21:55 -0700357 assertTrue("The meter was not removed", manager.getAllMeters().size() == 0);
Pier Luigif094c612017-10-14 12:15:02 +0200358 assertTrue("The meter was not removed", manager.getMeters(did1).size() == 0);
alshabibe1248b62015-08-20 17:21:55 -0700359 }
360
Pier Luigif094c612017-10-14 12:15:02 +0200361 /**
362 * Test add multiple device.
363 */
alshabib70aaa1b2015-09-25 14:30:59 -0700364 @Test
Pier Luigif094c612017-10-14 12:15:02 +0200365 public void testAddMultipleDevice() {
366 // Init store
367 initMeterStore();
368 // Submit meter 1
alshabib70aaa1b2015-09-25 14:30:59 -0700369 manager.submit(m1Request.add());
Pier Luigif094c612017-10-14 12:15:02 +0200370 // Submit meter 2
alshabib70aaa1b2015-09-25 14:30:59 -0700371 manager.submit(m2Request.add());
Pier Luigif094c612017-10-14 12:15:02 +0200372 // Verify add
373 assertTrue("The meter was not added", manager.getAllMeters().size() == 2);
374 assertTrue("The meter was not added", manager.getMeters(did1).size() == 1);
375 assertTrue("The meter was not added", manager.getMeters(did2).size() == 1);
376 // Get Meters
377 Meter installingMeter1 = manager.getMeter(did1, mid1);
378 Meter installingMeter2 = manager.getMeter(did2, mid1);
379 // Verify add of installingMeter
380 assertThat(installingMeter1, is(m1));
381 assertThat(installingMeter2, is(m2));
382 // Verify pending add state
383 assertThat(installingMeter1.state(), is(MeterState.PENDING_ADD));
384 assertThat(installingMeter2.state(), is(MeterState.PENDING_ADD));
385 // Let's simulate a working data-plane
386 pushMetrics(MeterOperation.Type.ADD, installingMeter1);
387 pushMetrics(MeterOperation.Type.ADD, installingMeter2);
388 // Get meter
389 Meter installedMeter1 = manager.getMeter(did1, mid1);
390 Meter installedMeter2 = manager.getMeter(did2, mid1);
391 // Verify installation
392 assertThat(installedMeter1.state(), is(MeterState.ADDED));
393 assertThat(installedMeter2.state(), is(MeterState.ADDED));
394 assertTrue("The meter was not installed", manager.getAllMeters().size() == 2);
395 assertTrue("The meter was not installed", manager.getMeters(did1).size() == 1);
396 assertTrue("The meter was not installed", manager.getMeters(did2).size() == 1);
alshabib70aaa1b2015-09-25 14:30:59 -0700397 }
alshabibe1248b62015-08-20 17:21:55 -0700398
Pier Luigif094c612017-10-14 12:15:02 +0200399 /**
400 * Test remove meter.
401 */
Jordi Ortizaa8de492016-12-01 00:21:36 +0100402 @Test
Pier Luigif094c612017-10-14 12:15:02 +0200403 public void testRemoveMultipleDevice() {
404 // Init store
405 initMeterStore();
406 // Submit meter 1
Jordi Ortiz6c847762017-01-30 17:13:05 +0100407 manager.submit(m1Request.add());
Pier Luigif094c612017-10-14 12:15:02 +0200408 // Submit meter 2
409 manager.submit(m2Request.add());
410 // Withdraw meter
411 manager.withdraw(m1Request.remove(), m1.id());
412 // Withdraw meter
413 manager.withdraw(m2Request.remove(), m2.id());
414 // Get Meters
415 Meter withdrawingMeter1 = manager.getMeter(did1, mid1);
416 Meter withdrawingMeter2 = manager.getMeter(did2, mid1);
417 // Verify withdrawing
418 assertThat(withdrawingMeter1.state(), is(MeterState.PENDING_REMOVE));
419 assertThat(withdrawingMeter2.state(), is(MeterState.PENDING_REMOVE));
420 assertTrue("The meter was not withdrawn", manager.getAllMeters().size() == 2);
421 assertTrue("The meter was not withdrawn", manager.getMeters(did1).size() == 1);
422 assertTrue("The meter was not withdrawn", manager.getMeters(did2).size() == 1);
423 // Let's simulate a working data-plane
424 pushMetrics(MeterOperation.Type.REMOVE, withdrawingMeter1);
425 pushMetrics(MeterOperation.Type.REMOVE, withdrawingMeter2);
426 // Verify withdrawn
427 assertNull(manager.getMeter(did1, mid1));
428 assertNull(manager.getMeter(did2, mid1));
429 assertTrue("The meter was not removed", manager.getAllMeters().size() == 0);
430 assertTrue("The meter was not removed", manager.getMeters(did1).size() == 0);
431 assertTrue("The meter was not removed", manager.getMeters(did2).size() == 0);
Jordi Ortiz6c847762017-01-30 17:13:05 +0100432 }
433
Andrea Campanellae3708782017-10-16 16:00:21 +0200434 @Test
435 public void testAddFromMeterProgrammable() {
436
437 // Init store
438 initMeterStore();
439
440 manager.submit(mProgrammableRequest.add());
441
442 TestTools.assertAfter(500, () -> {
443
444 assertTrue("The meter was not added", manager.getAllMeters().size() == 1);
445
446 assertThat(manager.getMeter(PROGRAMMABLE_DID, MeterId.meterId(1)), is(mProgrammable));
447 });
448
449 }
450
451 @Test
452 public void testAddBatchFromMeterProgrammable() {
453
454 // Init store
455 initMeterStore();
456
457 List<MeterOperation> operations = ImmutableList.of(new MeterOperation(mProgrammable, MeterOperation.Type.ADD));
458 manager.defaultProvider().performMeterOperation(PROGRAMMABLE_DID, new MeterOperations(operations));
459
460 TestTools.assertAfter(500, () -> {
461
462 assertTrue("The meter was not added", meterOperations.size() == 1);
463
464 assertTrue("Wrong Meter Operation", meterOperations.get(0).meter().id().equals(mProgrammable.id()));
465 });
466
467 }
468
469 @Test
470 public void testGetFromMeterProgrammable() {
471
472 // Init store
473 initMeterStore();
474
475 MeterDriverProvider fallback = (MeterDriverProvider) manager.defaultProvider();
476
477 testAddFromMeterProgrammable();
478
479 fallback.init(manager.deviceService, fallback.meterProviderService, manager.mastershipService, 1);
480
481 TestTools.assertAfter(2000, () -> {
482 assertTrue("The meter was not added", manager.getAllMeters().size() == 1);
483 Meter m = manager.getMeters(PROGRAMMABLE_DID).iterator().next();
484 assertEquals("incorrect state", MeterState.ADDED, m.state());
485 });
486
487 }
488
Pier Luigif094c612017-10-14 12:15:02 +0200489 // Test cluster service
490 private final class TestClusterService extends ClusterServiceAdapter {
Jordi Ortizaa8de492016-12-01 00:21:36 +0100491
Pier Luigif094c612017-10-14 12:15:02 +0200492 private ControllerNode local = new DefaultControllerNode(NID_LOCAL, LOCALHOST);
Jordi Ortizaa8de492016-12-01 00:21:36 +0100493
Pier Luigif094c612017-10-14 12:15:02 +0200494 @Override
495 public ControllerNode getLocalNode() {
496 return local;
alshabibe1248b62015-08-20 17:21:55 -0700497 }
Pier Luigif094c612017-10-14 12:15:02 +0200498
499 @Override
500 public Set<ControllerNode> getNodes() {
501 return Sets.newHashSet();
502 }
503
alshabibe1248b62015-08-20 17:21:55 -0700504 }
505
Andrea Campanellae3708782017-10-16 16:00:21 +0200506 private static class TestDeviceService extends DeviceServiceAdapter {
507 @Override
508 public int getDeviceCount() {
509 return 1;
510 }
511
512 @Override
513 public Iterable<Device> getDevices() {
514 return ImmutableList.of(PROGRAMMABLE_DEV);
515 }
516
517 @Override
518 public Iterable<Device> getAvailableDevices() {
519 return getDevices();
520 }
521
522 @Override
523 public Device getDevice(DeviceId deviceId) {
524 return PROGRAMMABLE_DEV;
525 }
526 }
527
528 private class TestDriverManager extends DriverManager {
Thomas Vachuska164ecf62018-05-08 17:29:55 -0700529 TestDriverManager(DriverRegistry registry, DeviceService deviceService,
530 NetworkConfigService networkConfigService) {
Andrea Campanellae3708782017-10-16 16:00:21 +0200531 this.registry = registry;
532 this.deviceService = deviceService;
Thomas Vachuska164ecf62018-05-08 17:29:55 -0700533 this.networkConfigService = networkConfigService;
Carmelo Cascone0761cd32018-08-29 19:22:50 -0700534 this.pipeconfService = new PiPipeconfServiceAdapter();
Andrea Campanellae3708782017-10-16 16:00:21 +0200535 activate();
536 }
537 }
538
539 public static class TestMeterQuery extends AbstractHandlerBehaviour
540 implements MeterQuery {
541 private static final long MAX_METER = 0x00000FFF;
542
543 @Override
544 public long getMaxMeters() {
545 return MAX_METER;
546 }
547 }
548
549 private static List<MeterOperation> meterOperations = new ArrayList<>();
550
551 public static class TestMeterProgrammable extends AbstractHandlerBehaviour
552 implements MeterProgrammable {
553
554 @Override
555 public CompletableFuture<Boolean> performMeterOperation(MeterOperation meterOp) {
556 return CompletableFuture.completedFuture(meterOperations.add(meterOp));
557 }
558
559 @Override
560 public CompletableFuture<Collection<Meter>> getMeters() {
561 //ADD METER
562 DefaultMeter mProgrammableAdded = (DefaultMeter) mProgrammable;
563 mProgrammableAdded.setState(MeterState.ADDED);
564 return CompletableFuture.completedFuture(ImmutableList.of(mProgrammableAdded));
565 }
566 }
567
alshabibe1248b62015-08-20 17:21:55 -0700568 private class TestProvider extends AbstractProvider implements MeterProvider {
569
570 protected TestProvider(ProviderId id) {
571 super(PID);
572 }
573
574 @Override
575 public void performMeterOperation(DeviceId deviceId, MeterOperations meterOps) {
576 //Currently unused.
577 }
578
579 @Override
580 public void performMeterOperation(DeviceId deviceId, MeterOperation meterOp) {
Pier Luigif094c612017-10-14 12:15:02 +0200581 //Currently unused
alshabibe1248b62015-08-20 17:21:55 -0700582 }
583 }
584
Pier Luigif094c612017-10-14 12:15:02 +0200585 // Test mastership service
586 private final class TestMastershipService extends MastershipServiceAdapter {
alshabibe1248b62015-08-20 17:21:55 -0700587 @Override
588 public NodeId getMasterFor(DeviceId deviceId) {
589 return NID_LOCAL;
590 }
Andrea Campanellae3708782017-10-16 16:00:21 +0200591
592 @Override
593 public MastershipRole getLocalRole(DeviceId deviceId) {
594 return MastershipRole.MASTER;
595 }
alshabibe1248b62015-08-20 17:21:55 -0700596 }
Pier Luigif094c612017-10-14 12:15:02 +0200597
alshabibe1248b62015-08-20 17:21:55 -0700598}