From f44b51bff8634f7eac54bcab983d19483f8b5b69 Mon Sep 17 00:00:00 2001 From: Jorge Miguel Lobo Escalona <47326048+jloboescalona2@users.noreply.github.com> Date: Tue, 4 May 2021 13:11:08 +0200 Subject: [PATCH] B #5371: Warning for async actions in services (#1176) Co-authored-by: Jorge Lobo --- .../tabs/oneflow-services-tab/panels/info.js | 182 ++++++++++++++++-- .../oneflow-services-tab/panels/info/html.hbs | 3 + .../public/app/tabs/vms-tab/panels/info.js | 42 ++-- 3 files changed, 192 insertions(+), 35 deletions(-) diff --git a/src/sunstone/public/app/tabs/oneflow-services-tab/panels/info.js b/src/sunstone/public/app/tabs/oneflow-services-tab/panels/info.js index 3a113da00d..4a7315cab7 100644 --- a/src/sunstone/public/app/tabs/oneflow-services-tab/panels/info.js +++ b/src/sunstone/public/app/tabs/oneflow-services-tab/panels/info.js @@ -19,24 +19,29 @@ define(function(require) { DEPENDENCIES */ - var Humanize = require('utils/humanize'); - var Locale = require('utils/locale'); - var OpenNebulaService = require('opennebula/service'); - var PermissionsTable = require('utils/panel/permissions-table'); - var RenameTr = require('utils/panel/rename-tr'); + var Humanize = require("utils/humanize"); + var Locale = require("utils/locale"); + var OpenNebulaService = require("opennebula/service"); + var PermissionsTable = require("utils/panel/permissions-table"); + var RenameTr = require("utils/panel/rename-tr"); + var TemplateUtils = require("utils/template-utils"); + var Sunstone = require("sunstone"); + + var OpenNebulaAction = require("opennebula/action"); + var OpenNebula = require("opennebula"); /* TEMPLATES */ - var TemplateHTML = require('hbs!./info/html'); + var TemplateHTML = require("hbs!./info/html"); /* CONSTANTS */ - var TAB_ID = require('../tabId'); - var PANEL_ID = require('./info/panelId'); + var TAB_ID = require("../tabId"); + var PANEL_ID = require("./info/panelId"); var XML_ROOT = "DOCUMENT"; var RESOURCE = "Service"; @@ -56,6 +61,7 @@ define(function(require) { Panel.PANEL_ID = PANEL_ID; Panel.prototype.html = _html; Panel.prototype.setup = _setup; + Panel.prototype.onShow = _onShow; return Panel; @@ -63,17 +69,161 @@ define(function(require) { FUNCTION DEFINITIONS */ + function dismissWarning(){ + $(".close_flowvms_async_error").off("click").on("click", function(e){ + e.preventDefault(); + var vm_pool = OpenNebulaAction.cache("VM"); + var element = $(this); + var dataIds = element.data("ids"); + if(dataIds !== undefined && vm_pool && vm_pool.data){ + var ids = String(dataIds).split(","); + + var findVm = function(id){ + return vm_pool.data.find(function(vm){ + return vm && vm.VM && vm.VM.ID === id; + }); + }; + ids.forEach(id => { + var vmData = findVm(id); + var templateJSON = $.extend({}, vmData.VM.USER_TEMPLATE); + delete templateJSON.ERROR; + template_str = TemplateUtils.templateToString(templateJSON); + Sunstone.runAction("VM.update_template", id, template_str); + element.closest(".warning-message").hide("1500", function(){ + $(this).remove(); + }); + }); + } + }); + } + function _html() { + var that = this; var renameTrHTML = RenameTr.html(TAB_ID, RESOURCE, this.element.NAME); var permissionsTableHTML = PermissionsTable.html(TAB_ID, RESOURCE, this.element); - var prettyStartTime = Humanize.prettyTime(this.element.TEMPLATE.BODY['start_time']); + var prettyStartTime = Humanize.prettyTime(this.element.TEMPLATE.BODY["start_time"]); + + var errorMessageHTML = ""; + var async = false; + + function getVmPool(callback, errorCallback){ + var vm_pool = OpenNebulaAction.cache("VM"); + if(callback && typeof callback === "function"){ + if(vm_pool && vm_pool.data){ + callback(vm_pool.data); + }else{ + OpenNebula.VM.list({ + timeout: true, + success: function (request, item_list){ + if(item_list){ + async = true; + callback(item_list); + } + }, + error: function(){ + if(errorCallback && typeof errorCallback === "function"){ + errorCallback(); + } + } + }); + } + } + } + + // this render the alert + function renderAlertFromUserTemplate(vmPool){ + var errors = {}; + if( + vmPool && + that.element && + that.element.TEMPLATE && + that.element.TEMPLATE.BODY && + that.element.TEMPLATE.BODY.roles + ){ + var roles = Array.isArray(that.element.TEMPLATE.BODY.roles)? that.element.TEMPLATE.BODY.roles : [that.element.TEMPLATE.BODY.roles]; + roles.forEach(function(role){ + if(role && role.nodes){ + var nodes = Array.isArray(role.nodes)? role.nodes: [role.nodes]; + nodes.forEach(node => { + if(node && node.deploy_id !== undefined){ + + var datavm = vmPool.find(function(vm){ + if( + vm && + vm.VM && + vm.VM.ID === String(node.deploy_id) && + vm.VM.USER_TEMPLATE && + vm.VM.USER_TEMPLATE.ERROR + ){ + return true; + } + }); + + if( + datavm && + datavm.VM && + datavm.VM.ID && + datavm.VM.USER_TEMPLATE && + datavm.VM.USER_TEMPLATE.ERROR + ){ + if(errors[datavm.VM.USER_TEMPLATE.ERROR]){ + var value = errors[datavm.VM.USER_TEMPLATE.ERROR]; + value.push(datavm.VM.ID); + }else{ + errors[datavm.VM.USER_TEMPLATE.ERROR] = [datavm.VM.ID]; + } + } + } + }); + } + }); + } + + Object.keys(errors).forEach(function(element){ + if(element){ + render = $("
", {class:"callout warning warning-message", style:"border-radius: .5em;" }); + render.data("data-ids","dsad"); + render.append( + $("
", {class: "row"}).append( + $("
",{class: "columns large-1"}).append( + $("/", {class: "fas fa-exclamation-circle"}) + ).add( + $("
",{class: "columns large-9"}).append( + $("

").html( + Locale.tr("VM: ")+ + ""+errors[element].join(",")+" "+ + Locale.tr("has error: ")+ + ""+element+"" + ) + ) + ).add( + $("

",{class: "columns large-2"}).append( + $("",{class:"close_flowvms_async_error","data-ids": errors[element].join(",")}).append( + $("").text(Locale.tr("Dismiss")) + ) + ) + ) + ) + ); + errorMessageHTML += render.prop("outerHTML"); + } + }); + + if(async){ + $(".warningsVms").empty().append(errorMessageHTML); + dismissWarning(); + } + } + + getVmPool(renderAlertFromUserTemplate); return TemplateHTML({ - 'element': this.element, - 'renameTrHTML': renameTrHTML, - 'permissionsTableHTML': permissionsTableHTML, - 'stateStr': OpenNebulaService.stateStr(this.element.TEMPLATE.BODY.state), - 'prettyStartTime': prettyStartTime + "element": this.element, + "renameTrHTML": renameTrHTML, + "permissionsTableHTML": permissionsTableHTML, + "stateStr": OpenNebulaService.stateStr(this.element.TEMPLATE.BODY.state), + "prettyRegTime": prettyRegTime, + "errorMessageHTML": errorMessageHTML, }); } @@ -81,4 +231,8 @@ define(function(require) { RenameTr.setup(TAB_ID, RESOURCE, this.element.ID, context); PermissionsTable.setup(TAB_ID, RESOURCE, this.element, context); } + + function _onShow(context) { + dismissWarning(); + } }); diff --git a/src/sunstone/public/app/tabs/oneflow-services-tab/panels/info/html.hbs b/src/sunstone/public/app/tabs/oneflow-services-tab/panels/info/html.hbs index 63000da622..2876e326e3 100644 --- a/src/sunstone/public/app/tabs/oneflow-services-tab/panels/info/html.hbs +++ b/src/sunstone/public/app/tabs/oneflow-services-tab/panels/info/html.hbs @@ -69,6 +69,9 @@ +
+ {{{errorMessageHTML}}} +
{{{permissionsTableHTML}}}
diff --git a/src/sunstone/public/app/tabs/vms-tab/panels/info.js b/src/sunstone/public/app/tabs/vms-tab/panels/info.js index e1d03c2739..b5596a59f0 100644 --- a/src/sunstone/public/app/tabs/vms-tab/panels/info.js +++ b/src/sunstone/public/app/tabs/vms-tab/panels/info.js @@ -25,9 +25,9 @@ define(function(require) { var OpenNebula = require("opennebula"); var PermissionsTable = require("utils/panel/permissions-table"); var RenameTr = require("utils/panel/rename-tr"); - var Sunstone = require('sunstone'); + var Sunstone = require("sunstone"); var TemplateTable = require("utils/panel/template-table"); - var TemplateUtils = require('utils/template-utils'); + var TemplateUtils = require("utils/template-utils"); /* TEMPLATES @@ -43,9 +43,9 @@ define(function(require) { var PANEL_ID = require("./info/panelId"); var RESOURCE = "VM"; var XML_ROOT = "VM"; - var REGEX_VCENTER_ATTRS = /^VCENTER_/ + var REGEX_VCENTER_ATTRS = /^VCENTER_/; // Get rid of the unwanted (for show) SCHED_* keys - var REGEX_HIDDEN_ATTRS = /^(USER_INPUTS|BACKUP)$|SCHED_|ERROR/ + var REGEX_HIDDEN_ATTRS = /^(USER_INPUTS|BACKUP)$|SCHED_|ERROR/; /* CONSTRUCTOR @@ -80,7 +80,7 @@ define(function(require) { var lcmStateClass = OpenNebula.VM.lcmStateClass(this.element.LCM_STATE); var hostnameHTML = OpenNebula.VM.hostnameStrLink(this.element); var IP = OpenNebula.VM.ipsStr(this.element, { forceGroup: true }); - + var vrouterHTML = "--"; if (this.element.TEMPLATE.VROUTER_ID != undefined){ @@ -90,13 +90,13 @@ define(function(require) { ); } - var deployId = (typeof(this.element.DEPLOY_ID) == "object" ? "--" : this.element.DEPLOY_ID); + var deployId = (typeof(this.element.DEPLOY_ID) === "object" ? "--" : this.element.DEPLOY_ID); var resched = (parseInt(this.element.RESCHED) ? Locale.tr("yes") : Locale.tr("no")); var attributes = TemplateTable.getTemplatesAttributes(this.element.USER_TEMPLATE, { regexVCenter: REGEX_VCENTER_ATTRS, regexHidden: REGEX_HIDDEN_ATTRS - }) + }); var templateTableHTML = TemplateTable.html(attributes.general, RESOURCE, Locale.tr("Attributes")); var templateTableVcenterHTML = TemplateTable.html(attributes.vcenter, RESOURCE, Locale.tr("vCenter information")); @@ -113,14 +113,14 @@ define(function(require) { var monitoringTableContentHTML = !$.isEmptyObject(monitoring) && Humanize.prettyPrintJSON(monitoring); - var errorMessageHTML = "" - if (this.element && + var errorMessageHTML = ""; + if (this.element && this.element.USER_TEMPLATE && this.element.USER_TEMPLATE.ERROR){ - errorMessageHTML = - "