Jordan Reimer 2417aa9aad
[UI] Ember Data Migration - Secrets Engine (#30829)
* [UI] Ember Data Migration - Secrets Engine Resource (#30791)

* adds base factory for resources and secrets engine resource

* updates dashboard and secret-engine list route to fetch mounts from api service

* updates secret backends routes to use api service

* updates secrets engine config routes to use api service

* updates secrets backend route to use internal mounts endpoint and fixes error handling

* updates property casing in config details card component

* fixes dashboard tests

* fixes issues with engine configuration

* updates api service to only set token header if value is defined in auth service

* fixes more tests

* Update ui/app/routes/vault/cluster/secrets/backend/configuration/index.js

Co-authored-by: Angel Garbarino <Monkeychip@users.noreply.github.com>

* removes alwaysRender from publicKey field in secret engine configuration details component

* removes unused hideToggle arg from secret engine mount config template

* updates kv config route to load secret-engine model

* fixes kv config route

---------

Co-authored-by: Angel Garbarino <Monkeychip@users.noreply.github.com>

* [UI] Ember Data Migration - Secrets Engine Forms (#30951)

* adds secrets engine form class

* updates mount-secret-backend route and form component to use secrets engine form class and api service

* updates to form class proxy for nested form data properties

* adds form classes for configurable secrets engines

* updates secrets engine config edit route and components to use form classes and api service

* adds missing copyright header

* fixes tests

* fixes type error

* updates configure-ssh component to use form class and api service

* updates configure-ssh tests

* updates configuration-wif component tests

* fixes mount secret backend and form tests

* adds method to normalize request key casing to api service

* addresses pr review feedback

* removes unused secrets engine config models, adapters and serializers (#30980)

* fixes azure config tests

* fixes more ent tests

---------

Co-authored-by: Angel Garbarino <Monkeychip@users.noreply.github.com>
2025-06-16 14:29:17 -06:00

78 lines
2.2 KiB
TypeScript

/**
* Copyright (c) HashiCorp, Inc.
* SPDX-License-Identifier: BUSL-1.1
*/
import { baseResourceFactory } from 'vault/resources/base-factory';
import { isAddonEngine, allEngines } from 'vault/helpers/mountable-secret-engines';
import { supportedSecretBackends } from 'vault/helpers/supported-secret-backends';
import type { SecretsEngine } from 'vault/secrets/engine';
export default class SecretsEngineResource extends baseResourceFactory<SecretsEngine>() {
id: string;
#LIST_EXCLUDED_BACKENDS = ['system', 'identity'];
constructor(data: SecretsEngine) {
super(data);
// strip trailing slash from path for id since it is used in routing
this.id = data.path.replace(/\/$/, '');
}
get version() {
const { version } = this.options || {};
return version ? Number(version) : 1;
}
get engineType() {
return (this.type || '').replace(/^ns_/, '');
}
get icon() {
const engineData = allEngines().find((engine) => engine.type === this.engineType);
return engineData?.glyph || 'lock';
}
get isV2KV() {
return this.version === 2 && (this.engineType === 'kv' || this.engineType === 'generic');
}
get shouldIncludeInList() {
return !this.#LIST_EXCLUDED_BACKENDS.includes(this.engineType);
}
get isSupportedBackend() {
return supportedSecretBackends().includes(this.engineType);
}
get backendLink() {
if (this.engineType === 'database') {
return 'vault.cluster.secrets.backend.overview';
}
if (isAddonEngine(this.engineType, this.version)) {
const engine = allEngines().find((engine) => engine.type === this.engineType);
if (engine?.engineRoute) {
return `vault.cluster.secrets.backend.${engine.engineRoute}`;
}
}
if (this.isV2KV) {
// if it's KV v2 but not registered as an addon, it's type generic
return 'vault.cluster.secrets.backend.kv.list';
}
return `vault.cluster.secrets.backend.list-root`;
}
get backendConfigurationLink() {
if (isAddonEngine(this.engineType, this.version)) {
return `vault.cluster.secrets.backend.${this.engineType}.configuration`;
}
return `vault.cluster.secrets.backend.configuration`;
}
get localDisplay() {
return this.local ? 'local' : 'replicated';
}
}