diff --git a/ui/app/components/job-status/allocation-status-block.hbs b/ui/app/components/job-status/allocation-status-block.hbs index 0c667423c65..5ff785fc378 100644 --- a/ui/app/components/job-status/allocation-status-block.hbs +++ b/ui/app/components/job-status/allocation-status-block.hbs @@ -13,6 +13,9 @@ @label="View allocation" > {{#if (and (eq @status "running") (not @steady))}} + {{#if (eq @canary "canary")}} + + {{/if}} {{#if (eq @health "healthy")}} diff --git a/ui/app/components/job-status/panel/deploying.hbs b/ui/app/components/job-status/panel/deploying.hbs index 25c1a5eac15..27213a0a269 100644 --- a/ui/app/components/job-status/panel/deploying.hbs +++ b/ui/app/components/job-status/panel/deploying.hbs @@ -36,9 +36,11 @@
{{#if this.oldVersionAllocBlockIDs.length}} -

Previous Allocations: {{#if this.oldVersionAllocBlocks.running}}{{this.oldRunningHealthyAllocBlocks.length}} running{{/if}}

- -
+

Previous allocations: {{#if this.oldVersionAllocBlocks.running}}{{this.oldRunningHealthyAllocBlocks.length}} running{{/if}}

+
+ +
+
@@ -53,11 +55,13 @@ {{/if}} -

New allocations: {{this.newRunningHealthyAllocBlocks.length}}/{{this.totalAllocs}} running and healthy

- +

New allocations: {{this.newRunningHealthyAllocBlocks.length}}/{{this.totalAllocs}} running and healthy

+
+ +
-
+
{{!-- Legend by Status, then by Health, then by Canary --}} diff --git a/ui/mirage/factories/deployment.js b/ui/mirage/factories/deployment.js index 49179357c3e..c513251aaae 100644 --- a/ui/mirage/factories/deployment.js +++ b/ui/mirage/factories/deployment.js @@ -3,13 +3,20 @@ import faker from 'nomad-ui/mirage/faker'; import { provide } from '../utils'; const UUIDS = provide(100, faker.random.uuid.bind(faker.random)); -const DEPLOYMENT_STATUSES = ['running', 'successful', 'paused', 'failed', 'cancelled']; +const DEPLOYMENT_STATUSES = [ + 'running', + 'successful', + 'paused', + 'failed', + 'cancelled', +]; export default Factory.extend({ - id: i => (i / 100 >= 1 ? `${UUIDS[i]}-${i}` : UUIDS[i]), + id: (i) => (i / 100 >= 1 ? `${UUIDS[i]}-${i}` : UUIDS[i]), jobId: null, versionNumber: null, + groupDesiredTotal: null, status: () => faker.helpers.randomize(DEPLOYMENT_STATUSES), statusDescription: () => faker.lorem.sentence(), @@ -24,14 +31,20 @@ export default Factory.extend({ afterCreate(deployment, server) { const job = server.db.jobs.find(deployment.jobId); - const groups = job.taskGroupIds.map(id => - server.create('deployment-task-group-summary', { + const groups = job.taskGroupIds.map((id) => { + let summary = server.create('deployment-task-group-summary', { deployment, name: server.db.taskGroups.find(id).name, desiredCanaries: 1, promoted: false, - }) - ); + }); + if (deployment.groupDesiredTotal) { + summary.update({ + desiredTotal: deployment.groupDesiredTotal, + }); + } + return summary; + }); deployment.update({ deploymentTaskGroupSummaryIds: groups.mapBy('id'), diff --git a/ui/mirage/factories/task-group.js b/ui/mirage/factories/task-group.js index 3af263c57f4..f64f36bb141 100644 --- a/ui/mirage/factories/task-group.js +++ b/ui/mirage/factories/task-group.js @@ -118,23 +118,29 @@ export default Factory.extend({ unknown: 0.25, lost: 0.1, }; - - Array(group.count) + + const totalAllocations = group.count; + const allocationsByStatus = {}; + + Object.entries(statusProbabilities).forEach(([status, prob]) => { + allocationsByStatus[status] = Math.round(totalAllocations * prob); + }); + + let currentStatusIndex = 0; + const statusKeys = Object.keys(allocationsByStatus); + + Array(totalAllocations) .fill(null) .forEach((_, i) => { - let rand = faker.random.number({ min: 1, max: 100 }) / 100; // emulate Math.random float precision, but observe Faker random seed - let clientStatus; - - Object.entries(statusProbabilities).some(([status, prob]) => { - if (rand < prob) { - clientStatus = status; - return true; - } - rand -= prob; - return false; - }); - + + while (allocationsByStatus[statusKeys[currentStatusIndex]] === 0) { + currentStatusIndex++; + } + + clientStatus = statusKeys[currentStatusIndex]; + allocationsByStatus[clientStatus]--; + const props = { jobId: group.job.id, namespace: group.job.namespace, @@ -147,8 +153,12 @@ export default Factory.extend({ ? faker.random.number({ min: 1, max: 5 }) : 0, clientStatus, + deploymentStatus: { + Canary: false, + Healthy: false, + }, }; - + if (group.withRescheduling) { server.create('allocation', 'rescheduled', props); } else { diff --git a/ui/mirage/scenarios/default.js b/ui/mirage/scenarios/default.js index 52b28685f92..59e29f57bc4 100644 --- a/ui/mirage/scenarios/default.js +++ b/ui/mirage/scenarios/default.js @@ -86,6 +86,76 @@ function smallCluster(server) { type: 'service', activeDeployment: true, }); + + //#region Active Deployment + + const activelyDeployingJobGroups = 2; + const activelyDeployingTasksPerGroup = 100; + + const activelyDeployingJob = server.create('job', { + createAllocations: true, + groupTaskCount: activelyDeployingTasksPerGroup, + shallow: true, + resourceSpec: Array(activelyDeployingJobGroups).fill(['M: 257, C: 500']), + noDeployments: true, // manually created below + activeDeployment: true, + allocStatusDistribution: { + running: 0.6, + failed: 0.05, + unknown: 0.05, + lost: 0, + complete: 0, + pending: 0.3, + }, + name: 'actively-deploying-job', + id: 'actively-deploying-job', + namespaceId: 'default', + type: 'service', + }); + + server.create('deployment', false, 'active', { + jobId: activelyDeployingJob.id, + groupDesiredTotal: activelyDeployingTasksPerGroup, + versionNumber: 1, + status: 'running', + }); + server.createList('allocation', 25, { + jobId: activelyDeployingJob.id, + jobVersion: 0, + clientStatus: 'running', + }); + + // Manipulate the above job to show a nice distribution of running, canary, etc. allocs + let activelyDeployingJobAllocs = server.schema.allocations + .all() + .filter((a) => a.jobId === activelyDeployingJob.id); + activelyDeployingJobAllocs.models + .filter((a) => a.clientStatus === 'running') + .slice(0, 10) + .forEach((a) => + a.update({ deploymentStatus: { Healthy: false, Canary: true } }) + ); + activelyDeployingJobAllocs.models + .filter((a) => a.clientStatus === 'running') + .slice(10, 20) + .forEach((a) => + a.update({ deploymentStatus: { Healthy: true, Canary: true } }) + ); + activelyDeployingJobAllocs.models + .filter((a) => a.clientStatus === 'running') + .slice(20, 65) + .forEach((a) => + a.update({ deploymentStatus: { Healthy: true, Canary: false } }) + ); + activelyDeployingJobAllocs.models + .filter((a) => a.clientStatus === 'pending') + .slice(0, 10) + .forEach((a) => + a.update({ deploymentStatus: { Healthy: true, Canary: true } }) + ); + + //#endregion Active Deployment + server.createList('allocFile', 5); server.create('allocFile', 'dir', { depth: 2 }); server.createList('csi-plugin', 2); diff --git a/ui/tests/acceptance/job-status-panel-test.js b/ui/tests/acceptance/job-status-panel-test.js index 7dda32c1b81..653b061b04f 100644 --- a/ui/tests/acceptance/job-status-panel-test.js +++ b/ui/tests/acceptance/job-status-panel-test.js @@ -252,8 +252,7 @@ module('Acceptance | job status panel', function (hooks) { }); test('Status Panel groups allocations when they get past a threshold, multiple statuses', async function (assert) { - faker.seed(3); - let groupTaskCount = 51; + let groupTaskCount = 50; let job = server.create('job', { status: 'running', @@ -274,12 +273,12 @@ module('Acceptance | job status panel', function (hooks) { await visit(`/jobs/${job.id}`); assert.dom('.job-status-panel').exists(); - // With 51 allocs split across 4 statuses distributed as above, we can expect 25 running, 16 failed, 6 pending, and 4 remaining. + // With 50 allocs split across 4 statuses distributed as above, we can expect 25 running, 16 failed, 6 pending, and 4 remaining. // At standard test resolution, each status will be ungrouped/grouped as follows: - // 25 running: 9 ungrouped, 16 grouped - // 13 failed: 5 ungrouped, 11 grouped - // 9 pending: 0 ungrouped, 6 grouped - // 4 lost: 0 ungrouped, 4 grouped. Represented as "Unplaced" + // 25 running: 9 ungrouped, 17 grouped + // 15 failed: 5 ungrouped, 10 grouped + // 5 pending: 0 ungrouped, 5 grouped + // 5 lost: 0 ungrouped, 5 grouped. Represented as "Unplaced" assert .dom('.ungrouped-allocs .represented-allocation.running') @@ -298,7 +297,7 @@ module('Acceptance | job status panel', function (hooks) { assert .dom('.ungrouped-allocs .represented-allocation.failed') - .exists({ count: 4 }, '4 failed allocations are represented ungrouped'); + .exists({ count: 5 }, '5 failed allocations are represented ungrouped'); assert .dom('.represented-allocation.rest.failed') .exists( @@ -307,7 +306,7 @@ module('Acceptance | job status panel', function (hooks) { assert .dom('.represented-allocation.rest.failed') .hasText( - '+9', + '+10', 'Summary block has the correct number of grouped failed allocs' ); @@ -322,7 +321,7 @@ module('Acceptance | job status panel', function (hooks) { assert .dom('.represented-allocation.rest.pending') .hasText( - '9', + '5', 'Summary block has the correct number of grouped pending allocs' ); @@ -337,7 +336,7 @@ module('Acceptance | job status panel', function (hooks) { assert .dom('.represented-allocation.rest.unplaced') .hasText( - '4', + '5', 'Summary block has the correct number of grouped unplaced allocs' ); await percySnapshot( @@ -346,17 +345,17 @@ module('Acceptance | job status panel', function (hooks) { // Simulate a window resize event; will recompute how many of each ought to be grouped. - // At 1000px, only running allocations have some ungrouped allocs. The rest are all fully grouped. - find('.page-body').style.width = '1000px'; + // At 1100px, only running and failed allocations have some ungrouped allocs + find('.page-body').style.width = '1100px'; await triggerEvent(window, 'resize'); await percySnapshot( - 'Status Panel groups allocations when they get past a threshold, multiple statuses (1000px)' + 'Status Panel groups allocations when they get past a threshold, multiple statuses (1100px)' ); assert .dom('.ungrouped-allocs .represented-allocation.running') - .exists({ count: 6 }, '6 running allocations are represented ungrouped'); + .exists({ count: 7 }, '7 running allocations are represented ungrouped'); assert .dom('.represented-allocation.rest.running') .exists( @@ -365,13 +364,13 @@ module('Acceptance | job status panel', function (hooks) { assert .dom('.represented-allocation.rest.running') .hasText( - '+19', + '+18', 'Summary block has the correct number of grouped running allocs' ); assert .dom('.ungrouped-allocs .represented-allocation.failed') - .doesNotExist('5 failed allocations are represented ungrouped'); + .exists({ count: 4 }, '4 failed allocations are represented ungrouped'); assert .dom('.represented-allocation.rest.failed') .exists( @@ -380,7 +379,7 @@ module('Acceptance | job status panel', function (hooks) { assert .dom('.represented-allocation.rest.failed') .hasText( - '13', + '+11', 'Summary block has the correct number of grouped failed allocs' ); @@ -394,7 +393,7 @@ module('Acceptance | job status panel', function (hooks) { assert .dom('.ungrouped-allocs .represented-allocation.running') - .doesNotExist('6 running allocations are represented ungrouped'); + .exists({ count: 4 }, '4 running allocations are represented ungrouped'); assert .dom('.represented-allocation.rest.running') .exists( @@ -403,9 +402,24 @@ module('Acceptance | job status panel', function (hooks) { assert .dom('.represented-allocation.rest.running') .hasText( - '25', + '+21', 'Summary block has the correct number of grouped running allocs' ); + + assert + .dom('.ungrouped-allocs .represented-allocation.failed') + .doesNotExist('no failed allocations are represented ungrouped'); + assert + .dom('.represented-allocation.rest.failed') + .exists( + 'Failed allocations are numerous enough that a summary block exists' + ); + assert + .dom('.represented-allocation.rest.failed') + .hasText( + '15', + 'Summary block has the correct number of grouped failed allocs' + ); }); module('deployment history', function () { diff --git a/ui/tests/integration/components/job-status-panel-test.js b/ui/tests/integration/components/job-status-panel-test.js index da930f277c9..9280e7417b9 100644 --- a/ui/tests/integration/components/job-status-panel-test.js +++ b/ui/tests/integration/components/job-status-panel-test.js @@ -5,6 +5,7 @@ import hbs from 'htmlbars-inline-precompile'; import { startMirage } from 'nomad-ui/initializers/ember-cli-mirage'; import { initialize as fragmentSerializerInitializer } from 'nomad-ui/initializers/fragment-serializer'; import { componentA11yAudit } from 'nomad-ui/tests/helpers/a11y-audit'; +import percySnapshot from '@percy/ember'; module( 'Integration | Component | job status panel | active deployment', @@ -41,76 +42,341 @@ module( assert.notOk(find('.active-deployment'), 'No active deployment'); }); - test('the latest deployment section shows up for the currently running deployment', async function (assert) { - assert.expect(4); + test('the latest deployment section shows up for the currently running deployment: Ungrouped Allocations (small cluster)', async function (assert) { + assert.expect(25); this.server.create('node'); - this.server.create('job', { + const NUMBER_OF_GROUPS = 2; + const ALLOCS_PER_GROUP = 10; + const allocStatusDistribution = { + running: 0.5, + failed: 0.2, + unknown: 0.1, + lost: 0, + complete: 0.1, + pending: 0.1, + }; + + const job = await this.server.create('job', { type: 'service', createAllocations: true, + noDeployments: true, // manually created below activeDeployment: true, + groupTaskCount: ALLOCS_PER_GROUP, + shallow: true, + resourceSpec: Array(NUMBER_OF_GROUPS).fill(['M: 257, C: 500']), // length of this array determines number of groups + allocStatusDistribution, }); - await this.store.findAll('job'); + const jobRecord = await this.store.find( + 'job', + JSON.stringify([job.id, 'default']) + ); + await this.server.create('deployment', false, 'active', { + jobId: job.id, + groupDesiredTotal: ALLOCS_PER_GROUP, + versionNumber: 1, + status: 'failed', + }); + + const OLD_ALLOCATIONS_TO_SHOW = 25; + const OLD_ALLOCATIONS_TO_COMPLETE = 5; + + this.server.createList('allocation', OLD_ALLOCATIONS_TO_SHOW, { + jobId: job.id, + jobVersion: 0, + clientStatus: 'running', + }); + + this.set('job', jobRecord); + await this.get('job.allocations'); - this.set('job', this.store.peekAll('job').get('firstObject')); await render(hbs` - ) - `); + + `); + + // Initially no active deployment + assert.notOk( + find('.active-deployment'), + 'Does not show an active deployment when latest is failed' + ); const deployment = await this.get('job.latestDeployment'); - assert.ok(find('.active-deployment'), 'Active deployment'); + await this.set('job.latestDeployment.status', 'running'); + + assert.ok( + find('.active-deployment'), + 'Shows an active deployment if latest status is Running' + ); + assert.ok( find('.active-deployment').classList.contains('is-info'), 'Running deployment gets the is-info class' ); + + // Half the shown allocations are running, 1 is pending, 1 is failed; none are canaries or healthy. + // The rest (lost, unknown, etc.) all show up as "Unplaced" + assert + .dom('.new-allocations .allocation-status-row .represented-allocation') + .exists( + { count: NUMBER_OF_GROUPS * ALLOCS_PER_GROUP }, + 'All allocations are shown (ungrouped)' + ); + assert + .dom( + '.new-allocations .allocation-status-row .represented-allocation.running' + ) + .exists( + { + count: + NUMBER_OF_GROUPS * + ALLOCS_PER_GROUP * + allocStatusDistribution.running, + }, + 'Correct number of running allocations are shown' + ); + assert + .dom( + '.new-allocations .allocation-status-row .represented-allocation.running.canary' + ) + .exists({ count: 0 }, 'No running canaries shown by default'); + assert + .dom( + '.new-allocations .allocation-status-row .represented-allocation.running.healthy' + ) + .exists({ count: 0 }, 'No running healthy shown by default'); + assert + .dom( + '.new-allocations .allocation-status-row .represented-allocation.failed' + ) + .exists( + { + count: + NUMBER_OF_GROUPS * + ALLOCS_PER_GROUP * + allocStatusDistribution.failed, + }, + 'Correct number of failed allocations are shown' + ); + assert + .dom( + '.new-allocations .allocation-status-row .represented-allocation.failed.canary' + ) + .exists({ count: 0 }, 'No failed canaries shown by default'); + assert + .dom( + '.new-allocations .allocation-status-row .represented-allocation.pending' + ) + .exists( + { + count: + NUMBER_OF_GROUPS * + ALLOCS_PER_GROUP * + allocStatusDistribution.pending, + }, + 'Correct number of pending allocations are shown' + ); + assert + .dom( + '.new-allocations .allocation-status-row .represented-allocation.pending.canary' + ) + .exists({ count: 0 }, 'No pending canaries shown by default'); + assert + .dom( + '.new-allocations .allocation-status-row .represented-allocation.unplaced' + ) + .exists( + { + count: + NUMBER_OF_GROUPS * + ALLOCS_PER_GROUP * + (allocStatusDistribution.lost + + allocStatusDistribution.unknown + + allocStatusDistribution.complete), + }, + 'Correct number of unplaced allocations are shown' + ); + + assert.equal( + find('[data-test-new-allocation-tally]').textContent.trim(), + `New allocations: ${ + this.job.allocations.filter( + (a) => + a.clientStatus === 'running' && + a.deploymentStatus?.Healthy === true + ).length + }/${deployment.get('desiredTotal')} running and healthy`, + 'Summary text shows accurate numbers when 0 are running/healthy' + ); + + let NUMBER_OF_RUNNING_CANARIES = 2; + let NUMBER_OF_RUNNING_HEALTHY = 5; + let NUMBER_OF_FAILED_CANARIES = 1; + let NUMBER_OF_PENDING_CANARIES = 1; + + // Set some allocs to canary, and to healthy + this.get('job.allocations') + .filter((a) => a.clientStatus === 'running') + .slice(0, NUMBER_OF_RUNNING_CANARIES) + .forEach((alloc) => + alloc.set('deploymentStatus', { + Canary: true, + Healthy: alloc.deploymentStatus?.Healthy, + }) + ); + this.get('job.allocations') + .filter((a) => a.clientStatus === 'running') + .slice(0, NUMBER_OF_RUNNING_HEALTHY) + .forEach((alloc) => + alloc.set('deploymentStatus', { + Canary: alloc.deploymentStatus?.Canary, + Healthy: true, + }) + ); + this.get('job.allocations') + .filter((a) => a.clientStatus === 'failed') + .slice(0, NUMBER_OF_FAILED_CANARIES) + .forEach((alloc) => + alloc.set('deploymentStatus', { + Canary: true, + Healthy: alloc.deploymentStatus?.Healthy, + }) + ); + this.get('job.allocations') + .filter((a) => a.clientStatus === 'pending') + .slice(0, NUMBER_OF_PENDING_CANARIES) + .forEach((alloc) => + alloc.set('deploymentStatus', { + Canary: true, + Healthy: alloc.deploymentStatus?.Healthy, + }) + ); + + await render(hbs` + + `); + assert + .dom( + '.new-allocations .allocation-status-row .represented-allocation.running.canary' + ) + .exists( + { count: NUMBER_OF_RUNNING_CANARIES }, + 'Running Canaries shown when deployment info dictates' + ); + assert + .dom( + '.new-allocations .allocation-status-row .represented-allocation.running.healthy' + ) + .exists( + { count: NUMBER_OF_RUNNING_HEALTHY }, + 'Running Healthy allocs shown when deployment info dictates' + ); + assert + .dom( + '.new-allocations .allocation-status-row .represented-allocation.failed.canary' + ) + .exists( + { count: NUMBER_OF_FAILED_CANARIES }, + 'Failed Canaries shown when deployment info dictates' + ); + assert + .dom( + '.new-allocations .allocation-status-row .represented-allocation.pending.canary' + ) + .exists( + { count: NUMBER_OF_PENDING_CANARIES }, + 'Pending Canaries shown when deployment info dictates' + ); + + assert.equal( + find('[data-test-new-allocation-tally]').textContent.trim(), + `New allocations: ${ + this.job.allocations.filter( + (a) => + a.clientStatus === 'running' && + a.deploymentStatus?.Healthy === true + ).length + }/${deployment.get('desiredTotal')} running and healthy`, + 'Summary text shows accurate numbers when some are running/healthy' + ); + + assert.equal( + find('[data-test-old-allocation-tally]').textContent.trim(), + `Previous allocations: ${ + this.job.allocations.filter( + (a) => + (a.clientStatus === 'running' || a.clientStatus === 'complete') && + a.jobVersion !== deployment.versionNumber + ).length + } running`, + 'Old Alloc Summary text shows accurate numbers' + ); + assert.equal( - find('[data-test-active-deployment-stat="id"]').textContent.trim(), - deployment.get('shortId'), - 'The active deployment is the most recent running deployment' + find('[data-test-previous-allocations-legend]') + .textContent.trim() + .replace(/\s\s+/g, ' '), + '25 Running 0 Complete' + ); + + await percySnapshot( + "Job Status Panel: 'New' and 'Previous' allocations, initial deploying state" + ); + + // Try setting a few of the old allocs to complete and make sure number ticks down + await Promise.all( + this.get('job.allocations') + .filter( + (a) => + a.clientStatus === 'running' && + a.jobVersion !== deployment.versionNumber + ) + .slice(0, OLD_ALLOCATIONS_TO_COMPLETE) + .map(async (a) => await a.set('clientStatus', 'complete')) + ); + + assert + .dom( + '.previous-allocations .allocation-status-row .represented-allocation' + ) + .exists( + { count: OLD_ALLOCATIONS_TO_SHOW }, + 'All old allocations are shown' + ); + assert + .dom( + '.previous-allocations .allocation-status-row .represented-allocation.complete' + ) + .exists( + { count: OLD_ALLOCATIONS_TO_COMPLETE }, + 'Correct number of old allocations are in completed state' + ); + + assert.equal( + find('[data-test-old-allocation-tally]').textContent.trim(), + `Previous allocations: ${ + this.job.allocations.filter( + (a) => + (a.clientStatus === 'running' || a.clientStatus === 'complete') && + a.jobVersion !== deployment.versionNumber + ).length - OLD_ALLOCATIONS_TO_COMPLETE + } running`, + 'Old Alloc Summary text shows accurate numbers after some are marked complete' + ); + + assert.equal( + find('[data-test-previous-allocations-legend]') + .textContent.trim() + .replace(/\s\s+/g, ' '), + '20 Running 5 Complete' + ); + + await percySnapshot( + "Job Status Panel: 'New' and 'Previous' allocations, some old marked complete" ); - // TODO: Replace the now-removed metrics tests with a new set of tests for alloc presence - - // assert.equal( - // find('[data-test-deployment-metric="canaries"]').textContent.trim(), - // `${deployment.get('placedCanaries')} / ${deployment.get( - // 'desiredCanaries' - // )}`, - // 'Canaries, both places and desired, are in the metrics' - // ); - - // assert.equal( - // find('[data-test-deployment-metric="placed"]').textContent.trim(), - // deployment.get('placedAllocs'), - // 'Placed allocs aggregates across task groups' - // ); - - // assert.equal( - // find('[data-test-deployment-metric="desired"]').textContent.trim(), - // deployment.get('desiredTotal'), - // 'Desired allocs aggregates across task groups' - // ); - - // assert.equal( - // find('[data-test-deployment-metric="healthy"]').textContent.trim(), - // deployment.get('healthyAllocs'), - // 'Healthy allocs aggregates across task groups' - // ); - - // assert.equal( - // find('[data-test-deployment-metric="unhealthy"]').textContent.trim(), - // deployment.get('unhealthyAllocs'), - // 'Unhealthy allocs aggregates across task groups' - // ); - - // assert.equal( - // find('[data-test-deployment-notification]').textContent.trim(), - // deployment.get('statusDescription'), - // 'Status description is in the metrics block' - // ); await componentA11yAudit( this.element, assert,