blob: 9831fc43e52033d70d1453c2d281c58f265cac15 [file] [log] [blame]
Andrea Campanella8e94b0c2016-04-12 13:58:07 -07001/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2016-present Open Networking Foundation
Andrea Campanella8e94b0c2016-04-12 13:58:07 -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 */
16package org.onosproject.faultmanagement.impl;
17
18import com.google.common.collect.ImmutableSet;
19import com.google.common.collect.Lists;
20import org.junit.Before;
21import org.junit.Rule;
22import org.junit.Test;
23import org.junit.rules.ExpectedException;
24import org.onlab.junit.TestTools;
25import org.onlab.junit.TestUtils;
26import org.onlab.util.ItemNotFoundException;
27import org.onosproject.common.event.impl.TestEventDispatcher;
28import org.onosproject.event.Event;
Thomas Vachuska52f2cd12018-11-08 21:20:04 -080029import org.onosproject.alarm.Alarm;
30import org.onosproject.alarm.AlarmEntityId;
31import org.onosproject.alarm.AlarmEvent;
32import org.onosproject.alarm.AlarmId;
33import org.onosproject.alarm.AlarmListener;
34import org.onosproject.alarm.AlarmProvider;
35import org.onosproject.alarm.AlarmProviderRegistry;
36import org.onosproject.alarm.AlarmProviderService;
37import org.onosproject.alarm.DefaultAlarm;
Andrea Campanella5a4df1e2017-10-24 13:46:56 +020038import org.onosproject.mastership.MastershipService;
39import org.onosproject.mastership.MastershipServiceAdapter;
40import org.onosproject.net.DefaultAnnotations;
41import org.onosproject.net.DefaultDevice;
42import org.onosproject.net.Device;
Andrea Campanella8e94b0c2016-04-12 13:58:07 -070043import org.onosproject.net.DeviceId;
Andrea Campanella65f9eb92017-05-02 11:36:14 -070044import org.onosproject.net.MastershipRole;
Andrea Campanella8e94b0c2016-04-12 13:58:07 -070045import org.onosproject.net.NetTestTools;
Andrea Campanella5a4df1e2017-10-24 13:46:56 +020046import org.onosproject.net.device.DeviceEvent;
47import org.onosproject.net.device.DeviceListener;
48import org.onosproject.net.device.DeviceServiceAdapter;
Andrea Campanella65f9eb92017-05-02 11:36:14 -070049import org.onosproject.net.provider.AbstractProvider;
Andrea Campanella8e94b0c2016-04-12 13:58:07 -070050import org.onosproject.store.service.TestStorageService;
51
52import java.util.Collections;
53import java.util.HashMap;
54import java.util.List;
55import java.util.Map;
56
57import static junit.framework.TestCase.assertFalse;
58import static org.junit.Assert.assertEquals;
59import static org.junit.Assert.assertTrue;
Thomas Vachuska52f2cd12018-11-08 21:20:04 -080060import static org.onosproject.alarm.Alarm.SeverityLevel.CLEARED;
61import static org.onosproject.alarm.Alarm.SeverityLevel.CRITICAL;
Andrea Campanella65f9eb92017-05-02 11:36:14 -070062import static org.onosproject.net.NetTestTools.PID;
Andrea Campanella8e94b0c2016-04-12 13:58:07 -070063
64/**
65 * Alarm manager test suite.
66 */
67public class AlarmManagerTest {
68
69 private static final DeviceId DEVICE_ID = DeviceId.deviceId("foo:bar");
Andrea Campanella5a4df1e2017-10-24 13:46:56 +020070
Andrea Campanella65f9eb92017-05-02 11:36:14 -070071 private static final String UNIQUE_ID_1 = "unique_id_1";
72 private static final String UNIQUE_ID_2 = "unique_id_2";
73 private static final AlarmId A_ID = AlarmId.alarmId(DEVICE_ID, UNIQUE_ID_1);
74 private static final AlarmId B_ID = AlarmId.alarmId(DEVICE_ID, UNIQUE_ID_2);
75 private static final DefaultAlarm ALARM_A = new DefaultAlarm.Builder(A_ID,
Andrea Campanella8e94b0c2016-04-12 13:58:07 -070076 DEVICE_ID, "aaa", Alarm.SeverityLevel.CRITICAL, 0).build();
77
Andrea Campanella65f9eb92017-05-02 11:36:14 -070078 private static final DefaultAlarm ALARM_A_CLEARED = new DefaultAlarm.Builder(ALARM_A)
79 .clear().build();
80
Andrea Campanella8e94b0c2016-04-12 13:58:07 -070081 private static final DefaultAlarm ALARM_A_WITHSRC = new DefaultAlarm.Builder(
82 ALARM_A).forSource(AlarmEntityId.alarmEntityId("port:foo")).build();
83
Andrea Campanella65f9eb92017-05-02 11:36:14 -070084 private static final DefaultAlarm ALARM_B = new DefaultAlarm.Builder(B_ID,
Andrea Campanella8e94b0c2016-04-12 13:58:07 -070085 DEVICE_ID, "bbb", Alarm.SeverityLevel.CRITICAL, 0).build();
86
Andrea Campanella65f9eb92017-05-02 11:36:14 -070087
Andrea Campanella8e94b0c2016-04-12 13:58:07 -070088 private AlarmManager manager;
89 private DistributedAlarmStore alarmStore;
Andrea Campanella65f9eb92017-05-02 11:36:14 -070090 private AlarmProviderService providerService;
91 private TestProvider provider;
92 protected AlarmProviderRegistry registry;
Andrea Campanella8e94b0c2016-04-12 13:58:07 -070093 protected TestListener listener = new TestListener();
Andrea Campanella5a4df1e2017-10-24 13:46:56 +020094 private final MastershipService mastershipService = new MockMastershipService();
95 protected final MockDeviceService deviceService = new MockDeviceService();
96
97 private final Device device = new MockDevice(DEVICE_ID);
Andrea Campanella8e94b0c2016-04-12 13:58:07 -070098
99 @Rule
100 public final ExpectedException exception = ExpectedException.none();
101
102 @Before
103 public void setUp() throws Exception {
104 alarmStore = new DistributedAlarmStore();
105 TestUtils.setField(alarmStore, "storageService", new TestStorageService());
106 alarmStore.activate();
107 manager = new AlarmManager();
Andrea Campanella65f9eb92017-05-02 11:36:14 -0700108 registry = manager;
Andrea Campanella8e94b0c2016-04-12 13:58:07 -0700109 manager.addListener(listener);
110 NetTestTools.injectEventDispatcher(manager, new TestEventDispatcher());
Andrea Campanella5a4df1e2017-10-24 13:46:56 +0200111 manager.deviceService = deviceService;
112 manager.mastershipService = mastershipService;
Andrea Campanella8e94b0c2016-04-12 13:58:07 -0700113 manager.store = alarmStore;
114 manager.activate();
Andrea Campanella65f9eb92017-05-02 11:36:14 -0700115 provider = new TestProvider();
116 providerService = registry.register(provider);
Andrea Campanella8e94b0c2016-04-12 13:58:07 -0700117 }
118
119 @Test
120 public void deactivate() throws Exception {
Andrea Campanella65f9eb92017-05-02 11:36:14 -0700121 providerService.updateAlarmList(DEVICE_ID, ImmutableSet.of(ALARM_B, ALARM_A));
Andrea Campanella8e94b0c2016-04-12 13:58:07 -0700122 verifyGettingSetsOfAlarms(manager, 2, 2);
123 alarmStore.deactivate();
124 manager.removeListener(listener);
125 manager.deactivate();
126 NetTestTools.injectEventDispatcher(manager, null);
127 assertFalse("Store should not have delegate", alarmStore.hasDelegate());
128 }
129
130 @Test
131 public void testGettersWhenNoAlarms() {
132
133 assertTrue("No alarms should be present", manager.getAlarms().isEmpty());
134 assertTrue("No active alarms should be present", manager.getActiveAlarms().isEmpty());
135 assertTrue("The map should be empty per unknown device",
136 manager.getAlarmCounts(DeviceId.NONE).keySet().isEmpty());
137 assertTrue("The counts should be empty", manager.getAlarmCounts().keySet().isEmpty());
138
139 assertEquals("Incorrect number of alarms for unknown device",
140 0, manager.getAlarms(DeviceId.NONE).size());
141 assertEquals("Incorrect number of major alarms for unknown device",
142 0, manager.getAlarms(Alarm.SeverityLevel.MAJOR).size());
143
144 exception.expect(NullPointerException.class);
145 manager.getAlarm(null);
146
147 exception.expect(ItemNotFoundException.class);
Andrea Campanella65f9eb92017-05-02 11:36:14 -0700148 manager.getAlarm(AlarmId.alarmId(DEVICE_ID, "unique_3"));
Andrea Campanella8e94b0c2016-04-12 13:58:07 -0700149 }
150
151 @Test
152 public void testAlarmUpdates() throws InterruptedException {
153
154 assertTrue("No alarms should be present", manager.getAlarms().isEmpty());
Andrea Campanella65f9eb92017-05-02 11:36:14 -0700155 providerService.updateAlarmList(DEVICE_ID, ImmutableSet.of());
Andrea Campanella8e94b0c2016-04-12 13:58:07 -0700156 assertTrue("No alarms should be present", manager.getAlarms().isEmpty());
157 Map<Alarm.SeverityLevel, Long> zeroAlarms = new CountsMapBuilder().create();
158 assertEquals("No alarms count should be present", zeroAlarms, manager.getAlarmCounts());
159 assertEquals("No alarms count should be present", zeroAlarms, manager.getAlarmCounts(DEVICE_ID));
160
Andrea Campanella65f9eb92017-05-02 11:36:14 -0700161 providerService.updateAlarmList(DEVICE_ID, ImmutableSet.of(ALARM_B, ALARM_A));
Andrea Campanella8e94b0c2016-04-12 13:58:07 -0700162 verifyGettingSetsOfAlarms(manager, 2, 2);
163 validateEvents(AlarmEvent.Type.CREATED, AlarmEvent.Type.CREATED);
164 Map<Alarm.SeverityLevel, Long> critical2 = new CountsMapBuilder().with(CRITICAL, 2L).create();
165 assertEquals("A critical should be present", critical2, manager.getAlarmCounts());
166 assertEquals("A critical should be present", critical2, manager.getAlarmCounts(DEVICE_ID));
167
Andrea Campanella65f9eb92017-05-02 11:36:14 -0700168 Alarm updated = manager.updateBookkeepingFields(ALARM_A.id(), true, false, null);
169// providerService.updateAlarmList(DEVICE_ID, ImmutableSet.of(ALARM_A));
Andrea Campanella8e94b0c2016-04-12 13:58:07 -0700170 verifyGettingSetsOfAlarms(manager, 2, 1);
Andrea Campanella65f9eb92017-05-02 11:36:14 -0700171 validateEvents(AlarmEvent.Type.UPDATED);
Andrea Campanella8e94b0c2016-04-12 13:58:07 -0700172 Map<Alarm.SeverityLevel, Long> critical1cleared1 =
173 new CountsMapBuilder().with(CRITICAL, 1L).with(CLEARED, 1L).create();
174 assertEquals("A critical should be present and cleared", critical1cleared1,
175 manager.getAlarmCounts());
176 assertEquals("A critical should be present and cleared", critical1cleared1,
177 manager.getAlarmCounts(DEVICE_ID));
178
179 // No change map when same alarms sent
Andrea Campanella65f9eb92017-05-02 11:36:14 -0700180 providerService.updateAlarmList(DEVICE_ID, ImmutableSet.of(updated));
Andrea Campanella8e94b0c2016-04-12 13:58:07 -0700181 verifyGettingSetsOfAlarms(manager, 2, 1);
182 validateEvents();
183 assertEquals("Map should not be changed for same alarm", critical1cleared1,
184 manager.getAlarmCounts());
185 assertEquals("Map should not be changed for same alarm", critical1cleared1,
186 manager.getAlarmCounts(DEVICE_ID));
187
Andrea Campanella65f9eb92017-05-02 11:36:14 -0700188 providerService.updateAlarmList(DEVICE_ID, ImmutableSet.of(updated, ALARM_A_WITHSRC));
189 verifyGettingSetsOfAlarms(manager, 2, 2);
190 validateEvents(AlarmEvent.Type.UPDATED);
Andrea Campanella8e94b0c2016-04-12 13:58:07 -0700191 Map<Alarm.SeverityLevel, Long> critical2cleared1 =
Andrea Campanella65f9eb92017-05-02 11:36:14 -0700192 new CountsMapBuilder().with(CRITICAL, 2L).create();
Andrea Campanella8e94b0c2016-04-12 13:58:07 -0700193 assertEquals("A critical should be present", critical2cleared1, manager.getAlarmCounts());
194 assertEquals("A critical should be present", critical2cleared1, manager.getAlarmCounts(DEVICE_ID));
195
Andrea Campanella65f9eb92017-05-02 11:36:14 -0700196 providerService.updateAlarmList(DEVICE_ID, ImmutableSet.of());
197 verifyGettingSetsOfAlarms(manager, 2, 2);
198 validateEvents();
199 assertEquals(new CountsMapBuilder().with(CRITICAL, 2L).create(),
200 manager.getAlarmCounts(DEVICE_ID));
Andrea Campanella8e94b0c2016-04-12 13:58:07 -0700201
202 assertEquals("The counts should be empty for unknown devices", zeroAlarms,
203 manager.getAlarmCounts(DeviceId.NONE));
204 assertEquals("The counts should be empty for unknown devices", zeroAlarms,
205 manager.getAlarmCounts(DeviceId.deviceId("junk:junk")));
206
207 }
208
Andrea Campanella5a4df1e2017-10-24 13:46:56 +0200209 @Test
210 public void testRemoveWhenDeviceRemoved() {
211 providerService.updateAlarmList(DEVICE_ID, ImmutableSet.of(ALARM_B, ALARM_A));
212 verifyGettingSetsOfAlarms(manager, 2, 2);
213 validateEvents(AlarmEvent.Type.CREATED, AlarmEvent.Type.CREATED);
214 Map<Alarm.SeverityLevel, Long> critical2 = new CountsMapBuilder().with(CRITICAL, 2L).create();
215 assertEquals("A critical should be present", critical2, manager.getAlarmCounts());
216 assertEquals("A critical should be present", critical2, manager.getAlarmCounts(DEVICE_ID));
217 deviceService.deviceListener.event(new DeviceEvent(DeviceEvent.Type.DEVICE_REMOVED, device));
218 Map<Alarm.SeverityLevel, Long> zeroAlarms = new CountsMapBuilder().create();
219 assertEquals("The counts should be empty for removed device", zeroAlarms,
220 manager.getAlarmCounts(DEVICE_ID));
221
222 }
223
Andrea Campanella8e94b0c2016-04-12 13:58:07 -0700224 private void verifyGettingSetsOfAlarms(AlarmManager am, int expectedTotal, int expectedActive) {
225 assertEquals("Incorrect total alarms", expectedTotal, am.getAlarms().size());
226 assertEquals("Incorrect active alarms count", expectedActive, am.getActiveAlarms().size());
227 }
228
229 /**
230 * Method to validate that actual versus expected device key events were
231 * received correctly.
232 *
233 * @param types expected device key events.
234 */
235 private void validateEvents(Enum... types) {
236 TestTools.assertAfter(100, () -> {
237 int i = 0;
238 assertEquals("wrong events received", types.length, listener.events.size());
239 for (Event event : listener.events) {
240 assertEquals("incorrect event type", types[i], event.type());
241 i++;
242 }
243 listener.events.clear();
244 });
245 }
246
247 private static class CountsMapBuilder {
248
249 private final Map<Alarm.SeverityLevel, Long> map = new HashMap<>();
250
251 public CountsMapBuilder with(Alarm.SeverityLevel sev, Long count) {
252 map.put(sev, count);
253 return this;
254 }
255
256 public Map<Alarm.SeverityLevel, Long> create() {
257 return Collections.unmodifiableMap(map);
258 }
259 }
260
261
Andrea Campanella5a4df1e2017-10-24 13:46:56 +0200262 private class MockDeviceService extends DeviceServiceAdapter {
263 DeviceListener deviceListener = null;
264
265 @Override
266 public void addListener(DeviceListener listener) {
267 this.deviceListener = listener;
268 }
269
270 @Override
271 public void removeListener(DeviceListener listener) {
272 this.deviceListener = null;
273 }
274 }
275
276
Andrea Campanella65f9eb92017-05-02 11:36:14 -0700277 private class TestProvider extends AbstractProvider implements AlarmProvider {
278 private DeviceId deviceReceived;
279 private MastershipRole roleReceived;
280
281 public TestProvider() {
282 super(PID);
283 }
284
285 @Override
286 public void triggerProbe(DeviceId deviceId) {
287 }
288 }
289
Andrea Campanella5a4df1e2017-10-24 13:46:56 +0200290 private class MockMastershipService extends MastershipServiceAdapter {
291 int test = 0;
292 @Override
293 public boolean isLocalMaster(DeviceId deviceId) {
294 return true;
295 }
296 }
297
Andrea Campanella8e94b0c2016-04-12 13:58:07 -0700298 /**
299 * Test listener class to receive alarm events.
300 */
301 private static class TestListener implements AlarmListener {
302
303 protected List<AlarmEvent> events = Lists.newArrayList();
304
305 @Override
306 public void event(AlarmEvent event) {
307 events.add(event);
308 }
309
310 }
Andrea Campanella5a4df1e2017-10-24 13:46:56 +0200311
312 private class MockDevice extends DefaultDevice {
313
314 MockDevice(DeviceId id) {
315 super(null, id, null, null, null, null, null,
316 null, DefaultAnnotations.EMPTY);
317 }
318
319 }
Andrea Campanella8e94b0c2016-04-12 13:58:07 -0700320}