add disable secrets engine button

This commit is contained in:
Noelle Daley 2018-11-07 11:25:35 -08:00
parent 3b8d543189
commit 60f7d70358
7 changed files with 94 additions and 5 deletions

View file

@ -115,9 +115,10 @@ export default Component.extend({
// err will display via model state // err will display via model state
return; return;
} }
this.get('flashMessages').success(
`Successfully mounted ${type} ${this.get('mountType')} method at ${path}.` let mountType = this.get('mountType');
); mountType = mountType === 'secret' ? `${mountType}s engine` : `${mountType} method`;
this.get('flashMessages').success(`Successfully mounted the ${type} ${mountType} at ${path}.`);
if (this.get('mountType') === 'secret') { if (this.get('mountType') === 'secret') {
yield this.get('onMountSuccess')(type, path); yield this.get('onMountSuccess')(type, path);
return; return;

View file

@ -1,6 +1,7 @@
import { filterBy } from '@ember/object/computed'; import { filterBy } from '@ember/object/computed';
import { computed } from '@ember/object'; import { computed } from '@ember/object';
import Controller from '@ember/controller'; import Controller from '@ember/controller';
import { task } from 'ember-concurrency';
import { supportedSecretBackends } from 'vault/helpers/supported-secret-backends'; import { supportedSecretBackends } from 'vault/helpers/supported-secret-backends';
const LINKED_BACKENDS = supportedSecretBackends(); const LINKED_BACKENDS = supportedSecretBackends();
@ -25,4 +26,16 @@ export default Controller.extend({
.sortBy('id'); .sortBy('id');
} }
), ),
disableEngine: task(function*(engine) {
const { engineType, path } = engine;
try {
yield engine.destroyRecord();
this.get('flashMessages').success(`The ${engineType} secrets engine at ${path} has been disabled.`);
} catch (err) {
this.get('flashMessages').danger(
`There was an error disabling the ${engineType} secrets engine at ${path}: ${err.errors.join(' ')}.`
);
}
}).drop(),
}); });

View file

@ -63,7 +63,7 @@
confirmButtonClasses="button is-primary" confirmButtonClasses="button is-primary"
buttonClasses="link is-destroy" buttonClasses="link is-destroy"
onConfirmAction=(perform disableMethod method) onConfirmAction=(perform disableMethod method)
confirmMessage=(concat "Are you sure you want to disable auth via " method.id "?") confirmMessage=(concat "Are you sure you want to disable the " method.id " auth method at " method.path "?")
showConfirm=(get this (concat "shouldDelete-" method.id)) showConfirm=(get this (concat "shouldDelete-" method.id))
class=(if (get this (concat "shouldDelete-" method.id)) "message is-block is-warning is-outline") class=(if (get this (concat "shouldDelete-" method.id)) "message is-block is-warning is-outline")
containerClasses="message-body is-block" containerClasses="message-body is-block"

View file

@ -59,6 +59,23 @@
View Configuration View Configuration
{{/link-to}} {{/link-to}}
</li> </li>
{{#unless (eq backend.type "cubbyhole")}}
<li class="action">
<ConfirmAction
@confirmButtonClasses="button is-primary"
@buttonClasses="link is-destroy"
@onConfirmAction={{perform disableEngine backend}}
@confirmMessage={{concat "Are you sure you want to disable the " backend.engineType " secrets engine at " backend.path "?"}}
@showConfirm={{get this (concat "shouldDelete-" backend.id)}}
@class={{if (get this (concat "shouldDelete-" backend.id)) "message is-block is-warning is-outline"}}
@containerClasses="message-body is-block"
@messageClasses="is-block"
@confirmButtonText="Disable"
data-test-engine-disable>
Disable
</ConfirmAction>
</li>
{{/unless}}
{{#if item.updatePath.isPending}} {{#if item.updatePath.isPending}}
<li class="action"> <li class="action">
<button disabled=true type="button" class="link button is-loading is-transparent"></button> <button disabled=true type="button" class="link button is-loading is-transparent"></button>
@ -105,6 +122,22 @@
View Configuration View Configuration
{{/link-to}} {{/link-to}}
</li> </li>
<li>
<ConfirmAction
@confirmButtonClasses="button is-primary"
@buttonClasses="link is-destroy"
@onConfirmAction={{perform disableEngine backend}}
@confirmMessage={{concat "Are you sure you want to disable the " backend.engineType " secrets engine at " backend.path "?"}}
@showConfirm={{get this (concat "shouldDelete-" backend.id)}}
@class={{if (get this (concat "shouldDelete-" backend.id)) "message is-block is-warning is-outline"}}
@containerClasses="message-body is-block"
@messageClasses="is-block"
@confirmButtonText="Disable"
data-test-engine-disable
>
Disable
</ConfirmAction>
</li>
</ul> </ul>
</nav> </nav>
{{/popup-menu}} {{/popup-menu}}

View file

@ -0,0 +1,36 @@
import { currentRouteName } from '@ember/test-helpers';
import { module, test } from 'qunit';
import { setupApplicationTest } from 'ember-qunit';
import mountSecrets from 'vault/tests/pages/settings/mount-secret-backend';
import backendsPage from 'vault/tests/pages/secrets/backends';
import authPage from 'vault/tests/pages/auth';
module('Acceptance | engine/disable', function(hooks) {
setupApplicationTest(hooks);
hooks.beforeEach(function() {
return authPage.login();
});
test('disable engine', async function(assert) {
// first mount an engine so we can disable it.
let enginePath = `alicloud-${new Date().getTime()}`;
await mountSecrets.enable('alicloud', enginePath);
assert.ok(backendsPage.rows.filterBy('path', `${enginePath}/`)[0], 'shows the mounted engine');
await backendsPage.visit();
let row = backendsPage.rows.filterBy('path', `${enginePath}/`)[0];
await row.menu();
await backendsPage.disableButton();
await backendsPage.confirmDisable();
assert.equal(currentRouteName(), 'vault.cluster.secrets.backends', 'redirects to the backends page');
assert.equal(
backendsPage.rows.filterBy('path', `${enginePath}/`).length,
0,
'does not show the disabled engine'
);
});
});

View file

@ -22,7 +22,7 @@ module('Acceptance | settings/auth/enable', function(hooks) {
await withFlash(page.enable(type, path), () => { await withFlash(page.enable(type, path), () => {
assert.equal( assert.equal(
page.flash.latestMessage, page.flash.latestMessage,
`Successfully mounted ${type} auth method at ${path}.`, `Successfully mounted the ${type} auth method at ${path}.`,
'success flash shows' 'success flash shows'
); );
}); });

View file

@ -12,4 +12,10 @@ export default create({
configLink: clickable('[data-test-engine-config]', { configLink: clickable('[data-test-engine-config]', {
testContainer: '#ember-testing', testContainer: '#ember-testing',
}), }),
disableButton: clickable('[data-test-confirm-action-trigger]', {
testContainer: '#ember-testing',
}),
confirmDisable: clickable('[data-test-confirm-button]', {
testContainer: '#ember-testing',
}),
}); });