Cluster capacity calculation fix

- "HDD" capacity is counting from nodes with "stogare" roles
  - "CPU" & "RAM" are counting from nodes with "compute" roles

DocImpact
Closes-bug: #1375750

Change-Id: I0a44cbfa60625ad06c879cf1aac01317b073b802
This commit is contained in:
Kate Pimenova 2016-02-16 17:42:13 +03:00
parent 36356f094a
commit e2c346227c
5 changed files with 78 additions and 42 deletions

View File

@ -367,6 +367,33 @@ models.Cluster = BaseModel.extend({
return this.get('release').get('state') !== 'unavailable' && !!nodes.length &&
(nodes.hasChanges() || this.needsRedeployment()) &&
!this.task({group: 'deployment', active: true});
},
getCapacity() {
var result = {
cores: 0,
ht_cores: 0,
ram: 0,
hdd: 0
};
if (!this.get('nodes').length) return result;
var resourceToRoleGroupMap = {
cores: 'compute',
ht_cores: 'compute',
ram: 'compute',
hdd: 'storage'
};
var groupedRoles = {};
_.each(['compute', 'storage'], (group) => {
groupedRoles[group] = this.get('roles')
.where({group: group})
.map((role) => role.get('name'));
});
this.get('nodes').each((node) => {
_.each(resourceToRoleGroupMap, (group, resourceName) => {
if (node.hasRole(groupedRoles[group])) result[resourceName] += node.resource(resourceName);
});
});
return result;
}
});
@ -425,10 +452,11 @@ models.Node = BaseModel.extend({
// and useless management of roles, disks, interfaces, etc.
return this.get('status') !== 'removing';
},
hasRole(role, onlyDeployedRoles) {
var roles = onlyDeployedRoles ? this.get('roles') :
_.union(this.get('roles'), this.get('pending_roles'));
return _.contains(roles, role);
hasRole(roles = [], onlyDeployedRoles = false) {
if (_.isString(roles)) roles = [roles];
var nodeRoles = this.get('roles');
if (!onlyDeployedRoles) nodeRoles = nodeRoles.concat(this.get('pending_roles'));
return !!_.intersection(nodeRoles, roles).length;
},
hasChanges() {
return this.get('pending_addition') ||

View File

@ -4371,11 +4371,11 @@ input[type=range] {
border: 1px solid @dashboard-gray;
}
&.hdd {
border-top: 1px solid @dashboard-gray;
border-bottom: 1px solid @dashboard-gray;
border: 1px solid @dashboard-gray;
}
&.ram {
border: 1px solid @dashboard-gray;
border-top: 1px solid @dashboard-gray;
border-bottom: 1px solid @dashboard-gray;
}
.capacity-value {
.font-semibold;

View File

@ -631,32 +631,29 @@ var ClusterInfo = React.createClass({
);
},
renderClusterCapacity() {
var cores = 0;
var hdds = 0;
var ram = 0;
var ns = namespace + 'cluster_info_fields.';
this.props.cluster.get('nodes').each((node) => {
cores += node.resource('ht_cores');
hdds += node.resource('hdd');
ram += node.resource('ram');
}, this);
var capacity = this.props.cluster.getCapacity();
return (
<div className='row capacity-block content-elements'>
<div className='title'>{i18n(ns + 'capacity')}</div>
<div className='col-xs-12 capacity-items'>
<div className='col-xs-4 cpu capacity-item'>
<span>{i18n(ns + 'cpu_cores')}</span>
<span className='capacity-value pull-right'>{cores}</span>
</div>
<div className='col-xs-4 hdd capacity-item'>
<span>{i18n(ns + 'hdd')}</span>
<span className='capacity-value pull-right'>{utils.showDiskSize(hdds)}</span>
<span className='capacity-value pull-right'>
{capacity.cores} ({capacity.ht_cores})
</span>
</div>
<div className='col-xs-4 ram capacity-item'>
<span>{i18n(ns + 'ram')}</span>
<span className='capacity-value pull-right'>{utils.showDiskSize(ram)}</span>
<span className='capacity-value pull-right'>
{utils.showDiskSize(capacity.ram)}
</span>
</div>
<div className='col-xs-4 hdd capacity-item'>
<span>{i18n(ns + 'hdd')}</span>
<span className='capacity-value pull-right'>
{utils.showDiskSize(capacity.hdd)}
</span>
</div>
</div>
</div>

View File

@ -208,16 +208,16 @@ var Node = React.createClass({
{': '}
{this.props.node.resource('cores') || '0'} ({_.isUndefined(htCores) ? '?' : htCores})
</span>
<span>
{i18n('node_details.hdd')}
{': '}
{_.isUndefined(hdd) ? '?' + i18n('common.size.gb') : utils.showDiskSize(hdd)}
</span>
<span>
{i18n('node_details.ram')}
{': '}
{_.isUndefined(ram) ? '?' + i18n('common.size.gb') : utils.showMemorySize(ram)}
</span>
<span>
{i18n('node_details.hdd')}
{': '}
{_.isUndefined(hdd) ? '?' + i18n('common.size.gb') : utils.showDiskSize(hdd)}
</span>
</div>
);
},

View File

@ -35,12 +35,22 @@ ClustersPage = React.createClass({
var clusters = new models.Clusters();
var nodes = new models.Nodes();
var tasks = new models.Tasks();
return $.when(clusters.fetch(), nodes.fetch(), tasks.fetch()).done(() => {
clusters.each((cluster) => {
cluster.set('nodes', new models.Nodes(nodes.where({cluster: cluster.id})));
cluster.set('tasks', new models.Tasks(tasks.where({cluster: cluster.id})));
}, this);
}).then(() => ({clusters: clusters}));
return $.when(clusters.fetch(), nodes.fetch(), tasks.fetch())
.then(() => {
var requests = [];
clusters.each((cluster) => {
cluster.set('nodes', new models.Nodes(nodes.where({cluster: cluster.id})));
cluster.set('tasks', new models.Tasks(tasks.where({cluster: cluster.id})));
var roles = new models.Roles();
roles.url = _.result(cluster, 'url') + '/roles';
cluster.set({roles: roles});
requests.push(cluster.get('roles').fetch());
});
return $.when(...requests);
})
.then(() => ({clusters}));
}
},
render() {
@ -134,6 +144,7 @@ Cluster = React.createClass({
!!cluster.task({name: 'cluster_deletion', status: 'ready'});
var deploymentTask = cluster.task({group: 'deployment', active: true});
var Tag = isClusterDeleting ? 'div' : 'a';
var capacity = cluster.getCapacity();
return (
<div className='col-xs-3'>
<Tag
@ -154,19 +165,19 @@ Cluster = React.createClass({
{i18n('clusters_page.cluster_hardware_cpu')}
</div>,
<div key='cpu-value' className='value'>
{nodes.resources('cores')} ({nodes.resources('ht_cores')})
</div>,
<div key='hdd-title' className='item'>
{i18n('clusters_page.cluster_hardware_hdd')}
</div>,
<div key='hdd-value' className='value'>
{nodes.resources('hdd') ? utils.showDiskSize(nodes.resources('hdd')) : '?GB'}
{capacity.cores} ({capacity.ht_cores})
</div>,
<div key='ram-title' className='item'>
{i18n('clusters_page.cluster_hardware_ram')}
</div>,
<div key='ram-value' className='value'>
{nodes.resources('ram') ? utils.showMemorySize(nodes.resources('ram')) : '?GB'}
{utils.showDiskSize(capacity.ram)}
</div>,
<div key='hdd-title' className='item'>
{i18n('clusters_page.cluster_hardware_hdd')}
</div>,
<div key='hdd-value' className='value'>
{utils.showDiskSize(capacity.hdd)}
</div>
]}
</div>