From df8bfc42bbf0306ba721171a6018db84cfff53c0 Mon Sep 17 00:00:00 2001 From: Dharini Date: Wed, 3 Sep 2025 12:00:29 -0700 Subject: [PATCH] =?UTF-8?q?chore:=20=F0=9F=A4=96=20vault=20ldap=20feature?= =?UTF-8?q?=20flag?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../form/credential-library/radio/index.js | 18 +++-- .../credential-libraries/index.hbs | 67 ++++++++++--------- ui/admin/config/features.js | 2 + .../credential-library/create-test.js | 13 ++++ .../credential-library/list-test.js | 11 +++ 5 files changed, 77 insertions(+), 34 deletions(-) diff --git a/ui/admin/app/components/form/credential-library/radio/index.js b/ui/admin/app/components/form/credential-library/radio/index.js index d347fd875..4f86e7bd5 100644 --- a/ui/admin/app/components/form/credential-library/radio/index.js +++ b/ui/admin/app/components/form/credential-library/radio/index.js @@ -7,6 +7,7 @@ import Component from '@glimmer/component'; import { TYPES_CREDENTIAL_LIBRARY, TYPE_CREDENTIAL_LIBRARY_VAULT_SSH_CERTIFICATE, + TYPE_CREDENTIAL_LIBRARY_VAULT_LDAP, } from 'api/models/credential-library'; import { service } from '@ember/service'; @@ -19,11 +20,20 @@ export default class FormCredentialLibraryRadioComponent extends Component { * @returns {Array.} */ get credentialTypes() { - let types = TYPES_CREDENTIAL_LIBRARY; - return this.features.isEnabled('ssh-target') - ? types - : types.filter( + let types = [...TYPES_CREDENTIAL_LIBRARY]; + + if (!this.features.isEnabled('ssh-target')) { + types = types.filter( (type) => type !== TYPE_CREDENTIAL_LIBRARY_VAULT_SSH_CERTIFICATE, ); + } + + if (!this.features.isEnabled('vault-ldap-credential')) { + types = types.filter( + (type) => type !== TYPE_CREDENTIAL_LIBRARY_VAULT_LDAP, + ); + } + + return types; } } diff --git a/ui/admin/app/templates/scopes/scope/credential-stores/credential-store/credential-libraries/index.hbs b/ui/admin/app/templates/scopes/scope/credential-stores/credential-store/credential-libraries/index.hbs index ff891cf4e..2f78c8269 100644 --- a/ui/admin/app/templates/scopes/scope/credential-stores/credential-store/credential-libraries/index.hbs +++ b/ui/admin/app/templates/scopes/scope/credential-stores/credential-store/credential-libraries/index.hbs @@ -40,38 +40,45 @@ @valign='middle' > <:body as |B|> - - - {{#if (can 'read credential-library' B.data)}} - - {{B.data.displayName}} - - {{else}} + {{#if + (or + (not-eq B.data.type 'vault-ldap') + (feature-flag 'vault-ldap-credential') + ) + }} + + + {{#if (can 'read credential-library' B.data)}} + + {{B.data.displayName}} + + {{else}} + + {{B.data.displayName}} + + {{/if}} - {{B.data.displayName}} + {{B.data.description}} - {{/if}} - - {{B.data.description}} - - - - - - - - - + + + + + + + + + {{/if}} {{else}} diff --git a/ui/admin/config/features.js b/ui/admin/config/features.js index 247e7947e..a3649e342 100644 --- a/ui/admin/config/features.js +++ b/ui/admin/config/features.js @@ -28,6 +28,8 @@ const baseEdition = { 'ldap-auth-methods': false, 'worker-filter': false, 'worker-filter-hcp': false, + // TODO: Remove this flag when Vault-ldap credential library is supported + 'vault-ldap-credential': false, }; // Editions maps edition keys to their associated featuresets. const featureEditions = {}; diff --git a/ui/admin/tests/acceptance/credential-library/create-test.js b/ui/admin/tests/acceptance/credential-library/create-test.js index dbdeccc66..ca1eb9f62 100644 --- a/ui/admin/tests/acceptance/credential-library/create-test.js +++ b/ui/admin/tests/acceptance/credential-library/create-test.js @@ -450,6 +450,8 @@ module('Acceptance | credential-libraries | create', function (hooks) { }, }); + featuresService.enable('vault-ldap-credential'); + await visit(urls.newCredentialLibrary); await click(selectors.TYPE_VAULT_LDAP); @@ -483,6 +485,13 @@ module('Acceptance | credential-libraries | create', function (hooks) { ); }); + test('cannot select vault ldap when feature is disabled', async function (assert) { + await visit(urls.newCredentialLibrary); + + assert.false(featuresService.isEnabled('vault-ldap-credential')); + assert.dom(selectors.TYPE_VAULT_LDAP).doesNotExist(); + }); + test('can create a new credential library with username, password and domain type for vault ldap', async function (assert) { setRunOptions({ rules: { @@ -493,6 +502,8 @@ module('Acceptance | credential-libraries | create', function (hooks) { }, }); + featuresService.enable('vault-ldap-credential'); + const credentialLibraryCount = getCredentialLibraryCount(); const usernamePasswordDomainCredentialLibraryCount = getUsernamePasswordDomainCredentialLibraryCount(); @@ -545,6 +556,8 @@ module('Acceptance | credential-libraries | create', function (hooks) { }, }); + featuresService.enable('vault-ldap-credential'); + await visit(`${urls.newCredentialLibrary}?type=vault-ssh-certificate`); assert.dom(selectors.TYPE_VAULT_SSH_CERT).isNotVisible(); diff --git a/ui/admin/tests/acceptance/credential-library/list-test.js b/ui/admin/tests/acceptance/credential-library/list-test.js index 45a3929fe..19036379e 100644 --- a/ui/admin/tests/acceptance/credential-library/list-test.js +++ b/ui/admin/tests/acceptance/credential-library/list-test.js @@ -18,6 +18,7 @@ module('Acceptance | credential-libraries | list', function (hooks) { setupMirage(hooks); setupSqlite(hooks); + let featuresService; const instances = { scopes: { global: null, @@ -64,6 +65,7 @@ module('Acceptance | credential-libraries | list', function (hooks) { urls.credentialLibraries = `${urls.credentialStore}/credential-libraries`; urls.vaultLDAPCredentialLibrary = `${urls.credentialLibraries}/${instances.vaultLDAPCredentialLibrary.id}`; await authenticateSession({}); + featuresService = this.owner.lookup('service:features'); }); test('Users can navigate to credential libraries with proper authorization', async function (assert) { @@ -112,10 +114,19 @@ module('Acceptance | credential-libraries | list', function (hooks) { }, }); + featuresService.enable('vault-ldap-credential'); await visit(urls.credentialLibraries); assert .dom(commonSelectors.TABLE_RESOURCE_LINK(urls.vaultLDAPCredentialLibrary)) .isVisible(); }); + + test('User cannot navigate to vault ldap credential library details when feature is not enabled', async function (assert) { + await visit(urls.credentialLibraries); + + assert + .dom(commonSelectors.TABLE_RESOURCE_LINK(urls.vaultLDAPCredentialLibrary)) + .doesNotExist(); + }); });