mirror of
https://github.com/hashicorp/vault.git
synced 2026-02-18 18:38:08 -05:00
Merge remote-tracking branch 'remotes/from/ce/main'
This commit is contained in:
commit
dc4ea9aa69
104 changed files with 408 additions and 246 deletions
|
|
@ -87,6 +87,7 @@ export default class App extends Application {
|
|||
],
|
||||
externalRoutes: {
|
||||
secrets: 'vault.cluster.secrets.backends',
|
||||
vault: 'vault.cluster',
|
||||
secretsGeneralSettingsConfiguration: 'vault.cluster.secrets.backend.configuration.general-settings',
|
||||
},
|
||||
},
|
||||
|
|
@ -97,6 +98,7 @@ export default class App extends Application {
|
|||
externalRoutes: {
|
||||
secrets: 'vault.cluster.secrets.backends',
|
||||
secretsGeneralSettingsConfiguration: 'vault.cluster.secrets.backend.configuration.general-settings',
|
||||
vault: 'vault.cluster',
|
||||
},
|
||||
},
|
||||
},
|
||||
|
|
@ -111,6 +113,7 @@ export default class App extends Application {
|
|||
'capabilities',
|
||||
],
|
||||
externalRoutes: {
|
||||
vault: 'vault.cluster',
|
||||
secrets: 'vault.cluster.secrets.backends',
|
||||
secretsGeneralSettingsConfiguration: 'vault.cluster.secrets.backend.configuration.general-settings',
|
||||
secretsPluginSettingsConfiguration: 'vault.cluster.secrets.backend.configuration.plugin-settings',
|
||||
|
|
@ -131,6 +134,7 @@ export default class App extends Application {
|
|||
'version',
|
||||
],
|
||||
externalRoutes: {
|
||||
vault: 'vault.cluster',
|
||||
secrets: 'vault.cluster.secrets.backends',
|
||||
syncDestination: 'vault.cluster.sync.secrets.destinations.destination',
|
||||
secretsGeneralSettingsConfiguration: 'vault.cluster.secrets.backend.configuration.general-settings',
|
||||
|
|
@ -152,6 +156,7 @@ export default class App extends Application {
|
|||
'version',
|
||||
],
|
||||
externalRoutes: {
|
||||
vault: 'vault.cluster',
|
||||
secrets: 'vault.cluster.secrets.backends',
|
||||
externalMountIssuer: 'vault.cluster.secrets.backend.pki.issuers.issuer.details',
|
||||
secretsListRootConfiguration: 'vault.cluster.secrets.backend.configuration',
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
<div class="is-flex-column align-items-end">
|
||||
{{! Enterprise should always have a @billingStartTime but as a fallback allow the user to query dates manually }}
|
||||
{{#if (and @billingStartTime this.version.isEnterprise)}}
|
||||
<Hds::Text::Display @tag="p" @size="100" class="has-bottom-margin-xs">
|
||||
<Hds::Text::Display @tag="p" @size="100" class="has-bottom-margin-xs" data-test-text-display="change-billing-data">
|
||||
{{if this.flags.isHvdManaged "Change data period" "Change billing period"}}
|
||||
</Hds::Text::Display>
|
||||
<Hds::Dropdown class="has-left-margin-xs" as |D|>
|
||||
|
|
|
|||
|
|
@ -3,7 +3,12 @@
|
|||
SPDX-License-Identifier: BUSL-1.1
|
||||
}}
|
||||
|
||||
<Page::Header @title="Client Usage">
|
||||
<Page::Header @title="Client usage">
|
||||
<:breadcrumbs>
|
||||
<Page::Breadcrumbs
|
||||
@breadcrumbs={{array (hash label="Vault" route="vault.cluster.dashboard" icon="vault") (hash label="Client usage")}}
|
||||
/>
|
||||
</:breadcrumbs>
|
||||
<:subtitle>
|
||||
{{#if @activityTimestamp}}
|
||||
Dashboard last updated:
|
||||
|
|
|
|||
|
|
@ -44,7 +44,8 @@ export default class MountSecretsEngineFormComponent extends Component<Args> {
|
|||
@tracked errorMessage: string | string[] = '';
|
||||
|
||||
get breadcrumbs() {
|
||||
const breadcrumbs: { label: string; route?: string }[] = [
|
||||
const breadcrumbs: { label: string; route?: string; icon?: string }[] = [
|
||||
{ label: 'Vault', route: 'vault.cluster', icon: 'vault' },
|
||||
{ label: 'Secrets engines', route: 'vault.cluster.secrets.backends' },
|
||||
{ label: 'Enable secrets engine', route: 'vault.cluster.secrets.enable' },
|
||||
];
|
||||
|
|
|
|||
|
|
@ -45,6 +45,11 @@ export default class SecretEnginesCatalogComponent extends Component<Args> {
|
|||
|
||||
get breadcrumbs() {
|
||||
return [
|
||||
{
|
||||
label: 'Vault',
|
||||
icon: 'vault',
|
||||
route: 'vault.cluster',
|
||||
},
|
||||
{
|
||||
label: 'Secrets engines',
|
||||
route: 'vault.cluster.secrets.backends',
|
||||
|
|
|
|||
|
|
@ -84,7 +84,8 @@ export default class SecretsBackendConfigurationEdit extends Route {
|
|||
const { secretsEngine } = resolvedModel;
|
||||
|
||||
const breadcrumbs = [
|
||||
{ label: 'Secrets', route: 'vault.cluster.secrets' },
|
||||
{ label: 'Vault', route: 'vault.cluster', icon: 'vault' },
|
||||
{ label: 'Secrets engines', route: 'vault.cluster.secrets' },
|
||||
{ label: secretsEngine.id, route: 'vault.cluster.secrets.backend.list-root', model: secretsEngine.id },
|
||||
{ label: 'Configuration', route: 'vault.cluster.secrets.backend.configuration.plugin-settings' },
|
||||
{ label: 'Configure' },
|
||||
|
|
|
|||
|
|
@ -54,7 +54,8 @@ export default class SecretsBackendConfigurationGeneralSettingsRoute extends Rou
|
|||
const { secretsEngine } = resolvedModel;
|
||||
|
||||
const breadcrumbs = [
|
||||
{ label: 'Secrets', route: 'vault.cluster.secrets' },
|
||||
{ label: 'Vault', route: 'vault.cluster', icon: 'vault' },
|
||||
{ label: 'Secrets engines', route: 'vault.cluster.secrets' },
|
||||
{ label: secretsEngine.id, route: 'vault.cluster.secrets.backend.list-root', model: secretsEngine.id },
|
||||
{ label: 'Configuration' },
|
||||
];
|
||||
|
|
|
|||
|
|
@ -54,7 +54,8 @@ export default class SecretsBackendConfigurationPluginSettingsRoute extends Rout
|
|||
const { secretsEngine } = resolvedModel;
|
||||
|
||||
const breadcrumbs = [
|
||||
{ label: 'Secrets', route: 'vault.cluster.secrets' },
|
||||
{ label: 'Vault', route: 'vault.cluster', icon: 'vault' },
|
||||
{ label: 'Secrets engines', route: 'vault.cluster.secrets' },
|
||||
{ label: secretsEngine.id, route: 'vault.cluster.secrets.backend.list-root', model: secretsEngine.id },
|
||||
{ label: 'Configuration' },
|
||||
];
|
||||
|
|
|
|||
|
|
@ -3,7 +3,13 @@
|
|||
SPDX-License-Identifier: BUSL-1.1
|
||||
}}
|
||||
|
||||
<Page::Header @title="Configuration" />
|
||||
<Page::Header @title="Configuration">
|
||||
<:breadcrumbs>
|
||||
<Page::Breadcrumbs
|
||||
@breadcrumbs={{array (hash label="Vault" route="vault.cluster.dashboard" icon="vault") (hash label="Configuration")}}
|
||||
/>
|
||||
</:breadcrumbs>
|
||||
</Page::Header>
|
||||
<Toolbar>
|
||||
<ToolbarActions>
|
||||
{{#if @model.capabilities.canUpdate}}
|
||||
|
|
|
|||
|
|
@ -3,6 +3,15 @@
|
|||
SPDX-License-Identifier: BUSL-1.1
|
||||
}}
|
||||
|
||||
<Page::Header @title="Edit Configuration" />
|
||||
<Page::Header @title="Edit configuration">
|
||||
<:breadcrumbs>
|
||||
<Page::Breadcrumbs
|
||||
@breadcrumbs={{array
|
||||
(hash label="Vault" route="vault.cluster.dashboard" icon="vault")
|
||||
(hash label="Edit configuration")
|
||||
}}
|
||||
/>
|
||||
</:breadcrumbs>
|
||||
</Page::Header>
|
||||
|
||||
<Clients::Config @config={{@model}} @mode="edit" />
|
||||
|
|
@ -25,7 +25,8 @@ import { getEffectiveEngineType } from 'vault/utils/external-plugin-helpers';
|
|||
export default class SecretListHeader extends Component {
|
||||
get breadcrumbs() {
|
||||
const breadcrumbs = [
|
||||
{ label: 'Secrets', route: 'vault.cluster.secrets' },
|
||||
{ label: 'Vault', route: 'vault.cluster', icon: 'vault' },
|
||||
{ label: 'Secrets engines', route: 'vault.cluster.secrets' },
|
||||
{
|
||||
label: this.args.model.id,
|
||||
route: 'vault.cluster.secrets.backend.list-root',
|
||||
|
|
|
|||
|
|
@ -54,7 +54,7 @@
|
|||
{{/if}}
|
||||
{{#if (display-nav-item this.navSection.reporting)}}
|
||||
<Nav.Link
|
||||
@route={{if this.canAccessVaultUsageDashboard "vault.cluster.usage-reporting" "vault.cluster.license"}}
|
||||
@route={{if (display-nav-item this.routeName.vaultUsage) "vault.cluster.usage-reporting" "vault.cluster.license"}}
|
||||
@text="Reporting"
|
||||
data-test-sidebar-nav-link="Reporting"
|
||||
@hasSubItems={{true}}
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
|
||||
import Component from '@glimmer/component';
|
||||
import { service } from '@ember/service';
|
||||
import { NavSection } from 'core/helpers/display-nav-item';
|
||||
import { NavSection, RouteName } from 'core/helpers/display-nav-item';
|
||||
|
||||
export default class SidebarNavClusterComponent extends Component {
|
||||
@service currentCluster;
|
||||
|
|
@ -20,6 +20,10 @@ export default class SidebarNavClusterComponent extends Component {
|
|||
clientCount: NavSection.CLIENT_COUNT,
|
||||
};
|
||||
|
||||
routeName = {
|
||||
vaultUsage: RouteName.VAULT_USAGE,
|
||||
};
|
||||
|
||||
get cluster() {
|
||||
return this.currentCluster.cluster;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -120,6 +120,7 @@ export default class NavBar extends Helper {
|
|||
|
||||
get supportsLicense() {
|
||||
return (
|
||||
this.version.isEnterprise &&
|
||||
this?.version?.features &&
|
||||
this.isRootNamespace &&
|
||||
this.permissions.hasNavPermission('status', 'license') &&
|
||||
|
|
|
|||
|
|
@ -4,7 +4,14 @@
|
|||
}}
|
||||
|
||||
<Hds::Breadcrumb>
|
||||
<Hds::Breadcrumb::Item @text="Secrets" @route="secrets" @isRouteExternal={{true}} data-test-breadcrumb="Secrets" />
|
||||
<Hds::Breadcrumb::Item
|
||||
@text="Vault"
|
||||
@route="vault"
|
||||
@icon="vault"
|
||||
@isRouteExternal={{true}}
|
||||
data-test-breadcrumb="Secrets"
|
||||
/>
|
||||
<Hds::Breadcrumb::Item @text="Secrets engines" @route="secrets" @isRouteExternal={{true}} data-test-breadcrumb="Secrets" />
|
||||
{{#if this.shouldShowPath}}
|
||||
<Hds::Breadcrumb::Item
|
||||
@text={{this.secretMountPath.currentPath}}
|
||||
|
|
|
|||
|
|
@ -25,7 +25,7 @@ export default class KmipEngine extends Engine {
|
|||
'version',
|
||||
'secret-mount-path',
|
||||
],
|
||||
externalRoutes: ['secrets', 'secretsGeneralSettingsConfiguration'],
|
||||
externalRoutes: ['secrets', 'secretsGeneralSettingsConfiguration', 'vault'],
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@ export default class KubernetesEngine extends Engine {
|
|||
Resolver = Resolver;
|
||||
dependencies = {
|
||||
services: ['app-router', 'secret-mount-path', 'flash-messages', 'api', 'capabilities'],
|
||||
externalRoutes: ['secrets', 'secretsGeneralSettingsConfiguration'],
|
||||
externalRoutes: ['secrets', 'secretsGeneralSettingsConfiguration', 'vault'],
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -45,7 +45,8 @@ export default class KubernetesConfigureRoute extends Route {
|
|||
super.setupController(controller, resolvedModel);
|
||||
const { currentPath } = this.secretMountPath;
|
||||
controller.breadcrumbs = [
|
||||
{ label: 'Secrets', route: 'secrets', linkExternal: true },
|
||||
{ label: 'Vault', route: 'vault', icon: 'vault', linkExternal: true },
|
||||
{ label: 'Secrets engines', route: 'secrets', linkExternal: true },
|
||||
{ label: currentPath, route: 'overview', model: currentPath },
|
||||
{ label: 'Configuration' },
|
||||
];
|
||||
|
|
|
|||
|
|
@ -33,7 +33,8 @@ export default class KubernetesConfigureRoute extends Route {
|
|||
|
||||
const { currentPath } = this.secretMountPath;
|
||||
controller.breadcrumbs = [
|
||||
{ label: 'Secrets', route: 'secrets', linkExternal: true },
|
||||
{ label: 'Vault', route: 'vault', icon: 'vault', linkExternal: true },
|
||||
{ label: 'Secrets engines', route: 'secrets', linkExternal: true },
|
||||
{ label: currentPath, route: 'overview', model: currentPath },
|
||||
{ label: 'Configure' },
|
||||
];
|
||||
|
|
|
|||
|
|
@ -26,7 +26,8 @@ export default class KubernetesErrorRoute extends Route {
|
|||
setupController(controller: RouteController, resolvedModel: KubernetesErrorModel) {
|
||||
super.setupController(controller, resolvedModel);
|
||||
controller.breadcrumbs = [
|
||||
{ label: 'Secrets', route: 'secrets', linkExternal: true },
|
||||
{ label: 'Vault', route: 'vault', icon: 'vault', linkExternal: true },
|
||||
{ label: 'Secrets engines', route: 'secrets', linkExternal: true },
|
||||
{ label: this.secretMountPath.currentPath, route: 'overview' },
|
||||
];
|
||||
const { secretsEngine } = this.modelFor('application') as KubernetesApplicationModel;
|
||||
|
|
|
|||
|
|
@ -44,7 +44,8 @@ export default class KubernetesOverviewRoute extends Route {
|
|||
super.setupController(controller, resolvedModel);
|
||||
|
||||
controller.breadcrumbs = [
|
||||
{ label: 'Secrets', route: 'secrets', linkExternal: true },
|
||||
{ label: 'Vault', route: 'vault', icon: 'vault', linkExternal: true },
|
||||
{ label: 'Secrets engines', route: 'secrets', linkExternal: true },
|
||||
{ label: this.secretMountPath.currentPath },
|
||||
];
|
||||
}
|
||||
|
|
|
|||
|
|
@ -31,6 +31,8 @@ export default class KubernetesRolesCreateRoute extends Route {
|
|||
|
||||
const { currentPath } = this.secretMountPath;
|
||||
controller.breadcrumbs = [
|
||||
{ label: 'Vault', route: 'vault', icon: 'vault', linkExternal: true },
|
||||
{ label: 'Secrets engines', route: 'secrets', linkExternal: true },
|
||||
{ label: currentPath, route: 'overview' },
|
||||
{ label: 'Roles', route: 'roles', model: currentPath },
|
||||
{ label: 'Create' },
|
||||
|
|
|
|||
|
|
@ -69,6 +69,8 @@ export default class KubernetesRolesRoute extends Route {
|
|||
super.setupController(controller, resolvedModel);
|
||||
const { currentPath } = this.secretMountPath;
|
||||
controller.breadcrumbs = [
|
||||
{ label: 'Vault', route: 'vault', icon: 'vault', linkExternal: true },
|
||||
{ label: 'Secrets engines', route: 'secrets', linkExternal: true },
|
||||
{ label: 'Secrets', route: 'secrets', linkExternal: true },
|
||||
{ label: currentPath, route: 'overview', model: currentPath },
|
||||
{ label: 'Roles' },
|
||||
|
|
|
|||
|
|
@ -32,6 +32,8 @@ export default class KubernetesRoleCredentialsRoute extends Route {
|
|||
|
||||
const { currentPath } = this.secretMountPath;
|
||||
controller.breadcrumbs = [
|
||||
{ label: 'Vault', route: 'vault', icon: 'vault', linkExternal: true },
|
||||
{ label: 'Secrets engines', route: 'secrets', linkExternal: true },
|
||||
{ label: currentPath, route: 'overview' },
|
||||
{ label: 'Roles', route: 'roles', model: currentPath },
|
||||
{ label: resolvedModel.roleName, route: 'roles.role.details' },
|
||||
|
|
|
|||
|
|
@ -52,6 +52,8 @@ export default class KubernetesRoleDetailsRoute extends Route {
|
|||
|
||||
const { currentPath } = this.secretMountPath;
|
||||
controller.breadcrumbs = [
|
||||
{ label: 'Vault', route: 'vault', icon: 'vault', linkExternal: true },
|
||||
{ label: 'Secrets engines', route: 'secrets', linkExternal: true },
|
||||
{ label: currentPath, route: 'overview' },
|
||||
{ label: 'Roles', route: 'roles', model: currentPath },
|
||||
{ label: resolvedModel.role.name },
|
||||
|
|
|
|||
|
|
@ -38,6 +38,8 @@ export default class KubernetesRoleEditRoute extends Route {
|
|||
const { name } = this.paramsFor('roles.role');
|
||||
const { currentPath } = this.secretMountPath;
|
||||
controller.breadcrumbs = [
|
||||
{ label: 'Vault', route: 'vault', icon: 'vault', linkExternal: true },
|
||||
{ label: 'Secrets engines', route: 'secrets', linkExternal: true },
|
||||
{ label: currentPath, route: 'overview' },
|
||||
{ label: 'Roles', route: 'roles', model: currentPath },
|
||||
{ label: name as string, route: 'roles.role' },
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@ export default class KvEngine extends Engine {
|
|||
'secret-mount-path',
|
||||
'version',
|
||||
],
|
||||
externalRoutes: ['secrets', 'syncDestination', 'secretsGeneralSettingsConfiguration'],
|
||||
externalRoutes: ['vault', 'secrets', 'syncDestination', 'secretsGeneralSettingsConfiguration'],
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -24,7 +24,8 @@ export default class KvConfigurationRoute extends Route {
|
|||
const backend = this.modelFor('application');
|
||||
controller.backend = backend;
|
||||
controller.breadcrumbs = [
|
||||
{ label: 'Secrets', route: 'secrets', linkExternal: true },
|
||||
{ label: 'Vault', route: 'vault', icon: 'vault', linkExternal: true },
|
||||
{ label: 'Secrets engines', route: 'secrets', linkExternal: true },
|
||||
{ label: backend.id, route: 'list', model: backend.id },
|
||||
{ label: 'Configuration' },
|
||||
];
|
||||
|
|
|
|||
|
|
@ -26,7 +26,8 @@ export default class KvConfigureRoute extends Route {
|
|||
const backend = this.modelFor('application');
|
||||
controller.backend = backend;
|
||||
controller.breadcrumbs = [
|
||||
{ label: 'Secrets', route: 'secrets', linkExternal: true },
|
||||
{ label: 'Vault', route: 'vault', icon: 'vault', linkExternal: true },
|
||||
{ label: 'Secrets engines', route: 'secrets', linkExternal: true },
|
||||
{ label: backend.id, route: 'list', model: backend.id },
|
||||
{ label: 'Configuration', route: 'configuration', model: backend },
|
||||
{ label: 'Edit' },
|
||||
|
|
|
|||
|
|
@ -35,7 +35,8 @@ export default class KvSecretsCreateRoute extends Route {
|
|||
super.setupController(controller, resolvedModel);
|
||||
|
||||
const crumbs = [
|
||||
{ label: 'Secrets', route: 'secrets', linkExternal: true },
|
||||
{ label: 'Vault', route: 'vault', icon: 'vault', linkExternal: true },
|
||||
{ label: 'Secrets engines', route: 'secrets', linkExternal: true },
|
||||
{ label: resolvedModel.backend, route: 'list', model: resolvedModel.backend },
|
||||
...breadcrumbsForSecret(resolvedModel.backend, resolvedModel.path),
|
||||
{ label: 'Create' },
|
||||
|
|
|
|||
|
|
@ -12,7 +12,8 @@ export default class KvErrorRoute extends Route {
|
|||
setupController(controller) {
|
||||
super.setupController(...arguments);
|
||||
controller.breadcrumbs = [
|
||||
{ label: 'Secrets', route: 'secrets', linkExternal: true },
|
||||
{ label: 'Vault', route: 'vault', icon: 'vault', linkExternal: true },
|
||||
{ label: 'Secrets engines', route: 'secrets', linkExternal: true },
|
||||
{ label: this.secretMountPath.currentPath, route: 'list', model: this.secretMountPath.currentPath },
|
||||
];
|
||||
controller.mountName = this.secretMountPath.currentPath;
|
||||
|
|
|
|||
|
|
@ -77,7 +77,10 @@ export default class KvSecretsListRoute extends Route {
|
|||
resolvedModel.failedDirectoryQuery =
|
||||
resolvedModel.secrets === 403 && pathIsDirectory(resolvedModel.pathToSecret);
|
||||
|
||||
let breadcrumbsArray = [{ label: 'Secrets', route: 'secrets', linkExternal: true }];
|
||||
let breadcrumbsArray = [
|
||||
{ label: 'Vault', route: 'vault', icon: 'vault', linkExternal: true },
|
||||
{ label: 'Secrets engines', route: 'secrets', linkExternal: true },
|
||||
];
|
||||
// if on top level don't link the engine breadcrumb label, but if within a directory, do link back to top level.
|
||||
if (this.routeName === 'list') {
|
||||
breadcrumbsArray.push({ label: resolvedModel.backend });
|
||||
|
|
|
|||
|
|
@ -30,7 +30,8 @@ export default class KvSecretDetailsEditRoute extends Route {
|
|||
super.setupController(controller, resolvedModel);
|
||||
|
||||
controller.breadcrumbs = [
|
||||
{ label: 'Secrets', route: 'secrets', linkExternal: true },
|
||||
{ label: 'Vault', route: 'vault', icon: 'vault', linkExternal: true },
|
||||
{ label: 'Secrets engines', route: 'secrets', linkExternal: true },
|
||||
{ label: resolvedModel.backend, route: 'list', model: resolvedModel.backend },
|
||||
...breadcrumbsForSecret(resolvedModel.backend, resolvedModel.path),
|
||||
{ label: 'Edit' },
|
||||
|
|
|
|||
|
|
@ -11,7 +11,8 @@ export default class KvSecretDetailsIndexRoute extends Route {
|
|||
super.setupController(controller, resolvedModel);
|
||||
|
||||
const breadcrumbsArray = [
|
||||
{ label: 'Secrets', route: 'secrets', linkExternal: true },
|
||||
{ label: 'Vault', route: 'vault', icon: 'vault', linkExternal: true },
|
||||
{ label: 'Secrets engines', route: 'secrets', linkExternal: true },
|
||||
{ label: resolvedModel.backend, route: 'list', model: resolvedModel.backend },
|
||||
...breadcrumbsForSecret(resolvedModel.backend, resolvedModel.path, true),
|
||||
];
|
||||
|
|
|
|||
|
|
@ -13,7 +13,8 @@ export default class SecretIndex extends Route {
|
|||
setupController(controller, resolvedModel) {
|
||||
super.setupController(controller, resolvedModel);
|
||||
const breadcrumbsArray = [
|
||||
{ label: 'Secrets', route: 'secrets', linkExternal: true },
|
||||
{ label: 'Vault', route: 'vault', icon: 'vault', linkExternal: true },
|
||||
{ label: 'Secrets engines', route: 'secrets', linkExternal: true },
|
||||
{ label: resolvedModel.backend, route: 'list', model: resolvedModel.backend },
|
||||
...breadcrumbsForSecret(resolvedModel.backend, resolvedModel.path, true),
|
||||
];
|
||||
|
|
|
|||
|
|
@ -12,7 +12,8 @@ export default class KvSecretMetadataDiffRoute extends Route {
|
|||
setupController(controller, resolvedModel) {
|
||||
super.setupController(controller, resolvedModel);
|
||||
const breadcrumbsArray = [
|
||||
{ label: 'Secrets', route: 'secrets', linkExternal: true },
|
||||
{ label: 'Vault', route: 'vault', icon: 'vault', linkExternal: true },
|
||||
{ label: 'Secrets engines', route: 'secrets', linkExternal: true },
|
||||
{ label: resolvedModel.backend, route: 'list', model: resolvedModel.backend },
|
||||
...breadcrumbsForSecret(resolvedModel.backend, resolvedModel.path),
|
||||
{ label: 'Version History', route: 'secret.metadata.versions' },
|
||||
|
|
|
|||
|
|
@ -13,7 +13,8 @@ export default class KvSecretMetadataEditRoute extends Route {
|
|||
setupController(controller, resolvedModel) {
|
||||
super.setupController(controller, resolvedModel);
|
||||
const breadcrumbsArray = [
|
||||
{ label: 'Secrets', route: 'secrets', linkExternal: true },
|
||||
{ label: 'Vault', route: 'vault', icon: 'vault', linkExternal: true },
|
||||
{ label: 'Secrets engines', route: 'secrets', linkExternal: true },
|
||||
{ label: resolvedModel.backend, route: 'list', model: resolvedModel.backend },
|
||||
...breadcrumbsForSecret(resolvedModel.backend, resolvedModel.path),
|
||||
{ label: 'Metadata', route: 'secret.metadata' },
|
||||
|
|
|
|||
|
|
@ -13,7 +13,8 @@ export default class KvSecretMetadataIndexRoute extends Route {
|
|||
setupController(controller, resolvedModel) {
|
||||
super.setupController(controller, resolvedModel);
|
||||
const breadcrumbsArray = [
|
||||
{ label: 'Secrets', route: 'secrets', linkExternal: true },
|
||||
{ label: 'Vault', route: 'vault', icon: 'vault', linkExternal: true },
|
||||
{ label: 'Secrets engines', route: 'secrets', linkExternal: true },
|
||||
{ label: resolvedModel.backend, route: 'list', model: resolvedModel.backend },
|
||||
...breadcrumbsForSecret(resolvedModel.backend, resolvedModel.path),
|
||||
{ label: 'Metadata' },
|
||||
|
|
|
|||
|
|
@ -10,7 +10,8 @@ export default class KvSecretMetadataVersionsRoute extends Route {
|
|||
setupController(controller, resolvedModel) {
|
||||
super.setupController(controller, resolvedModel);
|
||||
const breadcrumbsArray = [
|
||||
{ label: 'Secrets', route: 'secrets', linkExternal: true },
|
||||
{ label: 'Vault', route: 'vault', icon: 'vault', linkExternal: true },
|
||||
{ label: 'Secrets engines', route: 'secrets', linkExternal: true },
|
||||
{ label: resolvedModel.backend, route: 'list', model: resolvedModel.backend },
|
||||
...breadcrumbsForSecret(resolvedModel.backend, resolvedModel.path),
|
||||
{ label: 'Version History' },
|
||||
|
|
|
|||
|
|
@ -13,7 +13,8 @@ export default class SecretPatch extends Route {
|
|||
setupController(controller, resolvedModel) {
|
||||
super.setupController(controller, resolvedModel);
|
||||
const breadcrumbsArray = [
|
||||
{ label: 'Secrets', route: 'secrets', linkExternal: true },
|
||||
{ label: 'Vault', route: 'vault', icon: 'vault', linkExternal: true },
|
||||
{ label: 'Secrets engines', route: 'secrets', linkExternal: true },
|
||||
{ label: resolvedModel.backend, route: 'list', model: resolvedModel.backend },
|
||||
...breadcrumbsForSecret(resolvedModel.backend, resolvedModel.path),
|
||||
{ label: 'Patch' },
|
||||
|
|
|
|||
|
|
@ -11,7 +11,8 @@ export default class KvSecretPathsRoute extends Route {
|
|||
super.setupController(controller, resolvedModel);
|
||||
|
||||
controller.breadcrumbs = [
|
||||
{ label: 'Secrets', route: 'secrets', linkExternal: true },
|
||||
{ label: 'Vault', route: 'vault', icon: 'vault', linkExternal: true },
|
||||
{ label: 'Secrets engines', route: 'secrets', linkExternal: true },
|
||||
{ label: resolvedModel.backend, route: 'list', model: resolvedModel.backend },
|
||||
...breadcrumbsForSecret(resolvedModel.backend, resolvedModel.path),
|
||||
{ label: 'Paths' },
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@ export default class LdapEngine extends Engine {
|
|||
Resolver = Resolver;
|
||||
dependencies = {
|
||||
services: ['app-router', 'secret-mount-path', 'flash-messages', 'auth', 'api', 'capabilities'],
|
||||
externalRoutes: ['secrets', 'secretsGeneralSettingsConfiguration'],
|
||||
externalRoutes: ['secrets', 'secretsGeneralSettingsConfiguration', 'vault'],
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -28,7 +28,8 @@ export default class LdapConfigurationRoute extends Route {
|
|||
super.setupController(controller, resolvedModel, transition);
|
||||
|
||||
controller.breadcrumbs = [
|
||||
{ label: 'Secrets', route: 'secrets', linkExternal: true },
|
||||
{ label: 'Vault', route: 'vault', icon: 'vault', linkExternal: true },
|
||||
{ label: 'Secrets engines', route: 'secrets', linkExternal: true },
|
||||
{ label: resolvedModel.secretsEngine.id, route: 'overview', model: resolvedModel.secretsEngine.id },
|
||||
{ label: 'Configuration' },
|
||||
];
|
||||
|
|
|
|||
|
|
@ -37,7 +37,8 @@ export default class LdapConfigureRoute extends Route {
|
|||
super.setupController(controller, resolvedModel, transition);
|
||||
|
||||
controller.breadcrumbs = [
|
||||
{ label: 'Secrets', route: 'secrets', linkExternal: true },
|
||||
{ label: 'Vault', route: 'vault', icon: 'vault', linkExternal: true },
|
||||
{ label: 'Secrets engines', route: 'secrets', linkExternal: true },
|
||||
{ label: resolvedModel.secretsEngine.id, route: 'overview' },
|
||||
...(resolvedModel.promptConfig ? [] : [{ label: 'Configuration', route: 'configuration' }]),
|
||||
{ label: 'Configure' },
|
||||
|
|
|
|||
|
|
@ -24,7 +24,8 @@ export default class LdapErrorRoute extends Route {
|
|||
setupController(controller: LdapErrorController, resolvedModel: AdapterError, transition: Transition) {
|
||||
super.setupController(controller, resolvedModel, transition);
|
||||
controller.breadcrumbs = [
|
||||
{ label: 'Secrets', route: 'secrets', linkExternal: true },
|
||||
{ label: 'Vault', route: 'vault', icon: 'vault', linkExternal: true },
|
||||
{ label: 'Secrets engines', route: 'secrets', linkExternal: true },
|
||||
{ label: this.secretMountPath.currentPath, route: 'overview' },
|
||||
];
|
||||
controller.backend = this.modelFor('application') as SecretEngineModel;
|
||||
|
|
|
|||
|
|
@ -40,6 +40,8 @@ export default class LdapLibrariesCreateRoute extends Route {
|
|||
super.setupController(controller, resolvedModel, transition);
|
||||
|
||||
controller.breadcrumbs = [
|
||||
{ label: 'Vault', route: 'vault', icon: 'vault', linkExternal: true },
|
||||
{ label: 'Secrets engines', route: 'secrets', linkExternal: true },
|
||||
{ label: this.secretMountPath.currentPath, route: 'overview' },
|
||||
{ label: 'Libraries', route: 'libraries' },
|
||||
{ label: 'Create' },
|
||||
|
|
|
|||
|
|
@ -51,7 +51,8 @@ export default class LdapLibrariesIndexRoute extends LdapLibrariesRoute {
|
|||
super.setupController(controller, resolvedModel, transition);
|
||||
|
||||
controller.breadcrumbs = [
|
||||
{ label: 'Secrets', route: 'secrets', linkExternal: true },
|
||||
{ label: 'Vault', route: 'vault', icon: 'vault', linkExternal: true },
|
||||
{ label: 'Secrets engines', route: 'secrets', linkExternal: true },
|
||||
{ label: resolvedModel.secretsEngine.id, route: 'overview', model: resolvedModel.secretsEngine.id },
|
||||
{ label: 'Libraries' },
|
||||
];
|
||||
|
|
|
|||
|
|
@ -77,7 +77,8 @@ export default class LdapLibraryCheckOutRoute extends Route {
|
|||
return [currentPath, childResource];
|
||||
};
|
||||
controller.breadcrumbs = [
|
||||
{ label: 'Secrets', route: 'secrets', linkExternal: true },
|
||||
{ label: 'Vault', route: 'vault', icon: 'vault', linkExternal: true },
|
||||
{ label: 'Secrets engines', route: 'secrets', linkExternal: true },
|
||||
{ label: currentPath, route: 'overview' },
|
||||
{ label: 'Libraries', route: 'libraries' },
|
||||
...ldapBreadcrumbs(library.completeLibraryName, routeParams, libraryRoutes),
|
||||
|
|
|
|||
|
|
@ -32,7 +32,8 @@ export default class LdapLibraryDetailsRoute extends Route {
|
|||
const routeParams = (childResource: string) => [currentPath, childResource];
|
||||
|
||||
controller.breadcrumbs = [
|
||||
{ label: 'Secrets', route: 'secrets', linkExternal: true },
|
||||
{ label: 'Vault', route: 'vault', icon: 'vault', linkExternal: true },
|
||||
{ label: 'Secrets engines', route: 'secrets', linkExternal: true },
|
||||
{ label: currentPath, route: 'overview' },
|
||||
{ label: 'Libraries', route: 'libraries' },
|
||||
...ldapBreadcrumbs(resolvedModel.library.completeLibraryName, routeParams, libraryRoutes, true),
|
||||
|
|
|
|||
|
|
@ -44,7 +44,8 @@ export default class LdapLibraryEditRoute extends Route {
|
|||
return [currentPath, childResource];
|
||||
};
|
||||
controller.breadcrumbs = [
|
||||
{ label: 'Secrets', route: 'secrets', linkExternal: true },
|
||||
{ label: 'Vault', route: 'vault', icon: 'vault', linkExternal: true },
|
||||
{ label: 'Secrets engines', route: 'secrets', linkExternal: true },
|
||||
{ label: currentPath, route: 'overview' },
|
||||
{ label: 'Libraries', route: 'libraries' },
|
||||
...ldapBreadcrumbs(library.completeLibraryName, routeParams, libraryRoutes),
|
||||
|
|
|
|||
|
|
@ -55,7 +55,8 @@ export default class LdapLibrariesSubdirectoryRoute extends LdapLibrariesRoute {
|
|||
const currentLevelPath = resolvedModel.path_to_library;
|
||||
|
||||
controller.breadcrumbs = [
|
||||
{ label: 'Secrets', route: 'secrets', linkExternal: true },
|
||||
{ label: 'Vault', route: 'vault', icon: 'vault', linkExternal: true },
|
||||
{ label: 'Secrets engines', route: 'secrets', linkExternal: true },
|
||||
{ label: resolvedModel.secretsEngine.id, route: 'overview' },
|
||||
{ label: 'Libraries', route: 'libraries' },
|
||||
...ldapBreadcrumbs(currentLevelPath, routeParams, libraryRoutes, true),
|
||||
|
|
|
|||
|
|
@ -61,7 +61,8 @@ export default class LdapOverviewRoute extends Route {
|
|||
super.setupController(controller, resolvedModel, transition);
|
||||
|
||||
controller.breadcrumbs = [
|
||||
{ label: 'Secrets', route: 'secrets', linkExternal: true },
|
||||
{ label: 'Vault', route: 'vault', icon: 'vault', linkExternal: true },
|
||||
{ label: 'Secrets engines', route: 'secrets', linkExternal: true },
|
||||
{ label: this.secretMountPath.currentPath },
|
||||
];
|
||||
}
|
||||
|
|
|
|||
|
|
@ -34,6 +34,8 @@ export default class LdapRolesCreateRoute extends Route {
|
|||
super.setupController(controller, resolvedModel);
|
||||
|
||||
controller.breadcrumbs = [
|
||||
{ label: 'Vault', route: 'vault', icon: 'vault', linkExternal: true },
|
||||
{ label: 'Secrets engines', route: 'secrets', linkExternal: true },
|
||||
{ label: this.secretMountPath.currentPath, route: 'overview' },
|
||||
{ label: 'Roles', route: 'roles' },
|
||||
{ label: 'Create' },
|
||||
|
|
|
|||
|
|
@ -49,7 +49,8 @@ export default class LdapRolesIndexRoute extends LdapRolesRoute {
|
|||
super.setupController(controller, resolvedModel, transition);
|
||||
|
||||
controller.breadcrumbs = [
|
||||
{ label: 'Secrets', route: 'secrets', linkExternal: true },
|
||||
{ label: 'Vault', route: 'vault', icon: 'vault', linkExternal: true },
|
||||
{ label: 'Secrets engines', route: 'secrets', linkExternal: true },
|
||||
{ label: resolvedModel.secretsEngine.id, route: 'overview' },
|
||||
{ label: 'Roles' },
|
||||
];
|
||||
|
|
|
|||
|
|
@ -67,7 +67,8 @@ export default class LdapRoleCredentialsRoute extends Route {
|
|||
return [currentPath, role.type, childResource];
|
||||
};
|
||||
controller.breadcrumbs = [
|
||||
{ label: 'Secrets', route: 'secrets', linkExternal: true },
|
||||
{ label: 'Vault', route: 'vault', icon: 'vault', linkExternal: true },
|
||||
{ label: 'Secrets engines', route: 'secrets', linkExternal: true },
|
||||
{ label: currentPath, route: 'overview' },
|
||||
{ label: 'Roles', route: 'roles' },
|
||||
...ldapBreadcrumbs(role.name, routeParams, roleRoutes),
|
||||
|
|
|
|||
|
|
@ -33,7 +33,8 @@ export default class LdapRolesRoleDetailsRoute extends Route {
|
|||
};
|
||||
|
||||
controller.breadcrumbs = [
|
||||
{ label: 'Secrets', route: 'secrets', linkExternal: true },
|
||||
{ label: 'Vault', route: 'vault', icon: 'vault', linkExternal: true },
|
||||
{ label: 'Secrets engines', route: 'secrets', linkExternal: true },
|
||||
{ label: this.secretMountPath.currentPath, route: 'overview' },
|
||||
{ label: 'Roles', route: 'roles' },
|
||||
...ldapBreadcrumbs(resolvedModel.role.name, routeParams, roleRoutes, true),
|
||||
|
|
|
|||
|
|
@ -46,7 +46,8 @@ export default class LdapRoleEditRoute extends Route {
|
|||
};
|
||||
|
||||
controller.breadcrumbs = [
|
||||
{ label: 'Secrets', route: 'secrets', linkExternal: true },
|
||||
{ label: 'Vault', route: 'vault', icon: 'vault', linkExternal: true },
|
||||
{ label: 'Secrets engines', route: 'secrets', linkExternal: true },
|
||||
{ label: currentPath, route: 'overview' },
|
||||
{ label: 'Roles', route: 'roles' },
|
||||
...ldapBreadcrumbs(role.name, routeParams, roleRoutes),
|
||||
|
|
|
|||
|
|
@ -67,7 +67,8 @@ export default class LdapRolesSubdirectoryRoute extends LdapRolesRoute {
|
|||
};
|
||||
|
||||
const crumbs = [
|
||||
{ label: 'Secrets', route: 'secrets', linkExternal: true },
|
||||
{ label: 'Vault', route: 'vault', icon: 'vault', linkExternal: true },
|
||||
{ label: 'Secrets engines', route: 'secrets', linkExternal: true },
|
||||
{ label: secretsEngine.id, route: 'overview' },
|
||||
{ label: 'Roles', route: 'roles' },
|
||||
...ldapBreadcrumbs(roleAncestry.path_to_role, routeParams, roleRoutes, true),
|
||||
|
|
|
|||
|
|
@ -34,11 +34,8 @@ export default class PkiPageHeader extends Component<Args> {
|
|||
@tracked engineToDisable = undefined;
|
||||
get breadcrumbs() {
|
||||
return [
|
||||
{
|
||||
label: 'Secrets',
|
||||
route: 'secrets',
|
||||
linkExternal: true,
|
||||
},
|
||||
{ label: 'Vault', route: 'vault', icon: 'vault', linkExternal: true },
|
||||
{ label: 'Secrets engines', route: 'secrets', linkExternal: true },
|
||||
{
|
||||
label: this.args?.backend?.id,
|
||||
},
|
||||
|
|
|
|||
|
|
@ -29,6 +29,7 @@ export default class PkiEngine extends Engine {
|
|||
'version',
|
||||
],
|
||||
externalRoutes: [
|
||||
'vault',
|
||||
'secrets',
|
||||
'secretsListRootConfiguration',
|
||||
'externalMountIssuer',
|
||||
|
|
|
|||
|
|
@ -27,7 +27,8 @@ export default class PkiCertificateDetailsRoute extends Route {
|
|||
setupController(controller, model) {
|
||||
super.setupController(controller, model);
|
||||
controller.breadcrumbs = [
|
||||
{ label: 'Secrets', route: 'secrets', linkExternal: true },
|
||||
{ label: 'Vault', route: 'vault', icon: 'vault', linkExternal: true },
|
||||
{ label: 'Secrets engines', route: 'secrets', linkExternal: true },
|
||||
{ label: this.secretMountPath.currentPath, route: 'overview', model: this.secretMountPath.currentPath },
|
||||
{ label: 'Certificates', route: 'certificates.index', model: this.secretMountPath.currentPath },
|
||||
{ label: model.certificate.serial_number },
|
||||
|
|
|
|||
|
|
@ -12,7 +12,8 @@ export default class PkiConfigurationCreateRoute extends Route {
|
|||
setupController(controller, resolvedModel) {
|
||||
super.setupController(controller, resolvedModel);
|
||||
controller.breadcrumbs = [
|
||||
{ label: 'Secrets', route: 'secrets', linkExternal: true },
|
||||
{ label: 'Vault', route: 'vault', icon: 'vault', linkExternal: true },
|
||||
{ label: 'Secrets engines', route: 'secrets', linkExternal: true },
|
||||
{ label: this.secretMountPath.currentPath, route: 'overview', model: this.secretMountPath.currentPath },
|
||||
{ label: 'Configure' },
|
||||
];
|
||||
|
|
|
|||
|
|
@ -28,7 +28,8 @@ export default class PkiConfigurationEditRoute extends Route {
|
|||
setupController(controller, resolvedModel) {
|
||||
super.setupController(controller, resolvedModel);
|
||||
controller.breadcrumbs = [
|
||||
{ label: 'Secrets', route: 'secrets', linkExternal: true },
|
||||
{ label: 'Vault', route: 'vault', icon: 'vault', linkExternal: true },
|
||||
{ label: 'Secrets engines', route: 'secrets', linkExternal: true },
|
||||
{ label: this.secretMountPath.currentPath, route: 'overview', model: this.secretMountPath.currentPath },
|
||||
{ label: 'Configuration', route: 'configuration.index', model: this.secretMountPath.currentPath },
|
||||
{ label: 'Edit' },
|
||||
|
|
|
|||
|
|
@ -31,7 +31,8 @@ export default class ConfigurationIndexRoute extends Route {
|
|||
|
||||
controller.notConfiguredMessage = PKI_DEFAULT_EMPTY_STATE_MSG;
|
||||
controller.breadcrumbs = [
|
||||
{ label: 'Secrets', route: 'secrets', linkExternal: true },
|
||||
{ label: 'Vault', route: 'vault', icon: 'vault', linkExternal: true },
|
||||
{ label: 'Secrets engines', route: 'secrets', linkExternal: true },
|
||||
{ label: resolvedModel.engine.id, route: 'overview', model: resolvedModel.engine.id },
|
||||
{ label: 'Configuration' },
|
||||
];
|
||||
|
|
|
|||
|
|
@ -12,7 +12,8 @@ export default class PkiIssuersGenerateIntermediateRoute extends Route {
|
|||
setupController(controller, resolvedModel) {
|
||||
super.setupController(controller, resolvedModel);
|
||||
controller.breadcrumbs = [
|
||||
{ label: 'Secrets', route: 'secrets', linkExternal: true },
|
||||
{ label: 'Vault', route: 'vault', icon: 'vault', linkExternal: true },
|
||||
{ label: 'Secrets engines', route: 'secrets', linkExternal: true },
|
||||
{ label: this.secretMountPath.currentPath, route: 'overview', model: this.secretMountPath.currentPath },
|
||||
{ label: 'Issuers', route: 'issuers.index', model: this.secretMountPath.currentPath },
|
||||
{ label: 'Generate CSR' },
|
||||
|
|
|
|||
|
|
@ -12,7 +12,8 @@ export default class PkiIssuersGenerateRootRoute extends Route {
|
|||
setupController(controller, resolvedModel) {
|
||||
super.setupController(controller, resolvedModel);
|
||||
controller.breadcrumbs = [
|
||||
{ label: 'Secrets', route: 'secrets', linkExternal: true },
|
||||
{ label: 'Vault', route: 'vault', icon: 'vault', linkExternal: true },
|
||||
{ label: 'Secrets engines', route: 'secrets', linkExternal: true },
|
||||
{ label: this.secretMountPath.currentPath, route: 'overview', model: this.secretMountPath.currentPath },
|
||||
{ label: 'Generate Root' },
|
||||
];
|
||||
|
|
|
|||
|
|
@ -12,7 +12,8 @@ export default class PkiIssuersImportRoute extends Route {
|
|||
setupController(controller, resolvedModel) {
|
||||
super.setupController(controller, resolvedModel);
|
||||
controller.breadcrumbs = [
|
||||
{ label: 'Secrets', route: 'secrets', linkExternal: true },
|
||||
{ label: 'Vault', route: 'vault', icon: 'vault', linkExternal: true },
|
||||
{ label: 'Secrets engines', route: 'secrets', linkExternal: true },
|
||||
{ label: this.secretMountPath.currentPath, route: 'overview', model: this.secretMountPath.currentPath },
|
||||
{ label: 'Issuers', route: 'issuers.index', model: this.secretMountPath.currentPath },
|
||||
{ label: 'Import' },
|
||||
|
|
|
|||
|
|
@ -58,7 +58,8 @@ export default class PkiIssuersListRoute extends Route {
|
|||
super.setupController(controller, resolvedModel);
|
||||
const { currentPath } = this.secretMountPath;
|
||||
controller.breadcrumbs = [
|
||||
{ label: 'Secrets', route: 'secrets', linkExternal: true },
|
||||
{ label: 'Vault', route: 'vault', icon: 'vault', linkExternal: true },
|
||||
{ label: 'Secrets engines', route: 'secrets', linkExternal: true },
|
||||
{ label: currentPath, route: 'overview', model: currentPath },
|
||||
{ label: 'Issuers', route: 'issuers.index', model: currentPath },
|
||||
];
|
||||
|
|
|
|||
|
|
@ -29,7 +29,8 @@ export default class PkiIssuerIndexRoute extends Route {
|
|||
setupController(controller, resolvedModel) {
|
||||
super.setupController(controller, resolvedModel);
|
||||
controller.breadcrumbs = [
|
||||
{ label: 'Secrets', route: 'secrets', linkExternal: true },
|
||||
{ label: 'Vault', route: 'vault', icon: 'vault', linkExternal: true },
|
||||
{ label: 'Secrets engines', route: 'secrets', linkExternal: true },
|
||||
{ label: this.secretMountPath.currentPath, route: 'overview', model: this.secretMountPath.currentPath },
|
||||
{ label: 'Issuers', route: 'issuers.index', model: this.secretMountPath.currentPath },
|
||||
];
|
||||
|
|
|
|||
|
|
@ -17,7 +17,8 @@ export default class PkiIssuerCrossSignRoute extends Route {
|
|||
super.setupController(controller, resolvedModel);
|
||||
|
||||
controller.breadcrumbs = [
|
||||
{ label: 'Secrets', route: 'secrets', linkExternal: true },
|
||||
{ label: 'Vault', route: 'vault', icon: 'vault', linkExternal: true },
|
||||
{ label: 'Secrets engines', route: 'secrets', linkExternal: true },
|
||||
{ label: this.secretMountPath.currentPath, route: 'overview', model: this.secretMountPath.currentPath },
|
||||
{ label: 'Issuers', route: 'issuers.index', model: this.secretMountPath.currentPath },
|
||||
{
|
||||
|
|
|
|||
|
|
@ -59,7 +59,8 @@ export default class PkiIssuerDetailsRoute extends Route {
|
|||
setupController(controller, resolvedModel) {
|
||||
super.setupController(controller, resolvedModel);
|
||||
controller.breadcrumbs = [
|
||||
{ label: 'Secrets', route: 'secrets', linkExternal: true },
|
||||
{ label: 'Vault', route: 'vault', icon: 'vault', linkExternal: true },
|
||||
{ label: 'Secrets engines', route: 'secrets', linkExternal: true },
|
||||
{ label: this.secretMountPath.currentPath, route: 'overview', model: resolvedModel.backend },
|
||||
{ label: 'Issuers', route: 'issuers.index', model: resolvedModel.backend },
|
||||
{ label: resolvedModel.issuer.id },
|
||||
|
|
|
|||
|
|
@ -23,7 +23,8 @@ export default class PkiIssuerEditRoute extends Route {
|
|||
setupController(controller, resolvedModel) {
|
||||
super.setupController(controller, resolvedModel);
|
||||
controller.breadcrumbs = [
|
||||
{ label: 'Secrets', route: 'secrets', linkExternal: true },
|
||||
{ label: 'Vault', route: 'vault', icon: 'vault', linkExternal: true },
|
||||
{ label: 'Secrets engines', route: 'secrets', linkExternal: true },
|
||||
{ label: this.secretMountPath.currentPath, route: 'overview', model: this.secretMountPath.currentPath },
|
||||
{ label: 'Issuers', route: 'issuers.index', model: this.secretMountPath.currentPath },
|
||||
{
|
||||
|
|
|
|||
|
|
@ -30,7 +30,8 @@ export default class PkiIssuerRotateRootRoute extends Route {
|
|||
setupController(controller, resolvedModel) {
|
||||
super.setupController(controller, resolvedModel);
|
||||
controller.breadcrumbs = [
|
||||
{ label: 'Secrets', route: 'secrets', linkExternal: true },
|
||||
{ label: 'Vault', route: 'vault', icon: 'vault', linkExternal: true },
|
||||
{ label: 'Secrets engines', route: 'secrets', linkExternal: true },
|
||||
{ label: this.secretMountPath.currentPath, route: 'overview', model: resolvedModel.backend },
|
||||
{ label: 'Issuers', route: 'issuers.index', model: resolvedModel.backend },
|
||||
{
|
||||
|
|
|
|||
|
|
@ -20,7 +20,8 @@ export default class PkiIssuerSignRoute extends Route {
|
|||
setupController(controller, resolvedModel) {
|
||||
super.setupController(controller, resolvedModel);
|
||||
controller.breadcrumbs = [
|
||||
{ label: 'Secrets', route: 'secrets', linkExternal: true },
|
||||
{ label: 'Vault', route: 'vault', icon: 'vault', linkExternal: true },
|
||||
{ label: 'Secrets engines', route: 'secrets', linkExternal: true },
|
||||
{ label: this.secretMountPath.currentPath, route: 'overview', model: this.secretMountPath.currentPath },
|
||||
{ label: 'Issuers', route: 'issuers.index', model: this.secretMountPath.currentPath },
|
||||
{
|
||||
|
|
|
|||
|
|
@ -17,7 +17,8 @@ export default class PkiKeysCreateRoute extends Route {
|
|||
setupController(controller, resolvedModel) {
|
||||
super.setupController(controller, resolvedModel);
|
||||
controller.breadcrumbs = [
|
||||
{ label: 'Secrets', route: 'secrets', linkExternal: true },
|
||||
{ label: 'Vault', route: 'vault', icon: 'vault', linkExternal: true },
|
||||
{ label: 'Secrets engines', route: 'secrets', linkExternal: true },
|
||||
{ label: this.secretMountPath.currentPath, route: 'overview', model: this.secretMountPath.currentPath },
|
||||
{ label: 'Keys', route: 'keys.index', model: this.secretMountPath.currentPath },
|
||||
{ label: 'Generate' },
|
||||
|
|
|
|||
|
|
@ -12,7 +12,8 @@ export default class PkiKeysImportRoute extends Route {
|
|||
setupController(controller, resolvedModel) {
|
||||
super.setupController(controller, resolvedModel);
|
||||
controller.breadcrumbs = [
|
||||
{ label: 'Secrets', route: 'secrets', linkExternal: true },
|
||||
{ label: 'Vault', route: 'vault', icon: 'vault', linkExternal: true },
|
||||
{ label: 'Secrets engines', route: 'secrets', linkExternal: true },
|
||||
{ label: this.secretMountPath.currentPath, route: 'overview', model: this.secretMountPath.currentPath },
|
||||
{ label: 'Keys', route: 'keys.index', model: this.secretMountPath.currentPath },
|
||||
{ label: 'Import' },
|
||||
|
|
|
|||
|
|
@ -69,7 +69,8 @@ export default class PkiKeysIndexRoute extends Route {
|
|||
setupController(controller, resolvedModel) {
|
||||
super.setupController(controller, resolvedModel);
|
||||
controller.breadcrumbs = [
|
||||
{ label: 'Secrets', route: 'secrets', linkExternal: true },
|
||||
{ label: 'Vault', route: 'vault', icon: 'vault', linkExternal: true },
|
||||
{ label: 'Secrets engines', route: 'secrets', linkExternal: true },
|
||||
{ label: this.secretMountPath.currentPath, route: 'overview', model: resolvedModel.parentModel.id },
|
||||
{ label: 'Keys', route: 'keys.index', model: resolvedModel.parentModel.id },
|
||||
];
|
||||
|
|
|
|||
|
|
@ -12,7 +12,8 @@ export default class PkiKeyDetailsRoute extends Route {
|
|||
setupController(controller, resolvedModel) {
|
||||
super.setupController(controller, resolvedModel);
|
||||
controller.breadcrumbs = [
|
||||
{ label: 'Secrets', route: 'secrets', linkExternal: true },
|
||||
{ label: 'Vault', route: 'vault', icon: 'vault', linkExternal: true },
|
||||
{ label: 'Secrets engines', route: 'secrets', linkExternal: true },
|
||||
{ label: this.secretMountPath.currentPath, route: 'overview', model: resolvedModel.backend },
|
||||
{ label: 'Keys', route: 'keys.index', model: resolvedModel.backend },
|
||||
{ label: resolvedModel.key.key_id },
|
||||
|
|
|
|||
|
|
@ -18,7 +18,8 @@ export default class PkiKeyEditRoute extends Route {
|
|||
setupController(controller, resolvedModel) {
|
||||
super.setupController(controller, resolvedModel);
|
||||
controller.breadcrumbs = [
|
||||
{ label: 'Secrets', route: 'secrets', linkExternal: true },
|
||||
{ label: 'Vault', route: 'vault', icon: 'vault', linkExternal: true },
|
||||
{ label: 'Secrets engines', route: 'secrets', linkExternal: true },
|
||||
{ label: this.secretMountPath.currentPath, route: 'overview', model: this.secretMountPath.currentPath },
|
||||
{ label: 'Keys', route: 'keys.index', model: this.secretMountPath.currentPath },
|
||||
{ label: resolvedModel.data.key_id },
|
||||
|
|
|
|||
|
|
@ -32,7 +32,8 @@ export default class PkiRolesCreateRoute extends Route {
|
|||
setupController(controller, resolvedModel) {
|
||||
super.setupController(controller, resolvedModel);
|
||||
controller.breadcrumbs = [
|
||||
{ label: 'Secrets', route: 'secrets', linkExternal: true },
|
||||
{ label: 'Vault', route: 'vault', icon: 'vault', linkExternal: true },
|
||||
{ label: 'Secrets engines', route: 'secrets', linkExternal: true },
|
||||
{ label: this.secretMountPath.currentPath, route: 'overview', model: this.secretMountPath.currentPath },
|
||||
{ label: 'Roles', route: 'roles.index', model: this.secretMountPath.currentPath },
|
||||
{ label: 'Create' },
|
||||
|
|
|
|||
|
|
@ -43,7 +43,8 @@ export default class RolesRoleDetailsRoute extends Route {
|
|||
setupController(controller, resolvedModel) {
|
||||
super.setupController(controller, resolvedModel);
|
||||
controller.breadcrumbs = [
|
||||
{ label: 'Secrets', route: 'secrets', linkExternal: true },
|
||||
{ label: 'Vault', route: 'vault', icon: 'vault', linkExternal: true },
|
||||
{ label: 'Secrets engines', route: 'secrets', linkExternal: true },
|
||||
{ label: this.secretMountPath.currentPath, route: 'overview', model: this.secretMountPath.currentPath },
|
||||
{ label: 'Roles', route: 'roles.index', model: this.secretMountPath.currentPath },
|
||||
{ label: resolvedModel.role.name },
|
||||
|
|
|
|||
|
|
@ -39,7 +39,8 @@ export default class PkiRoleEditRoute extends Route {
|
|||
const { form } = resolvedModel;
|
||||
const { name } = form.data;
|
||||
controller.breadcrumbs = [
|
||||
{ label: 'Secrets', route: 'secrets', linkExternal: true },
|
||||
{ label: 'Vault', route: 'vault', icon: 'vault', linkExternal: true },
|
||||
{ label: 'Secrets engines', route: 'secrets', linkExternal: true },
|
||||
{ label: this.secretMountPath.currentPath, route: 'overview', model: this.secretMountPath.currentPath },
|
||||
{ label: 'Roles', route: 'roles.index', model: this.secretMountPath.currentPath },
|
||||
{ label: name, route: 'roles.role.details', models: [this.secretMountPath.currentPath, name] },
|
||||
|
|
|
|||
|
|
@ -22,7 +22,8 @@ export default class PkiRoleGenerateRoute extends Route {
|
|||
super.setupController(controller, resolvedModel);
|
||||
const { role } = this.paramsFor('roles/role');
|
||||
controller.breadcrumbs = [
|
||||
{ label: 'Secrets', route: 'secrets', linkExternal: true },
|
||||
{ label: 'Vault', route: 'vault', icon: 'vault', linkExternal: true },
|
||||
{ label: 'Secrets engines', route: 'secrets', linkExternal: true },
|
||||
{ label: this.secretMountPath.currentPath, route: 'overview', model: this.secretMountPath.currentPath },
|
||||
{ label: 'Roles', route: 'roles.index', model: this.secretMountPath.currentPath },
|
||||
{ label: role, route: 'roles.role.details', models: [this.secretMountPath.currentPath, role] },
|
||||
|
|
|
|||
|
|
@ -22,7 +22,8 @@ export default class PkiRoleSignRoute extends Route {
|
|||
super.setupController(controller, resolvedModel);
|
||||
const { role } = this.paramsFor('roles/role');
|
||||
controller.breadcrumbs = [
|
||||
{ label: 'Secrets', route: 'secrets', linkExternal: true },
|
||||
{ label: 'Vault', route: 'vault', icon: 'vault', linkExternal: true },
|
||||
{ label: 'Secrets engines', route: 'secrets', linkExternal: true },
|
||||
{ label: this.secretMountPath.currentPath, route: 'overview', model: this.secretMountPath.currentPath },
|
||||
{ label: 'Roles', route: 'roles.index', model: this.secretMountPath.currentPath },
|
||||
{ label: role, route: 'roles.role.details', models: [this.secretMountPath.currentPath, role] },
|
||||
|
|
|
|||
|
|
@ -20,7 +20,8 @@ export default class PkiTidyAutoConfigureRoute extends Route {
|
|||
const { currentPath } = this.secretMountPath;
|
||||
super.setupController(controller, resolvedModel);
|
||||
controller.breadcrumbs = [
|
||||
{ label: 'Secrets', route: 'secrets', linkExternal: true },
|
||||
{ label: 'Vault', route: 'vault', icon: 'vault', linkExternal: true },
|
||||
{ label: 'Secrets engines', route: 'secrets', linkExternal: true },
|
||||
{ label: currentPath, route: 'overview', model: currentPath },
|
||||
{ label: 'Configuration', route: 'configuration.index', model: currentPath },
|
||||
{ label: 'Tidy', route: 'tidy', model: currentPath },
|
||||
|
|
|
|||
|
|
@ -15,7 +15,8 @@ export default class TidyAutoIndexRoute extends Route {
|
|||
const { currentPath } = this.secretMountPath;
|
||||
super.setupController(controller, resolvedModel);
|
||||
controller.breadcrumbs = [
|
||||
{ label: 'Secrets', route: 'secrets', linkExternal: true },
|
||||
{ label: 'Vault', route: 'vault', icon: 'vault', linkExternal: true },
|
||||
{ label: 'Secrets engines', route: 'secrets', linkExternal: true },
|
||||
{ label: currentPath, route: 'overview', model: currentPath },
|
||||
{ label: 'Tidy', route: 'tidy.index', model: currentPath },
|
||||
{ label: 'Auto' },
|
||||
|
|
|
|||
|
|
@ -29,7 +29,8 @@ export default class PkiTidyManualRoute extends Route {
|
|||
super.setupController(controller, resolvedModel);
|
||||
const { currentPath } = this.secretMountPath;
|
||||
controller.breadcrumbs = [
|
||||
{ label: 'Secrets', route: 'secrets', linkExternal: true },
|
||||
{ label: 'Vault', route: 'vault', icon: 'vault', linkExternal: true },
|
||||
{ label: 'Secrets engines', route: 'secrets', linkExternal: true },
|
||||
{ label: currentPath, route: 'overview', model: currentPath },
|
||||
{ label: 'Configuration', route: 'configuration.index', model: currentPath },
|
||||
{ label: 'Tidy', route: 'tidy', model: currentPath },
|
||||
|
|
|
|||
|
|
@ -239,7 +239,7 @@ module('Acceptance | pki workflow', function (hooks) {
|
|||
await click(PKI_ROLE_DETAILS.createRoleLink);
|
||||
assert.strictEqual(currentURL(), `/vault/secrets-engines/${this.mountPath}/pki/roles/create`);
|
||||
assert.dom(GENERAL.breadcrumbs).exists({ count: 1 }, 'breadcrumbs are rendered');
|
||||
assert.dom(GENERAL.breadcrumb).exists({ count: 4 }, 'Shows 4 breadcrumbs');
|
||||
assert.dom(GENERAL.breadcrumb).exists({ count: 5 }, 'Shows 5 breadcrumbs');
|
||||
assert.dom(GENERAL.hdsPageHeaderTitle).hasText('Create a PKI Role');
|
||||
|
||||
await fillIn(GENERAL.inputByAttr('name'), roleName);
|
||||
|
|
@ -253,7 +253,7 @@ module('Acceptance | pki workflow', function (hooks) {
|
|||
currentURL(),
|
||||
`/vault/secrets-engines/${this.mountPath}/pki/roles/${roleName}/details`
|
||||
);
|
||||
assert.dom(GENERAL.breadcrumb).exists({ count: 4 }, 'Shows 4 breadcrumbs');
|
||||
assert.dom(GENERAL.breadcrumb).exists({ count: 5 }, 'Shows 5 breadcrumbs');
|
||||
assert.dom(GENERAL.hdsPageHeaderTitle).hasText('PKI Role');
|
||||
assert.dom(GENERAL.hdsPageHeaderSubtitle).hasText(roleName);
|
||||
});
|
||||
|
|
|
|||
|
|
@ -44,7 +44,7 @@ module('Acceptance | secret-engine list view', function (hooks) {
|
|||
await click(GENERAL.cardContainer('aws'));
|
||||
await fillIn(GENERAL.inputByAttr('path'), 'aws_engine');
|
||||
await click(GENERAL.submitButton);
|
||||
await click(GENERAL.breadcrumbLink('Secrets'));
|
||||
await click(GENERAL.breadcrumbLink('Secrets engines'));
|
||||
assert.strictEqual(
|
||||
currentRouteName(),
|
||||
'vault.cluster.secrets.backends',
|
||||
|
|
@ -75,7 +75,7 @@ module('Acceptance | secret-engine list view', function (hooks) {
|
|||
await click(GENERAL.dropdownToggle('Manage'));
|
||||
assert.dom(GENERAL.menuItem('Configure')).exists();
|
||||
|
||||
await click(GENERAL.breadcrumbLink('Secrets'));
|
||||
await click(GENERAL.breadcrumbLink('Secrets engines'));
|
||||
assert.strictEqual(
|
||||
currentRouteName(),
|
||||
'vault.cluster.secrets.backends',
|
||||
|
|
|
|||
|
|
@ -77,7 +77,7 @@ module('Acceptance | Enterprise | keymgmt-configuration-workflow', function (hoo
|
|||
await fillIn(GENERAL.inputByAttr('default_lease_ttl'), 11);
|
||||
await fillIn(GENERAL.selectByAttr('default_lease_ttl'), 'm');
|
||||
await fillIn(GENERAL.textareaByAttr('description'), 'Updated awesome description.');
|
||||
await click(GENERAL.breadcrumbAtIdx(1));
|
||||
await click(GENERAL.breadcrumbAtIdx(2));
|
||||
assert.dom(GENERAL.modal.container('unsaved-changes')).exists('Unsaved changes exists');
|
||||
await click(GENERAL.button('save'));
|
||||
await waitUntil(() => currentRouteName() === 'vault.cluster.secrets.backend.list-root');
|
||||
|
|
@ -96,7 +96,8 @@ module('Acceptance | Enterprise | keymgmt-configuration-workflow', function (hoo
|
|||
await fillIn(GENERAL.inputByAttr('default_lease_ttl'), 12);
|
||||
await fillIn(GENERAL.selectByAttr('default_lease_ttl'), 'm');
|
||||
await fillIn(GENERAL.textareaByAttr('description'), 'Some awesome description.');
|
||||
await click(GENERAL.breadcrumbAtIdx(1));
|
||||
|
||||
await click(GENERAL.breadcrumbAtIdx(2));
|
||||
assert.dom(GENERAL.modal.container('unsaved-changes')).exists('Unsaved changes exists');
|
||||
await click(GENERAL.button('discard'));
|
||||
assert.strictEqual(currentRouteName(), 'vault.cluster.secrets.backend.list-root');
|
||||
|
|
|
|||
|
|
@ -31,13 +31,13 @@ module('Acceptance | kubernetes | credentials', function (hooks) {
|
|||
test('it should have correct breadcrumb links in credentials view', async function (assert) {
|
||||
assert.expect(3);
|
||||
await this.visitRoleCredentials();
|
||||
await click('[data-test-breadcrumbs] li:nth-child(3) a');
|
||||
await click(GENERAL.breadcrumbAtIdx(4));
|
||||
this.validateRoute(assert, 'roles.role.details', 'Transitions to role details route on breadcrumb click');
|
||||
await this.visitRoleCredentials();
|
||||
await click('[data-test-breadcrumbs] li:nth-child(2) a');
|
||||
await click(GENERAL.breadcrumbAtIdx(3));
|
||||
this.validateRoute(assert, 'roles.index', 'Transitions to roles route on breadcrumb click');
|
||||
await this.visitRoleCredentials();
|
||||
await click('[data-test-breadcrumbs] li:nth-child(1) a');
|
||||
await click(GENERAL.breadcrumbAtIdx(2));
|
||||
this.validateRoute(assert, 'overview', 'Transitions to overview route on breadcrumb click');
|
||||
});
|
||||
|
||||
|
|
|
|||
|
|
@ -48,10 +48,10 @@ module('Acceptance | kubernetes | roles', function (hooks) {
|
|||
assert.expect(2);
|
||||
await this.visitRoles();
|
||||
await click('[data-test-list-item-link]');
|
||||
await click('[data-test-breadcrumbs] li:nth-child(2) a');
|
||||
await click(GENERAL.breadcrumbAtIdx(3));
|
||||
this.validateRoute(assert, 'roles.index', 'Transitions to roles route on breadcrumb click');
|
||||
await click('[data-test-list-item-link]');
|
||||
await click('[data-test-breadcrumbs] li:nth-child(1) a');
|
||||
await click(GENERAL.breadcrumbAtIdx(2));
|
||||
this.validateRoute(assert, 'overview', 'Transitions to overview route on breadcrumb click');
|
||||
});
|
||||
|
||||
|
|
@ -70,8 +70,7 @@ module('Acceptance | kubernetes | roles', function (hooks) {
|
|||
`roles.role.${action}`,
|
||||
`Transitions to ${action} route on menu action click`
|
||||
);
|
||||
const selector =
|
||||
action === 'details' ? '[data-test-breadcrumbs] li:nth-child(2) a' : '[data-test-cancel]';
|
||||
const selector = action === 'details' ? GENERAL.breadcrumbAtIdx(3) : GENERAL.cancelButton;
|
||||
await click(selector);
|
||||
}
|
||||
}
|
||||
|
|
@ -87,7 +86,7 @@ module('Acceptance | kubernetes | roles', function (hooks) {
|
|||
await fillIn('[data-test-input="allowed_kubernetes_namespaces"]', '*');
|
||||
await click('[data-test-submit]');
|
||||
this.validateRoute(assert, 'roles.role.details', 'Transitions to details route on save success');
|
||||
await click('[data-test-breadcrumbs] li:nth-child(2) a');
|
||||
await click(GENERAL.breadcrumbAtIdx(3));
|
||||
assert.dom('[data-test-role="new-test-role"]').exists('New role renders in list');
|
||||
});
|
||||
|
||||
|
|
@ -98,7 +97,7 @@ module('Acceptance | kubernetes | roles', function (hooks) {
|
|||
await click(GENERAL.dropdownToggle('Manage'));
|
||||
await click(GENERAL.menuItem('Generate credentials'));
|
||||
this.validateRoute(assert, 'roles.role.credentials', 'Transitions to credentials route');
|
||||
await click(GENERAL.breadcrumbAtIdx(2));
|
||||
await click(GENERAL.breadcrumbAtIdx(4));
|
||||
await click(GENERAL.dropdownToggle('Manage'));
|
||||
await click(GENERAL.menuItem('Edit role'));
|
||||
this.validateRoute(assert, 'roles.role.edit', 'Transitions to edit route');
|
||||
|
|
|
|||
|
|
@ -54,7 +54,7 @@ module('Acceptance | kv-v2 workflow | secret and version create', function (hook
|
|||
assert.dom(`${PAGE.list.item('app/')} [data-test-path]`).hasText('app/', 'expected list item');
|
||||
await click(PAGE.list.createSecret);
|
||||
await fillIn(FORM.inputByAttr('path'), 'psych');
|
||||
await click(PAGE.breadcrumbAtIdx(1));
|
||||
await click(PAGE.breadcrumbAtIdx(2));
|
||||
assert.dom(PAGE.list.item()).exists({ count: 1 }, 'same amount of secrets');
|
||||
assert.dom(`${PAGE.list.item('app/')} [data-test-path]`).hasText('app/', 'expected list item');
|
||||
});
|
||||
|
|
@ -69,7 +69,7 @@ module('Acceptance | kv-v2 workflow | secret and version create', function (hook
|
|||
assert.dom(PAGE.infoRowValue('foo')).exists('secret is previous value');
|
||||
await click(PAGE.detail.createNewVersion);
|
||||
await fillIn(FORM.keyInput(), 'bar');
|
||||
await click(PAGE.breadcrumbAtIdx(3));
|
||||
await click(PAGE.breadcrumbAtIdx(4));
|
||||
await click(PAGE.secretTab('Secret'));
|
||||
assert.dom(PAGE.infoRowValue('foo')).exists('secret is previous value');
|
||||
});
|
||||
|
|
@ -254,7 +254,7 @@ module('Acceptance | kv-v2 workflow | secret and version create', function (hook
|
|||
`/vault/secrets-engines/${backend}/kv/${encodeURIComponent('app/new')}/details?version=1`,
|
||||
'Details url has version param'
|
||||
);
|
||||
await click(PAGE.breadcrumbAtIdx(2));
|
||||
await click(PAGE.breadcrumbAtIdx(3));
|
||||
assert.strictEqual(currentURL(), `/vault/secrets-engines/${backend}/kv/list/app/`, 'sub-dir page');
|
||||
assert.dom(PAGE.list.item('new')).exists('Lists new secret in sub-dir');
|
||||
});
|
||||
|
|
@ -356,7 +356,7 @@ module('Acceptance | kv-v2 workflow | secret and version create', function (hook
|
|||
assert.dom(PAGE.list.item()).doesNotExist('list view still has no items');
|
||||
await click(PAGE.list.createSecret);
|
||||
await fillIn(FORM.inputByAttr('path'), 'psych');
|
||||
await click(PAGE.breadcrumbAtIdx(1));
|
||||
await click(PAGE.breadcrumbAtIdx(2));
|
||||
assert.dom(PAGE.list.item()).doesNotExist('list view still has no items');
|
||||
});
|
||||
test('cancel on new version rolls back model (dr)', async function (assert) {
|
||||
|
|
@ -502,7 +502,7 @@ module('Acceptance | kv-v2 workflow | secret and version create', function (hook
|
|||
assert.dom(`${PAGE.list.item('app/')} [data-test-path]`).hasText('app/', 'expected list item');
|
||||
await click(PAGE.list.createSecret);
|
||||
await fillIn(FORM.inputByAttr('path'), 'psych');
|
||||
await click(PAGE.breadcrumbAtIdx(1));
|
||||
await click(PAGE.breadcrumbAtIdx(2));
|
||||
assert.dom(PAGE.list.item()).exists({ count: 1 }, 'same amount of secrets');
|
||||
assert.dom(`${PAGE.list.item('app/')} [data-test-path]`).hasText('app/', 'expected list item');
|
||||
});
|
||||
|
|
@ -649,7 +649,7 @@ module('Acceptance | kv-v2 workflow | secret and version create', function (hook
|
|||
assert.dom(`${PAGE.list.item('app/')} [data-test-path]`).hasText('app/', 'expected list item');
|
||||
await click(PAGE.list.createSecret);
|
||||
await fillIn(FORM.inputByAttr('path'), 'psych');
|
||||
await click(PAGE.breadcrumbAtIdx(1));
|
||||
await click(PAGE.breadcrumbAtIdx(2));
|
||||
assert.dom(PAGE.list.item()).exists({ count: 1 }, 'same amount of secrets');
|
||||
assert.dom(`${PAGE.list.item('app/')} [data-test-path]`).hasText('app/', 'expected list item');
|
||||
});
|
||||
|
|
@ -842,7 +842,7 @@ module('Acceptance | kv-v2 workflow | secret and version create', function (hook
|
|||
assert.dom(PAGE.list.item()).doesNotExist('list view still has no items');
|
||||
await click(PAGE.list.createSecret);
|
||||
await fillIn(FORM.inputByAttr('path'), 'psych');
|
||||
await click(PAGE.breadcrumbAtIdx(1));
|
||||
await click(PAGE.breadcrumbAtIdx(2));
|
||||
assert.dom(PAGE.list.item()).doesNotExist('list view still has no items');
|
||||
});
|
||||
test('cancel on new version rolls back model (sc)', async function (assert) {
|
||||
|
|
@ -862,7 +862,7 @@ module('Acceptance | kv-v2 workflow | secret and version create', function (hook
|
|||
await click(PAGE.secretTab('Secret'));
|
||||
await click(PAGE.detail.createNewVersion);
|
||||
await fillIn(FORM.keyInput(), 'bar');
|
||||
await click(PAGE.breadcrumbAtIdx(3));
|
||||
await click(PAGE.breadcrumbAtIdx(4));
|
||||
assert.strictEqual(
|
||||
currentURL(),
|
||||
`/vault/secrets-engines/${backend}/kv/${encodeURIComponent('app/first')}`,
|
||||
|
|
@ -1043,7 +1043,7 @@ module('Acceptance | kv-v2 workflow | secret and version create', function (hook
|
|||
`/vault/secrets-engines/${backend}/kv/${encodeURIComponent('app/new')}/details`,
|
||||
'navigates to details'
|
||||
);
|
||||
await click(PAGE.breadcrumbAtIdx(2));
|
||||
await click(PAGE.breadcrumbAtIdx(3));
|
||||
assert.strictEqual(currentURL(), `/vault/secrets-engines/${backend}/kv/list/app/`, 'sub-dir page');
|
||||
assert.dom(PAGE.list.item()).doesNotExist('Does not list any secrets');
|
||||
});
|
||||
|
|
|
|||
|
|
@ -201,8 +201,8 @@ module('Acceptance | kv-v2 workflow | edge cases', function (hooks) {
|
|||
`Sorry, we were unable to find any content at /v1/${backend}/metadata/${root}/${subdirectory}.`
|
||||
);
|
||||
|
||||
assert.dom(GENERAL.breadcrumbAtIdx(0)).hasText('Secrets');
|
||||
assert.dom(GENERAL.breadcrumbAtIdx(1)).hasText(backend);
|
||||
assert.dom(GENERAL.breadcrumbAtIdx(1)).hasText('Secrets engines');
|
||||
assert.dom(GENERAL.breadcrumbAtIdx(2)).hasText(backend);
|
||||
assert.dom(PAGE.secretTab('Secrets')).doesNotHaveClass('is-active');
|
||||
assert.dom(PAGE.secretTab('Configuration')).doesNotHaveClass('is-active');
|
||||
});
|
||||
|
|
|
|||
|
|
@ -144,13 +144,13 @@ module('Acceptance | kv-v2 workflow | navigation', function (hooks) {
|
|||
await click(FORM.saveBtn);
|
||||
assert.dom(PAGE.title).hasText(pathWithSpace, 'title is full path without any encoding/decoding.');
|
||||
assert
|
||||
.dom(PAGE.breadcrumbAtIdx(1))
|
||||
.dom(PAGE.breadcrumbAtIdx(2))
|
||||
.hasText(this.backend, 'breadcrumb before secret path is backend path');
|
||||
assert
|
||||
.dom(PAGE.breadcrumbCurrentAtIdx(2))
|
||||
.dom(PAGE.breadcrumbCurrentAtIdx(3))
|
||||
.hasText('per%centfu ll', 'the current breadcrumb is value of the secret path');
|
||||
|
||||
await click(PAGE.breadcrumbAtIdx(1));
|
||||
await click(PAGE.breadcrumbAtIdx(2));
|
||||
assert
|
||||
.dom(`${PAGE.list.item(pathWithSpace)} [data-test-path]`)
|
||||
.hasText(pathWithSpace, 'the list item is shown correctly');
|
||||
|
|
@ -177,18 +177,19 @@ module('Acceptance | kv-v2 workflow | navigation', function (hooks) {
|
|||
await fillIn(FORM.keyInput(), 'someKey');
|
||||
await fillIn(FORM.maskedValueInput(), 'someValue');
|
||||
await click(FORM.saveBtn);
|
||||
|
||||
assert
|
||||
.dom(PAGE.title)
|
||||
.hasText(
|
||||
nestedPathWithSpace,
|
||||
'title is of the full nested path (directory included) without any encoding/decoding.'
|
||||
);
|
||||
assert.dom(PAGE.breadcrumbAtIdx(2)).hasText('per%');
|
||||
assert.dom(PAGE.breadcrumbAtIdx(3)).hasText('per%');
|
||||
assert
|
||||
.dom(PAGE.breadcrumbCurrentAtIdx(3))
|
||||
.dom(PAGE.breadcrumbCurrentAtIdx(4))
|
||||
.hasText('centfu ll', 'the current breadcrumb is value centfu ll');
|
||||
|
||||
await click(PAGE.breadcrumbAtIdx(1));
|
||||
await click(PAGE.breadcrumbAtIdx(2));
|
||||
assert
|
||||
.dom(`${PAGE.list.item('per%/')} [data-test-path]`)
|
||||
.hasText('per%/', 'the directory item is shown correctly');
|
||||
|
|
@ -216,21 +217,23 @@ module('Acceptance | kv-v2 workflow | navigation', function (hooks) {
|
|||
await fillIn(FORM.keyInput(), 'someKey');
|
||||
await fillIn(FORM.maskedValueInput(), 'someValue');
|
||||
await click(FORM.saveBtn);
|
||||
|
||||
assert
|
||||
.dom(PAGE.title)
|
||||
.hasText(
|
||||
pathDataOctet,
|
||||
'title is of the full nested path (directory included) without any encoding/decoding.'
|
||||
);
|
||||
assert
|
||||
.dom(PAGE.breadcrumbAtIdx(2))
|
||||
.hasText('hello', 'hello is the first directory and shows up as a separate breadcrumb');
|
||||
assert
|
||||
.dom(PAGE.breadcrumbAtIdx(3))
|
||||
.hasText('foo%2fbar', 'foo%2fbar is the second directory and shows up as a separate breadcrumb');
|
||||
assert.dom(PAGE.breadcrumbCurrentAtIdx(4)).hasText('world', 'the current breadcrumb is value world');
|
||||
.hasText('hello', 'hello is the first directory and shows up as a separate breadcrumb');
|
||||
|
||||
await click(PAGE.breadcrumbAtIdx(2));
|
||||
assert
|
||||
.dom(PAGE.breadcrumbAtIdx(4))
|
||||
.hasText('foo%2fbar', 'foo%2fbar is the second directory and shows up as a separate breadcrumb');
|
||||
assert.dom(PAGE.breadcrumbCurrentAtIdx(5)).hasText('world', 'the current breadcrumb is value world');
|
||||
|
||||
await click(PAGE.breadcrumbAtIdx(3));
|
||||
assert
|
||||
.dom(`${PAGE.list.item('foo%2fbar/')} [data-test-path]`)
|
||||
.hasText('foo%2fbar/', 'the directory item is shown correctly');
|
||||
|
|
@ -295,7 +298,7 @@ module('Acceptance | kv-v2 workflow | navigation', function (hooks) {
|
|||
return login(token);
|
||||
});
|
||||
test('empty backend - breadcrumbs, title, tabs, emptyState (a)', async function (assert) {
|
||||
assert.expect(19);
|
||||
assert.expect(21);
|
||||
const backend = this.emptyBackend;
|
||||
await navToBackend(backend);
|
||||
|
||||
|
|
@ -309,12 +312,12 @@ module('Acceptance | kv-v2 workflow | navigation', function (hooks) {
|
|||
assert.dom(GENERAL.dropdownToggle('Manage')).exists('renders manage dropdown');
|
||||
await click(GENERAL.dropdownToggle('Manage'));
|
||||
await click(GENERAL.menuItem('Configure'));
|
||||
assertCorrectBreadcrumbs(assert, ['Secrets', backend, 'Configuration']);
|
||||
assertCorrectBreadcrumbs(assert, ['Vault', 'Secrets engines', backend, 'Configuration']);
|
||||
assert.dom(GENERAL.tabLink('plugin-settings')).hasClass('active');
|
||||
// SECRETS TAB
|
||||
await visit(`/vault/secrets-engines/${backend}/kv/list`);
|
||||
await click(GENERAL.tab('Secrets'));
|
||||
assertCorrectBreadcrumbs(assert, ['Secrets', backend]);
|
||||
assertCorrectBreadcrumbs(assert, ['Vault', 'Secrets engines', backend]);
|
||||
assert.dom(PAGE.title).hasText(backend);
|
||||
assert.dom(GENERAL.tab('Secrets')).hasText('Secrets');
|
||||
assert.dom(GENERAL.tab('Secrets')).hasClass('active');
|
||||
|
|
@ -341,13 +344,13 @@ module('Acceptance | kv-v2 workflow | navigation', function (hooks) {
|
|||
});
|
||||
test('can access nested secret (a)', async function (assert) {
|
||||
// enterprise has "Patch latest version" in the toolbar which adds an assertion
|
||||
const count = this.version.isEnterprise ? 47 : 46;
|
||||
const count = this.version.isEnterprise ? 52 : 51;
|
||||
assert.expect(count);
|
||||
const backend = this.backend;
|
||||
await navToBackend(backend);
|
||||
assert.dom(PAGE.title).hasText(backend, 'title text correct');
|
||||
assert.dom(PAGE.emptyStateTitle).doesNotExist('No empty state');
|
||||
assertCorrectBreadcrumbs(assert, ['Secrets', backend]);
|
||||
assertCorrectBreadcrumbs(assert, ['Vault', 'Secrets engines', backend]);
|
||||
assert.dom(PAGE.list.filter).hasNoValue('List filter input is empty');
|
||||
|
||||
// Navigate through list items
|
||||
|
|
@ -357,7 +360,7 @@ module('Acceptance | kv-v2 workflow | navigation', function (hooks) {
|
|||
`/vault/secrets-engines/${backend}/kv/list/app/`,
|
||||
`navigated to ${currentURL()}`
|
||||
);
|
||||
assertCorrectBreadcrumbs(assert, ['Secrets', backend, 'app']);
|
||||
assertCorrectBreadcrumbs(assert, ['Vault', 'Secrets engines', backend, 'app']);
|
||||
assert.dom(PAGE.title).hasText(backend);
|
||||
assert.dom(PAGE.list.filter).hasValue('app/', 'List filter input is prefilled');
|
||||
assert.dom(PAGE.list.item('nested/')).exists('Shows nested secret');
|
||||
|
|
@ -368,7 +371,7 @@ module('Acceptance | kv-v2 workflow | navigation', function (hooks) {
|
|||
`/vault/secrets-engines/${backend}/kv/list/app/nested/`,
|
||||
`navigated to ${currentURL()}`
|
||||
);
|
||||
assertCorrectBreadcrumbs(assert, ['Secrets', backend, 'app', 'nested']);
|
||||
assertCorrectBreadcrumbs(assert, ['Vault', 'Secrets engines', backend, 'app', 'nested']);
|
||||
assert.dom(PAGE.title).hasText(backend);
|
||||
assert.dom(PAGE.list.filter).hasValue('app/nested/', 'List filter input is prefilled');
|
||||
assert.dom(PAGE.list.item('secret')).exists('Shows deeply nested secret');
|
||||
|
|
@ -379,29 +382,29 @@ module('Acceptance | kv-v2 workflow | navigation', function (hooks) {
|
|||
`/vault/secrets-engines/${backend}/kv/app%2Fnested%2Fsecret`,
|
||||
`navigated to ${currentURL()}`
|
||||
);
|
||||
assertCorrectBreadcrumbs(assert, ['Secrets', backend, 'app', 'nested', 'secret']);
|
||||
assertCorrectBreadcrumbs(assert, ['Vault', 'Secrets engines', backend, 'app', 'nested', 'secret']);
|
||||
assert.dom(PAGE.title).hasText('app/nested/secret', 'title is full secret path');
|
||||
|
||||
await click(PAGE.secretTab('Secret'));
|
||||
assertCorrectBreadcrumbs(assert, ['Secrets', backend, 'app', 'nested', 'secret']);
|
||||
assertCorrectBreadcrumbs(assert, ['Vault', 'Secrets engines', backend, 'app', 'nested', 'secret']);
|
||||
const expectedToolbar = this.version.isEnterprise
|
||||
? [...DETAIL_TOOLBARS, 'patchLatest']
|
||||
: DETAIL_TOOLBARS;
|
||||
assertDetailsToolbar(assert, expectedToolbar);
|
||||
|
||||
await click(PAGE.breadcrumbAtIdx(3));
|
||||
await click(PAGE.breadcrumbAtIdx(4));
|
||||
assert.true(
|
||||
currentURL().startsWith(`/vault/secrets-engines/${backend}/kv/list/app/nested/`),
|
||||
'links back to list directory'
|
||||
);
|
||||
|
||||
await click(PAGE.breadcrumbAtIdx(2));
|
||||
await click(PAGE.breadcrumbAtIdx(3));
|
||||
assert.true(
|
||||
currentURL().startsWith(`/vault/secrets-engines/${backend}/kv/list/app/`),
|
||||
'links back to list directory'
|
||||
);
|
||||
|
||||
await click(PAGE.breadcrumbAtIdx(1));
|
||||
await click(PAGE.breadcrumbAtIdx(2));
|
||||
assert.true(
|
||||
currentURL().startsWith(`/vault/secrets-engines/${backend}/kv/list`),
|
||||
'links back to list root'
|
||||
|
|
@ -527,7 +530,7 @@ module('Acceptance | kv-v2 workflow | navigation', function (hooks) {
|
|||
);
|
||||
});
|
||||
test('breadcrumbs, tabs & page titles are correct (a)', async function (assert) {
|
||||
assert.expect(123);
|
||||
assert.expect(130);
|
||||
// only need to assert hrefs one test, no need for this function to be global
|
||||
const assertTabHrefs = (assert, page) => {
|
||||
ALL_TABS.forEach((tab) => {
|
||||
|
|
@ -558,7 +561,7 @@ module('Acceptance | kv-v2 workflow | navigation', function (hooks) {
|
|||
'vault.cluster.secrets.backend.kv.secret.index',
|
||||
'navs to overview'
|
||||
);
|
||||
assertCorrectBreadcrumbs(assert, ['Secrets', backend, secretPath]);
|
||||
assertCorrectBreadcrumbs(assert, ['Vault', 'Secrets engines', backend, secretPath]);
|
||||
assertDetailTabs(assert, 'Overview');
|
||||
assertTabHrefs(assert, 'Overview');
|
||||
assert.dom(PAGE.title).hasText(secretPath, 'correct page title for secret overview');
|
||||
|
|
@ -570,7 +573,7 @@ module('Acceptance | kv-v2 workflow | navigation', function (hooks) {
|
|||
'vault.cluster.secrets.backend.kv.secret.details.index',
|
||||
'navs to details'
|
||||
);
|
||||
assertCorrectBreadcrumbs(assert, ['Secrets', backend, secretPath]);
|
||||
assertCorrectBreadcrumbs(assert, ['Vault', 'Secrets engines', backend, secretPath]);
|
||||
assertDetailTabs(assert, 'Secret');
|
||||
assertTabHrefs(assert, 'Secret');
|
||||
assert.dom(PAGE.title).hasText(secretPath, 'correct page title for secret detail');
|
||||
|
|
@ -581,18 +584,18 @@ module('Acceptance | kv-v2 workflow | navigation', function (hooks) {
|
|||
'vault.cluster.secrets.backend.kv.secret.details.edit',
|
||||
'navs to create'
|
||||
);
|
||||
assertCorrectBreadcrumbs(assert, ['Secrets', backend, secretPath, 'Edit']);
|
||||
assertCorrectBreadcrumbs(assert, ['Vault', 'Secrets engines', backend, secretPath, 'Edit']);
|
||||
assert.dom(PAGE.title).hasText('Create New Version', 'correct page title for secret edit');
|
||||
|
||||
// metadata tab
|
||||
await click(PAGE.breadcrumbAtIdx(2));
|
||||
await click(PAGE.breadcrumbAtIdx(3));
|
||||
await click(PAGE.secretTab('Metadata'));
|
||||
assert.strictEqual(
|
||||
currentRouteName(),
|
||||
'vault.cluster.secrets.backend.kv.secret.metadata.index',
|
||||
'navs to metadata'
|
||||
);
|
||||
assertCorrectBreadcrumbs(assert, ['Secrets', backend, secretPath, 'Metadata']);
|
||||
assertCorrectBreadcrumbs(assert, ['Vault', 'Secrets engines', backend, secretPath, 'Metadata']);
|
||||
assertDetailTabs(assert, 'Metadata');
|
||||
assertTabHrefs(assert, 'Metadata');
|
||||
assert.dom(PAGE.title).hasText(secretPath, 'correct page title for metadata');
|
||||
|
|
@ -603,18 +606,18 @@ module('Acceptance | kv-v2 workflow | navigation', function (hooks) {
|
|||
'vault.cluster.secrets.backend.kv.secret.metadata.edit',
|
||||
'navs to metadata.edit'
|
||||
);
|
||||
assertCorrectBreadcrumbs(assert, ['Secrets', backend, secretPath, 'Metadata', 'Edit']);
|
||||
assertCorrectBreadcrumbs(assert, ['Vault', 'Secrets engines', backend, secretPath, 'Metadata', 'Edit']);
|
||||
assert.dom(PAGE.title).hasText('Edit Secret Metadata', 'correct page title for metadata edit');
|
||||
|
||||
// paths tab
|
||||
await click(PAGE.breadcrumbAtIdx(3));
|
||||
await click(PAGE.breadcrumbAtIdx(4));
|
||||
await click(PAGE.secretTab('Paths'));
|
||||
assert.strictEqual(
|
||||
currentRouteName(),
|
||||
'vault.cluster.secrets.backend.kv.secret.paths',
|
||||
'navs to paths'
|
||||
);
|
||||
assertCorrectBreadcrumbs(assert, ['Secrets', backend, secretPath, 'Paths']);
|
||||
assertCorrectBreadcrumbs(assert, ['Vault', 'Secrets engines', backend, secretPath, 'Paths']);
|
||||
assertDetailTabs(assert, 'Paths');
|
||||
assertTabHrefs(assert, 'Paths');
|
||||
assert.dom(PAGE.title).hasText(secretPath, 'correct page title for paths');
|
||||
|
|
@ -626,7 +629,7 @@ module('Acceptance | kv-v2 workflow | navigation', function (hooks) {
|
|||
'vault.cluster.secrets.backend.kv.secret.metadata.versions',
|
||||
'navs to version history'
|
||||
);
|
||||
assertCorrectBreadcrumbs(assert, ['Secrets', backend, secretPath, 'Version History']);
|
||||
assertCorrectBreadcrumbs(assert, ['Vault', 'Secrets engines', backend, secretPath, 'Version History']);
|
||||
assertDetailTabs(assert, 'Version History');
|
||||
assertTabHrefs(assert, 'Version History');
|
||||
assert.dom(PAGE.title).hasText(secretPath, 'correct page title for version history');
|
||||
|
|
@ -672,7 +675,7 @@ module('Acceptance | kv-v2 workflow | navigation', function (hooks) {
|
|||
assert.dom(GENERAL.menuItem('Configure')).exists('renders configure option');
|
||||
|
||||
// Breadcrumbs correct
|
||||
assertCorrectBreadcrumbs(assert, ['Secrets', backend]);
|
||||
assertCorrectBreadcrumbs(assert, ['Vault', 'Secrets engines', backend]);
|
||||
// Title correct
|
||||
assert.dom(PAGE.title).hasText(backend);
|
||||
// Tabs correct
|
||||
|
|
@ -714,12 +717,12 @@ module('Acceptance | kv-v2 workflow | navigation', function (hooks) {
|
|||
);
|
||||
});
|
||||
test('can access nested secret (dr)', async function (assert) {
|
||||
assert.expect(23);
|
||||
assert.expect(25);
|
||||
const backend = this.backend;
|
||||
await navToBackend(backend);
|
||||
assert.dom(PAGE.title).hasText(backend, 'title text correct');
|
||||
assert.dom(PAGE.emptyStateTitle).doesNotExist('No empty state');
|
||||
assertCorrectBreadcrumbs(assert, ['Secrets', backend]);
|
||||
assertCorrectBreadcrumbs(assert, ['Vault', 'Secrets engines', backend]);
|
||||
assert
|
||||
.dom(PAGE.list.filter)
|
||||
.doesNotExist('List filter input does not render because no list capabilities');
|
||||
|
|
@ -733,30 +736,30 @@ module('Acceptance | kv-v2 workflow | navigation', function (hooks) {
|
|||
`navigated to secret overview ${currentURL()}`
|
||||
);
|
||||
await click(PAGE.secretTab('Secret'));
|
||||
assertCorrectBreadcrumbs(assert, ['Secrets', backend, 'app', 'nested', 'secret']);
|
||||
assertCorrectBreadcrumbs(assert, ['Vault', 'Secrets engines', backend, 'app', 'nested', 'secret']);
|
||||
assert.dom(PAGE.title).hasText('app/nested/secret', 'title is full secret path');
|
||||
assertDetailsToolbar(assert, ['copy']);
|
||||
|
||||
await click(PAGE.breadcrumbAtIdx(3));
|
||||
await click(PAGE.breadcrumbAtIdx(4));
|
||||
assert.true(
|
||||
currentURL().startsWith(`/vault/secrets-engines/${backend}/kv/list/app/nested/`),
|
||||
'links back to list directory'
|
||||
);
|
||||
|
||||
await click(PAGE.breadcrumbAtIdx(2));
|
||||
await click(PAGE.breadcrumbAtIdx(3));
|
||||
assert.true(
|
||||
currentURL().startsWith(`/vault/secrets-engines/${backend}/kv/list/app/`),
|
||||
'links back to list directory'
|
||||
);
|
||||
|
||||
await click(PAGE.breadcrumbAtIdx(1));
|
||||
await click(PAGE.breadcrumbAtIdx(2));
|
||||
assert.true(
|
||||
currentURL().startsWith(`/vault/secrets-engines/${backend}/kv/list`),
|
||||
'links back to list root'
|
||||
);
|
||||
});
|
||||
test('versioned secret nav, tabs, breadcrumbs (dr)', async function (assert) {
|
||||
assert.expect(32);
|
||||
assert.expect(33);
|
||||
const backend = this.backend;
|
||||
await navToBackend(backend);
|
||||
|
||||
|
|
@ -796,7 +799,7 @@ module('Acceptance | kv-v2 workflow | navigation', function (hooks) {
|
|||
`/vault/secrets-engines/${backend}/kv/${secretPathUrlEncoded}/metadata`,
|
||||
`goes to metadata page`
|
||||
);
|
||||
assertCorrectBreadcrumbs(assert, ['Secrets', backend, secretPath, 'Metadata']);
|
||||
assertCorrectBreadcrumbs(assert, ['Vault', 'Secrets engines', backend, secretPath, 'Metadata']);
|
||||
assert.dom(PAGE.title).hasText(secretPath);
|
||||
assert.dom(PAGE.toolbarAction).doesNotExist('no toolbar actions available on metadata');
|
||||
assert
|
||||
|
|
@ -812,34 +815,50 @@ module('Acceptance | kv-v2 workflow | navigation', function (hooks) {
|
|||
assert.dom(PAGE.metadata.editBtn).doesNotExist('edit button hidden');
|
||||
});
|
||||
test('breadcrumbs & page titles are correct (dr)', async function (assert) {
|
||||
assert.expect(36);
|
||||
assert.expect(41);
|
||||
const backend = this.backend;
|
||||
await navToBackend(backend);
|
||||
assert.dom(GENERAL.dropdownToggle('Manage')).exists('renders manage dropdown');
|
||||
await click(GENERAL.dropdownToggle('Manage'));
|
||||
await click(GENERAL.menuItem('Configure'));
|
||||
assertCorrectBreadcrumbs(assert, ['Secrets', backend, 'Configuration']);
|
||||
assertCorrectBreadcrumbs(assert, ['Vault', 'Secrets engines', backend, 'Configuration']);
|
||||
assert.dom(PAGE.title).hasText(`${backend} configuration`, 'title correct on config page');
|
||||
|
||||
await visit(`/vault/secrets-engines/${backend}/kv/list`);
|
||||
assertCorrectBreadcrumbs(assert, ['Secrets', backend]);
|
||||
assertCorrectBreadcrumbs(assert, ['Vault', 'Secrets engines', backend]);
|
||||
assert.dom(PAGE.title).hasText(backend, 'title correct on secrets list');
|
||||
|
||||
await typeIn(PAGE.list.overviewInput, 'app/nested/secret');
|
||||
await click(GENERAL.submitButton);
|
||||
assertCorrectBreadcrumbs(assert, ['Secrets', backend, 'app', 'nested', 'secret']);
|
||||
assertCorrectBreadcrumbs(assert, ['Vault', 'Secrets engines', backend, 'app', 'nested', 'secret']);
|
||||
assert.dom(PAGE.title).hasText('app/nested/secret', 'title correct on secret detail');
|
||||
|
||||
assert.dom(PAGE.detail.createNewVersion).doesNotExist('cannot create new version');
|
||||
|
||||
await click(PAGE.secretTab('Metadata'));
|
||||
assertCorrectBreadcrumbs(assert, ['Secrets', backend, 'app', 'nested', 'secret', 'Metadata']);
|
||||
assertCorrectBreadcrumbs(assert, [
|
||||
'Vault',
|
||||
'Secrets engines',
|
||||
backend,
|
||||
'app',
|
||||
'nested',
|
||||
'secret',
|
||||
'Metadata',
|
||||
]);
|
||||
assert.dom(PAGE.title).hasText('app/nested/secret', 'title correct on metadata');
|
||||
|
||||
assert.dom(PAGE.metadata.editBtn).doesNotExist('cannot edit metadata');
|
||||
|
||||
await click(PAGE.secretTab('Paths'));
|
||||
assertCorrectBreadcrumbs(assert, ['Secrets', backend, 'app', 'nested', 'secret', 'Paths']);
|
||||
assertCorrectBreadcrumbs(assert, [
|
||||
'Vault',
|
||||
'Secrets engines',
|
||||
backend,
|
||||
'app',
|
||||
'nested',
|
||||
'secret',
|
||||
'Paths',
|
||||
]);
|
||||
assert.dom(PAGE.title).hasText('app/nested/secret', 'correct page title for paths');
|
||||
|
||||
assert.dom(PAGE.secretTab('Version History')).doesNotExist('Version History tab not shown');
|
||||
|
|
@ -860,7 +879,7 @@ module('Acceptance | kv-v2 workflow | navigation', function (hooks) {
|
|||
return login(token);
|
||||
});
|
||||
test('empty backend - breadcrumbs, title, tabs, emptyState (dlr)', async function (assert) {
|
||||
assert.expect(15);
|
||||
assert.expect(16);
|
||||
const backend = this.emptyBackend;
|
||||
await navToBackend(backend);
|
||||
|
||||
|
|
@ -871,7 +890,7 @@ module('Acceptance | kv-v2 workflow | navigation', function (hooks) {
|
|||
'lands on secrets list page'
|
||||
);
|
||||
// Breadcrumbs correct
|
||||
assertCorrectBreadcrumbs(assert, ['Secrets', backend]);
|
||||
assertCorrectBreadcrumbs(assert, ['Vault', 'Secrets engines', backend]);
|
||||
// Title correct
|
||||
assert.dom(PAGE.title).hasText(backend);
|
||||
// Tabs correct
|
||||
|
|
@ -903,12 +922,12 @@ module('Acceptance | kv-v2 workflow | navigation', function (hooks) {
|
|||
);
|
||||
});
|
||||
test('can access nested secret (dlr)', async function (assert) {
|
||||
assert.expect(32);
|
||||
assert.expect(35);
|
||||
const backend = this.backend;
|
||||
await navToBackend(backend);
|
||||
assert.dom(PAGE.title).hasText(backend, 'title text correct');
|
||||
assert.dom(PAGE.emptyStateTitle).doesNotExist('No empty state');
|
||||
assertCorrectBreadcrumbs(assert, ['Secrets', backend]);
|
||||
assertCorrectBreadcrumbs(assert, ['Vault', 'Secrets engines', backend]);
|
||||
assert.dom(PAGE.list.filter).hasNoValue('List filter input is empty');
|
||||
|
||||
// Navigate through list items
|
||||
|
|
@ -918,7 +937,7 @@ module('Acceptance | kv-v2 workflow | navigation', function (hooks) {
|
|||
`/vault/secrets-engines/${backend}/kv/list/app/`,
|
||||
`navigated to ${currentURL()}`
|
||||
);
|
||||
assertCorrectBreadcrumbs(assert, ['Secrets', backend, 'app']);
|
||||
assertCorrectBreadcrumbs(assert, ['Vault', 'Secrets engines', backend, 'app']);
|
||||
assert.dom(PAGE.title).hasText(backend);
|
||||
assert.dom(PAGE.list.filter).doesNotExist('List filter hidden since no nested list access');
|
||||
|
||||
|
|
@ -939,30 +958,30 @@ module('Acceptance | kv-v2 workflow | navigation', function (hooks) {
|
|||
`/vault/secrets-engines/${backend}/kv/app%2Fnested%2Fsecret/details?version=1`,
|
||||
`navigated to ${currentURL()}`
|
||||
);
|
||||
assertCorrectBreadcrumbs(assert, ['Secrets', backend, 'app', 'nested', 'secret']);
|
||||
assertCorrectBreadcrumbs(assert, ['Vault', 'Secrets engines', backend, 'app', 'nested', 'secret']);
|
||||
assert.dom(PAGE.title).hasText('app/nested/secret', 'title is full secret path');
|
||||
assertDetailsToolbar(assert, ['delete', 'copy']);
|
||||
|
||||
await click(PAGE.breadcrumbAtIdx(3));
|
||||
await click(PAGE.breadcrumbAtIdx(4));
|
||||
assert.true(
|
||||
currentURL().startsWith(`/vault/secrets-engines/${backend}/kv/list/app/nested/`),
|
||||
'links back to list directory'
|
||||
);
|
||||
|
||||
await click(PAGE.breadcrumbAtIdx(2));
|
||||
await click(PAGE.breadcrumbAtIdx(3));
|
||||
assert.true(
|
||||
currentURL().startsWith(`/vault/secrets-engines/${backend}/kv/list/app/`),
|
||||
'links back to list directory'
|
||||
);
|
||||
|
||||
await click(PAGE.breadcrumbAtIdx(1));
|
||||
await click(PAGE.breadcrumbAtIdx(2));
|
||||
assert.true(
|
||||
currentURL().startsWith(`/vault/secrets-engines/${backend}/kv/list`),
|
||||
'links back to list root'
|
||||
);
|
||||
});
|
||||
test('versioned secret nav, tabs, breadcrumbs (dlr)', async function (assert) {
|
||||
assert.expect(32);
|
||||
assert.expect(33);
|
||||
const backend = this.backend;
|
||||
await navToBackend(backend);
|
||||
await click(PAGE.list.item(secretPath));
|
||||
|
|
@ -1000,7 +1019,7 @@ module('Acceptance | kv-v2 workflow | navigation', function (hooks) {
|
|||
`/vault/secrets-engines/${backend}/kv/${secretPathUrlEncoded}/metadata`,
|
||||
`goes to metadata page`
|
||||
);
|
||||
assertCorrectBreadcrumbs(assert, ['Secrets', backend, secretPath, 'Metadata']);
|
||||
assertCorrectBreadcrumbs(assert, ['Vault', 'Secrets engines', backend, secretPath, 'Metadata']);
|
||||
assert.dom(PAGE.title).hasText(secretPath);
|
||||
assert
|
||||
.dom(`${PAGE.metadata.customMetadataSection} ${PAGE.emptyStateTitle}`)
|
||||
|
|
@ -1015,35 +1034,35 @@ module('Acceptance | kv-v2 workflow | navigation', function (hooks) {
|
|||
assert.dom(PAGE.metadata.editBtn).doesNotExist('edit button hidden');
|
||||
});
|
||||
test('breadcrumbs & page titles are correct (dlr)', async function (assert) {
|
||||
assert.expect(30);
|
||||
assert.expect(35);
|
||||
const backend = this.backend;
|
||||
await navToBackend(backend);
|
||||
|
||||
assert.dom(GENERAL.dropdownToggle('Manage')).exists('renders manage dropdown');
|
||||
await click(GENERAL.dropdownToggle('Manage'));
|
||||
await click(GENERAL.menuItem('Configure'));
|
||||
assertCorrectBreadcrumbs(assert, ['Secrets', backend, 'Configuration']);
|
||||
assertCorrectBreadcrumbs(assert, ['Vault', 'Secrets engines', backend, 'Configuration']);
|
||||
assert.dom(PAGE.title).hasText(`${backend} configuration`, 'correct page title for configuration');
|
||||
|
||||
await visit(`/vault/secrets-engines/${backend}/kv/list`);
|
||||
await click(GENERAL.tab('Secrets'));
|
||||
assertCorrectBreadcrumbs(assert, ['Secrets', backend]);
|
||||
assertCorrectBreadcrumbs(assert, ['Vault', 'Secrets engines', backend]);
|
||||
assert.dom(PAGE.title).hasText(backend, 'correct page title for secret list');
|
||||
|
||||
await click(PAGE.list.item(secretPath));
|
||||
assertCorrectBreadcrumbs(assert, ['Secrets', backend, secretPath]);
|
||||
assertCorrectBreadcrumbs(assert, ['Vault', 'Secrets engines', backend, secretPath]);
|
||||
assert.dom(PAGE.title).hasText(secretPath, 'correct page title for secret detail');
|
||||
|
||||
assert.dom(PAGE.detail.createNewVersion).doesNotExist('cannot create new version');
|
||||
|
||||
await click(PAGE.secretTab('Metadata'));
|
||||
assertCorrectBreadcrumbs(assert, ['Secrets', backend, secretPath, 'Metadata']);
|
||||
assertCorrectBreadcrumbs(assert, ['Vault', 'Secrets engines', backend, secretPath, 'Metadata']);
|
||||
assert.dom(PAGE.title).hasText(secretPath, 'correct page title for metadata');
|
||||
|
||||
assert.dom(PAGE.metadata.editBtn).doesNotExist('cannot edit metadata');
|
||||
|
||||
await click(PAGE.secretTab('Paths'));
|
||||
assertCorrectBreadcrumbs(assert, ['Secrets', backend, secretPath, 'Paths']);
|
||||
assertCorrectBreadcrumbs(assert, ['Vault', 'Secrets engines', backend, secretPath, 'Paths']);
|
||||
assert.dom(PAGE.title).hasText(secretPath, 'correct page title for paths');
|
||||
|
||||
assert.dom(PAGE.secretTab('Version History')).doesNotExist('Version History tab not shown');
|
||||
|
|
@ -1063,7 +1082,7 @@ module('Acceptance | kv-v2 workflow | navigation', function (hooks) {
|
|||
return login(token);
|
||||
});
|
||||
test('empty backend - breadcrumbs, title, tabs, emptyState (mm)', async function (assert) {
|
||||
assert.expect(15);
|
||||
assert.expect(16);
|
||||
const backend = this.emptyBackend;
|
||||
await navToBackend(backend);
|
||||
// URL correct
|
||||
|
|
@ -1073,7 +1092,7 @@ module('Acceptance | kv-v2 workflow | navigation', function (hooks) {
|
|||
'lands on secrets list page'
|
||||
);
|
||||
// Breadcrumbs correct
|
||||
assertCorrectBreadcrumbs(assert, ['Secrets', backend]);
|
||||
assertCorrectBreadcrumbs(assert, ['Vault', 'Secrets engines', backend]);
|
||||
// Title correct
|
||||
assert.dom(PAGE.title).hasText(backend);
|
||||
// Tabs correct
|
||||
|
|
@ -1105,12 +1124,12 @@ module('Acceptance | kv-v2 workflow | navigation', function (hooks) {
|
|||
);
|
||||
});
|
||||
test('can access nested secret (mm)', async function (assert) {
|
||||
assert.expect(42);
|
||||
assert.expect(46);
|
||||
const backend = this.backend;
|
||||
await navToBackend(backend);
|
||||
assert.dom(PAGE.title).hasText(backend, 'title text correct');
|
||||
assert.dom(PAGE.emptyStateTitle).doesNotExist('No empty state');
|
||||
assertCorrectBreadcrumbs(assert, ['Secrets', backend]);
|
||||
assertCorrectBreadcrumbs(assert, ['Vault', 'Secrets engines', backend]);
|
||||
assert.dom(PAGE.list.filter).hasNoValue('List filter input is empty');
|
||||
|
||||
// Navigate through list items
|
||||
|
|
@ -1120,7 +1139,7 @@ module('Acceptance | kv-v2 workflow | navigation', function (hooks) {
|
|||
`/vault/secrets-engines/${backend}/kv/list/app/`,
|
||||
`navigated to ${currentURL()}`
|
||||
);
|
||||
assertCorrectBreadcrumbs(assert, ['Secrets', backend, 'app']);
|
||||
assertCorrectBreadcrumbs(assert, ['Vault', 'Secrets engines', backend, 'app']);
|
||||
assert.dom(PAGE.title).hasText(backend);
|
||||
assert.dom(PAGE.list.filter).hasValue('app/', 'List filter input is prefilled');
|
||||
assert.dom(PAGE.list.item('nested/')).exists('Shows nested secret');
|
||||
|
|
@ -1131,7 +1150,7 @@ module('Acceptance | kv-v2 workflow | navigation', function (hooks) {
|
|||
`/vault/secrets-engines/${backend}/kv/list/app/nested/`,
|
||||
`navigated to ${currentURL()}`
|
||||
);
|
||||
assertCorrectBreadcrumbs(assert, ['Secrets', backend, 'app', 'nested']);
|
||||
assertCorrectBreadcrumbs(assert, ['Vault', 'Secrets engines', backend, 'app', 'nested']);
|
||||
assert.dom(PAGE.title).hasText(backend);
|
||||
assert.dom(PAGE.list.filter).hasValue('app/nested/', 'List filter input is prefilled');
|
||||
assert.dom(PAGE.list.item('secret')).exists('Shows deeply nested secret');
|
||||
|
|
@ -1148,31 +1167,31 @@ module('Acceptance | kv-v2 workflow | navigation', function (hooks) {
|
|||
`/vault/secrets-engines/${backend}/kv/app%2Fnested%2Fsecret/details`,
|
||||
`Goes to URL without version`
|
||||
);
|
||||
assertCorrectBreadcrumbs(assert, ['Secrets', backend, 'app', 'nested', 'secret']);
|
||||
assertCorrectBreadcrumbs(assert, ['Vault', 'Secrets engines', backend, 'app', 'nested', 'secret']);
|
||||
assert.dom(PAGE.title).hasText('app/nested/secret', 'title is full secret path');
|
||||
assertDetailsToolbar(assert, ['delete', 'destroy', 'versionDropdown']);
|
||||
assert.dom(PAGE.detail.versionDropdown).hasText('Version 1', 'Shows version timestamp');
|
||||
|
||||
await click(PAGE.breadcrumbAtIdx(3));
|
||||
await click(PAGE.breadcrumbAtIdx(4));
|
||||
assert.true(
|
||||
currentURL().startsWith(`/vault/secrets-engines/${backend}/kv/list/app/nested/`),
|
||||
'links back to list directory'
|
||||
);
|
||||
|
||||
await click(PAGE.breadcrumbAtIdx(2));
|
||||
await click(PAGE.breadcrumbAtIdx(3));
|
||||
assert.true(
|
||||
currentURL().startsWith(`/vault/secrets-engines/${backend}/kv/list/app/`),
|
||||
'links back to list directory'
|
||||
);
|
||||
|
||||
await click(PAGE.breadcrumbAtIdx(1));
|
||||
await click(PAGE.breadcrumbAtIdx(2));
|
||||
assert.true(
|
||||
currentURL().startsWith(`/vault/secrets-engines/${backend}/kv/list`),
|
||||
'links back to list root'
|
||||
);
|
||||
});
|
||||
test('versioned secret nav, tabs, breadcrumbs (mm)', async function (assert) {
|
||||
assert.expect(40);
|
||||
assert.expect(42);
|
||||
const backend = this.backend;
|
||||
await navToBackend(backend);
|
||||
await click(PAGE.list.item(secretPath));
|
||||
|
|
@ -1221,7 +1240,7 @@ module('Acceptance | kv-v2 workflow | navigation', function (hooks) {
|
|||
`/vault/secrets-engines/${backend}/kv/${secretPathUrlEncoded}/metadata`,
|
||||
`goes to metadata page`
|
||||
);
|
||||
assertCorrectBreadcrumbs(assert, ['Secrets', backend, secretPath, 'Metadata']);
|
||||
assertCorrectBreadcrumbs(assert, ['Vault', 'Secrets engines', backend, secretPath, 'Metadata']);
|
||||
assert.dom(PAGE.title).hasText(secretPath);
|
||||
assert
|
||||
.dom(`${PAGE.metadata.customMetadataSection} ${PAGE.emptyStateTitle}`)
|
||||
|
|
@ -1237,7 +1256,7 @@ module('Acceptance | kv-v2 workflow | navigation', function (hooks) {
|
|||
`/vault/secrets-engines/${backend}/kv/${secretPathUrlEncoded}/metadata/edit`,
|
||||
`goes to metadata edit page`
|
||||
);
|
||||
assertCorrectBreadcrumbs(assert, ['Secrets', backend, secretPath, 'Metadata', 'Edit']);
|
||||
assertCorrectBreadcrumbs(assert, ['Vault', 'Secrets engines', backend, secretPath, 'Metadata', 'Edit']);
|
||||
await click(FORM.cancelBtn);
|
||||
assert.strictEqual(
|
||||
currentURL(),
|
||||
|
|
@ -1246,39 +1265,39 @@ module('Acceptance | kv-v2 workflow | navigation', function (hooks) {
|
|||
);
|
||||
});
|
||||
test('breadcrumbs & page titles are correct (mm)', async function (assert) {
|
||||
assert.expect(40);
|
||||
assert.expect(47);
|
||||
const backend = this.backend;
|
||||
await navToBackend(backend);
|
||||
assert.dom(GENERAL.dropdownToggle('Manage')).exists('renders manage dropdown');
|
||||
await click(GENERAL.dropdownToggle('Manage'));
|
||||
await click(GENERAL.menuItem('Configure'));
|
||||
assertCorrectBreadcrumbs(assert, ['Secrets', backend, 'Configuration']);
|
||||
assertCorrectBreadcrumbs(assert, ['Vault', 'Secrets engines', backend, 'Configuration']);
|
||||
assert.dom(PAGE.title).hasText(`${backend} configuration`, 'correct page title for configuration');
|
||||
|
||||
await visit(`/vault/secrets-engines/${backend}/kv/list`);
|
||||
await click(GENERAL.tab('Secrets'));
|
||||
assertCorrectBreadcrumbs(assert, ['Secrets', backend]);
|
||||
assertCorrectBreadcrumbs(assert, ['Vault', 'Secrets engines', backend]);
|
||||
assert.dom(PAGE.title).hasText(backend, 'correct page title for secret list');
|
||||
|
||||
await click(PAGE.list.item(secretPath));
|
||||
assertCorrectBreadcrumbs(assert, ['Secrets', backend, secretPath]);
|
||||
assertCorrectBreadcrumbs(assert, ['Vault', 'Secrets engines', backend, secretPath]);
|
||||
assert.dom(PAGE.title).hasText(secretPath, 'correct page title for secret detail');
|
||||
|
||||
await click(PAGE.secretTab('Metadata'));
|
||||
assertCorrectBreadcrumbs(assert, ['Secrets', backend, secretPath, 'Metadata']);
|
||||
assertCorrectBreadcrumbs(assert, ['Vault', 'Secrets engines', backend, secretPath, 'Metadata']);
|
||||
assert.dom(PAGE.title).hasText(secretPath, 'correct page title for metadata');
|
||||
|
||||
await click(PAGE.metadata.editBtn);
|
||||
assertCorrectBreadcrumbs(assert, ['Secrets', backend, secretPath, 'Metadata', 'Edit']);
|
||||
assertCorrectBreadcrumbs(assert, ['Vault', 'Secrets engines', backend, secretPath, 'Metadata', 'Edit']);
|
||||
assert.dom(PAGE.title).hasText('Edit Secret Metadata', 'correct page title for metadata edit');
|
||||
|
||||
await click(PAGE.breadcrumbAtIdx(3));
|
||||
await click(PAGE.breadcrumbAtIdx(4));
|
||||
await click(PAGE.secretTab('Paths'));
|
||||
assertCorrectBreadcrumbs(assert, ['Secrets', backend, secretPath, 'Paths']);
|
||||
assertCorrectBreadcrumbs(assert, ['Vault', 'Secrets engines', backend, secretPath, 'Paths']);
|
||||
assert.dom(PAGE.title).hasText(secretPath, 'correct page title for paths');
|
||||
|
||||
await click(PAGE.secretTab('Version History'));
|
||||
assertCorrectBreadcrumbs(assert, ['Secrets', backend, secretPath, 'Version History']);
|
||||
assertCorrectBreadcrumbs(assert, ['Vault', 'Secrets engines', backend, secretPath, 'Version History']);
|
||||
assert.dom(PAGE.title).hasText(secretPath, 'correct page title for version history');
|
||||
});
|
||||
patchRedirectTest(test, 'mm');
|
||||
|
|
@ -1296,7 +1315,7 @@ module('Acceptance | kv-v2 workflow | navigation', function (hooks) {
|
|||
return login(token);
|
||||
});
|
||||
test('empty backend - breadcrumbs, title, tabs, emptyState (sc)', async function (assert) {
|
||||
assert.expect(15);
|
||||
assert.expect(16);
|
||||
const backend = this.emptyBackend;
|
||||
await navToBackend(backend);
|
||||
|
||||
|
|
@ -1307,7 +1326,7 @@ module('Acceptance | kv-v2 workflow | navigation', function (hooks) {
|
|||
'lands on secrets list page'
|
||||
);
|
||||
// Breadcrumbs correct
|
||||
assertCorrectBreadcrumbs(assert, ['Secrets', backend]);
|
||||
assertCorrectBreadcrumbs(assert, ['Vault', 'Secrets engines', backend]);
|
||||
// Title correct
|
||||
assert.dom(PAGE.title).hasText(backend);
|
||||
// Tabs correct
|
||||
|
|
@ -1341,12 +1360,12 @@ module('Acceptance | kv-v2 workflow | navigation', function (hooks) {
|
|||
);
|
||||
});
|
||||
test('can access nested secret (sc)', async function (assert) {
|
||||
assert.expect(24);
|
||||
assert.expect(26);
|
||||
const backend = this.backend;
|
||||
await navToBackend(backend);
|
||||
assert.dom(PAGE.title).hasText(backend, 'title text correct');
|
||||
assert.dom(PAGE.emptyStateTitle).doesNotExist('No empty state');
|
||||
assertCorrectBreadcrumbs(assert, ['Secrets', backend]);
|
||||
assertCorrectBreadcrumbs(assert, ['Vault', 'Secrets engines', backend]);
|
||||
assert.dom(PAGE.list.filter).doesNotExist('List filter input is not rendered');
|
||||
|
||||
// Navigate to secret
|
||||
|
|
@ -1364,30 +1383,30 @@ module('Acceptance | kv-v2 workflow | navigation', function (hooks) {
|
|||
`/vault/secrets-engines/${backend}/kv/app%2Fnested%2Fsecret/details`,
|
||||
'goes to secret detail page'
|
||||
);
|
||||
assertCorrectBreadcrumbs(assert, ['Secrets', backend, 'app', 'nested', 'secret']);
|
||||
assertCorrectBreadcrumbs(assert, ['Vault', 'Secrets engines', backend, 'app', 'nested', 'secret']);
|
||||
assert.dom(PAGE.title).hasText('app/nested/secret', 'title is full secret path');
|
||||
assertDetailsToolbar(assert, ['createNewVersion']);
|
||||
|
||||
await click(PAGE.breadcrumbAtIdx(3));
|
||||
await click(PAGE.breadcrumbAtIdx(4));
|
||||
assert.true(
|
||||
currentURL().startsWith(`/vault/secrets-engines/${backend}/kv/list/app/nested/`),
|
||||
'links back to list directory'
|
||||
);
|
||||
|
||||
await click(PAGE.breadcrumbAtIdx(2));
|
||||
await click(PAGE.breadcrumbAtIdx(3));
|
||||
assert.true(
|
||||
currentURL().startsWith(`/vault/secrets-engines/${backend}/kv/list/app/`),
|
||||
'links back to list directory'
|
||||
);
|
||||
|
||||
await click(PAGE.breadcrumbAtIdx(1));
|
||||
await click(PAGE.breadcrumbAtIdx(2));
|
||||
assert.true(
|
||||
currentURL().startsWith(`/vault/secrets-engines/${backend}/kv/list`),
|
||||
'links back to list root'
|
||||
);
|
||||
});
|
||||
test('versioned secret nav, tabs, breadcrumbs (sc)', async function (assert) {
|
||||
assert.expect(39);
|
||||
assert.expect(40);
|
||||
const backend = this.backend;
|
||||
await navToBackend(backend);
|
||||
|
||||
|
|
@ -1459,7 +1478,7 @@ module('Acceptance | kv-v2 workflow | navigation', function (hooks) {
|
|||
`/vault/secrets-engines/${backend}/kv/${secretPathUrlEncoded}/metadata`,
|
||||
`goes to metadata page`
|
||||
);
|
||||
assertCorrectBreadcrumbs(assert, ['Secrets', backend, secretPath, 'Metadata']);
|
||||
assertCorrectBreadcrumbs(assert, ['Vault', 'Secrets engines', backend, secretPath, 'Metadata']);
|
||||
assert.dom(PAGE.title).hasText(secretPath);
|
||||
assert
|
||||
.dom(`${PAGE.metadata.customMetadataSection} ${PAGE.emptyStateTitle}`)
|
||||
|
|
@ -1467,43 +1486,43 @@ module('Acceptance | kv-v2 workflow | navigation', function (hooks) {
|
|||
assert.dom(PAGE.metadata.editBtn).doesNotExist('edit metadata button does not render');
|
||||
});
|
||||
test('breadcrumbs & page titles are correct (sc)', async function (assert) {
|
||||
assert.expect(40);
|
||||
assert.expect(47);
|
||||
const backend = this.backend;
|
||||
await navToBackend(backend);
|
||||
assert.dom(GENERAL.dropdownToggle('Manage')).exists('renders manage dropdown');
|
||||
await click(GENERAL.dropdownToggle('Manage'));
|
||||
await click(GENERAL.menuItem('Configure'));
|
||||
assertCorrectBreadcrumbs(assert, ['Secrets', backend, 'Configuration']);
|
||||
assertCorrectBreadcrumbs(assert, ['Vault', 'Secrets engines', backend, 'Configuration']);
|
||||
assert.dom(PAGE.title).hasText(`${backend} configuration`, 'correct page title for configuration');
|
||||
|
||||
await visit(`/vault/secrets-engines/${backend}/kv/list`);
|
||||
await click(GENERAL.tab('Secrets'));
|
||||
assertCorrectBreadcrumbs(assert, ['Secrets', backend]);
|
||||
assertCorrectBreadcrumbs(assert, ['Vault', 'Secrets engines', backend]);
|
||||
assert.dom(PAGE.title).hasText(backend, 'correct page title for secret list');
|
||||
|
||||
await typeIn(PAGE.list.overviewInput, secretPath);
|
||||
await click(GENERAL.submitButton);
|
||||
assertCorrectBreadcrumbs(assert, ['Secrets', backend, secretPath]);
|
||||
assertCorrectBreadcrumbs(assert, ['Vault', 'Secrets engines', backend, secretPath]);
|
||||
assert.dom(PAGE.title).hasText(secretPath, 'correct page title for secret detail');
|
||||
|
||||
await click(PAGE.secretTab('Secret'));
|
||||
assertCorrectBreadcrumbs(assert, ['Secrets', backend, secretPath]);
|
||||
assertCorrectBreadcrumbs(assert, ['Vault', 'Secrets engines', backend, secretPath]);
|
||||
assert.dom(PAGE.title).hasText(secretPath, 'correct page title for secret detail');
|
||||
|
||||
await click(PAGE.detail.createNewVersion);
|
||||
assertCorrectBreadcrumbs(assert, ['Secrets', backend, secretPath, 'Edit']);
|
||||
assertCorrectBreadcrumbs(assert, ['Vault', 'Secrets engines', backend, secretPath, 'Edit']);
|
||||
assert.dom(PAGE.title).hasText('Create New Version', 'correct page title for secret edit');
|
||||
|
||||
await click(PAGE.breadcrumbAtIdx(2));
|
||||
await click(PAGE.breadcrumbAtIdx(3));
|
||||
await click(PAGE.secretTab('Metadata'));
|
||||
assertCorrectBreadcrumbs(assert, ['Secrets', backend, secretPath, 'Metadata']);
|
||||
assertCorrectBreadcrumbs(assert, ['Vault', 'Secrets engines', backend, secretPath, 'Metadata']);
|
||||
assert.dom(PAGE.title).hasText(secretPath, 'correct page title for metadata');
|
||||
|
||||
assert.dom(PAGE.metadata.editBtn).doesNotExist('cannot edit metadata');
|
||||
|
||||
await click(PAGE.breadcrumbAtIdx(2));
|
||||
await click(PAGE.breadcrumbAtIdx(3));
|
||||
await click(PAGE.secretTab('Paths'));
|
||||
assertCorrectBreadcrumbs(assert, ['Secrets', backend, secretPath, 'Paths']);
|
||||
assertCorrectBreadcrumbs(assert, ['Vault', 'Secrets engines', backend, secretPath, 'Paths']);
|
||||
assert.dom(PAGE.title).hasText(secretPath, 'correct page title for paths');
|
||||
|
||||
assert.dom(PAGE.secretTab('Version History')).doesNotExist('Version History tab not shown');
|
||||
|
|
@ -1542,12 +1561,12 @@ path "${this.backend}/subkeys/*" {
|
|||
return login(userToken);
|
||||
});
|
||||
test('can access nested secret (cg)', async function (assert) {
|
||||
assert.expect(44);
|
||||
assert.expect(48);
|
||||
const backend = this.backend;
|
||||
await navToBackend(backend);
|
||||
assert.dom(PAGE.title).hasText(backend, 'title text correct');
|
||||
assert.dom(PAGE.emptyStateTitle).doesNotExist('No empty state');
|
||||
assertCorrectBreadcrumbs(assert, ['Secrets', backend]);
|
||||
assertCorrectBreadcrumbs(assert, ['Vault', 'Secrets engines', backend]);
|
||||
assert.dom(PAGE.list.filter).hasNoValue('List filter input is empty');
|
||||
|
||||
// Navigate through list items
|
||||
|
|
@ -1557,7 +1576,7 @@ path "${this.backend}/subkeys/*" {
|
|||
`/vault/secrets-engines/${backend}/kv/list/app/`,
|
||||
`navigated to ${currentURL()}`
|
||||
);
|
||||
assertCorrectBreadcrumbs(assert, ['Secrets', backend, 'app']);
|
||||
assertCorrectBreadcrumbs(assert, ['Vault', 'Secrets engines', backend, 'app']);
|
||||
assert.dom(PAGE.title).hasText(backend);
|
||||
assert.dom(PAGE.list.filter).hasValue('app/', 'List filter input is prefilled');
|
||||
assert.dom(PAGE.list.item('nested/')).exists('Shows nested secret');
|
||||
|
|
@ -1568,7 +1587,7 @@ path "${this.backend}/subkeys/*" {
|
|||
`/vault/secrets-engines/${backend}/kv/list/app/nested/`,
|
||||
`navigated to ${currentURL()}`
|
||||
);
|
||||
assertCorrectBreadcrumbs(assert, ['Secrets', backend, 'app', 'nested']);
|
||||
assertCorrectBreadcrumbs(assert, ['Vault', 'Secrets engines', backend, 'app', 'nested']);
|
||||
assert.dom(PAGE.title).hasText(backend);
|
||||
assert.dom(PAGE.list.filter).hasValue('app/nested/', 'List filter input is prefilled');
|
||||
assert.dom(PAGE.list.item('secret')).exists('Shows deeply nested secret');
|
||||
|
|
@ -1604,42 +1623,42 @@ path "${this.backend}/subkeys/*" {
|
|||
`/vault/secrets-engines/${backend}/kv/app%2Fnested%2Fsecret/details?version=1`,
|
||||
'goes to secret details'
|
||||
);
|
||||
assertCorrectBreadcrumbs(assert, ['Secrets', backend, 'app', 'nested', 'secret']);
|
||||
assertCorrectBreadcrumbs(assert, ['Vault', 'Secrets engines', backend, 'app', 'nested', 'secret']);
|
||||
assert.dom(PAGE.title).hasText('app/nested/secret', 'title is full secret path');
|
||||
assertDetailsToolbar(assert, ['delete', 'copy', 'createNewVersion', 'patchLatest']);
|
||||
|
||||
await click(PAGE.breadcrumbAtIdx(3));
|
||||
await click(PAGE.breadcrumbAtIdx(4));
|
||||
assert.true(
|
||||
currentURL().startsWith(`/vault/secrets-engines/${backend}/kv/list/app/nested/`),
|
||||
'links back to list directory'
|
||||
);
|
||||
|
||||
await click(PAGE.breadcrumbAtIdx(2));
|
||||
await click(PAGE.breadcrumbAtIdx(3));
|
||||
assert.true(
|
||||
currentURL().startsWith(`/vault/secrets-engines/${backend}/kv/list/app/`),
|
||||
'links back to list directory'
|
||||
);
|
||||
|
||||
await click(PAGE.breadcrumbAtIdx(1));
|
||||
await click(PAGE.breadcrumbAtIdx(2));
|
||||
assert.true(
|
||||
currentURL().startsWith(`/vault/secrets-engines/${backend}/kv/list`),
|
||||
'links back to list root'
|
||||
);
|
||||
});
|
||||
test('breadcrumbs & page titles are correct (cg)', async function (assert) {
|
||||
assert.expect(43);
|
||||
assert.expect(50);
|
||||
const backend = this.backend;
|
||||
await navToBackend(backend);
|
||||
assert.dom(GENERAL.dropdownToggle('Manage')).exists('renders manage dropdown');
|
||||
await click(GENERAL.dropdownToggle('Manage'));
|
||||
await click(GENERAL.menuItem('Configure'));
|
||||
|
||||
assertCorrectBreadcrumbs(assert, ['Secrets', backend, 'Configuration']);
|
||||
assertCorrectBreadcrumbs(assert, ['Vault', 'Secrets engines', backend, 'Configuration']);
|
||||
assert.dom(PAGE.title).hasText(`${backend} configuration`, 'correct page title for configuration');
|
||||
|
||||
await visit(`/vault/secrets-engines/${backend}/kv/list`);
|
||||
await click(GENERAL.tab('Secrets'));
|
||||
assertCorrectBreadcrumbs(assert, ['Secrets', backend]);
|
||||
assertCorrectBreadcrumbs(assert, ['Vault', 'Secrets engines', backend]);
|
||||
assert.dom(PAGE.title).hasText(backend, 'correct page title for secret list');
|
||||
|
||||
await visit(`/vault/secrets-engines/${backend}/kv/${secretPathUrlEncoded}/details`);
|
||||
|
|
@ -1666,25 +1685,25 @@ path "${this.backend}/subkeys/*" {
|
|||
`/vault/secrets-engines/${backend}/kv/${secretPathUrlEncoded}`,
|
||||
'Goes to overview'
|
||||
);
|
||||
assertCorrectBreadcrumbs(assert, ['Secrets', backend, secretPath]);
|
||||
assertCorrectBreadcrumbs(assert, ['Vault', 'Secrets engines', backend, secretPath]);
|
||||
assert.dom(PAGE.title).hasText(secretPath, 'correct page title for secret overview');
|
||||
|
||||
await click(PAGE.secretTab('Metadata'));
|
||||
assertCorrectBreadcrumbs(assert, ['Secrets', backend, secretPath, 'Metadata']);
|
||||
assertCorrectBreadcrumbs(assert, ['Vault', 'Secrets engines', backend, secretPath, 'Metadata']);
|
||||
assert.dom(PAGE.title).hasText(secretPath, 'correct page title for metadata');
|
||||
assert.dom(PAGE.metadata.editBtn).doesNotExist('cannot edit metadata');
|
||||
|
||||
await click(PAGE.secretTab('Paths'));
|
||||
assertCorrectBreadcrumbs(assert, ['Secrets', backend, secretPath, 'Paths']);
|
||||
assertCorrectBreadcrumbs(assert, ['Vault', 'Secrets engines', backend, secretPath, 'Paths']);
|
||||
assert.dom(PAGE.title).hasText(secretPath, 'correct page title for paths');
|
||||
|
||||
assert.dom(PAGE.secretTab('Version History')).doesNotExist('Version History tab not shown');
|
||||
|
||||
await click(PAGE.secretTab('Secret'));
|
||||
assertCorrectBreadcrumbs(assert, ['Secrets', backend, secretPath]);
|
||||
assertCorrectBreadcrumbs(assert, ['Vault', 'Secrets engines', backend, secretPath]);
|
||||
assert.dom(PAGE.title).hasText(secretPath, 'correct page title for secret details');
|
||||
await click(PAGE.detail.createNewVersion);
|
||||
assertCorrectBreadcrumbs(assert, ['Secrets', backend, secretPath, 'Edit']);
|
||||
assertCorrectBreadcrumbs(assert, ['Vault', 'Secrets engines', backend, secretPath, 'Edit']);
|
||||
assert.dom(PAGE.title).hasText('Create New Version', 'correct page title for secret edit');
|
||||
});
|
||||
test('can request custom_metadata from data endpoint (cg)', async function (assert) {
|
||||
|
|
@ -1808,7 +1827,7 @@ path "${this.backend}/subkeys/*" {
|
|||
'vault.cluster.secrets.backend.kv.secret.patch',
|
||||
'navs to patch'
|
||||
);
|
||||
assertCorrectBreadcrumbs(assert, ['Secrets', this.backend, secretPath, 'Patch']);
|
||||
assertCorrectBreadcrumbs(assert, ['Vault', 'Secrets engines', this.backend, secretPath, 'Patch']);
|
||||
assert.dom(PAGE.title).hasText('Patch Secret to New Version');
|
||||
await click(FORM.cancelBtn);
|
||||
assert.strictEqual(
|
||||
|
|
|
|||
|
|
@ -194,4 +194,5 @@ export const GENERAL = {
|
|||
licenseBanner: (name: string) => `[data-test-license-banner="${name}"]`,
|
||||
tooltip: (label: string) => `[data-test-tooltip="${label}"]`,
|
||||
tooltipText: '.hds-tooltip-container',
|
||||
textDisplay: (attr: string) => `[data-test-text-display="${attr}"]`,
|
||||
};
|
||||
|
|
|
|||
|
|
@ -271,15 +271,27 @@ module('Integration | Component | clients/page-header', function (hooks) {
|
|||
|
||||
test('it renders billing period text', async function (assert) {
|
||||
await this.renderComponent();
|
||||
|
||||
assert
|
||||
.dom(this.element)
|
||||
.hasTextContaining('Client Usage For billing period:', 'it renders billing related text');
|
||||
.dom(GENERAL.hdsPageHeaderTitle)
|
||||
.hasTextContaining('Client usage', 'it renders page header title');
|
||||
assert.dom(GENERAL.breadcrumbs).hasTextContaining('Vault Client usage', 'it renders breadcrumbs');
|
||||
assert
|
||||
.dom(GENERAL.textDisplay('change-billing-data'))
|
||||
.hasTextContaining('Change billing period', 'it renders change billing period text');
|
||||
});
|
||||
|
||||
test('it renders data period text for HVD managed clusters', async function (assert) {
|
||||
this.owner.lookup('service:flags').featureFlags = ['VAULT_CLOUD_ADMIN_NAMESPACE'];
|
||||
await this.renderComponent();
|
||||
assert.dom(this.element).hasTextContaining('Client Usage For data period:');
|
||||
|
||||
assert
|
||||
.dom(GENERAL.hdsPageHeaderTitle)
|
||||
.hasTextContaining('Client usage', 'it renders page header title');
|
||||
assert.dom(GENERAL.breadcrumbs).hasTextContaining('Vault Client usage', 'it renders breadcrumbs');
|
||||
assert
|
||||
.dom(GENERAL.textDisplay('change-billing-data'))
|
||||
.hasTextContaining('Change data period', 'it renders change data period text');
|
||||
});
|
||||
|
||||
test('it allows date editing if no billing start time is provided', async function (assert) {
|
||||
|
|
|
|||
|
|
@ -26,8 +26,6 @@ module('Integration | Component | sidebar-nav-access', function (hooks) {
|
|||
rules: {
|
||||
// This is an issue with Hds::AppHeader::HomeLink
|
||||
'aria-prohibited-attr': { enabled: false },
|
||||
// TODO: fix use Dropdown on user-menu
|
||||
'nested-interactive': { enabled: false },
|
||||
},
|
||||
});
|
||||
});
|
||||
|
|
|
|||
|
|
@ -29,8 +29,6 @@ module('Integration | Component | sidebar-nav-cluster', function (hooks) {
|
|||
rules: {
|
||||
// This is an issue with Hds::AppHeader::HomeLink
|
||||
'aria-prohibited-attr': { enabled: false },
|
||||
// TODO: fix use Dropdown on user-menu
|
||||
'nested-interactive': { enabled: false },
|
||||
},
|
||||
});
|
||||
});
|
||||
|
|
@ -58,6 +56,27 @@ module('Integration | Component | sidebar-nav-cluster', function (hooks) {
|
|||
assert.dom(GENERAL.navHeading()).exists({ count: 1 }, 'Headings are hidden other than Vault');
|
||||
});
|
||||
|
||||
test('it should render nav links on community version', async function (assert) {
|
||||
const links = [
|
||||
'Dashboard',
|
||||
'Secrets',
|
||||
'Resilience and recovery',
|
||||
'Access',
|
||||
'Operational tools',
|
||||
'Raft Storage',
|
||||
'Client count',
|
||||
];
|
||||
|
||||
const features = allFeatures().filter((feat) => feat !== 'PKI-only Secrets');
|
||||
stubFeaturesAndPermissions(this.owner, false, true, features);
|
||||
await renderComponent();
|
||||
|
||||
assert.dom(GENERAL.navLink()).exists({ count: links.length }, 'Correct number of links render');
|
||||
links.forEach((link) => {
|
||||
assert.dom(GENERAL.navLink(link)).hasText(link, `${link} link renders`);
|
||||
});
|
||||
});
|
||||
|
||||
test('it should render nav links', async function (assert) {
|
||||
const links = [
|
||||
'Dashboard',
|
||||
|
|
|
|||
|
|
@ -30,8 +30,6 @@ module('Integration | Component | sidebar-nav-reporting', function (hooks) {
|
|||
rules: {
|
||||
// This is an issue with Hds::AppHeader::HomeLink
|
||||
'aria-prohibited-attr': { enabled: false },
|
||||
// TODO: fix use Dropdown on user-menu
|
||||
'nested-interactive': { enabled: false },
|
||||
},
|
||||
});
|
||||
});
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue