Skip to content

Commit

Permalink
Merge pull request #7896 from hashicorp/f-ui/csi-namespace-issue
Browse files Browse the repository at this point in the history
UI: CSI namespace bugs
  • Loading branch information
DingoEatingFuzz committed May 11, 2020
2 parents 3d6c088 + 804029c commit bda9e84
Show file tree
Hide file tree
Showing 6 changed files with 104 additions and 3 deletions.
8 changes: 7 additions & 1 deletion ui/app/components/gutter-menu.js
Original file line number Diff line number Diff line change
Expand Up @@ -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') },
});
},
Expand Down
18 changes: 16 additions & 2 deletions ui/app/templates/components/gutter-menu.hbs
Original file line number Diff line number Diff line change
Expand Up @@ -51,13 +51,27 @@
Workload
</p>
<ul class="menu-list">
<li>{{#link-to "jobs" activeClass="is-active" data-test-gutter-link="jobs"}}Jobs{{/link-to}}</li>
<li>
{{#link-to "jobs"
(query-params jobNamespace=system.activeNamespace.id)
activeClass="is-active"
data-test-gutter-link="jobs"}}
Jobs
{{/link-to}}
</li>
</ul>
<p class="menu-label is-minor">
Integrations
</p>
<ul class="menu-list">
<li>{{#link-to "csi" activeClass="is-active" data-test-gutter-link="csi"}}Storage <span class="tag is-small">Beta</span>{{/link-to}}</li>
<li>
{{#link-to "csi"
(query-params volumeNamespace=system.activeNamespace.id)
activeClass="is-active"
data-test-gutter-link="storage"}}
Storage <span class="tag is-small">Beta</span>
{{/link-to}}
</li>
</ul>
<p class="menu-label">
Cluster
Expand Down
12 changes: 12 additions & 0 deletions ui/tests/acceptance/jobs-list-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { setupApplicationTest } from 'ember-qunit';
import { setupMirage } from 'ember-cli-mirage/test-support';
import pageSizeSelect from './behaviors/page-size-select';
import JobsList from 'nomad-ui/tests/pages/jobs/list';
import Layout from 'nomad-ui/tests/pages/layout';

let managementToken, clientToken;

Expand Down Expand Up @@ -341,6 +342,17 @@ module('Acceptance | jobs list', function(hooks) {
assert.equal(JobsList.jobs.length, 1, 'Only one job shown due to query param');
});

test('the active namespace is carried over to the storage pages', async function(assert) {
server.createList('namespace', 2);

const namespace = server.db.namespaces[1];
await JobsList.visit({ namespace: namespace.id });

await Layout.gutter.visitStorage();

assert.equal(currentURL(), `/csi/volumes?namespace=${namespace.id}`);
});

pageSizeSelect({
resourceName: 'job',
pageObject: JobsList,
Expand Down
56 changes: 56 additions & 0 deletions ui/tests/acceptance/namespaces-test.js
Original file line number Diff line number Diff line change
@@ -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);
Expand Down Expand Up @@ -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;

Expand Down Expand Up @@ -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);
});
});
12 changes: 12 additions & 0 deletions ui/tests/acceptance/volumes-list-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { setupApplicationTest } from 'ember-qunit';
import { setupMirage } from 'ember-cli-mirage/test-support';
import pageSizeSelect from './behaviors/page-size-select';
import VolumesList from 'nomad-ui/tests/pages/storage/volumes/list';
import Layout from 'nomad-ui/tests/pages/layout';

const assignWriteAlloc = (volume, alloc) => {
volume.writeAllocs.add(alloc);
Expand Down Expand Up @@ -142,6 +143,17 @@ module('Acceptance | volumes list', function(hooks) {
assert.equal(VolumesList.volumes.objectAt(0).name, volume2.id);
});

test('the active namespace is carried over to the jobs pages', async function(assert) {
server.createList('namespace', 2);

const namespace = server.db.namespaces[1];
await VolumesList.visit({ namespace: namespace.id });

await Layout.gutter.visitJobs();

assert.equal(currentURL(), `/jobs?namespace=${namespace.id}`);
});

test('when accessing volumes is forbidden, a message is shown with a link to the tokens page', async function(assert) {
server.pretender.get('/v1/volumes', () => [403, {}, null]);

Expand Down
1 change: 1 addition & 0 deletions ui/tests/pages/layout.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,5 +27,6 @@ export default create({
visitJobs: clickable('[data-test-gutter-link="jobs"]'),
visitClients: clickable('[data-test-gutter-link="clients"]'),
visitServers: clickable('[data-test-gutter-link="servers"]'),
visitStorage: clickable('[data-test-gutter-link="storage"]'),
},
});

0 comments on commit bda9e84

Please sign in to comment.