From 834c72fdb879e3b13cce54901681318d14a886cb Mon Sep 17 00:00:00 2001 From: Jorge Saffe Date: Wed, 17 Jan 2024 13:49:21 -0500 Subject: [PATCH] Adding support for Horizon FM CSV Reports The Horizon interface has been enhanced with the addition of an "Export" action (Button) on the Fault Management pages. This feature allows for the comprehensive exportation of all properties retrieved from the API, formatted as a CSV file. Controllers have been integrated into the three Angular modules of Fault Management (alarms, events, and event_suppression) to facilitate data retrieval from the API, conversion to CSV format, and subsequent download of the CSV file. Test Plan: - PASS Runtime test on Standalone SX env: * Login as an admin user. * Download CSV reports for active alarms, events, and event-suppression. * Assess and confirm the CSV file contents. * Logout * Login with a user account with read-only permissions. * Download CSV reports for active alarms, events, and event-suppression. * Assess and confirm the CSV file contents - PASS Runtime test on DC env: * Login as an admin user. * Download CSV reports for active alarms, events, and event-suppression. * Assess and confirm the CSV file contents. * Logout * Login with a user account with read-only permissions. * Download CSV reports for active alarms, events, and event-suppression. * Assess and confirm the CSV file contents Story: 2011009 Task: 49421 Change-Id: Id9e9b8971a31db8e8d1c8959af7769706fb492f5 Signed-off-by: Jorge Saffe --- .../active_alarms/active_alarms.controller.js | 93 ++++++++++++++++++ .../active_alarms/active_alarms.module.js | 3 +- .../fault_management/active_alarms/panel.html | 7 +- .../events/events.controller.js | 94 +++++++++++++++++++ .../fault_management/events/events.module.js | 3 +- .../fault_management/events/panel.html | 7 +- .../events_suppression.controller.js | 91 ++++++++++++++++++ .../events_suppression.module.js | 5 +- .../events_suppression/panel.html | 6 +- 9 files changed, 302 insertions(+), 7 deletions(-) create mode 100644 starlingx-dashboard/starlingx-dashboard/starlingx_dashboard/static/dashboard/fault_management/active_alarms/active_alarms.controller.js create mode 100644 starlingx-dashboard/starlingx-dashboard/starlingx_dashboard/static/dashboard/fault_management/events/events.controller.js create mode 100644 starlingx-dashboard/starlingx-dashboard/starlingx_dashboard/static/dashboard/fault_management/events_suppression/events_suppression.controller.js diff --git a/starlingx-dashboard/starlingx-dashboard/starlingx_dashboard/static/dashboard/fault_management/active_alarms/active_alarms.controller.js b/starlingx-dashboard/starlingx-dashboard/starlingx_dashboard/static/dashboard/fault_management/active_alarms/active_alarms.controller.js new file mode 100644 index 00000000..c2df6da0 --- /dev/null +++ b/starlingx-dashboard/starlingx-dashboard/starlingx_dashboard/static/dashboard/fault_management/active_alarms/active_alarms.controller.js @@ -0,0 +1,93 @@ +/** + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. You may obtain + * a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +/** + * Copyright (c) 2024 Wind River Systems, Inc. + * + * SPDX-License-Identifier: Apache-2.0 + * + */ + +(function() { + 'use strict'; + + angular + .module('horizon.dashboard.fault_management.active_alarms') + .controller('ActiveAlarmsController', ['horizon.dashboard.fault_management.active_alarms.service', '$scope', ActiveAlarmsController]); + + var fieldMappings = { + 'alarm_id': 'Alarm ID', + 'reason_text': 'Reason Text', + 'entity_instance_id': 'Entity Instance ID', + 'severity': 'Severity', + 'timestamp': 'Timestamp', + }; + + function ActiveAlarmsController(activeAlarmsService, $scope) { + $scope.downloadAlarmsData = function() { + activeAlarmsService.getPromise().then(function(response) { + var csvData = convertToCSV(response.data.items, fieldMappings); + triggerDownload(csvData, 'active-alarms-data.csv'); + }); + }; + + function convertToCSV(objArray, fieldMappings) { + var array = objArray; + var str = ''; + var row = ''; + + // Header + for (var index in objArray[0]) { + if (fieldMappings[index]) { + row += '"' + fieldMappings[index].replace(/"/g, '""') + '",'; + } + } + row = row.slice(0, -1); + str += row + '\r\n'; + + // Data + for (var i = 0; i < array.length; i++) { + var line = ''; + for (var index in array[i]) { + if (fieldMappings[index]) { + var data = array[i][index]; + + if (data && typeof data === 'string') { + // Escape double quotes and replace internal line breaks + data = data.replace(/"/g, '""').replace(/(\r\n|\n|\r)/gm, " "); + } + + line += '"' + data + '",'; + } + } + line = line.slice(0, -1); + str += line + '\r\n'; + } + return str; + } + + function triggerDownload(csvData, filename) { + var blob = new Blob([csvData], { type: 'text/csv;charset=utf-8;' }); + var link = document.createElement("a"); + if (link.download !== undefined) { + var url = URL.createObjectURL(blob); + link.setAttribute("href", url); + link.setAttribute("download", filename); + link.style.visibility = 'hidden'; + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + } + } + } + })(); diff --git a/starlingx-dashboard/starlingx-dashboard/starlingx_dashboard/static/dashboard/fault_management/active_alarms/active_alarms.module.js b/starlingx-dashboard/starlingx-dashboard/starlingx_dashboard/static/dashboard/fault_management/active_alarms/active_alarms.module.js index 8a6b6c40..82a7791d 100644 --- a/starlingx-dashboard/starlingx-dashboard/starlingx_dashboard/static/dashboard/fault_management/active_alarms/active_alarms.module.js +++ b/starlingx-dashboard/starlingx-dashboard/starlingx_dashboard/static/dashboard/fault_management/active_alarms/active_alarms.module.js @@ -12,7 +12,7 @@ * under the License. */ /** - * Copyright (c) 2019 Wind River Systems, Inc. + * Copyright (c) 2019-2024 Wind River Systems, Inc. * * SPDX-License-Identifier: Apache-2.0 * @@ -181,6 +181,7 @@ $provide.constant('horizon.dashboard.fault_management.active_alarms.basePath', path); $routeProvider.when('/admin/active_alarms', { templateUrl: path + 'panel.html', + controller: 'ActiveAlarmsController', resolve: { searchResults: ['horizon.dashboard.fault_management.active_alarms.service', function (searchService) { return searchService.getSuppressionList(); diff --git a/starlingx-dashboard/starlingx-dashboard/starlingx_dashboard/static/dashboard/fault_management/active_alarms/panel.html b/starlingx-dashboard/starlingx-dashboard/starlingx_dashboard/static/dashboard/fault_management/active_alarms/panel.html index 1b087419..94b3b323 100644 --- a/starlingx-dashboard/starlingx-dashboard/starlingx_dashboard/static/dashboard/fault_management/active_alarms/panel.html +++ b/starlingx-dashboard/starlingx-dashboard/starlingx_dashboard/static/dashboard/fault_management/active_alarms/panel.html @@ -1,6 +1,11 @@ - + +
+ Export CSV Report +
+
diff --git a/starlingx-dashboard/starlingx-dashboard/starlingx_dashboard/static/dashboard/fault_management/events/events.controller.js b/starlingx-dashboard/starlingx-dashboard/starlingx_dashboard/static/dashboard/fault_management/events/events.controller.js new file mode 100644 index 00000000..de763c39 --- /dev/null +++ b/starlingx-dashboard/starlingx-dashboard/starlingx_dashboard/static/dashboard/fault_management/events/events.controller.js @@ -0,0 +1,94 @@ +/** + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. You may obtain + * a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +/** + * Copyright (c) 2024 Wind River Systems, Inc. + * + * SPDX-License-Identifier: Apache-2.0 + * + */ + +(function() { + 'use strict'; + + angular + .module('horizon.dashboard.fault_management.events') + .controller('EventsController', ['horizon.dashboard.fault_management.events.service', '$scope', EventsController]); + + var fieldMappings = { + 'timestamp': 'Timestamp', + 'state': 'State', + 'event_log_id': 'Event ID', + 'reason_text': 'Reason Text', + 'entity_instance_id': 'Entity Instance ID', + 'severity': 'Severity', + }; + + function EventsController(eventsService, $scope) { + $scope.downloadEventData = function() { + eventsService.getPromise().then(function(response) { + var csvData = convertToCSV(response.data.items, fieldMappings); + triggerDownload(csvData, 'events-data.csv'); + }); + }; + + function convertToCSV(objArray, fieldMappings) { + var array = objArray; + var str = ''; + var row = ''; + + // Header + for (var index in objArray[0]) { + if (fieldMappings[index]) { + row += '"' + fieldMappings[index].replace(/"/g, '""') + '",'; + } + } + row = row.slice(0, -1); + str += row + '\r\n'; + + // Data + for (var i = 0; i < array.length; i++) { + var line = ''; + for (var index in array[i]) { + if (fieldMappings[index]) { + var data = array[i][index]; + + if (data && typeof data === 'string') { + // Escape double quotes and replace internal line breaks + data = data.replace(/"/g, '""').replace(/(\r\n|\n|\r)/gm, " "); + } + + line += '"' + data + '",'; + } + } + line = line.slice(0, -1); + str += line + '\r\n'; + } + return str; + } + + function triggerDownload(csvData, filename) { + var blob = new Blob([csvData], { type: 'text/csv;charset=utf-8;' }); + var link = document.createElement("a"); + if (link.download !== undefined) { + var url = URL.createObjectURL(blob); + link.setAttribute("href", url); + link.setAttribute("download", filename); + link.style.visibility = 'hidden'; + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + } + } + } + })(); diff --git a/starlingx-dashboard/starlingx-dashboard/starlingx_dashboard/static/dashboard/fault_management/events/events.module.js b/starlingx-dashboard/starlingx-dashboard/starlingx_dashboard/static/dashboard/fault_management/events/events.module.js index 08d20885..e336eaba 100644 --- a/starlingx-dashboard/starlingx-dashboard/starlingx_dashboard/static/dashboard/fault_management/events/events.module.js +++ b/starlingx-dashboard/starlingx-dashboard/starlingx_dashboard/static/dashboard/fault_management/events/events.module.js @@ -12,7 +12,7 @@ * under the License. */ /** - * Copyright (c) 2019 Wind River Systems, Inc. + * Copyright (c) 2019-2024 Wind River Systems, Inc. * * SPDX-License-Identifier: Apache-2.0 * @@ -195,6 +195,7 @@ $routeProvider.when('/admin/events', { templateUrl: path + 'panel.html', + controller: 'EventsController', resolve: { searchResults: ['horizon.dashboard.fault_management.events.service', function (searchService) { return searchService.getSuppressionList(); diff --git a/starlingx-dashboard/starlingx-dashboard/starlingx_dashboard/static/dashboard/fault_management/events/panel.html b/starlingx-dashboard/starlingx-dashboard/starlingx_dashboard/static/dashboard/fault_management/events/panel.html index 3e8ac9cc..595fe5ec 100644 --- a/starlingx-dashboard/starlingx-dashboard/starlingx_dashboard/static/dashboard/fault_management/events/panel.html +++ b/starlingx-dashboard/starlingx-dashboard/starlingx_dashboard/static/dashboard/fault_management/events/panel.html @@ -1,6 +1,11 @@ - + +
+ Export CSV Report +
+
diff --git a/starlingx-dashboard/starlingx-dashboard/starlingx_dashboard/static/dashboard/fault_management/events_suppression/events_suppression.controller.js b/starlingx-dashboard/starlingx-dashboard/starlingx_dashboard/static/dashboard/fault_management/events_suppression/events_suppression.controller.js new file mode 100644 index 00000000..1efdf134 --- /dev/null +++ b/starlingx-dashboard/starlingx-dashboard/starlingx_dashboard/static/dashboard/fault_management/events_suppression/events_suppression.controller.js @@ -0,0 +1,91 @@ +/** + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. You may obtain + * a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +/** + * Copyright (c) 2024 Wind River Systems, Inc. + * + * SPDX-License-Identifier: Apache-2.0 + * + */ + +(function() { + 'use strict'; + + angular + .module('horizon.dashboard.fault_management.events_suppression') + .controller('EventsSuppressionController', ['horizon.dashboard.fault_management.events_suppression.service', '$scope', EventsSuppressionController]); + + var fieldMappings = { + 'alarm_id': 'Event ID', + 'description': 'Description', + 'suppression_status': 'Status' + }; + + function EventsSuppressionController(eventsSuppressionService, $scope) { + $scope.downloadEventsSuppressionData = function() { + eventsSuppressionService.getPromise().then(function(response) { + var csvData = convertToCSV(response.data.items, fieldMappings); + triggerDownload(csvData, 'events-suppression-data.csv'); + }); + }; + + function convertToCSV(objArray, fieldMappings) { + var array = objArray; + var str = ''; + var row = ''; + + // Header + for (var index in objArray[0]) { + if (fieldMappings[index]) { + row += '"' + fieldMappings[index].replace(/"/g, '""') + '",'; + } + } + row = row.slice(0, -1); + str += row + '\r\n'; + + // Data + for (var i = 0; i < array.length; i++) { + var line = ''; + for (var index in array[i]) { + if (fieldMappings[index]) { + var data = array[i][index]; + + if (data && typeof data === 'string') { + // Escape double quotes and replace internal line breaks + data = data.replace(/"/g, '""').replace(/(\r\n|\n|\r)/gm, " "); + } + + line += '"' + data + '",'; + } + } + line = line.slice(0, -1); + str += line + '\r\n'; + } + return str; + } + + function triggerDownload(csvData, filename) { + var blob = new Blob([csvData], { type: 'text/csv;charset=utf-8;' }); + var link = document.createElement("a"); + if (link.download !== undefined) { + var url = URL.createObjectURL(blob); + link.setAttribute("href", url); + link.setAttribute("download", filename); + link.style.visibility = 'hidden'; + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + } + } + } + })(); diff --git a/starlingx-dashboard/starlingx-dashboard/starlingx_dashboard/static/dashboard/fault_management/events_suppression/events_suppression.module.js b/starlingx-dashboard/starlingx-dashboard/starlingx_dashboard/static/dashboard/fault_management/events_suppression/events_suppression.module.js index 7008583a..3be04941 100644 --- a/starlingx-dashboard/starlingx-dashboard/starlingx_dashboard/static/dashboard/fault_management/events_suppression/events_suppression.module.js +++ b/starlingx-dashboard/starlingx-dashboard/starlingx_dashboard/static/dashboard/fault_management/events_suppression/events_suppression.module.js @@ -12,7 +12,7 @@ * under the License. */ /** - * Copyright (c) 2019 Wind River Systems, Inc. + * Copyright (c) 2019-2024 Wind River Systems, Inc. * * SPDX-License-Identifier: Apache-2.0 * @@ -130,7 +130,8 @@ var path = $windowProvider.$get().STATIC_URL + 'dashboard/fault_management/events_suppression/'; $provide.constant('horizon.dashboard.fault_management.events_suppression.basePath', path); $routeProvider.when('/admin/events_suppression', { - templateUrl: path + 'panel.html' + templateUrl: path + 'panel.html', + controller: 'EventsSuppressionController', }); } })(); diff --git a/starlingx-dashboard/starlingx-dashboard/starlingx_dashboard/static/dashboard/fault_management/events_suppression/panel.html b/starlingx-dashboard/starlingx-dashboard/starlingx_dashboard/static/dashboard/fault_management/events_suppression/panel.html index 2734f711..acb2506b 100644 --- a/starlingx-dashboard/starlingx-dashboard/starlingx_dashboard/static/dashboard/fault_management/events_suppression/panel.html +++ b/starlingx-dashboard/starlingx-dashboard/starlingx_dashboard/static/dashboard/fault_management/events_suppression/panel.html @@ -2,5 +2,9 @@ - +
+ Export CSV Report +
+ +