diff --git a/ui/app/models/allocation.js b/ui/app/models/allocation.js index fe6cd2d62..6d85ae85f 100644 --- a/ui/app/models/allocation.js +++ b/ui/app/models/allocation.js @@ -1,13 +1,11 @@ import { inject as service } from '@ember/service'; -import { readOnly } from '@ember/object/computed'; import { computed } from '@ember/object'; -import RSVP from 'rsvp'; import Model from 'ember-data/model'; import attr from 'ember-data/attr'; import { belongsTo } from 'ember-data/relationships'; import { fragment, fragmentArray } from 'ember-data-model-fragments/attributes'; -import PromiseObject from '../utils/classes/promise-object'; import shortUUIDProperty from '../utils/properties/short-uuid'; +import AllocationStats from '../utils/classes/allocation-stats'; const STATUS_ORDER = { pending: 1, @@ -56,48 +54,17 @@ export default Model.extend({ return taskGroups && taskGroups.findBy('name', this.get('taskGroupName')); }), - 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('taskGroup.reservedMemory', 'memoryUsed', function() { - const used = this.get('memoryUsed') / 1024 / 1024; - const total = this.get('taskGroup.reservedMemory'); - 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(() => {}), + fetchStats() { + return this.get('token') + .authorizedRequest(`/v1/client/allocation/${this.get('id')}/stats`) + .then(res => res.json()) + .then(json => { + return new AllocationStats({ + stats: json, + allocation: this, + }); }); - } - - 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'), }); diff --git a/ui/app/utils/classes/allocation-stats.js b/ui/app/utils/classes/allocation-stats.js new file mode 100644 index 000000000..463affbb4 --- /dev/null +++ b/ui/app/utils/classes/allocation-stats.js @@ -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; + }), +});