d707038429
This fixes a race condition in the pseudo-relationship between a TaskState and a Task that was causing the Consul Connect proxy tag to sometimes show on the wrong task. There’s no direct Ember Data-style relationship between a TaskState and its Task; instead, it’s determined by searching for a Task with the matching name. The related Task was sometimes stored before everything was ready and not recalculated when the name became known. This ensures the relationship is accurate if the TaskState’s name property changes.
63 lines
1.8 KiB
JavaScript
63 lines
1.8 KiB
JavaScript
import { computed } from '@ember/object';
|
|
import { alias, none, and } from '@ember/object/computed';
|
|
import Fragment from 'ember-data-model-fragments/fragment';
|
|
import attr from 'ember-data/attr';
|
|
import { fragment, fragmentOwner, fragmentArray } from 'ember-data-model-fragments/attributes';
|
|
|
|
export default Fragment.extend({
|
|
allocation: fragmentOwner(),
|
|
|
|
name: attr('string'),
|
|
state: attr('string'),
|
|
startedAt: attr('date'),
|
|
finishedAt: attr('date'),
|
|
failed: attr('boolean'),
|
|
|
|
isActive: none('finishedAt'),
|
|
isRunning: and('isActive', 'allocation.isRunning'),
|
|
|
|
isConnectProxy: computed('task.kind', function() {
|
|
return (this.get('task.kind') || '').startsWith('connect-proxy:');
|
|
}),
|
|
|
|
task: computed('name', 'allocation.taskGroup.tasks.[]', function() {
|
|
const tasks = this.get('allocation.taskGroup.tasks');
|
|
return tasks && tasks.findBy('name', this.name);
|
|
}),
|
|
|
|
driver: alias('task.driver'),
|
|
|
|
// TaskState represents a task running on a node, so in addition to knowing the
|
|
// driver via the task, the health of the driver is also known via the node
|
|
driverStatus: computed('task.driver', 'allocation.node.drivers.[]', function() {
|
|
const nodeDrivers = this.get('allocation.node.drivers') || [];
|
|
return nodeDrivers.findBy('name', this.get('task.driver'));
|
|
}),
|
|
|
|
resources: fragment('resources'),
|
|
events: fragmentArray('task-event'),
|
|
|
|
stateClass: computed('state', function() {
|
|
const classMap = {
|
|
pending: 'is-pending',
|
|
running: 'is-primary',
|
|
finished: 'is-complete',
|
|
failed: 'is-error',
|
|
};
|
|
|
|
return classMap[this.state] || 'is-dark';
|
|
}),
|
|
|
|
restart() {
|
|
return this.allocation.restart(this.name);
|
|
},
|
|
|
|
ls(path) {
|
|
return this.store.adapterFor('task-state').ls(this, path);
|
|
},
|
|
|
|
stat(path) {
|
|
return this.store.adapterFor('task-state').stat(this, path);
|
|
},
|
|
});
|