Refactor the way allocation stats are fetched
No longer treat it as a property for relationship, just ephemeral data that can be fetched on demand.
This commit is contained in:
parent
729365507f
commit
6bf139d094
|
@ -1,13 +1,11 @@
|
||||||
import { inject as service } from '@ember/service';
|
import { inject as service } from '@ember/service';
|
||||||
import { readOnly } from '@ember/object/computed';
|
|
||||||
import { computed } from '@ember/object';
|
import { computed } from '@ember/object';
|
||||||
import RSVP from 'rsvp';
|
|
||||||
import Model from 'ember-data/model';
|
import Model from 'ember-data/model';
|
||||||
import attr from 'ember-data/attr';
|
import attr from 'ember-data/attr';
|
||||||
import { belongsTo } from 'ember-data/relationships';
|
import { belongsTo } from 'ember-data/relationships';
|
||||||
import { fragment, fragmentArray } from 'ember-data-model-fragments/attributes';
|
import { fragment, fragmentArray } from 'ember-data-model-fragments/attributes';
|
||||||
import PromiseObject from '../utils/classes/promise-object';
|
|
||||||
import shortUUIDProperty from '../utils/properties/short-uuid';
|
import shortUUIDProperty from '../utils/properties/short-uuid';
|
||||||
|
import AllocationStats from '../utils/classes/allocation-stats';
|
||||||
|
|
||||||
const STATUS_ORDER = {
|
const STATUS_ORDER = {
|
||||||
pending: 1,
|
pending: 1,
|
||||||
|
@ -56,48 +54,17 @@ export default Model.extend({
|
||||||
return taskGroups && taskGroups.findBy('name', this.get('taskGroupName'));
|
return taskGroups && taskGroups.findBy('name', this.get('taskGroupName'));
|
||||||
}),
|
}),
|
||||||
|
|
||||||
memoryUsed: readOnly('stats.ResourceUsage.MemoryStats.RSS'),
|
fetchStats() {
|
||||||
cpuUsed: computed('stats.ResourceUsage.CpuStats.TotalTicks', function() {
|
return this.get('token')
|
||||||
return Math.floor(this.get('stats.ResourceUsage.CpuStats.TotalTicks') || 0);
|
.authorizedRequest(`/v1/client/allocation/${this.get('id')}/stats`)
|
||||||
}),
|
.then(res => res.json())
|
||||||
|
.then(json => {
|
||||||
percentMemory: computed('taskGroup.reservedMemory', 'memoryUsed', function() {
|
return new AllocationStats({
|
||||||
const used = this.get('memoryUsed') / 1024 / 1024;
|
stats: json,
|
||||||
const total = this.get('taskGroup.reservedMemory');
|
allocation: this,
|
||||||
if (!total || !used) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return used / total;
|
|
||||||
}),
|
|
||||||
|
|
||||||
percentCPU: computed('cpuUsed', 'taskGroup.reservedCPU', function() {
|
|
||||||
const used = this.get('cpuUsed');
|
|
||||||
const total = this.get('taskGroup.reservedCPU');
|
|
||||||
if (!total || !used) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return used / total;
|
|
||||||
}),
|
|
||||||
|
|
||||||
stats: computed('node.{isPartial,httpAddr}', function() {
|
|
||||||
const nodeIsPartial = this.get('node.isPartial');
|
|
||||||
|
|
||||||
// If the node doesn't have an httpAddr, it's a partial record.
|
|
||||||
// Once it reloads, this property will be dirtied and stats will load.
|
|
||||||
if (nodeIsPartial) {
|
|
||||||
return PromiseObject.create({
|
|
||||||
// Never resolve, so the promise object is always in a state of pending
|
|
||||||
promise: new RSVP.Promise(() => {}),
|
|
||||||
});
|
});
|
||||||
}
|
|
||||||
|
|
||||||
const url = `/v1/client/allocation/${this.get('id')}/stats`;
|
|
||||||
return PromiseObject.create({
|
|
||||||
promise: this.get('token')
|
|
||||||
.authorizedRequest(url)
|
|
||||||
.then(res => res.json()),
|
|
||||||
});
|
});
|
||||||
}),
|
},
|
||||||
|
|
||||||
states: fragmentArray('task-state'),
|
states: fragmentArray('task-state'),
|
||||||
});
|
});
|
||||||
|
|
33
ui/app/utils/classes/allocation-stats.js
Normal file
33
ui/app/utils/classes/allocation-stats.js
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
import EmberObject, { computed } from '@ember/object';
|
||||||
|
import { alias, readOnly } from '@ember/object/computed';
|
||||||
|
|
||||||
|
export default EmberObject.extend({
|
||||||
|
allocation: null,
|
||||||
|
stats: null,
|
||||||
|
|
||||||
|
reservedMemory: alias('allocation.taskGroup.reservedMemory'),
|
||||||
|
reservedCPU: alias('allocation.taskGroup.reservedCPU'),
|
||||||
|
|
||||||
|
memoryUsed: readOnly('stats.ResourceUsage.MemoryStats.RSS'),
|
||||||
|
cpuUsed: computed('stats.ResourceUsage.CpuStats.TotalTicks', function() {
|
||||||
|
return Math.floor(this.get('stats.ResourceUsage.CpuStats.TotalTicks') || 0);
|
||||||
|
}),
|
||||||
|
|
||||||
|
percentMemory: computed('reservedMemory', 'memoryUsed', function() {
|
||||||
|
const used = this.get('memoryUsed') / 1024 / 1024;
|
||||||
|
const total = this.get('reservedMemory');
|
||||||
|
if (!total || !used) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return used / total;
|
||||||
|
}),
|
||||||
|
|
||||||
|
percentCPU: computed('reservedCPU', 'cpuUsed', function() {
|
||||||
|
const used = this.get('cpuUsed');
|
||||||
|
const total = this.get('reservedCPU');
|
||||||
|
if (!total || !used) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return used / total;
|
||||||
|
}),
|
||||||
|
});
|
Loading…
Reference in a new issue