From 77fd9d426b5f472163d918ec407bf30a999055db Mon Sep 17 00:00:00 2001 From: Claire Bontempo Date: Wed, 27 Oct 2021 15:14:25 -0700 Subject: [PATCH 01/13] alphabetize plugin types --- ui/app/utils/database-helpers.js | 56 ++++++++++++++++---------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/ui/app/utils/database-helpers.js b/ui/app/utils/database-helpers.js index 2702912fd90bd..782cee2207c41 100644 --- a/ui/app/utils/database-helpers.js +++ b/ui/app/utils/database-helpers.js @@ -1,4 +1,24 @@ export const AVAILABLE_PLUGIN_TYPES = [ + { + value: 'elasticsearch-database-plugin', + displayName: 'Elasticsearch', + fields: [ + { attr: 'plugin_name' }, + { attr: 'name' }, + { attr: 'verify_connection' }, + { attr: 'password_policy' }, + { attr: 'url', group: 'pluginConfig' }, + { attr: 'username', group: 'pluginConfig', show: false }, + { attr: 'password', group: 'pluginConfig', show: false }, + { attr: 'ca_cert', group: 'pluginConfig' }, + { attr: 'ca_path', group: 'pluginConfig' }, + { attr: 'client_cert', group: 'pluginConfig' }, + { attr: 'client_key', group: 'pluginConfig' }, + { attr: 'tls_server_name', group: 'pluginConfig' }, + { attr: 'insecure', group: 'pluginConfig' }, + { attr: 'username_template', group: 'pluginConfig' }, + ], + }, { value: 'mongodb-database-plugin', displayName: 'MongoDB', @@ -36,8 +56,8 @@ export const AVAILABLE_PLUGIN_TYPES = [ ], }, { - value: 'mysql-database-plugin', - displayName: 'MySQL/MariaDB', + value: 'mysql-aurora-database-plugin', + displayName: 'MySQL (Aurora)', fields: [ { attr: 'plugin_name' }, { attr: 'name' }, @@ -56,8 +76,8 @@ export const AVAILABLE_PLUGIN_TYPES = [ ], }, { - value: 'mysql-aurora-database-plugin', - displayName: 'MySQL (Aurora)', + value: 'mysql-database-plugin', + displayName: 'MySQL/MariaDB', fields: [ { attr: 'plugin_name' }, { attr: 'name' }, @@ -76,8 +96,8 @@ export const AVAILABLE_PLUGIN_TYPES = [ ], }, { - value: 'mysql-rds-database-plugin', - displayName: 'MySQL (RDS)', + value: 'mysql-legacy-database-plugin', + displayName: 'MySQL (Legacy)', fields: [ { attr: 'plugin_name' }, { attr: 'name' }, @@ -96,8 +116,8 @@ export const AVAILABLE_PLUGIN_TYPES = [ ], }, { - value: 'mysql-legacy-database-plugin', - displayName: 'MySQL (Legacy)', + value: 'mysql-rds-database-plugin', + displayName: 'MySQL (RDS)', fields: [ { attr: 'plugin_name' }, { attr: 'name' }, @@ -115,26 +135,6 @@ export const AVAILABLE_PLUGIN_TYPES = [ { attr: 'root_rotation_statements', group: 'statements' }, ], }, - { - value: 'elasticsearch-database-plugin', - displayName: 'Elasticsearch', - fields: [ - { attr: 'plugin_name' }, - { attr: 'name' }, - { attr: 'verify_connection' }, - { attr: 'password_policy' }, - { attr: 'url', group: 'pluginConfig' }, - { attr: 'username', group: 'pluginConfig', show: false }, - { attr: 'password', group: 'pluginConfig', show: false }, - { attr: 'ca_cert', group: 'pluginConfig' }, - { attr: 'ca_path', group: 'pluginConfig' }, - { attr: 'client_cert', group: 'pluginConfig' }, - { attr: 'client_key', group: 'pluginConfig' }, - { attr: 'tls_server_name', group: 'pluginConfig' }, - { attr: 'insecure', group: 'pluginConfig' }, - { attr: 'username_template', group: 'pluginConfig' }, - ], - }, { value: 'oracle-database-plugin', displayName: 'Oracle', From 7936a65af903fe662bcf894a25cbfe489775675e Mon Sep 17 00:00:00 2001 From: Claire Bontempo Date: Wed, 27 Oct 2021 15:15:28 -0700 Subject: [PATCH 02/13] alphabetize DB plugin types --- ui/app/utils/database-helpers.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ui/app/utils/database-helpers.js b/ui/app/utils/database-helpers.js index 782cee2207c41..250000ede0508 100644 --- a/ui/app/utils/database-helpers.js +++ b/ui/app/utils/database-helpers.js @@ -76,8 +76,8 @@ export const AVAILABLE_PLUGIN_TYPES = [ ], }, { - value: 'mysql-database-plugin', - displayName: 'MySQL/MariaDB', + value: 'mysql-legacy-database-plugin', + displayName: 'MySQL (Legacy)', fields: [ { attr: 'plugin_name' }, { attr: 'name' }, @@ -96,8 +96,8 @@ export const AVAILABLE_PLUGIN_TYPES = [ ], }, { - value: 'mysql-legacy-database-plugin', - displayName: 'MySQL (Legacy)', + value: 'mysql-database-plugin', + displayName: 'MySQL/MariaDB', fields: [ { attr: 'plugin_name' }, { attr: 'name' }, From 058ebc116208b024c1a31b3111a7afa56b3d4fb8 Mon Sep 17 00:00:00 2001 From: Claire Bontempo Date: Wed, 27 Oct 2021 15:18:16 -0700 Subject: [PATCH 03/13] adds changelog --- changelog/12945.txt | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 changelog/12945.txt diff --git a/changelog/12945.txt b/changelog/12945.txt new file mode 100644 index 0000000000000..128378716f038 --- /dev/null +++ b/changelog/12945.txt @@ -0,0 +1,3 @@ +```release-note:feature +**Postgres in the UI**: Postgres DB is now supported by the UI +``` \ No newline at end of file From ae6d90b6d7a93f96b7feaff537def3bffbbc6159 Mon Sep 17 00:00:00 2001 From: Claire Bontempo Date: Wed, 27 Oct 2021 15:25:12 -0700 Subject: [PATCH 04/13] add postgres to database plugins --- ui/app/utils/database-helpers.js | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/ui/app/utils/database-helpers.js b/ui/app/utils/database-helpers.js index 250000ede0508..77d8ff9141fda 100644 --- a/ui/app/utils/database-helpers.js +++ b/ui/app/utils/database-helpers.js @@ -153,6 +153,24 @@ export const AVAILABLE_PLUGIN_TYPES = [ { attr: 'root_rotation_statements', group: 'statements' }, ], }, + { + value: 'postgresql-database-plugin', + displayName: 'PostgreSQL', + fields: [ + { attr: 'plugin_name' }, + { attr: 'name' }, + { attr: 'verify_connection' }, + { attr: 'password_policy' }, + { attr: 'connection_url', group: 'pluginConfig' }, + { attr: 'username', group: 'pluginConfig', show: false }, + { attr: 'password', group: 'pluginConfig', show: false }, + { attr: 'max_open_connections', group: 'pluginConfig' }, + { attr: 'max_idle_connections', group: 'pluginConfig' }, + { attr: 'max_connection_lifetime', group: 'pluginConfig' }, + { attr: 'username_template', group: 'pluginConfig' }, + { attr: 'root_rotation_statements', group: 'statements' }, + ], + }, ]; export const ROLE_FIELDS = { @@ -163,25 +181,27 @@ export const ROLE_FIELDS = { export const STATEMENT_FIELDS = { static: { default: ['rotation_statements'], + 'elasticsearch-database-plugin': [], 'mongodb-database-plugin': [], 'mssql-database-plugin': [], 'mysql-database-plugin': [], 'mysql-aurora-database-plugin': [], - 'mysql-rds-database-plugin': [], 'mysql-legacy-database-plugin': [], - 'elasticsearch-database-plugin': [], + 'mysql-rds-database-plugin': [], 'oracle-database-plugin': [], + 'postgresql-database-plugin': [], }, dynamic: { default: ['creation_statements', 'revocation_statements', 'rollback_statements', 'renew_statements'], + 'elasticsearch-database-plugin': ['creation_statement'], 'mongodb-database-plugin': ['creation_statement', 'revocation_statement'], 'mssql-database-plugin': ['creation_statements', 'revocation_statements'], 'mysql-database-plugin': ['creation_statements', 'revocation_statements'], 'mysql-aurora-database-plugin': ['creation_statements', 'revocation_statements'], - 'mysql-rds-database-plugin': ['creation_statements', 'revocation_statements'], 'mysql-legacy-database-plugin': ['creation_statements', 'revocation_statements'], - 'elasticsearch-database-plugin': ['creation_statement'], + 'mysql-rds-database-plugin': ['creation_statements', 'revocation_statements'], 'oracle-database-plugin': ['creation_statements', 'revocation_statements'], + 'postgresql-database-plugin': ['creation_statements', 'revocation_statements'], }, }; From 6d297a8e4354021510162078f3651f45303e663e Mon Sep 17 00:00:00 2001 From: Claire Bontempo Date: Wed, 27 Oct 2021 15:47:04 -0700 Subject: [PATCH 05/13] add statement fields --- ui/app/utils/database-helpers.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/ui/app/utils/database-helpers.js b/ui/app/utils/database-helpers.js index 77d8ff9141fda..34df12c868c1a 100644 --- a/ui/app/utils/database-helpers.js +++ b/ui/app/utils/database-helpers.js @@ -201,7 +201,12 @@ export const STATEMENT_FIELDS = { 'mysql-legacy-database-plugin': ['creation_statements', 'revocation_statements'], 'mysql-rds-database-plugin': ['creation_statements', 'revocation_statements'], 'oracle-database-plugin': ['creation_statements', 'revocation_statements'], - 'postgresql-database-plugin': ['creation_statements', 'revocation_statements'], + 'postgresql-database-plugin': [ + 'creation_statements', + 'revocation_statements', + 'rollback_statements', + 'renew_statements', + ], }, }; From 8e203a62386335a988ffb3911fc275ba0c16bae9 Mon Sep 17 00:00:00 2001 From: Claire Bontempo Date: Wed, 27 Oct 2021 16:04:48 -0700 Subject: [PATCH 06/13] adds tests for postgres db --- .../secrets/backend/database/secret-test.js | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/ui/tests/acceptance/secrets/backend/database/secret-test.js b/ui/tests/acceptance/secrets/backend/database/secret-test.js index 8ab2744bae4c4..6c988f7b3ba50 100644 --- a/ui/tests/acceptance/secrets/backend/database/secret-test.js +++ b/ui/tests/acceptance/secrets/backend/database/secret-test.js @@ -206,6 +206,30 @@ const connectionTests = [ .exists(`Root rotation statements exists for ${name}`); }, }, + { + name: 'postgresql-connection', + plugin: 'postgresql-database-plugin', + url: `postgresql://{{username}}:{{password}}@localhost:5432/postgres?sslmode=disable`, + requiredFields: async (assert, name) => { + assert.dom('[data-test-input="username"]').exists(`Username field exists for ${name}`); + assert.dom('[data-test-input="password"]').exists(`Password field exists for ${name}`); + assert + .dom('[data-test-input="max_open_connections"]') + .exists(`Max open connections exists for ${name}`); + assert + .dom('[data-test-input="max_idle_connections"]') + .exists(`Max idle connections exists for ${name}`); + assert + .dom('[data-test-input="max_connection_lifetime"]') + .exists(`Max connection lifetime exists for ${name}`); + assert + .dom('[data-test-input="root_rotation_statements"]') + .exists(`Root rotation statements exists for ${name}`); + assert + .dom('[data-test-toggle-input="show-username_template"]') + .exists(`Username template toggle exists for ${name}`); + }, + }, ]; module('Acceptance | secrets/database/*', function(hooks) { From 4616dd01bfd6cfb17741d465a09419ab3ac0bf77 Mon Sep 17 00:00:00 2001 From: Claire Bontempo Date: Thu, 28 Oct 2021 10:00:16 -0700 Subject: [PATCH 07/13] add delete confirm modal to db connection --- .../components/database-connection.hbs | 17 +++++++++++++++-- .../core/addon/components/confirmation-modal.js | 1 + 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/ui/app/templates/components/database-connection.hbs b/ui/app/templates/components/database-connection.hbs index 69b34a7c33f77..4eb95843320d1 100644 --- a/ui/app/templates/components/database-connection.hbs +++ b/ui/app/templates/components/database-connection.hbs @@ -23,8 +23,7 @@ @@ -367,3 +366,17 @@ + + +

+ Deleting the connection means that any associated roles won't be able to generate credentials until the connection is reconfigured. +

+ +
diff --git a/ui/lib/core/addon/components/confirmation-modal.js b/ui/lib/core/addon/components/confirmation-modal.js index 7f193fffb74b4..981dc6942cfdb 100644 --- a/ui/lib/core/addon/components/confirmation-modal.js +++ b/ui/lib/core/addon/components/confirmation-modal.js @@ -9,6 +9,7 @@ * @title="Do Dangerous Thing?" * @isActive={{isModalActive}} * @onClose={{action (mut isModalActive) false}} + * @onConfirmMsg="deleting this thing to delete." * /> * ``` * @param {function} onConfirm - onConfirm is the action that happens when user clicks onConfirm after filling in the confirmation block From c9acbebf12e2062defdbc52240578dee6c62e6c1 Mon Sep 17 00:00:00 2001 From: Claire Bontempo Date: Thu, 28 Oct 2021 10:00:35 -0700 Subject: [PATCH 08/13] fixes text for confirmation modal - transform --- ui/app/templates/components/transformation-edit.hbs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/app/templates/components/transformation-edit.hbs b/ui/app/templates/components/transformation-edit.hbs index c8088cbb45b33..e0aa239edf9b3 100644 --- a/ui/app/templates/components/transformation-edit.hbs +++ b/ui/app/templates/components/transformation-edit.hbs @@ -91,7 +91,7 @@ @onClose={{action (mut isDeleteModalActive) false}} @isActive={{isDeleteModalActive}} @confirmText={{model.name}} - @toConfirmMsg="Type {{model.name}} to confirm deleting the transformation." + @toConfirmMsg="deleting the transformation." @onConfirm={{action "delete"}} >

From 60d2c7d9dc9a3d4be08d7cfe2b253bd8f14884a7 Mon Sep 17 00:00:00 2001 From: Claire Bontempo Date: Thu, 28 Oct 2021 10:15:07 -0700 Subject: [PATCH 09/13] editing tests for delete modal --- ui/app/templates/components/database-connection.hbs | 2 ++ ui/tests/acceptance/secrets/backend/database/secret-test.js | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/ui/app/templates/components/database-connection.hbs b/ui/app/templates/components/database-connection.hbs index 4eb95843320d1..aff8838e19546 100644 --- a/ui/app/templates/components/database-connection.hbs +++ b/ui/app/templates/components/database-connection.hbs @@ -24,6 +24,7 @@ type="button" class="toolbar-link" onclick={{action (mut isDeleteModalActive) true}} + data-test-database-connection-delete > Delete connection @@ -374,6 +375,7 @@ @confirmText={{@model.name}} @toConfirmMsg="deleting the connection" @onConfirm={{action "delete"}} + @testSelector="delete" >

Deleting the connection means that any associated roles won't be able to generate credentials until the connection is reconfigured. diff --git a/ui/tests/acceptance/secrets/backend/database/secret-test.js b/ui/tests/acceptance/secrets/backend/database/secret-test.js index 6c988f7b3ba50..36b57822a4dfd 100644 --- a/ui/tests/acceptance/secrets/backend/database/secret-test.js +++ b/ui/tests/acceptance/secrets/backend/database/secret-test.js @@ -380,6 +380,10 @@ module('Acceptance | secrets/database/*', function(hooks) { } }); await connectionPage.delete(); + await fillIn('[data-test-confirmation-modal-input="delete"]', connectionDetails.id); + await click('[data-test-confirm-button]'); + await settled(); + assert.equal(currentURL(), `/vault/secrets/${backend}/list`, 'Redirects to connection list page'); assert .dom('[data-test-empty-state-title') From 34d0b53475da54d4a9a4f29b2928cda8cdbc78fa Mon Sep 17 00:00:00 2001 From: Claire Bontempo Date: Thu, 28 Oct 2021 12:37:00 -0700 Subject: [PATCH 10/13] fixes tests, oracle must be last DB tested --- .../secrets/backend/database/secret-test.js | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/ui/tests/acceptance/secrets/backend/database/secret-test.js b/ui/tests/acceptance/secrets/backend/database/secret-test.js index 36b57822a4dfd..c7ff69eb67e8c 100644 --- a/ui/tests/acceptance/secrets/backend/database/secret-test.js +++ b/ui/tests/acceptance/secrets/backend/database/secret-test.js @@ -186,9 +186,9 @@ const connectionTests = [ }, }, { - name: 'oracle-connection', - plugin: 'oracle-database-plugin', - url: `{{username}}/{{password}}@localhost:1521/OraDoc.localhost`, + name: 'postgresql-connection', + plugin: 'postgresql-database-plugin', + url: `postgresql://{{username}}:{{password}}@localhost:5432/postgres?sslmode=disable`, requiredFields: async (assert, name) => { assert.dom('[data-test-input="username"]').exists(`Username field exists for ${name}`); assert.dom('[data-test-input="password"]').exists(`Password field exists for ${name}`); @@ -204,12 +204,16 @@ const connectionTests = [ assert .dom('[data-test-input="root_rotation_statements"]') .exists(`Root rotation statements exists for ${name}`); + assert + .dom('[data-test-toggle-input="show-username_template"]') + .exists(`Username template toggle exists for ${name}`); }, }, + // keep oracle as last DB because it is skipped in some tests (line 285) the UI doesn't return to empty state after { - name: 'postgresql-connection', - plugin: 'postgresql-database-plugin', - url: `postgresql://{{username}}:{{password}}@localhost:5432/postgres?sslmode=disable`, + name: 'oracle-connection', + plugin: 'oracle-database-plugin', + url: `{{username}}/{{password}}@localhost:1521/OraDoc.localhost`, requiredFields: async (assert, name) => { assert.dom('[data-test-input="username"]').exists(`Username field exists for ${name}`); assert.dom('[data-test-input="password"]').exists(`Password field exists for ${name}`); @@ -225,9 +229,6 @@ const connectionTests = [ assert .dom('[data-test-input="root_rotation_statements"]') .exists(`Root rotation statements exists for ${name}`); - assert - .dom('[data-test-toggle-input="show-username_template"]') - .exists(`Username template toggle exists for ${name}`); }, }, ]; @@ -280,7 +281,7 @@ module('Acceptance | secrets/database/*', function(hooks) { } else { await connectionPage.connectionUrl(testCase.url); } - // skip adding oracle db connection since plugin doesn't exists + // skip adding oracle db connection since plugin doesn't exist if (testCase.plugin === 'oracle-database-plugin') { testCase.requiredFields(assert, testCase.name); continue; From ed3ddb2f9fc18a97c0194743c52d48a8875d1d60 Mon Sep 17 00:00:00 2001 From: Claire Bontempo Date: Thu, 28 Oct 2021 13:10:42 -0700 Subject: [PATCH 11/13] adds test for modal and updates old modal tests --- .../acceptance/secrets/backend/database/secret-test.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/ui/tests/acceptance/secrets/backend/database/secret-test.js b/ui/tests/acceptance/secrets/backend/database/secret-test.js index c7ff69eb67e8c..258b27b2c6adc 100644 --- a/ui/tests/acceptance/secrets/backend/database/secret-test.js +++ b/ui/tests/acceptance/secrets/backend/database/secret-test.js @@ -291,7 +291,7 @@ module('Acceptance | secrets/database/*', function(hooks) { await connectionPage.save(); await connectionPage.enable(); assert - .dom('[data-test-modal-title]') + .dom('.modal.is-active .title') .hasText('Rotate your root credentials?', 'Modal appears asking to rotate root credentials'); await connectionPage.enable(); assert.ok( @@ -361,7 +361,7 @@ module('Acceptance | secrets/database/*', function(hooks) { await connectionPage.toggleVerify(); await connectionPage.save(); assert - .dom('[data-test-modal-title]') + .dom('.modal.is-active .title') .hasText('Rotate your root credentials?', 'Modal appears asking to '); await connectionPage.enable(); assert.equal( @@ -381,6 +381,9 @@ module('Acceptance | secrets/database/*', function(hooks) { } }); await connectionPage.delete(); + assert + .dom('.modal.is-active .title') + .hasText('Delete connection?', 'Modal appears asking to confirm delete action'); await fillIn('[data-test-confirmation-modal-input="delete"]', connectionDetails.id); await click('[data-test-confirm-button]'); await settled(); From cd6204fdefcec9a58679b7599bc75af8d5181ea2 Mon Sep 17 00:00:00 2001 From: Claire Bontempo Date: Thu, 28 Oct 2021 13:13:20 -0700 Subject: [PATCH 12/13] updates margins --- ui/app/templates/components/database-connection.hbs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/app/templates/components/database-connection.hbs b/ui/app/templates/components/database-connection.hbs index aff8838e19546..5a032c586714d 100644 --- a/ui/app/templates/components/database-connection.hbs +++ b/ui/app/templates/components/database-connection.hbs @@ -377,7 +377,7 @@ @onConfirm={{action "delete"}} @testSelector="delete" > -

+

Deleting the connection means that any associated roles won't be able to generate credentials until the connection is reconfigured.

From 85afe1cb07c60a9d9db98ef539dd8404cba2c922 Mon Sep 17 00:00:00 2001 From: Claire Bontempo Date: Thu, 28 Oct 2021 14:34:43 -0700 Subject: [PATCH 13/13] fixes test --- ui/tests/acceptance/secrets/backend/database/secret-test.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ui/tests/acceptance/secrets/backend/database/secret-test.js b/ui/tests/acceptance/secrets/backend/database/secret-test.js index 258b27b2c6adc..0cc0a456d2776 100644 --- a/ui/tests/acceptance/secrets/backend/database/secret-test.js +++ b/ui/tests/acceptance/secrets/backend/database/secret-test.js @@ -289,7 +289,7 @@ module('Acceptance | secrets/database/*', function(hooks) { testCase.requiredFields(assert, testCase.name); await connectionPage.toggleVerify(); await connectionPage.save(); - await connectionPage.enable(); + await settled(); assert .dom('.modal.is-active .title') .hasText('Rotate your root credentials?', 'Modal appears asking to rotate root credentials'); @@ -360,6 +360,7 @@ module('Acceptance | secrets/database/*', function(hooks) { // uncheck verify for the save step to work await connectionPage.toggleVerify(); await connectionPage.save(); + await settled(); assert .dom('.modal.is-active .title') .hasText('Rotate your root credentials?', 'Modal appears asking to ');