summaryrefslogtreecommitdiff
path: root/src/store
diff options
context:
space:
mode:
Diffstat (limited to 'src/store')
-rw-r--r--src/store/modules/Health/EventLogStore.js113
-rw-r--r--src/store/plugins/WebSocketPlugin.js20
2 files changed, 37 insertions, 96 deletions
diff --git a/src/store/modules/Health/EventLogStore.js b/src/store/modules/Health/EventLogStore.js
index 418e4558..2f0b800f 100644
--- a/src/store/modules/Health/EventLogStore.js
+++ b/src/store/modules/Health/EventLogStore.js
@@ -1,117 +1,58 @@
import api from '../../api';
-const EVENT_SEVERITY = {
- emergency: 'xyz.openbmc_project.Logging.Entry.Level.Emergency',
- alert: 'xyz.openbmc_project.Logging.Entry.Level.Alert',
- critical: 'xyz.openbmc_project.Logging.Entry.Level.Critical',
- error: 'xyz.openbmc_project.Logging.Entry.Level.Error',
- warning: 'xyz.openbmc_project.Logging.Entry.Level.Warning',
- notice: 'xyz.openbmc_project.Logging.Entry.Level.Notice',
- informational: 'xyz.openbmc_project.Logging.Entry.Level.Informational',
- debug: 'xyz.openbmc_project.Logging.Entry.Level.Debug'
-};
-
-const priorityMapper = severity => {
- switch (severity) {
- case EVENT_SEVERITY.emergency:
- case EVENT_SEVERITY.alert:
- case EVENT_SEVERITY.critical:
- case EVENT_SEVERITY.error:
- return 'high';
- case EVENT_SEVERITY.warning:
- return 'medium';
- case EVENT_SEVERITY.notice:
- case EVENT_SEVERITY.debug:
- case EVENT_SEVERITY.informational:
- return 'low';
- default:
- return '';
- }
-};
-
-const getHealthStatus = allEvents => {
- let status = 'good';
- for (const event of allEvents) {
- if (!event.Resolved && event.priority === 'medium') {
- status = 'warning';
+const getHealthStatus = events => {
+ let status = 'OK';
+ for (const event of events) {
+ if (event.severity === 'Warning') {
+ status = 'Warning';
}
- if (!event.Resolved && event.priority === 'high') {
- status = 'critical';
+ if (event.severity === 'Critical') {
+ status = 'Critical';
break;
}
}
return status;
};
+// TODO: High priority events should also check if Log
+// is resolved when the property is available in Redfish
+const getHighPriorityEvents = events =>
+ events.filter(({ severity }) => severity === 'Critical');
+
const EventLogStore = {
namespaced: true,
state: {
- allEvents: [],
- highPriorityEvents: [],
- healthStatus: null
+ allEvents: []
},
getters: {
allEvents: state => state.allEvents,
- highPriorityEvents: state => state.highPriorityEvents,
- healthStatus: state => state.healthStatus
+ highPriorityEvents: state => getHighPriorityEvents(state.allEvents),
+ healthStatus: state => getHealthStatus(state.allEvents)
},
mutations: {
- setAllEvents: (state, allEvents) => (state.allEvents = allEvents),
- setHighPriorityEvents: (state, highPriorityEvents) =>
- (state.highPriorityEvents = highPriorityEvents),
- setHealthStatus: (state, status) => (state.healthStatus = status)
+ setAllEvents: (state, allEvents) => (state.allEvents = allEvents)
},
actions: {
async getEventLogData({ commit }) {
return await api
- .get('/xyz/openbmc_project/logging/enumerate')
- .then(response => {
- const responseData = response.data.data;
- const eventLogs = [];
-
- for (const key in responseData) {
- const event = responseData[key];
- const { Id } = event;
- if (responseData.hasOwnProperty(key) && Id) {
- const { EventID, Description, Timestamp, Severity } = event;
- eventLogs.push({
- logId: Id,
- priority: priorityMapper(Severity),
- timestamp: new Date(Timestamp),
- eventID: EventID,
- description: Description,
- ...event
- });
+ .get('/redfish/v1/Systems/system/LogServices/EventLog/Entries')
+ .then(({ data: { Members = [] } = {} }) => {
+ const eventLogs = Members.map(
+ ({ Id, Severity, Created, EntryType, Message }) => {
+ return {
+ id: Id,
+ severity: Severity,
+ date: new Date(Created),
+ type: EntryType,
+ description: Message
+ };
}
- }
-
- const healthStatus = getHealthStatus(eventLogs);
- const highPriorityEvents = eventLogs.filter(
- ({ priority, Resolved }) => priority === 'high' && !Resolved
);
-
commit('setAllEvents', eventLogs);
- commit('setHighPriorityEvents', highPriorityEvents);
- commit('setHealthStatus', healthStatus);
})
.catch(error => {
console.log('Event Log Data:', error);
});
- },
- checkHealth({ commit, getters }, interfaces) {
- if (getters['healthStatus'] === 'critical') return;
- for (const key in interfaces) {
- const event = interfaces[key];
- const eventPriority = priorityMapper(event.Severity);
- const isEventResolved = event.Resolved;
- if (!isEventResolved) {
- if (eventPriority === 'high') {
- commit('setHealthStatus', 'critical');
- break;
- }
- if (eventPriority === 'medium') commit('setHealthStatus', 'warning');
- }
- }
}
}
};
diff --git a/src/store/plugins/WebSocketPlugin.js b/src/store/plugins/WebSocketPlugin.js
index 965c32c9..400fdefa 100644
--- a/src/store/plugins/WebSocketPlugin.js
+++ b/src/store/plugins/WebSocketPlugin.js
@@ -1,3 +1,5 @@
+import { debounce } from 'lodash';
+
/**
* WebSocketPlugin will allow us to get new data from the server
* without having to poll for changes on the frontend.
@@ -26,23 +28,21 @@ const WebSocketPlugin = store => {
ws.onerror = event => {
console.error(event);
};
- ws.onmessage = event => {
+ ws.onmessage = debounce(event => {
const data = JSON.parse(event.data);
const eventInterface = data.interface;
+ const path = data.path;
if (eventInterface === 'xyz.openbmc_project.State.Host') {
const { properties: { CurrentHostState } = {} } = data;
store.commit('global/setHostStatus', CurrentHostState);
- } else {
- const { interfaces, event } = data;
- if (event === 'InterfacesAdded' && interfaces) {
- // Checking for 'InterfacesAdded' events
- // since they have all properties needed to
- // change health status
- store.dispatch('eventLog/checkHealth', interfaces);
- }
+ } else if (path === '/xyz/openbmc_project/logging') {
+ store.dispatch('eventLog/getEventLogData');
}
- };
+ // 2.5 sec debounce to avoid making multiple consecutive
+ // GET requests since log related server messages seem to
+ // come in clusters
+ }, 2500);
};
store.subscribe(({ type }) => {