From eb7a4f2fe31a03d4713d69ed31953780e14bf50c Mon Sep 17 00:00:00 2001 From: Michael Lange Date: Tue, 4 Aug 2020 22:54:26 -0700 Subject: [PATCH] Conditionally show the scaling timeline or accordion --- ui/app/controllers/jobs/job/task-group.js | 6 +++ ui/app/templates/jobs/job/task-group.hbs | 23 +++++++--- ui/tests/acceptance/task-group-detail-test.js | 44 ++++++++++++++++++- ui/tests/pages/jobs/job/task-group.js | 5 +++ 4 files changed, 70 insertions(+), 8 deletions(-) diff --git a/ui/app/controllers/jobs/job/task-group.js b/ui/app/controllers/jobs/job/task-group.js index 876945b0a..841910f14 100644 --- a/ui/app/controllers/jobs/job/task-group.js +++ b/ui/app/controllers/jobs/job/task-group.js @@ -60,6 +60,12 @@ export default class TaskGroupController extends Controller.extend( }) sortedScaleEvents; + @computed('sortedScaleEvents.@each.{hasCount}', function() { + const countEventsCount = this.sortedScaleEvents.filterBy('hasCount').length; + return countEventsCount > 1 && countEventsCount >= this.sortedScaleEvents.length / 2; + }) + shouldShowScaleEventTimeline; + @computed('model.job.runningDeployment') get tooltipText() { if (this.can.cannot('scale job')) return "You aren't allowed to scale task groups"; diff --git a/ui/app/templates/jobs/job/task-group.hbs b/ui/app/templates/jobs/job/task-group.hbs index fa4114ff9..915e13373 100644 --- a/ui/app/templates/jobs/job/task-group.hbs +++ b/ui/app/templates/jobs/job/task-group.hbs @@ -138,14 +138,25 @@ {{#if this.model.scaleState.isVisible}} -
-
- Recent Scaling Events + {{#if this.shouldShowScaleEventTimeline}} +
+
+ Scaling Timeline +
+
+ +
-
- + {{else}} +
+
+ Recent Scaling Events +
+
+ +
-
+ {{/if}} {{/if}} {{#if this.model.volumes.length}} diff --git a/ui/tests/acceptance/task-group-detail-test.js b/ui/tests/acceptance/task-group-detail-test.js index 4f842d05b..b5bb476d7 100644 --- a/ui/tests/acceptance/task-group-detail-test.js +++ b/ui/tests/acceptance/task-group-detail-test.js @@ -410,7 +410,6 @@ module('Acceptance | task group detail', function(hooks) { test('when a task group has no scaling events, there is no recent scaling events section', async function(assert) { const taskGroupScale = job.jobScale.taskGroupScales.models.find(m => m.name === taskGroup.name); taskGroupScale.update({ events: [] }); - taskGroupScale.save(); await TaskGroup.visit({ id: job.id, name: taskGroup.name }); @@ -419,16 +418,30 @@ module('Acceptance | task group detail', function(hooks) { test('the recent scaling events section shows all recent scaling events in reverse chronological order', async function(assert) { const taskGroupScale = job.jobScale.taskGroupScales.models.find(m => m.name === taskGroup.name); + taskGroupScale.update({ + events: [ + server.create('scale-event', { error: true }), + server.create('scale-event', { error: true }), + server.create('scale-event', { error: true }), + server.create('scale-event', { error: true }), + server.create('scale-event', { count: 3, error: false }), + server.create('scale-event', { count: 1, error: false }), + ], + }); const scaleEvents = taskGroupScale.events.models.sortBy('time').reverse(); await TaskGroup.visit({ id: job.id, name: taskGroup.name }); assert.ok(TaskGroup.hasScaleEvents); + assert.notOk(TaskGroup.hasScalingTimeline); scaleEvents.forEach((scaleEvent, idx) => { const ScaleEvent = TaskGroup.scaleEvents[idx]; assert.equal(ScaleEvent.time, moment(scaleEvent.time / 1000000).format('MMM DD HH:mm:ss ZZ')); assert.equal(ScaleEvent.message, scaleEvent.message); - assert.equal(ScaleEvent.count, scaleEvent.count); + + if (scaleEvent.count != null) { + assert.equal(ScaleEvent.count, scaleEvent.count); + } if (scaleEvent.error) { assert.ok(ScaleEvent.error); @@ -441,4 +454,31 @@ module('Acceptance | task group detail', function(hooks) { } }); }); + + test('when a task group has at least count scaling events and the count scaling events outnumber the non-count scaling events, a timeline is shown instead of an accordion', async function(assert) { + const taskGroupScale = job.jobScale.taskGroupScales.models.find(m => m.name === taskGroup.name); + taskGroupScale.update({ + events: [ + server.create('scale-event', { error: true }), + server.create('scale-event', { error: true }), + server.create('scale-event', { count: 7, error: false }), + server.create('scale-event', { count: 10, error: false }), + server.create('scale-event', { count: 2, error: false }), + server.create('scale-event', { count: 3, error: false }), + server.create('scale-event', { count: 2, error: false }), + server.create('scale-event', { count: 9, error: false }), + server.create('scale-event', { count: 1, error: false }), + ], + }); + const scaleEvents = taskGroupScale.events.models.sortBy('time').reverse(); + await TaskGroup.visit({ id: job.id, name: taskGroup.name }); + + assert.notOk(TaskGroup.hasScaleEvents); + assert.ok(TaskGroup.hasScalingTimeline); + + assert.equal( + TaskGroup.scalingAnnotations.length, + scaleEvents.filter(ev => ev.count == null).length + ); + }); }); diff --git a/ui/tests/pages/jobs/job/task-group.js b/ui/tests/pages/jobs/job/task-group.js index 0bda5a769..514a27097 100644 --- a/ui/tests/pages/jobs/job/task-group.js +++ b/ui/tests/pages/jobs/job/task-group.js @@ -69,6 +69,11 @@ export default create({ meta: text(), }), + hasScalingTimeline: isPresent('[data-test-scaling-timeline]'), + scalingAnnotations: collection('[data-test-scaling-timeline] [data-test-annotation]', { + open: clickable('button'), + }), + error: error(), emptyState: {