[VAULT-37521] UI: update secrets/mounts route to call plugin-catalog endpoint (#9224) (#9236)

Co-authored-by: Shannon Roberts (Beagin) <beagins@users.noreply.github.com>
This commit is contained in:
Vault Automation 2025-09-09 17:40:28 -06:00 committed by GitHub
parent f2872f0cc7
commit d173b10eb1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 18 additions and 97 deletions

View File

@ -1,37 +0,0 @@
/**
* Copyright (c) HashiCorp, Inc.
* SPDX-License-Identifier: BUSL-1.1
*/
import { service } from '@ember/service';
import Controller from '@ember/controller';
import { action } from '@ember/object';
import { supportedSecretBackends } from 'vault/helpers/supported-secret-backends';
import engineDisplayData from 'vault/helpers/engines-display-data';
const SUPPORTED_BACKENDS = supportedSecretBackends();
export default class MountSecretBackendController extends Controller {
@service router;
@action
onMountSuccess(type, path, useEngineRoute = false) {
let transition;
if (SUPPORTED_BACKENDS.includes(type)) {
const engineInfo = engineDisplayData(type);
if (useEngineRoute) {
transition = this.router.transitionTo(
`vault.cluster.secrets.backend.${engineInfo.engineRoute}`,
path
);
} else {
// For keymgmt, we need to land on provider tab by default using query params
const queryParams = engineInfo.type === 'keymgmt' ? { tab: 'provider' } : {};
transition = this.router.transitionTo('vault.cluster.secrets.backend.index', path, { queryParams });
}
} else {
transition = this.router.transitionTo('vault.cluster.secrets.backends');
}
return transition.followRedirects();
}
}

View File

@ -60,7 +60,6 @@ Router.map(function () {
this.route('section', { path: '/:section_name' });
});
});
this.route('mount-secret-backend');
});
this.route('unseal');
this.route('tools', function () {

View File

@ -5,8 +5,10 @@
import Route from '@ember/routing/route';
import { service } from '@ember/service';
import { hash } from 'rsvp';
import SecretsEngineForm from 'vault/forms/secrets/engine';
import Router from 'vault/router';
import type PluginCatalogService from 'vault/services/plugin-catalog';
import type { ModelFrom } from 'vault/vault/route';
@ -14,8 +16,9 @@ export type MountSecretBackendModel = ModelFrom<VaultClusterSecretsMountsIndexRo
export default class VaultClusterSecretsMountsIndexRouter extends Route {
@service declare router: Router;
@service('plugin-catalog') declare readonly pluginCatalog: PluginCatalogService;
model() {
async model() {
const defaults = {
config: { listing_visibility: false },
kv_config: {
@ -25,6 +28,16 @@ export default class VaultClusterSecretsMountsIndexRouter extends Route {
},
options: { version: 2 },
};
return new SecretsEngineForm(defaults, { isNew: true });
const secretEngineForm = new SecretsEngineForm(defaults, { isNew: true });
// Fetch plugin catalog data to enhance the secret engines list
const pluginCatalogResponse = await this.pluginCatalog.fetchPluginCatalog();
return hash({
form: secretEngineForm,
pluginCatalogData: pluginCatalogResponse.data,
pluginCatalogError: pluginCatalogResponse.error,
});
}
}

View File

@ -9,10 +9,7 @@ import { service } from '@ember/service';
export default class SettingsIndexRouter extends Route {
@service router;
beforeModel(transition) {
if (transition.targetName === this.routeName) {
transition.abort();
return this.router.replaceWith('vault.cluster.settings.mount-secret-backend');
}
redirect() {
return this.router.replaceWith('vault.cluster.secrets.mounts.index');
}
}

View File

@ -1,45 +0,0 @@
/**
* Copyright (c) HashiCorp, Inc.
* SPDX-License-Identifier: BUSL-1.1
*/
import Route from '@ember/routing/route';
import SecretsEngineForm from 'vault/forms/secrets/engine';
import { service } from '@ember/service';
import { hash } from 'rsvp';
import type { ModelFrom } from 'vault/vault/route';
import type AuthService from 'vault/services/auth';
import type NamespaceService from 'vault/services/namespace';
import type PluginCatalogService from 'vault/services/plugin-catalog';
export type MountSecretBackendModel = ModelFrom<VaultClusterSettingsMountSecretBackendRoute>;
export default class VaultClusterSettingsMountSecretBackendRoute extends Route {
@service declare readonly auth: AuthService;
@service declare readonly namespace: NamespaceService;
@service('plugin-catalog') declare readonly pluginCatalog: PluginCatalogService;
async model() {
const defaults = {
config: { listing_visibility: false },
kv_config: {
max_versions: 0,
cas_required: false,
delete_version_after: undefined,
},
options: { version: 2 },
};
const secretEngineForm = new SecretsEngineForm(defaults, { isNew: true });
// Fetch plugin catalog data to enhance the secret engines list
const pluginCatalogResponse = await this.pluginCatalog.fetchPluginCatalog();
return hash({
form: secretEngineForm,
pluginCatalogData: pluginCatalogResponse.data,
pluginCatalogError: pluginCatalogResponse.error,
});
}
}

View File

@ -1,6 +0,0 @@
{{!
Copyright (c) HashiCorp, Inc.
SPDX-License-Identifier: BUSL-1.1
}}
<MountBackendForm @mountModel={{this.model}} @mountCategory="secret" @onMountSuccess={{action "onMountSuccess"}} />

View File

@ -39,7 +39,7 @@ const consoleComponent = create(consoleClass);
// enterprise backends are tested separately
const BACKENDS_WITH_ENGINES = ['kv', 'pki', 'ldap', 'kubernetes'];
module('Acceptance | settings/mount-secret-backend', function (hooks) {
module('Acceptance | secrets/mounts', function (hooks) {
setupApplicationTest(hooks);
hooks.beforeEach(function () {