blob: 1510e354ede74c7213534fad5cd7000b29d10920 [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;
pierventre1b8afbc2020-07-13 14:07:05 +020022import org.easymock.EasyMock;
alshabibe1248b62015-08-20 17:21:55 -070023import org.junit.After;
24import org.junit.Before;
25import org.junit.Test;
Andrea Campanellae3708782017-10-16 16:00:21 +020026import org.onlab.junit.TestTools;
alshabibe1248b62015-08-20 17:21:55 -070027import org.onlab.junit.TestUtils;
28import org.onlab.packet.IpAddress;
Charles Chan593acf92017-11-22 13:55:41 -080029import org.onlab.util.KryoNamespace;
30import org.onosproject.TestApplicationId;
Andrea Campanellae3708782017-10-16 16:00:21 +020031import org.onosproject.cfg.ComponentConfigAdapter;
alshabibe1248b62015-08-20 17:21:55 -070032import org.onosproject.cluster.ClusterServiceAdapter;
33import org.onosproject.cluster.ControllerNode;
34import org.onosproject.cluster.DefaultControllerNode;
35import org.onosproject.cluster.NodeId;
36import org.onosproject.common.event.impl.TestEventDispatcher;
alshabibe1248b62015-08-20 17:21:55 -070037import 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;
Thomas Vachuska164ecf62018-05-08 17:29:55 -070045import org.onosproject.net.config.NetworkConfigService;
46import org.onosproject.net.config.NetworkConfigServiceAdapter;
Andrea Campanellae3708782017-10-16 16:00:21 +020047import org.onosproject.net.device.DeviceService;
48import org.onosproject.net.device.DeviceServiceAdapter;
49import org.onosproject.net.driver.AbstractHandlerBehaviour;
50import org.onosproject.net.driver.DefaultDriver;
51import org.onosproject.net.driver.DriverRegistry;
52import org.onosproject.net.driver.impl.DriverManager;
53import org.onosproject.net.driver.impl.DriverRegistryManager;
alshabibe1248b62015-08-20 17:21:55 -070054import org.onosproject.net.meter.Band;
55import org.onosproject.net.meter.DefaultBand;
56import org.onosproject.net.meter.DefaultMeter;
Jordi Ortizaa8de492016-12-01 00:21:36 +010057import org.onosproject.net.meter.DefaultMeterFeatures;
alshabibe1248b62015-08-20 17:21:55 -070058import org.onosproject.net.meter.DefaultMeterRequest;
59import org.onosproject.net.meter.Meter;
pierventre3b39bd82021-08-18 09:40:14 +020060import org.onosproject.net.meter.MeterCellId;
Pier Luigif094c612017-10-14 12:15:02 +020061import org.onosproject.net.meter.MeterFeatures;
alshabibe1248b62015-08-20 17:21:55 -070062import org.onosproject.net.meter.MeterId;
63import org.onosproject.net.meter.MeterOperation;
64import org.onosproject.net.meter.MeterOperations;
Andrea Campanellae3708782017-10-16 16:00:21 +020065import org.onosproject.net.meter.MeterProgrammable;
alshabibe1248b62015-08-20 17:21:55 -070066import org.onosproject.net.meter.MeterProvider;
67import org.onosproject.net.meter.MeterProviderRegistry;
68import org.onosproject.net.meter.MeterProviderService;
69import org.onosproject.net.meter.MeterRequest;
pierventre3b39bd82021-08-18 09:40:14 +020070import org.onosproject.net.meter.MeterScope;
Andrea Campanellae3708782017-10-16 16:00:21 +020071import org.onosproject.net.meter.MeterService;
alshabibe1248b62015-08-20 17:21:55 -070072import org.onosproject.net.meter.MeterState;
Carmelo Cascone0761cd32018-08-29 19:22:50 -070073import org.onosproject.net.pi.PiPipeconfServiceAdapter;
pierventre3b39bd82021-08-18 09:40:14 +020074import org.onosproject.net.pi.model.PiMeterId;
75import org.onosproject.net.pi.runtime.PiMeterCellId;
alshabibe1248b62015-08-20 17:21:55 -070076import org.onosproject.net.provider.AbstractProvider;
77import org.onosproject.net.provider.ProviderId;
Thomas Vachuska52f2cd12018-11-08 21:20:04 -080078import org.onosproject.store.meter.impl.DistributedMeterStore;
Charles Chan593acf92017-11-22 13:55:41 -080079import org.onosproject.store.service.Serializer;
alshabibe1248b62015-08-20 17:21:55 -070080import org.onosproject.store.service.TestStorageService;
pierventre1b8afbc2020-07-13 14:07:05 +020081import org.osgi.service.component.ComponentContext;
alshabibe1248b62015-08-20 17:21:55 -070082
Andrea Campanellae3708782017-10-16 16:00:21 +020083import java.util.ArrayList;
84import java.util.Collection;
Carmelo Cascone0761cd32018-08-29 19:22:50 -070085import java.util.Collections;
86import java.util.HashSet;
Andrea Campanellae3708782017-10-16 16:00:21 +020087import java.util.List;
alshabibe1248b62015-08-20 17:21:55 -070088import java.util.Set;
pierventre1b8afbc2020-07-13 14:07:05 +020089import java.util.Dictionary;
90import java.util.Hashtable;
Andrea Campanellae3708782017-10-16 16:00:21 +020091import java.util.concurrent.CompletableFuture;
alshabibe1248b62015-08-20 17:21:55 -070092
pierventre1b8afbc2020-07-13 14:07:05 +020093import static org.easymock.EasyMock.expect;
94import static org.easymock.EasyMock.replay;
pierventre3b39bd82021-08-18 09:40:14 +020095import static org.easymock.EasyMock.reset;
alshabibe1248b62015-08-20 17:21:55 -070096import static org.hamcrest.Matchers.is;
Carmelo Cascone0761cd32018-08-29 19:22:50 -070097import static org.junit.Assert.assertEquals;
98import static org.junit.Assert.assertFalse;
99import static org.junit.Assert.assertNull;
100import static org.junit.Assert.assertThat;
101import static org.junit.Assert.assertTrue;
alshabibe1248b62015-08-20 17:21:55 -0700102import static org.onosproject.net.NetTestTools.APP_ID;
103import static org.onosproject.net.NetTestTools.did;
104import static org.onosproject.net.NetTestTools.injectEventDispatcher;
pierventre3b39bd82021-08-18 09:40:14 +0200105import static org.onosproject.net.OsgiPropertyConstants.MM_USER_DEFINED_INDEX;
alshabibe1248b62015-08-20 17:21:55 -0700106
107/**
108 * Meter manager tests.
109 */
110public class MeterManagerTest {
111
Pier Luigif094c612017-10-14 12:15:02 +0200112 // Test node id
alshabibe1248b62015-08-20 17:21:55 -0700113 private static final NodeId NID_LOCAL = new NodeId("local");
Pier Luigif094c612017-10-14 12:15:02 +0200114
115 // Test ip address
alshabibe1248b62015-08-20 17:21:55 -0700116 private static final IpAddress LOCALHOST = IpAddress.valueOf("127.0.0.1");
117
Pier Luigif094c612017-10-14 12:15:02 +0200118 private static final ProviderId PID = new ProviderId("of", "foo");
alshabibe1248b62015-08-20 17:21:55 -0700119
Andrea Campanellae3708782017-10-16 16:00:21 +0200120 private static final ProviderId PROGRAMMABLE_PROVIDER = new ProviderId("foo", "foo");
121 private static final DeviceId PROGRAMMABLE_DID = DeviceId.deviceId("test:002");
122
123 private static final DefaultAnnotations ANNOTATIONS =
124 DefaultAnnotations.builder().set(AnnotationKeys.DRIVER, "foo").build();
125
126 private static final Device PROGRAMMABLE_DEV =
127 new DefaultDevice(PROGRAMMABLE_PROVIDER, PROGRAMMABLE_DID, Device.Type.SWITCH,
128 "", "", "", "", null, ANNOTATIONS);
129
Andrea Campanellae3708782017-10-16 16:00:21 +0200130 private MeterService service;
131
132 // Test Driver service used during the tests
133 private DriverManager driverService;
134
135 // Test device service used during the tests
136 private DeviceService deviceService;
137
Pier Luigif094c612017-10-14 12:15:02 +0200138 // Test provider used during the tests
alshabibe1248b62015-08-20 17:21:55 -0700139 private TestProvider provider;
140
Pier Luigif094c612017-10-14 12:15:02 +0200141 // Meter manager
142 private MeterManager manager;
alshabibe1248b62015-08-20 17:21:55 -0700143
Pier Luigif094c612017-10-14 12:15:02 +0200144 // Meter provider registry
145 private MeterProviderRegistry registry;
alshabibe1248b62015-08-20 17:21:55 -0700146
Pier Luigif094c612017-10-14 12:15:02 +0200147 // Meter provider service
148 private MeterProviderService providerService;
alshabibe1248b62015-08-20 17:21:55 -0700149
Pier Luigif094c612017-10-14 12:15:02 +0200150 // Store under testing
151 private DistributedMeterStore meterStore;
152
153 // Device ids used during the tests
154 private DeviceId did1 = did("1");
155 private DeviceId did2 = did("2");
156
157 // Meter ids used during the tests
158 private MeterId mid1 = MeterId.meterId(1);
pierventre3b39bd82021-08-18 09:40:14 +0200159 private MeterCellId cid0 = PiMeterCellId.ofIndirect(PiMeterId.of("foo"), 0L);
Pier Luigif094c612017-10-14 12:15:02 +0200160
161 // Bands used during the tests
Andrea Campanellae3708782017-10-16 16:00:21 +0200162 private static Band b1 = DefaultBand.builder()
Pier Luigif094c612017-10-14 12:15:02 +0200163 .ofType(Band.Type.DROP)
164 .withRate(500)
165 .build();
166
167 // Meters used during the tests
168 private Meter m1 = DefaultMeter.builder()
169 .forDevice(did1)
170 .fromApp(APP_ID)
171 .withId(mid1)
172 .withUnit(Meter.Unit.KB_PER_SEC)
173 .withBands(Collections.singletonList(b1))
174 .build();
175 private Meter m2 = DefaultMeter.builder()
176 .forDevice(did2)
177 .fromApp(APP_ID)
178 .withId(mid1)
179 .withUnit(Meter.Unit.KB_PER_SEC)
180 .withBands(Collections.singletonList(b1))
181 .build();
182
Andrea Campanellae3708782017-10-16 16:00:21 +0200183 private static Meter mProgrammable = DefaultMeter.builder()
184 .forDevice(PROGRAMMABLE_DID)
185 .fromApp(APP_ID)
186 .withId(MeterId.meterId(1))
187 .withUnit(Meter.Unit.KB_PER_SEC)
188 .withBands(Collections.singletonList(b1))
189 .build();
pierventre3b39bd82021-08-18 09:40:14 +0200190 private static Meter mProgrammable2 = DefaultMeter.builder()
191 .forDevice(PROGRAMMABLE_DID)
192 .fromApp(APP_ID)
193 .withId(MeterId.meterId(2))
194 .withUnit(Meter.Unit.KB_PER_SEC)
195 .withBands(Collections.singletonList(b1))
196 .build();
197
198 private static Meter mUserDefined = DefaultMeter.builder()
199 .forDevice(PROGRAMMABLE_DID)
200 .fromApp(APP_ID)
201 .withCellId(PiMeterCellId.ofIndirect(PiMeterId.of("foo"), 0L))
202 .withUnit(Meter.Unit.KB_PER_SEC)
203 .withBands(Collections.singletonList(b1))
204 .build();
Andrea Campanellae3708782017-10-16 16:00:21 +0200205
Pier Luigif094c612017-10-14 12:15:02 +0200206 // Meter requests used during the tests
207 private MeterRequest.Builder m1Request = DefaultMeterRequest.builder()
208 .forDevice(did1)
209 .fromApp(APP_ID)
210 .withUnit(Meter.Unit.KB_PER_SEC)
211 .withBands(Collections.singletonList(b1));
212 private MeterRequest.Builder m2Request = DefaultMeterRequest.builder()
213 .forDevice(did2)
214 .fromApp(APP_ID)
215 .withUnit(Meter.Unit.KB_PER_SEC)
216 .withBands(Collections.singletonList(b1));
217
Andrea Campanellae3708782017-10-16 16:00:21 +0200218 private MeterRequest.Builder mProgrammableRequest = DefaultMeterRequest.builder()
219 .forDevice(PROGRAMMABLE_DID)
220 .fromApp(APP_ID)
221 .withUnit(Meter.Unit.KB_PER_SEC)
222 .withBands(Collections.singletonList(b1));
pierventre3b39bd82021-08-18 09:40:14 +0200223 private MeterRequest.Builder mProgrammableRequest2 = DefaultMeterRequest.builder()
224 .forDevice(PROGRAMMABLE_DID)
225 .fromApp(APP_ID)
226 .withUnit(Meter.Unit.KB_PER_SEC)
227 .withBands(Collections.singletonList(b1));
228
229 private MeterRequest.Builder userDefinedRequest = DefaultMeterRequest.builder()
230 .forDevice(PROGRAMMABLE_DID)
231 .fromApp(APP_ID)
232 .withUnit(Meter.Unit.KB_PER_SEC)
233 .withBands(Collections.singletonList(b1))
234 .withScope(MeterScope.of("foo"))
235 .withIndex(0L);
Andrea Campanellae3708782017-10-16 16:00:21 +0200236
Pier Luigif094c612017-10-14 12:15:02 +0200237 // Meter features used during the tests
238 private MeterFeatures mef1 = DefaultMeterFeatures.builder().forDevice(did1)
239 .withMaxMeters(3L)
240 .withBandTypes(new HashSet<>())
241 .withUnits(new HashSet<>())
242 .hasStats(false)
243 .hasBurst(false)
244 .withMaxBands((byte) 0)
245 .withMaxColors((byte) 0)
246 .build();
247 private MeterFeatures mef2 = DefaultMeterFeatures.builder().forDevice(did2)
248 .withMaxMeters(10L)
249 .withBandTypes(new HashSet<>())
250 .withUnits(new HashSet<>())
251 .hasStats(false)
252 .hasBurst(false)
253 .withMaxBands((byte) 0)
254 .withMaxColors((byte) 0)
255 .build();
pierventre3b39bd82021-08-18 09:40:14 +0200256 private MeterFeatures programmableMef1 = DefaultMeterFeatures.builder().forDevice(PROGRAMMABLE_DID)
257 .withStartIndex(1)
258 .withEndIndex(10L)
259 .withBandTypes(new HashSet<>())
260 .withUnits(new HashSet<>())
261 .hasStats(false)
262 .hasBurst(false)
263 .withMaxBands((byte) 0)
264 .withMaxColors((byte) 0)
265 .build();
266 private MeterFeatures programmableMef2 = DefaultMeterFeatures.builder().forDevice(PROGRAMMABLE_DID)
267 .withStartIndex(0)
268 .withEndIndex(10L)
269 .withScope(MeterScope.of("foo"))
270 .withBandTypes(new HashSet<>())
271 .withUnits(new HashSet<>())
272 .hasStats(false)
273 .hasBurst(false)
274 .withMaxBands((byte) 0)
275 .withMaxColors((byte) 0)
276 .build();
alshabibe1248b62015-08-20 17:21:55 -0700277
pierventre3b39bd82021-08-18 09:40:14 +0200278 private ComponentContext componentContext = EasyMock.createMock(ComponentContext.class);
Andrea Campanellae3708782017-10-16 16:00:21 +0200279
alshabibe1248b62015-08-20 17:21:55 -0700280 @Before
Pier Luigif094c612017-10-14 12:15:02 +0200281 public void setup() {
Andrea Campanellae3708782017-10-16 16:00:21 +0200282 //Init step for the deviceService
283 deviceService = new TestDeviceService();
284 //Init step for the driver registry and driver service.
285 DriverRegistryManager driverRegistry = new DriverRegistryManager();
Thomas Vachuska164ecf62018-05-08 17:29:55 -0700286 driverService = new TestDriverManager(driverRegistry, deviceService, new NetworkConfigServiceAdapter());
Andrea Campanellae3708782017-10-16 16:00:21 +0200287 driverRegistry.addDriver(new DefaultDriver("foo", ImmutableList.of(), "",
288 "", "",
289 ImmutableMap.of(MeterProgrammable.class,
290 TestMeterProgrammable.class, MeterQuery.class, TestMeterQuery.class),
291 ImmutableMap.of()));
292
Pier Luigif094c612017-10-14 12:15:02 +0200293 // Init step for the store
alshabibe1248b62015-08-20 17:21:55 -0700294 meterStore = new DistributedMeterStore();
Pier Luigif094c612017-10-14 12:15:02 +0200295 // Let's initialize some internal services of the store
alshabibe1248b62015-08-20 17:21:55 -0700296 TestUtils.setField(meterStore, "storageService", new TestStorageService());
Andrea Campanellae3708782017-10-16 16:00:21 +0200297 TestUtils.setField(meterStore, "driverService", driverService);
Charles Chan593acf92017-11-22 13:55:41 -0800298
299 // Inject TestApplicationId into the DistributedMeterStore serializer
300 KryoNamespace.Builder testKryoBuilder = TestUtils.getField(meterStore, "APP_KRYO_BUILDER");
301 testKryoBuilder.register(TestApplicationId.class);
302 Serializer testSerializer = Serializer.using(Lists.newArrayList(testKryoBuilder.build()));
303 TestUtils.setField(meterStore, "serializer", testSerializer);
304
Pier Luigif094c612017-10-14 12:15:02 +0200305 // Activate the store
alshabibe1248b62015-08-20 17:21:55 -0700306 meterStore.activate();
Pier Luigif094c612017-10-14 12:15:02 +0200307 // Init step for the manager
alshabibe1248b62015-08-20 17:21:55 -0700308 manager = new MeterManager();
Pier Luigif094c612017-10-14 12:15:02 +0200309 // Let's initialize some internal services of the manager
310 TestUtils.setField(manager, "store", meterStore);
alshabibe1248b62015-08-20 17:21:55 -0700311 injectEventDispatcher(manager, new TestEventDispatcher());
Andrea Campanellae3708782017-10-16 16:00:21 +0200312 manager.deviceService = deviceService;
313 manager.mastershipService = new TestMastershipService();
314 manager.cfgService = new ComponentConfigAdapter();
pierventre1b8afbc2020-07-13 14:07:05 +0200315 manager.clusterService = new TestClusterService();
Pier Luigif094c612017-10-14 12:15:02 +0200316 // Init the reference of the registry
alshabibe1248b62015-08-20 17:21:55 -0700317 registry = manager;
Andrea Campanellae3708782017-10-16 16:00:21 +0200318
319 manager.driverService = driverService;
320
Pier Luigif094c612017-10-14 12:15:02 +0200321 // Activate the manager
pierventre1b8afbc2020-07-13 14:07:05 +0200322 Dictionary<String, Object> cfgDict = new Hashtable<>();
pierventre1b8afbc2020-07-13 14:07:05 +0200323 expect(componentContext.getProperties()).andReturn(cfgDict);
324 replay(componentContext);
325 manager.activate(componentContext);
Andrea Campanellae3708782017-10-16 16:00:21 +0200326
pierventre1b8afbc2020-07-13 14:07:05 +0200327 // Initialize the test provider
alshabibe1248b62015-08-20 17:21:55 -0700328 provider = new TestProvider(PID);
Pier Luigif094c612017-10-14 12:15:02 +0200329 // Register the provider against the manager
alshabibe1248b62015-08-20 17:21:55 -0700330 providerService = registry.register(provider);
Pier Luigif094c612017-10-14 12:15:02 +0200331 // Verify register
alshabibe1248b62015-08-20 17:21:55 -0700332 assertTrue("provider should be registered",
333 registry.getProviders().contains(provider.id()));
alshabibe1248b62015-08-20 17:21:55 -0700334 }
335
336 @After
337 public void tearDown() {
Pier Luigif094c612017-10-14 12:15:02 +0200338 // Unregister provider
alshabibe1248b62015-08-20 17:21:55 -0700339 registry.unregister(provider);
Pier Luigif094c612017-10-14 12:15:02 +0200340 // Verify unregister
alshabibe1248b62015-08-20 17:21:55 -0700341 assertFalse("provider should not be registered",
342 registry.getProviders().contains(provider.id()));
Pier Luigif094c612017-10-14 12:15:02 +0200343 // Deactivate manager
alshabibe1248b62015-08-20 17:21:55 -0700344 manager.deactivate();
Pier Luigif094c612017-10-14 12:15:02 +0200345 // Remove event dispatcher
alshabibe1248b62015-08-20 17:21:55 -0700346 injectEventDispatcher(manager, null);
Pier Luigif094c612017-10-14 12:15:02 +0200347 // Deactivate store
348 meterStore.deactivate();
alshabibe1248b62015-08-20 17:21:55 -0700349 }
350
pierventre3b39bd82021-08-18 09:40:14 +0200351 // Store meter features for all the devices
Pier Luigif094c612017-10-14 12:15:02 +0200352 private void initMeterStore() {
Pier Luigif094c612017-10-14 12:15:02 +0200353 meterStore.storeMeterFeatures(mef1);
Pier Luigif094c612017-10-14 12:15:02 +0200354 meterStore.storeMeterFeatures(mef2);
pierventre3b39bd82021-08-18 09:40:14 +0200355 meterStore.storeMeterFeatures(programmableMef1);
356 meterStore.storeMeterFeatures(programmableMef2);
Pier Luigif094c612017-10-14 12:15:02 +0200357 }
358
359 // Emulate metrics coming from the dataplane
360 private void pushMetrics(MeterOperation.Type type, Meter meter) {
Pier Luigif094c612017-10-14 12:15:02 +0200361 if (type == MeterOperation.Type.ADD) {
Pier Luigif094c612017-10-14 12:15:02 +0200362 ((DefaultMeter) meter).setState(MeterState.ADDED);
Pier Luigif094c612017-10-14 12:15:02 +0200363 providerService.pushMeterMetrics(meter.deviceId(), Collections.singletonList(meter));
364 } else {
365 providerService.pushMeterMetrics(meter.deviceId(), Collections.emptyList());
366 }
367 }
368
369 /**
pierventre3b39bd82021-08-18 09:40:14 +0200370 * Verify enabling user defined index mode in meter service.
371 */
372 @Test
373 public void testEnableUserDefinedIndex() {
374 reset(componentContext);
375 Dictionary<String, Object> cfgDict = new Hashtable<>();
376 cfgDict.put(MM_USER_DEFINED_INDEX, true);
377 expect(componentContext.getProperties()).andReturn(cfgDict);
378 replay(componentContext);
379
380 Object returnValue = TestUtils.callMethod(manager, "readComponentConfiguration",
381 ComponentContext.class, componentContext);
382 assertNull(returnValue);
383 assertTrue(manager.userDefinedIndex);
384 }
385
386 /**
387 * Verify disabling user defined index mode in meter service.
388 */
389 @Test
390 public void testDisableUserDefinedIndex() {
391 testEnableUserDefinedIndex();
392
393 reset(componentContext);
394 Dictionary<String, Object> cfgDict = new Hashtable<>();
395 cfgDict.put(MM_USER_DEFINED_INDEX, false);
396 expect(componentContext.getProperties()).andReturn(cfgDict);
397 replay(componentContext);
398
399 Object returnValue = TestUtils.callMethod(manager, "readComponentConfiguration",
400 ComponentContext.class, componentContext);
401 assertNull(returnValue);
402 assertFalse(manager.userDefinedIndex);
403 }
404
405 /**
Pier Luigif094c612017-10-14 12:15:02 +0200406 * Test add meter.
407 */
alshabibe1248b62015-08-20 17:21:55 -0700408 @Test
Pier Luigif094c612017-10-14 12:15:02 +0200409 public void testAdd() {
410 // Init store
411 initMeterStore();
412 // Submit meter request
alshabibe1248b62015-08-20 17:21:55 -0700413 manager.submit(m1Request.add());
Pier Luigif094c612017-10-14 12:15:02 +0200414 // Verify add
pierventre1b8afbc2020-07-13 14:07:05 +0200415 assertEquals("The meter was not added", 1, manager.getAllMeters().size());
416 assertEquals("The meter was not added", 1, manager.getMeters(did1).size());
Pier Luigif094c612017-10-14 12:15:02 +0200417 // Get Meter
418 Meter installingMeter = manager.getMeter(did1, mid1);
419 // Verify add of installingMeter and pending add state
420 assertThat(installingMeter, is(m1));
421 // Verify pending add state
422 assertThat(installingMeter.state(), is(MeterState.PENDING_ADD));
423 // Let's simulate a working data-plane
424 pushMetrics(MeterOperation.Type.ADD, installingMeter);
425 // Get meter
426 Meter installedMeter = manager.getMeter(did1, mid1);
427 // Verify installation
428 assertThat(installedMeter.state(), is(MeterState.ADDED));
pierventre1b8afbc2020-07-13 14:07:05 +0200429 assertEquals("The meter was not installed", 1, manager.getAllMeters().size());
430 assertEquals("The meter was not installed", 1, manager.getMeters(did1).size());
alshabibe1248b62015-08-20 17:21:55 -0700431 }
432
Pier Luigif094c612017-10-14 12:15:02 +0200433 /**
pierventre3b39bd82021-08-18 09:40:14 +0200434 * Test add meter with user defined index.
435 */
436 @Test
437 public void testAddWithUserDefinedIndex() {
438 initMeterStore();
439 testEnableUserDefinedIndex();
440
441 manager.submit(userDefinedRequest.add());
442 assertEquals("The meter was not added", 1, manager.getAllMeters().size());
443 assertEquals("The meter was not added", 1, manager.getMeters(PROGRAMMABLE_DID).size());
444 Meter installingMeter = manager.getMeter(PROGRAMMABLE_DID, cid0);
445 assertThat(installingMeter, is(mUserDefined));
446 assertThat(installingMeter.state(), is(MeterState.PENDING_ADD));
447
448 pushMetrics(MeterOperation.Type.ADD, installingMeter);
449 Meter installedMeter = manager.getMeter(PROGRAMMABLE_DID, cid0);
450 assertThat(installedMeter.state(), is(MeterState.ADDED));
451 assertEquals("The meter was not installed", 1, manager.getAllMeters().size());
452 assertEquals("The meter was not installed", 1, manager.getMeters(PROGRAMMABLE_DID).size());
453 }
454
455 /**
456 * Test wrong add meter.
457 */
458 @Test(expected = IllegalArgumentException.class)
459 public void testWrongAdd() {
460 initMeterStore();
461
462 manager.submit(userDefinedRequest.add());
463 }
464
465 /**
466 * Test wrong add meter in user defined index mode.
467 */
468 @Test(expected = IllegalArgumentException.class)
469 public void testWrongAddInUserDefinedIndexMode() {
470 initMeterStore();
471 testEnableUserDefinedIndex();
472
473 manager.submit(m1Request.add());
474 }
475
476 /**
Pier Luigif094c612017-10-14 12:15:02 +0200477 * Test remove meter.
478 */
alshabibe1248b62015-08-20 17:21:55 -0700479 @Test
480 public void testRemove() {
Pier Luigif094c612017-10-14 12:15:02 +0200481 // Init store
482 initMeterStore();
483 // Submit meter request
alshabibe1248b62015-08-20 17:21:55 -0700484 manager.submit(m1Request.add());
Pier Luigif094c612017-10-14 12:15:02 +0200485 // Withdraw meter
alshabibe1248b62015-08-20 17:21:55 -0700486 manager.withdraw(m1Request.remove(), m1.id());
Pier Luigif094c612017-10-14 12:15:02 +0200487 // Get Meter
488 Meter withdrawingMeter = manager.getMeter(did1, mid1);
489 // Verify withdrawing
490 assertThat(withdrawingMeter.state(), is(MeterState.PENDING_REMOVE));
pierventre1b8afbc2020-07-13 14:07:05 +0200491 assertEquals("The meter was not withdrawn", 1, manager.getAllMeters().size());
492 assertEquals("The meter was not withdrawn", 1, manager.getMeters(did1).size());
Pier Luigif094c612017-10-14 12:15:02 +0200493 // Let's simulate a working data-plane
494 pushMetrics(MeterOperation.Type.REMOVE, withdrawingMeter);
495 // Verify withdrawn
496 assertNull(manager.getMeter(did1, mid1));
pierventre1b8afbc2020-07-13 14:07:05 +0200497 assertEquals("The meter was not removed", 0, manager.getAllMeters().size());
498 assertEquals("The meter was not removed", 0, manager.getMeters(did1).size());
alshabibe1248b62015-08-20 17:21:55 -0700499 }
500
Pier Luigif094c612017-10-14 12:15:02 +0200501 /**
pierventre3b39bd82021-08-18 09:40:14 +0200502 * Test remove meter in user defined index mode.
503 */
504 @Test
505 public void testRemoveInUserDefinedIndexMode() {
506 initMeterStore();
507 testEnableUserDefinedIndex();
508
509 manager.submit(userDefinedRequest.add());
510
511 manager.withdraw(userDefinedRequest.remove(), cid0);
512 Meter withdrawingMeter = manager.getMeter(PROGRAMMABLE_DID, cid0);
513 assertThat(withdrawingMeter.state(), is(MeterState.PENDING_REMOVE));
514 assertEquals("The meter was not withdrawn", 1, manager.getAllMeters().size());
515 assertEquals("The meter was not withdrawn", 1, manager.getMeters(PROGRAMMABLE_DID).size());
516
517 pushMetrics(MeterOperation.Type.REMOVE, withdrawingMeter);
518 assertNull(manager.getMeter(PROGRAMMABLE_DID, cid0));
519 assertEquals("The meter was not removed", 0, manager.getAllMeters().size());
520 assertEquals("The meter was not removed", 0, manager.getMeters(PROGRAMMABLE_DID).size());
521 }
522
523 /**
524 * Test add multiple devices.
Pier Luigif094c612017-10-14 12:15:02 +0200525 */
alshabib70aaa1b2015-09-25 14:30:59 -0700526 @Test
Pier Luigif094c612017-10-14 12:15:02 +0200527 public void testAddMultipleDevice() {
528 // Init store
529 initMeterStore();
530 // Submit meter 1
alshabib70aaa1b2015-09-25 14:30:59 -0700531 manager.submit(m1Request.add());
Pier Luigif094c612017-10-14 12:15:02 +0200532 // Submit meter 2
alshabib70aaa1b2015-09-25 14:30:59 -0700533 manager.submit(m2Request.add());
Pier Luigif094c612017-10-14 12:15:02 +0200534 // Verify add
pierventre1b8afbc2020-07-13 14:07:05 +0200535 assertEquals("The meter was not added", 2, manager.getAllMeters().size());
536 assertEquals("The meter was not added", 1, manager.getMeters(did1).size());
537 assertEquals("The meter was not added", 1, manager.getMeters(did2).size());
Pier Luigif094c612017-10-14 12:15:02 +0200538 // Get Meters
539 Meter installingMeter1 = manager.getMeter(did1, mid1);
540 Meter installingMeter2 = manager.getMeter(did2, mid1);
541 // Verify add of installingMeter
542 assertThat(installingMeter1, is(m1));
543 assertThat(installingMeter2, is(m2));
544 // Verify pending add state
545 assertThat(installingMeter1.state(), is(MeterState.PENDING_ADD));
546 assertThat(installingMeter2.state(), is(MeterState.PENDING_ADD));
547 // Let's simulate a working data-plane
548 pushMetrics(MeterOperation.Type.ADD, installingMeter1);
549 pushMetrics(MeterOperation.Type.ADD, installingMeter2);
550 // Get meter
551 Meter installedMeter1 = manager.getMeter(did1, mid1);
552 Meter installedMeter2 = manager.getMeter(did2, mid1);
553 // Verify installation
554 assertThat(installedMeter1.state(), is(MeterState.ADDED));
555 assertThat(installedMeter2.state(), is(MeterState.ADDED));
pierventre1b8afbc2020-07-13 14:07:05 +0200556 assertEquals("The meter was not installed", 2, manager.getAllMeters().size());
557 assertEquals("The meter was not installed", 1, manager.getMeters(did1).size());
558 assertEquals("The meter was not installed", 1, manager.getMeters(did2).size());
alshabib70aaa1b2015-09-25 14:30:59 -0700559 }
alshabibe1248b62015-08-20 17:21:55 -0700560
Pier Luigif094c612017-10-14 12:15:02 +0200561 /**
pierventre3b39bd82021-08-18 09:40:14 +0200562 * Test remove multiple devices.
Pier Luigif094c612017-10-14 12:15:02 +0200563 */
Jordi Ortizaa8de492016-12-01 00:21:36 +0100564 @Test
Pier Luigif094c612017-10-14 12:15:02 +0200565 public void testRemoveMultipleDevice() {
566 // Init store
567 initMeterStore();
568 // Submit meter 1
Jordi Ortiz6c847762017-01-30 17:13:05 +0100569 manager.submit(m1Request.add());
Pier Luigif094c612017-10-14 12:15:02 +0200570 // Submit meter 2
571 manager.submit(m2Request.add());
572 // Withdraw meter
573 manager.withdraw(m1Request.remove(), m1.id());
574 // Withdraw meter
575 manager.withdraw(m2Request.remove(), m2.id());
576 // Get Meters
577 Meter withdrawingMeter1 = manager.getMeter(did1, mid1);
578 Meter withdrawingMeter2 = manager.getMeter(did2, mid1);
579 // Verify withdrawing
580 assertThat(withdrawingMeter1.state(), is(MeterState.PENDING_REMOVE));
581 assertThat(withdrawingMeter2.state(), is(MeterState.PENDING_REMOVE));
pierventre1b8afbc2020-07-13 14:07:05 +0200582 assertEquals("The meter was not withdrawn", 2, manager.getAllMeters().size());
583 assertEquals("The meter was not withdrawn", 1, manager.getMeters(did1).size());
584 assertEquals("The meter was not withdrawn", 1, manager.getMeters(did2).size());
Pier Luigif094c612017-10-14 12:15:02 +0200585 // Let's simulate a working data-plane
586 pushMetrics(MeterOperation.Type.REMOVE, withdrawingMeter1);
587 pushMetrics(MeterOperation.Type.REMOVE, withdrawingMeter2);
588 // Verify withdrawn
589 assertNull(manager.getMeter(did1, mid1));
590 assertNull(manager.getMeter(did2, mid1));
pierventre1b8afbc2020-07-13 14:07:05 +0200591 assertEquals("The meter was not removed", 0, manager.getAllMeters().size());
592 assertEquals("The meter was not removed", 0, manager.getMeters(did1).size());
593 assertEquals("The meter was not removed", 0, manager.getMeters(did2).size());
594 }
595
596 /**
597 * Test purge meter.
598 */
599 @Test
600 public void testPurge() {
601 // Init store
602 initMeterStore();
603 // Submit meter request
604 manager.submit(m1Request.add());
605 // Verify submit
606 Meter submittingMeter = manager.getMeter(did1, mid1);
607 assertThat(submittingMeter.state(), is(MeterState.PENDING_ADD));
608 assertEquals("The meter was not added", 1, manager.getAllMeters().size());
609 assertEquals("The meter was not added", 1, manager.getMeters(did1).size());
610 // Purge the meters
611 manager.purgeMeters(did1);
612 // Verify purge
613 assertNull(manager.getMeter(did1, mid1));
614 assertEquals("The meter was not purged", 0, manager.getAllMeters().size());
615 assertEquals("The meter was not purged", 0, manager.getMeters(did1).size());
Jordi Ortiz6c847762017-01-30 17:13:05 +0100616 }
617
pierventre3b39bd82021-08-18 09:40:14 +0200618 /**
619 * Test submit for programmable devices.
620 */
Andrea Campanellae3708782017-10-16 16:00:21 +0200621 @Test
622 public void testAddFromMeterProgrammable() {
Andrea Campanellae3708782017-10-16 16:00:21 +0200623 // Init store
624 initMeterStore();
Andrea Campanellae3708782017-10-16 16:00:21 +0200625 manager.submit(mProgrammableRequest.add());
Andrea Campanellae3708782017-10-16 16:00:21 +0200626 TestTools.assertAfter(500, () -> {
pierventre1b8afbc2020-07-13 14:07:05 +0200627 assertEquals("The meter was not added", 1, manager.getAllMeters().size());
Andrea Campanellae3708782017-10-16 16:00:21 +0200628 assertThat(manager.getMeter(PROGRAMMABLE_DID, MeterId.meterId(1)), is(mProgrammable));
629 });
Andrea Campanellae3708782017-10-16 16:00:21 +0200630 }
631
pierventre3b39bd82021-08-18 09:40:14 +0200632 /**
633 * Test batch submission for meter programmable.
634 */
Andrea Campanellae3708782017-10-16 16:00:21 +0200635 @Test
636 public void testAddBatchFromMeterProgrammable() {
Andrea Campanellae3708782017-10-16 16:00:21 +0200637 // Init store
638 initMeterStore();
Andrea Campanellae3708782017-10-16 16:00:21 +0200639 List<MeterOperation> operations = ImmutableList.of(new MeterOperation(mProgrammable, MeterOperation.Type.ADD));
640 manager.defaultProvider().performMeterOperation(PROGRAMMABLE_DID, new MeterOperations(operations));
Andrea Campanellae3708782017-10-16 16:00:21 +0200641 TestTools.assertAfter(500, () -> {
pierventre1b8afbc2020-07-13 14:07:05 +0200642 assertEquals("The meter was not added", 1, meterOperations.size());
643 assertEquals("Wrong Meter Operation", meterOperations.get(0).meter().id(), mProgrammable.id());
Andrea Campanellae3708782017-10-16 16:00:21 +0200644 });
645
646 }
647
pierventre3b39bd82021-08-18 09:40:14 +0200648 /**
649 * Verify get from meter programmable.
650 */
Andrea Campanellae3708782017-10-16 16:00:21 +0200651 @Test
652 public void testGetFromMeterProgrammable() {
Andrea Campanellae3708782017-10-16 16:00:21 +0200653 // Init store
654 initMeterStore();
Andrea Campanellae3708782017-10-16 16:00:21 +0200655 MeterDriverProvider fallback = (MeterDriverProvider) manager.defaultProvider();
Andrea Campanellae3708782017-10-16 16:00:21 +0200656 testAddFromMeterProgrammable();
Andrea Campanellae3708782017-10-16 16:00:21 +0200657 fallback.init(manager.deviceService, fallback.meterProviderService, manager.mastershipService, 1);
Andrea Campanellae3708782017-10-16 16:00:21 +0200658 TestTools.assertAfter(2000, () -> {
pierventre1b8afbc2020-07-13 14:07:05 +0200659 assertEquals("The meter was not added", 1, manager.getAllMeters().size());
Andrea Campanellae3708782017-10-16 16:00:21 +0200660 Meter m = manager.getMeters(PROGRAMMABLE_DID).iterator().next();
661 assertEquals("incorrect state", MeterState.ADDED, m.state());
662 });
Andrea Campanellae3708782017-10-16 16:00:21 +0200663 }
664
pierventre3b39bd82021-08-18 09:40:14 +0200665 /**
666 * Verify installation of missing meters when using meter programmable devices.
667 */
668 @Test
669 public void testMissingFromMeterProgrammable() {
670 // Workaround when running the tests all together
671 meterOperations.clear();
672 testGetFromMeterProgrammable();
673
674 assertThat(meterOperations.size(), is(1));
675 manager.submit(mProgrammableRequest2.add());
676 TestTools.assertAfter(500, () -> {
677 assertEquals("The meter was not added", 2, manager.getAllMeters().size());
678 assertThat(manager.getMeter(PROGRAMMABLE_DID, MeterId.meterId(2)), is(mProgrammable2));
679 assertThat(meterOperations.size(), is(2));
680 assertThat(meterOperations.get(meterOperations.size() - 1), is(new MeterOperation(mProgrammable2,
681 MeterOperation.Type.ADD)));
682 });
683
684 TestTools.assertAfter(2000, () -> {
685 assertEquals("The meter was not added", 2, manager.getAllMeters().size());
686 Meter pendingMeter = manager.getMeter(PROGRAMMABLE_DID, MeterId.meterId(2));
687 assertThat(pendingMeter, is(mProgrammable2));
688 assertEquals("incorrect state", MeterState.PENDING_ADD, pendingMeter.state());
689 assertThat(meterOperations.size(), is(3));
690 assertThat(meterOperations.get(meterOperations.size() - 1), is(new MeterOperation(mProgrammable2,
691 MeterOperation.Type.ADD)));
692 });
693 }
694
695 /**
696 * Verify removal of unknown meters when using meter programmable devices.
697 */
698 @Test
699 public void testUnknownFromMeterProgrammable() {
700 meterOperations.clear();
701 testGetFromMeterProgrammable();
702 TestMeterProgrammable.unknownMeter = true;
703
704 assertThat(meterOperations.size(), is(1));
705 TestTools.assertAfter(2000, () -> {
706 assertEquals("The meter was not added", 1, manager.getAllMeters().size());
707 Meter pendingMeter = manager.getMeter(PROGRAMMABLE_DID, MeterId.meterId(2));
708 assertNull(pendingMeter);
709 assertThat(meterOperations.size(), is(2));
710 assertThat(meterOperations.get(meterOperations.size() - 1), is(new MeterOperation(mProgrammable2,
711 MeterOperation.Type.REMOVE)));
712 });
713 }
714
715 /**
716 * Verify removal of meters when using meter programmable devices.
717 */
718 @Test
719 public void testRemoveFromMeterProgrammable() {
720 testEnableUserDefinedIndex();
721 initMeterStore();
722 MeterDriverProvider fallback = (MeterDriverProvider) manager.defaultProvider();
723 fallback.init(manager.deviceService, fallback.meterProviderService, manager.mastershipService, 1);
724
725 manager.submit(mProgrammableRequest2.withIndex(2L).add());
726 TestTools.assertAfter(500, () -> {
727 assertEquals("The meter was not added", 1, manager.getAllMeters().size());
728 Meter pendingMeter = manager.getMeter(PROGRAMMABLE_DID, MeterId.meterId(2));
729 assertThat(pendingMeter, is(mProgrammable2));
730 assertEquals("incorrect state", MeterState.PENDING_ADD, pendingMeter.state());
731 });
732
733 manager.withdraw(mProgrammableRequest2.remove(), MeterId.meterId(2));
734 TestTools.assertAfter(500, () -> {
735 assertEquals("The meter was not withdrawn", 1, manager.getAllMeters().size());
736 Meter pendingMeter = manager.getMeter(PROGRAMMABLE_DID, MeterId.meterId(2));
737 assertThat(pendingMeter, is(mProgrammable2));
738 assertEquals("incorrect state", MeterState.PENDING_REMOVE, pendingMeter.state());
739 });
740
741 TestTools.assertAfter(2000, () -> {
742 assertEquals("The meter was not removed", 0, manager.getAllMeters().size());
743 Meter pendingMeter = manager.getMeter(PROGRAMMABLE_DID, MeterId.meterId(2));
744 assertNull(pendingMeter);
745 });
746 }
747
Pier Luigif094c612017-10-14 12:15:02 +0200748 // Test cluster service
749 private final class TestClusterService extends ClusterServiceAdapter {
Jordi Ortizaa8de492016-12-01 00:21:36 +0100750
Pier Luigif094c612017-10-14 12:15:02 +0200751 private ControllerNode local = new DefaultControllerNode(NID_LOCAL, LOCALHOST);
Jordi Ortizaa8de492016-12-01 00:21:36 +0100752
Pier Luigif094c612017-10-14 12:15:02 +0200753 @Override
754 public ControllerNode getLocalNode() {
755 return local;
alshabibe1248b62015-08-20 17:21:55 -0700756 }
Pier Luigif094c612017-10-14 12:15:02 +0200757
758 @Override
759 public Set<ControllerNode> getNodes() {
760 return Sets.newHashSet();
761 }
762
alshabibe1248b62015-08-20 17:21:55 -0700763 }
764
Andrea Campanellae3708782017-10-16 16:00:21 +0200765 private static class TestDeviceService extends DeviceServiceAdapter {
766 @Override
767 public int getDeviceCount() {
768 return 1;
769 }
770
771 @Override
772 public Iterable<Device> getDevices() {
773 return ImmutableList.of(PROGRAMMABLE_DEV);
774 }
775
776 @Override
777 public Iterable<Device> getAvailableDevices() {
778 return getDevices();
779 }
780
781 @Override
782 public Device getDevice(DeviceId deviceId) {
783 return PROGRAMMABLE_DEV;
784 }
785 }
786
787 private class TestDriverManager extends DriverManager {
Thomas Vachuska164ecf62018-05-08 17:29:55 -0700788 TestDriverManager(DriverRegistry registry, DeviceService deviceService,
789 NetworkConfigService networkConfigService) {
Andrea Campanellae3708782017-10-16 16:00:21 +0200790 this.registry = registry;
791 this.deviceService = deviceService;
Thomas Vachuska164ecf62018-05-08 17:29:55 -0700792 this.networkConfigService = networkConfigService;
Carmelo Cascone0761cd32018-08-29 19:22:50 -0700793 this.pipeconfService = new PiPipeconfServiceAdapter();
Andrea Campanellae3708782017-10-16 16:00:21 +0200794 activate();
795 }
796 }
797
798 public static class TestMeterQuery extends AbstractHandlerBehaviour
799 implements MeterQuery {
800 private static final long MAX_METER = 0x00000FFF;
801
802 @Override
803 public long getMaxMeters() {
804 return MAX_METER;
805 }
806 }
807
808 private static List<MeterOperation> meterOperations = new ArrayList<>();
809
810 public static class TestMeterProgrammable extends AbstractHandlerBehaviour
811 implements MeterProgrammable {
812
pierventre3b39bd82021-08-18 09:40:14 +0200813 private static boolean unknownMeter;
814
Andrea Campanellae3708782017-10-16 16:00:21 +0200815 @Override
816 public CompletableFuture<Boolean> performMeterOperation(MeterOperation meterOp) {
817 return CompletableFuture.completedFuture(meterOperations.add(meterOp));
818 }
819
820 @Override
821 public CompletableFuture<Collection<Meter>> getMeters() {
822 //ADD METER
pierventre3b39bd82021-08-18 09:40:14 +0200823 Collection<Meter> meters = Lists.newArrayList();
Andrea Campanellae3708782017-10-16 16:00:21 +0200824 DefaultMeter mProgrammableAdded = (DefaultMeter) mProgrammable;
825 mProgrammableAdded.setState(MeterState.ADDED);
pierventre3b39bd82021-08-18 09:40:14 +0200826 meters.add(mProgrammableAdded);
827 if (unknownMeter) {
828 DefaultMeter mProgrammable2Added = (DefaultMeter) mProgrammable2;
829 mProgrammable2Added.setState(MeterState.ADDED);
830 meters.add(mProgrammable2Added);
831 }
832 return CompletableFuture.completedFuture(meters);
Andrea Campanellae3708782017-10-16 16:00:21 +0200833 }
Wailok Shumf013a782021-07-26 16:51:01 +0800834
835 @Override
836 public CompletableFuture<Collection<MeterFeatures>> getMeterFeatures() {
837 //Currently unused.
838 return CompletableFuture.completedFuture(Collections.emptySet());
839 }
Andrea Campanellae3708782017-10-16 16:00:21 +0200840 }
841
alshabibe1248b62015-08-20 17:21:55 -0700842 private class TestProvider extends AbstractProvider implements MeterProvider {
843
844 protected TestProvider(ProviderId id) {
845 super(PID);
846 }
847
848 @Override
849 public void performMeterOperation(DeviceId deviceId, MeterOperations meterOps) {
850 //Currently unused.
851 }
852
853 @Override
854 public void performMeterOperation(DeviceId deviceId, MeterOperation meterOp) {
Pier Luigif094c612017-10-14 12:15:02 +0200855 //Currently unused
alshabibe1248b62015-08-20 17:21:55 -0700856 }
857 }
858
Pier Luigif094c612017-10-14 12:15:02 +0200859 // Test mastership service
860 private final class TestMastershipService extends MastershipServiceAdapter {
alshabibe1248b62015-08-20 17:21:55 -0700861 @Override
862 public NodeId getMasterFor(DeviceId deviceId) {
863 return NID_LOCAL;
864 }
Andrea Campanellae3708782017-10-16 16:00:21 +0200865
866 @Override
867 public MastershipRole getLocalRole(DeviceId deviceId) {
868 return MastershipRole.MASTER;
869 }
alshabibe1248b62015-08-20 17:21:55 -0700870 }
Pier Luigif094c612017-10-14 12:15:02 +0200871
alshabibe1248b62015-08-20 17:21:55 -0700872}