blob: 6a3c3767a876fdfae4df04f1d52a13e4be1e30d3 [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;
29import org.onosproject.incubator.net.faultmanagement.alarm.Alarm;
30import org.onosproject.incubator.net.faultmanagement.alarm.AlarmEntityId;
31import org.onosproject.incubator.net.faultmanagement.alarm.AlarmEvent;
32import org.onosproject.incubator.net.faultmanagement.alarm.AlarmId;
33import org.onosproject.incubator.net.faultmanagement.alarm.AlarmListener;
Andrea Campanella65f9eb92017-05-02 11:36:14 -070034import org.onosproject.incubator.net.faultmanagement.alarm.AlarmProvider;
35import org.onosproject.incubator.net.faultmanagement.alarm.AlarmProviderRegistry;
36import org.onosproject.incubator.net.faultmanagement.alarm.AlarmProviderService;
Andrea Campanella8e94b0c2016-04-12 13:58:07 -070037import org.onosproject.incubator.net.faultmanagement.alarm.DefaultAlarm;
38import org.onosproject.net.DeviceId;
Andrea Campanella65f9eb92017-05-02 11:36:14 -070039import org.onosproject.net.MastershipRole;
Andrea Campanella8e94b0c2016-04-12 13:58:07 -070040import org.onosproject.net.NetTestTools;
Andrea Campanella65f9eb92017-05-02 11:36:14 -070041import org.onosproject.net.provider.AbstractProvider;
Andrea Campanella8e94b0c2016-04-12 13:58:07 -070042import org.onosproject.store.service.TestStorageService;
43
44import java.util.Collections;
45import java.util.HashMap;
46import java.util.List;
47import java.util.Map;
48
49import static junit.framework.TestCase.assertFalse;
50import static org.junit.Assert.assertEquals;
51import static org.junit.Assert.assertTrue;
52import static org.onosproject.incubator.net.faultmanagement.alarm.Alarm.SeverityLevel.CLEARED;
53import static org.onosproject.incubator.net.faultmanagement.alarm.Alarm.SeverityLevel.CRITICAL;
Andrea Campanella65f9eb92017-05-02 11:36:14 -070054import static org.onosproject.net.NetTestTools.PID;
Andrea Campanella8e94b0c2016-04-12 13:58:07 -070055
56/**
57 * Alarm manager test suite.
58 */
59public class AlarmManagerTest {
60
61 private static final DeviceId DEVICE_ID = DeviceId.deviceId("foo:bar");
Andrea Campanella65f9eb92017-05-02 11:36:14 -070062 private static final String UNIQUE_ID_1 = "unique_id_1";
63 private static final String UNIQUE_ID_2 = "unique_id_2";
64 private static final AlarmId A_ID = AlarmId.alarmId(DEVICE_ID, UNIQUE_ID_1);
65 private static final AlarmId B_ID = AlarmId.alarmId(DEVICE_ID, UNIQUE_ID_2);
66 private static final DefaultAlarm ALARM_A = new DefaultAlarm.Builder(A_ID,
Andrea Campanella8e94b0c2016-04-12 13:58:07 -070067 DEVICE_ID, "aaa", Alarm.SeverityLevel.CRITICAL, 0).build();
68
Andrea Campanella65f9eb92017-05-02 11:36:14 -070069 private static final DefaultAlarm ALARM_A_CLEARED = new DefaultAlarm.Builder(ALARM_A)
70 .clear().build();
71
Andrea Campanella8e94b0c2016-04-12 13:58:07 -070072 private static final DefaultAlarm ALARM_A_WITHSRC = new DefaultAlarm.Builder(
73 ALARM_A).forSource(AlarmEntityId.alarmEntityId("port:foo")).build();
74
Andrea Campanella65f9eb92017-05-02 11:36:14 -070075 private static final DefaultAlarm ALARM_B = new DefaultAlarm.Builder(B_ID,
Andrea Campanella8e94b0c2016-04-12 13:58:07 -070076 DEVICE_ID, "bbb", Alarm.SeverityLevel.CRITICAL, 0).build();
77
Andrea Campanella65f9eb92017-05-02 11:36:14 -070078
Andrea Campanella8e94b0c2016-04-12 13:58:07 -070079 private AlarmManager manager;
80 private DistributedAlarmStore alarmStore;
Andrea Campanella65f9eb92017-05-02 11:36:14 -070081 private AlarmProviderService providerService;
82 private TestProvider provider;
83 protected AlarmProviderRegistry registry;
Andrea Campanella8e94b0c2016-04-12 13:58:07 -070084 protected TestListener listener = new TestListener();
85
86 @Rule
87 public final ExpectedException exception = ExpectedException.none();
88
89 @Before
90 public void setUp() throws Exception {
91 alarmStore = new DistributedAlarmStore();
92 TestUtils.setField(alarmStore, "storageService", new TestStorageService());
93 alarmStore.activate();
94 manager = new AlarmManager();
Andrea Campanella65f9eb92017-05-02 11:36:14 -070095 registry = manager;
Andrea Campanella8e94b0c2016-04-12 13:58:07 -070096 manager.addListener(listener);
97 NetTestTools.injectEventDispatcher(manager, new TestEventDispatcher());
98 manager.store = alarmStore;
99 manager.activate();
Andrea Campanella65f9eb92017-05-02 11:36:14 -0700100 provider = new TestProvider();
101 providerService = registry.register(provider);
Andrea Campanella8e94b0c2016-04-12 13:58:07 -0700102 }
103
104 @Test
105 public void deactivate() throws Exception {
Andrea Campanella65f9eb92017-05-02 11:36:14 -0700106 providerService.updateAlarmList(DEVICE_ID, ImmutableSet.of(ALARM_B, ALARM_A));
Andrea Campanella8e94b0c2016-04-12 13:58:07 -0700107 verifyGettingSetsOfAlarms(manager, 2, 2);
108 alarmStore.deactivate();
109 manager.removeListener(listener);
110 manager.deactivate();
111 NetTestTools.injectEventDispatcher(manager, null);
112 assertFalse("Store should not have delegate", alarmStore.hasDelegate());
113 }
114
115 @Test
116 public void testGettersWhenNoAlarms() {
117
118 assertTrue("No alarms should be present", manager.getAlarms().isEmpty());
119 assertTrue("No active alarms should be present", manager.getActiveAlarms().isEmpty());
120 assertTrue("The map should be empty per unknown device",
121 manager.getAlarmCounts(DeviceId.NONE).keySet().isEmpty());
122 assertTrue("The counts should be empty", manager.getAlarmCounts().keySet().isEmpty());
123
124 assertEquals("Incorrect number of alarms for unknown device",
125 0, manager.getAlarms(DeviceId.NONE).size());
126 assertEquals("Incorrect number of major alarms for unknown device",
127 0, manager.getAlarms(Alarm.SeverityLevel.MAJOR).size());
128
129 exception.expect(NullPointerException.class);
130 manager.getAlarm(null);
131
132 exception.expect(ItemNotFoundException.class);
Andrea Campanella65f9eb92017-05-02 11:36:14 -0700133 manager.getAlarm(AlarmId.alarmId(DEVICE_ID, "unique_3"));
Andrea Campanella8e94b0c2016-04-12 13:58:07 -0700134 }
135
136 @Test
137 public void testAlarmUpdates() throws InterruptedException {
138
139 assertTrue("No alarms should be present", manager.getAlarms().isEmpty());
Andrea Campanella65f9eb92017-05-02 11:36:14 -0700140 providerService.updateAlarmList(DEVICE_ID, ImmutableSet.of());
Andrea Campanella8e94b0c2016-04-12 13:58:07 -0700141 assertTrue("No alarms should be present", manager.getAlarms().isEmpty());
142 Map<Alarm.SeverityLevel, Long> zeroAlarms = new CountsMapBuilder().create();
143 assertEquals("No alarms count should be present", zeroAlarms, manager.getAlarmCounts());
144 assertEquals("No alarms count should be present", zeroAlarms, manager.getAlarmCounts(DEVICE_ID));
145
Andrea Campanella65f9eb92017-05-02 11:36:14 -0700146 providerService.updateAlarmList(DEVICE_ID, ImmutableSet.of(ALARM_B, ALARM_A));
Andrea Campanella8e94b0c2016-04-12 13:58:07 -0700147 verifyGettingSetsOfAlarms(manager, 2, 2);
148 validateEvents(AlarmEvent.Type.CREATED, AlarmEvent.Type.CREATED);
149 Map<Alarm.SeverityLevel, Long> critical2 = new CountsMapBuilder().with(CRITICAL, 2L).create();
150 assertEquals("A critical should be present", critical2, manager.getAlarmCounts());
151 assertEquals("A critical should be present", critical2, manager.getAlarmCounts(DEVICE_ID));
152
Andrea Campanella65f9eb92017-05-02 11:36:14 -0700153 Alarm updated = manager.updateBookkeepingFields(ALARM_A.id(), true, false, null);
154// providerService.updateAlarmList(DEVICE_ID, ImmutableSet.of(ALARM_A));
Andrea Campanella8e94b0c2016-04-12 13:58:07 -0700155 verifyGettingSetsOfAlarms(manager, 2, 1);
Andrea Campanella65f9eb92017-05-02 11:36:14 -0700156 validateEvents(AlarmEvent.Type.UPDATED);
Andrea Campanella8e94b0c2016-04-12 13:58:07 -0700157 Map<Alarm.SeverityLevel, Long> critical1cleared1 =
158 new CountsMapBuilder().with(CRITICAL, 1L).with(CLEARED, 1L).create();
159 assertEquals("A critical should be present and cleared", critical1cleared1,
160 manager.getAlarmCounts());
161 assertEquals("A critical should be present and cleared", critical1cleared1,
162 manager.getAlarmCounts(DEVICE_ID));
163
164 // No change map when same alarms sent
Andrea Campanella65f9eb92017-05-02 11:36:14 -0700165 providerService.updateAlarmList(DEVICE_ID, ImmutableSet.of(updated));
Andrea Campanella8e94b0c2016-04-12 13:58:07 -0700166 verifyGettingSetsOfAlarms(manager, 2, 1);
167 validateEvents();
168 assertEquals("Map should not be changed for same alarm", critical1cleared1,
169 manager.getAlarmCounts());
170 assertEquals("Map should not be changed for same alarm", critical1cleared1,
171 manager.getAlarmCounts(DEVICE_ID));
172
Andrea Campanella65f9eb92017-05-02 11:36:14 -0700173 providerService.updateAlarmList(DEVICE_ID, ImmutableSet.of(updated, ALARM_A_WITHSRC));
174 verifyGettingSetsOfAlarms(manager, 2, 2);
175 validateEvents(AlarmEvent.Type.UPDATED);
Andrea Campanella8e94b0c2016-04-12 13:58:07 -0700176 Map<Alarm.SeverityLevel, Long> critical2cleared1 =
Andrea Campanella65f9eb92017-05-02 11:36:14 -0700177 new CountsMapBuilder().with(CRITICAL, 2L).create();
Andrea Campanella8e94b0c2016-04-12 13:58:07 -0700178 assertEquals("A critical should be present", critical2cleared1, manager.getAlarmCounts());
179 assertEquals("A critical should be present", critical2cleared1, manager.getAlarmCounts(DEVICE_ID));
180
Andrea Campanella65f9eb92017-05-02 11:36:14 -0700181 providerService.updateAlarmList(DEVICE_ID, ImmutableSet.of());
182 verifyGettingSetsOfAlarms(manager, 2, 2);
183 validateEvents();
184 assertEquals(new CountsMapBuilder().with(CRITICAL, 2L).create(),
185 manager.getAlarmCounts(DEVICE_ID));
Andrea Campanella8e94b0c2016-04-12 13:58:07 -0700186
187 assertEquals("The counts should be empty for unknown devices", zeroAlarms,
188 manager.getAlarmCounts(DeviceId.NONE));
189 assertEquals("The counts should be empty for unknown devices", zeroAlarms,
190 manager.getAlarmCounts(DeviceId.deviceId("junk:junk")));
191
192 }
193
194 private void verifyGettingSetsOfAlarms(AlarmManager am, int expectedTotal, int expectedActive) {
195 assertEquals("Incorrect total alarms", expectedTotal, am.getAlarms().size());
196 assertEquals("Incorrect active alarms count", expectedActive, am.getActiveAlarms().size());
197 }
198
199 /**
200 * Method to validate that actual versus expected device key events were
201 * received correctly.
202 *
203 * @param types expected device key events.
204 */
205 private void validateEvents(Enum... types) {
206 TestTools.assertAfter(100, () -> {
207 int i = 0;
208 assertEquals("wrong events received", types.length, listener.events.size());
209 for (Event event : listener.events) {
210 assertEquals("incorrect event type", types[i], event.type());
211 i++;
212 }
213 listener.events.clear();
214 });
215 }
216
217 private static class CountsMapBuilder {
218
219 private final Map<Alarm.SeverityLevel, Long> map = new HashMap<>();
220
221 public CountsMapBuilder with(Alarm.SeverityLevel sev, Long count) {
222 map.put(sev, count);
223 return this;
224 }
225
226 public Map<Alarm.SeverityLevel, Long> create() {
227 return Collections.unmodifiableMap(map);
228 }
229 }
230
231
Andrea Campanella65f9eb92017-05-02 11:36:14 -0700232 private class TestProvider extends AbstractProvider implements AlarmProvider {
233 private DeviceId deviceReceived;
234 private MastershipRole roleReceived;
235
236 public TestProvider() {
237 super(PID);
238 }
239
240 @Override
241 public void triggerProbe(DeviceId deviceId) {
242 }
243 }
244
Andrea Campanella8e94b0c2016-04-12 13:58:07 -0700245 /**
246 * Test listener class to receive alarm events.
247 */
248 private static class TestListener implements AlarmListener {
249
250 protected List<AlarmEvent> events = Lists.newArrayList();
251
252 @Override
253 public void event(AlarmEvent event) {
254 events.add(event);
255 }
256
257 }
258}