blob: 58d51db588c6ac86bfd2abdd44b1cc1410665fb7 [file] [log] [blame]
kmcpeakeb172d5f2015-12-10 11:30:43 +00001/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2015-present Open Networking Foundation
kmcpeakeb172d5f2015-12-10 11:30:43 +00003 *
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.alarms.gui;
17
18import com.fasterxml.jackson.databind.node.ObjectNode;
19import com.google.common.base.Strings;
20import com.google.common.collect.ImmutableSet;
Thomas Vachuska52f2cd12018-11-08 21:20:04 -080021import org.onosproject.alarm.Alarm;
Simon Hunt8a0429a2017-01-06 16:52:47 -080022import org.onosproject.net.DeviceId;
kmcpeakeb172d5f2015-12-10 11:30:43 +000023import org.onosproject.ui.RequestHandler;
24import org.onosproject.ui.UiMessageHandler;
25import org.onosproject.ui.table.TableModel;
26import org.onosproject.ui.table.TableRequestHandler;
Simon Hunt8a0429a2017-01-06 16:52:47 -080027import org.onosproject.ui.table.cell.TimeFormatter;
kmcpeakeb172d5f2015-12-10 11:30:43 +000028import org.slf4j.Logger;
29import org.slf4j.LoggerFactory;
30
Yuta HIGUCHI0c47d532017-08-18 23:16:35 -070031import java.time.Instant;
kmcpeakeb172d5f2015-12-10 11:30:43 +000032import java.util.Collection;
33import java.util.Set;
Simon Hunt8a0429a2017-01-06 16:52:47 -080034
Thomas Vachuska52f2cd12018-11-08 21:20:04 -080035import static org.onosproject.alarm.AlarmId.alarmId;
kmcpeakeb172d5f2015-12-10 11:30:43 +000036
37/**
38 * Skeletal ONOS UI Table-View message handler.
39 */
40public class AlarmTableMessageHandler extends UiMessageHandler {
41
42 private static final String ALARM_TABLE_DATA_REQ = "alarmTableDataRequest";
43 private static final String ALARM_TABLE_DATA_RESP = "alarmTableDataResponse";
44 private static final String ALARM_TABLES = "alarmTables";
45
46 private static final String ALARM_TABLE_DETAIL_REQ = "alarmTableDetailsRequest";
47 private static final String ALARM_TABLE_DETAIL_RESP = "alarmTableDetailsResponse";
48 private static final String DETAILS = "details";
49
50 private static final String ID = "id";
51 private static final String DEVICE_ID_STR = "alarmDeviceId";
52 private static final String DESCRIPTION = "alarmDesc";
53 private static final String SOURCE = "alarmSource";
54 private static final String TIME_RAISED = "alarmTimeRaised";
55 private static final String TIME_UPDATED = "alarmTimeUpdated";
56 private static final String TIME_CLEARED = "alarmTimeCleared";
57 private static final String SEVERITY = "alarmSeverity";
Sean Condon87b78502018-09-17 20:53:24 +010058 private static final String SERVICE_AFFECTING = "alarmServiceAffecting";
59 private static final String ACKNOWLEDGED = "alarmAcknowledged";
60 private static final String CLEARED = "alarmCleared";
61 private static final String MANUALLY_CLEARABLE = "alarmManuallyClearable";
62 private static final String ASSIGNED_USER = "alarmAssignedUser";
kmcpeakeb172d5f2015-12-10 11:30:43 +000063 private static final String RESULT = "result";
64
65 // TODO No need to show id column in ONOS-GUI
66
Simon Hunt8a0429a2017-01-06 16:52:47 -080067 // TODO Replace SEVERITY column by color-coding of row depending on severity
68 // e.g. red=critical, green=cleared etc
69
70 private static final String[] COLUMN_IDS = {
Sean Condon87b78502018-09-17 20:53:24 +010071 ID, DEVICE_ID_STR, DESCRIPTION, SOURCE, TIME_RAISED, SEVERITY,
72 MANUALLY_CLEARABLE, CLEARED, ACKNOWLEDGED
Simon Hunt8a0429a2017-01-06 16:52:47 -080073 };
kmcpeakeb172d5f2015-12-10 11:30:43 +000074
75 private final Logger log = LoggerFactory.getLogger(getClass());
76
77 @Override
78 protected Collection<RequestHandler> createRequestHandlers() {
79 return ImmutableSet.of(
80 new AlarmTableDataRequestHandler(),
81 new AlarmTableDetailRequestHandler()
82 );
83 }
84
85 // handler for alarm table requests
86 private final class AlarmTableDataRequestHandler extends TableRequestHandler {
87
Jian Li69f66632016-01-15 12:27:42 -080088 private static final String NO_ROWS_MESSAGE = "No alarms found";
89
kmcpeakeb172d5f2015-12-10 11:30:43 +000090 private AlarmTableDataRequestHandler() {
91 super(ALARM_TABLE_DATA_REQ, ALARM_TABLE_DATA_RESP, ALARM_TABLES);
92 }
93
94 @Override
95 protected String defaultColumnId() {
kmcpeakeb172d5f2015-12-10 11:30:43 +000096 return ID;
97 }
98
99 @Override
100 protected String[] getColumnIds() {
101 return COLUMN_IDS;
102 }
103
104 @Override
Jian Li8baf4472016-01-15 15:08:09 -0800105 protected String noRowsMessage(ObjectNode payload) {
Jian Li69f66632016-01-15 12:27:42 -0800106 return NO_ROWS_MESSAGE;
107 }
108
109 @Override
kmcpeakeb172d5f2015-12-10 11:30:43 +0000110 protected TableModel createTableModel() {
kmcpeakeb172d5f2015-12-10 11:30:43 +0000111 TableModel tm = super.createTableModel();
112 tm.setFormatter(TIME_RAISED, new TimeFormatter());
113 return tm;
114 }
115
116 @Override
117 protected void populateTable(TableModel tm, ObjectNode payload) {
Simon Hunt8a0429a2017-01-06 16:52:47 -0800118 log.debug(" populateTable: tm = {}; payload = {}", tm, payload);
kmcpeakeb172d5f2015-12-10 11:30:43 +0000119 String devId = string(payload, "devId");
120
121 Set<Alarm> alarms = Strings.isNullOrEmpty(devId) ?
122 AlarmServiceUtil.lookUpAlarms() :
123 AlarmServiceUtil.lookUpAlarms(DeviceId.deviceId(devId));
124
Simon Hunt8a0429a2017-01-06 16:52:47 -0800125 alarms.forEach((alarm) -> populateRow(tm.addRow(), alarm));
kmcpeakeb172d5f2015-12-10 11:30:43 +0000126 }
127
128 private void populateRow(TableModel.Row row, Alarm alarm) {
Simon Hunt8a0429a2017-01-06 16:52:47 -0800129 log.debug("populateRow: row = {} alarm = {}", row, alarm);
kmcpeakeb172d5f2015-12-10 11:30:43 +0000130
Andrea Campanella65f9eb92017-05-02 11:36:14 -0700131 row.cell(ID, alarm.id())
kmcpeakeb172d5f2015-12-10 11:30:43 +0000132 .cell(DEVICE_ID_STR, alarm.deviceId())
133 .cell(DESCRIPTION, alarm.description())
134 .cell(SOURCE, alarm.source())
Yuta HIGUCHI0c47d532017-08-18 23:16:35 -0700135 .cell(TIME_RAISED, Instant.ofEpochMilli(alarm.timeRaised()))
Sean Condon87b78502018-09-17 20:53:24 +0100136 .cell(SEVERITY, alarm.severity())
137 .cell(MANUALLY_CLEARABLE, alarm.manuallyClearable())
138 .cell(CLEARED, alarm.cleared())
139 .cell(ACKNOWLEDGED, alarm.acknowledged());
kmcpeakeb172d5f2015-12-10 11:30:43 +0000140 }
141 }
142
143 // handler for alarm details requests
144 private final class AlarmTableDetailRequestHandler extends RequestHandler {
145
146 private AlarmTableDetailRequestHandler() {
147 super(ALARM_TABLE_DETAIL_REQ);
148 }
149
150 @Override
Simon Hunt8a0429a2017-01-06 16:52:47 -0800151 public void process(ObjectNode payload) {
152 log.debug("payload = {}", payload);
kmcpeakeb172d5f2015-12-10 11:30:43 +0000153
154 String id = string(payload, ID, "(none)");
Andrea Campanella65f9eb92017-05-02 11:36:14 -0700155 Alarm alarm = AlarmServiceUtil.lookupAlarm(alarmId(id));
kmcpeakeb172d5f2015-12-10 11:30:43 +0000156 ObjectNode rootNode = objectNode();
157 ObjectNode data = objectNode();
158 rootNode.set(DETAILS, data);
159
160 if (alarm == null) {
161 rootNode.put(RESULT, "Item with id '" + id + "' not found");
162 log.warn("attempted to get item detail for id '{}'", id);
163
164 } else {
165 rootNode.put(RESULT, "Found item with id '" + id + "'");
166
Andrea Campanella65f9eb92017-05-02 11:36:14 -0700167 data.put(ID, alarm.id().toString());
kmcpeakeb172d5f2015-12-10 11:30:43 +0000168 data.put(DESCRIPTION, alarm.description());
169 data.put(DEVICE_ID_STR, alarm.deviceId().toString());
170 data.put(SOURCE, alarm.source().toString());
171 long timeRaised = alarm.timeRaised();
172 data.put(TIME_RAISED,
Andrea Campanella65f9eb92017-05-02 11:36:14 -0700173 formatTime(timeRaised)
kmcpeakeb172d5f2015-12-10 11:30:43 +0000174 );
175 data.put(TIME_UPDATED, formatTime(alarm.timeUpdated()));
176 data.put(TIME_CLEARED, formatTime(alarm.timeCleared()));
177 data.put(SEVERITY, alarm.severity().toString());
Sean Condon87b78502018-09-17 20:53:24 +0100178 // TODO: The following should be change to %yes% and %no% if LION is added to Alarm View
179 data.put(SERVICE_AFFECTING,
180 alarm.serviceAffecting() ? "Yes" : "No");
181 data.put(ACKNOWLEDGED,
182 alarm.acknowledged() ? "Yes" : "No");
183 data.put(CLEARED,
184 alarm.cleared() ? "Yes" : "No");
185 data.put(ASSIGNED_USER, alarm.assignedUser());
kmcpeakeb172d5f2015-12-10 11:30:43 +0000186 }
Simon Hunt8a0429a2017-01-06 16:52:47 -0800187 log.debug("send = {}", rootNode);
kmcpeakeb172d5f2015-12-10 11:30:43 +0000188
Simon Hunt8a0429a2017-01-06 16:52:47 -0800189 sendMessage(ALARM_TABLE_DETAIL_RESP, rootNode);
kmcpeakeb172d5f2015-12-10 11:30:43 +0000190 }
191 }
192
193 private static String formatTime(Long msSinceStartOfEpoch) {
194 if (msSinceStartOfEpoch == null) {
195 return "-";
196 }
Yuta HIGUCHI0c47d532017-08-18 23:16:35 -0700197 return new TimeFormatter().format(Instant.ofEpochMilli(msSinceStartOfEpoch));
kmcpeakeb172d5f2015-12-10 11:30:43 +0000198 }
kmcpeakeb172d5f2015-12-10 11:30:43 +0000199}