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

F #5539: Host capacity take into account Cluster overcommitment (#572)

This commit is contained in:
Abel Coronado 2017-11-14 14:41:58 +01:00 committed by Tino Vázquez
parent 69b3e4d9b1
commit dda3ceaad4
6 changed files with 161 additions and 97 deletions

View File

@ -116,6 +116,10 @@ define(function(require) {
});
},
"cache": function(resource) {
return listCache[resource];
},
"list": function(params, resource, path, process) {
var callback = params.success;
var callbackError = params.error;

View File

@ -81,6 +81,7 @@ define(function(require) {
'html': require('hbs!./dashboard-tab/hosts'),
'onShow': function() {
Sunstone.runAction("Host.list");
Sunstone.runAction("Cluster.list");
}
},
'vms': {

View File

@ -19,15 +19,18 @@ define(function(require) {
DEPENDENCIES
*/
var TabDataTable = require('utils/tab-datatable');
var SunstoneConfig = require('sunstone-config');
var Locale = require('utils/locale');
var Humanize = require('utils/humanize');
var CPUBars = require('./utils/cpu-bars');
var MemoryBars = require('./utils/memory-bars');
var OpenNebulaHost = require('opennebula/host');
var LabelsUtils = require('utils/labels/utils');
var SearchDropdown = require('hbs!./datatable/search');
var TabDataTable = require("utils/tab-datatable");
var SunstoneConfig = require("sunstone-config");
var Locale = require("utils/locale");
var Humanize = require("utils/humanize");
var CPUBars = require("./utils/cpu-bars");
var MemoryBars = require("./utils/memory-bars");
var Reserved = require("./utils/reserved");
var OpenNebulaHost = require("opennebula/host");
var LabelsUtils = require("utils/labels/utils");
var SearchDropdown = require("hbs!./datatable/search");
var OpenNebulaAction = require("opennebula/action");
var Sunstone = require("sunstone");
/*
@ -36,10 +39,10 @@ define(function(require) {
var RESOURCE = "Host";
var XML_ROOT = "HOST";
var TAB_NAME = require('./tabId');
var TAB_NAME = require("./tabId");
var LABELS_COLUMN = 13;
var SEARCH_COLUMN = 14;
var TEMPLATE_ATTR = 'TEMPLATE';
var TEMPLATE_ATTR = "TEMPLATE";
/*
CONSTRUCTOR
@ -62,10 +65,10 @@ define(function(require) {
{"sWidth": "35px", "aTargets": [0]},
{"sWidth": "155px", "aTargets": [6, 8]},
{"bVisible": true, "aTargets": SunstoneConfig.tabTableColumns(TAB_NAME)},
{"bVisible": false, "aTargets": ['_all']},
{"bVisible": false, "aTargets": ["_all"]},
{"sType": "num", "aTargets": [1, 4]}
]
}
};
this.columns = [
Locale.tr("ID") ,
@ -123,10 +126,15 @@ define(function(require) {
*/
function _elementArray(element_json) {
var cache = OpenNebulaAction.cache("CLUSTER");
if (!cache){
Sunstone.runAction("Cluster.list");
cache = OpenNebulaAction.cache("CLUSTER");
}
var element = element_json.HOST;
var cpuBars = CPUBars.html(element);
var memoryBars = MemoryBars.html(element);
var elementAux = Reserved.updateHostTemplate(cache, element);
var cpuBars = CPUBars.html(elementAux);
var memoryBars = MemoryBars.html(elementAux);
this.totalHosts++;
@ -168,9 +176,9 @@ define(function(require) {
}
return [
'<input class="check_item" type="checkbox" id="' + RESOURCE.toLowerCase() + '_' +
element.ID + '" name="selected_items" value="' +
element.ID + '"/>',
"<input class=\"check_item\" type=\"checkbox\" id=\"" + RESOURCE.toLowerCase() + "_" +
element.ID + "\" name=\"selected_items\" value=\"" +
element.ID + "\"/>",
element.ID,
element.NAME,
element.CLUSTER.length ? element.CLUSTER : "-",
@ -183,7 +191,7 @@ define(function(require) {
element.IM_MAD,
element.VM_MAD,
Humanize.prettyTime(element.LAST_MON_TIME),
(LabelsUtils.labelsStr(element[TEMPLATE_ATTR])||''),
(LabelsUtils.labelsStr(element[TEMPLATE_ATTR])||""),
btoa(unescape(encodeURIComponent(JSON.stringify(search))))
];
}
@ -210,7 +218,7 @@ define(function(require) {
var ratio_allocated_cpu = 0;
if (this.maxCPU > 0) {
ratio_allocated_cpu = Math.round((this.allocatedCPU / this.maxCPU) * 100);
info_str = this.allocatedCPU + ' / ' + this.maxCPU ;
info_str = this.allocatedCPU + " / " + this.maxCPU ;
} else {
info_str = "- / -";
}
@ -228,7 +236,7 @@ define(function(require) {
var ratio_real_cpu = 0;
if (this.maxCPU > 0) {
ratio_real_cpu = Math.round((this.realCPU / this.maxCPU) * 100);
info_str = this.realCPU + ' / ' + this.maxCPU;
info_str = this.realCPU + " / " + this.maxCPU;
} else {
info_str = "- / -";
}
@ -244,9 +252,9 @@ define(function(require) {
var ratio_allocated_mem = 0;
if (this.maxMemory > 0) {
ratio_allocated_mem = Math.round((this.allocatedMemory / this.maxMemory) * 100);
info_str = Humanize.size(this.allocatedMemory) + ' / ' + Humanize.size(this.maxMemory);
info_str = Humanize.size(this.allocatedMemory) + " / " + Humanize.size(this.maxMemory);
} else {
info_str = Humanize.size(this.allocatedMemory) + ' / -';
info_str = Humanize.size(this.allocatedMemory) + " / -";
}
$("#dashboard_host_allocated_mem").html(quotaDashboard(
@ -260,9 +268,9 @@ define(function(require) {
var ratio_real_mem = 0;
if (this.maxMemory > 0) {
ratio_real_mem = Math.round((this.realMemory / this.maxMemory) * 100);
info_str = Humanize.size(this.realMemory) + ' / ' + Humanize.size(this.maxMemory);
info_str = Humanize.size(this.realMemory) + " / " + Humanize.size(this.maxMemory);
} else {
info_str = Humanize.size(this.realMemory) + ' / -';
info_str = Humanize.size(this.realMemory) + " / -";
}
$("#dashboard_host_real_mem").html(quotaDashboard(
@ -278,20 +286,20 @@ define(function(require) {
function quotaDashboard(html_tag, legend, font_large_size, font_small_size, quota) {
var percentage = quota.percentage > 100 ? 100 : quota.percentage;
return '<div class="row">' +
'<div class="large-12 columns">' +
'<span>' + legend + '</span>' +
'</div>' +
'</div>' +
'<div class="row">' +
'<div class="large-12 columns">' +
' <meter id="' + html_tag + '_meter" min="0" low="33" high="66" optimum="0" max="100" value="' + percentage + '"></meter>' +
'</div>' +
'</div>' +
'<div class="row">' +
'<div class="large-12 columns">' +
'<span id="' + html_tag + '_str" class="right">' + quota.str + '</span>' +
'</div>' +
'</div>';
return "<div class=\"row\">" +
"<div class=\"large-12 columns\">" +
"<span>" + legend + "</span>" +
"</div>" +
"</div>" +
"<div class=\"row\">" +
"<div class=\"large-12 columns\">" +
" <meter id=\"" + html_tag + "_meter\" min=\"0\" low=\"33\" high=\"66\" optimum=\"0\" max=\"100\" value=\"" + percentage + "\"></meter>" +
"</div>" +
"</div>" +
"<div class=\"row\">" +
"<div class=\"large-12 columns\">" +
"<span id=\"" + html_tag + "_str\" class=\"right\">" + quota.str + "</span>" +
"</div>" +
"</div>";
}
});

View File

@ -17,40 +17,42 @@ define(function(require) {
/*
DEPENDENCIES
*/
require('foundation');
var Locale = require('utils/locale');
var Humanize = require('utils/humanize');
var RenameTr = require('utils/panel/rename-tr');
var TemplateTable = require('utils/panel/template-table');
var TemplateTableVcenter = require('utils/panel/template-table');
var PermissionsTable = require('utils/panel/permissions-table');
var ClusterTr = require('utils/panel/cluster-tr');
var OpenNebulaHost = require('opennebula/host');
var CPUBars = require('../utils/cpu-bars');
var MemoryBars = require('../utils/memory-bars');
var DatastoresCapacityTable = require('../utils/datastores-capacity-table');
var CanImportWilds = require('../utils/can-import-wilds');
var Sunstone = require('sunstone');
var TemplateUtils = require('utils/template-utils');
var CapacityTable = require('utils/custom-tags-table');
var EC2Tr = require('utils/panel/ec2-tr');
require("foundation");
var Locale = require("utils/locale");
var Humanize = require("utils/humanize");
var RenameTr = require("utils/panel/rename-tr");
var TemplateTable = require("utils/panel/template-table");
var TemplateTableVcenter = require("utils/panel/template-table");
var PermissionsTable = require("utils/panel/permissions-table");
var ClusterTr = require("utils/panel/cluster-tr");
var OpenNebulaHost = require("opennebula/host");
var CPUBars = require("../utils/cpu-bars");
var MemoryBars = require("../utils/memory-bars");
var Reserved = require("../utils/reserved");
var DatastoresCapacityTable = require("../utils/datastores-capacity-table");
var CanImportWilds = require("../utils/can-import-wilds");
var Sunstone = require("sunstone");
var TemplateUtils = require("utils/template-utils");
var CapacityTable = require("utils/custom-tags-table");
var EC2Tr = require("utils/panel/ec2-tr");
var OpenNebulaAction = require("opennebula/action");
/*
TEMPLATES
*/
var TemplateInfo = require('hbs!./info/html');
var TemplateInfo = 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 RESOURCE = "Host";
var XML_ROOT = "HOST";
var OVERCOMMIT_DIALOG_ID = require('utils/dialogs/overcommit/dialogId');
var OVERCOMMIT_DIALOG_ID = require("utils/dialogs/overcommit/dialogId");
/*
CONSTRUCTOR
@ -70,7 +72,7 @@ define(function(require) {
that.unshownTemplate = {};
that.strippedTemplateVcenter = {};
that.strippedTemplate = {};
var unshownKeys = ['HOST', 'VM', 'WILDS', 'ZOMBIES', 'RESERVED_CPU', 'RESERVED_MEM', "EC2_ACCESS", "EC2_SECRET", "CAPACITY", "REGION_NAME"];
var unshownKeys = ["HOST", "VM", "WILDS", "ZOMBIES", "RESERVED_CPU", "RESERVED_MEM", "EC2_ACCESS", "EC2_SECRET", "CAPACITY", "REGION_NAME"];
$.each(that.element.TEMPLATE, function(key, value) {
if ($.inArray(key, unshownKeys) > -1) {
that.unshownTemplate[key] = value;
@ -96,6 +98,13 @@ define(function(require) {
FUNCTION DEFINITIONS
*/
function _html() {
var cache = OpenNebulaAction.cache("CLUSTER");
if (!cache){
Sunstone.runAction("Cluster.list");
cache = OpenNebulaAction.cache("CLUSTER");
}
var elementAux = Reserved.updateHostTemplate(cache, this.element);
var templateTableHTML = TemplateTable.html(
this.strippedTemplate,
RESOURCE,
@ -107,30 +116,30 @@ define(function(require) {
var renameTrHTML = RenameTr.html(TAB_ID, RESOURCE, this.element.NAME);
var clusterTrHTML = ClusterTr.html(this.element.CLUSTER);
var permissionsTableHTML = PermissionsTable.html(TAB_ID, RESOURCE, this.element);
var cpuBars = CPUBars.html(this.element);
var memoryBars = MemoryBars.html(this.element);
var cpuBars = CPUBars.html(elementAux);
var memoryBars = MemoryBars.html(elementAux);
var datastoresCapacityTableHTML = DatastoresCapacityTable.html(this.element);
var realCPU = parseInt(this.element.HOST_SHARE.TOTAL_CPU);
var realMEM = parseInt(this.element.HOST_SHARE.TOTAL_MEM);
return TemplateInfo({
'element': this.element,
'renameTrHTML': renameTrHTML,
'clusterTrHTML': clusterTrHTML,
'templateTableHTML': templateTableHTML,
'templateTableVcenterHTML': templateTableVcenterHTML,
'permissionsTableHTML': permissionsTableHTML,
'cpuBars': cpuBars,
'memoryBars': memoryBars,
'stateStr': OpenNebulaHost.stateStr(this.element.STATE),
'datastoresCapacityTableHTML': datastoresCapacityTableHTML,
'maxReservedMEM': realMEM * 2,
'maxReservedCPU': realCPU * 2,
'realCPU': realCPU,
'realMEM': Humanize.size(realMEM),
'virtualMEMInput': Humanize.size(this.element.HOST_SHARE.MAX_MEM),
'ec2_tr': EC2Tr.html(RESOURCE, this.element.TEMPLATE),
'capacityTableHTML': CapacityTable.html()
"element": this.element,
"renameTrHTML": renameTrHTML,
"clusterTrHTML": clusterTrHTML,
"templateTableHTML": templateTableHTML,
"templateTableVcenterHTML": templateTableVcenterHTML,
"permissionsTableHTML": permissionsTableHTML,
"cpuBars": cpuBars,
"memoryBars": memoryBars,
"stateStr": OpenNebulaHost.stateStr(this.element.STATE),
"datastoresCapacityTableHTML": datastoresCapacityTableHTML,
"maxReservedMEM": realMEM * 2,
"maxReservedCPU": realCPU * 2,
"realCPU": realCPU,
"realMEM": Humanize.size(realMEM),
"virtualMEMInput": Humanize.size(this.element.HOST_SHARE.MAX_MEM),
"ec2_tr": EC2Tr.html(RESOURCE, this.element.TEMPLATE),
"capacityTableHTML": CapacityTable.html()
});
}
@ -180,7 +189,7 @@ define(function(require) {
PermissionsTable.setup(TAB_ID, RESOURCE, this.element, context);
if($.isEmptyObject(this.strippedTemplateVcenter)){
$('.vcenter', context).hide();
$(".vcenter", context).hide();
}
//.off and .on prevent multiple clicks events

View File

@ -0,0 +1,44 @@
/* -------------------------------------------------------------------------- */
/* Copyright 2002-2017, OpenNebula Project, OpenNebula Systems */
/* */
/* 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. */
/* -------------------------------------------------------------------------- */
define(function(require) {
function _updateHostTemplate(cache, element) {
var elementAux = $.extend(true, {}, element);
if (cache && (elementAux.TEMPLATE.RESERVED_CPU === "" || elementAux.TEMPLATE.RESERVED_MEM === "")) {
$.each(cache.data, function(key, value){
if (value.CLUSTER.ID === elementAux.CLUSTER_ID){
if (elementAux.TEMPLATE.RESERVED_CPU === ""){
var cpuPercentage = value.CLUSTER.TEMPLATE.RESERVED_CPU.split("%")[0];
var cpu = cpuPercentage / 100 * elementAux.HOST_SHARE.MAX_CPU;
elementAux.HOST_SHARE.MAX_CPU = (elementAux.HOST_SHARE.MAX_CPU - cpu).toString();
}
if (elementAux.TEMPLATE.RESERVED_MEM === ""){
var memPercentage = value.CLUSTER.TEMPLATE.RESERVED_MEM.split("%")[0];
var mem = memPercentage / 100 * elementAux.HOST_SHARE.MAX_MEM;
elementAux.HOST_SHARE.MAX_MEM = (elementAux.HOST_SHARE.MAX_MEM - mem).toString();
}
}
});
}
return elementAux;
}
return {
"updateHostTemplate": _updateHostTemplate
};
});

View File

@ -16,12 +16,12 @@
define(function(require) {
var Locale = require('utils/locale');
var TemplateUtils = require('utils/template-utils');
var Humanize = require('utils/humanize');
var Locale = require("utils/locale");
var TemplateUtils = require("utils/template-utils");
var Humanize = require("utils/humanize");
function _fromJSONtoActionsTable(actions_array) {
var str = ""
var str = "";
if (!actions_array) {
return "";
@ -48,28 +48,26 @@ define(function(require) {
var time_str = Humanize.prettyTime(scheduling_action.TIME);
var str = "";
str += '<tr class="tr_action">\
<td class="action_row">' + TemplateUtils.htmlEncode(scheduling_action.ACTION) + '</td>\
<td nowrap class="time_row">' + time_str + '</td>\
str += "<tr class=\"tr_action\">\
<td class=\"action_row\">" + TemplateUtils.htmlEncode(scheduling_action.ACTION) + "</td>\
<td nowrap class=\"time_row\">" + time_str + "</td>\
<td>\
<div>\
<a id="minus" class="remove_action_x" href="#"><i class="fa fa-trash-o"/></a>\
<a id=\"minus\" class=\"remove_action_x\" href=\"#\"><i class=\"fa fa-trash-o\"/></a>\
</div>\
</td>\
</tr>';
</tr>";
return str;
}
function _convertDate(date_string){
date_string = date_string.split('/');
date_string = date_string.split("/");
return date_string[2] + "-" + date_string[1] + "-" + date_string[0];
}
return {
'fromJSONtoActionsTable': _fromJSONtoActionsTable,
'convertDate': _convertDate
"fromJSONtoActionsTable": _fromJSONtoActionsTable,
"convertDate": _convertDate
};
});