UI: Ember deprecations - transition methods part 1 (#25560)

This commit is contained in:
Chelsea Shaw
2024-02-22 13:18:06 -06:00
committed by GitHub
parent 60fb3c14d5
commit 6a17f2bace
44 changed files with 192 additions and 124 deletions

View File

@@ -4,25 +4,29 @@
*/ */
import Controller from '@ember/controller'; import Controller from '@ember/controller';
import { task } from 'ember-concurrency'; import { service } from '@ember/service';
export default Controller.extend({ export default Controller.extend({
router: service(),
showRoute: 'vault.cluster.access.identity.show', showRoute: 'vault.cluster.access.identity.show',
showTab: 'details', showTab: 'details',
navAfterSave: task(function* ({ saveType, model }) {
const isDelete = saveType === 'delete'; actions: {
const type = model.get('identityType'); navAfterSave({ saveType, model }) {
const listRoutes = { const isDelete = saveType === 'delete';
'entity-alias': 'vault.cluster.access.identity.aliases.index', const type = model.identityType;
'group-alias': 'vault.cluster.access.identity.aliases.index', const listRoutes = {
group: 'vault.cluster.access.identity.index', 'entity-alias': 'vault.cluster.access.identity.aliases.index',
entity: 'vault.cluster.access.identity.index', 'group-alias': 'vault.cluster.access.identity.aliases.index',
}; group: 'vault.cluster.access.identity.index',
const routeName = listRoutes[type]; entity: 'vault.cluster.access.identity.index',
if (!isDelete) { };
yield this.transitionToRoute(this.showRoute, model.id, this.showTab); if (!isDelete) {
return; this.router.transitionTo(this.showRoute, model.id, this.showTab);
} } else {
yield this.transitionToRoute(routeName); const routeName = listRoutes[type];
}), this.router.transitionTo(routeName);
}
},
},
}); });

View File

@@ -4,11 +4,13 @@
*/ */
import Controller from '@ember/controller'; import Controller from '@ember/controller';
import { service } from '@ember/service';
export default Controller.extend({ export default Controller.extend({
router: service(),
actions: { actions: {
lookupLease(id) { lookupLease(id) {
this.transitionToRoute('vault.cluster.access.leases.show', id); this.router.transitionTo('vault.cluster.access.leases.show', id);
}, },
}, },
}); });

View File

@@ -11,6 +11,7 @@ import { keyIsFolder } from 'core/utils/key-utils';
export default Controller.extend(ListController, { export default Controller.extend(ListController, {
flashMessages: service(), flashMessages: service(),
router: service(),
store: service(), store: service(),
clusterController: controller('vault.cluster'), clusterController: controller('vault.cluster'),
@@ -61,7 +62,7 @@ export default Controller.extend(ListController, {
const fn = adapter[method]; const fn = adapter[method];
fn.call(adapter, prefix) fn.call(adapter, prefix)
.then(() => { .then(() => {
return this.transitionToRoute('vault.cluster.access.leases.list-root').then(() => { return this.router.transitionTo('vault.cluster.access.leases.list-root').then(() => {
this.flashMessages.success(`All of the leases under ${prefix} will be revoked.`); this.flashMessages.success(`All of the leases under ${prefix} will be revoked.`);
}); });
}) })

View File

@@ -21,11 +21,12 @@ export default Controller.extend({
}), }),
flashMessages: service(), flashMessages: service(),
router: service(),
actions: { actions: {
revokeLease(model) { revokeLease(model) {
return model.destroyRecord().then(() => { return model.destroyRecord().then(() => {
return this.transitionToRoute('vault.cluster.access.leases.list-root'); return this.router.transitionTo('vault.cluster.access.leases.list-root');
}); });
}, },

View File

@@ -7,12 +7,13 @@ import { service } from '@ember/service';
import Controller from '@ember/controller'; import Controller from '@ember/controller';
export default Controller.extend({ export default Controller.extend({
namespaceService: service('namespace'), namespaceService: service('namespace'),
router: service(),
actions: { actions: {
onSave({ saveType }) { onSave({ saveType }) {
if (saveType === 'save') { if (saveType === 'save') {
// fetch new namespaces for the namespace picker // fetch new namespaces for the namespace picker
this.namespaceService.findNamespacesForUser.perform(); this.namespaceService.findNamespacesForUser.perform();
return this.transitionToRoute('vault.cluster.access.namespaces.index'); return this.router.transitionTo('vault.cluster.access.namespaces.index');
} }
}, },
}, },

View File

@@ -4,13 +4,15 @@
*/ */
import Controller from '@ember/controller'; import Controller from '@ember/controller';
import { service } from '@ember/service';
export default Controller.extend({ export default Controller.extend({
router: service(),
queryParams: ['action'], queryParams: ['action'],
action: '', action: '',
actions: { actions: {
onPromote() { onPromote() {
this.transitionToRoute('vault.cluster.replication.mode.index', 'dr'); this.router.transitionTo('vault.cluster.replication.mode.index', 'dr');
}, },
}, },
}); });

View File

@@ -4,11 +4,14 @@
*/ */
import Controller from '@ember/controller'; import Controller from '@ember/controller';
import { service } from '@ember/service';
export default Controller.extend({ export default Controller.extend({
router: service(),
actions: { actions: {
onMountSuccess: function (type, path) { onMountSuccess: function (type, path) {
const transition = this.transitionToRoute('vault.cluster.settings.auth.configure', path); const transition = this.router.transitionTo('vault.cluster.settings.auth.configure', path);
return transition.followRedirects(); return transition.followRedirects();
}, },
}, },

View File

@@ -42,9 +42,11 @@ export default Mixin.create({
transition.targetName !== CLUSTER_INDEX && transition.targetName !== CLUSTER_INDEX &&
!isExcluded !isExcluded
) { ) {
return this.transitionTo(targetRoute, { queryParams: { redirect_to: this.router.currentURL } }); return this.router.transitionTo(targetRoute, {
queryParams: { redirect_to: this.router.currentURL },
});
} }
return this.transitionTo(targetRoute); return this.router.transitionTo(targetRoute);
} }
return RSVP.resolve(); return RSVP.resolve();

View File

@@ -28,14 +28,15 @@ export const getManagedNamespace = (nsParam, root) => {
}; };
export default Route.extend(ModelBoundaryRoute, ClusterRoute, { export default Route.extend(ModelBoundaryRoute, ClusterRoute, {
namespaceService: service('namespace'),
version: service(),
permissions: service(),
store: service(),
auth: service(), auth: service(),
currentCluster: service(),
customMessages: service(), customMessages: service(),
featureFlagService: service('featureFlag'), featureFlagService: service('featureFlag'),
currentCluster: service(), namespaceService: service('namespace'),
permissions: service(),
router: service(),
store: service(),
version: service(),
modelTypes: computed(function () { modelTypes: computed(function () {
return ['node', 'secret', 'secret-engine']; return ['node', 'secret', 'secret-engine'];
}), }),
@@ -69,12 +70,12 @@ export default Route.extend(ModelBoundaryRoute, ClusterRoute, {
namespace = storage?.userRootNamespace; namespace = storage?.userRootNamespace;
// only redirect if something other than nothing // only redirect if something other than nothing
if (namespace) { if (namespace) {
this.transitionTo({ queryParams: { namespace } }); this.router.transitionTo({ queryParams: { namespace } });
} }
} else if (managedRoot !== null) { } else if (managedRoot !== null) {
const managed = getManagedNamespace(namespace, managedRoot); const managed = getManagedNamespace(namespace, managedRoot);
if (managed !== namespace) { if (managed !== namespace) {
this.transitionTo({ queryParams: { namespace: managed } }); this.router.transitionTo({ queryParams: { namespace: managed } });
} }
} }
this.namespaceService.setNamespace(namespace); this.namespaceService.setNamespace(namespace);
@@ -126,7 +127,7 @@ export default Route.extend(ModelBoundaryRoute, ClusterRoute, {
// Check that namespaces is enabled and if not, // Check that namespaces is enabled and if not,
// clear the namespace by transition to this route w/o it // clear the namespace by transition to this route w/o it
if (this.namespaceService.path && !this.version.hasNamespaces) { if (this.namespaceService.path && !this.version.hasNamespaces) {
return this.transitionTo(this.routeName, { queryParams: { namespace: '' } }); return this.router.transitionTo(this.routeName, { queryParams: { namespace: '' } });
} }
return this.transitionToTargetRoute(transition); return this.transitionToTargetRoute(transition);
}, },

View File

@@ -9,11 +9,12 @@ import { service } from '@ember/service';
export default Route.extend(UnloadModelRoute, { export default Route.extend(UnloadModelRoute, {
store: service(), store: service(),
router: service(),
beforeModel() { beforeModel() {
const itemType = this.modelFor('vault.cluster.access.identity'); const itemType = this.modelFor('vault.cluster.access.identity');
if (itemType !== 'entity') { if (itemType !== 'entity') {
return this.transitionTo('vault.cluster.access.identity'); return this.router.transitionTo('vault.cluster.access.identity');
} }
}, },

View File

@@ -12,6 +12,7 @@ import { TABS } from 'vault/helpers/tabs-for-identity-show';
import { service } from '@ember/service'; import { service } from '@ember/service';
export default Route.extend({ export default Route.extend({
router: service(),
store: service(), store: service(),
model(params) { model(params) {
@@ -58,7 +59,7 @@ export default Route.extend({
afterModel(resolvedModel) { afterModel(resolvedModel) {
const { section, model } = resolvedModel; const { section, model } = resolvedModel;
if (model.get('identityType') === 'group' && model.get('type') === 'internal' && section === 'aliases') { if (model.get('identityType') === 'group' && model.get('type') === 'internal' && section === 'aliases') {
return this.transitionTo('vault.cluster.access.identity.show', model.id, 'details'); return this.router.transitionTo('vault.cluster.access.identity.show', model.id, 'details');
} }
}, },

View File

@@ -4,16 +4,19 @@
*/ */
import Route from '@ember/routing/route'; import Route from '@ember/routing/route';
import { service } from '@ember/service';
export default class LeasesIndexRoute extends Route {
@service router;
export default Route.extend({
beforeModel(transition) { beforeModel(transition) {
if ( if (
this.modelFor('vault.cluster.access.leases').get('canList') && this.modelFor('vault.cluster.access.leases').get('canList') &&
transition.targetName === this.routeName transition.targetName === this.routeName
) { ) {
return this.replaceWith('vault.cluster.access.leases.list-root'); return this.router.replaceWith('vault.cluster.access.leases.list-root');
} else { } else {
return; return;
} }
}, }
}); }

View File

@@ -12,15 +12,16 @@ import UnloadModelRoute from 'vault/mixins/unload-model-route';
export default Route.extend(UnloadModelRoute, { export default Route.extend(UnloadModelRoute, {
store: service(), store: service(),
router: service(),
beforeModel() { beforeModel() {
const { lease_id: leaseId } = this.paramsFor(this.routeName); const { lease_id: leaseId } = this.paramsFor(this.routeName);
const parentKey = parentKeyForKey(leaseId); const parentKey = parentKeyForKey(leaseId);
if (keyIsFolder(leaseId)) { if (keyIsFolder(leaseId)) {
if (parentKey) { if (parentKey) {
return this.transitionTo('vault.cluster.access.leases.list', parentKey); return this.router.transitionTo('vault.cluster.access.leases.list', parentKey);
} else { } else {
return this.transitionTo('vault.cluster.access.leases.list-root'); return this.router.transitionTo('vault.cluster.access.leases.list-root');
} }
} }
}, },

View File

@@ -4,12 +4,16 @@
*/ */
import Route from '@ember/routing/route'; import Route from '@ember/routing/route';
import { service } from '@ember/service';
import { tabsForAuthSection } from 'vault/helpers/tabs-for-auth-section'; import { tabsForAuthSection } from 'vault/helpers/tabs-for-auth-section';
export default Route.extend({
export default class AccessMethodIndexRoute extends Route {
@service router;
beforeModel() { beforeModel() {
let { methodType, paths } = this.modelFor('vault.cluster.access.method'); let { methodType, paths } = this.modelFor('vault.cluster.access.method');
paths = paths ? paths.paths.filter((path) => path.navigation === true) : null; paths = paths ? paths.paths.filter((path) => path.navigation === true) : null;
const activeTab = tabsForAuthSection([methodType, 'authConfig', paths])[0].routeParams; const activeTab = tabsForAuthSection([methodType, 'authConfig', paths])[0].routeParams;
return this.transitionTo(...activeTab); return this.router.transitionTo(...activeTab);
}, }
}); }

View File

@@ -7,6 +7,7 @@ import Route from '@ember/routing/route';
import { service } from '@ember/service'; import { service } from '@ember/service';
export default class MfaConfigureRoute extends Route { export default class MfaConfigureRoute extends Route {
@service router;
@service store; @service store;
beforeModel() { beforeModel() {
@@ -14,7 +15,7 @@ export default class MfaConfigureRoute extends Route {
.query('mfa-method', {}) .query('mfa-method', {})
.then(() => { .then(() => {
// if response then they should transition to the methods page instead of staying on the configure page. // if response then they should transition to the methods page instead of staying on the configure page.
this.transitionTo('vault.cluster.access.mfa.methods.index'); this.router.transitionTo('vault.cluster.access.mfa.methods.index');
}) })
.catch(() => { .catch(() => {
// stay on the landing page // stay on the landing page

View File

@@ -4,9 +4,11 @@
*/ */
import Route from '@ember/routing/route'; import Route from '@ember/routing/route';
import { service } from '@ember/service';
export default Route.extend({ export default class ClusterIndexRoute extends Route {
@service router;
beforeModel() { beforeModel() {
return this.transitionTo('vault.cluster.dashboard'); return this.router.transitionTo('vault.cluster.dashboard');
}, }
}); }

View File

@@ -42,6 +42,7 @@ export default Route.extend(ModelBoundaryRoute, {
queryParams.namespace = ns; queryParams.namespace = ns;
} }
if (Ember.testing) { if (Ember.testing) {
// TODO: cleanup this replaceWith instance. Using router.replaceWith causes test failures
// Don't redirect on the test // Don't redirect on the test
this.replaceWith('vault.cluster.auth', { queryParams }); this.replaceWith('vault.cluster.auth', { queryParams });
} else { } else {

View File

@@ -73,7 +73,7 @@ export default class VaultClusterOidcProviderRoute extends Route {
if (namespace) { if (namespace) {
queryParams.namespace = namespace; queryParams.namespace = namespace;
} }
return this.transitionTo(AUTH, cluster_name, { queryParams }); return this.router.transitionTo(AUTH, cluster_name, { queryParams });
} }
_buildUrl(urlString, params) { _buildUrl(urlString, params) {

View File

@@ -21,7 +21,7 @@ export default Route.extend(ClusterRoute, {
model(params) { model(params) {
const policyType = params.type; const policyType = params.type;
if (!ALLOWED_TYPES.includes(policyType)) { if (!ALLOWED_TYPES.includes(policyType)) {
return this.transitionTo(this.routeName, ALLOWED_TYPES[0]); return this.router.transitionTo(this.routeName, ALLOWED_TYPES[0]);
} }
return {}; return {};
}, },

View File

@@ -8,13 +8,14 @@ import Route from '@ember/routing/route';
import UnsavedModelRoute from 'vault/mixins/unsaved-model-route'; import UnsavedModelRoute from 'vault/mixins/unsaved-model-route';
export default Route.extend(UnsavedModelRoute, { export default Route.extend(UnsavedModelRoute, {
router: service(),
store: service(), store: service(),
version: service(), version: service(),
model() { model() {
const policyType = this.policyType(); const policyType = this.policyType();
if (!this.version.hasSentinel && policyType !== 'acl') { if (!this.version.hasSentinel && policyType !== 'acl') {
return this.transitionTo('vault.cluster.policies', policyType); return this.router.transitionTo('vault.cluster.policies', policyType);
} }
return this.store.createRecord(`policy/${policyType}`, {}); return this.store.createRecord(`policy/${policyType}`, {});
}, },

View File

@@ -19,10 +19,10 @@ export default Route.extend(ClusterRoute, {
model(params) { model(params) {
const policyType = params.type; const policyType = params.type;
if (!ALLOWED_TYPES.includes(policyType)) { if (!ALLOWED_TYPES.includes(policyType)) {
return this.transitionTo('vault.cluster.policies', ALLOWED_TYPES[0]); return this.router.transitionTo('vault.cluster.policies', ALLOWED_TYPES[0]);
} }
if (!this.version.hasSentinel && policyType !== 'acl') { if (!this.version.hasSentinel && policyType !== 'acl') {
return this.transitionTo('vault.cluster.policies', policyType); return this.router.transitionTo('vault.cluster.policies', policyType);
} }
return {}; return {};
}, },

View File

@@ -4,9 +4,12 @@
*/ */
import Route from '@ember/routing/route'; import Route from '@ember/routing/route';
import { service } from '@ember/service';
export default class PolicyIndexRouter extends Route {
@service router;
export default Route.extend({
beforeModel() { beforeModel() {
return this.transitionTo('vault.cluster.policies', 'acl'); return this.router.transitionTo('vault.cluster.policies', 'acl');
}, }
}); }

View File

@@ -9,13 +9,14 @@ import UnloadModelRoute from 'vault/mixins/unload-model-route';
import { service } from '@ember/service'; import { service } from '@ember/service';
export default Route.extend(UnloadModelRoute, { export default Route.extend(UnloadModelRoute, {
router: service(),
store: service(), store: service(),
beforeModel() { beforeModel() {
const params = this.paramsFor(this.routeName); const params = this.paramsFor(this.routeName);
const policyType = this.policyType(); const policyType = this.policyType();
if (policyType === 'acl' && params.policy_name === 'root') { if (policyType === 'acl' && params.policy_name === 'root') {
return this.transitionTo('vault.cluster.policies', 'acl'); return this.router.transitionTo('vault.cluster.policies', 'acl');
} }
}, },

View File

@@ -6,9 +6,10 @@
import { service } from '@ember/service'; import { service } from '@ember/service';
import Route from '@ember/routing/route'; import Route from '@ember/routing/route';
export default Route.extend({ export default Route.extend({
store: service(),
flashMessages: service(), flashMessages: service(),
router: service(),
secretMountPath: service(), secretMountPath: service(),
store: service(),
oldModel: null, oldModel: null,
model(params) { model(params) {
@@ -28,7 +29,7 @@ export default Route.extend({
afterModel(model, transition) { afterModel(model, transition) {
const path = model && model.get('path'); const path = model && model.get('path');
if (transition.targetName === this.routeName) { if (transition.targetName === this.routeName) {
return this.replaceWith('vault.cluster.secrets.backend.list-root', path); return this.router.replaceWith('vault.cluster.secrets.backend.list-root', path);
} }
}, },
}); });

View File

@@ -21,9 +21,9 @@ export default EditBase.extend({
const { backend } = this.paramsFor('vault.cluster.secrets.backend'); const { backend } = this.paramsFor('vault.cluster.secrets.backend');
if (this.backendType(backend) !== 'transit') { if (this.backendType(backend) !== 'transit') {
if (parentKey) { if (parentKey) {
return this.transitionTo('vault.cluster.secrets.backend.show', parentKey); return this.router.transitionTo('vault.cluster.secrets.backend.show', parentKey);
} else { } else {
return this.transitionTo('vault.cluster.secrets.backend.show-root'); return this.router.transitionTo('vault.cluster.secrets.backend.show-root');
} }
} }
}, },

View File

@@ -4,13 +4,16 @@
*/ */
import Route from '@ember/routing/route'; import Route from '@ember/routing/route';
import { service } from '@ember/service';
export default class SecretsBackendCreateRoute extends Route {
@service router;
export default Route.extend({
beforeModel() { beforeModel() {
const { secret, initialKey } = this.paramsFor(this.routeName); const { secret, initialKey } = this.paramsFor(this.routeName);
const qp = initialKey || secret; const qp = initialKey || secret;
return this.transitionTo('vault.cluster.secrets.backend.create-root', { return this.router.transitionTo('vault.cluster.secrets.backend.create-root', {
queryParams: { initialKey: qp }, queryParams: { initialKey: qp },
}); });
}, }
}); }

View File

@@ -13,6 +13,7 @@ const SUPPORTED_DYNAMIC_BACKENDS = ['database', 'ssh', 'aws'];
export default Route.extend({ export default Route.extend({
templateName: 'vault/cluster/secrets/backend/credentials', templateName: 'vault/cluster/secrets/backend/credentials',
pathHelp: service('path-help'), pathHelp: service('path-help'),
router: service(),
store: service(), store: service(),
backendModel() { backendModel() {
@@ -65,7 +66,7 @@ export default Route.extend({
dbCred = await this.getDatabaseCredential(backendPath, role, roleType); dbCred = await this.getDatabaseCredential(backendPath, role, roleType);
} }
if (!SUPPORTED_DYNAMIC_BACKENDS.includes(backendModel.get('type'))) { if (!SUPPORTED_DYNAMIC_BACKENDS.includes(backendModel.get('type'))) {
return this.transitionTo('vault.cluster.secrets.backend.list-root', backendPath); return this.router.transitionTo('vault.cluster.secrets.backend.list-root', backendPath);
} }
return resolve({ return resolve({
backendPath, backendPath,

View File

@@ -4,9 +4,12 @@
*/ */
import Route from '@ember/routing/route'; import Route from '@ember/routing/route';
import { service } from '@ember/service';
export default class BackendIndexRoute extends Route {
@service router;
export default Route.extend({
beforeModel() { beforeModel() {
return this.replaceWith('vault.cluster.secrets.backend.list-root'); return this.router.replaceWith('vault.cluster.secrets.backend.list-root');
}, }
}); }

View File

@@ -83,20 +83,24 @@ export default Route.extend({
if (secretEngine.type === 'kv' && secretEngine.version === 2) { if (secretEngine.type === 'kv' && secretEngine.version === 2) {
// if no secret param redirect to the create route // if no secret param redirect to the create route
// if secret param they are either viewing or editing secret so navigate to the details route // if secret param they are either viewing or editing secret so navigate to the details route
return !secret if (!secret) {
? this.router.transitionTo('vault.cluster.secrets.backend.kv.create', secretEngine.id) this.router.transitionTo('vault.cluster.secrets.backend.kv.create', secretEngine.id);
: this.router.transitionTo( } else {
'vault.cluster.secrets.backend.kv.secret.details', this.router.transitionTo(
secretEngine.id, 'vault.cluster.secrets.backend.kv.secret.details',
secret secretEngine.id,
); secret
);
}
return;
} }
if (mode === 'edit' && keyIsFolder(secret)) { if (mode === 'edit' && keyIsFolder(secret)) {
if (parentKey) { if (parentKey) {
return this.router.transitionTo('vault.cluster.secrets.backend.list', encodePath(parentKey)); this.router.transitionTo('vault.cluster.secrets.backend.list', encodePath(parentKey));
} else { } else {
return this.router.transitionTo('vault.cluster.secrets.backend.list-root'); this.router.transitionTo('vault.cluster.secrets.backend.list-root');
} }
return;
} }
}); });
}, },

View File

@@ -8,6 +8,7 @@ import UnloadModel from 'vault/mixins/unload-model-route';
import { service } from '@ember/service'; import { service } from '@ember/service';
export default Route.extend(UnloadModel, { export default Route.extend(UnloadModel, {
router: service(),
store: service(), store: service(),
templateName: 'vault/cluster/secrets/backend/sign', templateName: 'vault/cluster/secrets/backend/sign',
@@ -31,11 +32,11 @@ export default Route.extend(UnloadModel, {
const backend = backendModel.get('id'); const backend = backendModel.get('id');
if (backendModel.get('type') !== 'ssh') { if (backendModel.get('type') !== 'ssh') {
return this.transitionTo('vault.cluster.secrets.backend.list-root', backend); return this.router.transitionTo('vault.cluster.secrets.backend.list-root', backend);
} }
return this.store.queryRecord('capabilities', this.pathQuery(role, backend)).then((capabilities) => { return this.store.queryRecord('capabilities', this.pathQuery(role, backend)).then((capabilities) => {
if (!capabilities.get('canUpdate')) { if (!capabilities.get('canUpdate')) {
return this.transitionTo('vault.cluster.secrets.backend.list-root', backend); return this.router.transitionTo('vault.cluster.secrets.backend.list-root', backend);
} }
return this.store.createRecord('ssh-sign', { return this.store.createRecord('ssh-sign', {
role: { role: {

View File

@@ -4,12 +4,15 @@
*/ */
import Route from '@ember/routing/route'; import Route from '@ember/routing/route';
import { service } from '@ember/service';
import { tabsForAuthSection } from 'vault/helpers/tabs-for-auth-section'; import { tabsForAuthSection } from 'vault/helpers/tabs-for-auth-section';
export default Route.extend({ export default class SettingsAuthConfigureRoute extends Route {
@service router;
beforeModel() { beforeModel() {
const model = this.modelFor('vault.cluster.settings.auth.configure'); const model = this.modelFor('vault.cluster.settings.auth.configure');
const section = tabsForAuthSection([model]).firstObject.routeParams.lastObject; const section = tabsForAuthSection([model]).firstObject.routeParams.lastObject;
return this.transitionTo('vault.cluster.settings.auth.configure.section', section); return this.router.transitionTo('vault.cluster.settings.auth.configure.section', section);
}, }
}); }

View File

@@ -4,9 +4,12 @@
*/ */
import Route from '@ember/routing/route'; import Route from '@ember/routing/route';
import { service } from '@ember/service';
export default class SettingsAuthIndexRouter extends Route {
@service router;
export default Route.extend({
beforeModel() { beforeModel() {
return this.replaceWith('vault.cluster.settings.auth.enable'); return this.router.replaceWith('vault.cluster.settings.auth.enable');
}, }
}); }

View File

@@ -4,12 +4,15 @@
*/ */
import Route from '@ember/routing/route'; import Route from '@ember/routing/route';
import { service } from '@ember/service';
export default Route.extend({ export default class SettingsIndexRouter extends Route {
beforeModel: function (transition) { @service router;
beforeModel(transition) {
if (transition.targetName === this.routeName) { if (transition.targetName === this.routeName) {
transition.abort(); transition.abort();
return this.replaceWith('vault.cluster.settings.mount-secret-backend'); return this.router.replaceWith('vault.cluster.settings.mount-secret-backend');
} }
}, }
}); }

View File

@@ -7,14 +7,16 @@ import { service } from '@ember/service';
import Route from '@ember/routing/route'; import Route from '@ember/routing/route';
import { toolsActions } from 'vault/helpers/tools-actions'; import { toolsActions } from 'vault/helpers/tools-actions';
export default Route.extend({ export default class ToolsIndexRouter extends Route {
currentCluster: service(), @service currentCluster;
@service router;
beforeModel(transition) { beforeModel(transition) {
const currentCluster = this.currentCluster.cluster.name; const currentCluster = this.currentCluster.cluster.name;
const supportedActions = toolsActions(); const supportedActions = toolsActions();
if (transition.targetName === this.routeName) { if (transition.targetName === this.routeName) {
transition.abort(); transition.abort();
return this.replaceWith('vault.cluster.tools.tool', currentCluster, supportedActions[0]); return this.router.replaceWith('vault.cluster.tools.tool', currentCluster, supportedActions[0]);
} }
}, }
}); }

View File

@@ -29,7 +29,12 @@
/> />
{{/if}} {{/if}}
{{#if @item.canDelete}} {{#if @item.canDelete}}
<dd.Interactive @text="Remove" @color="critical" {{on "click" (fn (mut this.showConfirmModal) true)}} /> <dd.Interactive
@text="Remove"
@color="critical"
{{on "click" (fn (mut this.showConfirmModal) true)}}
data-test-popup-menu="delete"
/>
{{/if}} {{/if}}
{{/if}} {{/if}}
</Hds::Dropdown> </Hds::Dropdown>

View File

@@ -14,4 +14,4 @@
</p.levelLeft> </p.levelLeft>
</PageHeader> </PageHeader>
<Identity::EditForm @model={{this.model}} @onSave={{perform this.navAfterSave}} /> <Identity::EditForm @model={{this.model}} @onSave={{action "navAfterSave"}} />

View File

@@ -12,4 +12,4 @@
</p.levelLeft> </p.levelLeft>
</PageHeader> </PageHeader>
<Identity::EditForm @mode="edit" @model={{this.model}} @onSave={{perform this.navAfterSave}} /> <Identity::EditForm @mode="edit" @model={{this.model}} @onSave={{action "navAfterSave"}} />

View File

@@ -11,4 +11,4 @@
</h1> </h1>
</p.levelLeft> </p.levelLeft>
</PageHeader> </PageHeader>
<Identity::EditForm @model={{this.model}} @onSave={{perform this.navAfterSave}} /> <Identity::EditForm @model={{this.model}} @onSave={{action "navAfterSave"}} />

View File

@@ -12,4 +12,4 @@
</p.levelLeft> </p.levelLeft>
</PageHeader> </PageHeader>
<Identity::EditForm @mode="edit" @model={{this.model}} @onSave={{perform this.navAfterSave}} /> <Identity::EditForm @mode="edit" @model={{this.model}} @onSave={{action "navAfterSave"}} />

View File

@@ -11,4 +11,4 @@
</p.levelLeft> </p.levelLeft>
</PageHeader> </PageHeader>
<Identity::EditForm @mode="merge" @model={{this.model}} @onSave={{perform this.navAfterSave}} /> <Identity::EditForm @mode="merge" @model={{this.model}} @onSave={{action "navAfterSave"}} />

View File

@@ -3,12 +3,11 @@
* SPDX-License-Identifier: BUSL-1.1 * SPDX-License-Identifier: BUSL-1.1
*/ */
import { currentRouteName, settled } from '@ember/test-helpers'; import { currentRouteName, find, settled } from '@ember/test-helpers';
import page from 'vault/tests/pages/access/identity/aliases/add'; import page from 'vault/tests/pages/access/identity/aliases/add';
import aliasIndexPage from 'vault/tests/pages/access/identity/aliases/index'; import aliasIndexPage from 'vault/tests/pages/access/identity/aliases/index';
import aliasShowPage from 'vault/tests/pages/access/identity/aliases/show'; import aliasShowPage from 'vault/tests/pages/access/identity/aliases/show';
import createItemPage from 'vault/tests/pages/access/identity/create'; import createItemPage from 'vault/tests/pages/access/identity/create';
import showItemPage from 'vault/tests/pages/access/identity/show';
export const testAliasCRUD = async function (name, itemType, assert) { export const testAliasCRUD = async function (name, itemType, assert) {
if (itemType === 'groups') { if (itemType === 'groups') {
@@ -18,8 +17,8 @@ export const testAliasCRUD = async function (name, itemType, assert) {
await createItemPage.createItem(itemType); await createItemPage.createItem(itemType);
await settled(); await settled();
} }
let idRow = showItemPage.rows.filterBy('hasLabel').filterBy('rowLabel', 'ID')[0];
const itemID = idRow.rowValue; const itemID = find('[data-test-row-value="ID"]').textContent.trim();
await page.visit({ item_type: itemType, id: itemID }); await page.visit({ item_type: itemType, id: itemID });
await settled(); await settled();
await page.editForm.name(name).submit(); await page.editForm.name(name).submit();
@@ -29,8 +28,7 @@ export const testAliasCRUD = async function (name, itemType, assert) {
`${itemType}: shows a flash message` `${itemType}: shows a flash message`
); );
idRow = aliasShowPage.rows.filterBy('hasLabel').filterBy('rowLabel', 'ID')[0]; const aliasID = find('[data-test-row-value="ID"]').textContent.trim();
const aliasID = idRow.rowValue;
assert.strictEqual( assert.strictEqual(
currentRouteName(), currentRouteName(),
'vault.cluster.access.identity.aliases.show', 'vault.cluster.access.identity.aliases.show',
@@ -73,14 +71,13 @@ export const testAliasDeleteFromForm = async function (name, itemType, assert) {
await createItemPage.createItem(itemType); await createItemPage.createItem(itemType);
await settled(); await settled();
} }
let idRow = showItemPage.rows.filterBy('hasLabel').filterBy('rowLabel', 'ID')[0];
const itemID = idRow.rowValue; const itemID = find('[data-test-row-value="ID"]').textContent.trim();
await page.visit({ item_type: itemType, id: itemID }); await page.visit({ item_type: itemType, id: itemID });
await settled(); await settled();
await page.editForm.name(name).submit(); await page.editForm.name(name).submit();
await settled(); await settled();
idRow = aliasShowPage.rows.filterBy('hasLabel').filterBy('rowLabel', 'ID')[0]; const aliasID = find('[data-test-row-value="ID"]').textContent.trim();
const aliasID = idRow.rowValue;
await aliasShowPage.edit(); await aliasShowPage.edit();
await settled(); await settled();
assert.strictEqual( assert.strictEqual(

View File

@@ -3,14 +3,13 @@
* SPDX-License-Identifier: BUSL-1.1 * SPDX-License-Identifier: BUSL-1.1
*/ */
import { module, skip, test } from 'qunit'; import { module, test } from 'qunit';
import { settled } from '@ember/test-helpers'; import { settled } from '@ember/test-helpers';
import { setupApplicationTest } from 'ember-qunit'; import { setupApplicationTest } from 'ember-qunit';
import { testAliasCRUD, testAliasDeleteFromForm } from '../../_shared-alias-tests'; import { testAliasCRUD, testAliasDeleteFromForm } from '../../_shared-alias-tests';
import authPage from 'vault/tests/pages/auth'; import authPage from 'vault/tests/pages/auth';
module('Acceptance | /access/identity/entities/aliases/add', function (hooks) { module('Acceptance | /access/identity/entities/aliases/add', function (hooks) {
// TODO come back and figure out why this is failing. Seems to be a race condition
setupApplicationTest(hooks); setupApplicationTest(hooks);
hooks.beforeEach(async function () { hooks.beforeEach(async function () {
@@ -18,7 +17,7 @@ module('Acceptance | /access/identity/entities/aliases/add', function (hooks) {
return; return;
}); });
skip('it allows create, list, delete of an entity alias', async function (assert) { test('it allows create, list, delete of an entity alias', async function (assert) {
assert.expect(6); assert.expect(6);
const name = `alias-${Date.now()}`; const name = `alias-${Date.now()}`;
await testAliasCRUD(name, 'entities', assert); await testAliasCRUD(name, 'entities', assert);

View File

@@ -183,6 +183,8 @@ module('Acceptance | oidc provider', function (hooks) {
test('OIDC Provider redirects to auth if current token and prompt = login', async function (assert) { test('OIDC Provider redirects to auth if current token and prompt = login', async function (assert) {
const { providerName, callback, clientId, authMethodPath } = this.oidcSetupInformation; const { providerName, callback, clientId, authMethodPath } = this.oidcSetupInformation;
await settled(); await settled();
await visit('/vault/dashboard');
assert.strictEqual(currentURL(), '/vault/dashboard', 'User is logged in before oidc login attempt');
const url = getAuthzUrl(providerName, callback, clientId, { prompt: 'login' }); const url = getAuthzUrl(providerName, callback, clientId, { prompt: 'login' });
await visit(url); await visit(url);

View File

@@ -20,7 +20,12 @@ import sinon from 'sinon';
module('Unit | Mixin | cluster route', function () { module('Unit | Mixin | cluster route', function () {
function createClusterRoute( function createClusterRoute(
clusterModel = {}, clusterModel = {},
methods = { router: {}, hasKeyData: () => false, authToken: () => null, transitionTo: () => {} } methods = {
router: { transitionTo: () => {} },
hasKeyData: () => false,
authToken: () => null,
transitionTo: () => {},
}
) { ) {
const ClusterRouteObject = EmberObject.extend( const ClusterRouteObject = EmberObject.extend(
ClusterRouteMixin, ClusterRouteMixin,
@@ -132,7 +137,7 @@ module('Unit | Mixin | cluster route', function () {
const redirectRouteURL = '/vault/secrets/secret/create'; const redirectRouteURL = '/vault/secrets/secret/create';
const subject = createClusterRoute({ needsInit: false, sealed: false }); const subject = createClusterRoute({ needsInit: false, sealed: false });
subject.router.currentURL = redirectRouteURL; subject.router.currentURL = redirectRouteURL;
const spy = sinon.spy(subject, 'transitionTo'); const spy = sinon.spy(subject.router, 'transitionTo');
subject.transitionToTargetRoute(); subject.transitionToTargetRoute();
assert.ok( assert.ok(
spy.calledWithExactly(AUTH, { queryParams: { redirect_to: redirectRouteURL } }), spy.calledWithExactly(AUTH, { queryParams: { redirect_to: redirectRouteURL } }),
@@ -153,7 +158,7 @@ module('Unit | Mixin | cluster route', function () {
test('#transitionToTargetRoute with auth target, coming from cluster route', function (assert) { test('#transitionToTargetRoute with auth target, coming from cluster route', function (assert) {
const subject = createClusterRoute({ needsInit: false, sealed: false }); const subject = createClusterRoute({ needsInit: false, sealed: false });
const spy = sinon.spy(subject, 'transitionTo'); const spy = sinon.spy(subject.router, 'transitionTo');
subject.transitionToTargetRoute({ targetName: CLUSTER_INDEX }); subject.transitionToTargetRoute({ targetName: CLUSTER_INDEX });
assert.ok(spy.calledWithExactly(AUTH), 'calls transitionTo without redirect_to'); assert.ok(spy.calledWithExactly(AUTH), 'calls transitionTo without redirect_to');
spy.restore(); spy.restore();