mirror of
https://github.com/OpenNebula/one.git
synced 2025-02-23 21:57:43 +03:00
Feature #1098: Fix sunstone server acct results and add acct information for groups
(cherry picked from commit 4e941e1a1dbb477f6ab4c748b5d5ad28b190b1d2)
This commit is contained in:
parent
349d1d2f2c
commit
048ddc6624
@ -301,17 +301,17 @@ class SunstoneServer < CloudServer
|
||||
# meter2 : [[ts1, agg_value],[ts2, agg_value]...]}
|
||||
# with this information we can paint historical graphs of usage
|
||||
def get_user_accounting(options)
|
||||
uid = options[:id]
|
||||
uid = options[:id].to_i
|
||||
tstart = options[:start].to_i
|
||||
tend = options[:end].to_i
|
||||
interval = options[:interval].to_i
|
||||
meters = options[:monitor_resources]
|
||||
gid = options[:gid]
|
||||
gid = options[:gid].to_i
|
||||
|
||||
acct_options = {:start_time => tstart,
|
||||
acct_options = {:start_time => tstart,
|
||||
:end_time => tend}
|
||||
if gid
|
||||
uid = INFO_ALL
|
||||
uid = Pool::INFO_ALL
|
||||
acct_options[:group] = gid
|
||||
end
|
||||
|
||||
@ -335,12 +335,12 @@ class SunstoneServer < CloudServer
|
||||
|
||||
tstep = tstart + interval
|
||||
count = Hash.new
|
||||
|
||||
xml_step.each("HISTORY[STIME >= #{tstart} and ETIME <= #{tstep}]") do |hr|
|
||||
|
||||
xml.each("HISTORY[STIME<=#{tstep} and ETIME=0 or STIME<=#{tstep} and ETIME>=#{tstart}]") do |hr|
|
||||
|
||||
meters_a.each do | meter |
|
||||
count[meter] ||= 0
|
||||
count[meter] += hr["VM/#{meter}"].to_if if hr["VM/#{meter}"]
|
||||
count[meter] += hr["VM/#{meter}"].to_i if hr["VM/#{meter}"]
|
||||
end
|
||||
end
|
||||
|
||||
@ -351,7 +351,7 @@ class SunstoneServer < CloudServer
|
||||
tstart = tstep
|
||||
end
|
||||
|
||||
return [200, {:accounting => result}.to_json]
|
||||
return [200, {:monitoring => result}.to_json]
|
||||
end
|
||||
|
||||
private
|
||||
|
@ -711,6 +711,9 @@ var OpenNebula = {
|
||||
},
|
||||
"show" : function(params){
|
||||
OpenNebula.Action.show(params,OpenNebula.Group.resource);
|
||||
},
|
||||
"accounting" : function(params){
|
||||
OpenNebula.Action.monitor(params,OpenNebula.Group.resource,false);
|
||||
}
|
||||
},
|
||||
|
||||
|
@ -19,6 +19,17 @@ var dataTable_groups;
|
||||
var $create_group_dialog;
|
||||
var $group_quotas_dialog;
|
||||
|
||||
var group_acct_graphs = [
|
||||
{ title : tr("CPU"),
|
||||
monitor_resources : "CPU",
|
||||
humanize_figures : false
|
||||
},
|
||||
{ title : tr("Memory"),
|
||||
monitor_resources : "MEMORY",
|
||||
humanize_figures : true
|
||||
}
|
||||
];
|
||||
|
||||
var groups_tab_content = '\
|
||||
<h2><i class="icon-group"></i> '+tr("Groups")+'</h2>\
|
||||
<form id="group_form" action="" action="javascript:alert(\'js error!\');">\
|
||||
@ -217,6 +228,17 @@ var group_actions = {
|
||||
},
|
||||
error: onError
|
||||
},
|
||||
|
||||
"Group.accounting" : {
|
||||
type: "monitor",
|
||||
call: OpenNebula.Group.accounting,
|
||||
callback: function(req,response) {
|
||||
var info = req.request.data[0].monitor;
|
||||
plot_graph(response,'#group_acct_tab','group_acct_', info);
|
||||
},
|
||||
error: onError
|
||||
},
|
||||
|
||||
"Group.help" : {
|
||||
type: "custom",
|
||||
call: function() {
|
||||
@ -265,6 +287,10 @@ var group_info_panel = {
|
||||
"group_info_tab" : {
|
||||
title: tr("Group information"),
|
||||
content:""
|
||||
},
|
||||
"group_acct_tab" : {
|
||||
title: tr("Historical usages"),
|
||||
content: ""
|
||||
}
|
||||
};
|
||||
|
||||
@ -433,8 +459,92 @@ function updateGroupInfo(request,group){
|
||||
content : info_tab_html
|
||||
};
|
||||
|
||||
|
||||
var acct_tab = {
|
||||
title : tr("Historical usages"),
|
||||
content : '<div><table class="info_table" style="margin-bottom:0">\
|
||||
<tr>\
|
||||
<td class="key_td"><label for="from">'+tr('From / to')+'</label></td>\
|
||||
<td class="value_td">\
|
||||
<input type="text" id="group_acct_from" name="from"/>\
|
||||
<input type="text" id="group_acct_to" name="to"/>\
|
||||
<button id="group_acct_date_ok"><i class="icon-ok"></i></button>\
|
||||
</td>\
|
||||
</tr>\
|
||||
<!--\
|
||||
<tr>\
|
||||
<td class="key_td"><label for="from">'+tr('Meters')+'</label></td>\
|
||||
<td class="value_td">\
|
||||
<select style="width:173px" id="group_acct_meter1" name="meter1">\
|
||||
</select>\
|
||||
<select style="width:173px" id="group_acct_meter2" name="meter2">\
|
||||
</select>\
|
||||
</td>\
|
||||
</tr>\
|
||||
-->\
|
||||
</table></div>' + generateMonitoringDivs(group_acct_graphs, "group_acct_")
|
||||
};
|
||||
|
||||
Sunstone.updateInfoPanelTab("group_info_panel","group_info_tab",info_tab);
|
||||
Sunstone.updateInfoPanelTab("group_info_panel","group_acct_tab",acct_tab);
|
||||
Sunstone.popUpInfoPanel("group_info_panel");
|
||||
|
||||
|
||||
//Enable datepicker
|
||||
var info_dialog = $('div#group_acct_tab');
|
||||
$("#group_acct_from", info_dialog).datepicker({
|
||||
defaultDate: "-1d",
|
||||
changeMonth: true,
|
||||
numberOfMonths: 1,
|
||||
dateFormat: "dd/mm/yy",
|
||||
defaultDate: '-1',
|
||||
onSelect: function( selectedDate ) {
|
||||
$( "#group_acct_to", info_dialog).datepicker("option",
|
||||
"minDate",
|
||||
selectedDate );
|
||||
}
|
||||
});
|
||||
$("#group_acct_from", info_dialog).datepicker('setDate', '-1');
|
||||
|
||||
$("#group_acct_to", info_dialog).datepicker({
|
||||
defaultDate: "0",
|
||||
changeMonth: true,
|
||||
numberOfMonths: 1,
|
||||
dateFormat: "dd/mm/yy",
|
||||
maxDate: '+1',
|
||||
onSelect: function( selectedDate ) {
|
||||
$( "#group_acct_from", info_dialog).datepicker( "option",
|
||||
"maxDate",
|
||||
selectedDate );
|
||||
}
|
||||
});
|
||||
$("#group_acct_to", info_dialog).datepicker('setDate', 'Now');
|
||||
|
||||
//Listen to set date button
|
||||
$('button#group_acct_date_ok', info_dialog).click(function(){
|
||||
var from = $("#group_acct_from", info_dialog).val();
|
||||
var to = $("#group_acct_to", info_dialog).val();
|
||||
|
||||
var start = $.datepicker.parseDate('dd/mm/yy', from)
|
||||
if (start){
|
||||
start = start.getTime();
|
||||
start = Math.floor(start / 1000);
|
||||
}
|
||||
|
||||
var end = $.datepicker.parseDate('dd/mm/yy', to);
|
||||
if (end){
|
||||
end = end.getTime();
|
||||
end = Math.floor(end / 1000);
|
||||
}
|
||||
|
||||
loadAccounting('Group', info.ID, group_acct_graphs,
|
||||
{ start : start, end: end });
|
||||
return false;
|
||||
});
|
||||
|
||||
//preload acct
|
||||
loadAccounting('Group', info.ID, group_acct_graphs);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
@ -460,7 +460,7 @@ var user_info_panel = {
|
||||
content:""
|
||||
},
|
||||
"user_acct_tab" : {
|
||||
title: tr("Historical usage"),
|
||||
title: tr("Historical usages"),
|
||||
content: ""
|
||||
}
|
||||
};
|
||||
@ -670,15 +670,25 @@ function updateUserInfo(request,user){
|
||||
title : tr("Historical usages"),
|
||||
content : '<div><table class="info_table" style="margin-bottom:0">\
|
||||
<tr>\
|
||||
<td class="key_td"><label for="from">From / to</label></td>\
|
||||
<td class="key_td"><label for="from">'+tr('From / to')+'</label></td>\
|
||||
<td class="value_td">\
|
||||
<input type="text" id="user_acct_from" name="from"/>\
|
||||
<input type="text" id="user_acct_to" name="to"/>\
|
||||
<button id="user_acct_date_ok"><i class="icon-ok"></i></button>\
|
||||
</td>\
|
||||
</tr>\
|
||||
</table></div>' +
|
||||
generateMonitoringDivs(user_acct_graphs, "user_acct_")
|
||||
<!--\
|
||||
<tr>\
|
||||
<td class="key_td"><label for="from">'+tr('Meters')+'</label></td>\
|
||||
<td class="value_td">\
|
||||
<select style="width:173px" id="user_acct_meter1" name="meter1">\
|
||||
</select>\
|
||||
<select style="width:173px" id="user_acct_meter2" name="meter2">\
|
||||
</select>\
|
||||
</td>\
|
||||
</tr>\
|
||||
-->\
|
||||
</table></div>' + generateMonitoringDivs(user_acct_graphs, "user_acct_")
|
||||
};
|
||||
|
||||
Sunstone.updateInfoPanelTab("user_info_panel","user_info_tab",info_tab);
|
||||
@ -686,23 +696,6 @@ generateMonitoringDivs(user_acct_graphs, "user_acct_")
|
||||
Sunstone.updateInfoPanelTab("user_info_panel","user_acct_tab",acct_tab);
|
||||
Sunstone.popUpInfoPanel("user_info_panel");
|
||||
|
||||
var load_acct = function(start,end){
|
||||
//default start 24 hours ago
|
||||
if (!start) start = Math.floor(new Date().getTime()/1000) - 3600 * 24;
|
||||
//default end now
|
||||
if (!end) end = Math.floor(new Date().getTime()/1000);
|
||||
for (var i=0; i<user_acct_graphs.length; i++){
|
||||
var graph_cfg = user_acct_graphs[i];
|
||||
graph_cfg.start = start
|
||||
graph_cfg.end = end
|
||||
graph_cfg.interval = 60 * 60 //1 hour
|
||||
// If the date range is longer than 24 hours, then show only
|
||||
// date, otherwise show time in the x axis
|
||||
graph_cfg.show_date = (end - start) > (3600 * 24)? true : false;
|
||||
Sunstone.runAction("User.accounting",user_info.ID,graph_cfg);
|
||||
};
|
||||
};
|
||||
|
||||
//Enable datepicker
|
||||
var info_dialog = $('div#user_acct_tab');
|
||||
$("#user_acct_from", info_dialog).datepicker({
|
||||
@ -710,24 +703,28 @@ generateMonitoringDivs(user_acct_graphs, "user_acct_")
|
||||
changeMonth: true,
|
||||
numberOfMonths: 1,
|
||||
dateFormat: "dd/mm/yy",
|
||||
defaultDate: '-1',
|
||||
onSelect: function( selectedDate ) {
|
||||
$( "#user_acct_to", info_dialog).datepicker("option",
|
||||
"minDate",
|
||||
selectedDate );
|
||||
}
|
||||
});
|
||||
$("#user_acct_from", info_dialog).datepicker('setDate', '-1');
|
||||
|
||||
$("#user_acct_to", info_dialog).datepicker({
|
||||
defaultDate: "0",
|
||||
changeMonth: true,
|
||||
numberOfMonths: 1,
|
||||
dateFormat: "dd/mm/yy",
|
||||
maxDate: '+1',
|
||||
onSelect: function( selectedDate ) {
|
||||
$( "#user_acct_from", info_dialog).datepicker( "option",
|
||||
"maxDate",
|
||||
selectedDate );
|
||||
}
|
||||
});
|
||||
$("#user_acct_to", info_dialog).datepicker('setDate', 'Now');
|
||||
|
||||
//Listen to set date button
|
||||
$('button#user_acct_date_ok', info_dialog).click(function(){
|
||||
@ -746,12 +743,13 @@ generateMonitoringDivs(user_acct_graphs, "user_acct_")
|
||||
end = Math.floor(end / 1000);
|
||||
}
|
||||
|
||||
load_acct(start,end);
|
||||
loadAccounting('User', user_info.ID, user_acct_graphs,
|
||||
{ start : start, end: end });
|
||||
return false;
|
||||
});
|
||||
|
||||
//preload acct
|
||||
load_acct();
|
||||
loadAccounting('User', user_info.ID, user_acct_graphs);
|
||||
};
|
||||
|
||||
// Prepare the user creation dialog
|
||||
|
@ -1227,4 +1227,22 @@ function progressBar(value, opts){
|
||||
</div>\
|
||||
</div>\
|
||||
</div>';
|
||||
}
|
||||
|
||||
function loadAccounting(resource, id, graphs, options){
|
||||
var now = Math.floor(new Date().getTime() / 1000)
|
||||
var start = options && options.start ? options.start : now - (3600 * 24);
|
||||
var end = options && options.end ? options.end : now;
|
||||
var interval = options && options.interval ? options.interval : 60 * 60;
|
||||
|
||||
for (var i = 0; i < graphs.length; i++){
|
||||
var graph_cfg = graphs[i];
|
||||
graph_cfg.start = start
|
||||
graph_cfg.end = end
|
||||
graph_cfg.interval = interval
|
||||
// If the date range is longer than 24 hours, then show only
|
||||
// date, otherwise show time in the x axis
|
||||
graph_cfg.show_date = (end - start) > (3600 * 24)? true : false;
|
||||
Sunstone.runAction(resource+".accounting", id, graph_cfg);
|
||||
};
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user