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

Feature #3748: Quotas dialog for users and groups

This commit is contained in:
Carlos Martín 2015-06-05 13:53:44 +02:00
parent a167f0cb0d
commit f0e5ad4231
11 changed files with 344 additions and 59 deletions

View File

@ -8,6 +8,7 @@ define(function(require) {
var DATATABLE_ID = "dataTableGroups";
var _dialogs = [
require('./groups-tab/dialogs/quotas')
];
var _panels = [

View File

@ -6,8 +6,10 @@ define(function(require) {
var OpenNebulaResource = require('opennebula/group');
var RESOURCE = "Group";
var XML_ROOT = "GROUP";
var TAB_ID = require('./tabId');
var CREATE_DIALOG_ID = require('./form-panels/create/formPanelId');
var QUOTAS_DIALOG_ID = require('./dialogs/quotas/dialogId');
var _actions = {
"Group.create" : {
@ -106,25 +108,38 @@ define(function(require) {
error: Notifier.onError,
},
/* TODO
"Group.fetch_quotas" : {
type: "single",
call: OpenNebula.Group.show,
callback: function (request,response) {
populateQuotasDialog(
response.GROUP,
default_group_quotas,
"#group_quotas_dialog",
$group_quotas_dialog);
},
error: onError
type: "single",
call: OpenNebulaResource.show,
callback: function (request,response) {
Sunstone.getDialog(QUOTAS_DIALOG_ID).setParams({element: response[XML_ROOT]});
Sunstone.getDialog(QUOTAS_DIALOG_ID).reset();
Sunstone.getDialog(QUOTAS_DIALOG_ID).show();
},
error: Notifier.onError
},
"Group.quotas_dialog" : {
type: "custom",
call: popUpGroupQuotasDialog
type: "custom",
call: function() {
var tab = $('#' + TAB_ID);
if (Sunstone.rightInfoVisible(tab)) {
$('a[href="#group_quotas_tab"]', tab).click();
$('#edit_quotas_button', tab).click();
} else {
var sel_elems = Sunstone.getDataTable(TAB_ID).elements();
//If only one group is selected we fecth the group's quotas
if (sel_elems.length == 1){
Sunstone.runAction(RESOURCE+'.fetch_quotas',sel_elems[0]);
} else {
// More than one, shows '0' usage
Sunstone.getDialog(QUOTAS_DIALOG_ID).setParams({element: {}});
Sunstone.getDialog(QUOTAS_DIALOG_ID).reset();
Sunstone.getDialog(QUOTAS_DIALOG_ID).show();
}
}
}
},
*/
"Group.set_quota" : {
type: "multiple",
@ -133,6 +148,8 @@ define(function(require) {
return Sunstone.getDataTable(TAB_ID).elements();
},
callback: function(request) {
Sunstone.getDialog(QUOTAS_DIALOG_ID).hide();
Sunstone.runAction(RESOURCE+'.show',request.request.data[0]);
},
error: Notifier.onError

View File

@ -0,0 +1,78 @@
define(function(require) {
/*
DEPENDENCIES
*/
var BaseDialog = require('utils/dialogs/dialog');
var TemplateHTML = require('hbs!./quotas/html');
var Locale = require('utils/locale');
var QuotaDefaults = require('utils/quotas/quota-defaults');
var QuotaWidgets = require('utils/quotas/quota-widgets');
/*
CONSTANTS
*/
var DIALOG_ID = require('./quotas/dialogId');
var TAB_ID = require('../tabId');
var RESOURCE = "Group";
var XML_ROOT = "GROUP";
/*
CONSTRUCTOR
*/
function Dialog() {
this.dialogId = DIALOG_ID;
this.element = undefined;
BaseDialog.call(this);
}
Dialog.DIALOG_ID = DIALOG_ID;
Dialog.prototype = Object.create(BaseDialog.prototype);
Dialog.prototype.constructor = Dialog;
Dialog.prototype.html = _html;
Dialog.prototype.onShow = _onShow;
Dialog.prototype.setup = _setup;
Dialog.prototype.setParams = _setParams;
return Dialog;
/*
FUNCTION DEFINITIONS
*/
function _html() {
return TemplateHTML({
'dialogId': this.dialogId,
'quotasHTML': QuotaWidgets.dialogHTML()
});
}
function _setup(context) {
var that = this;
QuotaWidgets.setupQuotasDialog(context);
return false;
}
/**
* @param {object} params
* - params.element : group object, or empty object {}
*/
function _setParams(params) {
this.element = params.element;
}
function _onShow(context) {
QuotaWidgets.populateQuotasDialog(
this.element,
QuotaDefaults.getDefaultQuotas(RESOURCE),
context);
return false;
}
});

View File

@ -0,0 +1,3 @@
define(function(require){
return 'groupQuotasDialog';
});

View File

@ -0,0 +1,18 @@
<div id="{{dialogId}}" class="reveal-modal large max-height" role="dialog" data-reveal >
<div class="row">
<h3 class="subheader">{{tr "Update Quota"}}</h3>
</div>
<form data-abide="ajax" id="{{dialogId}}Form">
<div class="row">
<div class="large-12 columns">
{{{quotasHTML}}}
</div>
</div>
<div class="form_buttons row">
<button type="submit" class="button radius right" value="Group.set_quota">
{{tr "Apply changes"}}
</button>
</div>
<a class="close-reveal-modal">&#215;</a>
</form>
</div>

View File

@ -9,7 +9,8 @@ define(function(require) {
var _dialogs = [
require('./users-tab/dialogs/password'),
require('./users-tab/dialogs/auth-driver')
require('./users-tab/dialogs/auth-driver'),
require('./users-tab/dialogs/quotas')
];
var _panels = [

View File

@ -6,10 +6,12 @@ define(function(require) {
var OpenNebulaResource = require('opennebula/user');
var RESOURCE = "User";
var XML_ROOT = "USER";
var TAB_ID = require('./tabId');
var CREATE_DIALOG_ID = require('./form-panels/create/formPanelId');
var PASSWORD_DIALOG_ID = require('./dialogs/password/dialogId');
var AUTH_DRIVER_DIALOG_ID = require('./dialogs/auth-driver/dialogId');
var QUOTAS_DIALOG_ID = require('./dialogs/quotas/dialogId');
var _actions = {
"User.create" : {
@ -152,26 +154,38 @@ define(function(require) {
error: Notifier.onError
},
/* TODO
"User.fetch_quotas" : {
type: "single",
call: OpenNebulaResource.show,
callback: function (request,response) {
populateQuotasDialog(
response.USER,
default_user_quotas,
"#user_quotas_dialog",
$user_quotas_dialog);
Sunstone.getDialog(QUOTAS_DIALOG_ID).setParams({element: response[XML_ROOT]});
Sunstone.getDialog(QUOTAS_DIALOG_ID).reset();
Sunstone.getDialog(QUOTAS_DIALOG_ID).show();
},
error: onError
error: Notifier.onError
},
"User.quotas_dialog" : {
type: "custom",
call: popUpUserQuotasDialog
call: function() {
var tab = $('#' + TAB_ID);
if (Sunstone.rightInfoVisible(tab)) {
$('a[href="#user_quotas_tab"]', tab).click();
$('#edit_quotas_button', tab).click();
} else {
var sel_elems = Sunstone.getDataTable(TAB_ID).elements();
//If only one user is selected we fecth the user's quotas
if (sel_elems.length == 1){
Sunstone.runAction(RESOURCE+'.fetch_quotas',sel_elems[0]);
} else {
// More than one, shows '0' usage
Sunstone.getDialog(QUOTAS_DIALOG_ID).setParams({element: {}});
Sunstone.getDialog(QUOTAS_DIALOG_ID).reset();
Sunstone.getDialog(QUOTAS_DIALOG_ID).show();
}
}
}
},
*/
"User.set_quota" : {
type: "multiple",
@ -180,6 +194,8 @@ define(function(require) {
return Sunstone.getDataTable(TAB_ID).elements();
},
callback: function(request) {
Sunstone.getDialog(QUOTAS_DIALOG_ID).hide();
Sunstone.runAction(RESOURCE+'.show',request.request.data[0]);
},
error: Notifier.onError

View File

@ -0,0 +1,78 @@
define(function(require) {
/*
DEPENDENCIES
*/
var BaseDialog = require('utils/dialogs/dialog');
var TemplateHTML = require('hbs!./quotas/html');
var Locale = require('utils/locale');
var QuotaDefaults = require('utils/quotas/quota-defaults');
var QuotaWidgets = require('utils/quotas/quota-widgets');
/*
CONSTANTS
*/
var DIALOG_ID = require('./quotas/dialogId');
var TAB_ID = require('../tabId');
var RESOURCE = "User";
var XML_ROOT = "USER";
/*
CONSTRUCTOR
*/
function Dialog() {
this.dialogId = DIALOG_ID;
this.element = undefined;
BaseDialog.call(this);
}
Dialog.DIALOG_ID = DIALOG_ID;
Dialog.prototype = Object.create(BaseDialog.prototype);
Dialog.prototype.constructor = Dialog;
Dialog.prototype.html = _html;
Dialog.prototype.onShow = _onShow;
Dialog.prototype.setup = _setup;
Dialog.prototype.setParams = _setParams;
return Dialog;
/*
FUNCTION DEFINITIONS
*/
function _html() {
return TemplateHTML({
'dialogId': this.dialogId,
'quotasHTML': QuotaWidgets.dialogHTML()
});
}
function _setup(context) {
var that = this;
QuotaWidgets.setupQuotasDialog(context);
return false;
}
/**
* @param {object} params
* - params.element : user object, or empty object {}
*/
function _setParams(params) {
this.element = params.element;
}
function _onShow(context) {
QuotaWidgets.populateQuotasDialog(
this.element,
QuotaDefaults.getDefaultQuotas(RESOURCE),
context);
return false;
}
});

View File

@ -0,0 +1,3 @@
define(function(require){
return 'userQuotasDialog';
});

View File

@ -0,0 +1,18 @@
<div id="{{dialogId}}" class="reveal-modal large max-height" role="dialog" data-reveal >
<div class="row">
<h3 class="subheader">{{tr "Update Quota"}}</h3>
</div>
<form data-abide="ajax" id="{{dialogId}}Form">
<div class="row">
<div class="large-12 columns">
{{{quotasHTML}}}
</div>
</div>
<div class="form_buttons row">
<button type="submit" class="button radius right" value="User.set_quota">
{{tr "Apply changes"}}
</button>
</div>
<a class="close-reveal-modal">&#215;</a>
</form>
</div>

View File

@ -1035,13 +1035,13 @@ define(function(require) {
function _quotaBar(usage, limit, default_limit){
var int_usage = parseInt(usage, 10);
var int_limit = __quotaIntLimit(limit, default_limit);
var int_limit = _quotaIntLimit(limit, default_limit);
return ProgressBar.html(int_usage, int_limit, null);
}
function _quotaBarMB(usage, limit, default_limit){
var int_usage = parseInt(usage, 10);
var int_limit = __quotaIntLimit(limit, default_limit);
var int_limit = _quotaIntLimit(limit, default_limit);
info_str = Humanize.size(int_usage * 1024)+' / ' +
((int_limit >= 0) ? Humanize.size(int_limit * 1024) : '-');
@ -1051,40 +1051,10 @@ define(function(require) {
function _quotaBarFloat(usage, limit, default_limit){
var float_usage = parseFloat(usage, 10);
var float_limit = __quotaFloatLimit(limit, default_limit);
var float_limit = _quotaFloatLimit(limit, default_limit);
return ProgressBar.html(float_usage, float_limit, null);
}
function __quotaIntLimit(limit, default_limit){
i_limit = parseInt(limit, 10);
i_default_limit = parseInt(default_limit, 10);
if (limit == QUOTA_LIMIT_DEFAULT){
i_limit = i_default_limit;
}
if (isNaN(i_limit)){
i_limit = 0;
}
return i_limit;
}
function __quotaFloatLimit(limit, default_limit){
f_limit = parseFloat(limit, 10);
f_default_limit = parseFloat(default_limit, 10);
if (f_limit == parseFloat(QUOTA_LIMIT_DEFAULT, 10)){
f_limit = f_default_limit;
}
if (isNaN(f_limit)){
f_limit = 0;
}
return f_limit;
}
function _quotaIntLimit(limit, default_limit){
i_limit = parseInt(limit, 10);
i_default_limit = parseInt(default_limit, 10);
@ -1117,12 +1087,94 @@ define(function(require) {
return f_limit
}
//============================================================================
// Quotas dialog
//============================================================================
function _quotas_tmpl(){
return '<div class="row">\
<div class="large-12 columns">\
<dl class="tabs right-info-tabs text-center" data-tab>\
<dd class="active"><a href="#vm_quota"><i class="fa fa-cloud"></i><br>'+Locale.tr("VM")+'</a></dd>\
<dd><a href="#datastore_quota"><i class="fa fa-folder-open"></i><br>'+Locale.tr("Datastore")+'</a></dd>\
<dd><a href="#image_quota"><i class="fa fa-upload"></i><br>'+Locale.tr("Image")+'</a></dd>\
<dd><a href="#network_quota"><i class="fa fa-globe"></i><br>'+Locale.tr("VNet")+'</a></dd>\
</dl>\
</div>\
</div>\
<div class="row">\
<div class="tabs-content">\
<div id="vm_quota" class="content active">\
</div>\
<div id="datastore_quota" class="content">\
</div>\
<div id="image_quota" class="content">\
</div>\
<div id="network_quota" class="content">\
</div>\
</div>\
</div>';
}
/**
* Sets up a dialog to edit and update user and group quotas
*/
function _setupQuotasDialog(context){
$('form', context).submit(function(){
var obj = retrieveQuotasValues(context);
var action = $('div.form_buttons button',this).val();
var sel_elems = Sunstone.getAction(action).elements();
Sunstone.runAction(action,sel_elems,obj);
return false;
});
}
function _populateQuotasDialog(resource_info, default_quotas, context){
var vms_quota = _vmsWidget(resource_info, default_quotas);
var cpu_quota = _cpuWidget(resource_info, default_quotas);
var memory_quota = _memoryWidget(resource_info, default_quotas);
var volatile_size_quota = _volatileWidget(resource_info, default_quotas);
var image_quota = _imageWidget(resource_info, default_quotas);
var network_quota = _networkWidget(resource_info, default_quotas);
var datastore_quota = _datastoreWidget(resource_info, default_quotas);
$("#vm_quota", context).html(
'<div class="large-6 columns">' + vms_quota + '</div>\
<div class="large-6 columns">' + cpu_quota + '</div>\
<div class="large-6 columns">' + memory_quota + '</div>\
<div class="large-6 columns">' + volatile_size_quota+ '</div>');
$("#datastore_quota", context).html(
'<div class="large-12 columns">' + datastore_quota + '</div>');
$("#image_quota", context).html(
'<div class="large-12 columns">' + image_quota + '</div>');
$("#network_quota", context).html(
'<div class="large-12 columns">' + network_quota + '</div>');
setupQuotasBarButtons(resource_info, context);
_setupImageWidget(context, default_quotas);
_setupNetworkWidget(context, default_quotas);
_setupDatastoreWidget(context, default_quotas);
quotasPanelEditAction(context);
context.foundation();
}
return {
'initEmptyQuotas': _initEmptyQuotas,
'quotaBar': _quotaBar,
'quotaBarMB': _quotaBarMB,
'quotaBarFloat': _quotaBarFloat,
'initQuotasPanel': _initQuotasPanel,
'setupQuotasPanel': _setupQuotasPanel
'setupQuotasPanel': _setupQuotasPanel,
'dialogHTML': _quotas_tmpl,
'setupQuotasDialog': _setupQuotasDialog,
'populateQuotasDialog': _populateQuotasDialog,
};
});