1
0
mirror of https://github.com/OpenNebula/one.git synced 2025-03-22 18:50:08 +03:00

B #5371: Warning for async actions in services (#1176)

Co-authored-by: Jorge Lobo <jlobo@opennebula.systems>
This commit is contained in:
Jorge Miguel Lobo Escalona 2021-05-04 13:11:08 +02:00 committed by Ruben S. Montero
parent d75c203b3a
commit f44b51bff8
No known key found for this signature in database
GPG Key ID: A0CEA6FA880A1D87
3 changed files with 192 additions and 35 deletions

View File

@ -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 = $("<div/>", {class:"callout warning warning-message", style:"border-radius: .5em;" });
render.data("data-ids","dsad");
render.append(
$("<div/>", {class: "row"}).append(
$("<div/>",{class: "columns large-1"}).append(
$("<i>/", {class: "fas fa-exclamation-circle"})
).add(
$("<div/>",{class: "columns large-9"}).append(
$("<p/>").html(
Locale.tr("VM: ")+
"<b>"+errors[element].join(",")+" </b>"+
Locale.tr("has error: ")+
"<b>"+element+"</b>"
)
)
).add(
$("<div/>",{class: "columns large-2"}).append(
$("<a/>",{class:"close_flowvms_async_error","data-ids": errors[element].join(",")}).append(
$("<u/>").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();
}
});

View File

@ -69,6 +69,9 @@
</tr>
</tbody>
</table>
<div class="warningsVms">
{{{errorMessageHTML}}}
</div>
</div>
<div class="large-6 columns">{{{permissionsTableHTML}}}</div>
</div>

View File

@ -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 =
"<div class='row'>" +
"<div class='large-9 columns'>" +
"<div class='callout warning warning-message' style='border-radius: .5em;' data-closable>" +
errorMessageHTML =
"<div class='row'>" +
"<div class='large-9 columns'>" +
"<div class='callout warning warning-message' style='border-radius: .5em;' data-closable>" +
"<div class='row'>"+
"<div class='columns large-1'>" +
"<i class='fas fa-exclamation-circle'></i>"+
@ -128,7 +128,7 @@ define(function(require) {
"<div class='columns large-9'>"+
"<p>" + this.element.USER_TEMPLATE.ERROR + "</p>" +
"</div>"+
"<div class='columns large-2'>" +
"<div class='columns large-2'>" +
"<a id='close_vm_async_error' data-close>" +
"<u>Dismiss</u>"+
"</a>" +
@ -157,21 +157,21 @@ define(function(require) {
"templateTableHTML": templateTableHTML,
"monitoringTableContentHTML": monitoringTableContentHTML,
"vrouterHTML": vrouterHTML,
"errorMessageHTML": errorMessageHTML,
"errorMessageHTML": errorMessageHTML
});
}
function _setup(context) {
var that = this;
RenameTr.setup(TAB_ID, RESOURCE, this.element.ID, context);
PermissionsTable.setup(TAB_ID, RESOURCE, this.element, context);
var attributes = TemplateTable.getTemplatesAttributes(this.element.USER_TEMPLATE, {
regexVCenter: REGEX_VCENTER_ATTRS,
regexHidden: REGEX_HIDDEN_ATTRS
})
});
if($.isEmptyObject(attributes.vcenter)){
$(".vcenter", context).hide();
}
@ -192,9 +192,9 @@ define(function(require) {
});
if (OpenNebula.VM.isvCenterVM(this.element)) {
$('button[href="VM.upload_marketplace_dialog"]').attr('disabled','disabled');
$("button[href=\"VM.upload_marketplace_dialog\"]").attr("disabled","disabled");
} else {
$('button[href="VM.upload_marketplace_dialog"]').removeAttr('disabled');
$("button[href=\"VM.upload_marketplace_dialog\"]").removeAttr("disabled");
}
}
});