blob: fa974aeac7231e7f1ed12846b6fc70b996228d8a [file] [log] [blame]
Andrea Campanellae72ac552016-04-11 10:04:52 -07001/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2016-present Open Networking Foundation
Andrea Campanellae72ac552016-04-11 10:04:52 -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 */
16
Andrea Campanella637c8072016-04-12 17:29:17 -070017package org.onosproject.faultmanagement.impl;
Andrea Campanellae72ac552016-04-11 10:04:52 -070018
19import com.google.common.collect.ImmutableList;
Jordan Halterman0a2bd452018-06-13 17:24:58 -070020import com.google.common.collect.ImmutableMap;
Andrea Campanellae72ac552016-04-11 10:04:52 -070021import com.google.common.collect.ImmutableSet;
22import org.junit.Before;
23import org.junit.Test;
24import org.onlab.osgi.ComponentContextAdapter;
25import org.onlab.packet.ChassisId;
fahadnaeemkhan8ee2be92018-02-08 17:42:08 -080026import org.onosproject.cfg.ComponentConfigAdapter;
27import org.onosproject.cfg.ComponentConfigService;
Andrea Campanellae72ac552016-04-11 10:04:52 -070028import org.onosproject.cluster.NodeId;
Thomas Vachuska52f2cd12018-11-08 21:20:04 -080029import org.onosproject.alarm.Alarm;
30import org.onosproject.alarm.AlarmConsumer;
31import org.onosproject.alarm.AlarmId;
32import org.onosproject.alarm.AlarmProvider;
33import org.onosproject.alarm.AlarmProviderRegistry;
34import org.onosproject.alarm.AlarmProviderRegistryAdapter;
35import org.onosproject.alarm.AlarmProviderService;
36import org.onosproject.alarm.DefaultAlarm;
Andrea Campanellae72ac552016-04-11 10:04:52 -070037import org.onosproject.mastership.MastershipEvent;
Jordan Halterman0a2bd452018-06-13 17:24:58 -070038import org.onosproject.mastership.MastershipInfo;
Andrea Campanellae72ac552016-04-11 10:04:52 -070039import org.onosproject.mastership.MastershipListener;
40import org.onosproject.mastership.MastershipService;
41import org.onosproject.mastership.MastershipServiceAdapter;
42import org.onosproject.net.AbstractProjectableModel;
43import org.onosproject.net.Annotations;
44import org.onosproject.net.DefaultAnnotations;
45import org.onosproject.net.DefaultDevice;
46import org.onosproject.net.Device;
47import org.onosproject.net.DeviceId;
48import org.onosproject.net.device.DeviceEvent;
49import org.onosproject.net.device.DeviceListener;
50import org.onosproject.net.device.DeviceService;
51import org.onosproject.net.device.DeviceServiceAdapter;
52import org.onosproject.net.driver.AbstractHandlerBehaviour;
53import org.onosproject.net.driver.Behaviour;
54import org.onosproject.net.driver.Driver;
55import org.onosproject.net.driver.DriverAdapter;
56import org.onosproject.net.driver.DriverHandler;
57import org.onosproject.net.driver.DriverServiceAdapter;
58import org.onosproject.net.provider.ProviderId;
59import org.osgi.service.component.ComponentContext;
60
61import java.io.IOException;
62import java.util.Collection;
63import java.util.Dictionary;
64import java.util.Enumeration;
65import java.util.HashMap;
66import java.util.HashSet;
67import java.util.List;
Jordan Halterman0a2bd452018-06-13 17:24:58 -070068import java.util.Optional;
Andrea Campanellae72ac552016-04-11 10:04:52 -070069import java.util.Set;
70
71import static org.junit.Assert.*;
72import static org.onlab.junit.TestTools.assertAfter;
73
74/**
75 * Test for the polling alarm provider based on the driver subsystem.
76 */
77public class PollingAlarmProviderTest {
78
79 private final DeviceService deviceService = new MockDeviceService();
80
81 private final MastershipService mastershipService = new MockMastershipService();
82
83 private final AlarmProviderRegistry providerRegistry = new MockDeviceProviderRegistry();
84
85 private final AlarmProviderService alarmProviderService = new MockAlarmProviderService();
86
fahadnaeemkhan8ee2be92018-02-08 17:42:08 -080087 private final ComponentConfigService cfgService = new ComponentConfigAdapter();
88
Andrea Campanellae72ac552016-04-11 10:04:52 -070089 private final ComponentContext context = new MockComponentContext();
90
91 private static final DeviceId DEVICE_ID = DeviceId.deviceId("foo:1.1.1.1:1");
92
93 private Device device = new MockDevice(ProviderId.NONE, DEVICE_ID, Device.Type.OTHER,
94 "foo.inc", "0", "0", "0", null,
95 DefaultAnnotations.builder().build());
96
97 private final NodeId nodeId = NodeId.nodeId("fooNode");
98
99 private final MastershipEvent mastershipEvent =
100 new MastershipEvent(MastershipEvent.Type.MASTER_CHANGED, DEVICE_ID,
Jordan Halterman0a2bd452018-06-13 17:24:58 -0700101 new MastershipInfo(1, Optional.of(nodeId), ImmutableMap.of()));
Andrea Campanellae72ac552016-04-11 10:04:52 -0700102
103 private final DeviceEvent deviceEvent =
104 new DeviceEvent(DeviceEvent.Type.DEVICE_AVAILABILITY_CHANGED, device);
105
Andrea Campanella65f9eb92017-05-02 11:36:14 -0700106 private static final String UNIQUE_ID_1 = "unique_id_1";
Saritha2f148f02017-05-09 15:57:38 +0530107 private static final AlarmId A_ID = AlarmId.alarmId(DEVICE_ID, UNIQUE_ID_1);
Andrea Campanella65f9eb92017-05-02 11:36:14 -0700108 private static final DefaultAlarm ALARM = new DefaultAlarm.Builder(A_ID,
Andrea Campanellae72ac552016-04-11 10:04:52 -0700109 DEVICE_ID, "aaa", Alarm.SeverityLevel.CRITICAL, 0).build();
110
111 private final Driver driver = new MockDriver();
112
113 private PollingAlarmProvider provider = new PollingAlarmProvider();
114 private Set<DeviceListener> deviceListeners = new HashSet<>();
115 private Set<MastershipListener> mastershipListeners = new HashSet<>();
116 private HashMap<DeviceId, Collection<Alarm>> alarmStore = new HashMap<>();
117
118 @Before
119 public void setUp() {
120 provider.providerRegistry = providerRegistry;
121 provider.deviceService = deviceService;
122 provider.mastershipService = mastershipService;
fahadnaeemkhan8ee2be92018-02-08 17:42:08 -0800123 provider.cfgService = cfgService;
Andrea Campanellae72ac552016-04-11 10:04:52 -0700124 AbstractProjectableModel.setDriverService(null, new DriverServiceAdapter());
125 provider.activate(context);
126 }
127
128 @Test
129 public void activate() throws Exception {
Yuta HIGUCHIfbd9ae92018-01-24 23:39:06 -0800130 assertFalse("Provider should be registered", providerRegistry.getProviders().contains(provider.id()));
Andrea Campanellae72ac552016-04-11 10:04:52 -0700131 assertEquals("Device listener should be added", 1, deviceListeners.size());
132 assertEquals("Incorrect alarm provider service", alarmProviderService, provider.providerService);
133 assertEquals("Mastership listener should be added", 1, mastershipListeners.size());
134 assertEquals("Incorrect polling frequency", 1, provider.alarmPollFrequencySeconds);
135 assertFalse("Executor should be running", provider.alarmsExecutor.isShutdown());
136 provider.activate(null);
137 assertEquals("Incorrect polling frequency, should be default", 60, provider.alarmPollFrequencySeconds);
138 }
139
140 @Test
141 public void deactivate() throws Exception {
142 provider.deactivate();
143 assertEquals("Device listener should be removed", 0, deviceListeners.size());
144 assertEquals("Mastership listener should be removed", 0, mastershipListeners.size());
Yuta HIGUCHIfbd9ae92018-01-24 23:39:06 -0800145 assertFalse("Provider should not be registered", providerRegistry.getProviders().contains(provider.id()));
Andrea Campanellae72ac552016-04-11 10:04:52 -0700146 assertTrue(provider.alarmsExecutor.isShutdown());
147 assertNull(provider.providerService);
148 }
149
150 @Test
151 public void modified() throws Exception {
152 provider.modified(null);
153 assertEquals("Incorrect polling frequency", 1, provider.alarmPollFrequencySeconds);
154 provider.activate(null);
155 provider.modified(context);
156 assertEquals("Incorrect polling frequency", 1, provider.alarmPollFrequencySeconds);
157 }
158
159 @Test
160 public void alarmsPresent() throws IOException {
161 assertAfter(1100, () -> {
162 assertTrue("Alarms should be added", alarmStore.containsKey(DEVICE_ID));
163 assertTrue("Alarms should be added", alarmStore.get(DEVICE_ID).contains(ALARM));
164 });
165 }
166
167 @Test
168 public void mastershipListenerEvent() throws Exception {
169 assertTrue("Incorrect relevant event", provider.mastershipListener
170 .isRelevant(mastershipEvent));
171 provider.mastershipListener.event(mastershipEvent);
172 assertAfter(1100, () -> {
173 assertTrue("Alarms should be added", alarmStore.containsKey(DEVICE_ID));
174 });
175 }
176
177 @Test
178 public void deviceListenerEvent() throws Exception {
179 assertTrue("Incorrect relevant event", provider.deviceListener
180 .isRelevant(deviceEvent));
181 provider.deviceListener.event(deviceEvent);
182 assertAfter(1100, () -> {
183 assertTrue("Alarms should be added", alarmStore.containsKey(DEVICE_ID));
184 });
185 }
186
187 //TODO add test for modified context and event handling form device listener.
188
189 private class MockDeviceService extends DeviceServiceAdapter {
190
191 @Override
192 public Device getDevice(DeviceId did) {
193 if (did.equals(DEVICE_ID)) {
194 return device;
195 }
196 return null;
197 }
198
199 @Override
200 public Iterable<Device> getAvailableDevices() {
201 return ImmutableSet.of(device);
202 }
203
204 @Override
205 public boolean isAvailable(DeviceId did) {
206 return did.equals(DEVICE_ID);
207 }
208
209 @Override
210 public void addListener(DeviceListener listener) {
211 deviceListeners.add(listener);
212 }
213
214 @Override
215 public void removeListener(DeviceListener listener) {
216 deviceListeners.remove(listener);
217 }
218 }
219
220 private class MockMastershipService extends MastershipServiceAdapter {
221
222 @Override
223 public boolean isLocalMaster(DeviceId deviceId) {
224 return true;
225 }
226
227 @Override
228 public void addListener(MastershipListener listener) {
229 mastershipListeners.add(listener);
230 }
231
232 @Override
233 public void removeListener(MastershipListener listener) {
234 mastershipListeners.remove(listener);
235 }
236 }
237
238 private class MockDeviceProviderRegistry extends AlarmProviderRegistryAdapter {
239
240 Set<ProviderId> providers = new HashSet<>();
241
242 @Override
243 public AlarmProviderService register(AlarmProvider provider) {
244 return alarmProviderService;
245 }
246
247 @Override
248 public void unregister(AlarmProvider provider) {
249 providers.remove(provider.id());
250 }
251
252 @Override
253 public Set<ProviderId> getProviders() {
254 return providers;
255 }
256
257 }
258
259 private class MockAlarmProviderService implements AlarmProviderService {
260
261 @Override
262 public void updateAlarmList(DeviceId deviceId, Collection<Alarm> alarms) {
263 if (alarmStore.containsKey(deviceId)) {
264 Collection<Alarm> deviceAlarms = alarmStore.get(deviceId);
265 deviceAlarms.addAll(alarms);
266 alarmStore.put(deviceId, deviceAlarms);
267 } else {
268 alarmStore.put(deviceId, alarms);
269 }
270
271 }
272
273 @Override
274 public AlarmProvider provider() {
275 return null;
276 }
277 }
278
279 private class MockComponentContext extends ComponentContextAdapter {
280 @Override
281 public Dictionary getProperties() {
282 return new MockDictionary();
283 }
284 }
285
286 private class MockDictionary extends Dictionary {
287
288 @Override
289 public int size() {
290 return 0;
291 }
292
293 @Override
294 public boolean isEmpty() {
295 return false;
296 }
297
298 @Override
299 public Enumeration keys() {
300 return null;
301 }
302
303 @Override
304 public Enumeration elements() {
305 return null;
306 }
307
308 @Override
309 public Object get(Object key) {
Ray Milkey4694e062018-10-31 13:17:18 -0700310 if (OsgiPropertyConstants.POLL_FREQUENCY_SECONDS.equals(key)) {
Andrea Campanellae72ac552016-04-11 10:04:52 -0700311 return "1";
312 }
313 return null;
314 }
315
316 @Override
317 public Object put(Object key, Object value) {
318 return null;
319 }
320
321 @Override
322 public Object remove(Object key) {
323 return null;
324 }
325 }
326
327 private class MockDevice extends DefaultDevice {
328 /**
329 * Creates a network element attributed to the specified provider.
330 *
331 * @param providerId identity of the provider
332 * @param id device identifier
333 * @param type device type
334 * @param manufacturer device manufacturer
335 * @param hwVersion device HW version
336 * @param swVersion device SW version
337 * @param serialNumber device serial number
338 * @param chassisId chassis id
339 * @param annotations optional key/value annotations
340 */
341 public MockDevice(ProviderId providerId, DeviceId id, Type type,
342 String manufacturer, String hwVersion, String swVersion,
343 String serialNumber, ChassisId chassisId, Annotations... annotations) {
344 super(providerId, id, type, manufacturer, hwVersion, swVersion, serialNumber,
345 chassisId, annotations);
346 }
347
348 @Override
349 protected Driver locateDriver() {
350 return driver;
351 }
352
353 @Override
354 public Driver driver() {
355 return driver;
356 }
357 }
358
359 private class MockDriver extends DriverAdapter {
360 @Override
361 public <T extends Behaviour> T createBehaviour(DriverHandler handler, Class<T> behaviourClass) {
362 return (T) new TestAlarmConsumer();
363 }
364 }
365
366 private class TestAlarmConsumer extends AbstractHandlerBehaviour implements AlarmConsumer {
367
368 @Override
369 public List<Alarm> consumeAlarms() {
370 return ImmutableList.of(ALARM);
371 }
372 }
373
374}