blob: 8de0b5a4c7599de1d339ac2f3de0158ba637917c [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.incubator.store.meter.impl.DistributedMeterStore;
37import org.onosproject.mastership.MastershipServiceAdapter;
Andrea Campanellae3708782017-10-16 16:00:21 +020038import org.onosproject.net.AnnotationKeys;
39import org.onosproject.net.DefaultAnnotations;
40import org.onosproject.net.DefaultDevice;
41import org.onosproject.net.Device;
alshabibe1248b62015-08-20 17:21:55 -070042import org.onosproject.net.DeviceId;
Andrea Campanellae3708782017-10-16 16:00:21 +020043import org.onosproject.net.MastershipRole;
44import org.onosproject.net.behaviour.MeterQuery;
45import org.onosproject.net.device.DeviceService;
46import org.onosproject.net.device.DeviceServiceAdapter;
47import org.onosproject.net.driver.AbstractHandlerBehaviour;
48import org.onosproject.net.driver.DefaultDriver;
49import org.onosproject.net.driver.DriverRegistry;
50import org.onosproject.net.driver.impl.DriverManager;
51import org.onosproject.net.driver.impl.DriverRegistryManager;
alshabibe1248b62015-08-20 17:21:55 -070052import org.onosproject.net.meter.Band;
53import org.onosproject.net.meter.DefaultBand;
54import org.onosproject.net.meter.DefaultMeter;
Jordi Ortizaa8de492016-12-01 00:21:36 +010055import org.onosproject.net.meter.DefaultMeterFeatures;
alshabibe1248b62015-08-20 17:21:55 -070056import org.onosproject.net.meter.DefaultMeterRequest;
57import org.onosproject.net.meter.Meter;
Pier Luigif094c612017-10-14 12:15:02 +020058import org.onosproject.net.meter.MeterFeatures;
alshabibe1248b62015-08-20 17:21:55 -070059import org.onosproject.net.meter.MeterId;
60import org.onosproject.net.meter.MeterOperation;
61import org.onosproject.net.meter.MeterOperations;
Andrea Campanellae3708782017-10-16 16:00:21 +020062import org.onosproject.net.meter.MeterProgrammable;
alshabibe1248b62015-08-20 17:21:55 -070063import org.onosproject.net.meter.MeterProvider;
64import org.onosproject.net.meter.MeterProviderRegistry;
65import org.onosproject.net.meter.MeterProviderService;
66import org.onosproject.net.meter.MeterRequest;
Andrea Campanellae3708782017-10-16 16:00:21 +020067import org.onosproject.net.meter.MeterService;
alshabibe1248b62015-08-20 17:21:55 -070068import org.onosproject.net.meter.MeterState;
69import org.onosproject.net.provider.AbstractProvider;
70import org.onosproject.net.provider.ProviderId;
Charles Chan593acf92017-11-22 13:55:41 -080071import org.onosproject.store.service.Serializer;
alshabibe1248b62015-08-20 17:21:55 -070072import org.onosproject.store.service.TestStorageService;
73
74import java.util.Collections;
Jordi Ortizaa8de492016-12-01 00:21:36 +010075import java.util.HashSet;
Andrea Campanellae3708782017-10-16 16:00:21 +020076import java.util.ArrayList;
77import java.util.Collection;
78import java.util.List;
alshabibe1248b62015-08-20 17:21:55 -070079import java.util.Set;
Andrea Campanellae3708782017-10-16 16:00:21 +020080import java.util.concurrent.CompletableFuture;
alshabibe1248b62015-08-20 17:21:55 -070081
82import static org.hamcrest.Matchers.is;
Jordi Ortizaa8de492016-12-01 00:21:36 +010083import static org.junit.Assert.*;
alshabibe1248b62015-08-20 17:21:55 -070084import static org.onosproject.net.NetTestTools.APP_ID;
85import static org.onosproject.net.NetTestTools.did;
86import static org.onosproject.net.NetTestTools.injectEventDispatcher;
87
88/**
89 * Meter manager tests.
90 */
91public class MeterManagerTest {
92
Pier Luigif094c612017-10-14 12:15:02 +020093 // Test node id
alshabibe1248b62015-08-20 17:21:55 -070094 private static final NodeId NID_LOCAL = new NodeId("local");
Pier Luigif094c612017-10-14 12:15:02 +020095
96 // Test ip address
alshabibe1248b62015-08-20 17:21:55 -070097 private static final IpAddress LOCALHOST = IpAddress.valueOf("127.0.0.1");
98
Pier Luigif094c612017-10-14 12:15:02 +020099 private static final ProviderId PID = new ProviderId("of", "foo");
alshabibe1248b62015-08-20 17:21:55 -0700100
Andrea Campanellae3708782017-10-16 16:00:21 +0200101 private static final ProviderId PROGRAMMABLE_PROVIDER = new ProviderId("foo", "foo");
102 private static final DeviceId PROGRAMMABLE_DID = DeviceId.deviceId("test:002");
103
104 private static final DefaultAnnotations ANNOTATIONS =
105 DefaultAnnotations.builder().set(AnnotationKeys.DRIVER, "foo").build();
106
107 private static final Device PROGRAMMABLE_DEV =
108 new DefaultDevice(PROGRAMMABLE_PROVIDER, PROGRAMMABLE_DID, Device.Type.SWITCH,
109 "", "", "", "", null, ANNOTATIONS);
110
111
112 private MeterService service;
113
114 // Test Driver service used during the tests
115 private DriverManager driverService;
116
117 // Test device service used during the tests
118 private DeviceService deviceService;
119
Pier Luigif094c612017-10-14 12:15:02 +0200120 // Test provider used during the tests
alshabibe1248b62015-08-20 17:21:55 -0700121 private TestProvider provider;
122
Pier Luigif094c612017-10-14 12:15:02 +0200123 // Meter manager
124 private MeterManager manager;
alshabibe1248b62015-08-20 17:21:55 -0700125
Pier Luigif094c612017-10-14 12:15:02 +0200126 // Meter provider registry
127 private MeterProviderRegistry registry;
alshabibe1248b62015-08-20 17:21:55 -0700128
Pier Luigif094c612017-10-14 12:15:02 +0200129 // Meter provider service
130 private MeterProviderService providerService;
alshabibe1248b62015-08-20 17:21:55 -0700131
Pier Luigif094c612017-10-14 12:15:02 +0200132 // Store under testing
133 private DistributedMeterStore meterStore;
134
135 // Device ids used during the tests
136 private DeviceId did1 = did("1");
137 private DeviceId did2 = did("2");
138
139 // Meter ids used during the tests
140 private MeterId mid1 = MeterId.meterId(1);
141
142 // Bands used during the tests
Andrea Campanellae3708782017-10-16 16:00:21 +0200143 private static Band b1 = DefaultBand.builder()
Pier Luigif094c612017-10-14 12:15:02 +0200144 .ofType(Band.Type.DROP)
145 .withRate(500)
146 .build();
147
148 // Meters used during the tests
149 private Meter m1 = DefaultMeter.builder()
150 .forDevice(did1)
151 .fromApp(APP_ID)
152 .withId(mid1)
153 .withUnit(Meter.Unit.KB_PER_SEC)
154 .withBands(Collections.singletonList(b1))
155 .build();
156 private Meter m2 = DefaultMeter.builder()
157 .forDevice(did2)
158 .fromApp(APP_ID)
159 .withId(mid1)
160 .withUnit(Meter.Unit.KB_PER_SEC)
161 .withBands(Collections.singletonList(b1))
162 .build();
163
Andrea Campanellae3708782017-10-16 16:00:21 +0200164 private static Meter mProgrammable = DefaultMeter.builder()
165 .forDevice(PROGRAMMABLE_DID)
166 .fromApp(APP_ID)
167 .withId(MeterId.meterId(1))
168 .withUnit(Meter.Unit.KB_PER_SEC)
169 .withBands(Collections.singletonList(b1))
170 .build();
171
Pier Luigif094c612017-10-14 12:15:02 +0200172 // Meter requests used during the tests
173 private MeterRequest.Builder m1Request = DefaultMeterRequest.builder()
174 .forDevice(did1)
175 .fromApp(APP_ID)
176 .withUnit(Meter.Unit.KB_PER_SEC)
177 .withBands(Collections.singletonList(b1));
178 private MeterRequest.Builder m2Request = DefaultMeterRequest.builder()
179 .forDevice(did2)
180 .fromApp(APP_ID)
181 .withUnit(Meter.Unit.KB_PER_SEC)
182 .withBands(Collections.singletonList(b1));
183
Andrea Campanellae3708782017-10-16 16:00:21 +0200184 private MeterRequest.Builder mProgrammableRequest = DefaultMeterRequest.builder()
185 .forDevice(PROGRAMMABLE_DID)
186 .fromApp(APP_ID)
187 .withUnit(Meter.Unit.KB_PER_SEC)
188 .withBands(Collections.singletonList(b1));
189
Pier Luigif094c612017-10-14 12:15:02 +0200190 // Meter features used during the tests
191 private MeterFeatures mef1 = DefaultMeterFeatures.builder().forDevice(did1)
192 .withMaxMeters(3L)
193 .withBandTypes(new HashSet<>())
194 .withUnits(new HashSet<>())
195 .hasStats(false)
196 .hasBurst(false)
197 .withMaxBands((byte) 0)
198 .withMaxColors((byte) 0)
199 .build();
200 private MeterFeatures mef2 = DefaultMeterFeatures.builder().forDevice(did2)
201 .withMaxMeters(10L)
202 .withBandTypes(new HashSet<>())
203 .withUnits(new HashSet<>())
204 .hasStats(false)
205 .hasBurst(false)
206 .withMaxBands((byte) 0)
207 .withMaxColors((byte) 0)
208 .build();
alshabibe1248b62015-08-20 17:21:55 -0700209
Andrea Campanellae3708782017-10-16 16:00:21 +0200210
alshabibe1248b62015-08-20 17:21:55 -0700211 @Before
Pier Luigif094c612017-10-14 12:15:02 +0200212 public void setup() {
Andrea Campanellae3708782017-10-16 16:00:21 +0200213 //Init step for the deviceService
214 deviceService = new TestDeviceService();
215 //Init step for the driver registry and driver service.
216 DriverRegistryManager driverRegistry = new DriverRegistryManager();
217 driverService = new TestDriverManager(driverRegistry, deviceService);
218 driverRegistry.addDriver(new DefaultDriver("foo", ImmutableList.of(), "",
219 "", "",
220 ImmutableMap.of(MeterProgrammable.class,
221 TestMeterProgrammable.class, MeterQuery.class, TestMeterQuery.class),
222 ImmutableMap.of()));
223
Pier Luigif094c612017-10-14 12:15:02 +0200224 // Init step for the store
alshabibe1248b62015-08-20 17:21:55 -0700225 meterStore = new DistributedMeterStore();
Pier Luigif094c612017-10-14 12:15:02 +0200226 // Let's initialize some internal services of the store
alshabibe1248b62015-08-20 17:21:55 -0700227 TestUtils.setField(meterStore, "storageService", new TestStorageService());
228 TestUtils.setField(meterStore, "clusterService", new TestClusterService());
229 TestUtils.setField(meterStore, "mastershipService", new TestMastershipService());
Andrea Campanellae3708782017-10-16 16:00:21 +0200230 TestUtils.setField(meterStore, "driverService", driverService);
Charles Chan593acf92017-11-22 13:55:41 -0800231
232 // Inject TestApplicationId into the DistributedMeterStore serializer
233 KryoNamespace.Builder testKryoBuilder = TestUtils.getField(meterStore, "APP_KRYO_BUILDER");
234 testKryoBuilder.register(TestApplicationId.class);
235 Serializer testSerializer = Serializer.using(Lists.newArrayList(testKryoBuilder.build()));
236 TestUtils.setField(meterStore, "serializer", testSerializer);
237
Pier Luigif094c612017-10-14 12:15:02 +0200238 // Activate the store
alshabibe1248b62015-08-20 17:21:55 -0700239 meterStore.activate();
Pier Luigif094c612017-10-14 12:15:02 +0200240 // Init step for the manager
alshabibe1248b62015-08-20 17:21:55 -0700241 manager = new MeterManager();
Pier Luigif094c612017-10-14 12:15:02 +0200242 // Let's initialize some internal services of the manager
243 TestUtils.setField(manager, "store", meterStore);
alshabibe1248b62015-08-20 17:21:55 -0700244 injectEventDispatcher(manager, new TestEventDispatcher());
Andrea Campanellae3708782017-10-16 16:00:21 +0200245 manager.deviceService = deviceService;
246 manager.mastershipService = new TestMastershipService();
247 manager.cfgService = new ComponentConfigAdapter();
248 TestUtils.setField(manager, "storageService", new TestStorageService());
Pier Luigif094c612017-10-14 12:15:02 +0200249 // Init the reference of the registry
alshabibe1248b62015-08-20 17:21:55 -0700250 registry = manager;
Andrea Campanellae3708782017-10-16 16:00:21 +0200251
252 manager.driverService = driverService;
253
Pier Luigif094c612017-10-14 12:15:02 +0200254 // Activate the manager
Andrea Campanellae3708782017-10-16 16:00:21 +0200255 manager.activate(null);
Pier Luigif094c612017-10-14 12:15:02 +0200256 // Initialize the test provider
Andrea Campanellae3708782017-10-16 16:00:21 +0200257
alshabibe1248b62015-08-20 17:21:55 -0700258 provider = new TestProvider(PID);
Pier Luigif094c612017-10-14 12:15:02 +0200259 // Register the provider against the manager
alshabibe1248b62015-08-20 17:21:55 -0700260 providerService = registry.register(provider);
Pier Luigif094c612017-10-14 12:15:02 +0200261 // Verify register
alshabibe1248b62015-08-20 17:21:55 -0700262 assertTrue("provider should be registered",
263 registry.getProviders().contains(provider.id()));
alshabibe1248b62015-08-20 17:21:55 -0700264 }
265
266 @After
267 public void tearDown() {
Pier Luigif094c612017-10-14 12:15:02 +0200268 // Unregister provider
alshabibe1248b62015-08-20 17:21:55 -0700269 registry.unregister(provider);
Pier Luigif094c612017-10-14 12:15:02 +0200270 // Verify unregister
alshabibe1248b62015-08-20 17:21:55 -0700271 assertFalse("provider should not be registered",
272 registry.getProviders().contains(provider.id()));
Pier Luigif094c612017-10-14 12:15:02 +0200273 // Deactivate manager
alshabibe1248b62015-08-20 17:21:55 -0700274 manager.deactivate();
Pier Luigif094c612017-10-14 12:15:02 +0200275 // Remove event dispatcher
alshabibe1248b62015-08-20 17:21:55 -0700276 injectEventDispatcher(manager, null);
Pier Luigif094c612017-10-14 12:15:02 +0200277 // Deactivate store
278 meterStore.deactivate();
alshabibe1248b62015-08-20 17:21:55 -0700279 }
280
Pier Luigif094c612017-10-14 12:15:02 +0200281 private void initMeterStore() {
282 // Let's store feature for device 1
283 meterStore.storeMeterFeatures(mef1);
284 // Let's store feature for device 2
285 meterStore.storeMeterFeatures(mef2);
286 }
287
288 // Emulate metrics coming from the dataplane
289 private void pushMetrics(MeterOperation.Type type, Meter meter) {
290 // If it is an add operation
291 if (type == MeterOperation.Type.ADD) {
292 // Update state to added
293 ((DefaultMeter) meter).setState(MeterState.ADDED);
294 // Push the update in the store
295 providerService.pushMeterMetrics(meter.deviceId(), Collections.singletonList(meter));
296 } else {
297 providerService.pushMeterMetrics(meter.deviceId(), Collections.emptyList());
298 }
299 }
300
301 /**
302 * Test add meter.
303 */
alshabibe1248b62015-08-20 17:21:55 -0700304 @Test
Pier Luigif094c612017-10-14 12:15:02 +0200305 public void testAdd() {
306 // Init store
307 initMeterStore();
308 // Submit meter request
alshabibe1248b62015-08-20 17:21:55 -0700309 manager.submit(m1Request.add());
Pier Luigif094c612017-10-14 12:15:02 +0200310 // Verify add
alshabibe1248b62015-08-20 17:21:55 -0700311 assertTrue("The meter was not added", manager.getAllMeters().size() == 1);
Pier Luigif094c612017-10-14 12:15:02 +0200312 assertTrue("The meter was not added", manager.getMeters(did1).size() == 1);
313 // Get Meter
314 Meter installingMeter = manager.getMeter(did1, mid1);
315 // Verify add of installingMeter and pending add state
316 assertThat(installingMeter, is(m1));
317 // Verify pending add state
318 assertThat(installingMeter.state(), is(MeterState.PENDING_ADD));
319 // Let's simulate a working data-plane
320 pushMetrics(MeterOperation.Type.ADD, installingMeter);
321 // Get meter
322 Meter installedMeter = manager.getMeter(did1, mid1);
323 // Verify installation
324 assertThat(installedMeter.state(), is(MeterState.ADDED));
325 assertTrue("The meter was not installed", manager.getAllMeters().size() == 1);
326 assertTrue("The meter was not installed", manager.getMeters(did1).size() == 1);
alshabibe1248b62015-08-20 17:21:55 -0700327 }
328
Pier Luigif094c612017-10-14 12:15:02 +0200329 /**
330 * Test remove meter.
331 */
alshabibe1248b62015-08-20 17:21:55 -0700332 @Test
333 public void testRemove() {
Pier Luigif094c612017-10-14 12:15:02 +0200334 // Init store
335 initMeterStore();
336 // Submit meter request
alshabibe1248b62015-08-20 17:21:55 -0700337 manager.submit(m1Request.add());
Pier Luigif094c612017-10-14 12:15:02 +0200338 // Withdraw meter
alshabibe1248b62015-08-20 17:21:55 -0700339 manager.withdraw(m1Request.remove(), m1.id());
Pier Luigif094c612017-10-14 12:15:02 +0200340 // Get Meter
341 Meter withdrawingMeter = manager.getMeter(did1, mid1);
342 // Verify withdrawing
343 assertThat(withdrawingMeter.state(), is(MeterState.PENDING_REMOVE));
344 assertTrue("The meter was not withdrawn", manager.getAllMeters().size() == 1);
345 assertTrue("The meter was not withdrawn", manager.getMeters(did1).size() == 1);
346 // Let's simulate a working data-plane
347 pushMetrics(MeterOperation.Type.REMOVE, withdrawingMeter);
348 // Verify withdrawn
349 assertNull(manager.getMeter(did1, mid1));
alshabibe1248b62015-08-20 17:21:55 -0700350 assertTrue("The meter was not removed", manager.getAllMeters().size() == 0);
Pier Luigif094c612017-10-14 12:15:02 +0200351 assertTrue("The meter was not removed", manager.getMeters(did1).size() == 0);
alshabibe1248b62015-08-20 17:21:55 -0700352 }
353
Pier Luigif094c612017-10-14 12:15:02 +0200354 /**
355 * Test add multiple device.
356 */
alshabib70aaa1b2015-09-25 14:30:59 -0700357 @Test
Pier Luigif094c612017-10-14 12:15:02 +0200358 public void testAddMultipleDevice() {
359 // Init store
360 initMeterStore();
361 // Submit meter 1
alshabib70aaa1b2015-09-25 14:30:59 -0700362 manager.submit(m1Request.add());
Pier Luigif094c612017-10-14 12:15:02 +0200363 // Submit meter 2
alshabib70aaa1b2015-09-25 14:30:59 -0700364 manager.submit(m2Request.add());
Pier Luigif094c612017-10-14 12:15:02 +0200365 // Verify add
366 assertTrue("The meter was not added", manager.getAllMeters().size() == 2);
367 assertTrue("The meter was not added", manager.getMeters(did1).size() == 1);
368 assertTrue("The meter was not added", manager.getMeters(did2).size() == 1);
369 // Get Meters
370 Meter installingMeter1 = manager.getMeter(did1, mid1);
371 Meter installingMeter2 = manager.getMeter(did2, mid1);
372 // Verify add of installingMeter
373 assertThat(installingMeter1, is(m1));
374 assertThat(installingMeter2, is(m2));
375 // Verify pending add state
376 assertThat(installingMeter1.state(), is(MeterState.PENDING_ADD));
377 assertThat(installingMeter2.state(), is(MeterState.PENDING_ADD));
378 // Let's simulate a working data-plane
379 pushMetrics(MeterOperation.Type.ADD, installingMeter1);
380 pushMetrics(MeterOperation.Type.ADD, installingMeter2);
381 // Get meter
382 Meter installedMeter1 = manager.getMeter(did1, mid1);
383 Meter installedMeter2 = manager.getMeter(did2, mid1);
384 // Verify installation
385 assertThat(installedMeter1.state(), is(MeterState.ADDED));
386 assertThat(installedMeter2.state(), is(MeterState.ADDED));
387 assertTrue("The meter was not installed", manager.getAllMeters().size() == 2);
388 assertTrue("The meter was not installed", manager.getMeters(did1).size() == 1);
389 assertTrue("The meter was not installed", manager.getMeters(did2).size() == 1);
alshabib70aaa1b2015-09-25 14:30:59 -0700390 }
alshabibe1248b62015-08-20 17:21:55 -0700391
Pier Luigif094c612017-10-14 12:15:02 +0200392 /**
393 * Test remove meter.
394 */
Jordi Ortizaa8de492016-12-01 00:21:36 +0100395 @Test
Pier Luigif094c612017-10-14 12:15:02 +0200396 public void testRemoveMultipleDevice() {
397 // Init store
398 initMeterStore();
399 // Submit meter 1
Jordi Ortiz6c847762017-01-30 17:13:05 +0100400 manager.submit(m1Request.add());
Pier Luigif094c612017-10-14 12:15:02 +0200401 // Submit meter 2
402 manager.submit(m2Request.add());
403 // Withdraw meter
404 manager.withdraw(m1Request.remove(), m1.id());
405 // Withdraw meter
406 manager.withdraw(m2Request.remove(), m2.id());
407 // Get Meters
408 Meter withdrawingMeter1 = manager.getMeter(did1, mid1);
409 Meter withdrawingMeter2 = manager.getMeter(did2, mid1);
410 // Verify withdrawing
411 assertThat(withdrawingMeter1.state(), is(MeterState.PENDING_REMOVE));
412 assertThat(withdrawingMeter2.state(), is(MeterState.PENDING_REMOVE));
413 assertTrue("The meter was not withdrawn", manager.getAllMeters().size() == 2);
414 assertTrue("The meter was not withdrawn", manager.getMeters(did1).size() == 1);
415 assertTrue("The meter was not withdrawn", manager.getMeters(did2).size() == 1);
416 // Let's simulate a working data-plane
417 pushMetrics(MeterOperation.Type.REMOVE, withdrawingMeter1);
418 pushMetrics(MeterOperation.Type.REMOVE, withdrawingMeter2);
419 // Verify withdrawn
420 assertNull(manager.getMeter(did1, mid1));
421 assertNull(manager.getMeter(did2, mid1));
422 assertTrue("The meter was not removed", manager.getAllMeters().size() == 0);
423 assertTrue("The meter was not removed", manager.getMeters(did1).size() == 0);
424 assertTrue("The meter was not removed", manager.getMeters(did2).size() == 0);
Jordi Ortiz6c847762017-01-30 17:13:05 +0100425 }
426
Andrea Campanellae3708782017-10-16 16:00:21 +0200427 @Test
428 public void testAddFromMeterProgrammable() {
429
430 // Init store
431 initMeterStore();
432
433 manager.submit(mProgrammableRequest.add());
434
435 TestTools.assertAfter(500, () -> {
436
437 assertTrue("The meter was not added", manager.getAllMeters().size() == 1);
438
439 assertThat(manager.getMeter(PROGRAMMABLE_DID, MeterId.meterId(1)), is(mProgrammable));
440 });
441
442 }
443
444 @Test
445 public void testAddBatchFromMeterProgrammable() {
446
447 // Init store
448 initMeterStore();
449
450 List<MeterOperation> operations = ImmutableList.of(new MeterOperation(mProgrammable, MeterOperation.Type.ADD));
451 manager.defaultProvider().performMeterOperation(PROGRAMMABLE_DID, new MeterOperations(operations));
452
453 TestTools.assertAfter(500, () -> {
454
455 assertTrue("The meter was not added", meterOperations.size() == 1);
456
457 assertTrue("Wrong Meter Operation", meterOperations.get(0).meter().id().equals(mProgrammable.id()));
458 });
459
460 }
461
462 @Test
463 public void testGetFromMeterProgrammable() {
464
465 // Init store
466 initMeterStore();
467
468 MeterDriverProvider fallback = (MeterDriverProvider) manager.defaultProvider();
469
470 testAddFromMeterProgrammable();
471
472 fallback.init(manager.deviceService, fallback.meterProviderService, manager.mastershipService, 1);
473
474 TestTools.assertAfter(2000, () -> {
475 assertTrue("The meter was not added", manager.getAllMeters().size() == 1);
476 Meter m = manager.getMeters(PROGRAMMABLE_DID).iterator().next();
477 assertEquals("incorrect state", MeterState.ADDED, m.state());
478 });
479
480 }
481
Pier Luigif094c612017-10-14 12:15:02 +0200482 // Test cluster service
483 private final class TestClusterService extends ClusterServiceAdapter {
Jordi Ortizaa8de492016-12-01 00:21:36 +0100484
Pier Luigif094c612017-10-14 12:15:02 +0200485 private ControllerNode local = new DefaultControllerNode(NID_LOCAL, LOCALHOST);
Jordi Ortizaa8de492016-12-01 00:21:36 +0100486
Pier Luigif094c612017-10-14 12:15:02 +0200487 @Override
488 public ControllerNode getLocalNode() {
489 return local;
alshabibe1248b62015-08-20 17:21:55 -0700490 }
Pier Luigif094c612017-10-14 12:15:02 +0200491
492 @Override
493 public Set<ControllerNode> getNodes() {
494 return Sets.newHashSet();
495 }
496
alshabibe1248b62015-08-20 17:21:55 -0700497 }
498
Andrea Campanellae3708782017-10-16 16:00:21 +0200499 private static class TestDeviceService extends DeviceServiceAdapter {
500 @Override
501 public int getDeviceCount() {
502 return 1;
503 }
504
505 @Override
506 public Iterable<Device> getDevices() {
507 return ImmutableList.of(PROGRAMMABLE_DEV);
508 }
509
510 @Override
511 public Iterable<Device> getAvailableDevices() {
512 return getDevices();
513 }
514
515 @Override
516 public Device getDevice(DeviceId deviceId) {
517 return PROGRAMMABLE_DEV;
518 }
519 }
520
521 private class TestDriverManager extends DriverManager {
522 TestDriverManager(DriverRegistry registry, DeviceService deviceService) {
523 this.registry = registry;
524 this.deviceService = deviceService;
525 activate();
526 }
527 }
528
529 public static class TestMeterQuery extends AbstractHandlerBehaviour
530 implements MeterQuery {
531 private static final long MAX_METER = 0x00000FFF;
532
533 @Override
534 public long getMaxMeters() {
535 return MAX_METER;
536 }
537 }
538
539 private static List<MeterOperation> meterOperations = new ArrayList<>();
540
541 public static class TestMeterProgrammable extends AbstractHandlerBehaviour
542 implements MeterProgrammable {
543
544 @Override
545 public CompletableFuture<Boolean> performMeterOperation(MeterOperation meterOp) {
546 return CompletableFuture.completedFuture(meterOperations.add(meterOp));
547 }
548
549 @Override
550 public CompletableFuture<Collection<Meter>> getMeters() {
551 //ADD METER
552 DefaultMeter mProgrammableAdded = (DefaultMeter) mProgrammable;
553 mProgrammableAdded.setState(MeterState.ADDED);
554 return CompletableFuture.completedFuture(ImmutableList.of(mProgrammableAdded));
555 }
556 }
557
alshabibe1248b62015-08-20 17:21:55 -0700558 private class TestProvider extends AbstractProvider implements MeterProvider {
559
560 protected TestProvider(ProviderId id) {
561 super(PID);
562 }
563
564 @Override
565 public void performMeterOperation(DeviceId deviceId, MeterOperations meterOps) {
566 //Currently unused.
567 }
568
569 @Override
570 public void performMeterOperation(DeviceId deviceId, MeterOperation meterOp) {
Pier Luigif094c612017-10-14 12:15:02 +0200571 //Currently unused
alshabibe1248b62015-08-20 17:21:55 -0700572 }
573 }
574
Pier Luigif094c612017-10-14 12:15:02 +0200575 // Test mastership service
576 private final class TestMastershipService extends MastershipServiceAdapter {
alshabibe1248b62015-08-20 17:21:55 -0700577 @Override
578 public NodeId getMasterFor(DeviceId deviceId) {
579 return NID_LOCAL;
580 }
Andrea Campanellae3708782017-10-16 16:00:21 +0200581
582 @Override
583 public MastershipRole getLocalRole(DeviceId deviceId) {
584 return MastershipRole.MASTER;
585 }
alshabibe1248b62015-08-20 17:21:55 -0700586 }
Pier Luigif094c612017-10-14 12:15:02 +0200587
alshabibe1248b62015-08-20 17:21:55 -0700588}