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:
parent
36356f094a
commit
e2c346227c
|
@ -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') ||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
);
|
||||
},
|
||||
|
|
|
@ -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>
|
||||
|
|
Loading…
Reference in New Issue