diff --git a/ironic_ui/static/dashboard/admin/ironic/ironic.service.js b/ironic_ui/static/dashboard/admin/ironic/ironic.service.js index 911ef4c2..83eaaf9c 100755 --- a/ironic_ui/static/dashboard/admin/ironic/ironic.service.js +++ b/ironic_ui/static/dashboard/admin/ironic/ironic.service.js @@ -59,7 +59,8 @@ ironicAPI.$inject = [ 'horizon.framework.util.http.service', - 'horizon.framework.widgets.toast.service' + 'horizon.framework.widgets.toast.service', + 'horizon.dashboard.admin.ironic.node-error.service' ]; /** @@ -67,9 +68,10 @@ * * @param {object} apiService - HTTP service * @param {object} toastService - User message service + * @param {object} nodeErrorService - Node error service * @return {object} Ironic API service */ - function ironicAPI(apiService, toastService) { + function ironicAPI(apiService, toastService, nodeErrorService) { var service = { createNode: createNode, createPort: createPort, @@ -101,7 +103,12 @@ */ function getNodes() { return apiService.get('/api/ironic/nodes/') - .error(function() { + .then(function(response) { + angular.forEach(response.data.items, function(node) { + nodeErrorService.checkNodeError(node); + }); + return response; + }, function() { toastService.add('error', gettext('Unable to retrieve Ironic nodes.')); }); @@ -118,7 +125,10 @@ */ function getNode(uuid) { return apiService.get('/api/ironic/nodes/' + uuid) - .error(function(reason) { + .then(function(response) { + nodeErrorService.checkNodeError(response.data); + return response; + }, function(reason) { var msg = gettext('Unable to retrieve the Ironic node: %s'); toastService.add('error', interpolate(msg, [reason], false)); }); diff --git a/ironic_ui/static/dashboard/admin/ironic/node-details/node-details.controller.js b/ironic_ui/static/dashboard/admin/ironic/node-details/node-details.controller.js index bd501448..00acd79f 100755 --- a/ironic_ui/static/dashboard/admin/ironic/node-details/node-details.controller.js +++ b/ironic_ui/static/dashboard/admin/ironic/node-details/node-details.controller.js @@ -137,21 +137,9 @@ * @return {promise} promise */ function retrieveNode(uuid) { - var lastError = ctrl.node ? ctrl.node.last_error : null; - return ironic.getNode(uuid).then(function (response) { ctrl.node = response.data; ctrl.node.id = uuid; - - if (lastError && - ctrl.node.last_error !== "" && - ctrl.node.last_error !== null && - ctrl.node.last_error !== lastError) { - toastService.add('error', - "Error detected on node " + - ctrl.node.name + ". " + - ctrl.node.last_error); - } }); } diff --git a/ironic_ui/static/dashboard/admin/ironic/node-error.service.js b/ironic_ui/static/dashboard/admin/ironic/node-error.service.js new file mode 100644 index 00000000..dc7b217b --- /dev/null +++ b/ironic_ui/static/dashboard/admin/ironic/node-error.service.js @@ -0,0 +1,80 @@ +/* + * © Copyright 2016 Cray Inc. + * + * 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. + */ + +(function () { + 'use strict'; + + angular + .module('horizon.dashboard.admin.ironic') + .service('horizon.dashboard.admin.ironic.node-error.service', + nodeErrorService); + + nodeErrorService.$inject = [ + 'horizon.framework.widgets.toast.service' + ]; + + function nodeErrorService(toastService) { + // Node last_error cache indexed by node uuid + var lastError = sessionStorage.nodeErrorService + ? angular.fromJson(sessionStorage.nodeErrorService) : {}; + + /** + * @description Get the error condition for a specified node + * + * @param {string} nodeUuid – node uuid + * @return {string} Error condition + */ + this.getLastError = function(nodeUuid) { + return angular.isDefined(lastError[nodeUuid]) + ? lastError[nodeUuid] : null; + }; + + /** + * @description Store the error condition for a specified node + * + * @param {node} node – node + * @return {void} + */ + function setLastError(node) { + lastError[node.uuid] = node.last_error; + // Store node error condition in browser session storage + // which provides persistence across page transitions. + sessionStorage.nodeErrorService = angular.toJson(lastError); + } + + /** + * @description Notify the user of a change in error condition for + * specified node. + * + * @param {node} node – node being checked + * @return {void} + */ + this.checkNodeError = function(node) { + if (node.last_error !== null && + node.last_error !== "" && + (!angular.isDefined(lastError[node.uuid]) || + node.last_error !== lastError[node.uuid])) { + toastService.add( + 'error', + "Detected change in error condition on node " + + node.name + ". " + + node.last_error); + } + // Update stored node error condition + setLastError(node); + }; + } +})(); diff --git a/ironic_ui/static/dashboard/admin/ironic/node-list/node-list.controller.js b/ironic_ui/static/dashboard/admin/ironic/node-list/node-list.controller.js index ae7d5b83..1b522833 100755 --- a/ironic_ui/static/dashboard/admin/ironic/node-list/node-list.controller.js +++ b/ironic_ui/static/dashboard/admin/ironic/node-list/node-list.controller.js @@ -147,14 +147,6 @@ angular.forEach(response.data.items, function (node) { node.id = node.uuid; promises.push(retrievePorts(node)); - - // Report any changes in last-error - if (node.last_error !== "" && - angular.isDefined(ctrl.nodesSrc[node.uuid]) && - node.last_error !== ctrl.nodesSrc[node.uuid].last_error) { - toastService.add('error', - "Node " + node.name + ". " + node.last_error); - } }); $q.all(promises).then(function() { ctrl.nodesSrc = response.data.items;