From f2b4fbcbe8ede9967ffa360bcb20ef9aa282a050 Mon Sep 17 00:00:00 2001 From: Michael Lange Date: Wed, 12 Dec 2018 18:21:36 -0800 Subject: [PATCH] Don't use Ember.get in conjunction with dynamic strings in the allocation serializer --- ui/app/serializers/allocation.js | 5 +- ui/tests/unit/serializers/allocation-test.js | 149 +++++++++++++++++++ 2 files changed, 152 insertions(+), 2 deletions(-) create mode 100644 ui/tests/unit/serializers/allocation-test.js diff --git a/ui/app/serializers/allocation.js b/ui/app/serializers/allocation.js index 2aa91d39f..08da6e6c4 100644 --- a/ui/app/serializers/allocation.js +++ b/ui/app/serializers/allocation.js @@ -13,8 +13,9 @@ export default ApplicationSerializer.extend({ normalize(typeHash, hash) { // Transform the map-based TaskStates object into an array-based // TaskState fragment list - hash.TaskStates = Object.keys(get(hash, 'TaskStates') || {}).map(key => { - const state = get(hash, `TaskStates.${key}`); + const states = hash.TaskStates || {}; + hash.TaskStates = Object.keys(states).map(key => { + const state = states[key] || {}; const summary = { Name: key }; Object.keys(state).forEach(stateKey => (summary[stateKey] = state[stateKey])); summary.Resources = hash.TaskResources && hash.TaskResources[key]; diff --git a/ui/tests/unit/serializers/allocation-test.js b/ui/tests/unit/serializers/allocation-test.js new file mode 100644 index 000000000..a4c0941ec --- /dev/null +++ b/ui/tests/unit/serializers/allocation-test.js @@ -0,0 +1,149 @@ +import { test } from 'ember-qunit'; +import AllocationModel from 'nomad-ui/models/allocation'; +import moduleForSerializer from '../../helpers/module-for-serializer'; + +moduleForSerializer('allocation', 'Unit | Serializer | Allocation', { + needs: [ + 'service:token', + 'service:system', + 'serializer:allocation', + 'transform:fragment', + 'transform:fragment-array', + 'model:job', + 'model:node', + 'model:namespace', + 'model:evaluation', + 'model:allocation', + 'model:resources', + 'model:task-state', + 'model:reschedule-event', + ], +}); + +const sampleDate = new Date('2018-12-12T00:00:00'); +const normalizationTestCases = [ + { + name: 'Normal', + in: { + ID: 'test-allocation', + JobID: 'test-summary', + Name: 'test-summary[1]', + Namespace: 'test-namespace', + TaskGroup: 'test-group', + CreateTime: +sampleDate * 1000000, + ModifyTime: +sampleDate * 1000000, + TaskStates: { + testTask: { + State: 'running', + Failed: false, + }, + }, + }, + out: { + data: { + id: 'test-allocation', + type: 'allocation', + attributes: { + taskGroupName: 'test-group', + name: 'test-summary[1]', + modifyTime: sampleDate, + createTime: sampleDate, + states: [ + { + name: 'testTask', + state: 'running', + failed: false, + }, + ], + }, + relationships: { + followUpEvaluation: { + data: null, + }, + nextAllocation: { + data: null, + }, + previousAllocation: { + data: null, + }, + job: { + data: { + id: '["test-summary","test-namespace"]', + type: 'job', + }, + }, + }, + }, + }, + }, + + { + name: 'Dots in task names', + in: { + ID: 'test-allocation', + JobID: 'test-summary', + Name: 'test-summary[1]', + Namespace: 'test-namespace', + TaskGroup: 'test-group', + CreateTime: +sampleDate * 1000000, + ModifyTime: +sampleDate * 1000000, + TaskStates: { + 'one.two': { + State: 'running', + Failed: false, + }, + 'three.four': { + State: 'pending', + Failed: true, + }, + }, + }, + out: { + data: { + id: 'test-allocation', + type: 'allocation', + attributes: { + taskGroupName: 'test-group', + name: 'test-summary[1]', + modifyTime: sampleDate, + createTime: sampleDate, + states: [ + { + name: 'one.two', + state: 'running', + failed: false, + }, + { + name: 'three.four', + state: 'pending', + failed: true, + }, + ], + }, + relationships: { + followUpEvaluation: { + data: null, + }, + nextAllocation: { + data: null, + }, + previousAllocation: { + data: null, + }, + job: { + data: { + id: '["test-summary","test-namespace"]', + type: 'job', + }, + }, + }, + }, + }, + }, +]; + +normalizationTestCases.forEach(testCase => { + test(`normalization: ${testCase.name}`, function(assert) { + assert.deepEqual(this.subject().normalize(AllocationModel, testCase.in), testCase.out); + }); +});