Files
nomad/ui/app/routes/storage/index.js
Phil Renaud 1976202cd6 Feature: Dynamic Host Volumes in the UI (#25224)
* DHV UI init

* /csi routes to /storage routes and a routeRedirector util (#25163)

* /csi routes to /storage routes and a routeRedirector util

* Tests and routes move csi/ to storage/

* Changelog added

* [ui] Storage UI overhaul + Dynamic Host Volumes UI (#25226)

* Storage index page and DHV model properties

* Naive version of a storage overview page

* Experimental fetch of alloc data dirs

* Fetch ephemeral disks and static host volumes as an ember concurrency task and nice table stylings

* Playing nice with section header labels to make eslint happy even though wcag was already cool with it

* inlined the storage type explainers and reordered things, plus tooltips and keynav

* Bones of a dynamic host volume individual page

* Woooo dynamic host volume model, adapter, and serializer with embedded alloc relationships

* Couple test fixes

* async:false relationship for dhv.hasMany('alloc') to prevent a ton of xhr requests

* DHV request type at index routemodel and better serialization

* Pagination and searching and query params oh my

* Test retrofits for csi volumes

* Really fantastic flake gets fixed

* DHV detail page acceptance test and a bunch of mirage hooks

* Seed so that the actions test has a guaranteed task

* removed ephemeral disk and static host volume manual scanning

* CapacityBytes and capabilities table added to DHV detail page

* Debugging actions flyout test

* was becoming clear that faker.seed editing was causing havoc elsewhere so might as well not boil the ocean and just tell this test to do what I want it to

* Post-create job gets taskCount instead of count

* CSI volumes now get /csi route prefix at detail level

* lazyclick method for unused keynav removed

* keyboard nav and table-watcher for DHV added

* Addressed PR comments, changed up capabilities table and id references, etc.

* Capabilities table for DHV and ID in details header

* Testfixes for pluginID and capabilities table on DHV page
2025-03-10 14:46:02 -04:00

68 lines
1.8 KiB
JavaScript

/**
* Copyright (c) HashiCorp, Inc.
* SPDX-License-Identifier: BUSL-1.1
*/
// @ts-check
import { inject as service } from '@ember/service';
import RSVP from 'rsvp';
import Route from '@ember/routing/route';
import { collect } from '@ember/object/computed';
import { watchQuery, watchAll } from 'nomad-ui/utils/properties/watch';
import WithWatchers from 'nomad-ui/mixins/with-watchers';
import notifyForbidden from 'nomad-ui/utils/notify-forbidden';
import WithForbiddenState from 'nomad-ui/mixins/with-forbidden-state';
export default class IndexRoute extends Route.extend(
WithWatchers,
WithForbiddenState
) {
@service store;
queryParams = {
qpNamespace: {
refreshModel: true,
},
};
model(params) {
return RSVP.hash({
csiVolumes: this.store
.query('volume', { type: 'csi', namespace: params.qpNamespace })
.catch(notifyForbidden(this)),
namespaces: this.store.findAll('namespace'),
dynamicHostVolumes: this.store
.query('dynamic-host-volume', {
type: 'host',
namespace: params.qpNamespace,
})
.catch(notifyForbidden(this)),
});
}
startWatchers(controller) {
controller.set('namespacesWatch', this.watchNamespaces.perform());
controller.set(
'modelWatch',
this.watchVolumes.perform({
type: 'csi',
namespace: controller.qpNamespace,
})
);
controller.set(
'modelWatch',
this.watchDynamicHostVolumes.perform({
type: 'host',
namespace: controller.qpNamespace,
})
);
}
@watchQuery('volume') watchVolumes;
@watchQuery('dynamic-host-volume') watchDynamicHostVolumes;
@watchAll('namespace') watchNamespaces;
@collect('watchVolumes', 'watchNamespaces', 'watchDynamicHostVolumes')
watchers;
}