From c5b1fd3aa7078bbc4d09042dbc6fee60a70f6dc3 Mon Sep 17 00:00:00 2001 From: Michael Lange Date: Thu, 7 May 2020 21:18:55 -0700 Subject: [PATCH] Changing namespaces now situationally redirects to jobs or volumes Changing namespaces can be done anywhere in the app even though many Nomad resources aren't namespace-sensitive (e.g., clients, plugins). A user changing namespaces is an intent to reset context, "now I want to begin a task that relates to Namespace X". Where that task begins used to always be the Jobs list, since it was the only namespace sensitive resource. Now with CSI Volumes, "square 1" is Volumes if the namespace is changed from a storage page. --- ui/app/components/gutter-menu.js | 8 +++- ui/tests/acceptance/namespaces-test.js | 56 ++++++++++++++++++++++++++ 2 files changed, 63 insertions(+), 1 deletion(-) diff --git a/ui/app/components/gutter-menu.js b/ui/app/components/gutter-menu.js index 6c7871ecc..46c02d137 100644 --- a/ui/app/components/gutter-menu.js +++ b/ui/app/components/gutter-menu.js @@ -37,7 +37,13 @@ export default Component.extend({ gotoJobsForNamespace(namespace) { if (!namespace || !namespace.get('id')) return; - this.router.transitionTo('jobs', { + // Jobs and CSI Volumes are both namespace-sensitive. Changing namespaces is + // an intent to reset context, but where to reset to depends on where the namespace + // is being switched from. Jobs take precedence, but if the namespace is switched from + // a storage-related page, context should be reset to volumes. + const destination = this.router.currentRouteName.startsWith('csi.') ? 'csi.volumes' : 'jobs'; + + this.router.transitionTo(destination, { queryParams: { namespace: namespace.get('id') }, }); }, diff --git a/ui/tests/acceptance/namespaces-test.js b/ui/tests/acceptance/namespaces-test.js index 812b13607..d25e8d369 100644 --- a/ui/tests/acceptance/namespaces-test.js +++ b/ui/tests/acceptance/namespaces-test.js @@ -1,8 +1,13 @@ +import { currentURL } from '@ember/test-helpers'; import { module, test } from 'qunit'; import { setupApplicationTest } from 'ember-qunit'; import { setupMirage } from 'ember-cli-mirage/test-support'; import { selectChoose } from 'ember-power-select/test-support'; import JobsList from 'nomad-ui/tests/pages/jobs/list'; +import ClientsList from 'nomad-ui/tests/pages/clients/list'; +import Allocation from 'nomad-ui/tests/pages/allocations/detail'; +import PluginsList from 'nomad-ui/tests/pages/storage/plugins/list'; +import VolumesList from 'nomad-ui/tests/pages/storage/volumes/list'; module('Acceptance | namespaces (disabled)', function(hooks) { setupApplicationTest(hooks); @@ -38,6 +43,10 @@ module('Acceptance | namespaces (enabled)', function(hooks) { server.createList('job', 5); }); + hooks.afterEach(function() { + window.localStorage.clear(); + }); + test('the namespace switcher lists all namespaces', async function(assert) { const namespaces = server.db.namespaces; @@ -105,4 +114,51 @@ module('Acceptance | namespaces (enabled)', function(hooks) { 'Namespace query param on second request' ); }); + + test('changing the namespace in the clients hierarchy navigates to the jobs page', async function(assert) { + const namespace = server.db.namespaces[1]; + + await ClientsList.visit(); + await selectChoose('[data-test-namespace-switcher]', namespace.name); + + assert.equal(currentURL(), `/jobs?namespace=${namespace.name}`); + }); + + test('changing the namespace in the allocations hierarchy navigates to the jobs page', async function(assert) { + const namespace = server.db.namespaces[1]; + const allocation = server.create('allocation', { job: server.db.jobs[0] }); + + await Allocation.visit({ id: allocation.id }); + await selectChoose('[data-test-namespace-switcher]', namespace.name); + + assert.equal(currentURL(), `/jobs?namespace=${namespace.name}`); + }); + + test('changing the namespace in the storage hierarchy navigates to the volumes page', async function(assert) { + const namespace = server.db.namespaces[1]; + + await PluginsList.visit(); + await selectChoose('[data-test-namespace-switcher]', namespace.name); + + assert.equal(currentURL(), `/csi/volumes?namespace=${namespace.name}`); + }); + + test('changing the namespace refreshes the volumes list when on the volumes page', async function(assert) { + const namespace = server.db.namespaces[1]; + + await VolumesList.visit(); + + let requests = server.pretender.handledRequests.filter(req => + req.url.startsWith('/v1/volumes') + ); + assert.equal(requests.length, 1); + assert.equal(requests[0].queryParams.namespace, undefined); + + // TODO: handle this with Page Objects + await selectChoose('[data-test-namespace-switcher]', namespace.name); + + requests = server.pretender.handledRequests.filter(req => req.url.startsWith('/v1/volumes')); + assert.equal(requests.length, 2); + assert.equal(requests[1].queryParams.namespace, namespace.name); + }); });